Compare commits

...

8 Commits

10 changed files with 189 additions and 8 deletions

View File

@ -24,7 +24,6 @@ jobs:
with: with:
dotnet-version: | dotnet-version: |
6.0.x 6.0.x
7.0.x
8.0.x 8.0.x
- name: Add NuGet source - name: Add NuGet source
@ -39,9 +38,6 @@ jobs:
- name: Test .NET 6 - name: Test .NET 6
run: dotnet test --no-build --verbosity normal --configuration Release --framework net6.0 --collect:"XPlat Code Coverage" --results-directory test-results/net6.0 run: dotnet test --no-build --verbosity normal --configuration Release --framework net6.0 --collect:"XPlat Code Coverage" --results-directory test-results/net6.0
- name: Test .NET 7
run: dotnet test --no-build --verbosity normal --configuration Release --framework net7.0 --collect:"XPlat Code Coverage" --results-directory test-results/net7.0
- name: Test .NET 8 - name: Test .NET 8
run: dotnet test --no-build --verbosity normal --configuration Release --framework net8.0 --collect:"XPlat Code Coverage" --results-directory test-results/net8.0 run: dotnet test --no-build --verbosity normal --configuration Release --framework net8.0 --collect:"XPlat Code Coverage" --results-directory test-results/net8.0

View File

@ -23,6 +23,7 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0
- X10D: Added `TextWriter.WriteLineNoAlloc(uint[, ReadOnlySpan<char>[, IFormatProvider]])`. - X10D: Added `TextWriter.WriteLineNoAlloc(uint[, ReadOnlySpan<char>[, IFormatProvider]])`.
- X10D: Added `TextWriter.WriteLineNoAlloc(long[, ReadOnlySpan<char>[, IFormatProvider]])`. - X10D: Added `TextWriter.WriteLineNoAlloc(long[, ReadOnlySpan<char>[, IFormatProvider]])`.
- X10D: Added `TextWriter.WriteLineNoAlloc(ulong[, ReadOnlySpan<char>[, IFormatProvider]])`. - X10D: Added `TextWriter.WriteLineNoAlloc(ulong[, ReadOnlySpan<char>[, IFormatProvider]])`.
- X10D: Added `Range.GetEnumerator` (and `RangeEnumerator`), implementing Python-esque `for` loops in C#.
- X10D: Added `string.ConcatIf`. - X10D: Added `string.ConcatIf`.
- X10D: Added `string.MDBold`, `string.MDCode`, `string.MDCodeBlock([string])`, `string.MDHeading(int)`, - X10D: Added `string.MDBold`, `string.MDCode`, `string.MDCodeBlock([string])`, `string.MDHeading(int)`,
`string.MDItalic`, `string.MDLink`, `string.MDStrikeOut`, and `string.MDUnderline` for Markdown formatting. `string.MDItalic`, `string.MDLink`, `string.MDStrikeOut`, and `string.MDUnderline` for Markdown formatting.

View File

@ -1,7 +1,7 @@
<Project Sdk="Microsoft.NET.Sdk"> <Project Sdk="Microsoft.NET.Sdk">
<PropertyGroup> <PropertyGroup>
<TargetFrameworks>net8.0;net7.0;net6.0</TargetFrameworks> <TargetFrameworks>net8.0;net6.0</TargetFrameworks>
</PropertyGroup> </PropertyGroup>
<ItemGroup> <ItemGroup>

View File

@ -1,7 +1,7 @@
<Project Sdk="Microsoft.NET.Sdk"> <Project Sdk="Microsoft.NET.Sdk">
<PropertyGroup> <PropertyGroup>
<TargetFrameworks>net8.0;net7.0;net6.0</TargetFrameworks> <TargetFrameworks>net8.0;net6.0</TargetFrameworks>
<IsPackable>false</IsPackable> <IsPackable>false</IsPackable>
<IsTestProject>true</IsTestProject> <IsTestProject>true</IsTestProject>
<CoverletOutputFormat>xml,cobertura</CoverletOutputFormat> <CoverletOutputFormat>xml,cobertura</CoverletOutputFormat>

View File

