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: - - -

  1. Applies zigzag encoding: left-shifts the value by 1 bit, then inverts all bits if the original value was negative
  2. Counts how many 5-bit chunks are needed to represent the encoded value
  3. 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: - -

- -
  1. - 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. -
  2. - 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