Skip to content

Commit d9d5d57

Browse files
Copilotpetesramek
andauthored
feat: make both sample projects console apps with console output
Agent-Logs-Url: https://github.com/petesramek/polyline-algorithm-csharp/sessions/32504d4d-88c9-40a1-aace-d0c432a0ef9b Co-authored-by: petesramek <2333452+petesramek@users.noreply.github.com>
1 parent bbb92f6 commit d9d5d57

10 files changed

Lines changed: 107 additions & 23 deletions

PolylineAlgorithm.slnx

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -7,6 +7,7 @@
77
</Folder>
88
<Folder Name="/samples/">
99
<Project Path="samples/PolylineAlgorithm.NetTopologySuite.Sample/PolylineAlgorithm.NetTopologySuite.Sample.csproj" Id="27a8fc47-0a3c-49c7-af5e-530514827785" />
10+
<Project Path="samples/PolylineAlgorithm.SensorData.Sample/PolylineAlgorithm.SensorData.Sample.csproj" />
1011
</Folder>
1112
<Folder Name="/src/">
1213
<Project Path="src/PolylineAlgorithm/PolylineAlgorithm.csproj" />

samples/PolylineAlgorithm.NetTopologySuite.Sample/NetTopologyPolylineDecoder.cs

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -12,7 +12,7 @@ namespace PolylineAlgorithm.NetTopologySuite.Sample;
1212
/// <summary>
1313
/// Polyline decoder using NetTopologySuite.
1414
/// </summary>
15-
public sealed class NetTopologyPolylineDecoder : AbstractPolylineDecoder<string, Point> {
15+
internal sealed class NetTopologyPolylineDecoder : AbstractPolylineDecoder<string, Point> {
1616
/// <summary>
1717
/// Creates a NetTopologySuite point from latitude and longitude.
1818
/// </summary>

samples/PolylineAlgorithm.NetTopologySuite.Sample/NetTopologyPolylineEncoder.cs

Lines changed: 3 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -11,7 +11,7 @@ namespace PolylineAlgorithm.NetTopologySuite.Sample;
1111
/// <summary>
1212
/// Polyline encoder using NetTopologySuite's Point type.
1313
/// </summary>
14-
public sealed class NetTopologyPolylineEncoder : AbstractPolylineEncoder<Point, string> {
14+
internal sealed class NetTopologyPolylineEncoder : AbstractPolylineEncoder<Point, string> {
1515
/// <summary>
1616
/// Creates encoded polyline string from memory.
1717
/// </summary>
@@ -31,9 +31,7 @@ protected override string CreatePolyline(ReadOnlyMemory<char> polyline) {
3131
/// <param name="current">Point instance.</param>
3232
/// <returns>Latitude value.</returns>
3333
protected override double GetLatitude(Point current) {
34-
if (current is null) {
35-
throw new ArgumentNullException(nameof(current));
36-
}
34+
ArgumentNullException.ThrowIfNull(current);
3735

3836
// NetTopologySuite Point: Y = latitude
3937
return current.Y;
@@ -45,9 +43,7 @@ protected override double GetLatitude(Point current) {
4543
/// <param name="current">Point instance.</param>
4644
/// <returns>Longitude value.</returns>
4745
protected override double GetLongitude(Point current) {
48-
if (current is null) {
49-
throw new ArgumentNullException(nameof(current));
50-
}
46+
ArgumentNullException.ThrowIfNull(current);
5147

5248
// NetTopologySuite Point: X = longitude
5349
return current.X;

samples/PolylineAlgorithm.NetTopologySuite.Sample/PolylineAlgorithm.NetTopologySuite.Sample.csproj

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,8 @@
11
<Project Sdk="Microsoft.NET.Sdk">
22

33
<PropertyGroup>
4-
<TargetFramework>netstandard2.1</TargetFramework>
4+
<OutputType>Exe</OutputType>
5+
<TargetFramework>net10.0</TargetFramework>
56
</PropertyGroup>
67

78
<PropertyGroup>
Lines changed: 41 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,41 @@
1+
//
2+
// Copyright © Pete Sramek. All rights reserved.
3+
// Licensed under the MIT License. See LICENSE file in the project root for full license information.
4+
//
5+
6+
using NetTopologySuite.Geometries;
7+
using PolylineAlgorithm.NetTopologySuite.Sample;
8+
9+
// Sample route: Seattle → Bellevue → Redmond
10+
var points = new Point[]
11+
{
12+
new(x: -122.3503, y: 47.6219), // Seattle (x = longitude, y = latitude)
13+
new(x: -122.2015, y: 47.6101), // Bellevue
14+
new(x: -122.1215, y: 47.6740), // Redmond
15+
};
16+
17+
var encoder = new NetTopologyPolylineEncoder();
18+
var decoder = new NetTopologyPolylineDecoder();
19+
20+
// Encode
21+
string encoded = encoder.Encode(points);
22+
23+
Console.WriteLine("=== NetTopologySuite Polyline Sample ===");
24+
Console.WriteLine();
25+
Console.WriteLine("Input points (longitude, latitude):");
26+
foreach (Point p in points)
27+
{
28+
Console.WriteLine($" ({p.X}, {p.Y})");
29+
}
30+
Console.WriteLine();
31+
Console.WriteLine($"Encoded polyline: {encoded}");
32+
Console.WriteLine();
33+
34+
// Decode
35+
IEnumerable<Point> decoded = decoder.Decode(encoded);
36+
37+
Console.WriteLine("Decoded points (longitude, latitude):");
38+
foreach (Point p in decoded)
39+
{
40+
Console.WriteLine($" ({p.X}, {p.Y})");
41+
}

samples/PolylineAlgorithm.SensorData.Sample/PolylineAlgorithm.SensorData.Sample.csproj

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,8 @@
11
<Project Sdk="Microsoft.NET.Sdk">
22

33
<PropertyGroup>
4-
<TargetFramework>netstandard2.1</TargetFramework>
4+
<OutputType>Exe</OutputType>
5+
<TargetFramework>net10.0</TargetFramework>
56
</PropertyGroup>
67

78
<PropertyGroup>
Lines changed: 44 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,44 @@
1+
//
2+
// Copyright © Pete Sramek. All rights reserved.
3+
// Licensed under the MIT License. See LICENSE file in the project root for full license information.
4+
//
5+
6+
using PolylineAlgorithm.SensorData.Sample;
7+
8+
// Sample temperature readings from a sensor over six seconds
9+
var readings = new SensorReading[]
10+
{
11+
new(DateTimeOffset.UtcNow, 23.5),
12+
new(DateTimeOffset.UtcNow.AddSeconds(1), 23.7),
13+
new(DateTimeOffset.UtcNow.AddSeconds(2), 24.1),
14+
new(DateTimeOffset.UtcNow.AddSeconds(3), 25.0),
15+
new(DateTimeOffset.UtcNow.AddSeconds(4), 24.8),
16+
new(DateTimeOffset.UtcNow.AddSeconds(5), 24.8),
17+
new(DateTimeOffset.UtcNow.AddSeconds(6), 22.3),
18+
};
19+
20+
var encoder = new SensorDataEncoder();
21+
var decoder = new SensorDataDecoder();
22+
23+
// Encode
24+
string encoded = encoder.Encode(readings);
25+
26+
Console.WriteLine("=== Sensor Data Polyline Sample ===");
27+
Console.WriteLine();
28+
Console.WriteLine("Input readings:");
29+
foreach (SensorReading r in readings)
30+
{
31+
Console.WriteLine($" [{r.Timestamp:HH:mm:ss}] {r.Temperature:F1} °C");
32+
}
33+
Console.WriteLine();
34+
Console.WriteLine($"Encoded polyline: {encoded}");
35+
Console.WriteLine();
36+
37+
// Decode (timestamps are not encoded, so they will be default)
38+
IEnumerable<SensorReading> decoded = decoder.Decode(encoded);
39+
40+
Console.WriteLine("Decoded temperatures:");
41+
foreach (SensorReading r in decoded)
42+
{
43+
Console.WriteLine($" {r.Temperature:F1} °C");
44+
}

samples/PolylineAlgorithm.SensorData.Sample/SensorDataDecoder.cs

Lines changed: 7 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -29,7 +29,7 @@ namespace PolylineAlgorithm.SensorData.Sample;
2929
/// set to <see langword="default"/>.
3030
/// </para>
3131
/// </remarks>
32-
public sealed class SensorDataDecoder : IPolylineDecoder<string, SensorReading> {
32+
internal sealed class SensorDataDecoder : IPolylineDecoder<string, SensorReading> {
3333
/// <summary>
3434
/// Initializes a new instance of the <see cref="SensorDataDecoder"/> class with default encoding options.
3535
/// </summary>
@@ -47,9 +47,7 @@ public SensorDataDecoder()
4747
/// Thrown when <paramref name="options"/> is <see langword="null"/>.
4848
/// </exception>
4949
public SensorDataDecoder(PolylineEncodingOptions options) {
50-
if (options is null) {
51-
throw new ArgumentNullException(nameof(options));
52-
}
50+
ArgumentNullException.ThrowIfNull(options);
5351

5452
Options = options;
5553
}
@@ -83,15 +81,16 @@ public SensorDataDecoder(PolylineEncodingOptions options) {
8381
/// Thrown when <paramref name="cancellationToken"/> requests cancellation.
8482
/// </exception>
8583
public IEnumerable<SensorReading> Decode(string polyline, CancellationToken cancellationToken = default) {
86-
if (polyline is null) {
87-
throw new ArgumentNullException(nameof(polyline));
88-
}
84+
ArgumentNullException.ThrowIfNull(polyline);
8985

9086
if (polyline.Length < 1) {
9187
throw new ArgumentException("Encoded polyline must not be empty.", nameof(polyline));
9288
}
9389

94-
ReadOnlyMemory<char> memory = polyline.AsMemory();
90+
return DecodeIterator(polyline.AsMemory(), cancellationToken);
91+
}
92+
93+
private IEnumerable<SensorReading> DecodeIterator(ReadOnlyMemory<char> memory, CancellationToken cancellationToken) {
9594
int position = 0;
9695
int accumulated = 0;
9796

samples/PolylineAlgorithm.SensorData.Sample/SensorDataEncoder.cs

Lines changed: 2 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -28,7 +28,7 @@ namespace PolylineAlgorithm.SensorData.Sample;
2828
/// will not be recovered on decoding.
2929
/// </para>
3030
/// </remarks>
31-
public sealed class SensorDataEncoder : IPolylineEncoder<SensorReading, string> {
31+
internal sealed class SensorDataEncoder : IPolylineEncoder<SensorReading, string> {
3232
/// <summary>
3333
/// Initializes a new instance of the <see cref="SensorDataEncoder"/> class with default encoding options.
3434
/// </summary>
@@ -45,9 +45,7 @@ public SensorDataEncoder()
4545
/// Thrown when <paramref name="options"/> is <see langword="null"/>.
4646
/// </exception>
4747
public SensorDataEncoder(PolylineEncodingOptions options) {
48-
if (options is null) {
49-
throw new ArgumentNullException(nameof(options));
50-
}
48+
ArgumentNullException.ThrowIfNull(options);
5149

5250
Options = options;
5351
}

samples/PolylineAlgorithm.SensorData.Sample/SensorReading.cs

Lines changed: 4 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -5,9 +5,12 @@
55

66
namespace PolylineAlgorithm.SensorData.Sample;
77

8+
using System.Runtime.InteropServices;
9+
810
/// <summary>
911
/// Represents a single temperature reading captured by a sensor.
1012
/// </summary>
1113
/// <param name="Timestamp">The UTC time at which the reading was captured.</param>
1214
/// <param name="Temperature">The temperature value of the reading, in degrees Celsius.</param>
13-
public readonly record struct SensorReading(DateTimeOffset Timestamp, double Temperature);
15+
[StructLayout(LayoutKind.Auto)]
16+
internal readonly record struct SensorReading(DateTimeOffset Timestamp, double Temperature);

0 commit comments

Comments
 (0)