@ -0,0 +1,66 @@
using NUnit.Framework;
using X10D.Core;
namespace X10D.Tests.Core;
[TestFixture]
internal class RangeTests
{
[Test]
public void Range_GetEnumerator_ShouldReturnRangeEnumerator()
{
Assert.Multiple(() =>
{
Assert.That(5..10, Is.TypeOf<Range>());
Assert.That((5..10).GetEnumerator(), Is.TypeOf<RangeEnumerator>());
});
}
[Test]
public void Loop_OverRange0To10_ShouldCountFrom0To10Inclusive()
{
int value = 0;
foreach (int i in 0..10)
{
Assert.That(i, Is.EqualTo(value));
value++;
}
}
[Test]
public void Loop_OverRangeNegative5To5_ShouldCountFromNegative5To5Inclusive()
{
int value = -5;
foreach (int i in ^5..5)
{
Assert.That(i, Is.EqualTo(value));
value++;
}
}
[Test]
public void Loop_OverRange5ToNegative5_ShouldCountFrom5ToNegative5Inclusive()
{
int value = 5;
foreach (int i in 5..^5)
{
Assert.That(i, Is.EqualTo(value));
value--;
}
}
[Test]
public void Loop_OverRange10To0_ShouldCountFrom10To0Inclusive()
{
int value = 10;
foreach (int i in 10..0)
{
Assert.That(i, Is.EqualTo(value));
value--;
}
}
}

View File

@ -1,7 +1,7 @@
<Project Sdk="Microsoft.NET.Sdk"> <Project Sdk="Microsoft.NET.Sdk">
<PropertyGroup> <PropertyGroup>
<TargetFrameworks>net8.0;net7.0;net6.0</TargetFrameworks> <TargetFrameworks>net8.0;net6.0</TargetFrameworks>
</PropertyGroup> </PropertyGroup>
<ItemGroup> <ItemGroup>

View File

@ -0,0 +1,53 @@
namespace X10D.Core;
/// <summary>
/// Enumerates the indices of a <see cref="Range" />.
/// </summary>
public struct RangeEnumerator
{
private readonly bool _decrement;
private readonly int _endValue;
/// <summary>
/// Initializes a new instance of the <see cref="RangeEnumerator" /> structure.
/// </summary>
/// <param name="range">The range over which to enumerate.</param>
public RangeEnumerator(Range range)
{
Index start = range.Start;
Index end = range.End;
int startValue = start.IsFromEnd ? -start.Value : start.Value;
_endValue = end.IsFromEnd ? -end.Value : end.Value;
_decrement = _endValue < startValue;
Current = _decrement ? startValue + 1 : startValue - 1;
}
/// <summary>
/// Gets the element in the collection at the current position of the enumerator.
/// </summary>
/// <value>The element in the collection at the current position of the enumerator.</value>
public int Current { get; private set; }
/// <summary>
/// Advances the enumerator to the next element of the collection.
/// </summary>
/// <returns>
/// <see langword="true" /> if the enumerator was successfully advanced to the next element; <see langword="false" /> if
/// the enumerator has passed the end of the collection.
/// </returns>
public bool MoveNext()
{
int value = Current;
if (_decrement)
{
Current--;
return value > _endValue;
}
Current++;
return value < _endValue;
}
}

View File

@ -0,0 +1,48 @@
namespace X10D.Core;
/// <summary>
/// Extension methods for <see cref="Range" />.
/// </summary>
public static class RangeExtensions
{
/// <summary>
/// Allows the ability to use a <c>for</c> loop to iterate over the indices of a <see cref="Range" />. The indices of the
/// range are the inclusive lower and upper bounds of the enumeration.
/// </summary>
/// <param name="range">The range whose indices over which will be enumerated.</param>
/// <returns>A <see cref="RangeEnumerator" /> that will enumerate over the indices of <paramref name="range" />.</returns>
/// <remarks>
/// This method aims to implement Python-esque for loops in C# by taking advantage of the language syntax used to define
/// a <see cref="Range" /> value. Negative bounds may be specified using the C# <c>^</c> operator, or by providing an
/// <see cref="Index" /> whose <see cref="Index.IsFromEnd" /> property is <see langword="true" />.
/// </remarks>
/// <example>
/// The following example counts from 0 to 10 inclusive:
/// <code>
/// foreach (var i in 0..10)
/// {
/// Console.WriteLine(i);
/// }
/// </code>
///
/// To use negative bounds, use the <c>^</c> operator. The following example counts from -5 to 5 inclusive:
/// <code>
/// foreach (var i in ^5..5)
/// {
/// Console.WriteLine(i);
/// }
/// </code>
///
/// Decrementing enumeration is supported. The following example counts from 5 to -5 inclusive:
/// <code>
/// foreach (var i in 5..^5)
/// {
/// Console.WriteLine(i);
/// }
/// </code>
/// </example>
public static RangeEnumerator GetEnumerator(this Range range)
{
return new RangeEnumerator(range);
}
}

