diff --git a/api-reference/0.0/PolylineAlgorithm.Abstraction.AbstractPolylineDecoder-2.yml b/api-reference/0.0/PolylineAlgorithm.Abstraction.AbstractPolylineDecoder-2.yml
index b5693066..a4d7ae94 100644
--- a/api-reference/0.0/PolylineAlgorithm.Abstraction.AbstractPolylineDecoder-2.yml
+++ b/api-reference/0.0/PolylineAlgorithm.Abstraction.AbstractPolylineDecoder-2.yml
@@ -3,7 +3,7 @@ title: Class AbstractPolylineDecoder
body:
- api1: Class AbstractPolylineDecoder
id: PolylineAlgorithm_Abstraction_AbstractPolylineDecoder_2
- src: https://github.com/petesramek/polyline-algorithm-csharp/blob/copilot/review-github-templates/src/PolylineAlgorithm/Abstraction/AbstractPolylineDecoder.cs#L22
+ src: https://github.com/petesramek/polyline-algorithm-csharp/blob/copilot/assess-repository-state/src/PolylineAlgorithm/Abstraction/AbstractPolylineDecoder.cs#L22
metadata:
uid: PolylineAlgorithm.Abstraction.AbstractPolylineDecoder`2
commentId: T:PolylineAlgorithm.Abstraction.AbstractPolylineDecoder`2
@@ -14,14 +14,14 @@ body:
url: PolylineAlgorithm.Abstraction.html
- name: Assembly
value: PolylineAlgorithm.dll
-- markdown: Provides a base implementation for decoding encoded polyline strings into sequences of geographic coordinates.
+- markdown: Provides a base implementation for decoding encoded polyline strings into sequences of items.
- code: 'public abstract class AbstractPolylineDecoder : IPolylineDecoder'
- h4: Type Parameters
- parameters:
- name: TPolyline
description: The type that represents the encoded polyline input.
- name: TCoordinate
- description: The type that represents a decoded geographic coordinate.
+ description: The type that represents a decoded item.
- h4: Inheritance
- inheritance:
- text: object
@@ -52,11 +52,11 @@ body:
- markdown: >-
Derive from this class to implement a decoder for a specific polyline type. Override
- and to provide type-specific behavior.
+ and to provide type-specific behavior.
- h2: Constructors
- api3: AbstractPolylineDecoder()
id: PolylineAlgorithm_Abstraction_AbstractPolylineDecoder_2__ctor
- src: https://github.com/petesramek/polyline-algorithm-csharp/blob/copilot/review-github-templates/src/PolylineAlgorithm/Abstraction/AbstractPolylineDecoder.cs#L28
+ src: https://github.com/petesramek/polyline-algorithm-csharp/blob/copilot/assess-repository-state/src/PolylineAlgorithm/Abstraction/AbstractPolylineDecoder.cs#L28
metadata:
uid: PolylineAlgorithm.Abstraction.AbstractPolylineDecoder`2.#ctor
commentId: M:PolylineAlgorithm.Abstraction.AbstractPolylineDecoder`2.#ctor
@@ -64,7 +64,7 @@ body:
- code: protected AbstractPolylineDecoder()
- api3: AbstractPolylineDecoder(PolylineEncodingOptions)
id: PolylineAlgorithm_Abstraction_AbstractPolylineDecoder_2__ctor_PolylineAlgorithm_PolylineEncodingOptions_
- src: https://github.com/petesramek/polyline-algorithm-csharp/blob/copilot/review-github-templates/src/PolylineAlgorithm/Abstraction/AbstractPolylineDecoder.cs#L40
+ src: https://github.com/petesramek/polyline-algorithm-csharp/blob/copilot/assess-repository-state/src/PolylineAlgorithm/Abstraction/AbstractPolylineDecoder.cs#L40
metadata:
uid: PolylineAlgorithm.Abstraction.AbstractPolylineDecoder`2.#ctor(PolylineAlgorithm.PolylineEncodingOptions)
commentId: M:PolylineAlgorithm.Abstraction.AbstractPolylineDecoder`2.#ctor(PolylineAlgorithm.PolylineEncodingOptions)
@@ -86,7 +86,7 @@ body:
- h2: Properties
- api3: Options
id: PolylineAlgorithm_Abstraction_AbstractPolylineDecoder_2_Options
- src: https://github.com/petesramek/polyline-algorithm-csharp/blob/copilot/review-github-templates/src/PolylineAlgorithm/Abstraction/AbstractPolylineDecoder.cs#L54
+ src: https://github.com/petesramek/polyline-algorithm-csharp/blob/copilot/assess-repository-state/src/PolylineAlgorithm/Abstraction/AbstractPolylineDecoder.cs#L54
metadata:
uid: PolylineAlgorithm.Abstraction.AbstractPolylineDecoder`2.Options
commentId: P:PolylineAlgorithm.Abstraction.AbstractPolylineDecoder`2.Options
@@ -98,34 +98,9 @@ body:
- text: PolylineEncodingOptions
url: PolylineAlgorithm.PolylineEncodingOptions.html
- h2: Methods
-- api3: CreateCoordinate(double, double)
- id: PolylineAlgorithm_Abstraction_AbstractPolylineDecoder_2_CreateCoordinate_System_Double_System_Double_
- src: https://github.com/petesramek/polyline-algorithm-csharp/blob/copilot/review-github-templates/src/PolylineAlgorithm/Abstraction/AbstractPolylineDecoder.cs#L202
- metadata:
- uid: PolylineAlgorithm.Abstraction.AbstractPolylineDecoder`2.CreateCoordinate(System.Double,System.Double)
- commentId: M:PolylineAlgorithm.Abstraction.AbstractPolylineDecoder`2.CreateCoordinate(System.Double,System.Double)
-- markdown: Creates a TCoordinate instance from the specified latitude and longitude values.
-- code: protected abstract TCoordinate CreateCoordinate(double latitude, double longitude)
-- h4: Parameters
-- parameters:
- - name: latitude
- type:
- - text: double
- url: https://learn.microsoft.com/dotnet/api/system.double
- description: The latitude component of the coordinate, in degrees.
- - name: longitude
- type:
- - text: double
- url: https://learn.microsoft.com/dotnet/api/system.double
- description: The longitude component of the coordinate, in degrees.
-- h4: Returns
-- parameters:
- - type:
- - TCoordinate
- description: A TCoordinate instance representing the specified geographic coordinate.
- api3: Decode(TPolyline, CancellationToken)
id: PolylineAlgorithm_Abstraction_AbstractPolylineDecoder_2_Decode__0_System_Threading_CancellationToken_
- src: https://github.com/petesramek/polyline-algorithm-csharp/blob/copilot/review-github-templates/src/PolylineAlgorithm/Abstraction/AbstractPolylineDecoder.cs#L81
+ src: https://github.com/petesramek/polyline-algorithm-csharp/blob/copilot/assess-repository-state/src/PolylineAlgorithm/Abstraction/AbstractPolylineDecoder.cs#L81
metadata:
uid: PolylineAlgorithm.Abstraction.AbstractPolylineDecoder`2.Decode(`0,System.Threading.CancellationToken)
commentId: M:PolylineAlgorithm.Abstraction.AbstractPolylineDecoder`2.Decode(`0,System.Threading.CancellationToken)
@@ -154,7 +129,7 @@ body:
- <
- TCoordinate
- '>'
- description: An of TCoordinate representing the decoded latitude and longitude pairs.
+ description: An of TCoordinate representing the decoded items.
- h4: Exceptions
- parameters:
- type:
@@ -175,7 +150,7 @@ body:
description: Thrown when cancellationToken is canceled during decoding.
- api3: GetReadOnlyMemory(in TPolyline)
id: PolylineAlgorithm_Abstraction_AbstractPolylineDecoder_2_GetReadOnlyMemory__0__
- src: https://github.com/petesramek/polyline-algorithm-csharp/blob/copilot/review-github-templates/src/PolylineAlgorithm/Abstraction/AbstractPolylineDecoder.cs#L187
+ src: https://github.com/petesramek/polyline-algorithm-csharp/blob/copilot/assess-repository-state/src/PolylineAlgorithm/Abstraction/AbstractPolylineDecoder.cs#L176
metadata:
uid: PolylineAlgorithm.Abstraction.AbstractPolylineDecoder`2.GetReadOnlyMemory(`0@)
commentId: M:PolylineAlgorithm.Abstraction.AbstractPolylineDecoder`2.GetReadOnlyMemory(`0@)
@@ -197,9 +172,41 @@ body:
url: https://learn.microsoft.com/dotnet/api/system.char
- '>'
description: A of representing the encoded polyline characters.
+- api3: Read(PolylineReader)
+ id: PolylineAlgorithm_Abstraction_AbstractPolylineDecoder_2_Read_PolylineAlgorithm_Internal_PolylineReader_
+ src: https://github.com/petesramek/polyline-algorithm-csharp/blob/copilot/assess-repository-state/src/PolylineAlgorithm/Abstraction/AbstractPolylineDecoder.cs#L195
+ metadata:
+ uid: PolylineAlgorithm.Abstraction.AbstractPolylineDecoder`2.Read(PolylineAlgorithm.Internal.PolylineReader)
+ commentId: M:PolylineAlgorithm.Abstraction.AbstractPolylineDecoder`2.Read(PolylineAlgorithm.Internal.PolylineReader)
+- markdown: Reads field values from the polyline decoding pipeline and constructs one TCoordinate item.
+- code: protected abstract TCoordinate Read(PolylineReader reader)
+- h4: Parameters
+- parameters:
+ - name: reader
+ type:
+ - text: PolylineReader
+ url: PolylineAlgorithm.Internal.PolylineReader.html
+ description: >-
+ The cursor provided by the engine. Call
+
+ once for each expected field value, in the same order used by the corresponding encoder's
+
+ Write override.
+- h4: Returns
+- parameters:
+ - type:
+ - TCoordinate
+ description: A TCoordinate instance constructed from the decoded field values.
+- h4: Remarks
+- markdown: >-
+ Implementations must always call the same number of times,
+
+ in the same field order, for every item. The number of reads must match the number of writes
+
+ performed by the corresponding encoder's Write override.
- api3: ValidateFormat(ReadOnlyMemory, ILogger?)
id: PolylineAlgorithm_Abstraction_AbstractPolylineDecoder_2_ValidateFormat_System_ReadOnlyMemory_System_Char__Microsoft_Extensions_Logging_ILogger_
- src: https://github.com/petesramek/polyline-algorithm-csharp/blob/copilot/review-github-templates/src/PolylineAlgorithm/Abstraction/AbstractPolylineDecoder.cs#L167
+ src: https://github.com/petesramek/polyline-algorithm-csharp/blob/copilot/assess-repository-state/src/PolylineAlgorithm/Abstraction/AbstractPolylineDecoder.cs#L156
metadata:
uid: PolylineAlgorithm.Abstraction.AbstractPolylineDecoder`2.ValidateFormat(System.ReadOnlyMemory{System.Char},Microsoft.Extensions.Logging.ILogger)
commentId: M:PolylineAlgorithm.Abstraction.AbstractPolylineDecoder`2.ValidateFormat(System.ReadOnlyMemory{System.Char},Microsoft.Extensions.Logging.ILogger)
@@ -230,4 +237,4 @@ body:
description: Thrown when the polyline contains characters outside the valid encoding range or has an invalid block structure.
languageId: csharp
metadata:
- description: Provides a base implementation for decoding encoded polyline strings into sequences of geographic coordinates.
+ description: Provides a base implementation for decoding encoded polyline strings into sequences of items.
diff --git a/api-reference/0.0/PolylineAlgorithm.Abstraction.AbstractPolylineEncoder-2.yml b/api-reference/0.0/PolylineAlgorithm.Abstraction.AbstractPolylineEncoder-2.yml
index 64e97b11..a421abcd 100644
--- a/api-reference/0.0/PolylineAlgorithm.Abstraction.AbstractPolylineEncoder-2.yml
+++ b/api-reference/0.0/PolylineAlgorithm.Abstraction.AbstractPolylineEncoder-2.yml
@@ -3,7 +3,7 @@ title: Class AbstractPolylineEncoder
body:
- api1: Class AbstractPolylineEncoder
id: PolylineAlgorithm_Abstraction_AbstractPolylineEncoder_2
- src: https://github.com/petesramek/polyline-algorithm-csharp/blob/copilot/review-github-templates/src/PolylineAlgorithm/Abstraction/AbstractPolylineEncoder.cs#L27
+ src: https://github.com/petesramek/polyline-algorithm-csharp/blob/copilot/assess-repository-state/src/PolylineAlgorithm/Abstraction/AbstractPolylineEncoder.cs#L27
metadata:
uid: PolylineAlgorithm.Abstraction.AbstractPolylineEncoder`2
commentId: T:PolylineAlgorithm.Abstraction.AbstractPolylineEncoder`2
@@ -14,12 +14,12 @@ body:
url: PolylineAlgorithm.Abstraction.html
- name: Assembly
value: PolylineAlgorithm.dll
-- markdown: Provides a base implementation for encoding sequences of geographic coordinates into encoded polyline strings.
+- markdown: Provides a base implementation for encoding sequences of items into encoded polyline strings.
- code: 'public abstract class AbstractPolylineEncoder : IPolylineEncoder'
- h4: Type Parameters
- parameters:
- name: TCoordinate
- description: The type that represents a geographic coordinate to encode.
+ description: The type that represents an item to encode.
- name: TPolyline
description: The type that represents the encoded polyline output.
- h4: Inheritance
@@ -56,13 +56,13 @@ body:
url: PolylineAlgorithm.Extensions.PolylineEncoderExtensions.html#PolylineAlgorithm_Extensions_PolylineEncoderExtensions_Encode__2_PolylineAlgorithm_Abstraction_IPolylineEncoder___0___1____0___
- h2: Remarks
- markdown: >-
- Derive from this class to implement an encoder for a specific coordinate and polyline type. Override
+ Derive from this class to implement an encoder for a specific item and polyline type. Override
- , , and to provide type-specific behavior.
+ , and to provide type-specific behavior.
- h2: Constructors
- api3: AbstractPolylineEncoder()
id: PolylineAlgorithm_Abstraction_AbstractPolylineEncoder_2__ctor
- src: https://github.com/petesramek/polyline-algorithm-csharp/blob/copilot/review-github-templates/src/PolylineAlgorithm/Abstraction/AbstractPolylineEncoder.cs#L33
+ src: https://github.com/petesramek/polyline-algorithm-csharp/blob/copilot/assess-repository-state/src/PolylineAlgorithm/Abstraction/AbstractPolylineEncoder.cs#L33
metadata:
uid: PolylineAlgorithm.Abstraction.AbstractPolylineEncoder`2.#ctor
commentId: M:PolylineAlgorithm.Abstraction.AbstractPolylineEncoder`2.#ctor
@@ -70,7 +70,7 @@ body:
- code: protected AbstractPolylineEncoder()
- api3: AbstractPolylineEncoder(PolylineEncodingOptions)
id: PolylineAlgorithm_Abstraction_AbstractPolylineEncoder_2__ctor_PolylineAlgorithm_PolylineEncodingOptions_
- src: https://github.com/petesramek/polyline-algorithm-csharp/blob/copilot/review-github-templates/src/PolylineAlgorithm/Abstraction/AbstractPolylineEncoder.cs#L43
+ src: https://github.com/petesramek/polyline-algorithm-csharp/blob/copilot/assess-repository-state/src/PolylineAlgorithm/Abstraction/AbstractPolylineEncoder.cs#L43
metadata:
uid: PolylineAlgorithm.Abstraction.AbstractPolylineEncoder`2.#ctor(PolylineAlgorithm.PolylineEncodingOptions)
commentId: M:PolylineAlgorithm.Abstraction.AbstractPolylineEncoder`2.#ctor(PolylineAlgorithm.PolylineEncodingOptions)
@@ -92,7 +92,7 @@ body:
- h2: Properties
- api3: Options
id: PolylineAlgorithm_Abstraction_AbstractPolylineEncoder_2_Options
- src: https://github.com/petesramek/polyline-algorithm-csharp/blob/copilot/review-github-templates/src/PolylineAlgorithm/Abstraction/AbstractPolylineEncoder.cs#L57
+ src: https://github.com/petesramek/polyline-algorithm-csharp/blob/copilot/assess-repository-state/src/PolylineAlgorithm/Abstraction/AbstractPolylineEncoder.cs#L57
metadata:
uid: PolylineAlgorithm.Abstraction.AbstractPolylineEncoder`2.Options
commentId: P:PolylineAlgorithm.Abstraction.AbstractPolylineEncoder`2.Options
@@ -104,25 +104,25 @@ body:
- text: PolylineEncodingOptions
url: PolylineAlgorithm.PolylineEncodingOptions.html
- h2: Methods
-- api3: CreatePolyline(ReadOnlyMemory)
- id: PolylineAlgorithm_Abstraction_AbstractPolylineEncoder_2_CreatePolyline_System_ReadOnlyMemory_System_Char__
- src: https://github.com/petesramek/polyline-algorithm-csharp/blob/copilot/review-github-templates/src/PolylineAlgorithm/Abstraction/AbstractPolylineEncoder.cs#L174
+- api3: CreatePolyline(ReadOnlySpan)
+ id: PolylineAlgorithm_Abstraction_AbstractPolylineEncoder_2_CreatePolyline_System_ReadOnlySpan_System_Char__
+ src: https://github.com/petesramek/polyline-algorithm-csharp/blob/copilot/assess-repository-state/src/PolylineAlgorithm/Abstraction/AbstractPolylineEncoder.cs#L143
metadata:
- uid: PolylineAlgorithm.Abstraction.AbstractPolylineEncoder`2.CreatePolyline(System.ReadOnlyMemory{System.Char})
- commentId: M:PolylineAlgorithm.Abstraction.AbstractPolylineEncoder`2.CreatePolyline(System.ReadOnlyMemory{System.Char})
-- markdown: Creates a polyline instance from the provided read-only sequence of characters.
-- code: protected abstract TPolyline CreatePolyline(ReadOnlyMemory polyline)
+ uid: PolylineAlgorithm.Abstraction.AbstractPolylineEncoder`2.CreatePolyline(System.ReadOnlySpan{System.Char})
+ commentId: M:PolylineAlgorithm.Abstraction.AbstractPolylineEncoder`2.CreatePolyline(System.ReadOnlySpan{System.Char})
+- markdown: Creates a polyline instance from the provided read-only span of characters.
+- code: protected abstract TPolyline CreatePolyline(ReadOnlySpan polyline)
- h4: Parameters
- parameters:
- name: polyline
type:
- - text: ReadOnlyMemory
- url: https://learn.microsoft.com/dotnet/api/system.readonlymemory-1
+ - text: ReadOnlySpan
+ url: https://learn.microsoft.com/dotnet/api/system.readonlyspan-1
- <
- text: char
url: https://learn.microsoft.com/dotnet/api/system.char
- '>'
- description: A containing the encoded polyline characters.
+ description: A containing the encoded polyline characters.
- h4: Returns
- parameters:
- type:
@@ -130,15 +130,12 @@ body:
description: An instance of TPolyline representing the encoded polyline.
- api3: Encode(ReadOnlySpan, CancellationToken)
id: PolylineAlgorithm_Abstraction_AbstractPolylineEncoder_2_Encode_System_ReadOnlySpan__0__System_Threading_CancellationToken_
- src: https://github.com/petesramek/polyline-algorithm-csharp/blob/copilot/review-github-templates/src/PolylineAlgorithm/Abstraction/AbstractPolylineEncoder.cs#L80
+ src: https://github.com/petesramek/polyline-algorithm-csharp/blob/copilot/assess-repository-state/src/PolylineAlgorithm/Abstraction/AbstractPolylineEncoder.cs#L80
metadata:
uid: PolylineAlgorithm.Abstraction.AbstractPolylineEncoder`2.Encode(System.ReadOnlySpan{`0},System.Threading.CancellationToken)
commentId: M:PolylineAlgorithm.Abstraction.AbstractPolylineEncoder`2.Encode(System.ReadOnlySpan{`0},System.Threading.CancellationToken)
- markdown: Encodes a collection of TCoordinate instances into an encoded TPolyline string.
-- code: >-
- [SuppressMessage("Design", "MA0051:Method is too long", Justification = "Method contains local methods. Actual method only 55 lines.")]
-
- public TPolyline Encode(ReadOnlySpan coordinates, CancellationToken cancellationToken = default)
+- code: public TPolyline Encode(ReadOnlySpan coordinates, CancellationToken cancellationToken = default)
- h4: Parameters
- parameters:
- name: coordinates
@@ -174,46 +171,37 @@ body:
- text: InvalidOperationException
url: https://learn.microsoft.com/dotnet/api/system.invalidoperationexception
description: Thrown when the internal encoding buffer cannot accommodate the encoded value.
-- api3: GetLatitude(TCoordinate)
- id: PolylineAlgorithm_Abstraction_AbstractPolylineEncoder_2_GetLatitude__0_
- src: https://github.com/petesramek/polyline-algorithm-csharp/blob/copilot/review-github-templates/src/PolylineAlgorithm/Abstraction/AbstractPolylineEncoder.cs#L194
+- api3: Write(TCoordinate, ref PolylineWriter)
+ id: PolylineAlgorithm_Abstraction_AbstractPolylineEncoder_2_Write__0_PolylineAlgorithm_Internal_PolylineWriter__
+ src: https://github.com/petesramek/polyline-algorithm-csharp/blob/copilot/assess-repository-state/src/PolylineAlgorithm/Abstraction/AbstractPolylineEncoder.cs#L160
metadata:
- uid: PolylineAlgorithm.Abstraction.AbstractPolylineEncoder`2.GetLatitude(`0)
- commentId: M:PolylineAlgorithm.Abstraction.AbstractPolylineEncoder`2.GetLatitude(`0)
-- markdown: Extracts the latitude value from the specified coordinate.
-- code: protected abstract double GetLatitude(TCoordinate current)
+ uid: PolylineAlgorithm.Abstraction.AbstractPolylineEncoder`2.Write(`0,PolylineAlgorithm.Internal.PolylineWriter@)
+ commentId: M:PolylineAlgorithm.Abstraction.AbstractPolylineEncoder`2.Write(`0,PolylineAlgorithm.Internal.PolylineWriter@)
+- markdown: Writes the field values of the specified item into the polyline encoding pipeline.
+- code: protected abstract void Write(TCoordinate item, ref PolylineWriter writer)
- h4: Parameters
- parameters:
- - name: current
+ - name: item
type:
- TCoordinate
- description: The coordinate from which to extract the latitude.
-- h4: Returns
-- parameters:
- - type:
- - text: double
- url: https://learn.microsoft.com/dotnet/api/system.double
- description: The latitude value as a .
-- api3: GetLongitude(TCoordinate)
- id: PolylineAlgorithm_Abstraction_AbstractPolylineEncoder_2_GetLongitude__0_
- src: https://github.com/petesramek/polyline-algorithm-csharp/blob/copilot/review-github-templates/src/PolylineAlgorithm/Abstraction/AbstractPolylineEncoder.cs#L184
- metadata:
- uid: PolylineAlgorithm.Abstraction.AbstractPolylineEncoder`2.GetLongitude(`0)
- commentId: M:PolylineAlgorithm.Abstraction.AbstractPolylineEncoder`2.GetLongitude(`0)
-- markdown: Extracts the longitude value from the specified coordinate.
-- code: protected abstract double GetLongitude(TCoordinate current)
-- h4: Parameters
-- parameters:
- - name: current
+ description: The item whose field values are to be encoded.
+ - name: writer
type:
- - TCoordinate
- description: The coordinate from which to extract the longitude.
-- h4: Returns
-- parameters:
- - type:
- - text: double
- url: https://learn.microsoft.com/dotnet/api/system.double
- description: The longitude value as a .
+ - text: PolylineWriter
+ url: PolylineAlgorithm.Internal.PolylineWriter.html
+ description: >-
+ The cursor provided by the engine. Call
+
+ once for each field value, in a fixed, consistent order. The engine handles delta computation,
+
+ zigzag encoding, and output buffering.
+- h4: Remarks
+- markdown: >-
+ Implementations must always call the same number of times,
+
+ in the same field order, for every item. The corresponding Read override must
+
+ call the same number of times in the same order.
languageId: csharp
metadata:
- description: Provides a base implementation for encoding sequences of geographic coordinates into encoded polyline strings.
+ description: Provides a base implementation for encoding sequences of items into encoded polyline strings.
diff --git a/api-reference/0.0/PolylineAlgorithm.Abstraction.IPolylineDecoder-2.yml b/api-reference/0.0/PolylineAlgorithm.Abstraction.IPolylineDecoder-2.yml
index 733987cb..c3a0cc71 100644
--- a/api-reference/0.0/PolylineAlgorithm.Abstraction.IPolylineDecoder-2.yml
+++ b/api-reference/0.0/PolylineAlgorithm.Abstraction.IPolylineDecoder-2.yml
@@ -3,7 +3,7 @@ title: Interface IPolylineDecoder
body:
- api1: Interface IPolylineDecoder
id: PolylineAlgorithm_Abstraction_IPolylineDecoder_2
- src: https://github.com/petesramek/polyline-algorithm-csharp/blob/copilot/review-github-templates/src/PolylineAlgorithm/Abstraction/IPolylineDecoder.cs#L22
+ src: https://github.com/petesramek/polyline-algorithm-csharp/blob/copilot/assess-repository-state/src/PolylineAlgorithm/Abstraction/IPolylineDecoder.cs#L22
metadata:
uid: PolylineAlgorithm.Abstraction.IPolylineDecoder`2
commentId: T:PolylineAlgorithm.Abstraction.IPolylineDecoder`2
@@ -31,7 +31,7 @@ body:
- h2: Methods
- api3: Decode(TPolyline, CancellationToken)
id: PolylineAlgorithm_Abstraction_IPolylineDecoder_2_Decode__0_System_Threading_CancellationToken_
- src: https://github.com/petesramek/polyline-algorithm-csharp/blob/copilot/review-github-templates/src/PolylineAlgorithm/Abstraction/IPolylineDecoder.cs#L48
+ src: https://github.com/petesramek/polyline-algorithm-csharp/blob/copilot/assess-repository-state/src/PolylineAlgorithm/Abstraction/IPolylineDecoder.cs#L48
metadata:
uid: PolylineAlgorithm.Abstraction.IPolylineDecoder`2.Decode(`0,System.Threading.CancellationToken)
commentId: M:PolylineAlgorithm.Abstraction.IPolylineDecoder`2.Decode(`0,System.Threading.CancellationToken)
diff --git a/api-reference/0.0/PolylineAlgorithm.Abstraction.IPolylineEncoder-2.yml b/api-reference/0.0/PolylineAlgorithm.Abstraction.IPolylineEncoder-2.yml
index 341a9de7..952d1a27 100644
--- a/api-reference/0.0/PolylineAlgorithm.Abstraction.IPolylineEncoder-2.yml
+++ b/api-reference/0.0/PolylineAlgorithm.Abstraction.IPolylineEncoder-2.yml
@@ -3,7 +3,7 @@ title: Interface IPolylineEncoder
body:
- api1: Interface IPolylineEncoder
id: PolylineAlgorithm_Abstraction_IPolylineEncoder_2
- src: https://github.com/petesramek/polyline-algorithm-csharp/blob/copilot/review-github-templates/src/PolylineAlgorithm/Abstraction/IPolylineEncoder.cs#L36
+ src: https://github.com/petesramek/polyline-algorithm-csharp/blob/copilot/assess-repository-state/src/PolylineAlgorithm/Abstraction/IPolylineEncoder.cs#L36
metadata:
uid: PolylineAlgorithm.Abstraction.IPolylineEncoder`2
commentId: T:PolylineAlgorithm.Abstraction.IPolylineEncoder`2
@@ -63,7 +63,7 @@ body:
- h2: Methods
- api3: Encode(ReadOnlySpan, CancellationToken)
id: PolylineAlgorithm_Abstraction_IPolylineEncoder_2_Encode_System_ReadOnlySpan__0__System_Threading_CancellationToken_
- src: https://github.com/petesramek/polyline-algorithm-csharp/blob/copilot/review-github-templates/src/PolylineAlgorithm/Abstraction/IPolylineEncoder.cs#L76
+ src: https://github.com/petesramek/polyline-algorithm-csharp/blob/copilot/assess-repository-state/src/PolylineAlgorithm/Abstraction/IPolylineEncoder.cs#L76
metadata:
uid: PolylineAlgorithm.Abstraction.IPolylineEncoder`2.Encode(System.ReadOnlySpan{`0},System.Threading.CancellationToken)
commentId: M:PolylineAlgorithm.Abstraction.IPolylineEncoder`2.Encode(System.ReadOnlySpan{`0},System.Threading.CancellationToken)
diff --git a/api-reference/0.0/PolylineAlgorithm.Abstraction.yml b/api-reference/0.0/PolylineAlgorithm.Abstraction.yml
index e9de48f7..760e007f 100644
--- a/api-reference/0.0/PolylineAlgorithm.Abstraction.yml
+++ b/api-reference/0.0/PolylineAlgorithm.Abstraction.yml
@@ -11,11 +11,11 @@ body:
- type:
text: AbstractPolylineDecoder
url: PolylineAlgorithm.Abstraction.AbstractPolylineDecoder-2.html
- description: Provides a base implementation for decoding encoded polyline strings into sequences of geographic coordinates.
+ description: Provides a base implementation for decoding encoded polyline strings into sequences of items.
- type:
text: AbstractPolylineEncoder
url: PolylineAlgorithm.Abstraction.AbstractPolylineEncoder-2.html
- description: Provides a base implementation for encoding sequences of geographic coordinates into encoded polyline strings.
+ description: Provides a base implementation for encoding sequences of items into encoded polyline strings.
- h3: Interfaces
- parameters:
- type:
diff --git a/api-reference/0.0/PolylineAlgorithm.Extensions.PolylineDecoderExtensions.yml b/api-reference/0.0/PolylineAlgorithm.Extensions.PolylineDecoderExtensions.yml
index 8356b63c..5b6e2da1 100644
--- a/api-reference/0.0/PolylineAlgorithm.Extensions.PolylineDecoderExtensions.yml
+++ b/api-reference/0.0/PolylineAlgorithm.Extensions.PolylineDecoderExtensions.yml
@@ -3,7 +3,7 @@ title: Class PolylineDecoderExtensions
body:
- api1: Class PolylineDecoderExtensions
id: PolylineAlgorithm_Extensions_PolylineDecoderExtensions
- src: https://github.com/petesramek/polyline-algorithm-csharp/blob/copilot/review-github-templates/src/PolylineAlgorithm/Extensions/PolylineDecoderExtensions.cs#L16
+ src: https://github.com/petesramek/polyline-algorithm-csharp/blob/copilot/assess-repository-state/src/PolylineAlgorithm/Extensions/PolylineDecoderExtensions.cs#L16
metadata:
uid: PolylineAlgorithm.Extensions.PolylineDecoderExtensions
commentId: T:PolylineAlgorithm.Extensions.PolylineDecoderExtensions
@@ -41,7 +41,7 @@ body:
- h2: Methods
- api3: Decode(IPolylineDecoder, char[])
id: PolylineAlgorithm_Extensions_PolylineDecoderExtensions_Decode__1_PolylineAlgorithm_Abstraction_IPolylineDecoder_System_String___0__System_Char___
- src: https://github.com/petesramek/polyline-algorithm-csharp/blob/copilot/review-github-templates/src/PolylineAlgorithm/Extensions/PolylineDecoderExtensions.cs#L33
+ src: https://github.com/petesramek/polyline-algorithm-csharp/blob/copilot/assess-repository-state/src/PolylineAlgorithm/Extensions/PolylineDecoderExtensions.cs#L33
metadata:
uid: PolylineAlgorithm.Extensions.PolylineDecoderExtensions.Decode``1(PolylineAlgorithm.Abstraction.IPolylineDecoder{System.String,``0},System.Char[])
commentId: M:PolylineAlgorithm.Extensions.PolylineDecoderExtensions.Decode``1(PolylineAlgorithm.Abstraction.IPolylineDecoder{System.String,``0},System.Char[])
@@ -89,7 +89,7 @@ body:
description: Thrown when decoder or polyline is null.
- api3: Decode(IPolylineDecoder, ReadOnlyMemory)
id: PolylineAlgorithm_Extensions_PolylineDecoderExtensions_Decode__1_PolylineAlgorithm_Abstraction_IPolylineDecoder_System_String___0__System_ReadOnlyMemory_System_Char__
- src: https://github.com/petesramek/polyline-algorithm-csharp/blob/copilot/review-github-templates/src/PolylineAlgorithm/Extensions/PolylineDecoderExtensions.cs#L61
+ src: https://github.com/petesramek/polyline-algorithm-csharp/blob/copilot/assess-repository-state/src/PolylineAlgorithm/Extensions/PolylineDecoderExtensions.cs#L61
metadata:
uid: PolylineAlgorithm.Extensions.PolylineDecoderExtensions.Decode``1(PolylineAlgorithm.Abstraction.IPolylineDecoder{System.String,``0},System.ReadOnlyMemory{System.Char})
commentId: M:PolylineAlgorithm.Extensions.PolylineDecoderExtensions.Decode``1(PolylineAlgorithm.Abstraction.IPolylineDecoder{System.String,``0},System.ReadOnlyMemory{System.Char})
@@ -139,7 +139,7 @@ body:
description: Thrown when decoder is null.
- api3: Decode(IPolylineDecoder, TValue>, string)
id: PolylineAlgorithm_Extensions_PolylineDecoderExtensions_Decode__1_PolylineAlgorithm_Abstraction_IPolylineDecoder_System_ReadOnlyMemory_System_Char____0__System_String_
- src: https://github.com/petesramek/polyline-algorithm-csharp/blob/copilot/review-github-templates/src/PolylineAlgorithm/Extensions/PolylineDecoderExtensions.cs#L86
+ src: https://github.com/petesramek/polyline-algorithm-csharp/blob/copilot/assess-repository-state/src/PolylineAlgorithm/Extensions/PolylineDecoderExtensions.cs#L86
metadata:
uid: PolylineAlgorithm.Extensions.PolylineDecoderExtensions.Decode``1(PolylineAlgorithm.Abstraction.IPolylineDecoder{System.ReadOnlyMemory{System.Char},``0},System.String)
commentId: M:PolylineAlgorithm.Extensions.PolylineDecoderExtensions.Decode``1(PolylineAlgorithm.Abstraction.IPolylineDecoder{System.ReadOnlyMemory{System.Char},``0},System.String)
diff --git a/api-reference/0.0/PolylineAlgorithm.Extensions.PolylineEncoderExtensions.yml b/api-reference/0.0/PolylineAlgorithm.Extensions.PolylineEncoderExtensions.yml
index e5296518..bd62ed13 100644
--- a/api-reference/0.0/PolylineAlgorithm.Extensions.PolylineEncoderExtensions.yml
+++ b/api-reference/0.0/PolylineAlgorithm.Extensions.PolylineEncoderExtensions.yml
@@ -3,7 +3,7 @@ title: Class PolylineEncoderExtensions
body:
- api1: Class PolylineEncoderExtensions
id: PolylineAlgorithm_Extensions_PolylineEncoderExtensions
- src: https://github.com/petesramek/polyline-algorithm-csharp/blob/copilot/review-github-templates/src/PolylineAlgorithm/Extensions/PolylineEncoderExtensions.cs#L19
+ src: https://github.com/petesramek/polyline-algorithm-csharp/blob/copilot/assess-repository-state/src/PolylineAlgorithm/Extensions/PolylineEncoderExtensions.cs#L19
metadata:
uid: PolylineAlgorithm.Extensions.PolylineEncoderExtensions
commentId: T:PolylineAlgorithm.Extensions.PolylineEncoderExtensions
@@ -41,7 +41,7 @@ body:
- h2: Methods
- api3: Encode(IPolylineEncoder, List)
id: PolylineAlgorithm_Extensions_PolylineEncoderExtensions_Encode__2_PolylineAlgorithm_Abstraction_IPolylineEncoder___0___1__System_Collections_Generic_List___0__
- src: https://github.com/petesramek/polyline-algorithm-csharp/blob/copilot/review-github-templates/src/PolylineAlgorithm/Extensions/PolylineEncoderExtensions.cs#L37
+ src: https://github.com/petesramek/polyline-algorithm-csharp/blob/copilot/assess-repository-state/src/PolylineAlgorithm/Extensions/PolylineEncoderExtensions.cs#L37
metadata:
uid: PolylineAlgorithm.Extensions.PolylineEncoderExtensions.Encode``2(PolylineAlgorithm.Abstraction.IPolylineEncoder{``0,``1},System.Collections.Generic.List{``0})
commentId: M:PolylineAlgorithm.Extensions.PolylineEncoderExtensions.Encode``2(PolylineAlgorithm.Abstraction.IPolylineEncoder{``0,``1},System.Collections.Generic.List{``0})
@@ -92,7 +92,7 @@ body:
description: Thrown when encoder or coordinates is null.
- api3: Encode(IPolylineEncoder, TCoordinate[])
id: PolylineAlgorithm_Extensions_PolylineEncoderExtensions_Encode__2_PolylineAlgorithm_Abstraction_IPolylineEncoder___0___1____0___
- src: https://github.com/petesramek/polyline-algorithm-csharp/blob/copilot/review-github-templates/src/PolylineAlgorithm/Extensions/PolylineEncoderExtensions.cs#L73
+ src: https://github.com/petesramek/polyline-algorithm-csharp/blob/copilot/assess-repository-state/src/PolylineAlgorithm/Extensions/PolylineEncoderExtensions.cs#L73
metadata:
uid: PolylineAlgorithm.Extensions.PolylineEncoderExtensions.Encode``2(PolylineAlgorithm.Abstraction.IPolylineEncoder{``0,``1},``0[])
commentId: M:PolylineAlgorithm.Extensions.PolylineEncoderExtensions.Encode``2(PolylineAlgorithm.Abstraction.IPolylineEncoder{``0,``1},``0[])
diff --git a/api-reference/0.0/PolylineAlgorithm.Internal.PolylineReader.yml b/api-reference/0.0/PolylineAlgorithm.Internal.PolylineReader.yml
new file mode 100644
index 00000000..a9b1b374
--- /dev/null
+++ b/api-reference/0.0/PolylineAlgorithm.Internal.PolylineReader.yml
@@ -0,0 +1,76 @@
+### YamlMime:ApiPage
+title: Class PolylineReader
+body:
+- api1: Class PolylineReader
+ id: PolylineAlgorithm_Internal_PolylineReader
+ src: https://github.com/petesramek/polyline-algorithm-csharp/blob/copilot/assess-repository-state/src/PolylineAlgorithm/Internal/PolylineReader.cs#L20
+ metadata:
+ uid: PolylineAlgorithm.Internal.PolylineReader
+ commentId: T:PolylineAlgorithm.Internal.PolylineReader
+- facts:
+ - name: Namespace
+ value:
+ text: PolylineAlgorithm.Internal
+ url: PolylineAlgorithm.Internal.html
+ - name: Assembly
+ value: PolylineAlgorithm.dll
+- markdown: Engine-owned stateful cursor that delivers decoded field values to a formatter during polyline decoding.
+- code: public sealed class PolylineReader
+- h4: Inheritance
+- inheritance:
+ - text: object
+ url: https://learn.microsoft.com/dotnet/api/system.object
+ - text: PolylineReader
+ url: PolylineAlgorithm.Internal.PolylineReader.html
+- h4: Inherited Members
+- list:
+ - text: object.Equals(object)
+ url: https://learn.microsoft.com/dotnet/api/system.object.equals#system-object-equals(system-object)
+ - text: object.Equals(object, object)
+ url: https://learn.microsoft.com/dotnet/api/system.object.equals#system-object-equals(system-object-system-object)
+ - text: object.GetHashCode()
+ url: https://learn.microsoft.com/dotnet/api/system.object.gethashcode
+ - text: object.GetType()
+ url: https://learn.microsoft.com/dotnet/api/system.object.gettype
+ - text: object.ReferenceEquals(object, object)
+ url: https://learn.microsoft.com/dotnet/api/system.object.referenceequals
+ - text: object.ToString()
+ url: https://learn.microsoft.com/dotnet/api/system.object.tostring
+- h2: Remarks
+- markdown: >-
+ The reader wraps the raw encoded character sequence and applies the full decoding pipeline
+
+ (ASCII shift reversal, un-zigzag, per-slot delta accumulation) on each call.
+
+ The engine calls BeginItem before invoking the formatter for each item so that the
+
+ slot index resets correctly while delta state is preserved across item boundaries.
+- h2: Methods
+- api3: Read(ref int)
+ id: PolylineAlgorithm_Internal_PolylineReader_Read_System_Int32__
+ src: https://github.com/petesramek/polyline-algorithm-csharp/blob/copilot/assess-repository-state/src/PolylineAlgorithm/Internal/PolylineReader.cs#L37
+ metadata:
+ uid: PolylineAlgorithm.Internal.PolylineReader.Read(System.Int32@)
+ commentId: M:PolylineAlgorithm.Internal.PolylineReader.Read(System.Int32@)
+- markdown: Reads and returns the next decoded field value from the polyline sequence.
+- code: public double Read(ref int state)
+- h4: Parameters
+- parameters:
+ - name: state
+ type:
+ - text: int
+ url: https://learn.microsoft.com/dotnet/api/system.int32
+- h4: Returns
+- parameters:
+ - type:
+ - text: double
+ url: https://learn.microsoft.com/dotnet/api/system.double
+- h4: Exceptions
+- parameters:
+ - type:
+ - text: InvalidPolylineException
+ url: PolylineAlgorithm.InvalidPolylineException.html
+ description: Thrown when the data runs out before the formatter has finished reading an item's fields.
+languageId: csharp
+metadata:
+ description: Engine-owned stateful cursor that delivers decoded field values to a formatter during polyline decoding.
diff --git a/api-reference/0.0/PolylineAlgorithm.Internal.PolylineWriter.yml b/api-reference/0.0/PolylineAlgorithm.Internal.PolylineWriter.yml
new file mode 100644
index 00000000..4e887b40
--- /dev/null
+++ b/api-reference/0.0/PolylineAlgorithm.Internal.PolylineWriter.yml
@@ -0,0 +1,65 @@
+### YamlMime:ApiPage
+title: Struct PolylineWriter
+body:
+- api1: Struct PolylineWriter
+ id: PolylineAlgorithm_Internal_PolylineWriter
+ src: https://github.com/petesramek/polyline-algorithm-csharp/blob/copilot/assess-repository-state/src/PolylineAlgorithm/Internal/PolylineWriter.cs#L22
+ metadata:
+ uid: PolylineAlgorithm.Internal.PolylineWriter
+ commentId: T:PolylineAlgorithm.Internal.PolylineWriter
+- facts:
+ - name: Namespace
+ value:
+ text: PolylineAlgorithm.Internal
+ url: PolylineAlgorithm.Internal.html
+ - name: Assembly
+ value: PolylineAlgorithm.dll
+- markdown: Engine-owned stateful cursor that feeds values written by a formatter into the polyline encoding pipeline.
+- code: public ref struct PolylineWriter
+- h4: Inherited Members
+- list:
+ - text: object.Equals(object)
+ url: https://learn.microsoft.com/dotnet/api/system.object.equals#system-object-equals(system-object)
+ - text: object.Equals(object, object)
+ url: https://learn.microsoft.com/dotnet/api/system.object.equals#system-object-equals(system-object-system-object)
+ - text: object.GetHashCode()
+ url: https://learn.microsoft.com/dotnet/api/system.object.gethashcode
+ - text: object.GetType()
+ url: https://learn.microsoft.com/dotnet/api/system.object.gettype
+ - text: object.ReferenceEquals(object, object)
+ url: https://learn.microsoft.com/dotnet/api/system.object.referenceequals
+ - text: object.ToString()
+ url: https://learn.microsoft.com/dotnet/api/system.object.tostring
+- h2: Remarks
+- markdown: >-
+ Each instance wraps a caller-provided buffer sized to the worst-case maximum
+
+ capacity so that the buffer never needs to grow. The buffer may be stack-allocated or rented from
+
+ ; the engine calls BeginItem before
+
+ invoking the formatter for each item so that the slot index resets correctly while delta state is
+
+ preserved across item boundaries.
+- h2: Methods
+- api3: Write(double, ref int)
+ id: PolylineAlgorithm_Internal_PolylineWriter_Write_System_Double_System_Int32__
+ src: https://github.com/petesramek/polyline-algorithm-csharp/blob/copilot/assess-repository-state/src/PolylineAlgorithm/Internal/PolylineWriter.cs#L36
+ metadata:
+ uid: PolylineAlgorithm.Internal.PolylineWriter.Write(System.Double,System.Int32@)
+ commentId: M:PolylineAlgorithm.Internal.PolylineWriter.Write(System.Double,System.Int32@)
+- markdown: Emits one field value into the encoding pipeline.
+- code: public void Write(double value, ref int state)
+- h4: Parameters
+- parameters:
+ - name: value
+ type:
+ - text: double
+ url: https://learn.microsoft.com/dotnet/api/system.double
+ - name: state
+ type:
+ - text: int
+ url: https://learn.microsoft.com/dotnet/api/system.int32
+languageId: csharp
+metadata:
+ description: Engine-owned stateful cursor that feeds values written by a formatter into the polyline encoding pipeline.
diff --git a/api-reference/0.0/PolylineAlgorithm.Internal.yml b/api-reference/0.0/PolylineAlgorithm.Internal.yml
new file mode 100644
index 00000000..375a8e20
--- /dev/null
+++ b/api-reference/0.0/PolylineAlgorithm.Internal.yml
@@ -0,0 +1,21 @@
+### YamlMime:ApiPage
+title: Namespace PolylineAlgorithm.Internal
+body:
+- api1: Namespace PolylineAlgorithm.Internal
+ id: PolylineAlgorithm_Internal
+ metadata:
+ uid: PolylineAlgorithm.Internal
+ commentId: N:PolylineAlgorithm.Internal
+- h3: Classes
+- parameters:
+ - type:
+ text: PolylineReader
+ url: PolylineAlgorithm.Internal.PolylineReader.html
+ description: Engine-owned stateful cursor that delivers decoded field values to a formatter during polyline decoding.
+- h3: Structs
+- parameters:
+ - type:
+ text: PolylineWriter
+ url: PolylineAlgorithm.Internal.PolylineWriter.html
+ description: Engine-owned stateful cursor that feeds values written by a formatter into the polyline encoding pipeline.
+languageId: csharp
diff --git a/api-reference/0.0/PolylineAlgorithm.InvalidPolylineException.yml b/api-reference/0.0/PolylineAlgorithm.InvalidPolylineException.yml
index 2c4e3cc1..8f6b6e76 100644
--- a/api-reference/0.0/PolylineAlgorithm.InvalidPolylineException.yml
+++ b/api-reference/0.0/PolylineAlgorithm.InvalidPolylineException.yml
@@ -3,7 +3,7 @@ title: Class InvalidPolylineException
body:
- api1: Class InvalidPolylineException
id: PolylineAlgorithm_InvalidPolylineException
- src: https://github.com/petesramek/polyline-algorithm-csharp/blob/copilot/review-github-templates/src/PolylineAlgorithm/InvalidPolylineException.cs#L17
+ src: https://github.com/petesramek/polyline-algorithm-csharp/blob/copilot/assess-repository-state/src/PolylineAlgorithm/InvalidPolylineException.cs#L17
metadata:
uid: PolylineAlgorithm.InvalidPolylineException
commentId: T:PolylineAlgorithm.InvalidPolylineException
@@ -71,7 +71,7 @@ body:
- h2: Constructors
- api3: InvalidPolylineException()
id: PolylineAlgorithm_InvalidPolylineException__ctor
- src: https://github.com/petesramek/polyline-algorithm-csharp/blob/copilot/review-github-templates/src/PolylineAlgorithm/InvalidPolylineException.cs#L22
+ src: https://github.com/petesramek/polyline-algorithm-csharp/blob/copilot/assess-repository-state/src/PolylineAlgorithm/InvalidPolylineException.cs#L22
metadata:
uid: PolylineAlgorithm.InvalidPolylineException.#ctor
commentId: M:PolylineAlgorithm.InvalidPolylineException.#ctor
@@ -79,7 +79,7 @@ body:
- code: public InvalidPolylineException()
- api3: InvalidPolylineException(string, Exception)
id: PolylineAlgorithm_InvalidPolylineException__ctor_System_String_System_Exception_
- src: https://github.com/petesramek/polyline-algorithm-csharp/blob/copilot/review-github-templates/src/PolylineAlgorithm/InvalidPolylineException.cs#L43
+ src: https://github.com/petesramek/polyline-algorithm-csharp/blob/copilot/assess-repository-state/src/PolylineAlgorithm/InvalidPolylineException.cs#L43
metadata:
uid: PolylineAlgorithm.InvalidPolylineException.#ctor(System.String,System.Exception)
commentId: M:PolylineAlgorithm.InvalidPolylineException.#ctor(System.String,System.Exception)
diff --git a/api-reference/0.0/PolylineAlgorithm.PolylineEncoding.yml b/api-reference/0.0/PolylineAlgorithm.PolylineEncoding.yml
index 1add8147..edd67e7b 100644
--- a/api-reference/0.0/PolylineAlgorithm.PolylineEncoding.yml
+++ b/api-reference/0.0/PolylineAlgorithm.PolylineEncoding.yml
@@ -3,7 +3,7 @@ title: Class PolylineEncoding
body:
- api1: Class PolylineEncoding
id: PolylineAlgorithm_PolylineEncoding
- src: https://github.com/petesramek/polyline-algorithm-csharp/blob/copilot/review-github-templates/src/PolylineAlgorithm/PolylineEncoding.cs#L23
+ src: https://github.com/petesramek/polyline-algorithm-csharp/blob/copilot/assess-repository-state/src/PolylineAlgorithm/PolylineEncoding.cs#L24
metadata:
uid: PolylineAlgorithm.PolylineEncoding
commentId: T:PolylineAlgorithm.PolylineEncoding
@@ -50,7 +50,7 @@ body:
- h2: Methods
- api3: Denormalize(int, uint)
id: PolylineAlgorithm_PolylineEncoding_Denormalize_System_Int32_System_UInt32_
- src: https://github.com/petesramek/polyline-algorithm-csharp/blob/copilot/review-github-templates/src/PolylineAlgorithm/PolylineEncoding.cs#L122
+ src: https://github.com/petesramek/polyline-algorithm-csharp/blob/copilot/assess-repository-state/src/PolylineAlgorithm/PolylineEncoding.cs#L123
metadata:
uid: PolylineAlgorithm.PolylineEncoding.Denormalize(System.Int32,System.UInt32)
commentId: M:PolylineAlgorithm.PolylineEncoding.Denormalize(System.Int32,System.UInt32)
@@ -117,7 +117,7 @@ body:
description: Thrown if the arithmetic operation overflows during conversion.
- api3: GetRequiredBufferSize(int)
id: PolylineAlgorithm_PolylineEncoding_GetRequiredBufferSize_System_Int32_
- src: https://github.com/petesramek/polyline-algorithm-csharp/blob/copilot/review-github-templates/src/PolylineAlgorithm/PolylineEncoding.cs#L298
+ src: https://github.com/petesramek/polyline-algorithm-csharp/blob/copilot/assess-repository-state/src/PolylineAlgorithm/PolylineEncoding.cs#L299
metadata:
uid: PolylineAlgorithm.PolylineEncoding.GetRequiredBufferSize(System.Int32)
commentId: M:PolylineAlgorithm.PolylineEncoding.GetRequiredBufferSize(System.Int32)
@@ -200,7 +200,7 @@ body:
- )
- api3: Normalize(double, uint)
id: PolylineAlgorithm_PolylineEncoding_Normalize_System_Double_System_UInt32_
- src: https://github.com/petesramek/polyline-algorithm-csharp/blob/copilot/review-github-templates/src/PolylineAlgorithm/PolylineEncoding.cs#L61
+ src: https://github.com/petesramek/polyline-algorithm-csharp/blob/copilot/assess-repository-state/src/PolylineAlgorithm/PolylineEncoding.cs#L62
metadata:
uid: PolylineAlgorithm.PolylineEncoding.Normalize(System.Double,System.UInt32)
commentId: M:PolylineAlgorithm.PolylineEncoding.Normalize(System.Double,System.UInt32)
@@ -268,7 +268,7 @@ body:
description: Thrown when the normalized result exceeds the range of a 32-bit signed integer during the conversion from double to int.
- api3: TryReadValue(ref int, ReadOnlyMemory, ref int)
id: PolylineAlgorithm_PolylineEncoding_TryReadValue_System_Int32__System_ReadOnlyMemory_System_Char__System_Int32__
- src: https://github.com/petesramek/polyline-algorithm-csharp/blob/copilot/review-github-templates/src/PolylineAlgorithm/PolylineEncoding.cs#L169
+ src: https://github.com/petesramek/polyline-algorithm-csharp/blob/copilot/assess-repository-state/src/PolylineAlgorithm/PolylineEncoding.cs#L170
metadata:
uid: PolylineAlgorithm.PolylineEncoding.TryReadValue(System.Int32@,System.ReadOnlyMemory{System.Char},System.Int32@)
commentId: M:PolylineAlgorithm.PolylineEncoding.TryReadValue(System.Int32@,System.ReadOnlyMemory{System.Char},System.Int32@)
@@ -328,7 +328,7 @@ body:
- api3: TryWriteValue(int, Span, ref int)
id: PolylineAlgorithm_PolylineEncoding_TryWriteValue_System_Int32_System_Span_System_Char__System_Int32__
- src: https://github.com/petesramek/polyline-algorithm-csharp/blob/copilot/review-github-templates/src/PolylineAlgorithm/PolylineEncoding.cs#L237
+ src: https://github.com/petesramek/polyline-algorithm-csharp/blob/copilot/assess-repository-state/src/PolylineAlgorithm/PolylineEncoding.cs#L238
metadata:
uid: PolylineAlgorithm.PolylineEncoding.TryWriteValue(System.Int32,System.Span{System.Char},System.Int32@)
commentId: M:PolylineAlgorithm.PolylineEncoding.TryWriteValue(System.Int32,System.Span{System.Char},System.Int32@)
@@ -407,7 +407,7 @@ body:
- api3: ValidateBlockLength(ReadOnlySpan)
id: PolylineAlgorithm_PolylineEncoding_ValidateBlockLength_System_ReadOnlySpan_System_Char__
- src: https://github.com/petesramek/polyline-algorithm-csharp/blob/copilot/review-github-templates/src/PolylineAlgorithm/PolylineEncoding.cs#L438
+ src: https://github.com/petesramek/polyline-algorithm-csharp/blob/copilot/assess-repository-state/src/PolylineAlgorithm/PolylineEncoding.cs#L447
metadata:
uid: PolylineAlgorithm.PolylineEncoding.ValidateBlockLength(System.ReadOnlySpan{System.Char})
commentId: M:PolylineAlgorithm.PolylineEncoding.ValidateBlockLength(System.ReadOnlySpan{System.Char})
@@ -441,7 +441,7 @@ body:
description: Thrown when a block exceeds 7 characters or the polyline does not end with a valid block terminator.
- api3: ValidateCharRange(ReadOnlySpan)
id: PolylineAlgorithm_PolylineEncoding_ValidateCharRange_System_ReadOnlySpan_System_Char__
- src: https://github.com/petesramek/polyline-algorithm-csharp/blob/copilot/review-github-templates/src/PolylineAlgorithm/PolylineEncoding.cs#L392
+ src: https://github.com/petesramek/polyline-algorithm-csharp/blob/copilot/assess-repository-state/src/PolylineAlgorithm/PolylineEncoding.cs#L393
metadata:
uid: PolylineAlgorithm.PolylineEncoding.ValidateCharRange(System.ReadOnlySpan{System.Char})
commentId: M:PolylineAlgorithm.PolylineEncoding.ValidateCharRange(System.ReadOnlySpan{System.Char})
@@ -479,7 +479,7 @@ body:
description: Thrown when an invalid character is found in the polyline segment.
- api3: ValidateFormat(ReadOnlySpan)
id: PolylineAlgorithm_PolylineEncoding_ValidateFormat_System_ReadOnlySpan_System_Char__
- src: https://github.com/petesramek/polyline-algorithm-csharp/blob/copilot/review-github-templates/src/PolylineAlgorithm/PolylineEncoding.cs#L370
+ src: https://github.com/petesramek/polyline-algorithm-csharp/blob/copilot/assess-repository-state/src/PolylineAlgorithm/PolylineEncoding.cs#L371
metadata:
uid: PolylineAlgorithm.PolylineEncoding.ValidateFormat(System.ReadOnlySpan{System.Char})
commentId: M:PolylineAlgorithm.PolylineEncoding.ValidateFormat(System.ReadOnlySpan{System.Char})
diff --git a/api-reference/0.0/PolylineAlgorithm.PolylineEncodingOptions.yml b/api-reference/0.0/PolylineAlgorithm.PolylineEncodingOptions.yml
index 1947eac1..16977870 100644
--- a/api-reference/0.0/PolylineAlgorithm.PolylineEncodingOptions.yml
+++ b/api-reference/0.0/PolylineAlgorithm.PolylineEncodingOptions.yml
@@ -3,7 +3,7 @@ title: Class PolylineEncodingOptions
body:
- api1: Class PolylineEncodingOptions
id: PolylineAlgorithm_PolylineEncodingOptions
- src: https://github.com/petesramek/polyline-algorithm-csharp/blob/copilot/review-github-templates/src/PolylineAlgorithm/PolylineEncodingOptions.cs#L29
+ src: https://github.com/petesramek/polyline-algorithm-csharp/blob/copilot/assess-repository-state/src/PolylineAlgorithm/PolylineEncodingOptions.cs#L28
metadata:
uid: PolylineAlgorithm.PolylineEncodingOptions
commentId: T:PolylineAlgorithm.PolylineEncodingOptions
@@ -44,7 +44,7 @@ body:
- - The level for coordinate encoding
- The for memory allocation strategy
- The for diagnostic logging
+ - The level for coordinate encoding
- The for diagnostic logging
@@ -54,7 +54,7 @@ body:
- h2: Properties
- api3: LoggerFactory
id: PolylineAlgorithm_PolylineEncodingOptions_LoggerFactory
- src: https://github.com/petesramek/polyline-algorithm-csharp/blob/copilot/review-github-templates/src/PolylineAlgorithm/PolylineEncodingOptions.cs#L41
+ src: https://github.com/petesramek/polyline-algorithm-csharp/blob/copilot/assess-repository-state/src/PolylineAlgorithm/PolylineEncodingOptions.cs#L40
metadata:
uid: PolylineAlgorithm.PolylineEncodingOptions.LoggerFactory
commentId: P:PolylineAlgorithm.PolylineEncodingOptions.LoggerFactory
@@ -72,7 +72,7 @@ body:
To enable logging, provide a custom implementation.
- api3: Precision
id: PolylineAlgorithm_PolylineEncodingOptions_Precision
- src: https://github.com/petesramek/polyline-algorithm-csharp/blob/copilot/review-github-templates/src/PolylineAlgorithm/PolylineEncodingOptions.cs#L60
+ src: https://github.com/petesramek/polyline-algorithm-csharp/blob/copilot/assess-repository-state/src/PolylineAlgorithm/PolylineEncodingOptions.cs#L59
metadata:
uid: PolylineAlgorithm.PolylineEncodingOptions.Precision
commentId: P:PolylineAlgorithm.PolylineEncodingOptions.Precision
@@ -102,26 +102,6 @@ body:
the granularity of the encoded values.
-- api3: StackAllocLimit
- id: PolylineAlgorithm_PolylineEncodingOptions_StackAllocLimit
- src: https://github.com/petesramek/polyline-algorithm-csharp/blob/copilot/review-github-templates/src/PolylineAlgorithm/PolylineEncodingOptions.cs#L73
- metadata:
- uid: PolylineAlgorithm.PolylineEncodingOptions.StackAllocLimit
- commentId: P:PolylineAlgorithm.PolylineEncodingOptions.StackAllocLimit
-- markdown: Gets the maximum buffer size (in characters) that can be allocated on the stack for encoding operations.
-- code: public int StackAllocLimit { get; }
-- h4: Property Value
-- parameters:
- - type:
- - text: int
- url: https://learn.microsoft.com/dotnet/api/system.int32
-- h4: Remarks
-- markdown: >-
- When the required buffer size for encoding exceeds this limit, memory will be allocated on the heap instead of the stack.
-
- This setting specifically applies to stack allocation of character arrays (stackalloc char[]) used during polyline encoding,
-
- balancing performance and stack safety.
languageId: csharp
metadata:
description: Provides configuration options for polyline encoding operations.
diff --git a/api-reference/0.0/PolylineAlgorithm.PolylineEncodingOptionsBuilder.yml b/api-reference/0.0/PolylineAlgorithm.PolylineEncodingOptionsBuilder.yml
index 66ae63b8..c6c9ead4 100644
--- a/api-reference/0.0/PolylineAlgorithm.PolylineEncodingOptionsBuilder.yml
+++ b/api-reference/0.0/PolylineAlgorithm.PolylineEncodingOptionsBuilder.yml
@@ -3,7 +3,7 @@ title: Class PolylineEncodingOptionsBuilder
body:
- api1: Class PolylineEncodingOptionsBuilder
id: PolylineAlgorithm_PolylineEncodingOptionsBuilder
- src: https://github.com/petesramek/polyline-algorithm-csharp/blob/copilot/review-github-templates/src/PolylineAlgorithm/PolylineEncodingOptionsBuilder.cs#L15
+ src: https://github.com/petesramek/polyline-algorithm-csharp/blob/copilot/assess-repository-state/src/PolylineAlgorithm/PolylineEncodingOptionsBuilder.cs#L14
metadata:
uid: PolylineAlgorithm.PolylineEncodingOptionsBuilder
commentId: T:PolylineAlgorithm.PolylineEncodingOptionsBuilder
@@ -39,7 +39,7 @@ body:
- h2: Methods
- api3: Build()
id: PolylineAlgorithm_PolylineEncodingOptionsBuilder_Build
- src: https://github.com/petesramek/polyline-algorithm-csharp/blob/copilot/review-github-templates/src/PolylineAlgorithm/PolylineEncodingOptionsBuilder.cs#L38
+ src: https://github.com/petesramek/polyline-algorithm-csharp/blob/copilot/assess-repository-state/src/PolylineAlgorithm/PolylineEncodingOptionsBuilder.cs#L36
metadata:
uid: PolylineAlgorithm.PolylineEncodingOptionsBuilder.Build
commentId: M:PolylineAlgorithm.PolylineEncodingOptionsBuilder.Build
@@ -53,7 +53,7 @@ body:
description: A configured instance.
- api3: Create()
id: PolylineAlgorithm_PolylineEncodingOptionsBuilder_Create
- src: https://github.com/petesramek/polyline-algorithm-csharp/blob/copilot/review-github-templates/src/PolylineAlgorithm/PolylineEncodingOptionsBuilder.cs#L28
+ src: https://github.com/petesramek/polyline-algorithm-csharp/blob/copilot/assess-repository-state/src/PolylineAlgorithm/PolylineEncodingOptionsBuilder.cs#L26
metadata:
uid: PolylineAlgorithm.PolylineEncodingOptionsBuilder.Create
commentId: M:PolylineAlgorithm.PolylineEncodingOptionsBuilder.Create
@@ -67,7 +67,7 @@ body:
description: An instance for configuring polyline encoding options.
- api3: WithLoggerFactory(ILoggerFactory)
id: PolylineAlgorithm_PolylineEncodingOptionsBuilder_WithLoggerFactory_Microsoft_Extensions_Logging_ILoggerFactory_
- src: https://github.com/petesramek/polyline-algorithm-csharp/blob/copilot/review-github-templates/src/PolylineAlgorithm/PolylineEncodingOptionsBuilder.cs#L97
+ src: https://github.com/petesramek/polyline-algorithm-csharp/blob/copilot/assess-repository-state/src/PolylineAlgorithm/PolylineEncodingOptionsBuilder.cs#L67
metadata:
uid: PolylineAlgorithm.PolylineEncodingOptionsBuilder.WithLoggerFactory(Microsoft.Extensions.Logging.ILoggerFactory)
commentId: M:PolylineAlgorithm.PolylineEncodingOptionsBuilder.WithLoggerFactory(Microsoft.Extensions.Logging.ILoggerFactory)
@@ -88,7 +88,7 @@ body:
description: The current instance for method chaining.
- api3: WithPrecision(uint)
id: PolylineAlgorithm_PolylineEncodingOptionsBuilder_WithPrecision_System_UInt32_
- src: https://github.com/petesramek/polyline-algorithm-csharp/blob/copilot/review-github-templates/src/PolylineAlgorithm/PolylineEncodingOptionsBuilder.cs#L82
+ src: https://github.com/petesramek/polyline-algorithm-csharp/blob/copilot/assess-repository-state/src/PolylineAlgorithm/PolylineEncodingOptionsBuilder.cs#L52
metadata:
uid: PolylineAlgorithm.PolylineEncodingOptionsBuilder.WithPrecision(System.UInt32)
commentId: M:PolylineAlgorithm.PolylineEncodingOptionsBuilder.WithPrecision(System.UInt32)
@@ -107,35 +107,6 @@ body:
- text: PolylineEncodingOptionsBuilder
url: PolylineAlgorithm.PolylineEncodingOptionsBuilder.html
description: The current instance for method chaining.
-- api3: WithStackAllocLimit(int)
- id: PolylineAlgorithm_PolylineEncodingOptionsBuilder_WithStackAllocLimit_System_Int32_
- src: https://github.com/petesramek/polyline-algorithm-csharp/blob/copilot/review-github-templates/src/PolylineAlgorithm/PolylineEncodingOptionsBuilder.cs#L61
- metadata:
- uid: PolylineAlgorithm.PolylineEncodingOptionsBuilder.WithStackAllocLimit(System.Int32)
- commentId: M:PolylineAlgorithm.PolylineEncodingOptionsBuilder.WithStackAllocLimit(System.Int32)
-- markdown: Configures the buffer size used for stack allocation during polyline encoding operations.
-- code: public PolylineEncodingOptionsBuilder WithStackAllocLimit(int stackAllocLimit)
-- h4: Parameters
-- parameters:
- - name: stackAllocLimit
- type:
- - text: int
- url: https://learn.microsoft.com/dotnet/api/system.int32
- description: The maximum buffer size to use for stack allocation. Must be greater than or equal to 1.
-- h4: Returns
-- parameters:
- - type:
- - text: PolylineEncodingOptionsBuilder
- url: PolylineAlgorithm.PolylineEncodingOptionsBuilder.html
- description: The current instance for method chaining.
-- h4: Remarks
-- markdown: This method allows customization of the internal buffer size for encoding, which can impact performance and memory usage.
-- h4: Exceptions
-- parameters:
- - type:
- - text: ArgumentOutOfRangeException
- url: https://learn.microsoft.com/dotnet/api/system.argumentoutofrangeexception
- description: Thrown if stackAllocLimit is less than 1.
languageId: csharp
metadata:
description: Provides a builder for configuring options for polyline encoding operations.
diff --git a/api-reference/0.0/PolylineAlgorithm.yml b/api-reference/0.0/PolylineAlgorithm.yml
index b60dc3c0..d6c5bba7 100644
--- a/api-reference/0.0/PolylineAlgorithm.yml
+++ b/api-reference/0.0/PolylineAlgorithm.yml
@@ -14,6 +14,9 @@ body:
- type:
text: PolylineAlgorithm.Extensions
url: PolylineAlgorithm.Extensions.html
+ - type:
+ text: PolylineAlgorithm.Internal
+ url: PolylineAlgorithm.Internal.html
- h3: Classes
- parameters:
- type:
diff --git a/api-reference/0.0/toc.yml b/api-reference/0.0/toc.yml
index d1ffc58a..051163d6 100644
--- a/api-reference/0.0/toc.yml
+++ b/api-reference/0.0/toc.yml
@@ -32,3 +32,12 @@
href: PolylineAlgorithm.Extensions.PolylineDecoderExtensions.yml
- name: PolylineEncoderExtensions
href: PolylineAlgorithm.Extensions.PolylineEncoderExtensions.yml
+- name: PolylineAlgorithm.Internal
+ href: PolylineAlgorithm.Internal.yml
+ items:
+ - name: Classes
+ - name: PolylineReader
+ href: PolylineAlgorithm.Internal.PolylineReader.yml
+ - name: Structs
+ - name: PolylineWriter
+ href: PolylineAlgorithm.Internal.PolylineWriter.yml
diff --git a/api-reference/1.0/PolylineAlgorithm.Abstraction.AbstractPolylineDecoder-2.yml b/api-reference/1.0/PolylineAlgorithm.Abstraction.AbstractPolylineDecoder-2.yml
deleted file mode 100644
index 6349f59c..00000000
--- a/api-reference/1.0/PolylineAlgorithm.Abstraction.AbstractPolylineDecoder-2.yml
+++ /dev/null
@@ -1,233 +0,0 @@
-### YamlMime:ApiPage
-title: Class AbstractPolylineDecoder
-body:
-- api1: Class AbstractPolylineDecoder
- id: PolylineAlgorithm_Abstraction_AbstractPolylineDecoder_2
- src: https://github.com/petesramek/polyline-algorithm-csharp/blob/develop/1.0/src/PolylineAlgorithm/Abstraction/AbstractPolylineDecoder.cs#L22
- metadata:
- uid: PolylineAlgorithm.Abstraction.AbstractPolylineDecoder`2
- commentId: T:PolylineAlgorithm.Abstraction.AbstractPolylineDecoder`2
-- facts:
- - name: Namespace
- value:
- text: PolylineAlgorithm.Abstraction
- url: PolylineAlgorithm.Abstraction.html
- - name: Assembly
- value: PolylineAlgorithm.dll
-- markdown: Provides a base implementation for decoding encoded polyline strings into sequences of geographic coordinates.
-- code: 'public abstract class AbstractPolylineDecoder : IPolylineDecoder'
-- h4: Type Parameters
-- parameters:
- - name: TPolyline
- description: The type that represents the encoded polyline input.
- - name: TCoordinate
- description: The type that represents a decoded geographic coordinate.
-- h4: Inheritance
-- inheritance:
- - text: object
- url: https://learn.microsoft.com/dotnet/api/system.object
- - text: AbstractPolylineDecoder
- url: PolylineAlgorithm.Abstraction.AbstractPolylineDecoder-2.html
-- h4: Implements
-- list:
- - text: IPolylineDecoder
- url: PolylineAlgorithm.Abstraction.IPolylineDecoder-2.html
-- h4: Inherited Members
-- list:
- - text: object.Equals(object)
- url: https://learn.microsoft.com/dotnet/api/system.object.equals#system-object-equals(system-object)
- - text: object.Equals(object, object)
- url: https://learn.microsoft.com/dotnet/api/system.object.equals#system-object-equals(system-object-system-object)
- - text: object.GetHashCode()
- url: https://learn.microsoft.com/dotnet/api/system.object.gethashcode
- - text: object.GetType()
- url: https://learn.microsoft.com/dotnet/api/system.object.gettype
- - text: object.MemberwiseClone()
- url: https://learn.microsoft.com/dotnet/api/system.object.memberwiseclone
- - text: object.ReferenceEquals(object, object)
- url: https://learn.microsoft.com/dotnet/api/system.object.referenceequals
- - text: object.ToString()
- url: https://learn.microsoft.com/dotnet/api/system.object.tostring
-- h2: Remarks
-- markdown: >-
- Derive from this class to implement a decoder for a specific polyline type. Override
-
- and to provide type-specific behavior.
-- h2: Constructors
-- api3: AbstractPolylineDecoder()
- id: PolylineAlgorithm_Abstraction_AbstractPolylineDecoder_2__ctor
- src: https://github.com/petesramek/polyline-algorithm-csharp/blob/develop/1.0/src/PolylineAlgorithm/Abstraction/AbstractPolylineDecoder.cs#L28
- metadata:
- uid: PolylineAlgorithm.Abstraction.AbstractPolylineDecoder`2.#ctor
- commentId: M:PolylineAlgorithm.Abstraction.AbstractPolylineDecoder`2.#ctor
-- markdown: Initializes a new instance of the class with default encoding options.
-- code: protected AbstractPolylineDecoder()
-- api3: AbstractPolylineDecoder(PolylineEncodingOptions)
- id: PolylineAlgorithm_Abstraction_AbstractPolylineDecoder_2__ctor_PolylineAlgorithm_PolylineEncodingOptions_
- src: https://github.com/petesramek/polyline-algorithm-csharp/blob/develop/1.0/src/PolylineAlgorithm/Abstraction/AbstractPolylineDecoder.cs#L40
- metadata:
- uid: PolylineAlgorithm.Abstraction.AbstractPolylineDecoder`2.#ctor(PolylineAlgorithm.PolylineEncodingOptions)
- commentId: M:PolylineAlgorithm.Abstraction.AbstractPolylineDecoder`2.#ctor(PolylineAlgorithm.PolylineEncodingOptions)
-- markdown: Initializes a new instance of the class with the specified encoding options.
-- code: protected AbstractPolylineDecoder(PolylineEncodingOptions options)
-- h4: Parameters
-- parameters:
- - name: options
- type:
- - text: PolylineEncodingOptions
- url: PolylineAlgorithm.PolylineEncodingOptions.html
- description: The to use for encoding operations.
-- h4: Exceptions
-- parameters:
- - type:
- - text: ArgumentNullException
- url: https://learn.microsoft.com/dotnet/api/system.argumentnullexception
- description: Thrown when options is null.
-- h2: Properties
-- api3: Options
- id: PolylineAlgorithm_Abstraction_AbstractPolylineDecoder_2_Options
- src: https://github.com/petesramek/polyline-algorithm-csharp/blob/develop/1.0/src/PolylineAlgorithm/Abstraction/AbstractPolylineDecoder.cs#L54
- metadata:
- uid: PolylineAlgorithm.Abstraction.AbstractPolylineDecoder`2.Options
- commentId: P:PolylineAlgorithm.Abstraction.AbstractPolylineDecoder`2.Options
-- markdown: Gets the encoding options used by this polyline decoder.
-- code: public PolylineEncodingOptions Options { get; }
-- h4: Property Value
-- parameters:
- - type:
- - text: PolylineEncodingOptions
- url: PolylineAlgorithm.PolylineEncodingOptions.html
-- h2: Methods
-- api3: CreateCoordinate(double, double)
- id: PolylineAlgorithm_Abstraction_AbstractPolylineDecoder_2_CreateCoordinate_System_Double_System_Double_
- src: https://github.com/petesramek/polyline-algorithm-csharp/blob/develop/1.0/src/PolylineAlgorithm/Abstraction/AbstractPolylineDecoder.cs#L202
- metadata:
- uid: PolylineAlgorithm.Abstraction.AbstractPolylineDecoder`2.CreateCoordinate(System.Double,System.Double)
- commentId: M:PolylineAlgorithm.Abstraction.AbstractPolylineDecoder`2.CreateCoordinate(System.Double,System.Double)
-- markdown: Creates a TCoordinate instance from the specified latitude and longitude values.
-- code: protected abstract TCoordinate CreateCoordinate(double latitude, double longitude)
-- h4: Parameters
-- parameters:
- - name: latitude
- type:
- - text: double
- url: https://learn.microsoft.com/dotnet/api/system.double
- description: The latitude component of the coordinate, in degrees.
- - name: longitude
- type:
- - text: double
- url: https://learn.microsoft.com/dotnet/api/system.double
- description: The longitude component of the coordinate, in degrees.
-- h4: Returns
-- parameters:
- - type:
- - TCoordinate
- description: A TCoordinate instance representing the specified geographic coordinate.
-- api3: Decode(TPolyline, CancellationToken)
- id: PolylineAlgorithm_Abstraction_AbstractPolylineDecoder_2_Decode__0_System_Threading_CancellationToken_
- src: https://github.com/petesramek/polyline-algorithm-csharp/blob/develop/1.0/src/PolylineAlgorithm/Abstraction/AbstractPolylineDecoder.cs#L81
- metadata:
- uid: PolylineAlgorithm.Abstraction.AbstractPolylineDecoder`2.Decode(`0,System.Threading.CancellationToken)
- commentId: M:PolylineAlgorithm.Abstraction.AbstractPolylineDecoder`2.Decode(`0,System.Threading.CancellationToken)
-- markdown: >-
- Decodes an encoded TPolyline into a sequence of TCoordinate instances,
-
- with support for cancellation.
-- code: public IEnumerable Decode(TPolyline polyline, CancellationToken cancellationToken = default)
-- h4: Parameters
-- parameters:
- - name: polyline
- type:
- - TPolyline
- description: The TPolyline instance containing the encoded polyline string to decode.
- - name: cancellationToken
- type:
- - text: CancellationToken
- url: https://learn.microsoft.com/dotnet/api/system.threading.cancellationtoken
- description: A that can be used to cancel the decoding operation.
- optional: true
-- h4: Returns
-- parameters:
- - type:
- - text: IEnumerable
- url: https://learn.microsoft.com/dotnet/api/system.collections.generic.ienumerable-1
- - <
- - TCoordinate
- - '>'
- description: An of TCoordinate representing the decoded latitude and longitude pairs.
-- h4: Exceptions
-- parameters:
- - type:
- - text: ArgumentNullException
- url: https://learn.microsoft.com/dotnet/api/system.argumentnullexception
- description: Thrown when polyline is null.
- - type:
- - text: ArgumentException
- url: https://learn.microsoft.com/dotnet/api/system.argumentexception
- description: Thrown when polyline is empty.
- - type:
- - text: InvalidPolylineException
- url: PolylineAlgorithm.InvalidPolylineException.html
- description: Thrown when the polyline format is invalid or malformed at a specific position.
- - type:
- - text: OperationCanceledException
- url: https://learn.microsoft.com/dotnet/api/system.operationcanceledexception
- description: Thrown when cancellationToken is canceled during decoding.
-- api3: GetReadOnlyMemory(in TPolyline)
- id: PolylineAlgorithm_Abstraction_AbstractPolylineDecoder_2_GetReadOnlyMemory__0__
- src: https://github.com/petesramek/polyline-algorithm-csharp/blob/develop/1.0/src/PolylineAlgorithm/Abstraction/AbstractPolylineDecoder.cs#L187
- metadata:
- uid: PolylineAlgorithm.Abstraction.AbstractPolylineDecoder`2.GetReadOnlyMemory(`0@)
- commentId: M:PolylineAlgorithm.Abstraction.AbstractPolylineDecoder`2.GetReadOnlyMemory(`0@)
-- markdown: Extracts the underlying read-only memory region of characters from the specified polyline instance.
-- code: protected abstract ReadOnlyMemory GetReadOnlyMemory(in TPolyline polyline)
-- h4: Parameters
-- parameters:
- - name: polyline
- type:
- - TPolyline
- description: The TPolyline instance from which to extract the character sequence.
-- h4: Returns
-- parameters:
- - type:
- - text: ReadOnlyMemory
- url: https://learn.microsoft.com/dotnet/api/system.readonlymemory-1
- - <
- - text: char
- url: https://learn.microsoft.com/dotnet/api/system.char
- - '>'
- description: A of representing the encoded polyline characters.
-- api3: ValidateFormat(ReadOnlyMemory, ILogger?)
- id: PolylineAlgorithm_Abstraction_AbstractPolylineDecoder_2_ValidateFormat_System_ReadOnlyMemory_System_Char__Microsoft_Extensions_Logging_ILogger_
- src: https://github.com/petesramek/polyline-algorithm-csharp/blob/develop/1.0/src/PolylineAlgorithm/Abstraction/AbstractPolylineDecoder.cs#L167
- metadata:
- uid: PolylineAlgorithm.Abstraction.AbstractPolylineDecoder`2.ValidateFormat(System.ReadOnlyMemory{System.Char},Microsoft.Extensions.Logging.ILogger)
- commentId: M:PolylineAlgorithm.Abstraction.AbstractPolylineDecoder`2.ValidateFormat(System.ReadOnlyMemory{System.Char},Microsoft.Extensions.Logging.ILogger)
-- markdown: Validates the format of the polyline character sequence, ensuring all characters are within the allowed range.
-- code: protected virtual void ValidateFormat(ReadOnlyMemory sequence, ILogger? logger)
-- h4: Parameters
-- parameters:
- - name: sequence
- type:
- - text: ReadOnlyMemory
- url: https://learn.microsoft.com/dotnet/api/system.readonlymemory-1
- - <
- - text: char
- url: https://learn.microsoft.com/dotnet/api/system.char
- - '>'
- description: The read-only memory region of characters representing the polyline to validate.
- - name: logger
- type:
- - text: ILogger
- url: https://learn.microsoft.com/dotnet/api/microsoft.extensions.logging.ilogger
- - '?'
- description: An optional used to log a warning when format validation fails.
-- h4: Exceptions
-- parameters:
- - type:
- - text: ArgumentException
- url: https://learn.microsoft.com/dotnet/api/system.argumentexception
- description: Thrown when the polyline contains characters outside the valid encoding range or has an invalid block structure.
-languageId: csharp
-metadata:
- description: Provides a base implementation for decoding encoded polyline strings into sequences of geographic coordinates.
diff --git a/api-reference/1.0/PolylineAlgorithm.Abstraction.AbstractPolylineEncoder-2.yml b/api-reference/1.0/PolylineAlgorithm.Abstraction.AbstractPolylineEncoder-2.yml
deleted file mode 100644
index ec0a65e9..00000000
--- a/api-reference/1.0/PolylineAlgorithm.Abstraction.AbstractPolylineEncoder-2.yml
+++ /dev/null
@@ -1,219 +0,0 @@
-### YamlMime:ApiPage
-title: Class AbstractPolylineEncoder
-body:
-- api1: Class AbstractPolylineEncoder
- id: PolylineAlgorithm_Abstraction_AbstractPolylineEncoder_2
- src: https://github.com/petesramek/polyline-algorithm-csharp/blob/develop/1.0/src/PolylineAlgorithm/Abstraction/AbstractPolylineEncoder.cs#L27
- metadata:
- uid: PolylineAlgorithm.Abstraction.AbstractPolylineEncoder`2
- commentId: T:PolylineAlgorithm.Abstraction.AbstractPolylineEncoder`2
-- facts:
- - name: Namespace
- value:
- text: PolylineAlgorithm.Abstraction
- url: PolylineAlgorithm.Abstraction.html
- - name: Assembly
- value: PolylineAlgorithm.dll
-- markdown: Provides a base implementation for encoding sequences of geographic coordinates into encoded polyline strings.
-- code: 'public abstract class AbstractPolylineEncoder : IPolylineEncoder'
-- h4: Type Parameters
-- parameters:
- - name: TCoordinate
- description: The type that represents a geographic coordinate to encode.
- - name: TPolyline
- description: The type that represents the encoded polyline output.
-- h4: Inheritance
-- inheritance:
- - text: object
- url: https://learn.microsoft.com/dotnet/api/system.object
- - text: AbstractPolylineEncoder
- url: PolylineAlgorithm.Abstraction.AbstractPolylineEncoder-2.html
-- h4: Implements
-- list:
- - text: IPolylineEncoder
- url: PolylineAlgorithm.Abstraction.IPolylineEncoder-2.html
-- h4: Inherited Members
-- list:
- - text: object.Equals(object)
- url: https://learn.microsoft.com/dotnet/api/system.object.equals#system-object-equals(system-object)
- - text: object.Equals(object, object)
- url: https://learn.microsoft.com/dotnet/api/system.object.equals#system-object-equals(system-object-system-object)
- - text: object.GetHashCode()
- url: https://learn.microsoft.com/dotnet/api/system.object.gethashcode
- - text: object.GetType()
- url: https://learn.microsoft.com/dotnet/api/system.object.gettype
- - text: object.MemberwiseClone()
- url: https://learn.microsoft.com/dotnet/api/system.object.memberwiseclone
- - text: object.ReferenceEquals(object, object)
- url: https://learn.microsoft.com/dotnet/api/system.object.referenceequals
- - text: object.ToString()
- url: https://learn.microsoft.com/dotnet/api/system.object.tostring
-- h4: Extension Methods
-- list:
- - text: PolylineEncoderExtensions.Encode(IPolylineEncoder, List)
- url: PolylineAlgorithm.Extensions.PolylineEncoderExtensions.html#PolylineAlgorithm_Extensions_PolylineEncoderExtensions_Encode__2_PolylineAlgorithm_Abstraction_IPolylineEncoder___0___1__System_Collections_Generic_List___0__
- - text: PolylineEncoderExtensions.Encode(IPolylineEncoder, TCoordinate[])
- url: PolylineAlgorithm.Extensions.PolylineEncoderExtensions.html#PolylineAlgorithm_Extensions_PolylineEncoderExtensions_Encode__2_PolylineAlgorithm_Abstraction_IPolylineEncoder___0___1____0___
-- h2: Remarks
-- markdown: >-
- Derive from this class to implement an encoder for a specific coordinate and polyline type. Override
-
- , , and to provide type-specific behavior.
-- h2: Constructors
-- api3: AbstractPolylineEncoder()
- id: PolylineAlgorithm_Abstraction_AbstractPolylineEncoder_2__ctor
- src: https://github.com/petesramek/polyline-algorithm-csharp/blob/develop/1.0/src/PolylineAlgorithm/Abstraction/AbstractPolylineEncoder.cs#L33
- metadata:
- uid: PolylineAlgorithm.Abstraction.AbstractPolylineEncoder`2.#ctor
- commentId: M:PolylineAlgorithm.Abstraction.AbstractPolylineEncoder`2.#ctor
-- markdown: Initializes a new instance of the class with default encoding options.
-- code: protected AbstractPolylineEncoder()
-- api3: AbstractPolylineEncoder(PolylineEncodingOptions)
- id: PolylineAlgorithm_Abstraction_AbstractPolylineEncoder_2__ctor_PolylineAlgorithm_PolylineEncodingOptions_
- src: https://github.com/petesramek/polyline-algorithm-csharp/blob/develop/1.0/src/PolylineAlgorithm/Abstraction/AbstractPolylineEncoder.cs#L43
- metadata:
- uid: PolylineAlgorithm.Abstraction.AbstractPolylineEncoder`2.#ctor(PolylineAlgorithm.PolylineEncodingOptions)
- commentId: M:PolylineAlgorithm.Abstraction.AbstractPolylineEncoder`2.#ctor(PolylineAlgorithm.PolylineEncodingOptions)
-- markdown: Initializes a new instance of the class with the specified encoding options.
-- code: protected AbstractPolylineEncoder(PolylineEncodingOptions options)
-- h4: Parameters
-- parameters:
- - name: options
- type:
- - text: PolylineEncodingOptions
- url: PolylineAlgorithm.PolylineEncodingOptions.html
- description: The to use for encoding operations.
-- h4: Exceptions
-- parameters:
- - type:
- - text: ArgumentNullException
- url: https://learn.microsoft.com/dotnet/api/system.argumentnullexception
- description: Thrown when options is null
-- h2: Properties
-- api3: Options
- id: PolylineAlgorithm_Abstraction_AbstractPolylineEncoder_2_Options
- src: https://github.com/petesramek/polyline-algorithm-csharp/blob/develop/1.0/src/PolylineAlgorithm/Abstraction/AbstractPolylineEncoder.cs#L57
- metadata:
- uid: PolylineAlgorithm.Abstraction.AbstractPolylineEncoder`2.Options
- commentId: P:PolylineAlgorithm.Abstraction.AbstractPolylineEncoder`2.Options
-- markdown: Gets the encoding options used by this polyline encoder.
-- code: public PolylineEncodingOptions Options { get; }
-- h4: Property Value
-- parameters:
- - type:
- - text: PolylineEncodingOptions
- url: PolylineAlgorithm.PolylineEncodingOptions.html
-- h2: Methods
-- api3: CreatePolyline(ReadOnlyMemory)
- id: PolylineAlgorithm_Abstraction_AbstractPolylineEncoder_2_CreatePolyline_System_ReadOnlyMemory_System_Char__
- src: https://github.com/petesramek/polyline-algorithm-csharp/blob/develop/1.0/src/PolylineAlgorithm/Abstraction/AbstractPolylineEncoder.cs#L174
- metadata:
- uid: PolylineAlgorithm.Abstraction.AbstractPolylineEncoder`2.CreatePolyline(System.ReadOnlyMemory{System.Char})
- commentId: M:PolylineAlgorithm.Abstraction.AbstractPolylineEncoder`2.CreatePolyline(System.ReadOnlyMemory{System.Char})
-- markdown: Creates a polyline instance from the provided read-only sequence of characters.
-- code: protected abstract TPolyline CreatePolyline(ReadOnlyMemory polyline)
-- h4: Parameters
-- parameters:
- - name: polyline
- type:
- - text: ReadOnlyMemory
- url: https://learn.microsoft.com/dotnet/api/system.readonlymemory-1
- - <
- - text: char
- url: https://learn.microsoft.com/dotnet/api/system.char
- - '>'
- description: A containing the encoded polyline characters.
-- h4: Returns
-- parameters:
- - type:
- - TPolyline
- description: An instance of TPolyline representing the encoded polyline.
-- api3: Encode(ReadOnlySpan, CancellationToken)
- id: PolylineAlgorithm_Abstraction_AbstractPolylineEncoder_2_Encode_System_ReadOnlySpan__0__System_Threading_CancellationToken_
- src: https://github.com/petesramek/polyline-algorithm-csharp/blob/develop/1.0/src/PolylineAlgorithm/Abstraction/AbstractPolylineEncoder.cs#L80
- metadata:
- uid: PolylineAlgorithm.Abstraction.AbstractPolylineEncoder`2.Encode(System.ReadOnlySpan{`0},System.Threading.CancellationToken)
- commentId: M:PolylineAlgorithm.Abstraction.AbstractPolylineEncoder`2.Encode(System.ReadOnlySpan{`0},System.Threading.CancellationToken)
-- markdown: Encodes a collection of TCoordinate instances into an encoded TPolyline string.
-- code: >-
- [SuppressMessage("Design", "MA0051:Method is too long", Justification = "Method contains local methods. Actual method only 55 lines.")]
-
- public TPolyline Encode(ReadOnlySpan coordinates, CancellationToken cancellationToken = default)
-- h4: Parameters
-- parameters:
- - name: coordinates
- type:
- - text: ReadOnlySpan
- url: https://learn.microsoft.com/dotnet/api/system.readonlyspan-1
- - <
- - TCoordinate
- - '>'
- description: The collection of TCoordinate objects to encode.
- - name: cancellationToken
- type:
- - text: CancellationToken
- url: https://learn.microsoft.com/dotnet/api/system.threading.cancellationtoken
- description: A that can be used to cancel the encoding operation.
- optional: true
-- h4: Returns
-- parameters:
- - type:
- - TPolyline
- description: An instance of TPolyline representing the encoded coordinates.
-- h4: Exceptions
-- parameters:
- - type:
- - text: ArgumentNullException
- url: https://learn.microsoft.com/dotnet/api/system.argumentnullexception
- description: Thrown when coordinates is null.
- - type:
- - text: ArgumentException
- url: https://learn.microsoft.com/dotnet/api/system.argumentexception
- description: Thrown when coordinates is an empty enumeration.
- - type:
- - text: InvalidOperationException
- url: https://learn.microsoft.com/dotnet/api/system.invalidoperationexception
- description: Thrown when the internal encoding buffer cannot accommodate the encoded value.
-- api3: GetLatitude(TCoordinate)
- id: PolylineAlgorithm_Abstraction_AbstractPolylineEncoder_2_GetLatitude__0_
- src: https://github.com/petesramek/polyline-algorithm-csharp/blob/develop/1.0/src/PolylineAlgorithm/Abstraction/AbstractPolylineEncoder.cs#L194
- metadata:
- uid: PolylineAlgorithm.Abstraction.AbstractPolylineEncoder`2.GetLatitude(`0)
- commentId: M:PolylineAlgorithm.Abstraction.AbstractPolylineEncoder`2.GetLatitude(`0)
-- markdown: Extracts the latitude value from the specified coordinate.
-- code: protected abstract double GetLatitude(TCoordinate current)
-- h4: Parameters
-- parameters:
- - name: current
- type:
- - TCoordinate
- description: The coordinate from which to extract the latitude.
-- h4: Returns
-- parameters:
- - type:
- - text: double
- url: https://learn.microsoft.com/dotnet/api/system.double
- description: The latitude value as a .
-- api3: GetLongitude(TCoordinate)
- id: PolylineAlgorithm_Abstraction_AbstractPolylineEncoder_2_GetLongitude__0_
- src: https://github.com/petesramek/polyline-algorithm-csharp/blob/develop/1.0/src/PolylineAlgorithm/Abstraction/AbstractPolylineEncoder.cs#L184
- metadata:
- uid: PolylineAlgorithm.Abstraction.AbstractPolylineEncoder`2.GetLongitude(`0)
- commentId: M:PolylineAlgorithm.Abstraction.AbstractPolylineEncoder`2.GetLongitude(`0)
-- markdown: Extracts the longitude value from the specified coordinate.
-- code: protected abstract double GetLongitude(TCoordinate current)
-- h4: Parameters
-- parameters:
- - name: current
- type:
- - TCoordinate
- description: The coordinate from which to extract the longitude.
-- h4: Returns
-- parameters:
- - type:
- - text: double
- url: https://learn.microsoft.com/dotnet/api/system.double
- description: The longitude value as a .
-languageId: csharp
-metadata:
- description: Provides a base implementation for encoding sequences of geographic coordinates into encoded polyline strings.
diff --git a/api-reference/1.0/PolylineAlgorithm.Abstraction.IPolylineDecoder-2.yml b/api-reference/1.0/PolylineAlgorithm.Abstraction.IPolylineDecoder-2.yml
deleted file mode 100644
index 704f92b2..00000000
--- a/api-reference/1.0/PolylineAlgorithm.Abstraction.IPolylineDecoder-2.yml
+++ /dev/null
@@ -1,90 +0,0 @@
-### YamlMime:ApiPage
-title: Interface IPolylineDecoder
-body:
-- api1: Interface IPolylineDecoder
- id: PolylineAlgorithm_Abstraction_IPolylineDecoder_2
- src: https://github.com/petesramek/polyline-algorithm-csharp/blob/develop/1.0/src/PolylineAlgorithm/Abstraction/IPolylineDecoder.cs#L22
- metadata:
- uid: PolylineAlgorithm.Abstraction.IPolylineDecoder`2
- commentId: T:PolylineAlgorithm.Abstraction.IPolylineDecoder`2
-- facts:
- - name: Namespace
- value:
- text: PolylineAlgorithm.Abstraction
- url: PolylineAlgorithm.Abstraction.html
- - name: Assembly
- value: PolylineAlgorithm.dll
-- markdown: Defines a contract for decoding an encoded polyline into a sequence of geographic coordinates.
-- code: public interface IPolylineDecoder
-- h4: Type Parameters
-- parameters:
- - name: TPolyline
- description: >-
- The type that represents the encoded polyline input. Common implementations use ,
-
- but custom wrapper types are allowed to carry additional metadata.
- - name: TValue
- description: >-
- The coordinate type returned by the decoder. Typical implementations return a struct or class that
-
- contains latitude and longitude (for example a LatLng type or a ValueTuple<double,double>).
-- h2: Methods
-- api3: Decode(TPolyline, CancellationToken)
- id: PolylineAlgorithm_Abstraction_IPolylineDecoder_2_Decode__0_System_Threading_CancellationToken_
- src: https://github.com/petesramek/polyline-algorithm-csharp/blob/develop/1.0/src/PolylineAlgorithm/Abstraction/IPolylineDecoder.cs#L48
- metadata:
- uid: PolylineAlgorithm.Abstraction.IPolylineDecoder`2.Decode(`0,System.Threading.CancellationToken)
- commentId: M:PolylineAlgorithm.Abstraction.IPolylineDecoder`2.Decode(`0,System.Threading.CancellationToken)
-- markdown: >-
- Decodes the specified encoded polyline into an ordered sequence of geographic coordinates.
-
- The sequence preserves the original vertex order encoded by the polyline.
-- code: IEnumerable Decode(TPolyline polyline, CancellationToken cancellationToken = default)
-- h4: Parameters
-- parameters:
- - name: polyline
- type:
- - TPolyline
- description: >-
- The TPolyline instance containing the encoded polyline to decode.
-
- Implementations SHOULD validate the input and may throw
-
- or for invalid formats.
- - name: cancellationToken
- type:
- - text: CancellationToken
- url: https://learn.microsoft.com/dotnet/api/system.threading.cancellationtoken
- description: >-
- A to observe while decoding. If cancellation is requested,
-
- implementations SHOULD stop work and throw an .
- optional: true
-- h4: Returns
-- parameters:
- - type:
- - text: IEnumerable
- url: https://learn.microsoft.com/dotnet/api/system.collections.generic.ienumerable-1
- - <
- - TValue
- - '>'
- description: >-
- An of TValue representing the decoded
-
- latitude/longitude pairs (or equivalent coordinates) in the same order they were encoded.
-- h4: Remarks
-- markdown: >-
- Implementations commonly follow the Google Encoded Polyline Algorithm Format, but this interface
-
- does not mandate a specific encoding. Consumers should rely on a concrete decoder's documentation
-
- to understand the exact encoding supported.
-- h4: Exceptions
-- parameters:
- - type:
- - text: OperationCanceledException
- url: https://learn.microsoft.com/dotnet/api/system.operationcanceledexception
- description: Thrown when the provided cancellationToken requests cancellation.
-languageId: csharp
-metadata:
- description: Defines a contract for decoding an encoded polyline into a sequence of geographic coordinates.
diff --git a/api-reference/1.0/PolylineAlgorithm.Abstraction.IPolylineEncoder-2.yml b/api-reference/1.0/PolylineAlgorithm.Abstraction.IPolylineEncoder-2.yml
deleted file mode 100644
index 979fe774..00000000
--- a/api-reference/1.0/PolylineAlgorithm.Abstraction.IPolylineEncoder-2.yml
+++ /dev/null
@@ -1,142 +0,0 @@
-### YamlMime:ApiPage
-title: Interface IPolylineEncoder
-body:
-- api1: Interface IPolylineEncoder
- id: PolylineAlgorithm_Abstraction_IPolylineEncoder_2
- src: https://github.com/petesramek/polyline-algorithm-csharp/blob/develop/1.0/src/PolylineAlgorithm/Abstraction/IPolylineEncoder.cs#L36
- metadata:
- uid: PolylineAlgorithm.Abstraction.IPolylineEncoder`2
- commentId: T:PolylineAlgorithm.Abstraction.IPolylineEncoder`2
-- facts:
- - name: Namespace
- value:
- text: PolylineAlgorithm.Abstraction
- url: PolylineAlgorithm.Abstraction.html
- - name: Assembly
- value: PolylineAlgorithm.dll
-- markdown: >-
- Contract for encoding a sequence of geographic coordinates into an encoded polyline representation.
-
- Implementations interpret the generic TValue type and produce an encoded
-
- representation of those coordinates as TPolyline.
-- code: public interface IPolylineEncoder
-- h4: Type Parameters
-- parameters:
- - name: TValue
- description: >-
- The concrete coordinate representation used by the encoder (for example a struct or class containing
-
- Latitude and Longitude values). Implementations must document the expected shape,
-
- units (typically decimal degrees), and any required fields for TValue.
-
- Common shapes:
-
- - A struct or class with two double properties named Latitude and Longitude.
-
- - A tuple-like type (for example ValueTuple<double,double>) where the encoder documents
- which element represents latitude and longitude.
- - name: TPolyline
- description: >-
- The encoded polyline representation returned by the encoder (for example string,
-
- ReadOnlyMemory<char>, or a custom wrapper type). Concrete implementations should document
-
- the chosen representation and any memory / ownership expectations.
-- h4: Extension Methods
-- list:
- - text: PolylineEncoderExtensions.Encode(IPolylineEncoder, List)
- url: PolylineAlgorithm.Extensions.PolylineEncoderExtensions.html#PolylineAlgorithm_Extensions_PolylineEncoderExtensions_Encode__2_PolylineAlgorithm_Abstraction_IPolylineEncoder___0___1__System_Collections_Generic_List___0__
- - text: PolylineEncoderExtensions.Encode(IPolylineEncoder, TValue[])
- url: PolylineAlgorithm.Extensions.PolylineEncoderExtensions.html#PolylineAlgorithm_Extensions_PolylineEncoderExtensions_Encode__2_PolylineAlgorithm_Abstraction_IPolylineEncoder___0___1____0___
-- h2: Remarks
-- markdown: >-
- - This interface is intentionally minimal to allow different encoding strategies (Google encoded polyline,
- precision/scale variants, or custom compressed formats) to be expressed behind a common contract.
- - Implementations should document:
- - Coordinate precision and rounding rules (for example 1e-5 for 5-decimal precision).
- - Coordinate ordering and whether altitude or additional dimensions are supported.
- - Thread-safety guarantees: whether instances are safe to reuse concurrently or must be instantiated per-call.
- - Implementations are encouraged to be memory-efficient; the API accepts a
- to avoid forced allocations when callers already have contiguous memory.
-- h2: Methods
-- api3: Encode(ReadOnlySpan, CancellationToken)
- id: PolylineAlgorithm_Abstraction_IPolylineEncoder_2_Encode_System_ReadOnlySpan__0__System_Threading_CancellationToken_
- src: https://github.com/petesramek/polyline-algorithm-csharp/blob/develop/1.0/src/PolylineAlgorithm/Abstraction/IPolylineEncoder.cs#L76
- metadata:
- uid: PolylineAlgorithm.Abstraction.IPolylineEncoder`2.Encode(System.ReadOnlySpan{`0},System.Threading.CancellationToken)
- commentId: M:PolylineAlgorithm.Abstraction.IPolylineEncoder`2.Encode(System.ReadOnlySpan{`0},System.Threading.CancellationToken)
-- markdown: >-
- Encodes a sequence of geographic coordinates into an encoded polyline representation.
-
- The order of coordinates in coordinates is preserved in the encoded result.
-- code: TPolyline Encode(ReadOnlySpan coordinates, CancellationToken cancellationToken = default)
-- h4: Parameters
-- parameters:
- - name: coordinates
- type:
- - text: ReadOnlySpan
- url: https://learn.microsoft.com/dotnet/api/system.readonlyspan-1
- - <
- - TValue
- - '>'
- description: >-
- The collection of TValue instances to encode into a polyline.
-
- The span may be empty; implementations should return an appropriate empty encoded representation
-
- (for example an empty string or an empty memory slice) rather than null.
- - name: cancellationToken
- type:
- - text: CancellationToken
- url: https://learn.microsoft.com/dotnet/api/system.threading.cancellationtoken
- description: >-
- A that can be used to cancel the encoding operation.
-
- Implementations should observe this token and throw
-
- when cancellation is requested. For fast, in-memory encoders cancellation may be best-effort.
- optional: true
-- h4: Returns
-- parameters:
- - type:
- - TPolyline
- description: >-
- A TPolyline containing the encoded polyline that represents the input coordinates.
-
- The exact format and any delimiting/terminating characters are implementation-specific and must be
-
- documented by concrete encoder types.
-- h4: Examples
-- markdown: >-
- // Example pseudocode for typical usage with a string-based encoder:
-
- var coords = new[] {
- new Coordinate { Latitude = 47.6219, Longitude = -122.3503 },
- new Coordinate { Latitude = 47.6220, Longitude = -122.3504 }
- };
-
- IPolylineEncoder<Coordinate,string> encoder = new GoogleEncodedPolylineEncoder();
-
- string encoded = encoder.Encode(coords, CancellationToken.None);
-- h4: Remarks
-- markdown: >-
- - Implementations should validate input as appropriate and document any preconditions (for example
- if coordinates must be within [-90,90] latitude and [-180,180] longitude).
- - For large input sequences, implementations may provide streaming or incremental encoders; those
- variants can still implement this interface by materializing the final encoded result.
-- h4: Exceptions
-- parameters:
- - type:
- - text: OperationCanceledException
- url: https://learn.microsoft.com/dotnet/api/system.operationcanceledexception
- description: Thrown if the operation is canceled via cancellationToken.
-languageId: csharp
-metadata:
- description: >-
- Contract for encoding a sequence of geographic coordinates into an encoded polyline representation.
-
- Implementations interpret the generic TValue type and produce an encoded
-
- representation of those coordinates as TPolyline.
diff --git a/api-reference/1.0/PolylineAlgorithm.Abstraction.yml b/api-reference/1.0/PolylineAlgorithm.Abstraction.yml
deleted file mode 100644
index e9de48f7..00000000
--- a/api-reference/1.0/PolylineAlgorithm.Abstraction.yml
+++ /dev/null
@@ -1,34 +0,0 @@
-### YamlMime:ApiPage
-title: Namespace PolylineAlgorithm.Abstraction
-body:
-- api1: Namespace PolylineAlgorithm.Abstraction
- id: PolylineAlgorithm_Abstraction
- metadata:
- uid: PolylineAlgorithm.Abstraction
- commentId: N:PolylineAlgorithm.Abstraction
-- h3: Classes
-- parameters:
- - type:
- text: AbstractPolylineDecoder
- url: PolylineAlgorithm.Abstraction.AbstractPolylineDecoder-2.html
- description: Provides a base implementation for decoding encoded polyline strings into sequences of geographic coordinates.
- - type:
- text: AbstractPolylineEncoder
- url: PolylineAlgorithm.Abstraction.AbstractPolylineEncoder-2.html
- description: Provides a base implementation for encoding sequences of geographic coordinates into encoded polyline strings.
-- h3: Interfaces
-- parameters:
- - type:
- text: IPolylineDecoder
- url: PolylineAlgorithm.Abstraction.IPolylineDecoder-2.html
- description: Defines a contract for decoding an encoded polyline into a sequence of geographic coordinates.
- - type:
- text: IPolylineEncoder
- url: PolylineAlgorithm.Abstraction.IPolylineEncoder-2.html
- description: >-
- Contract for encoding a sequence of geographic coordinates into an encoded polyline representation.
-
- Implementations interpret the generic TValue type and produce an encoded
-
- representation of those coordinates as TPolyline.
-languageId: csharp
diff --git a/api-reference/1.0/PolylineAlgorithm.Extensions.PolylineDecoderExtensions.yml b/api-reference/1.0/PolylineAlgorithm.Extensions.PolylineDecoderExtensions.yml
deleted file mode 100644
index 4b97f584..00000000
--- a/api-reference/1.0/PolylineAlgorithm.Extensions.PolylineDecoderExtensions.yml
+++ /dev/null
@@ -1,195 +0,0 @@
-### YamlMime:ApiPage
-title: Class PolylineDecoderExtensions
-body:
-- api1: Class PolylineDecoderExtensions
- id: PolylineAlgorithm_Extensions_PolylineDecoderExtensions
- src: https://github.com/petesramek/polyline-algorithm-csharp/blob/develop/1.0/src/PolylineAlgorithm/Extensions/PolylineDecoderExtensions.cs#L16
- metadata:
- uid: PolylineAlgorithm.Extensions.PolylineDecoderExtensions
- commentId: T:PolylineAlgorithm.Extensions.PolylineDecoderExtensions
-- facts:
- - name: Namespace
- value:
- text: PolylineAlgorithm.Extensions
- url: PolylineAlgorithm.Extensions.html
- - name: Assembly
- value: PolylineAlgorithm.dll
-- markdown: Provides extension methods for the interface to facilitate decoding encoded polylines.
-- code: public static class PolylineDecoderExtensions
-- h4: Inheritance
-- inheritance:
- - text: object
- url: https://learn.microsoft.com/dotnet/api/system.object
- - text: PolylineDecoderExtensions
- url: PolylineAlgorithm.Extensions.PolylineDecoderExtensions.html
-- h4: Inherited Members
-- list:
- - text: object.Equals(object)
- url: https://learn.microsoft.com/dotnet/api/system.object.equals#system-object-equals(system-object)
- - text: object.Equals(object, object)
- url: https://learn.microsoft.com/dotnet/api/system.object.equals#system-object-equals(system-object-system-object)
- - text: object.GetHashCode()
- url: https://learn.microsoft.com/dotnet/api/system.object.gethashcode
- - text: object.GetType()
- url: https://learn.microsoft.com/dotnet/api/system.object.gettype
- - text: object.MemberwiseClone()
- url: https://learn.microsoft.com/dotnet/api/system.object.memberwiseclone
- - text: object.ReferenceEquals(object, object)
- url: https://learn.microsoft.com/dotnet/api/system.object.referenceequals
- - text: object.ToString()
- url: https://learn.microsoft.com/dotnet/api/system.object.tostring
-- h2: Methods
-- api3: Decode(IPolylineDecoder, char[])
- id: PolylineAlgorithm_Extensions_PolylineDecoderExtensions_Decode__1_PolylineAlgorithm_Abstraction_IPolylineDecoder_System_String___0__System_Char___
- src: https://github.com/petesramek/polyline-algorithm-csharp/blob/develop/1.0/src/PolylineAlgorithm/Extensions/PolylineDecoderExtensions.cs#L33
- metadata:
- uid: PolylineAlgorithm.Extensions.PolylineDecoderExtensions.Decode``1(PolylineAlgorithm.Abstraction.IPolylineDecoder{System.String,``0},System.Char[])
- commentId: M:PolylineAlgorithm.Extensions.PolylineDecoderExtensions.Decode``1(PolylineAlgorithm.Abstraction.IPolylineDecoder{System.String,``0},System.Char[])
-- markdown: Decodes an encoded polyline represented as a character array into a sequence of geographic coordinates.
-- code: public static IEnumerable Decode(this IPolylineDecoder decoder, char[] polyline)
-- h4: Parameters
-- parameters:
- - name: decoder
- type:
- - text: IPolylineDecoder
- url: PolylineAlgorithm.Abstraction.IPolylineDecoder-2.html
- - <
- - text: string
- url: https://learn.microsoft.com/dotnet/api/system.string
- - ','
- - " "
- - TValue
- - '>'
- description: The instance used to perform the decoding operation.
- - name: polyline
- type:
- - text: char
- url: https://learn.microsoft.com/dotnet/api/system.char
- - '['
- - ']'
- description: The encoded polyline as a character array to decode. The array is converted to a string internally.
-- h4: Returns
-- parameters:
- - type:
- - text: IEnumerable
- url: https://learn.microsoft.com/dotnet/api/system.collections.generic.ienumerable-1
- - <
- - TValue
- - '>'
- description: An of TValue containing the decoded coordinate pairs.
-- h4: Type Parameters
-- parameters:
- - name: TValue
- description: The coordinate type returned by the decoder.
-- h4: Exceptions
-- parameters:
- - type:
- - text: ArgumentNullException
- url: https://learn.microsoft.com/dotnet/api/system.argumentnullexception
- description: Thrown when decoder or polyline is null.
-- api3: Decode(IPolylineDecoder, ReadOnlyMemory)
- id: PolylineAlgorithm_Extensions_PolylineDecoderExtensions_Decode__1_PolylineAlgorithm_Abstraction_IPolylineDecoder_System_String___0__System_ReadOnlyMemory_System_Char__
- src: https://github.com/petesramek/polyline-algorithm-csharp/blob/develop/1.0/src/PolylineAlgorithm/Extensions/PolylineDecoderExtensions.cs#L61
- metadata:
- uid: PolylineAlgorithm.Extensions.PolylineDecoderExtensions.Decode``1(PolylineAlgorithm.Abstraction.IPolylineDecoder{System.String,``0},System.ReadOnlyMemory{System.Char})
- commentId: M:PolylineAlgorithm.Extensions.PolylineDecoderExtensions.Decode``1(PolylineAlgorithm.Abstraction.IPolylineDecoder{System.String,``0},System.ReadOnlyMemory{System.Char})
-- markdown: Decodes an encoded polyline represented as a read-only memory of characters into a sequence of geographic coordinates.
-- code: public static IEnumerable Decode(this IPolylineDecoder decoder, ReadOnlyMemory polyline)
-- h4: Parameters
-- parameters:
- - name: decoder
- type:
- - text: IPolylineDecoder
- url: PolylineAlgorithm.Abstraction.IPolylineDecoder-2.html
- - <
- - text: string
- url: https://learn.microsoft.com/dotnet/api/system.string
- - ','
- - " "
- - TValue
- - '>'
- description: The instance used to perform the decoding operation.
- - name: polyline
- type:
- - text: ReadOnlyMemory
- url: https://learn.microsoft.com/dotnet/api/system.readonlymemory-1
- - <
- - text: char
- url: https://learn.microsoft.com/dotnet/api/system.char
- - '>'
- description: The encoded polyline as a read-only memory of characters to decode. The memory is converted to a string internally.
-- h4: Returns
-- parameters:
- - type:
- - text: IEnumerable
- url: https://learn.microsoft.com/dotnet/api/system.collections.generic.ienumerable-1
- - <
- - TValue
- - '>'
- description: An of TValue containing the decoded coordinate pairs.
-- h4: Type Parameters
-- parameters:
- - name: TValue
- description: The coordinate type returned by the decoder.
-- h4: Exceptions
-- parameters:
- - type:
- - text: ArgumentNullException
- url: https://learn.microsoft.com/dotnet/api/system.argumentnullexception
- description: Thrown when decoder is null.
-- api3: Decode(IPolylineDecoder, TValue>, string)
- id: PolylineAlgorithm_Extensions_PolylineDecoderExtensions_Decode__1_PolylineAlgorithm_Abstraction_IPolylineDecoder_System_ReadOnlyMemory_System_Char____0__System_String_
- src: https://github.com/petesramek/polyline-algorithm-csharp/blob/develop/1.0/src/PolylineAlgorithm/Extensions/PolylineDecoderExtensions.cs#L86
- metadata:
- uid: PolylineAlgorithm.Extensions.PolylineDecoderExtensions.Decode``1(PolylineAlgorithm.Abstraction.IPolylineDecoder{System.ReadOnlyMemory{System.Char},``0},System.String)
- commentId: M:PolylineAlgorithm.Extensions.PolylineDecoderExtensions.Decode``1(PolylineAlgorithm.Abstraction.IPolylineDecoder{System.ReadOnlyMemory{System.Char},``0},System.String)
-- markdown: >-
- Decodes an encoded polyline string into a sequence of geographic coordinates,
-
- using a decoder that accepts of .
-- code: public static IEnumerable Decode(this IPolylineDecoder, TValue> decoder, string polyline)
-- h4: Parameters
-- parameters:
- - name: decoder
- type:
- - text: IPolylineDecoder
- url: PolylineAlgorithm.Abstraction.IPolylineDecoder-2.html
- - <
- - text: ReadOnlyMemory
- url: https://learn.microsoft.com/dotnet/api/system.readonlymemory-1
- - <
- - text: char
- url: https://learn.microsoft.com/dotnet/api/system.char
- - '>'
- - ','
- - " "
- - TValue
- - '>'
- description: The instance used to perform the decoding operation.
- - name: polyline
- type:
- - text: string
- url: https://learn.microsoft.com/dotnet/api/system.string
- description: The encoded polyline string to decode. The string is converted to internally.
-- h4: Returns
-- parameters:
- - type:
- - text: IEnumerable
- url: https://learn.microsoft.com/dotnet/api/system.collections.generic.ienumerable-1
- - <
- - TValue
- - '>'
- description: An of TValue containing the decoded coordinate pairs.
-- h4: Type Parameters
-- parameters:
- - name: TValue
- description: The coordinate type returned by the decoder.
-- h4: Exceptions
-- parameters:
- - type:
- - text: ArgumentNullException
- url: https://learn.microsoft.com/dotnet/api/system.argumentnullexception
- description: Thrown when decoder or polyline is null.
-languageId: csharp
-metadata:
- description: Provides extension methods for the interface to facilitate decoding encoded polylines.
diff --git a/api-reference/1.0/PolylineAlgorithm.Extensions.PolylineEncoderExtensions.yml b/api-reference/1.0/PolylineAlgorithm.Extensions.PolylineEncoderExtensions.yml
deleted file mode 100644
index aeba23f9..00000000
--- a/api-reference/1.0/PolylineAlgorithm.Extensions.PolylineEncoderExtensions.yml
+++ /dev/null
@@ -1,139 +0,0 @@
-### YamlMime:ApiPage
-title: Class PolylineEncoderExtensions
-body:
-- api1: Class PolylineEncoderExtensions
- id: PolylineAlgorithm_Extensions_PolylineEncoderExtensions
- src: https://github.com/petesramek/polyline-algorithm-csharp/blob/develop/1.0/src/PolylineAlgorithm/Extensions/PolylineEncoderExtensions.cs#L19
- metadata:
- uid: PolylineAlgorithm.Extensions.PolylineEncoderExtensions
- commentId: T:PolylineAlgorithm.Extensions.PolylineEncoderExtensions
-- facts:
- - name: Namespace
- value:
- text: PolylineAlgorithm.Extensions
- url: PolylineAlgorithm.Extensions.html
- - name: Assembly
- value: PolylineAlgorithm.dll
-- markdown: Provides extension methods for the interface to facilitate encoding geographic coordinates into polylines.
-- code: public static class PolylineEncoderExtensions
-- h4: Inheritance
-- inheritance:
- - text: object
- url: https://learn.microsoft.com/dotnet/api/system.object
- - text: PolylineEncoderExtensions
- url: PolylineAlgorithm.Extensions.PolylineEncoderExtensions.html
-- h4: Inherited Members
-- list:
- - text: object.Equals(object)
- url: https://learn.microsoft.com/dotnet/api/system.object.equals#system-object-equals(system-object)
- - text: object.Equals(object, object)
- url: https://learn.microsoft.com/dotnet/api/system.object.equals#system-object-equals(system-object-system-object)
- - text: object.GetHashCode()
- url: https://learn.microsoft.com/dotnet/api/system.object.gethashcode
- - text: object.GetType()
- url: https://learn.microsoft.com/dotnet/api/system.object.gettype
- - text: object.MemberwiseClone()
- url: https://learn.microsoft.com/dotnet/api/system.object.memberwiseclone
- - text: object.ReferenceEquals(object, object)
- url: https://learn.microsoft.com/dotnet/api/system.object.referenceequals
- - text: object.ToString()
- url: https://learn.microsoft.com/dotnet/api/system.object.tostring
-- h2: Methods
-- api3: Encode(IPolylineEncoder, List)
- id: PolylineAlgorithm_Extensions_PolylineEncoderExtensions_Encode__2_PolylineAlgorithm_Abstraction_IPolylineEncoder___0___1__System_Collections_Generic_List___0__
- src: https://github.com/petesramek/polyline-algorithm-csharp/blob/develop/1.0/src/PolylineAlgorithm/Extensions/PolylineEncoderExtensions.cs#L37
- metadata:
- uid: PolylineAlgorithm.Extensions.PolylineEncoderExtensions.Encode``2(PolylineAlgorithm.Abstraction.IPolylineEncoder{``0,``1},System.Collections.Generic.List{``0})
- commentId: M:PolylineAlgorithm.Extensions.PolylineEncoderExtensions.Encode``2(PolylineAlgorithm.Abstraction.IPolylineEncoder{``0,``1},System.Collections.Generic.List{``0})
-- markdown: Encodes a of TCoordinate instances into an encoded polyline.
-- code: >-
- [SuppressMessage("Design", "CA1002:Do not expose generic lists", Justification = "We need a list as we do need to marshal it as span.")]
-
- [SuppressMessage("Design", "MA0016:Prefer using collection abstraction instead of implementation", Justification = "We need a list as we do need to marshal it as span.")]
-
- public static TPolyline Encode(this IPolylineEncoder encoder, List coordinates)
-- h4: Parameters
-- parameters:
- - name: encoder
- type:
- - text: IPolylineEncoder
- url: PolylineAlgorithm.Abstraction.IPolylineEncoder-2.html
- - <
- - TCoordinate
- - ','
- - " "
- - TPolyline
- - '>'
- description: The instance used to perform the encoding operation.
- - name: coordinates
- type:
- - text: List
- url: https://learn.microsoft.com/dotnet/api/system.collections.generic.list-1
- - <
- - TCoordinate
- - '>'
- description: The list of TCoordinate objects to encode.
-- h4: Returns
-- parameters:
- - type:
- - TPolyline
- description: A TPolyline instance representing the encoded polyline for the provided coordinates.
-- h4: Type Parameters
-- parameters:
- - name: TCoordinate
- description: The type that represents a geographic coordinate to encode.
- - name: TPolyline
- description: The type that represents the encoded polyline output.
-- h4: Exceptions
-- parameters:
- - type:
- - text: ArgumentNullException
- url: https://learn.microsoft.com/dotnet/api/system.argumentnullexception
- description: Thrown when encoder or coordinates is null.
-- api3: Encode(IPolylineEncoder, TCoordinate[])
- id: PolylineAlgorithm_Extensions_PolylineEncoderExtensions_Encode__2_PolylineAlgorithm_Abstraction_IPolylineEncoder___0___1____0___
- src: https://github.com/petesramek/polyline-algorithm-csharp/blob/develop/1.0/src/PolylineAlgorithm/Extensions/PolylineEncoderExtensions.cs#L73
- metadata:
- uid: PolylineAlgorithm.Extensions.PolylineEncoderExtensions.Encode``2(PolylineAlgorithm.Abstraction.IPolylineEncoder{``0,``1},``0[])
- commentId: M:PolylineAlgorithm.Extensions.PolylineEncoderExtensions.Encode``2(PolylineAlgorithm.Abstraction.IPolylineEncoder{``0,``1},``0[])
-- markdown: Encodes an array of TCoordinate instances into an encoded polyline.
-- code: public static TPolyline Encode(this IPolylineEncoder encoder, TCoordinate[] coordinates)
-- h4: Parameters
-- parameters:
- - name: encoder
- type:
- - text: IPolylineEncoder
- url: PolylineAlgorithm.Abstraction.IPolylineEncoder-2.html
- - <
- - TCoordinate
- - ','
- - " "
- - TPolyline
- - '>'
- description: The instance used to perform the encoding operation.
- - name: coordinates
- type:
- - TCoordinate
- - '['
- - ']'
- description: The array of TCoordinate objects to encode.
-- h4: Returns
-- parameters:
- - type:
- - TPolyline
- description: A TPolyline instance representing the encoded polyline for the provided coordinates.
-- h4: Type Parameters
-- parameters:
- - name: TCoordinate
- description: The type that represents a geographic coordinate to encode.
- - name: TPolyline
- description: The type that represents the encoded polyline output.
-- h4: Exceptions
-- parameters:
- - type:
- - text: ArgumentNullException
- url: https://learn.microsoft.com/dotnet/api/system.argumentnullexception
- description: Thrown when encoder or coordinates is null.
-languageId: csharp
-metadata:
- description: Provides extension methods for the interface to facilitate encoding geographic coordinates into polylines.
diff --git a/api-reference/1.0/PolylineAlgorithm.Extensions.yml b/api-reference/1.0/PolylineAlgorithm.Extensions.yml
deleted file mode 100644
index c39da0ca..00000000
--- a/api-reference/1.0/PolylineAlgorithm.Extensions.yml
+++ /dev/null
@@ -1,19 +0,0 @@
-### YamlMime:ApiPage
-title: Namespace PolylineAlgorithm.Extensions
-body:
-- api1: Namespace PolylineAlgorithm.Extensions
- id: PolylineAlgorithm_Extensions
- metadata:
- uid: PolylineAlgorithm.Extensions
- commentId: N:PolylineAlgorithm.Extensions
-- h3: Classes
-- parameters:
- - type:
- text: PolylineDecoderExtensions
- url: PolylineAlgorithm.Extensions.PolylineDecoderExtensions.html
- description: Provides extension methods for the interface to facilitate decoding encoded polylines.
- - type:
- text: PolylineEncoderExtensions
- url: PolylineAlgorithm.Extensions.PolylineEncoderExtensions.html
- description: Provides extension methods for the interface to facilitate encoding geographic coordinates into polylines.
-languageId: csharp
diff --git a/api-reference/1.0/PolylineAlgorithm.Internal.Diagnostics.ExceptionGuard.yml b/api-reference/1.0/PolylineAlgorithm.Internal.Diagnostics.ExceptionGuard.yml
deleted file mode 100644
index 45962074..00000000
--- a/api-reference/1.0/PolylineAlgorithm.Internal.Diagnostics.ExceptionGuard.yml
+++ /dev/null
@@ -1,313 +0,0 @@
-### YamlMime:ApiPage
-title: Class ExceptionGuard
-body:
-- api1: Class ExceptionGuard
- id: PolylineAlgorithm_Internal_Diagnostics_ExceptionGuard
- src: https://github.com/petesramek/polyline-algorithm-csharp/blob/develop/1.0/src/PolylineAlgorithm/Internal/Diagnostics/ExceptionGuard.cs#L29
- metadata:
- uid: PolylineAlgorithm.Internal.Diagnostics.ExceptionGuard
- commentId: T:PolylineAlgorithm.Internal.Diagnostics.ExceptionGuard
-- facts:
- - name: Namespace
- value:
- text: PolylineAlgorithm.Internal.Diagnostics
- url: PolylineAlgorithm.Internal.Diagnostics.html
- - name: Assembly
- value: PolylineAlgorithm.dll
-- markdown: Centralizes exception throwing for common validation and error scenarios used across the library.
-- code: public static class ExceptionGuard
-- h4: Inheritance
-- inheritance:
- - text: object
- url: https://learn.microsoft.com/dotnet/api/system.object
- - text: ExceptionGuard
- url: PolylineAlgorithm.Internal.Diagnostics.ExceptionGuard.html
-- h4: Inherited Members
-- list:
- - text: object.Equals(object)
- url: https://learn.microsoft.com/dotnet/api/system.object.equals#system-object-equals(system-object)
- - text: object.Equals(object, object)
- url: https://learn.microsoft.com/dotnet/api/system.object.equals#system-object-equals(system-object-system-object)
- - text: object.GetHashCode()
- url: https://learn.microsoft.com/dotnet/api/system.object.gethashcode
- - text: object.GetType()
- url: https://learn.microsoft.com/dotnet/api/system.object.gettype
- - text: object.MemberwiseClone()
- url: https://learn.microsoft.com/dotnet/api/system.object.memberwiseclone
- - text: object.ReferenceEquals(object, object)
- url: https://learn.microsoft.com/dotnet/api/system.object.referenceequals
- - text: object.ToString()
- url: https://learn.microsoft.com/dotnet/api/system.object.tostring
-- h2: Remarks
-- markdown: >-
- Methods in this class are intentionally small and annotated so that they can act as single
-
- call sites for throwing exceptions (improving inlining and stack traces). Many members have
-
- attributes to avoid polluting callers' stack traces (__StackTraceHidden__ on supported targets)
-
- or to prevent inlining on older targets.
-- h2: Methods
-- api3: StackAllocLimitMustBeEqualOrGreaterThan(int, string)
- id: PolylineAlgorithm_Internal_Diagnostics_ExceptionGuard_StackAllocLimitMustBeEqualOrGreaterThan_System_Int32_System_String_
- src: https://github.com/petesramek/polyline-algorithm-csharp/blob/develop/1.0/src/PolylineAlgorithm/Internal/Diagnostics/ExceptionGuard.cs#L97
- metadata:
- uid: PolylineAlgorithm.Internal.Diagnostics.ExceptionGuard.StackAllocLimitMustBeEqualOrGreaterThan(System.Int32,System.String)
- commentId: M:PolylineAlgorithm.Internal.Diagnostics.ExceptionGuard.StackAllocLimitMustBeEqualOrGreaterThan(System.Int32,System.String)
-- markdown: Throws an when a stack allocation limit is below the required minimum.
-- code: >-
- [DoesNotReturn]
-
- public static void StackAllocLimitMustBeEqualOrGreaterThan(int minValue, string paramName)
-- h4: Parameters
-- parameters:
- - name: minValue
- type:
- - text: int
- url: https://learn.microsoft.com/dotnet/api/system.int32
- description: Minimum required stack allocation limit.
- - name: paramName
- type:
- - text: string
- url: https://learn.microsoft.com/dotnet/api/system.string
- description: Name of the parameter representing the limit.
-- api3: ThrowArgumentCannotBeEmptyEnumerationMessage(string)
- id: PolylineAlgorithm_Internal_Diagnostics_ExceptionGuard_ThrowArgumentCannotBeEmptyEnumerationMessage_System_String_
- src: https://github.com/petesramek/polyline-algorithm-csharp/blob/develop/1.0/src/PolylineAlgorithm/Internal/Diagnostics/ExceptionGuard.cs#L111
- metadata:
- uid: PolylineAlgorithm.Internal.Diagnostics.ExceptionGuard.ThrowArgumentCannotBeEmptyEnumerationMessage(System.String)
- commentId: M:PolylineAlgorithm.Internal.Diagnostics.ExceptionGuard.ThrowArgumentCannotBeEmptyEnumerationMessage(System.String)
-- markdown: Throws an when an enumeration argument is empty but must contain at least one element.
-- code: >-
- [DoesNotReturn]
-
- public static void ThrowArgumentCannotBeEmptyEnumerationMessage(string paramName)
-- h4: Parameters
-- parameters:
- - name: paramName
- type:
- - text: string
- url: https://learn.microsoft.com/dotnet/api/system.string
- description: Name of the parameter representing the enumeration.
-- api3: ThrowArgumentNull(string)
- id: PolylineAlgorithm_Internal_Diagnostics_ExceptionGuard_ThrowArgumentNull_System_String_
- src: https://github.com/petesramek/polyline-algorithm-csharp/blob/develop/1.0/src/PolylineAlgorithm/Internal/Diagnostics/ExceptionGuard.cs#L51
- metadata:
- uid: PolylineAlgorithm.Internal.Diagnostics.ExceptionGuard.ThrowArgumentNull(System.String)
- commentId: M:PolylineAlgorithm.Internal.Diagnostics.ExceptionGuard.ThrowArgumentNull(System.String)
-- markdown: Throws an for a null argument.
-- code: >-
- [DoesNotReturn]
-
- public static void ThrowArgumentNull(string paramName)
-- h4: Parameters
-- parameters:
- - name: paramName
- type:
- - text: string
- url: https://learn.microsoft.com/dotnet/api/system.string
- description: Name of the parameter that was null.
-- api3: ThrowBufferOverflow(string)
- id: PolylineAlgorithm_Internal_Diagnostics_ExceptionGuard_ThrowBufferOverflow_System_String_
- src: https://github.com/petesramek/polyline-algorithm-csharp/blob/develop/1.0/src/PolylineAlgorithm/Internal/Diagnostics/ExceptionGuard.cs#L65
- metadata:
- uid: PolylineAlgorithm.Internal.Diagnostics.ExceptionGuard.ThrowBufferOverflow(System.String)
- commentId: M:PolylineAlgorithm.Internal.Diagnostics.ExceptionGuard.ThrowBufferOverflow(System.String)
-- markdown: Throws an with a provided message.
-- code: >-
- [DoesNotReturn]
-
- public static void ThrowBufferOverflow(string message)
-- h4: Parameters
-- parameters:
- - name: message
- type:
- - text: string
- url: https://learn.microsoft.com/dotnet/api/system.string
- description: Message that describes the overflow condition.
-- api3: ThrowCoordinateValueOutOfRange(double, double, double, string)
- id: PolylineAlgorithm_Internal_Diagnostics_ExceptionGuard_ThrowCoordinateValueOutOfRange_System_Double_System_Double_System_Double_System_String_
- src: https://github.com/petesramek/polyline-algorithm-csharp/blob/develop/1.0/src/PolylineAlgorithm/Internal/Diagnostics/ExceptionGuard.cs#L82
- metadata:
- uid: PolylineAlgorithm.Internal.Diagnostics.ExceptionGuard.ThrowCoordinateValueOutOfRange(System.Double,System.Double,System.Double,System.String)
- commentId: M:PolylineAlgorithm.Internal.Diagnostics.ExceptionGuard.ThrowCoordinateValueOutOfRange(System.Double,System.Double,System.Double,System.String)
-- markdown: Throws an when a coordinate value is outside the allowed range.
-- code: >-
- [DoesNotReturn]
-
- public static void ThrowCoordinateValueOutOfRange(double value, double min, double max, string paramName)
-- h4: Parameters
-- parameters:
- - name: value
- type:
- - text: double
- url: https://learn.microsoft.com/dotnet/api/system.double
- description: The coordinate value that was out of range.
- - name: min
- type:
- - text: double
- url: https://learn.microsoft.com/dotnet/api/system.double
- description: Inclusive minimum allowed value.
- - name: max
- type:
- - text: double
- url: https://learn.microsoft.com/dotnet/api/system.double
- description: Inclusive maximum allowed value.
- - name: paramName
- type:
- - text: string
- url: https://learn.microsoft.com/dotnet/api/system.string
- description: Name of the parameter containing the coordinate.
-- api3: ThrowCouldNotWriteEncodedValueToBuffer()
- id: PolylineAlgorithm_Internal_Diagnostics_ExceptionGuard_ThrowCouldNotWriteEncodedValueToBuffer
- src: https://github.com/petesramek/polyline-algorithm-csharp/blob/develop/1.0/src/PolylineAlgorithm/Internal/Diagnostics/ExceptionGuard.cs#L124
- metadata:
- uid: PolylineAlgorithm.Internal.Diagnostics.ExceptionGuard.ThrowCouldNotWriteEncodedValueToBuffer
- commentId: M:PolylineAlgorithm.Internal.Diagnostics.ExceptionGuard.ThrowCouldNotWriteEncodedValueToBuffer
-- markdown: Throws an when an encoded value could not be written to the destination buffer.
-- code: >-
- [DoesNotReturn]
-
- public static void ThrowCouldNotWriteEncodedValueToBuffer()
-- api3: ThrowDestinationArrayLengthMustBeEqualOrGreaterThanPolylineLength(int, int, string)
- id: PolylineAlgorithm_Internal_Diagnostics_ExceptionGuard_ThrowDestinationArrayLengthMustBeEqualOrGreaterThanPolylineLength_System_Int32_System_Int32_System_String_
- src: https://github.com/petesramek/polyline-algorithm-csharp/blob/develop/1.0/src/PolylineAlgorithm/Internal/Diagnostics/ExceptionGuard.cs#L140
- metadata:
- uid: PolylineAlgorithm.Internal.Diagnostics.ExceptionGuard.ThrowDestinationArrayLengthMustBeEqualOrGreaterThanPolylineLength(System.Int32,System.Int32,System.String)
- commentId: M:PolylineAlgorithm.Internal.Diagnostics.ExceptionGuard.ThrowDestinationArrayLengthMustBeEqualOrGreaterThanPolylineLength(System.Int32,System.Int32,System.String)
-- markdown: Throws an when a destination array is not large enough to contain the polyline data.
-- code: >-
- [DoesNotReturn]
-
- public static void ThrowDestinationArrayLengthMustBeEqualOrGreaterThanPolylineLength(int destinationLength, int polylineLength, string paramName)
-- h4: Parameters
-- parameters:
- - name: destinationLength
- type:
- - text: int
- url: https://learn.microsoft.com/dotnet/api/system.int32
- description: The length of the destination array.
- - name: polylineLength
- type:
- - text: int
- url: https://learn.microsoft.com/dotnet/api/system.int32
- description: The required polyline length.
- - name: paramName
- type:
- - text: string
- url: https://learn.microsoft.com/dotnet/api/system.string
- description: Name of the parameter representing the destination array.
-- api3: ThrowInvalidPolylineBlockTerminator()
- id: PolylineAlgorithm_Internal_Diagnostics_ExceptionGuard_ThrowInvalidPolylineBlockTerminator
- src: https://github.com/petesramek/polyline-algorithm-csharp/blob/develop/1.0/src/PolylineAlgorithm/Internal/Diagnostics/ExceptionGuard.cs#L212
- metadata:
- uid: PolylineAlgorithm.Internal.Diagnostics.ExceptionGuard.ThrowInvalidPolylineBlockTerminator
- commentId: M:PolylineAlgorithm.Internal.Diagnostics.ExceptionGuard.ThrowInvalidPolylineBlockTerminator
-- markdown: Throws an when the polyline block terminator is invalid.
-- code: >-
- [DoesNotReturn]
-
- public static void ThrowInvalidPolylineBlockTerminator()
-- api3: ThrowInvalidPolylineCharacter(char, int)
- id: PolylineAlgorithm_Internal_Diagnostics_ExceptionGuard_ThrowInvalidPolylineCharacter_System_Char_System_Int32_
- src: https://github.com/petesramek/polyline-algorithm-csharp/blob/develop/1.0/src/PolylineAlgorithm/Internal/Diagnostics/ExceptionGuard.cs#L171
- metadata:
- uid: PolylineAlgorithm.Internal.Diagnostics.ExceptionGuard.ThrowInvalidPolylineCharacter(System.Char,System.Int32)
- commentId: M:PolylineAlgorithm.Internal.Diagnostics.ExceptionGuard.ThrowInvalidPolylineCharacter(System.Char,System.Int32)
-- markdown: Throws an when an unexpected character is encountered in the polyline.
-- code: >-
- [DoesNotReturn]
-
- public static void ThrowInvalidPolylineCharacter(char character, int position)
-- h4: Parameters
-- parameters:
- - name: character
- type:
- - text: char
- url: https://learn.microsoft.com/dotnet/api/system.char
- description: The invalid character.
- - name: position
- type:
- - text: int
- url: https://learn.microsoft.com/dotnet/api/system.int32
- description: Position in the polyline where the character was found.
-- api3: ThrowInvalidPolylineFormat(long)
- id: PolylineAlgorithm_Internal_Diagnostics_ExceptionGuard_ThrowInvalidPolylineFormat_System_Int64_
- src: https://github.com/petesramek/polyline-algorithm-csharp/blob/develop/1.0/src/PolylineAlgorithm/Internal/Diagnostics/ExceptionGuard.cs#L199
- metadata:
- uid: PolylineAlgorithm.Internal.Diagnostics.ExceptionGuard.ThrowInvalidPolylineFormat(System.Int64)
- commentId: M:PolylineAlgorithm.Internal.Diagnostics.ExceptionGuard.ThrowInvalidPolylineFormat(System.Int64)
-- markdown: Throws an when the polyline format is malformed.
-- code: >-
- [DoesNotReturn]
-
- public static void ThrowInvalidPolylineFormat(long position)
-- h4: Parameters
-- parameters:
- - name: position
- type:
- - text: long
- url: https://learn.microsoft.com/dotnet/api/system.int64
- description: Approximate position where the polyline became malformed.
-- api3: ThrowInvalidPolylineLength(int, int)
- id: PolylineAlgorithm_Internal_Diagnostics_ExceptionGuard_ThrowInvalidPolylineLength_System_Int32_System_Int32_
- src: https://github.com/petesramek/polyline-algorithm-csharp/blob/develop/1.0/src/PolylineAlgorithm/Internal/Diagnostics/ExceptionGuard.cs#L156
- metadata:
- uid: PolylineAlgorithm.Internal.Diagnostics.ExceptionGuard.ThrowInvalidPolylineLength(System.Int32,System.Int32)
- commentId: M:PolylineAlgorithm.Internal.Diagnostics.ExceptionGuard.ThrowInvalidPolylineLength(System.Int32,System.Int32)
-- markdown: Throws an when the polyline length is invalid.
-- code: >-
- [DoesNotReturn]
-
- public static void ThrowInvalidPolylineLength(int length, int min)
-- h4: Parameters
-- parameters:
- - name: length
- type:
- - text: int
- url: https://learn.microsoft.com/dotnet/api/system.int32
- description: The invalid length.
- - name: min
- type:
- - text: int
- url: https://learn.microsoft.com/dotnet/api/system.int32
- description: The minimum required length.
-- api3: ThrowNotFiniteNumber(string)
- id: PolylineAlgorithm_Internal_Diagnostics_ExceptionGuard_ThrowNotFiniteNumber_System_String_
- src: https://github.com/petesramek/polyline-algorithm-csharp/blob/develop/1.0/src/PolylineAlgorithm/Internal/Diagnostics/ExceptionGuard.cs#L37
- metadata:
- uid: PolylineAlgorithm.Internal.Diagnostics.ExceptionGuard.ThrowNotFiniteNumber(System.String)
- commentId: M:PolylineAlgorithm.Internal.Diagnostics.ExceptionGuard.ThrowNotFiniteNumber(System.String)
-- markdown: Throws an when a numeric argument is not a finite value.
-- code: >-
- [DoesNotReturn]
-
- public static void ThrowNotFiniteNumber(string paramName)
-- h4: Parameters
-- parameters:
- - name: paramName
- type:
- - text: string
- url: https://learn.microsoft.com/dotnet/api/system.string
- description: Name of the parameter that had a non-finite value.
-- api3: ThrowPolylineBlockTooLong(int)
- id: PolylineAlgorithm_Internal_Diagnostics_ExceptionGuard_ThrowPolylineBlockTooLong_System_Int32_
- src: https://github.com/petesramek/polyline-algorithm-csharp/blob/develop/1.0/src/PolylineAlgorithm/Internal/Diagnostics/ExceptionGuard.cs#L185
- metadata:
- uid: PolylineAlgorithm.Internal.Diagnostics.ExceptionGuard.ThrowPolylineBlockTooLong(System.Int32)
- commentId: M:PolylineAlgorithm.Internal.Diagnostics.ExceptionGuard.ThrowPolylineBlockTooLong(System.Int32)
-- markdown: Throws an when a polyline block is longer than allowed.
-- code: >-
- [DoesNotReturn]
-
- public static void ThrowPolylineBlockTooLong(int position)
-- h4: Parameters
-- parameters:
- - name: position
- type:
- - text: int
- url: https://learn.microsoft.com/dotnet/api/system.int32
- description: Position in the polyline where the block exceeded the allowed length.
-languageId: csharp
-metadata:
- description: Centralizes exception throwing for common validation and error scenarios used across the library.
diff --git a/api-reference/1.0/PolylineAlgorithm.Internal.Diagnostics.yml b/api-reference/1.0/PolylineAlgorithm.Internal.Diagnostics.yml
deleted file mode 100644
index dabb499a..00000000
--- a/api-reference/1.0/PolylineAlgorithm.Internal.Diagnostics.yml
+++ /dev/null
@@ -1,15 +0,0 @@
-### YamlMime:ApiPage
-title: Namespace PolylineAlgorithm.Internal.Diagnostics
-body:
-- api1: Namespace PolylineAlgorithm.Internal.Diagnostics
- id: PolylineAlgorithm_Internal_Diagnostics
- metadata:
- uid: PolylineAlgorithm.Internal.Diagnostics
- commentId: N:PolylineAlgorithm.Internal.Diagnostics
-- h3: Classes
-- parameters:
- - type:
- text: ExceptionGuard
- url: PolylineAlgorithm.Internal.Diagnostics.ExceptionGuard.html
- description: Centralizes exception throwing for common validation and error scenarios used across the library.
-languageId: csharp
diff --git a/api-reference/1.0/PolylineAlgorithm.InvalidPolylineException.yml b/api-reference/1.0/PolylineAlgorithm.InvalidPolylineException.yml
deleted file mode 100644
index b776c617..00000000
--- a/api-reference/1.0/PolylineAlgorithm.InvalidPolylineException.yml
+++ /dev/null
@@ -1,102 +0,0 @@
-### YamlMime:ApiPage
-title: Class InvalidPolylineException
-body:
-- api1: Class InvalidPolylineException
- id: PolylineAlgorithm_InvalidPolylineException
- src: https://github.com/petesramek/polyline-algorithm-csharp/blob/develop/1.0/src/PolylineAlgorithm/InvalidPolylineException.cs#L17
- metadata:
- uid: PolylineAlgorithm.InvalidPolylineException
- commentId: T:PolylineAlgorithm.InvalidPolylineException
-- facts:
- - name: Namespace
- value:
- text: PolylineAlgorithm
- url: PolylineAlgorithm.html
- - name: Assembly
- value: PolylineAlgorithm.dll
-- markdown: Exception thrown when a polyline is determined to be malformed or invalid during processing.
-- code: 'public sealed class InvalidPolylineException : Exception, ISerializable'
-- h4: Inheritance
-- inheritance:
- - text: object
- url: https://learn.microsoft.com/dotnet/api/system.object
- - text: Exception
- url: https://learn.microsoft.com/dotnet/api/system.exception
- - text: InvalidPolylineException
- url: PolylineAlgorithm.InvalidPolylineException.html
-- h4: Implements
-- list:
- - text: ISerializable
- url: https://learn.microsoft.com/dotnet/api/system.runtime.serialization.iserializable
-- h4: Inherited Members
-- list:
- - text: Exception.GetBaseException()
- url: https://learn.microsoft.com/dotnet/api/system.exception.getbaseexception
- - text: Exception.GetObjectData(SerializationInfo, StreamingContext)
- url: https://learn.microsoft.com/dotnet/api/system.exception.getobjectdata
- - text: Exception.GetType()
- url: https://learn.microsoft.com/dotnet/api/system.exception.gettype
- - text: Exception.ToString()
- url: https://learn.microsoft.com/dotnet/api/system.exception.tostring
- - text: Exception.Data
- url: https://learn.microsoft.com/dotnet/api/system.exception.data
- - text: Exception.HelpLink
- url: https://learn.microsoft.com/dotnet/api/system.exception.helplink
- - text: Exception.HResult
- url: https://learn.microsoft.com/dotnet/api/system.exception.hresult
- - text: Exception.InnerException
- url: https://learn.microsoft.com/dotnet/api/system.exception.innerexception
- - text: Exception.Message
- url: https://learn.microsoft.com/dotnet/api/system.exception.message
- - text: Exception.Source
- url: https://learn.microsoft.com/dotnet/api/system.exception.source
- - text: Exception.StackTrace
- url: https://learn.microsoft.com/dotnet/api/system.exception.stacktrace
- - text: Exception.TargetSite
- url: https://learn.microsoft.com/dotnet/api/system.exception.targetsite
- - text: object.Equals(object)
- url: https://learn.microsoft.com/dotnet/api/system.object.equals#system-object-equals(system-object)
- - text: object.Equals(object, object)
- url: https://learn.microsoft.com/dotnet/api/system.object.equals#system-object-equals(system-object-system-object)
- - text: object.GetHashCode()
- url: https://learn.microsoft.com/dotnet/api/system.object.gethashcode
- - text: object.GetType()
- url: https://learn.microsoft.com/dotnet/api/system.object.gettype
- - text: object.ReferenceEquals(object, object)
- url: https://learn.microsoft.com/dotnet/api/system.object.referenceequals
- - text: object.ToString()
- url: https://learn.microsoft.com/dotnet/api/system.object.tostring
-- h2: Remarks
-- markdown: This exception is used internally to indicate that a polyline string does not conform to the expected format or contains errors.
-- h2: Constructors
-- api3: InvalidPolylineException()
- id: PolylineAlgorithm_InvalidPolylineException__ctor
- src: https://github.com/petesramek/polyline-algorithm-csharp/blob/develop/1.0/src/PolylineAlgorithm/InvalidPolylineException.cs#L22
- metadata:
- uid: PolylineAlgorithm.InvalidPolylineException.#ctor
- commentId: M:PolylineAlgorithm.InvalidPolylineException.#ctor
-- markdown: Initializes a new instance of the class.
-- code: public InvalidPolylineException()
-- api3: InvalidPolylineException(string, Exception)
- id: PolylineAlgorithm_InvalidPolylineException__ctor_System_String_System_Exception_
- src: https://github.com/petesramek/polyline-algorithm-csharp/blob/develop/1.0/src/PolylineAlgorithm/InvalidPolylineException.cs#L43
- metadata:
- uid: PolylineAlgorithm.InvalidPolylineException.#ctor(System.String,System.Exception)
- commentId: M:PolylineAlgorithm.InvalidPolylineException.#ctor(System.String,System.Exception)
-- markdown: Initializes a new instance of the class with a specified error message and a reference to the inner exception that is the cause of this exception.
-- code: public InvalidPolylineException(string message, Exception innerException)
-- h4: Parameters
-- parameters:
- - name: message
- type:
- - text: string
- url: https://learn.microsoft.com/dotnet/api/system.string
- description: The error message that explains the reason for the exception.
- - name: innerException
- type:
- - text: Exception
- url: https://learn.microsoft.com/dotnet/api/system.exception
- description: The exception that is the cause of the current exception, or a null reference if no inner exception is specified.
-languageId: csharp
-metadata:
- description: Exception thrown when a polyline is determined to be malformed or invalid during processing.
diff --git a/api-reference/1.0/PolylineAlgorithm.PolylineEncoding.yml b/api-reference/1.0/PolylineAlgorithm.PolylineEncoding.yml
deleted file mode 100644
index 127dbf53..00000000
--- a/api-reference/1.0/PolylineAlgorithm.PolylineEncoding.yml
+++ /dev/null
@@ -1,529 +0,0 @@
-### YamlMime:ApiPage
-title: Class PolylineEncoding
-body:
-- api1: Class PolylineEncoding
- id: PolylineAlgorithm_PolylineEncoding
- src: https://github.com/petesramek/polyline-algorithm-csharp/blob/develop/1.0/src/PolylineAlgorithm/PolylineEncoding.cs#L23
- metadata:
- uid: PolylineAlgorithm.PolylineEncoding
- commentId: T:PolylineAlgorithm.PolylineEncoding
-- facts:
- - name: Namespace
- value:
- text: PolylineAlgorithm
- url: PolylineAlgorithm.html
- - name: Assembly
- value: PolylineAlgorithm.dll
-- markdown: >-
- Provides methods for encoding and decoding polyline data, as well as utilities for normalizing and de-normalizing
-
- geographic coordinate values.
-- code: public static class PolylineEncoding
-- h4: Inheritance
-- inheritance:
- - text: object
- url: https://learn.microsoft.com/dotnet/api/system.object
- - text: PolylineEncoding
- url: PolylineAlgorithm.PolylineEncoding.html
-- h4: Inherited Members
-- list:
- - text: object.Equals(object)
- url: https://learn.microsoft.com/dotnet/api/system.object.equals#system-object-equals(system-object)
- - text: object.Equals(object, object)
- url: https://learn.microsoft.com/dotnet/api/system.object.equals#system-object-equals(system-object-system-object)
- - text: object.GetHashCode()
- url: https://learn.microsoft.com/dotnet/api/system.object.gethashcode
- - text: object.GetType()
- url: https://learn.microsoft.com/dotnet/api/system.object.gettype
- - text: object.MemberwiseClone()
- url: https://learn.microsoft.com/dotnet/api/system.object.memberwiseclone
- - text: object.ReferenceEquals(object, object)
- url: https://learn.microsoft.com/dotnet/api/system.object.referenceequals
- - text: object.ToString()
- url: https://learn.microsoft.com/dotnet/api/system.object.tostring
-- h2: Remarks
-- markdown: >-
- The class includes functionality for working with encoded polyline
- data, such as reading and writing encoded values, as well as methods for normalizing and de-normalizing geographic
- coordinates. It also provides validation utilities to ensure values conform to expected ranges for latitude and
- longitude.
-- h2: Methods
-- api3: Denormalize(int, uint)
- id: PolylineAlgorithm_PolylineEncoding_Denormalize_System_Int32_System_UInt32_
- src: https://github.com/petesramek/polyline-algorithm-csharp/blob/develop/1.0/src/PolylineAlgorithm/PolylineEncoding.cs#L121
- metadata:
- uid: PolylineAlgorithm.PolylineEncoding.Denormalize(System.Int32,System.UInt32)
- commentId: M:PolylineAlgorithm.PolylineEncoding.Denormalize(System.Int32,System.UInt32)
-- markdown: Converts a normalized integer coordinate value back to its floating-point representation based on the specified precision.
-- code: public static double Denormalize(int value, uint precision = 5)
-- h4: Parameters
-- parameters:
- - name: value
- type:
- - text: int
- url: https://learn.microsoft.com/dotnet/api/system.int32
- description: The integer value to denormalize. Typically produced by the method.
- - name: precision
- type:
- - text: uint
- url: https://learn.microsoft.com/dotnet/api/system.uint32
- description: The number of decimal places used during normalization. Default is 5, matching standard polyline encoding precision.
- optional: true
-- h4: Returns
-- parameters:
- - type:
- - text: double
- url: https://learn.microsoft.com/dotnet/api/system.double
- description: The denormalized floating-point coordinate value.
-- h4: Remarks
-- markdown: >-
-
-
- This method reverses the normalization performed by . It takes an integer value and converts it
-
- to a double by dividing it by 10 raised to the power of the specified precision. If precision is 0,
-
- the value is returned as a double without division.
-
-
-
-
-
- The calculation is performed inside a checked block to ensure that any arithmetic overflow is detected
-
- and an is thrown.
-
-
-
-
-
- For example, with a precision of 5:
-
-
-
- A value of 3778903 becomes 37.78903
- A value of -12241230 becomes -122.4123
-
-
-
-
-
- If the input value is 0, the method returns 0.0 immediately.
-
-
-- h4: Exceptions
-- parameters:
- - type:
- - text: OverflowException
- url: https://learn.microsoft.com/dotnet/api/system.overflowexception
- description: Thrown if the arithmetic operation overflows during conversion.
-- api3: GetRequiredBufferSize(int)
- id: PolylineAlgorithm_PolylineEncoding_GetRequiredBufferSize_System_Int32_
- src: https://github.com/petesramek/polyline-algorithm-csharp/blob/develop/1.0/src/PolylineAlgorithm/PolylineEncoding.cs#L297
- metadata:
- uid: PolylineAlgorithm.PolylineEncoding.GetRequiredBufferSize(System.Int32)
- commentId: M:PolylineAlgorithm.PolylineEncoding.GetRequiredBufferSize(System.Int32)
-- markdown: Calculates the number of characters required to encode a delta value in polyline format.
-- code: public static int GetRequiredBufferSize(int delta)
-- h4: Parameters
-- parameters:
- - name: delta
- type:
- - text: int
- url: https://learn.microsoft.com/dotnet/api/system.int32
- description: >-
- The integer delta value to calculate the encoded size for. This value typically represents the difference between
-
- consecutive coordinate values in polyline encoding.
-- h4: Returns
-- parameters:
- - type:
- - text: int
- url: https://learn.microsoft.com/dotnet/api/system.int32
- description: The number of characters required to encode the specified delta value. The minimum return value is 1.
-- h4: Remarks
-- markdown: >-
-
-
- This method determines how many characters will be needed to represent an integer delta value when encoded
-
- using the polyline encoding algorithm. It performs the same zigzag encoding transformation as
-
- but only calculates the required buffer size without actually writing any data.
-
-
-
-
-
- The calculation process:
-
-
-
- Applies zigzag encoding: left-shifts the value by 1 bit, then inverts all bits if the original value was negative
- Counts how many 5-bit chunks are needed to represent the encoded value
- Each chunk requires one character, with a minimum of 1 character for any value
-
-
-
-
-
- This method is useful for pre-allocating buffers of the correct size before encoding polyline data, helping to avoid
-
- buffer overflow checks during the actual encoding process.
-
-
-
-
-
- The method uses a long internally to prevent overflow during the left-shift operation on large negative values.
-
-
-- h4: See Also
-- list:
- - - text: PolylineEncoding
- url: PolylineAlgorithm.PolylineEncoding.html
- - .
- - text: TryWriteValue
- url: PolylineAlgorithm.PolylineEncoding.html#PolylineAlgorithm_PolylineEncoding_TryWriteValue_System_Int32_System_Span_System_Char__System_Int32__
- - (
- - text: int
- url: https://learn.microsoft.com/dotnet/api/system.int32
- - ','
- - " "
- - text: Span
- url: https://learn.microsoft.com/dotnet/api/system.span-1
- - <
- - text: char
- url: https://learn.microsoft.com/dotnet/api/system.char
- - '>'
- - ','
- - " "
- - ref
- - " "
- - text: int
- url: https://learn.microsoft.com/dotnet/api/system.int32
- - )
-- api3: Normalize(double, uint)
- id: PolylineAlgorithm_PolylineEncoding_Normalize_System_Double_System_UInt32_
- src: https://github.com/petesramek/polyline-algorithm-csharp/blob/develop/1.0/src/PolylineAlgorithm/PolylineEncoding.cs#L61
- metadata:
- uid: PolylineAlgorithm.PolylineEncoding.Normalize(System.Double,System.UInt32)
- commentId: M:PolylineAlgorithm.PolylineEncoding.Normalize(System.Double,System.UInt32)
-- markdown: Normalizes a geographic coordinate value to an integer representation based on the specified precision.
-- code: public static int Normalize(double value, uint precision = 5)
-- h4: Parameters
-- parameters:
- - name: value
- type:
- - text: double
- url: https://learn.microsoft.com/dotnet/api/system.double
- description: The numeric value to normalize. Must be a finite number (not NaN or infinity).
- - name: precision
- type:
- - text: uint
- url: https://learn.microsoft.com/dotnet/api/system.uint32
- description: >-
- The number of decimal places of precision to preserve in the normalized value.
-
- The value is multiplied by 10^precision before rounding.
-
- Default is 5, which is standard for polyline encoding.
- optional: true
-- h4: Returns
-- parameters:
- - type:
- - text: int
- url: https://learn.microsoft.com/dotnet/api/system.int32
- description: An integer representing the normalized value. Returns 0 if the input value is 0.0.
-- h4: Remarks
-- markdown: >-
-
-
- This method converts a floating-point coordinate value into a normalized integer by multiplying it by 10 raised
-
- to the power of the specified precision, then truncating the result to an integer.
-
-
-
-
-
- For example, with the default precision of 5:
-
-
-
- A value of 37.78903 becomes 3778903
- A value of -122.4123 becomes -12241230
-
-
-
-
-
- The method validates that the input value is finite (not NaN or infinity) before performing normalization.
-
- If the precision is 0, the value is rounded without multiplication.
-
-
-- h4: Exceptions
-- parameters:
- - type:
- - text: ArgumentOutOfRangeException
- url: https://learn.microsoft.com/dotnet/api/system.argumentoutofrangeexception
- description: Thrown when value is not a finite number (NaN or infinity).
- - type:
- - text: OverflowException
- url: https://learn.microsoft.com/dotnet/api/system.overflowexception
- description: Thrown when the normalized result exceeds the range of a 32-bit signed integer during the conversion from double to int.
-- api3: TryReadValue(ref int, ReadOnlyMemory, ref int)
- id: PolylineAlgorithm_PolylineEncoding_TryReadValue_System_Int32__System_ReadOnlyMemory_System_Char__System_Int32__
- src: https://github.com/petesramek/polyline-algorithm-csharp/blob/develop/1.0/src/PolylineAlgorithm/PolylineEncoding.cs#L168
- metadata:
- uid: PolylineAlgorithm.PolylineEncoding.TryReadValue(System.Int32@,System.ReadOnlyMemory{System.Char},System.Int32@)
- commentId: M:PolylineAlgorithm.PolylineEncoding.TryReadValue(System.Int32@,System.ReadOnlyMemory{System.Char},System.Int32@)
-- markdown: Attempts to read an encoded integer value from a polyline buffer, updating the specified delta and position.
-- code: public static bool TryReadValue(ref int delta, ReadOnlyMemory buffer, ref int position)
-- h4: Parameters
-- parameters:
- - name: delta
- type:
- - text: int
- url: https://learn.microsoft.com/dotnet/api/system.int32
- description: Reference to the integer accumulator that will be updated with the decoded value.
- - name: buffer
- type:
- - text: ReadOnlyMemory
- url: https://learn.microsoft.com/dotnet/api/system.readonlymemory-1
- - <
- - text: char
- url: https://learn.microsoft.com/dotnet/api/system.char
- - '>'
- description: The buffer containing polyline-encoded characters.
- - name: position
- type:
- - text: int
- url: https://learn.microsoft.com/dotnet/api/system.int32
- description: Reference to the current position in the buffer. This value is updated as characters are read.
-- h4: Returns
-- parameters:
- - type:
- - text: bool
- url: https://learn.microsoft.com/dotnet/api/system.boolean
- description: true if a value was successfully read and decoded; false if the buffer ended before a complete value was read.
-- h4: Remarks
-- markdown: >-
-
-
- This method decodes a value from a polyline-encoded character buffer, starting at the given position. It reads
-
- characters sequentially, applying the polyline decoding algorithm, and updates the delta with
-
- the decoded value. The position is advanced as characters are processed.
-
-
-
-
-
- The decoding process continues until a character with a value less than the algorithm's space constant is encountered,
-
- which signals the end of the encoded value. If the buffer is exhausted before a complete value is read, the method returns false.
-
-
-
-
-
- The decoded value is added to delta using zigzag decoding, which handles both positive and negative values.
-
-
-- api3: TryWriteValue(int, Span, ref int)
- id: PolylineAlgorithm_PolylineEncoding_TryWriteValue_System_Int32_System_Span_System_Char__System_Int32__
- src: https://github.com/petesramek/polyline-algorithm-csharp/blob/develop/1.0/src/PolylineAlgorithm/PolylineEncoding.cs#L236
- metadata:
- uid: PolylineAlgorithm.PolylineEncoding.TryWriteValue(System.Int32,System.Span{System.Char},System.Int32@)
- commentId: M:PolylineAlgorithm.PolylineEncoding.TryWriteValue(System.Int32,System.Span{System.Char},System.Int32@)
-- markdown: Attempts to write an encoded integer value to a polyline buffer, updating the specified position.
-- code: public static bool TryWriteValue(int delta, Span buffer, ref int position)
-- h4: Parameters
-- parameters:
- - name: delta
- type:
- - text: int
- url: https://learn.microsoft.com/dotnet/api/system.int32
- description: >-
- The integer value to encode and write to the buffer. This value typically represents the difference between consecutive
-
- coordinate values in polyline encoding.
- - name: buffer
- type:
- - text: Span
- url: https://learn.microsoft.com/dotnet/api/system.span-1
- - <
- - text: char
- url: https://learn.microsoft.com/dotnet/api/system.char
- - '>'
- description: The destination buffer where the encoded characters will be written. Must have sufficient capacity to hold the encoded value.
- - name: position
- type:
- - text: int
- url: https://learn.microsoft.com/dotnet/api/system.int32
- description: >-
- Reference to the current position in the buffer. This value is updated as characters are written to reflect the new position
-
- after encoding is complete.
-- h4: Returns
-- parameters:
- - type:
- - text: bool
- url: https://learn.microsoft.com/dotnet/api/system.boolean
- description: >-
- true if the value was successfully encoded and written to the buffer; false if the buffer
-
- does not have sufficient remaining capacity to hold the encoded value.
-- h4: Remarks
-- markdown: >-
-
-
- This method encodes an integer delta value into a polyline-encoded format and writes it to the provided character buffer,
-
- starting at the given position. It applies zigzag encoding followed by the polyline encoding algorithm to represent
-
- both positive and negative values efficiently.
-
-
-
-
-
- The encoding process first converts the value using zigzag encoding (left shift by 1, with bitwise inversion for negative values),
-
- then writes it as a sequence of characters. Each character encodes 5 bits of data, with continuation bits indicating whether
-
- more characters follow. The position is advanced as characters are written.
-
-
-
-
-
- Before writing, the method validates that sufficient space is available in the buffer by calling .
-
- If the buffer does not have enough remaining capacity, the method returns false without modifying the buffer or position.
-
-
-
-
-
- This method is the inverse of and can be used to encode coordinate deltas for polyline serialization.
-
-
-- api3: ValidateBlockLength(ReadOnlySpan)
- id: PolylineAlgorithm_PolylineEncoding_ValidateBlockLength_System_ReadOnlySpan_System_Char__
- src: https://github.com/petesramek/polyline-algorithm-csharp/blob/develop/1.0/src/PolylineAlgorithm/PolylineEncoding.cs#L437
- metadata:
- uid: PolylineAlgorithm.PolylineEncoding.ValidateBlockLength(System.ReadOnlySpan{System.Char})
- commentId: M:PolylineAlgorithm.PolylineEncoding.ValidateBlockLength(System.ReadOnlySpan{System.Char})
-- markdown: Validates the block structure of a polyline segment, ensuring each encoded value does not exceed 7 characters and the polyline ends correctly.
-- code: public static void ValidateBlockLength(ReadOnlySpan polyline)
-- h4: Parameters
-- parameters:
- - name: polyline
- type:
- - text: ReadOnlySpan
- url: https://learn.microsoft.com/dotnet/api/system.readonlyspan-1
- - <
- - text: char
- url: https://learn.microsoft.com/dotnet/api/system.char
- - '>'
- description: A span representing the polyline segment to validate.
-- h4: Remarks
-- markdown: >-
-
-
- Iterates through the polyline, counting the length of each block (a sequence of characters representing an encoded value).
-
- Throws an if any block exceeds 7 characters or if the polyline does not end with a valid block terminator.
-
-
-- h4: Exceptions
-- parameters:
- - type:
- - text: ArgumentException
- url: https://learn.microsoft.com/dotnet/api/system.argumentexception
- description: Thrown when a block exceeds 7 characters or the polyline does not end with a valid block terminator.
-- api3: ValidateCharRange(ReadOnlySpan)
- id: PolylineAlgorithm_PolylineEncoding_ValidateCharRange_System_ReadOnlySpan_System_Char__
- src: https://github.com/petesramek/polyline-algorithm-csharp/blob/develop/1.0/src/PolylineAlgorithm/PolylineEncoding.cs#L391
- metadata:
- uid: PolylineAlgorithm.PolylineEncoding.ValidateCharRange(System.ReadOnlySpan{System.Char})
- commentId: M:PolylineAlgorithm.PolylineEncoding.ValidateCharRange(System.ReadOnlySpan{System.Char})
-- markdown: Validates that all characters in the polyline segment are within the allowed ASCII range for polyline encoding.
-- code: public static void ValidateCharRange(ReadOnlySpan polyline)
-- h4: Parameters
-- parameters:
- - name: polyline
- type:
- - text: ReadOnlySpan
- url: https://learn.microsoft.com/dotnet/api/system.readonlyspan-1
- - <
- - text: char
- url: https://learn.microsoft.com/dotnet/api/system.char
- - '>'
- description: A span representing the polyline segment to validate.
-- h4: Remarks
-- markdown: >-
-
-
- Uses SIMD vectorization for efficient validation of large spans. Falls back to scalar checks for any block where an invalid character is detected.
-
-
-
-
-
- The valid range is from '?' (63) to '_' (95), inclusive. If an invalid character is found, an is thrown.
-
-
-- h4: Exceptions
-- parameters:
- - type:
- - text: ArgumentException
- url: https://learn.microsoft.com/dotnet/api/system.argumentexception
- description: Thrown when an invalid character is found in the polyline segment.
-- api3: ValidateFormat(ReadOnlySpan)
- id: PolylineAlgorithm_PolylineEncoding_ValidateFormat_System_ReadOnlySpan_System_Char__
- src: https://github.com/petesramek/polyline-algorithm-csharp/blob/develop/1.0/src/PolylineAlgorithm/PolylineEncoding.cs#L369
- metadata:
- uid: PolylineAlgorithm.PolylineEncoding.ValidateFormat(System.ReadOnlySpan{System.Char})
- commentId: M:PolylineAlgorithm.PolylineEncoding.ValidateFormat(System.ReadOnlySpan{System.Char})
-- markdown: Validates the format of a polyline segment, ensuring all characters are valid and block structure is correct.
-- code: public static void ValidateFormat(ReadOnlySpan polyline)
-- h4: Parameters
-- parameters:
- - name: polyline
- type:
- - text: ReadOnlySpan
- url: https://learn.microsoft.com/dotnet/api/system.readonlyspan-1
- - <
- - text: char
- url: https://learn.microsoft.com/dotnet/api/system.char
- - '>'
- description: A span representing the polyline segment to validate.
-- h4: Remarks
-- markdown: >-
-
-
- This method performs two levels of validation on the provided polyline segment:
-
-
-
- -
- Character Range Validation: Checks that every character in the polyline is within the valid ASCII range for polyline encoding ('?' [63] to '_' [95], inclusive).
- Uses SIMD acceleration for efficient validation of large segments.
-
-
- Block Structure Validation: Ensures that each encoded value (block) does not exceed 7 characters and that the polyline ends with a valid block terminator.
-
-
-
- If an invalid character or block structure is detected, an is thrown with details about the error.
-
-
-- h4: Exceptions
-- parameters:
- - type:
- - text: ArgumentException
- url: https://learn.microsoft.com/dotnet/api/system.argumentexception
- description: Thrown when an invalid character is found or the block structure is invalid.
-languageId: csharp
-metadata:
- description: >-
- Provides methods for encoding and decoding polyline data, as well as utilities for normalizing and de-normalizing
-
- geographic coordinate values.
diff --git a/api-reference/1.0/PolylineAlgorithm.PolylineEncodingOptions.yml b/api-reference/1.0/PolylineAlgorithm.PolylineEncodingOptions.yml
deleted file mode 100644
index 2e3880ce..00000000
--- a/api-reference/1.0/PolylineAlgorithm.PolylineEncodingOptions.yml
+++ /dev/null
@@ -1,127 +0,0 @@
-### YamlMime:ApiPage
-title: Class PolylineEncodingOptions
-body:
-- api1: Class PolylineEncodingOptions
- id: PolylineAlgorithm_PolylineEncodingOptions
- src: https://github.com/petesramek/polyline-algorithm-csharp/blob/develop/1.0/src/PolylineAlgorithm/PolylineEncodingOptions.cs#L29
- metadata:
- uid: PolylineAlgorithm.PolylineEncodingOptions
- commentId: T:PolylineAlgorithm.PolylineEncodingOptions
-- facts:
- - name: Namespace
- value:
- text: PolylineAlgorithm
- url: PolylineAlgorithm.html
- - name: Assembly
- value: PolylineAlgorithm.dll
-- markdown: Provides configuration options for polyline encoding operations.
-- code: public sealed class PolylineEncodingOptions
-- h4: Inheritance
-- inheritance:
- - text: object
- url: https://learn.microsoft.com/dotnet/api/system.object
- - text: PolylineEncodingOptions
- url: PolylineAlgorithm.PolylineEncodingOptions.html
-- h4: Inherited Members
-- list:
- - text: object.Equals(object)
- url: https://learn.microsoft.com/dotnet/api/system.object.equals#system-object-equals(system-object)
- - text: object.Equals(object, object)
- url: https://learn.microsoft.com/dotnet/api/system.object.equals#system-object-equals(system-object-system-object)
- - text: object.GetHashCode()
- url: https://learn.microsoft.com/dotnet/api/system.object.gethashcode
- - text: object.GetType()
- url: https://learn.microsoft.com/dotnet/api/system.object.gettype
- - text: object.ReferenceEquals(object, object)
- url: https://learn.microsoft.com/dotnet/api/system.object.referenceequals
- - text: object.ToString()
- url: https://learn.microsoft.com/dotnet/api/system.object.tostring
-- h2: Remarks
-- markdown: >-
-
-
- This class allows you to configure various aspects of polyline encoding, including:
-
-
-
- - The level for coordinate encoding
- The for memory allocation strategy
- The for diagnostic logging
-
-
-
- All properties have internal setters and should be configured through a builder or factory pattern.
-
-
-- h2: Properties
-- api3: LoggerFactory
- id: PolylineAlgorithm_PolylineEncodingOptions_LoggerFactory
- src: https://github.com/petesramek/polyline-algorithm-csharp/blob/develop/1.0/src/PolylineAlgorithm/PolylineEncodingOptions.cs#L41
- metadata:
- uid: PolylineAlgorithm.PolylineEncodingOptions.LoggerFactory
- commentId: P:PolylineAlgorithm.PolylineEncodingOptions.LoggerFactory
-- markdown: Gets the logger factory used for diagnostic logging during encoding operations.
-- code: public ILoggerFactory LoggerFactory { get; }
-- h4: Property Value
-- parameters:
- - type:
- - text: ILoggerFactory
- url: https://learn.microsoft.com/dotnet/api/microsoft.extensions.logging.iloggerfactory
-- h4: Remarks
-- markdown: >-
- The default logger factory is , which does not log any messages.
-
- To enable logging, provide a custom implementation.
-- api3: Precision
- id: PolylineAlgorithm_PolylineEncodingOptions_Precision
- src: https://github.com/petesramek/polyline-algorithm-csharp/blob/develop/1.0/src/PolylineAlgorithm/PolylineEncodingOptions.cs#L60
- metadata:
- uid: PolylineAlgorithm.PolylineEncodingOptions.Precision
- commentId: P:PolylineAlgorithm.PolylineEncodingOptions.Precision
-- markdown: Gets the precision level used for encoding coordinate values.
-- code: public uint Precision { get; }
-- h4: Property Value
-- parameters:
- - type:
- - text: uint
- url: https://learn.microsoft.com/dotnet/api/system.uint32
-- h4: Remarks
-- markdown: >-
-
-
- The precision determines the number of decimal places to which each coordinate value (latitude or longitude)
-
- is multiplied and truncated (not rounded) before encoding. For example, a precision of 5 means each coordinate is multiplied by 10^5
-
- and truncated to an integer before encoding.
-
-
-
-
-
- This setting does not directly correspond to a physical distance or accuracy in meters, but rather controls
-
- the granularity of the encoded values.
-
-
-- api3: StackAllocLimit
- id: PolylineAlgorithm_PolylineEncodingOptions_StackAllocLimit
- src: https://github.com/petesramek/polyline-algorithm-csharp/blob/develop/1.0/src/PolylineAlgorithm/PolylineEncodingOptions.cs#L73
- metadata:
- uid: PolylineAlgorithm.PolylineEncodingOptions.StackAllocLimit
- commentId: P:PolylineAlgorithm.PolylineEncodingOptions.StackAllocLimit
-- markdown: Gets the maximum buffer size (in characters) that can be allocated on the stack for encoding operations.
-- code: public int StackAllocLimit { get; }
-- h4: Property Value
-- parameters:
- - type:
- - text: int
- url: https://learn.microsoft.com/dotnet/api/system.int32
-- h4: Remarks
-- markdown: >-
- When the required buffer size for encoding exceeds this limit, memory will be allocated on the heap instead of the stack.
-
- This setting specifically applies to stack allocation of character arrays (stackalloc char[]) used during polyline encoding,
-
- balancing performance and stack safety.
-languageId: csharp
-metadata:
- description: Provides configuration options for polyline encoding operations.
diff --git a/api-reference/1.0/PolylineAlgorithm.PolylineEncodingOptionsBuilder.yml b/api-reference/1.0/PolylineAlgorithm.PolylineEncodingOptionsBuilder.yml
deleted file mode 100644
index 92e6d942..00000000
--- a/api-reference/1.0/PolylineAlgorithm.PolylineEncodingOptionsBuilder.yml
+++ /dev/null
@@ -1,141 +0,0 @@
-### YamlMime:ApiPage
-title: Class PolylineEncodingOptionsBuilder
-body:
-- api1: Class PolylineEncodingOptionsBuilder
- id: PolylineAlgorithm_PolylineEncodingOptionsBuilder
- src: https://github.com/petesramek/polyline-algorithm-csharp/blob/develop/1.0/src/PolylineAlgorithm/PolylineEncodingOptionsBuilder.cs#L15
- metadata:
- uid: PolylineAlgorithm.PolylineEncodingOptionsBuilder
- commentId: T:PolylineAlgorithm.PolylineEncodingOptionsBuilder
-- facts:
- - name: Namespace
- value:
- text: PolylineAlgorithm
- url: PolylineAlgorithm.html
- - name: Assembly
- value: PolylineAlgorithm.dll
-- markdown: Provides a builder for configuring options for polyline encoding operations.
-- code: public sealed class PolylineEncodingOptionsBuilder
-- h4: Inheritance
-- inheritance:
- - text: object
- url: https://learn.microsoft.com/dotnet/api/system.object
- - text: PolylineEncodingOptionsBuilder
- url: PolylineAlgorithm.PolylineEncodingOptionsBuilder.html
-- h4: Inherited Members
-- list:
- - text: object.Equals(object)
- url: https://learn.microsoft.com/dotnet/api/system.object.equals#system-object-equals(system-object)
- - text: object.Equals(object, object)
- url: https://learn.microsoft.com/dotnet/api/system.object.equals#system-object-equals(system-object-system-object)
- - text: object.GetHashCode()
- url: https://learn.microsoft.com/dotnet/api/system.object.gethashcode
- - text: object.GetType()
- url: https://learn.microsoft.com/dotnet/api/system.object.gettype
- - text: object.ReferenceEquals(object, object)
- url: https://learn.microsoft.com/dotnet/api/system.object.referenceequals
- - text: object.ToString()
- url: https://learn.microsoft.com/dotnet/api/system.object.tostring
-- h2: Methods
-- api3: Build()
- id: PolylineAlgorithm_PolylineEncodingOptionsBuilder_Build
- src: https://github.com/petesramek/polyline-algorithm-csharp/blob/develop/1.0/src/PolylineAlgorithm/PolylineEncodingOptionsBuilder.cs#L38
- metadata:
- uid: PolylineAlgorithm.PolylineEncodingOptionsBuilder.Build
- commentId: M:PolylineAlgorithm.PolylineEncodingOptionsBuilder.Build
-- markdown: Builds a new instance using the configured options.
-- code: public PolylineEncodingOptions Build()
-- h4: Returns
-- parameters:
- - type:
- - text: PolylineEncodingOptions
- url: PolylineAlgorithm.PolylineEncodingOptions.html
- description: A configured instance.
-- api3: Create()
- id: PolylineAlgorithm_PolylineEncodingOptionsBuilder_Create
- src: https://github.com/petesramek/polyline-algorithm-csharp/blob/develop/1.0/src/PolylineAlgorithm/PolylineEncodingOptionsBuilder.cs#L28
- metadata:
- uid: PolylineAlgorithm.PolylineEncodingOptionsBuilder.Create
- commentId: M:PolylineAlgorithm.PolylineEncodingOptionsBuilder.Create
-- markdown: Creates a new instance for the specified coordinate type.
-- code: public static PolylineEncodingOptionsBuilder Create()
-- h4: Returns
-- parameters:
- - type:
- - text: PolylineEncodingOptionsBuilder
- url: PolylineAlgorithm.PolylineEncodingOptionsBuilder.html
- description: An instance for configuring polyline encoding options.
-- api3: WithLoggerFactory(ILoggerFactory)
- id: PolylineAlgorithm_PolylineEncodingOptionsBuilder_WithLoggerFactory_Microsoft_Extensions_Logging_ILoggerFactory_
- src: https://github.com/petesramek/polyline-algorithm-csharp/blob/develop/1.0/src/PolylineAlgorithm/PolylineEncodingOptionsBuilder.cs#L97
- metadata:
- uid: PolylineAlgorithm.PolylineEncodingOptionsBuilder.WithLoggerFactory(Microsoft.Extensions.Logging.ILoggerFactory)
- commentId: M:PolylineAlgorithm.PolylineEncodingOptionsBuilder.WithLoggerFactory(Microsoft.Extensions.Logging.ILoggerFactory)
-- markdown: Configures the to be used for logging during polyline encoding operations.
-- code: public PolylineEncodingOptionsBuilder WithLoggerFactory(ILoggerFactory loggerFactory)
-- h4: Parameters
-- parameters:
- - name: loggerFactory
- type:
- - text: ILoggerFactory
- url: https://learn.microsoft.com/dotnet/api/microsoft.extensions.logging.iloggerfactory
- description: The instance to use for logging. If null, a will be used instead.
-- h4: Returns
-- parameters:
- - type:
- - text: PolylineEncodingOptionsBuilder
- url: PolylineAlgorithm.PolylineEncodingOptionsBuilder.html
- description: The current instance for method chaining.
-- api3: WithPrecision(uint)
- id: PolylineAlgorithm_PolylineEncodingOptionsBuilder_WithPrecision_System_UInt32_
- src: https://github.com/petesramek/polyline-algorithm-csharp/blob/develop/1.0/src/PolylineAlgorithm/PolylineEncodingOptionsBuilder.cs#L82
- metadata:
- uid: PolylineAlgorithm.PolylineEncodingOptionsBuilder.WithPrecision(System.UInt32)
- commentId: M:PolylineAlgorithm.PolylineEncodingOptionsBuilder.WithPrecision(System.UInt32)
-- markdown: Sets the coordinate encoding precision.
-- code: public PolylineEncodingOptionsBuilder WithPrecision(uint precision)
-- h4: Parameters
-- parameters:
- - name: precision
- type:
- - text: uint
- url: https://learn.microsoft.com/dotnet/api/system.uint32
- description: The number of decimal places to use for encoding coordinate values. Default is 5.
-- h4: Returns
-- parameters:
- - type:
- - text: PolylineEncodingOptionsBuilder
- url: PolylineAlgorithm.PolylineEncodingOptionsBuilder.html
- description: The current instance for method chaining.
-- api3: WithStackAllocLimit(int)
- id: PolylineAlgorithm_PolylineEncodingOptionsBuilder_WithStackAllocLimit_System_Int32_
- src: https://github.com/petesramek/polyline-algorithm-csharp/blob/develop/1.0/src/PolylineAlgorithm/PolylineEncodingOptionsBuilder.cs#L61
- metadata:
- uid: PolylineAlgorithm.PolylineEncodingOptionsBuilder.WithStackAllocLimit(System.Int32)
- commentId: M:PolylineAlgorithm.PolylineEncodingOptionsBuilder.WithStackAllocLimit(System.Int32)
-- markdown: Configures the buffer size used for stack allocation during polyline encoding operations.
-- code: public PolylineEncodingOptionsBuilder WithStackAllocLimit(int stackAllocLimit)
-- h4: Parameters
-- parameters:
- - name: stackAllocLimit
- type:
- - text: int
- url: https://learn.microsoft.com/dotnet/api/system.int32
- description: The maximum buffer size to use for stack allocation. Must be greater than or equal to 1.
-- h4: Returns
-- parameters:
- - type:
- - text: PolylineEncodingOptionsBuilder
- url: PolylineAlgorithm.PolylineEncodingOptionsBuilder.html
- description: The current instance for method chaining.
-- h4: Remarks
-- markdown: This method allows customization of the internal buffer size for encoding, which can impact performance and memory usage.
-- h4: Exceptions
-- parameters:
- - type:
- - text: ArgumentOutOfRangeException
- url: https://learn.microsoft.com/dotnet/api/system.argumentoutofrangeexception
- description: Thrown if stackAllocLimit is less than 1.
-languageId: csharp
-metadata:
- description: Provides a builder for configuring options for polyline encoding operations.
diff --git a/api-reference/1.0/PolylineAlgorithm.yml b/api-reference/1.0/PolylineAlgorithm.yml
deleted file mode 100644
index b60dc3c0..00000000
--- a/api-reference/1.0/PolylineAlgorithm.yml
+++ /dev/null
@@ -1,38 +0,0 @@
-### YamlMime:ApiPage
-title: Namespace PolylineAlgorithm
-body:
-- api1: Namespace PolylineAlgorithm
- id: PolylineAlgorithm
- metadata:
- uid: PolylineAlgorithm
- commentId: N:PolylineAlgorithm
-- h3: Namespaces
-- parameters:
- - type:
- text: PolylineAlgorithm.Abstraction
- url: PolylineAlgorithm.Abstraction.html
- - type:
- text: PolylineAlgorithm.Extensions
- url: PolylineAlgorithm.Extensions.html
-- h3: Classes
-- parameters:
- - type:
- text: InvalidPolylineException
- url: PolylineAlgorithm.InvalidPolylineException.html
- description: Exception thrown when a polyline is determined to be malformed or invalid during processing.
- - type:
- text: PolylineEncoding
- url: PolylineAlgorithm.PolylineEncoding.html
- description: >-
- Provides methods for encoding and decoding polyline data, as well as utilities for normalizing and de-normalizing
-
- geographic coordinate values.
- - type:
- text: PolylineEncodingOptions
- url: PolylineAlgorithm.PolylineEncodingOptions.html
- description: Provides configuration options for polyline encoding operations.
- - type:
- text: PolylineEncodingOptionsBuilder
- url: PolylineAlgorithm.PolylineEncodingOptionsBuilder.html
- description: Provides a builder for configuring options for polyline encoding operations.
-languageId: csharp
diff --git a/api-reference/1.0/toc.yml b/api-reference/1.0/toc.yml
deleted file mode 100644
index d1ffc58a..00000000
--- a/api-reference/1.0/toc.yml
+++ /dev/null
@@ -1,34 +0,0 @@
-### YamlMime:TableOfContent
-- name: PolylineAlgorithm
- href: PolylineAlgorithm.yml
- items:
- - name: Classes
- - name: InvalidPolylineException
- href: PolylineAlgorithm.InvalidPolylineException.yml
- - name: PolylineEncoding
- href: PolylineAlgorithm.PolylineEncoding.yml
- - name: PolylineEncodingOptions
- href: PolylineAlgorithm.PolylineEncodingOptions.yml
- - name: PolylineEncodingOptionsBuilder
- href: PolylineAlgorithm.PolylineEncodingOptionsBuilder.yml
-- name: PolylineAlgorithm.Abstraction
- href: PolylineAlgorithm.Abstraction.yml
- items:
- - name: Classes
- - name: AbstractPolylineDecoder
- href: PolylineAlgorithm.Abstraction.AbstractPolylineDecoder-2.yml
- - name: AbstractPolylineEncoder
- href: PolylineAlgorithm.Abstraction.AbstractPolylineEncoder-2.yml
- - name: Interfaces
- - name: IPolylineDecoder
- href: PolylineAlgorithm.Abstraction.IPolylineDecoder-2.yml
- - name: IPolylineEncoder
- href: PolylineAlgorithm.Abstraction.IPolylineEncoder-2.yml
-- name: PolylineAlgorithm.Extensions
- href: PolylineAlgorithm.Extensions.yml
- items:
- - name: Classes
- - name: PolylineDecoderExtensions
- href: PolylineAlgorithm.Extensions.PolylineDecoderExtensions.yml
- - name: PolylineEncoderExtensions
- href: PolylineAlgorithm.Extensions.PolylineEncoderExtensions.yml
diff --git a/benchmarks/PolylineAlgorithm.Benchmarks/PolylineDecoderBenchmark.cs b/benchmarks/PolylineAlgorithm.Benchmarks/PolylineDecoderBenchmark.cs
index f28c8141..72134710 100644
--- a/benchmarks/PolylineAlgorithm.Benchmarks/PolylineDecoderBenchmark.cs
+++ b/benchmarks/PolylineAlgorithm.Benchmarks/PolylineDecoderBenchmark.cs
@@ -8,6 +8,7 @@ namespace PolylineAlgorithm.Benchmarks;
using BenchmarkDotNet.Attributes;
using BenchmarkDotNet.Engines;
using PolylineAlgorithm.Abstraction;
+using PolylineAlgorithm.Internal;
using PolylineAlgorithm.Utility;
///
@@ -93,9 +94,10 @@ public void PolylineDecoder_Decode_Memory() {
}
private sealed class StringPolylineDecoder : AbstractPolylineDecoder {
- protected override (double Latitude, double Longitude) CreateCoordinate(double latitude, double longitude) {
- return (latitude, longitude);
- }
+ protected override int ValuesPerItem => 2;
+
+ protected override (double Latitude, double Longitude) Read(PolylineReader reader, PolylineValueState[] states) =>
+ (reader.Read(ref states[0]), reader.Read(ref states[1]));
protected override ReadOnlyMemory GetReadOnlyMemory(in string polyline) {
return polyline?.AsMemory() ?? Memory.Empty;
@@ -103,9 +105,10 @@ protected override ReadOnlyMemory GetReadOnlyMemory(in string polyline) {
}
private sealed class CharArrayPolylineDecoder : AbstractPolylineDecoder {
- protected override (double Latitude, double Longitude) CreateCoordinate(double latitude, double longitude) {
- return (latitude, longitude);
- }
+ protected override int ValuesPerItem => 2;
+
+ protected override (double Latitude, double Longitude) Read(PolylineReader reader, PolylineValueState[] states) =>
+ (reader.Read(ref states[0]), reader.Read(ref states[1]));
protected override ReadOnlyMemory GetReadOnlyMemory(in char[] polyline) {
return polyline?.AsMemory() ?? Memory.Empty;
@@ -113,9 +116,10 @@ protected override ReadOnlyMemory GetReadOnlyMemory(in char[] polyline) {
}
private sealed class MemoryCharPolylineDecoder : AbstractPolylineDecoder, (double Latitude, double Longitude)> {
- protected override (double Latitude, double Longitude) CreateCoordinate(double latitude, double longitude) {
- return (latitude, longitude);
- }
+ protected override int ValuesPerItem => 2;
+
+ protected override (double Latitude, double Longitude) Read(PolylineReader reader, PolylineValueState[] states) =>
+ (reader.Read(ref states[0]), reader.Read(ref states[1]));
protected override ReadOnlyMemory GetReadOnlyMemory(in ReadOnlyMemory polyline) {
return polyline;
diff --git a/benchmarks/PolylineAlgorithm.Benchmarks/PolylineEncoderBenchmark.cs b/benchmarks/PolylineAlgorithm.Benchmarks/PolylineEncoderBenchmark.cs
index e0b97c5c..24b8bc66 100644
--- a/benchmarks/PolylineAlgorithm.Benchmarks/PolylineEncoderBenchmark.cs
+++ b/benchmarks/PolylineAlgorithm.Benchmarks/PolylineEncoderBenchmark.cs
@@ -9,6 +9,7 @@ namespace PolylineAlgorithm.Benchmarks;
using BenchmarkDotNet.Engines;
using PolylineAlgorithm.Abstraction;
using PolylineAlgorithm.Extensions;
+using PolylineAlgorithm.Internal;
using PolylineAlgorithm.Utility;
using System.Collections.Generic;
@@ -85,8 +86,12 @@ public void PolylineEncoder_Encode_List() {
}
private sealed class StringPolylineEncoder : AbstractPolylineEncoder<(double Latitude, double Longitude), string> {
- protected override string CreatePolyline(ReadOnlyMemory polyline) => polyline.ToString();
- protected override double GetLatitude((double Latitude, double Longitude) current) => current.Latitude;
- protected override double GetLongitude((double Latitude, double Longitude) current) => current.Longitude;
+ protected override int ValuesPerItem => 2;
+
+ protected override string CreatePolyline(ReadOnlySpan polyline) => polyline.ToString();
+ protected override void Write((double Latitude, double Longitude) item, ref PolylineWriter writer, PolylineValueState[] states) {
+ writer.Write(item.Latitude, ref states[0]);
+ writer.Write(item.Longitude, ref states[1]);
+ }
}
}
diff --git a/samples/PolylineAlgorithm.NetTopologySuite.Sample/NetTopologyPolylineDecoder.cs b/samples/PolylineAlgorithm.NetTopologySuite.Sample/NetTopologyPolylineDecoder.cs
index d7dcb13e..f4469e87 100644
--- a/samples/PolylineAlgorithm.NetTopologySuite.Sample/NetTopologyPolylineDecoder.cs
+++ b/samples/PolylineAlgorithm.NetTopologySuite.Sample/NetTopologyPolylineDecoder.cs
@@ -7,23 +7,13 @@ namespace PolylineAlgorithm.NetTopologySuite.Sample;
using global::NetTopologySuite.Geometries;
using PolylineAlgorithm.Abstraction;
+using PolylineAlgorithm.Internal;
using System;
///
/// Polyline decoder using NetTopologySuite.
///
internal sealed class NetTopologyPolylineDecoder : AbstractPolylineDecoder {
- ///
- /// Creates a NetTopologySuite point from latitude and longitude.
- ///
- /// Latitude value.
- /// Longitude value.
- /// Point instance.
- protected override Point CreateCoordinate(double latitude, double longitude) {
- // NetTopologySuite Point: x = longitude, y = latitude
- return new Point(longitude, latitude);
- }
-
///
/// Converts polyline string to read-only memory.
///
@@ -32,4 +22,21 @@ protected override Point CreateCoordinate(double latitude, double longitude) {
protected override ReadOnlyMemory GetReadOnlyMemory(in string polyline) {
return polyline.AsMemory();
}
+
+ ///
+ protected override int ValuesPerItem => 2;
+
+ ///
+ /// Creates a NetTopologySuite Point from decoded field values.
+ ///
+ /// The reader provided by the engine. Field 0 = latitude, field 1 = longitude.
+ /// Per-field delta accumulation states.
+ /// Point instance.
+ protected override Point Read(PolylineReader reader, PolylineValueState[] states) {
+ double latitude = reader.Read(ref states[0]);
+ double longitude = reader.Read(ref states[1]);
+
+ // NetTopologySuite Point: x = longitude, y = latitude
+ return new Point(longitude, latitude);
+ }
}
\ No newline at end of file
diff --git a/samples/PolylineAlgorithm.NetTopologySuite.Sample/NetTopologyPolylineEncoder.cs b/samples/PolylineAlgorithm.NetTopologySuite.Sample/NetTopologyPolylineEncoder.cs
index c6719000..15d283c2 100644
--- a/samples/PolylineAlgorithm.NetTopologySuite.Sample/NetTopologyPolylineEncoder.cs
+++ b/samples/PolylineAlgorithm.NetTopologySuite.Sample/NetTopologyPolylineEncoder.cs
@@ -7,17 +7,19 @@ namespace PolylineAlgorithm.NetTopologySuite.Sample;
using global::NetTopologySuite.Geometries;
using PolylineAlgorithm.Abstraction;
+using PolylineAlgorithm.Internal;
+using System;
///
/// Polyline encoder using NetTopologySuite's Point type.
///
internal sealed class NetTopologyPolylineEncoder : AbstractPolylineEncoder {
///
- /// Creates encoded polyline string from memory.
+ /// Creates encoded polyline string from span.
///
- /// Polyline memory.
+ /// Polyline span.
/// Encoded polyline string.
- protected override string CreatePolyline(ReadOnlyMemory polyline) {
+ protected override string CreatePolyline(ReadOnlySpan polyline) {
if (polyline.IsEmpty) {
return string.Empty;
}
@@ -25,27 +27,20 @@ protected override string CreatePolyline(ReadOnlyMemory polyline) {
return polyline.ToString();
}
- ///
- /// Gets latitude from point.
- ///
- /// Point instance.
- /// Latitude value.
- protected override double GetLatitude(Point current) {
- ArgumentNullException.ThrowIfNull(current);
-
- // NetTopologySuite Point: Y = latitude
- return current.Y;
- }
+ ///
+ protected override int ValuesPerItem => 2;
///
- /// Gets longitude from point.
+ /// Writes latitude and longitude from a NetTopologySuite Point into the polyline encoding pipeline.
///
- /// Point instance.
- /// Longitude value.
- protected override double GetLongitude(Point current) {
- ArgumentNullException.ThrowIfNull(current);
-
- // NetTopologySuite Point: X = longitude
- return current.X;
+ /// The point to write. Field 0 = latitude (Y), field 1 = longitude (X).
+ /// The writer provided by the engine.
+ /// Per-field delta accumulation states.
+ protected override void Write(Point item, ref PolylineWriter writer, PolylineValueState[] states) {
+ ArgumentNullException.ThrowIfNull(item);
+
+ // NetTopologySuite Point: Y = latitude, X = longitude
+ writer.Write(item.Y, ref states[0]);
+ writer.Write(item.X, ref states[1]);
}
}
\ No newline at end of file
diff --git a/samples/PolylineAlgorithm.SensorData.Sample/SensorDataEncoder.cs b/samples/PolylineAlgorithm.SensorData.Sample/SensorDataEncoder.cs
index be199e4d..20da8342 100644
--- a/samples/PolylineAlgorithm.SensorData.Sample/SensorDataEncoder.cs
+++ b/samples/PolylineAlgorithm.SensorData.Sample/SensorDataEncoder.cs
@@ -98,7 +98,10 @@ public string Encode(ReadOnlySpan coordinates, CancellationToken
int position = 0;
int length = coordinates.Length * 2 * MaxEncodedCharsPerValue;
- char[]? temp = length <= Options.StackAllocLimit
+ // Use stackalloc for small buffers to avoid a heap allocation; fall back to ArrayPool for larger ones.
+ const int StackAllocLimit = 512;
+
+ char[]? temp = length <= StackAllocLimit
? null
: ArrayPool.Shared.Rent(length);
diff --git a/src/PolylineAlgorithm/Abstraction/AbstractPolylineDecoder.cs b/src/PolylineAlgorithm/Abstraction/AbstractPolylineDecoder.cs
index 1059abb9..d58496b3 100644
--- a/src/PolylineAlgorithm/Abstraction/AbstractPolylineDecoder.cs
+++ b/src/PolylineAlgorithm/Abstraction/AbstractPolylineDecoder.cs
@@ -1,4 +1,4 @@
-//
+//
// Copyright © Pete Sramek. All rights reserved.
// Licensed under the MIT License. See LICENSE file in the project root for full license information.
//
@@ -11,14 +11,14 @@
namespace PolylineAlgorithm.Abstraction;
///
-/// Provides a base implementation for decoding encoded polyline strings into sequences of geographic coordinates.
+/// Provides a base implementation for decoding encoded polyline strings into sequences of items.
///
///
/// Derive from this class to implement a decoder for a specific polyline type. Override
-/// and to provide type-specific behavior.
+/// and to provide type-specific behavior.
///
/// The type that represents the encoded polyline input.
-/// The type that represents a decoded geographic coordinate.
+/// The type that represents a decoded item.
public abstract class AbstractPolylineDecoder : IPolylineDecoder {
private readonly ILogger> _logger;
@@ -64,7 +64,7 @@ protected AbstractPolylineDecoder(PolylineEncodingOptions options) {
/// A that can be used to cancel the decoding operation.
///
///
- /// An of representing the decoded latitude and longitude pairs.
+ /// An of representing the decoded items.
///
///
/// Thrown when is .
@@ -90,34 +90,34 @@ public IEnumerable Decode(TPolyline polyline, CancellationToken can
ValidateSequence(sequence, _logger);
ValidateFormat(sequence, _logger);
- int position = 0;
- int encodedLatitude = 0;
- int encodedLongitude = 0;
+ PolylineReader reader = new(sequence, Options.Precision);
+ PolylineValueState[] states = new PolylineValueState[ValuesPerItem];
try {
- while (position < sequence.Length) {
+ while (!reader.IsEmpty) {
cancellationToken.ThrowIfCancellationRequested();
- if (!PolylineEncoding.TryReadValue(ref encodedLatitude, sequence, ref position)
- || !PolylineEncoding.TryReadValue(ref encodedLongitude, sequence, ref position)) {
- _logger?.LogOperationFailedDebug(OperationName);
- _logger?.LogInvalidPolylineWarning(position);
-
- ExceptionGuard.ThrowInvalidPolylineFormat(position);
- }
-
- double decodedLatitude = PolylineEncoding.Denormalize(encodedLatitude, Options.Precision);
- double decodedLongitude = PolylineEncoding.Denormalize(encodedLongitude, Options.Precision);
+ TCoordinate item = Read(reader, states);
- _logger?.LogDecodedCoordinateDebug(decodedLatitude, decodedLongitude, position);
+ //_logger?.LogDecodedItemDebug(reader.SlotIndex, reader.Position);
- yield return CreateCoordinate(decodedLatitude, decodedLongitude);
+ yield return item;
}
} finally {
_logger?.LogOperationFinishedDebug(OperationName);
}
}
+ ///
+ /// Gets the number of field values encoded or decoded per item.
+ ///
+ ///
+ /// The base class uses this value to allocate the per-call state array that is passed to
+ /// . Implementations must return a constant value that matches the
+ /// number of calls made inside .
+ ///
+ protected abstract int ValuesPerItem { get; }
+
///
/// Validates that the provided polyline is not .
///
@@ -188,17 +188,26 @@ protected virtual void ValidateFormat(ReadOnlyMemory sequence, ILogger? lo
protected abstract ReadOnlyMemory GetReadOnlyMemory(in TPolyline polyline);
///
- /// Creates a instance from the specified latitude and longitude values.
+ /// Reads field values from the polyline decoding pipeline and constructs one item.
///
- ///
- /// The latitude component of the coordinate, in degrees.
+ ///
+ /// The cursor provided by the engine. Call
+ /// once for each expected field value, in the same order used by the corresponding encoder's
+ /// override.
///
- ///
- /// The longitude component of the coordinate, in degrees.
+ ///
+ /// The per-field delta accumulation state array, allocated by the base class for the duration of
+ /// the call. Index into this array in the same fixed order used for each field
+ /// (e.g. states[0] for latitude, states[1] for longitude).
///
///
- /// A instance representing the specified geographic coordinate.
+ /// A instance constructed from the decoded field values.
///
+ ///
+ /// Implementations must always call the same number of times,
+ /// in the same field order, for every item. The number of reads must match
+ /// and the number of writes performed by the corresponding encoder's override.
+ ///
[MethodImpl(MethodImplOptions.AggressiveInlining)]
- protected abstract TCoordinate CreateCoordinate(double latitude, double longitude);
+ protected abstract TCoordinate Read(PolylineReader reader, PolylineValueState[] states);
}
diff --git a/src/PolylineAlgorithm/Abstraction/AbstractPolylineEncoder.cs b/src/PolylineAlgorithm/Abstraction/AbstractPolylineEncoder.cs
index 1bcdb0ee..1d75e54c 100644
--- a/src/PolylineAlgorithm/Abstraction/AbstractPolylineEncoder.cs
+++ b/src/PolylineAlgorithm/Abstraction/AbstractPolylineEncoder.cs
@@ -1,4 +1,4 @@
-//
+//
// Copyright © Pete Sramek. All rights reserved.
// Licensed under the MIT License. See LICENSE file in the project root for full license information.
//
@@ -16,13 +16,13 @@ namespace PolylineAlgorithm.Abstraction;
using System.Threading;
///
-/// Provides a base implementation for encoding sequences of geographic coordinates into encoded polyline strings.
+/// Provides a base implementation for encoding sequences of items into encoded polyline strings.
///
///
-/// Derive from this class to implement an encoder for a specific coordinate and polyline type. Override
-/// , , and to provide type-specific behavior.
+/// Derive from this class to implement an encoder for a specific item and polyline type. Override
+/// , and to provide type-specific behavior.
///
-/// The type that represents a geographic coordinate to encode.
+/// The type that represents an item to encode.
/// The type that represents the encoded polyline output.
public abstract class AbstractPolylineEncoder : IPolylineEncoder {
private readonly ILogger> _logger;
@@ -77,7 +77,6 @@ protected AbstractPolylineEncoder(PolylineEncodingOptions options) {
///
/// Thrown when the internal encoding buffer cannot accommodate the encoded value.
///
- [System.Diagnostics.CodeAnalysis.SuppressMessage("Design", "MA0051:Method is too long", Justification = "Method contains local methods. Actual method only 55 lines.")]
public TPolyline Encode(ReadOnlySpan coordinates, CancellationToken cancellationToken = default) {
const string OperationName = nameof(Encode);
@@ -86,76 +85,47 @@ public TPolyline Encode(ReadOnlySpan coordinates, CancellationToken
Debug.Assert(coordinates.Length >= 0, "Count must be non-negative.");
- ValidateEmptyCoordinates(ref coordinates, _logger);
-
- CoordinateDelta delta = new();
+ ValidateEmptyCoordinates(ref coordinates, _logger, OperationName);
- int position = 0;
- int consumed = 0;
- int length = GetMaxBufferLength(coordinates.Length);
+ // Worst-case maximum: every value uses the maximum number of encoded characters.
+ int maxCapacity = coordinates.Length * ValuesPerItem * Defaults.Polyline.Block.Length.Max;
- char[]? temp = length <= Options.StackAllocLimit
- ? null
- : ArrayPool.Shared.Rent(length);
+ // Use stackalloc for small buffers (zero heap allocation); fall back to ArrayPool for large ones.
+ const int StackAllocThreshold = 512;
+ char[]? rentedBuffer = null;
+ Span buffer = maxCapacity > StackAllocThreshold
+ ? (rentedBuffer = ArrayPool.Shared.Rent(maxCapacity)).AsSpan(0, maxCapacity)
+ : stackalloc char[maxCapacity];
- Span buffer = temp is null ? stackalloc char[length] : temp.AsSpan(0, length);
+ PolylineWriter writer = new(buffer, Options.Precision);
+ PolylineValueState[] states = new PolylineValueState[ValuesPerItem];
- string encodedResult;
+ TPolyline result;
try {
for (var i = 0; i < coordinates.Length; i++) {
cancellationToken.ThrowIfCancellationRequested();
- delta
- .Next(
- PolylineEncoding.Normalize(GetLatitude(coordinates[i]), Options.Precision),
- PolylineEncoding.Normalize(GetLongitude(coordinates[i]), Options.Precision)
- );
-
- if (!PolylineEncoding.TryWriteValue(delta.Latitude, buffer, ref position)
- || !PolylineEncoding.TryWriteValue(delta.Longitude, buffer, ref position)
- ) {
- // This shouldn't happen, but if it does, log the error and throw an exception.
- _logger
- .LogOperationFailedDebug(OperationName);
- _logger
- .LogCannotWriteValueToBufferWarning(position, consumed);
-
- ExceptionGuard.ThrowCouldNotWriteEncodedValueToBuffer();
-
- }
-
- consumed++;
+ Write(coordinates[i], ref writer, states);
}
- encodedResult = buffer[..position].ToString();
+ result = CreatePolyline(writer.WrittenSpan);
} finally {
- if (temp is not null) {
- ArrayPool.Shared.Return(temp);
+ if (rentedBuffer is not null) {
+ ArrayPool.Shared.Return(rentedBuffer);
}
}
_logger
.LogOperationFinishedDebug(OperationName);
- return CreatePolyline(encodedResult.AsMemory());
-
- [MethodImpl(MethodImplOptions.AggressiveInlining)]
- static int GetMaxBufferLength(int count) {
- Debug.Assert(count > 0, "Count must be greater than zero.");
-
- int requestedBufferLength = count * 2 * Defaults.Polyline.Block.Length.Max;
-
- Debug.Assert(requestedBufferLength > 0, "Requested buffer length must be greater than zero.");
-
- return requestedBufferLength;
- }
+ return result;
[MethodImpl(MethodImplOptions.AggressiveInlining)]
- static void ValidateEmptyCoordinates(ref ReadOnlySpan coordinates, ILogger logger) {
+ static void ValidateEmptyCoordinates(ref ReadOnlySpan coordinates, ILogger logger, string operationName) {
if (coordinates.Length < 1) {
logger
- .LogOperationFailedDebug(OperationName);
+ .LogOperationFailedDebug(operationName);
logger
.LogEmptyArgumentWarning(nameof(coordinates));
@@ -165,33 +135,45 @@ static void ValidateEmptyCoordinates(ref ReadOnlySpan coordinates,
}
///
- /// Creates a polyline instance from the provided read-only sequence of characters.
+ /// Gets the number of field values encoded or decoded per item.
///
- /// A containing the encoded polyline characters.
- ///
- /// An instance of representing the encoded polyline.
- ///
- [MethodImpl(MethodImplOptions.AggressiveInlining)]
- protected abstract TPolyline CreatePolyline(ReadOnlyMemory polyline);
+ ///
+ /// The base class uses this value to allocate the per-call state array that is passed to
+ /// . Implementations must return a constant value that matches the
+ /// number of calls made inside .
+ ///
+ protected abstract int ValuesPerItem { get; }
///
- /// Extracts the longitude value from the specified coordinate.
+ /// Creates a polyline instance from the provided read-only span of characters.
///
- /// The coordinate from which to extract the longitude.
+ /// A containing the encoded polyline characters.
///
- /// The longitude value as a .
+ /// An instance of representing the encoded polyline.
///
[MethodImpl(MethodImplOptions.AggressiveInlining)]
- protected abstract double GetLongitude(TCoordinate current);
+ protected abstract TPolyline CreatePolyline(ReadOnlySpan polyline);
///
- /// Extracts the latitude value from the specified coordinate.
+ /// Writes the field values of the specified item into the polyline encoding pipeline.
///
- /// The coordinate from which to extract the latitude.
- ///
- /// The latitude value as a .
- ///
+ /// The item whose field values are to be encoded.
+ ///
+ /// The cursor provided by the engine. Call
+ /// once for each field value, in a fixed, consistent order. The engine handles delta computation,
+ /// zigzag encoding, and output buffering.
+ ///
+ ///
+ /// The per-field delta accumulation state array, allocated by the base class for the duration of
+ /// the call. Index into this array in the same fixed order used for each field
+ /// (e.g. states[0] for latitude, states[1] for longitude).
+ ///
+ ///
+ /// Implementations must always call the same number of times,
+ /// in the same field order, for every item. The number of calls must match .
+ /// The corresponding override must call the
+ /// same number of times in the same order.
+ ///
[MethodImpl(MethodImplOptions.AggressiveInlining)]
- protected abstract double GetLatitude(TCoordinate current);
+ protected abstract void Write(TCoordinate item, ref PolylineWriter writer, PolylineValueState[] states);
}
-
diff --git a/src/PolylineAlgorithm/Internal/CoordinateDelta.cs b/src/PolylineAlgorithm/Internal/CoordinateDelta.cs
deleted file mode 100644
index ae217c57..00000000
--- a/src/PolylineAlgorithm/Internal/CoordinateDelta.cs
+++ /dev/null
@@ -1,72 +0,0 @@
-//
-// Copyright © Pete Sramek. All rights reserved.
-// Licensed under the MIT License. See LICENSE file in the project root for full license information.
-//
-
-namespace PolylineAlgorithm.Internal;
-
-using System.Diagnostics;
-using System.Runtime.InteropServices;
-
-///
-/// Represents the difference (delta) in latitude and longitude between consecutive geographic coordinates.
-///
-///
-/// This struct computes and stores the change in coordinate values as integer deltas between successive coordinates.
-///
-[DebuggerDisplay("{ToString(),nq}")]
-[StructLayout(LayoutKind.Auto)]
-internal struct CoordinateDelta {
- private (int Latitude, int Longitude) _current;
-
- ///
- /// Initializes a new instance of the struct with the default latitude and longitude deltas.
- ///
- public CoordinateDelta() {
- _current = (default, default);
- }
-
- ///
- /// Gets the current delta in latitude between the most recent and previous coordinate.
- ///
- public int Latitude { get; private set; }
-
- ///
- /// Gets the current delta in longitude between the most recent and previous coordinate.
- ///
- public int Longitude { get; private set; }
-
- ///
- /// Updates the delta values based on the next latitude and longitude, and sets the current coordinate as next delta baseline.
- ///
- /// The next latitude value.
- /// The next longitude value.
- public void Next(int latitude, int longitude) {
- Latitude = Delta(_current.Latitude, latitude);
- Longitude = Delta(_current.Longitude, longitude);
-
- _current.Latitude = latitude;
- _current.Longitude = longitude;
- }
-
- ///
- /// Calculates the delta between two coordinate values.
- ///
- ///
- /// This method computes the difference between two integer coordinate values, handling cases where the values may be positive or negative.
- ///
- /// The previous coordinate value.
- /// The next coordinate value.
- /// The computed delta between and .
- private static int Delta(int initial, int next) => next - initial;
-
- ///
- /// Returns a string representation of the current coordinate delta.
- ///
- ///
- /// A string in the format { Coordinate: { Latitude: [int], Longitude: [int] }, Delta: { Latitude: [int], Longitude: [int] } } representing the current coordinate and deltas to previous coordinate.
- ///
- public override readonly string ToString() =>
- $"{{ Coordinate: {{ Latitude: {_current.Latitude}, Longitude: {_current.Longitude} }}, " +
- $"Delta: {{ Latitude: {Latitude}, Longitude: {Longitude} }} }}";
-}
\ No newline at end of file
diff --git a/src/PolylineAlgorithm/Internal/Diagnostics/ExceptionGuard.cs b/src/PolylineAlgorithm/Internal/Diagnostics/ExceptionGuard.cs
index 208584ee..919a5367 100644
--- a/src/PolylineAlgorithm/Internal/Diagnostics/ExceptionGuard.cs
+++ b/src/PolylineAlgorithm/Internal/Diagnostics/ExceptionGuard.cs
@@ -86,21 +86,6 @@ internal static void ThrowCoordinateValueOutOfRange(double value, double min, do
throw new ArgumentOutOfRangeException(paramName, ExceptionMessage.FormatCoordinateValueMustBeBetween(paramName, min, max));
}
- ///
- /// Throws an when a stack allocation limit is below the required minimum.
- ///
- /// Minimum required stack allocation limit.
- /// Name of the parameter representing the limit.
-#if NET6_0_OR_GREATER
- [StackTraceHidden]
-#else
- [MethodImpl(MethodImplOptions.NoInlining)]
-#endif
- [DoesNotReturn]
- internal static void StackAllocLimitMustBeEqualOrGreaterThan(int minValue, string paramName) {
- throw new ArgumentOutOfRangeException(paramName, ExceptionMessage.FormatStackAllocLimitMustBeEqualOrGreaterThan(minValue));
- }
-
///
/// Throws an when an enumeration argument is empty but must contain at least one element.
///
@@ -226,7 +211,6 @@ internal static void ThrowInvalidPolylineBlockTerminator() {
[SuppressMessage("Style", "IDE1006:Naming Styles", Justification = "Internal use only.")]
internal static class ExceptionMessage {
#if NET8_0_OR_GREATER
- private static readonly CompositeFormat StackAllocLimitMustBeEqualOrGreaterThanFormat = CompositeFormat.Parse(ExceptionMessageResource.StackAllocLimitMustBeEqualOrGreaterThanFormat);
private static readonly CompositeFormat PolylineCannotBeShorterThanFormat = CompositeFormat.Parse(ExceptionMessageResource.PolylineCannotBeShorterThanFormat);
private static readonly CompositeFormat PolylineIsMalformedAtFormat = CompositeFormat.Parse(ExceptionMessageResource.PolylineIsMalformedAtFormat);
private static readonly CompositeFormat CoordinateValueMustBeBetweenFormat = CompositeFormat.Parse(ExceptionMessageResource.CoordinateValueMustBeBetweenValuesFormat);
@@ -235,7 +219,6 @@ internal static class ExceptionMessage {
private static readonly CompositeFormat DestinationArrayLengthMustBeEqualOrGreaterThanPolylineLengthFormat = CompositeFormat.Parse(ExceptionMessageResource.DestinationArrayLengthMustBeEqualOrGreaterThanPolylineLengthFormat);
private static readonly CompositeFormat InvalidPolylineLengthFormat = CompositeFormat.Parse(ExceptionMessageResource.InvalidPolylineLengthFormat);
#else
- private static readonly string StackAllocLimitMustBeEqualOrGreaterThanFormat = ExceptionMessageResource.StackAllocLimitMustBeEqualOrGreaterThanFormat;
private static readonly string PolylineCannotBeShorterThanFormat = ExceptionMessageResource.PolylineCannotBeShorterThanFormat;
private static readonly string PolylineIsMalformedAtFormat = ExceptionMessageResource.PolylineIsMalformedAtFormat;
private static readonly string CoordinateValueMustBeBetweenFormat = ExceptionMessageResource.CoordinateValueMustBeBetweenValuesFormat;
@@ -250,12 +233,6 @@ internal static class ExceptionMessage {
private static readonly string CouldNotWriteEncodedValueToTheBufferMessage = ExceptionMessageResource.CouldNotWriteEncodedValueToTheBufferMessage;
private static readonly string InvalidPolylineBlockTerminatorMessage = ExceptionMessageResource.InvalidPolylineBlockTerminatorMessage;
- ///
- /// Formats the message for stack allocation limit violations.
- ///
- internal static string FormatStackAllocLimitMustBeEqualOrGreaterThan(int minValue) =>
- string.Format(CultureInfo.InvariantCulture, StackAllocLimitMustBeEqualOrGreaterThanFormat, minValue);
-
///
/// Formats the message when a polyline is shorter than the required minimum.
///
diff --git a/src/PolylineAlgorithm/Internal/Diagnostics/LogDebugExtensions.cs b/src/PolylineAlgorithm/Internal/Diagnostics/LogDebugExtensions.cs
index cc58c702..1b21e2ae 100644
--- a/src/PolylineAlgorithm/Internal/Diagnostics/LogDebugExtensions.cs
+++ b/src/PolylineAlgorithm/Internal/Diagnostics/LogDebugExtensions.cs
@@ -46,12 +46,11 @@ internal static partial class LogDebugExtensions {
internal static partial void LogOperationFinishedDebug(this ILogger logger, string operationName);
///
- /// Logs a debug message containing the decoded coordinate values and position.
+ /// Logs a debug message containing the count of decoded values and the current position in the buffer.
///
/// The used to write the log entry.
- /// The decoded latitude value.
- /// The decoded longitude value.
- /// The position in the polyline buffer at which the coordinate was decoded.
- [LoggerMessage(EVENT_ID_BASE + 4, LOG_LEVEL, "Decoded coordinate: (Latitude: {latitude}, Longitude: {longitude}) at position {position}.")]
- internal static partial void LogDecodedCoordinateDebug(this ILogger logger, double latitude, double longitude, int position);
+ /// The number of values decoded for the current item.
+ /// The position in the polyline buffer at which the item was decoded.
+ [LoggerMessage(EVENT_ID_BASE + 4, LOG_LEVEL, "Decoded item with {valuesCount} values at position {position}.")]
+ internal static partial void LogDecodedItemDebug(this ILogger logger, int valuesCount, int position);
}
diff --git a/src/PolylineAlgorithm/Internal/PolylineReader.cs b/src/PolylineAlgorithm/Internal/PolylineReader.cs
new file mode 100644
index 00000000..bc37195a
--- /dev/null
+++ b/src/PolylineAlgorithm/Internal/PolylineReader.cs
@@ -0,0 +1,56 @@
+//
+// Copyright © Pete Sramek. All rights reserved.
+// Licensed under the MIT License. See LICENSE file in the project root for full license information.
+//
+
+namespace PolylineAlgorithm.Internal;
+
+using PolylineAlgorithm.Internal.Diagnostics;
+using System.Runtime.CompilerServices;
+
+///
+/// Engine-owned stateful cursor that delivers decoded field values to a formatter during polyline decoding.
+///
+///
+/// The reader wraps the raw encoded character sequence and applies the full decoding pipeline
+/// (ASCII shift reversal, un-zigzag, per-slot delta accumulation) on each call.
+/// The engine calls before invoking the formatter for each item so that the
+/// slot index resets correctly while delta state is preserved across item boundaries.
+///
+public sealed class PolylineReader {
+ private readonly ReadOnlyMemory _sequence;
+ private int _position;
+ private readonly uint _precision;
+
+ internal PolylineReader(ReadOnlyMemory sequence, uint precision) {
+ _sequence = sequence;
+ _precision = precision;
+ _position = 0;
+ }
+
+ ///
+ /// Reads and returns the next decoded field value from the polyline sequence.
+ ///
+ ///
+ /// Thrown when the data runs out before the formatter has finished reading an item's fields.
+ ///
+ public double Read(ref PolylineValueState state) {
+ if (!PolylineEncoding.TryReadValue(ref state._value, _sequence, ref _position)) {
+ ExceptionGuard.ThrowInvalidPolylineFormat(_position);
+ }
+
+ double result = PolylineEncoding.Denormalize(state._value, _precision);
+
+ return result;
+ }
+
+ ///
+ /// Gets the current character position in the encoded sequence.
+ ///
+ internal int Position => _position;
+
+ ///
+ /// Returns when all encoded characters have been consumed.
+ ///
+ internal bool IsEmpty => _position >= _sequence.Length;
+}
diff --git a/src/PolylineAlgorithm/Internal/PolylineValueState.cs b/src/PolylineAlgorithm/Internal/PolylineValueState.cs
new file mode 100644
index 00000000..c4467056
--- /dev/null
+++ b/src/PolylineAlgorithm/Internal/PolylineValueState.cs
@@ -0,0 +1,25 @@
+//
+// Copyright © Pete Sramek. All rights reserved.
+// Licensed under the MIT License. See LICENSE file in the project root for full license information.
+//
+
+namespace PolylineAlgorithm.Internal;
+
+///
+/// Holds the per-field delta accumulation state for polyline encoding and decoding.
+///
+///
+/// Instances are owned by caller-provided encoder/decoder subclasses as private fields — one per
+/// encoded field (e.g. latitude, longitude). The engine mutates the state on every
+/// or call via an
+/// reference, while the public property lets callers
+/// read the current accumulated value (e.g. for diagnostics or logging) without being able to write it.
+///
+public struct PolylineValueState {
+ internal int _value;
+
+ ///
+ /// Gets the current accumulated normalized integer value.
+ ///
+ public readonly int Value => _value;
+}
diff --git a/src/PolylineAlgorithm/Internal/PolylineWriter.cs b/src/PolylineAlgorithm/Internal/PolylineWriter.cs
new file mode 100644
index 00000000..f7334cd7
--- /dev/null
+++ b/src/PolylineAlgorithm/Internal/PolylineWriter.cs
@@ -0,0 +1,52 @@
+//
+// Copyright © Pete Sramek. All rights reserved.
+// Licensed under the MIT License. See LICENSE file in the project root for full license information.
+//
+
+namespace PolylineAlgorithm.Internal;
+
+using PolylineAlgorithm.Internal.Diagnostics;
+using System;
+using System.Runtime.CompilerServices;
+
+///
+/// Engine-owned stateful cursor that feeds values written by a formatter into the polyline encoding pipeline.
+///
+///
+/// Each instance wraps a caller-provided buffer sized to the worst-case maximum
+/// capacity so that the buffer never needs to grow. The buffer may be stack-allocated or rented from
+/// ; the engine calls before
+/// invoking the formatter for each item so that the slot index resets correctly while delta state is
+/// preserved across item boundaries.
+///
+public ref struct PolylineWriter {
+ private Span _buffer;
+ private int _position;
+ private readonly uint _precision;
+
+ internal PolylineWriter(Span buffer, uint precision) {
+ _buffer = buffer;
+ _precision = precision;
+ _position = 0;
+ }
+
+ ///
+ /// Emits one field value into the encoding pipeline.
+ ///
+ public void Write(double value, ref PolylineValueState state) {
+ int normalized = PolylineEncoding.Normalize(value, _precision);
+
+ int delta = normalized - state._value;
+
+ state._value = normalized;
+
+ if (!PolylineEncoding.TryWriteValue(delta, _buffer, ref _position)) {
+ ExceptionGuard.ThrowCouldNotWriteEncodedValueToBuffer();
+ }
+ }
+
+ ///
+ /// Returns the encoded polyline characters written so far.
+ ///
+ internal ReadOnlySpan WrittenSpan => _buffer[.._position];
+}
diff --git a/src/PolylineAlgorithm/PolylineAlgorithm.csproj b/src/PolylineAlgorithm/PolylineAlgorithm.csproj
index 907a2a15..5d6777d8 100644
--- a/src/PolylineAlgorithm/PolylineAlgorithm.csproj
+++ b/src/PolylineAlgorithm/PolylineAlgorithm.csproj
@@ -2,6 +2,7 @@
netstandard2.1
+ true
diff --git a/src/PolylineAlgorithm/PolylineEncoding.cs b/src/PolylineAlgorithm/PolylineEncoding.cs
index 3d6de5e7..afc55b08 100644
--- a/src/PolylineAlgorithm/PolylineEncoding.cs
+++ b/src/PolylineAlgorithm/PolylineEncoding.cs
@@ -10,6 +10,7 @@ namespace PolylineAlgorithm;
using System;
using System.Numerics;
+using System.Runtime.CompilerServices;
using System.Runtime.InteropServices;
///
@@ -389,35 +390,43 @@ public static void ValidateFormat(ReadOnlySpan polyline) {
///
/// Thrown when an invalid character is found in the polyline segment.
///
- public static void ValidateCharRange(ReadOnlySpan polyline) {
+ public static unsafe void ValidateCharRange(ReadOnlySpan polyline) {
int length = polyline.Length;
- int vectorSize = Vector.Count;
-
- int i = 0;
- for (; i <= length - vectorSize; i += vectorSize) {
- var span = MemoryMarshal.Cast(polyline.Slice(i, vectorSize));
-#if NET5_0_OR_GREATER
- var chars = new Vector(span);
-#else
- var chars = new Vector(span.ToArray());
-#endif
- var belowMin = Vector.LessThan(chars, MinVector);
- var aboveMax = Vector.GreaterThan(chars, MaxVector);
- if (Vector.BitwiseOr(belowMin, aboveMax) != Vector.Zero) {
- // Fallback to scalar check for this block
- for (int j = 0; j < vectorSize; j++) {
- char character = polyline[i + j];
- if (character < Min || character > Max) {
- ExceptionGuard.ThrowInvalidPolylineCharacter(character, i + j);
+ int vecSize = Vector.Count;
+
+ fixed (char* p = polyline) {
+ ushort* up = (ushort*)p;
+
+ int i = 0;
+
+ // SIMD loop
+ for (; i <= length - vecSize; i += vecSize) {
+ // Load vector directly without allocations
+ var vec = Unsafe.Read>(up + i);
+
+ var belowMin = Vector.LessThan(vec, MinVector);
+ var aboveMax = Vector.GreaterThan(vec, MaxVector);
+
+ var invalid = Vector.BitwiseOr(belowMin, aboveMax);
+
+ if (!Vector.EqualsAll(invalid, Vector.Zero)) {
+ // Fallback to scalar for this block
+ for (int j = 0; j < vecSize; j++) {
+ ushort ch = up[i + j];
+ if (ch < Min || ch > Max) {
+ ExceptionGuard.ThrowInvalidPolylineCharacter((char)ch, i + j);
+ }
}
}
}
- }
- for (; i < length; i++) {
- char character = polyline[i];
- if (character < Min || character > Max) {
- ExceptionGuard.ThrowInvalidPolylineCharacter(character, i);
+ // Tail
+ for (; i < length; i++) {
+ ushort ch = up[i];
+
+ if (ch < Min || ch > Max) {
+ ExceptionGuard.ThrowInvalidPolylineCharacter((char)ch, i);
+ }
}
}
}
@@ -436,24 +445,32 @@ public static void ValidateCharRange(ReadOnlySpan polyline) {
/// Thrown when a block exceeds 7 characters or the polyline does not end with a valid block terminator.
///
public static void ValidateBlockLength(ReadOnlySpan polyline) {
+ const int MaxBlockLen = Defaults.Polyline.Block.Length.Max;
+
int blockLen = 0;
- bool foundBlockEnd = false;
+ bool foundEnd = false;
for (int i = 0; i < polyline.Length; i++) {
blockLen++;
- if (polyline[i] < End) {
- foundBlockEnd = true;
- if (blockLen > Defaults.Polyline.Block.Length.Max) {
+ if (polyline[i] >= End) {
+ if (blockLen > MaxBlockLen) {
ExceptionGuard.ThrowPolylineBlockTooLong(i - blockLen + 1);
}
- blockLen = 0;
- } else {
- foundBlockEnd = false;
+
+ foundEnd = false;
+ continue;
}
+
+ if (blockLen > MaxBlockLen) {
+ ExceptionGuard.ThrowPolylineBlockTooLong(i - blockLen + 1);
+ }
+
+ blockLen = 0;
+ foundEnd = true;
}
- if (!foundBlockEnd) {
+ if (!foundEnd) {
ExceptionGuard.ThrowInvalidPolylineBlockTerminator();
}
}
diff --git a/src/PolylineAlgorithm/PolylineEncodingOptions.cs b/src/PolylineAlgorithm/PolylineEncodingOptions.cs
index e99843de..63ffadbe 100644
--- a/src/PolylineAlgorithm/PolylineEncodingOptions.cs
+++ b/src/PolylineAlgorithm/PolylineEncodingOptions.cs
@@ -19,14 +19,13 @@ namespace PolylineAlgorithm;
///
///
/// - The level for coordinate encoding
-/// - The for memory allocation strategy
/// - The for diagnostic logging
///
///
/// All properties have internal setters and should be configured through a builder or factory pattern.
///
///
-[DebuggerDisplay("StackAllocLimit: {StackAllocLimit}, Precision: {Precision}, LoggerFactoryType: {GetLoggerFactoryType()}")]
+[DebuggerDisplay("Precision: {Precision}, LoggerFactoryType: {GetLoggerFactoryType()}")]
public sealed class PolylineEncodingOptions {
///
/// Gets the logger factory used for diagnostic logging during encoding operations.
@@ -59,19 +58,6 @@ public sealed class PolylineEncodingOptions {
///
public uint Precision { get; internal set; } = 5;
- ///
- /// Gets the maximum buffer size (in characters) that can be allocated on the stack for encoding operations.
- ///
- ///
- /// The maximum number of characters for stack allocation using stackalloc char[]. Defaults to 512.
- ///
- ///
- /// When the required buffer size for encoding exceeds this limit, memory will be allocated on the heap instead of the stack.
- /// This setting specifically applies to stack allocation of character arrays (stackalloc char[]) used during polyline encoding,
- /// balancing performance and stack safety.
- ///
- public int StackAllocLimit { get; internal set; } = 512;
-
///
/// Returns the type name of the logger factory for debugging purposes.
///
diff --git a/src/PolylineAlgorithm/PolylineEncodingOptionsBuilder.cs b/src/PolylineAlgorithm/PolylineEncodingOptionsBuilder.cs
index 4258beca..21e41c1e 100644
--- a/src/PolylineAlgorithm/PolylineEncodingOptionsBuilder.cs
+++ b/src/PolylineAlgorithm/PolylineEncodingOptionsBuilder.cs
@@ -7,14 +7,12 @@ namespace PolylineAlgorithm;
using Microsoft.Extensions.Logging;
using Microsoft.Extensions.Logging.Abstractions;
-using PolylineAlgorithm.Internal.Diagnostics;
///
/// Provides a builder for configuring options for polyline encoding operations.
///
public sealed class PolylineEncodingOptionsBuilder {
private uint _precision = 5;
- private int _stackAllocLimit = 512;
private ILoggerFactory _loggerFactory = NullLoggerFactory.Instance;
private PolylineEncodingOptionsBuilder() { }
@@ -38,38 +36,10 @@ public static PolylineEncodingOptionsBuilder Create() {
public PolylineEncodingOptions Build() {
return new PolylineEncodingOptions {
Precision = _precision,
- StackAllocLimit = _stackAllocLimit,
LoggerFactory = _loggerFactory,
};
}
- ///
- /// Configures the buffer size used for stack allocation during polyline encoding operations.
- ///
- ///
- /// The maximum buffer size to use for stack allocation. Must be greater than or equal to 1.
- ///
- ///
- /// The current instance for method chaining.
- ///
- ///
- /// Thrown if is less than 1.
- ///
- ///
- /// This method allows customization of the internal buffer size for encoding, which can impact performance and memory usage.
- ///
- public PolylineEncodingOptionsBuilder WithStackAllocLimit(int stackAllocLimit) {
- const int minStackAllocLimit = 1;
-
- if (minStackAllocLimit > stackAllocLimit) {
- ExceptionGuard.StackAllocLimitMustBeEqualOrGreaterThan(minStackAllocLimit, nameof(stackAllocLimit));
- }
-
- _stackAllocLimit = stackAllocLimit;
-
- return this;
- }
-
///
/// Sets the coordinate encoding precision.
///
diff --git a/src/PolylineAlgorithm/Properties/ExceptionMessageResource.Designer.cs b/src/PolylineAlgorithm/Properties/ExceptionMessageResource.Designer.cs
index 0c73cce3..773fa473 100644
--- a/src/PolylineAlgorithm/Properties/ExceptionMessageResource.Designer.cs
+++ b/src/PolylineAlgorithm/Properties/ExceptionMessageResource.Designer.cs
@@ -159,13 +159,5 @@ internal static string PolylineIsMalformedAtFormat {
}
}
- ///
- /// Looks up a localized string similar to Stack alloc limit must be equal or greater than {0}..
- ///
- internal static string StackAllocLimitMustBeEqualOrGreaterThanFormat {
- get {
- return ResourceManager.GetString("StackAllocLimitMustBeEqualOrGreaterThanFormat", resourceCulture);
- }
- }
}
}
diff --git a/src/PolylineAlgorithm/Properties/ExceptionMessageResource.resx b/src/PolylineAlgorithm/Properties/ExceptionMessageResource.resx
index 9ec92bf4..4e0f71d3 100644
--- a/src/PolylineAlgorithm/Properties/ExceptionMessageResource.resx
+++ b/src/PolylineAlgorithm/Properties/ExceptionMessageResource.resx
@@ -129,9 +129,6 @@
Value must be a finite number.
-
- Stack alloc limit must be equal or greater than {0}.
-
Destination array length {0} must be greater than the polyline length {1}.
diff --git a/src/PolylineAlgorithm/PublicAPI.Unshipped.txt b/src/PolylineAlgorithm/PublicAPI.Unshipped.txt
index 7dc5c581..98a5e689 100644
--- a/src/PolylineAlgorithm/PublicAPI.Unshipped.txt
+++ b/src/PolylineAlgorithm/PublicAPI.Unshipped.txt
@@ -1 +1,10 @@
#nullable enable
+PolylineAlgorithm.Internal.PolylineValueState
+PolylineAlgorithm.Internal.PolylineValueState.PolylineValueState() -> void
+PolylineAlgorithm.Internal.PolylineValueState.Value.get -> int
+PolylineAlgorithm.Internal.PolylineReader.Read(ref PolylineAlgorithm.Internal.PolylineValueState state) -> double
+PolylineAlgorithm.Internal.PolylineWriter.Write(double value, ref PolylineAlgorithm.Internal.PolylineValueState state) -> void
+abstract PolylineAlgorithm.Abstraction.AbstractPolylineDecoder.ValuesPerItem.get -> int
+abstract PolylineAlgorithm.Abstraction.AbstractPolylineDecoder.Read(PolylineAlgorithm.Internal.PolylineReader! reader, PolylineAlgorithm.Internal.PolylineValueState[]! states) -> TCoordinate
+abstract PolylineAlgorithm.Abstraction.AbstractPolylineEncoder.ValuesPerItem.get -> int
+abstract PolylineAlgorithm.Abstraction.AbstractPolylineEncoder.Write(TCoordinate item, ref PolylineAlgorithm.Internal.PolylineWriter writer, PolylineAlgorithm.Internal.PolylineValueState[]! states) -> void
diff --git a/src/PolylineAlgorithm/README.md b/src/PolylineAlgorithm/README.md
index 97c4bb98..7abf9766 100644
--- a/src/PolylineAlgorithm/README.md
+++ b/src/PolylineAlgorithm/README.md
@@ -38,11 +38,16 @@ The library provides abstract base classes to build your own encoder and decoder
```csharp
using PolylineAlgorithm;
using PolylineAlgorithm.Abstraction;
+using PolylineAlgorithm.Internal;
public sealed class MyPolylineEncoder : AbstractPolylineEncoder<(double Latitude, double Longitude), string> {
- protected override double GetLatitude((double Latitude, double Longitude) coordinate) => coordinate.Latitude;
- protected override double GetLongitude((double Latitude, double Longitude) coordinate) => coordinate.Longitude;
- protected override string CreatePolyline(ReadOnlyMemory polyline) => polyline.ToString();
+ protected override int ValuesPerItem => 2;
+
+ protected override void Write((double Latitude, double Longitude) item, ref PolylineWriter writer, PolylineValueState[] states) {
+ writer.Write(item.Latitude, ref states[0]); // field 0
+ writer.Write(item.Longitude, ref states[1]); // field 1
+ }
+ protected override string CreatePolyline(ReadOnlySpan polyline) => polyline.ToString();
}
```
@@ -69,9 +74,13 @@ Console.WriteLine(encoded);
```csharp
using PolylineAlgorithm;
using PolylineAlgorithm.Abstraction;
+using PolylineAlgorithm.Internal;
public sealed class MyPolylineDecoder : AbstractPolylineDecoder {
- protected override (double Latitude, double Longitude) CreateCoordinate(double latitude, double longitude) => (latitude, longitude);
+ protected override int ValuesPerItem => 2;
+
+ protected override (double Latitude, double Longitude) Read(PolylineReader reader, PolylineValueState[] states) =>
+ (reader.Read(ref states[0]), reader.Read(ref states[1])); // field 0, field 1
protected override ReadOnlyMemory GetReadOnlyMemory(in string polyline) => polyline.AsMemory();
}
```
@@ -94,7 +103,6 @@ using Microsoft.Extensions.Logging;
PolylineEncodingOptions options = PolylineEncodingOptionsBuilder.Create()
.WithPrecision(6) // 6 decimal places instead of the default 5
- .WithStackAllocLimit(1024) // increase stack-alloc buffer
.WithLoggerFactory(loggerFactory) // plug in your ILoggerFactory
.Build();
diff --git a/tests/PolylineAlgorithm.Tests/Abstraction/AbstractPolylineDecoderTests.cs b/tests/PolylineAlgorithm.Tests/Abstraction/AbstractPolylineDecoderTests.cs
index c6734c6c..338f1643 100644
--- a/tests/PolylineAlgorithm.Tests/Abstraction/AbstractPolylineDecoderTests.cs
+++ b/tests/PolylineAlgorithm.Tests/Abstraction/AbstractPolylineDecoderTests.cs
@@ -6,6 +6,7 @@
namespace PolylineAlgorithm.Tests.Abstraction;
using PolylineAlgorithm.Abstraction;
+using PolylineAlgorithm.Internal;
using PolylineAlgorithm.Utility;
using System;
using System.Collections.Generic;
@@ -16,16 +17,20 @@ namespace PolylineAlgorithm.Tests.Abstraction;
[TestClass]
public sealed class AbstractPolylineDecoderTests {
private sealed class TestStringDecoder : AbstractPolylineDecoder {
+ protected override int ValuesPerItem => 2;
protected override ReadOnlyMemory GetReadOnlyMemory(in string polyline) => polyline.AsMemory();
- protected override (double Latitude, double Longitude) CreateCoordinate(double latitude, double longitude) => (latitude, longitude);
+ protected override (double Latitude, double Longitude) Read(PolylineReader reader, PolylineValueState[] states) =>
+ (reader.Read(ref states[0]), reader.Read(ref states[1]));
}
private sealed class TestStringDecoderWithOptions : AbstractPolylineDecoder {
public TestStringDecoderWithOptions(PolylineEncodingOptions options)
: base(options) { }
+ protected override int ValuesPerItem => 2;
protected override ReadOnlyMemory GetReadOnlyMemory(in string polyline) => polyline.AsMemory();
- protected override (double Latitude, double Longitude) CreateCoordinate(double latitude, double longitude) => (latitude, longitude);
+ protected override (double Latitude, double Longitude) Read(PolylineReader reader, PolylineValueState[] states) =>
+ (reader.Read(ref states[0]), reader.Read(ref states[1]));
}
///
diff --git a/tests/PolylineAlgorithm.Tests/Abstraction/AbstractPolylineEncoderTests.cs b/tests/PolylineAlgorithm.Tests/Abstraction/AbstractPolylineEncoderTests.cs
index f537dda2..839166bc 100644
--- a/tests/PolylineAlgorithm.Tests/Abstraction/AbstractPolylineEncoderTests.cs
+++ b/tests/PolylineAlgorithm.Tests/Abstraction/AbstractPolylineEncoderTests.cs
@@ -6,6 +6,7 @@
namespace PolylineAlgorithm.Tests.Abstraction;
using PolylineAlgorithm.Abstraction;
+using PolylineAlgorithm.Internal;
using PolylineAlgorithm.Utility;
using System;
@@ -21,9 +22,12 @@ public TestStringEncoder()
public TestStringEncoder(PolylineEncodingOptions options)
: base(options) { }
- protected override string CreatePolyline(ReadOnlyMemory polyline) => polyline.ToString();
- protected override double GetLatitude((double Latitude, double Longitude) current) => current.Latitude;
- protected override double GetLongitude((double Latitude, double Longitude) current) => current.Longitude;
+ protected override int ValuesPerItem => 2;
+ protected override string CreatePolyline(ReadOnlySpan polyline) => polyline.ToString();
+ protected override void Write((double Latitude, double Longitude) item, ref PolylineWriter writer, PolylineValueState[] states) {
+ writer.Write(item.Latitude, ref states[0]);
+ writer.Write(item.Longitude, ref states[1]);
+ }
}
///
@@ -38,7 +42,6 @@ public void Constructor_With_Default_Options_Creates_Instance() {
Assert.IsNotNull(encoder);
Assert.IsNotNull(encoder.Options);
Assert.AreEqual(5u, encoder.Options.Precision);
- Assert.AreEqual(512, encoder.Options.StackAllocLimit);
}
///
@@ -130,14 +133,12 @@ public void Encode_With_Pre_Cancelled_Token_Throws_OperationCanceledException()
}
///
- /// Tests that Encode still produces the correct result when the buffer exceeds the stack allocation
- /// limit, forcing heap allocation via .
+ /// Tests that Encode produces the correct result for a standard set of coordinates.
///
[TestMethod]
public void Encode_With_Small_Stack_Alloc_Limit_Uses_Heap_Allocation_And_Produces_Correct_Result() {
- // Arrange — force heap path by making stackAllocLimit smaller than any real encoding needs
+ // Arrange
PolylineEncodingOptions options = PolylineEncodingOptionsBuilder.Create()
- .WithStackAllocLimit(1)
.Build();
TestStringEncoder encoder = new(options);
(double Latitude, double Longitude)[] coordinates = [.. StaticValueProvider.Valid.GetCoordinates()];
diff --git a/tests/PolylineAlgorithm.Tests/Extensions/PolylineDecoderExtensionsTests.cs b/tests/PolylineAlgorithm.Tests/Extensions/PolylineDecoderExtensionsTests.cs
index c44c914d..a444cc56 100644
--- a/tests/PolylineAlgorithm.Tests/Extensions/PolylineDecoderExtensionsTests.cs
+++ b/tests/PolylineAlgorithm.Tests/Extensions/PolylineDecoderExtensionsTests.cs
@@ -7,6 +7,7 @@ namespace PolylineAlgorithm.Tests.Extensions;
using PolylineAlgorithm.Abstraction;
using PolylineAlgorithm.Extensions;
+using PolylineAlgorithm.Internal;
using PolylineAlgorithm.Utility;
using System;
using System.Collections.Generic;
@@ -17,13 +18,17 @@ namespace PolylineAlgorithm.Tests.Extensions;
[TestClass]
public sealed class PolylineDecoderExtensionsTests {
private sealed class TestStringDecoder : AbstractPolylineDecoder {
+ protected override int ValuesPerItem => 2;
protected override ReadOnlyMemory GetReadOnlyMemory(in string polyline) => polyline.AsMemory();
- protected override (double Latitude, double Longitude) CreateCoordinate(double latitude, double longitude) => (latitude, longitude);
+ protected override (double Latitude, double Longitude) Read(PolylineReader reader, PolylineValueState[] states) =>
+ (reader.Read(ref states[0]), reader.Read(ref states[1]));
}
private sealed class TestMemoryDecoder : AbstractPolylineDecoder, (double Latitude, double Longitude)> {
+ protected override int ValuesPerItem => 2;
protected override ReadOnlyMemory GetReadOnlyMemory(in ReadOnlyMemory polyline) => polyline;
- protected override (double Latitude, double Longitude) CreateCoordinate(double latitude, double longitude) => (latitude, longitude);
+ protected override (double Latitude, double Longitude) Read(PolylineReader reader, PolylineValueState[] states) =>
+ (reader.Read(ref states[0]), reader.Read(ref states[1]));
}
// ----- Decode(char[]) for IPolylineDecoder -----
diff --git a/tests/PolylineAlgorithm.Tests/Extensions/PolylineEncoderExtensionsTests.cs b/tests/PolylineAlgorithm.Tests/Extensions/PolylineEncoderExtensionsTests.cs
index da8a622e..e006b254 100644
--- a/tests/PolylineAlgorithm.Tests/Extensions/PolylineEncoderExtensionsTests.cs
+++ b/tests/PolylineAlgorithm.Tests/Extensions/PolylineEncoderExtensionsTests.cs
@@ -7,6 +7,7 @@ namespace PolylineAlgorithm.Tests.Extensions;
using PolylineAlgorithm.Abstraction;
using PolylineAlgorithm.Extensions;
+using PolylineAlgorithm.Internal;
using PolylineAlgorithm.Utility;
using System;
using System.Collections.Generic;
@@ -17,9 +18,12 @@ namespace PolylineAlgorithm.Tests.Extensions;
[TestClass]
public sealed class PolylineEncoderExtensionsTests {
private sealed class TestStringEncoder : AbstractPolylineEncoder<(double Latitude, double Longitude), string> {
- protected override string CreatePolyline(ReadOnlyMemory polyline) => polyline.ToString();
- protected override double GetLatitude((double Latitude, double Longitude) current) => current.Latitude;
- protected override double GetLongitude((double Latitude, double Longitude) current) => current.Longitude;
+ protected override int ValuesPerItem => 2;
+ protected override string CreatePolyline(ReadOnlySpan polyline) => polyline.ToString();
+ protected override void Write((double Latitude, double Longitude) item, ref PolylineWriter writer, PolylineValueState[] states) {
+ writer.Write(item.Latitude, ref states[0]);
+ writer.Write(item.Longitude, ref states[1]);
+ }
}
// ----- Encode(List) -----
diff --git a/tests/PolylineAlgorithm.Tests/Internal/CoordinateDeltaTests.cs b/tests/PolylineAlgorithm.Tests/Internal/CoordinateDeltaTests.cs
deleted file mode 100644
index 1e915fe2..00000000
--- a/tests/PolylineAlgorithm.Tests/Internal/CoordinateDeltaTests.cs
+++ /dev/null
@@ -1,136 +0,0 @@
-//
-// Copyright © Pete Sramek. All rights reserved.
-// Licensed under the MIT License. See LICENSE file in the project root for full license information.
-//
-
-namespace PolylineAlgorithm.Tests.Internal;
-
-using PolylineAlgorithm.Internal;
-using System.Globalization;
-
-///
-/// Tests for .
-///
-[TestClass]
-public sealed class CoordinateDeltaTests {
- ///
- /// Tests that the default constructor initializes delta values to zero.
- ///
- [TestMethod]
- public void Constructor_Default_Initializes_Latitude_And_Longitude_To_Zero() {
- // Act
- CoordinateDelta delta = new();
-
- // Assert
- Assert.AreEqual(0, delta.Latitude);
- Assert.AreEqual(0, delta.Longitude);
- }
-
- ///
- /// Tests that a single call to Next computes the correct delta from the initial zero state.
- ///
- [TestMethod]
- [DataRow(10, 20, 10, 20)]
- [DataRow(-50, -100, -50, -100)]
- [DataRow(0, 0, 0, 0)]
- [DataRow(int.MaxValue, int.MaxValue, int.MaxValue, int.MaxValue)]
- [DataRow(int.MinValue, int.MinValue, int.MinValue, int.MinValue)]
- public void Next_Single_Call_From_Zero_Computes_Expected_Delta(int latitude, int longitude, int expectedLatitude, int expectedLongitude) {
- // Arrange
- CoordinateDelta delta = new();
-
- // Act
- delta.Next(latitude, longitude);
-
- // Assert
- Assert.AreEqual(expectedLatitude, delta.Latitude);
- Assert.AreEqual(expectedLongitude, delta.Longitude);
- }
-
- ///
- /// Tests that two consecutive calls to Next compute the delta relative to the previous value.
- ///
- [TestMethod]
- [DataRow(10, 20, 15, 30, 5, 10)]
- [DataRow(100, 200, 50, 150, -50, -50)]
- [DataRow(42, 84, 42, 84, 0, 0)]
- [DataRow(-50, 100, 25, -75, 75, -175)]
- public void Next_Sequential_Calls_Compute_Delta_From_Previous_Value(
- int firstLatitude, int firstLongitude,
- int secondLatitude, int secondLongitude,
- int expectedLatitude, int expectedLongitude) {
- // Arrange
- CoordinateDelta delta = new();
- delta.Next(firstLatitude, firstLongitude);
-
- // Act
- delta.Next(secondLatitude, secondLongitude);
-
- // Assert
- Assert.AreEqual(expectedLatitude, delta.Latitude);
- Assert.AreEqual(expectedLongitude, delta.Longitude);
- }
-
- ///
- /// Tests that ToString on a default instance returns a string containing expected structural keywords and a zero value.
- ///
- [TestMethod]
- public void ToString_With_Default_Constructor_Returns_Formatted_String_With_Zeros() {
- // Arrange
- CoordinateDelta delta = new();
-
- // Act
- string result = delta.ToString();
-
- // Assert
- Assert.IsNotNull(result);
- Assert.IsTrue(result.Contains("Coordinate", StringComparison.Ordinal));
- Assert.IsTrue(result.Contains("Delta", StringComparison.Ordinal));
- Assert.IsTrue(result.Contains("Latitude", StringComparison.Ordinal));
- Assert.IsTrue(result.Contains("Longitude", StringComparison.Ordinal));
- Assert.Contains('0', result);
- }
-
- ///
- /// Tests that ToString reflects the delta values computed by Next.
- ///
- [TestMethod]
- [DataRow(42, 84)]
- [DataRow(-100, -200)]
- [DataRow(int.MaxValue, int.MaxValue)]
- [DataRow(int.MinValue, int.MinValue)]
- public void ToString_After_Next_Contains_Expected_Values(int latitude, int longitude) {
- // Arrange
- CoordinateDelta delta = new();
- delta.Next(latitude, longitude);
-
- // Act
- string result = delta.ToString();
-
- // Assert
- Assert.IsNotNull(result);
- Assert.IsTrue(result.Contains(latitude.ToString(CultureInfo.InvariantCulture), StringComparison.Ordinal));
- Assert.IsTrue(result.Contains(longitude.ToString(CultureInfo.InvariantCulture), StringComparison.Ordinal));
- }
-
- ///
- /// Tests that ToString after multiple Next calls reflects the most recent delta values.
- ///
- [TestMethod]
- public void ToString_After_Multiple_Next_Calls_Returns_Formatted_String_With_Latest_Values() {
- // Arrange
- CoordinateDelta delta = new();
- delta.Next(10, 20);
- delta.Next(30, 50);
-
- // Act
- string result = delta.ToString();
-
- // Assert
- Assert.IsNotNull(result);
- Assert.IsTrue(result.Contains("30", StringComparison.Ordinal));
- Assert.IsTrue(result.Contains("50", StringComparison.Ordinal));
- Assert.IsTrue(result.Contains("20", StringComparison.Ordinal));
- }
-
-}
diff --git a/tests/PolylineAlgorithm.Tests/Internal/Diagnostics/ExceptionGuardTests.cs b/tests/PolylineAlgorithm.Tests/Internal/Diagnostics/ExceptionGuardTests.cs
index b49e719a..1b0701b9 100644
--- a/tests/PolylineAlgorithm.Tests/Internal/Diagnostics/ExceptionGuardTests.cs
+++ b/tests/PolylineAlgorithm.Tests/Internal/Diagnostics/ExceptionGuardTests.cs
@@ -70,21 +70,6 @@ public void ThrowCoordinateValueOutOfRange_With_Parameters_Throws_ArgumentOutOfR
Assert.IsNotNull(ex.Message);
}
- ///
- /// Tests that StackAllocLimitMustBeEqualOrGreaterThan throws ArgumentOutOfRangeException with correct parameter name.
- ///
- [TestMethod]
- public void StackAllocLimitMustBeEqualOrGreaterThan_With_Parameters_Throws_ArgumentOutOfRangeException() {
- // Arrange
- const int minValue = 10;
- const string paramName = "stackAllocLimit";
-
- // Act & Assert
- var ex = Assert.ThrowsExactly(() => ExceptionGuard.StackAllocLimitMustBeEqualOrGreaterThan(minValue, paramName));
- Assert.AreEqual(paramName, ex.ParamName);
- Assert.IsNotNull(ex.Message);
- }
-
///
/// Tests that ThrowArgumentCannotBeEmptyEnumerationMessage throws ArgumentException with correct parameter name.
///
@@ -189,22 +174,6 @@ public void ThrowInvalidPolylineBlockTerminator_Throws_InvalidPolylineException(
Assert.IsNotNull(ex.Message);
}
- ///
- /// Tests that FormatStackAllocLimitMustBeEqualOrGreaterThan returns formatted message with specified value.
- ///
- [TestMethod]
- public void FormatStackAllocLimitMustBeEqualOrGreaterThan_With_Min_Value_Returns_Formatted_Message() {
- // Arrange
- const int minValue = 10;
-
- // Act
- string result = ExceptionGuard.ExceptionMessage.FormatStackAllocLimitMustBeEqualOrGreaterThan(minValue);
-
- // Assert
- Assert.IsNotNull(result);
- Assert.IsTrue(result.Contains("10", StringComparison.Ordinal));
- }
-
///
/// Tests that FormatPolylineCannotBeShorterThan returns formatted message with specified values.
///
diff --git a/tests/PolylineAlgorithm.Tests/Internal/Diagnostics/LogDebugExtensionsTests.cs b/tests/PolylineAlgorithm.Tests/Internal/Diagnostics/LogDebugExtensionsTests.cs
index 0dff7193..2b4b7023 100644
--- a/tests/PolylineAlgorithm.Tests/Internal/Diagnostics/LogDebugExtensionsTests.cs
+++ b/tests/PolylineAlgorithm.Tests/Internal/Diagnostics/LogDebugExtensionsTests.cs
@@ -9,7 +9,6 @@ namespace PolylineAlgorithm.Tests.Internal.Diagnostics;
using PolylineAlgorithm.Internal.Diagnostics;
using System;
using System.Collections.Generic;
-using System.Globalization;
///
/// Tests for .
@@ -80,20 +79,19 @@ public void LogOperationFinishedDebug_With_Operation_Name_Logs_Finished_Message(
}
///
- /// Tests that LogDecodedCoordinateDebug WithCoordinatesAndPosition LogsDecodedCoordinateMessage.
+ /// Tests that LogDecodedItemDebug with values count and position logs a decoded item message.
///
[TestMethod]
- public void LogDecodedCoordinateDebug_With_Coordinates_And_Position_Logs_Decoded_Coordinate_Message() {
+ public void LogDecodedItemDebug_With_Values_Count_And_Position_Logs_Decoded_Item_Message() {
var logger = new TestLogger();
- const double latitude = 38.5;
- const double longitude = -120.2;
+ const int valuesCount = 2;
const int position = 42;
- logger.LogDecodedCoordinateDebug(latitude, longitude, position);
+ logger.LogDecodedItemDebug(valuesCount, position);
Assert.HasCount(1, logger.Logs);
Assert.AreEqual(LogLevel.Debug, logger.Logs[0].Level);
- Assert.Contains(string.Create(CultureInfo.InvariantCulture, $"Decoded coordinate: (Latitude: {latitude}, Longitude: {longitude}) at position {position}."), logger.Logs[0].Message, StringComparison.Ordinal);
+ Assert.Contains($"Decoded item with {valuesCount} values at position {position}.", logger.Logs[0].Message, StringComparison.Ordinal);
}
///
@@ -142,37 +140,35 @@ public void LogOperationFinishedDebug_With_Null_Operation_Name_Logs_Message() {
}
///
- /// Tests that LogDecodedCoordinateDebug WithZeroCoordinates LogsMessage.
+ /// Tests that LogDecodedItemDebug with zero count logs a message.
///
[TestMethod]
- public void LogDecodedCoordinateDebug_With_Zero_Coordinates_Logs_Message() {
+ public void LogDecodedItemDebug_With_Zero_Values_Count_Logs_Message() {
var logger = new TestLogger();
- const double latitude = 0.0;
- const double longitude = 0.0;
+ const int valuesCount = 0;
const int position = 0;
- logger.LogDecodedCoordinateDebug(latitude, longitude, position);
+ logger.LogDecodedItemDebug(valuesCount, position);
Assert.HasCount(1, logger.Logs);
Assert.AreEqual(LogLevel.Debug, logger.Logs[0].Level);
- Assert.Contains("Decoded coordinate", logger.Logs[0].Message, StringComparison.Ordinal);
+ Assert.Contains("Decoded item", logger.Logs[0].Message, StringComparison.Ordinal);
}
///
- /// Tests that LogDecodedCoordinateDebug WithNegativeCoordinates LogsMessage.
+ /// Tests that LogDecodedItemDebug with large values count logs a message.
///
[TestMethod]
- public void LogDecodedCoordinateDebug_With_Negative_Coordinates_Logs_Message() {
+ public void LogDecodedItemDebug_With_Large_Values_Count_Logs_Message() {
var logger = new TestLogger();
- const double latitude = -90.0;
- const double longitude = -180.0;
+ const int valuesCount = 10;
const int position = 100;
- logger.LogDecodedCoordinateDebug(latitude, longitude, position);
+ logger.LogDecodedItemDebug(valuesCount, position);
Assert.HasCount(1, logger.Logs);
Assert.AreEqual(LogLevel.Debug, logger.Logs[0].Level);
- Assert.Contains(string.Create(CultureInfo.InvariantCulture, $"Latitude: {latitude}, Longitude: {longitude}"), logger.Logs[0].Message, StringComparison.Ordinal);
+ Assert.Contains($"values at position {position}", logger.Logs[0].Message, StringComparison.Ordinal);
}
///
diff --git a/tests/PolylineAlgorithm.Tests/PolylineEncodingOptionsBuilderTests.cs b/tests/PolylineAlgorithm.Tests/PolylineEncodingOptionsBuilderTests.cs
index 26dafc74..9e9ff272 100644
--- a/tests/PolylineAlgorithm.Tests/PolylineEncodingOptionsBuilderTests.cs
+++ b/tests/PolylineAlgorithm.Tests/PolylineEncodingOptionsBuilderTests.cs
@@ -54,7 +54,6 @@ public void Build_With_Defaults_Returns_Options_With_Default_Values() {
// Assert
Assert.IsNotNull(result);
Assert.AreEqual(5u, result.Precision);
- Assert.AreEqual(512, result.StackAllocLimit);
Assert.IsNotNull(result.LoggerFactory);
Assert.IsInstanceOfType(result.LoggerFactory);
}
@@ -75,22 +74,6 @@ public void Build_With_Custom_Precision_Returns_Options_With_Custom_Precision()
Assert.AreEqual(7u, result.Precision);
}
- ///
- /// Tests that Build returns options with configured stack alloc limit.
- ///
- [TestMethod]
- public void Build_With_Custom_Stack_Alloc_Limit_Returns_Options_With_Custom_Stack_Alloc_Limit() {
- // Arrange
- PolylineEncodingOptionsBuilder builder = PolylineEncodingOptionsBuilder.Create()
- .WithStackAllocLimit(1024);
-
- // Act
- PolylineEncodingOptions result = builder.Build();
-
- // Assert
- Assert.AreEqual(1024, result.StackAllocLimit);
- }
-
///
/// Tests that Build returns options with configured logger factory.
///
@@ -120,7 +103,6 @@ public void Build_With_All_Custom_Values_Returns_Options_With_All_Custom_Values(
ILoggerFactory loggerFactory = LoggerFactory.Create(_ => { });
PolylineEncodingOptionsBuilder builder = PolylineEncodingOptionsBuilder.Create()
.WithPrecision(10)
- .WithStackAllocLimit(2048)
.WithLoggerFactory(loggerFactory);
// Act
@@ -128,7 +110,6 @@ public void Build_With_All_Custom_Values_Returns_Options_With_All_Custom_Values(
// Assert
Assert.AreEqual(10u, result.Precision);
- Assert.AreEqual(2048, result.StackAllocLimit);
Assert.AreSame(loggerFactory, result.LoggerFactory);
// Cleanup
@@ -151,105 +132,6 @@ public void Build_With_Multiple_Invocations_Returns_Different_Instances_With_Sam
// Assert
Assert.AreNotSame(first, second);
Assert.AreEqual(first.Precision, second.Precision);
- Assert.AreEqual(first.StackAllocLimit, second.StackAllocLimit);
- }
-
- ///
- /// Tests that WithStackAllocLimit sets the value and returns the builder.
- ///
- [TestMethod]
- public void WithStackAllocLimit_With_Valid_Value_Sets_Value_And_Returns_Self() {
- // Arrange
- PolylineEncodingOptionsBuilder builder = PolylineEncodingOptionsBuilder.Create();
-
- // Act
- PolylineEncodingOptionsBuilder result = builder.WithStackAllocLimit(256);
-
- // Assert
- Assert.AreSame(builder, result);
- PolylineEncodingOptions options = builder.Build();
- Assert.AreEqual(256, options.StackAllocLimit);
- }
-
- ///
- /// Tests that WithStackAllocLimit accepts minimum value of 1.
- ///
- [TestMethod]
- public void WithStackAllocLimit_With_Minimum_Value_Sets_Value() {
- // Arrange
- PolylineEncodingOptionsBuilder builder = PolylineEncodingOptionsBuilder.Create();
-
- // Act
- builder.WithStackAllocLimit(1);
- PolylineEncodingOptions result = builder.Build();
-
- // Assert
- Assert.AreEqual(1, result.StackAllocLimit);
- }
-
- ///
- /// Tests that WithStackAllocLimit throws ArgumentOutOfRangeException for zero.
- ///
- [TestMethod]
- public void WithStackAllocLimit_With_Zero_Throws_ArgumentOutOfRangeException() {
- // Arrange
- PolylineEncodingOptionsBuilder builder = PolylineEncodingOptionsBuilder.Create();
-
- // Act
- var exception = Assert.ThrowsExactly(() => builder.WithStackAllocLimit(0));
-
- // Assert
- Assert.AreEqual("stackAllocLimit", exception.ParamName);
- }
-
- ///
- /// Tests that WithStackAllocLimit throws ArgumentOutOfRangeException for negative value.
- ///
- [TestMethod]
- public void WithStackAllocLimit_With_Negative_Value_Throws_ArgumentOutOfRangeException() {
- // Arrange
- PolylineEncodingOptionsBuilder builder = PolylineEncodingOptionsBuilder.Create();
-
- // Act
- var exception = Assert.ThrowsExactly(() => builder.WithStackAllocLimit(-10));
-
- // Assert
- Assert.AreEqual("stackAllocLimit", exception.ParamName);
- }
-
- ///
- /// Tests that WithStackAllocLimit accepts large value.
- ///
- [TestMethod]
- public void WithStackAllocLimit_With_Large_Value_Sets_Value() {
- // Arrange
- PolylineEncodingOptionsBuilder builder = PolylineEncodingOptionsBuilder.Create();
-
- // Act
- PolylineEncodingOptions result = builder
- .WithStackAllocLimit(100000)
- .Build();
-
- // Assert
- Assert.AreEqual(100000, result.StackAllocLimit);
- }
-
- ///
- /// Tests that WithStackAllocLimit can be called multiple times.
- ///
- [TestMethod]
- public void WithStackAllocLimit_With_Multiple_Calls_Last_Value_Wins() {
- // Arrange
- PolylineEncodingOptionsBuilder builder = PolylineEncodingOptionsBuilder.Create();
-
- // Act
- PolylineEncodingOptions result = builder.WithStackAllocLimit(100)
- .WithStackAllocLimit(200)
- .WithStackAllocLimit(300)
- .Build();
-
- // Assert
- Assert.AreEqual(300, result.StackAllocLimit);
}
///
@@ -412,14 +294,12 @@ public void MethodChaining_With_All_Methods_Returns_Builder_For_Chaining() {
// Act
PolylineEncodingOptions result = PolylineEncodingOptionsBuilder.Create()
.WithPrecision(6)
- .WithStackAllocLimit(1024)
.WithLoggerFactory(loggerFactory)
.Build();
// Assert
Assert.IsNotNull(result);
Assert.AreEqual(6u, result.Precision);
- Assert.AreEqual(1024, result.StackAllocLimit);
Assert.AreSame(loggerFactory, result.LoggerFactory);
}
}
\ No newline at end of file
diff --git a/utilities/PolylineAlgorithm.Utility/RandomValueProvider.cs b/utilities/PolylineAlgorithm.Utility/RandomValueProvider.cs
index d3d83b9e..2bb44718 100644
--- a/utilities/PolylineAlgorithm.Utility/RandomValueProvider.cs
+++ b/utilities/PolylineAlgorithm.Utility/RandomValueProvider.cs
@@ -6,6 +6,7 @@
namespace PolylineAlgorithm.Utility;
using PolylineAlgorithm.Abstraction;
+using PolylineAlgorithm.Internal;
using System;
using System.Collections.Concurrent;
using System.Collections.Generic;
@@ -104,17 +105,15 @@ private readonly struct PolylineCoordinateCollectionPair(IEnumerable<(double Lat
}
private sealed class PolylineEncoder : AbstractPolylineEncoder<(double Latitude, double Longitude), string> {
+ protected override int ValuesPerItem => 2;
- protected override string CreatePolyline(ReadOnlyMemory polyline) {
+ protected override string CreatePolyline(ReadOnlySpan polyline) {
return polyline.ToString();
}
- protected override double GetLatitude((double Latitude, double Longitude) current) {
- return current.Latitude;
- }
-
- protected override double GetLongitude((double Latitude, double Longitude) current) {
- return current.Longitude;
+ protected override void Write((double Latitude, double Longitude) item, ref PolylineWriter writer, PolylineValueState[] states) {
+ writer.Write(item.Latitude, ref states[0]);
+ writer.Write(item.Longitude, ref states[1]);
}
}
}
\ No newline at end of file