mirror of https://github.com/oliverbooth/X10D
Compare commits
8 Commits
319d78a19d
...
c334ceb7fe
Author | SHA1 | Date |
---|---|---|
Oliver Booth | c334ceb7fe | |
Oliver Booth | 69157b9517 | |
Oliver Booth | 4a80c93cc2 | |
Oliver Booth | f389731703 | |
Oliver Booth | 195e25e0e3 | |
Oliver Booth | bd1b12da71 | |
Oliver Booth | 8d2b4b011b | |
Oliver Booth | 25062bbf8b |
|
@ -24,7 +24,6 @@ jobs:
|
|||
with:
|
||||
dotnet-version: |
|
||||
6.0.x
|
||||
7.0.x
|
||||
8.0.x
|
||||
|
||||
- name: Add NuGet source
|
||||
|
@ -39,9 +38,6 @@ jobs:
|
|||
- 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
|
||||
|
||||
- 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
|
||||
run: dotnet test --no-build --verbosity normal --configuration Release --framework net8.0 --collect:"XPlat Code Coverage" --results-directory test-results/net8.0
|
||||
|
||||
|
|
|
@ -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(long[, 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.MDBold`, `string.MDCode`, `string.MDCodeBlock([string])`, `string.MDHeading(int)`,
|
||||
`string.MDItalic`, `string.MDLink`, `string.MDStrikeOut`, and `string.MDUnderline` for Markdown formatting.
|
||||
|
|
|
@ -1,7 +1,7 @@
|
|||
<Project Sdk="Microsoft.NET.Sdk">
|
||||
|
||||
<PropertyGroup>
|
||||
<TargetFrameworks>net8.0;net7.0;net6.0</TargetFrameworks>
|
||||
<TargetFrameworks>net8.0;net6.0</TargetFrameworks>
|
||||
</PropertyGroup>
|
||||
|
||||
<ItemGroup>
|
||||
|
|
|
@ -1,7 +1,7 @@
|
|||
<Project Sdk="Microsoft.NET.Sdk">
|
||||
|
||||
<PropertyGroup>
|
||||
<TargetFrameworks>net8.0;net7.0;net6.0</TargetFrameworks>
|
||||
<TargetFrameworks>net8.0;net6.0</TargetFrameworks>
|
||||
<IsPackable>false</IsPackable>
|
||||
<IsTestProject>true</IsTestProject>
|
||||
<CoverletOutputFormat>xml,cobertura</CoverletOutputFormat>
|
||||
|
|
|
@ -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--;
|
||||
}
|
||||
}
|
||||
}
|
|
@ -1,7 +1,7 @@
|
|||
<Project Sdk="Microsoft.NET.Sdk">
|
||||
|
||||
<PropertyGroup>
|
||||
<TargetFrameworks>net8.0;net7.0;net6.0</TargetFrameworks>
|
||||
<TargetFrameworks>net8.0;net6.0</TargetFrameworks>
|
||||
</PropertyGroup>
|
||||
|
||||
<ItemGroup>
|
||||
|
|
|
@ -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;
|
||||
}
|
||||
}
|
|
@ -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);
|
||||
}
|
||||
}
|
|
@ -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
|
||||
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
|
||||
|
||||
### 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
|
||||
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
|
||||
|
||||
**Source incompatible change**
|
||||
|
||||
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
|
||||
`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
|
||||
|
||||
**Source incompatible change**
|
||||
|
||||
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
|
||||
is no migration path for this, as the built in `Append` method from LINQ is a drop-in replacement.
|
||||
|
||||
## Exception Changes
|
||||
|
||||
**Source incompatible change**
|
||||
|
||||
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
|
||||
more general, and more easily understood by developers.
|
|
@ -1,7 +1,7 @@
|
|||
<Project Sdk="Microsoft.NET.Sdk">
|
||||
|
||||
<PropertyGroup>
|
||||
<TargetFrameworks>net8.0;net7.0;net6.0</TargetFrameworks>
|
||||
<TargetFrameworks>net8.0;net6.0</TargetFrameworks>
|
||||
<Configuration>Release</Configuration>
|
||||
<OutputType>Exe</OutputType>
|
||||
<Optimize>true</Optimize>
|
||||
|
|
Loading…
Reference in New Issue