View File

@ -3,6 +3,9 @@
X10D 4.0.0 is a major release that introduces breaking changes. This document will help you migrate your code from 3.x.x X10D 4.0.0 is a major release that introduces breaking changes. This document will help you migrate your code from 3.x.x
to 4.0.0. to 4.0.0.
When a breaking change is mentioned, the compatibility mirrors that of the Microsoft documentation for .NET, which you
can find [here](https://learn.microsoft.com/en-us/dotnet/core/compatibility/categories).
## Removed APIs ## Removed APIs
### X10D.DSharpPlus library ### X10D.DSharpPlus library
@ -12,8 +15,18 @@ wrapper library. However, I have since moved to using a different library, and a
scope of X10D or in my best interest to maintain it. The library will remain available on NuGet until DSharpPlus release scope of X10D or in my best interest to maintain it. The library will remain available on NuGet until DSharpPlus release
5.0.0 as stable, and X10D.DSharpPlus will NOT be part of X10D 4.0.0. I'm sorry for any inconvenience this may cause. 5.0.0 as stable, and X10D.DSharpPlus will NOT be part of X10D 4.0.0. I'm sorry for any inconvenience this may cause.
### X10D.Unity library
The `X10D.Unity` library has been removed. This library was used to provide extension methods for the Unity API. Due to
game development politics, I no longer feel it in my best interest to continue development of the Unity package. The
library will remain on NuGet for the foreseeable future but will no longer be maintained. The `upm` branch of the Git
repository will remain available indefinitely also.
### `Endianness` enum ### `Endianness` enum
**Source incompatible change**
The `Endianness` enum was used to specify the endianness of data when reading or writing to a stream. This was causing The `Endianness` enum was used to specify the endianness of data when reading or writing to a stream. This was causing
some clutter, and makes it harder to develop X10D, so it was removed. In its stead, any method which accepted an some clutter, and makes it harder to develop X10D, so it was removed. In its stead, any method which accepted an
`Endianness` parameter now has two overloads: one for big-endian, and one for little-endian. For example, the following `Endianness` parameter now has two overloads: one for big-endian, and one for little-endian. For example, the following
@ -41,12 +54,16 @@ Span<byte> buffer = stackalloc byte[4];
### `IEnumerable<T>.ConcatOne(T)` extension method ### `IEnumerable<T>.ConcatOne(T)` extension method
**Source incompatible change**
The `IEnumerable<T>.ConcatOne` extension method was used to concatenate a single item to an enumerable. At the time, I The `IEnumerable<T>.ConcatOne` extension method was used to concatenate a single item to an enumerable. At the time, I
was unaware of the `Enumerable.Append` method, which does the same thing. As such, `ConcatOne` has been removed. There was unaware of the `Enumerable.Append` method, which does the same thing. As such, `ConcatOne` has been removed. There
is no migration path for this, as the built in `Append` method from LINQ is a drop-in replacement. is no migration path for this, as the built in `Append` method from LINQ is a drop-in replacement.
## Exception Changes ## Exception Changes
**Source incompatible change**
If you were previously catching TypeInitializationException when calling `Stream.GetHash<>` or `Stream.TryWriteHash<>`, If you were previously catching TypeInitializationException when calling `Stream.GetHash<>` or `Stream.TryWriteHash<>`,
you will now need to catch a ArgumentException instead. The justification for this change is that ArgumentException is you will now need to catch a ArgumentException instead. The justification for this change is that ArgumentException is
more general, and more easily understood by developers. more general, and more easily understood by developers.

View File

@ -1,7 +1,7 @@
<Project Sdk="Microsoft.NET.Sdk"> <Project Sdk="Microsoft.NET.Sdk">
<PropertyGroup> <PropertyGroup>
<TargetFrameworks>net8.0;net7.0;net6.0</TargetFrameworks> <TargetFrameworks>net8.0;net6.0</TargetFrameworks>
<Configuration>Release</Configuration> <Configuration>Release</Configuration>
<OutputType>Exe</OutputType> <OutputType>Exe</OutputType>
<Optimize>true</Optimize> <Optimize>true</Optimize>