mirror of
https://github.com/oliverbooth/X10D
synced 2024-11-09 16:35:42 +00:00
Compare commits
8 Commits
319d78a19d
...
c334ceb7fe
Author | SHA1 | Date | |
---|---|---|---|
|
c334ceb7fe | ||
69157b9517 | |||
4a80c93cc2 | |||
f389731703 | |||
195e25e0e3 | |||
bd1b12da71 | |||
|
8d2b4b011b | ||
25062bbf8b |
4
.github/workflows/dotnet.yml
vendored
4
.github/workflows/dotnet.yml
vendored
@ -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
|
||||||
|
|
||||||
|
@ -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.
|
||||||
|
@ -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>
|
||||||
|
@ -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>
|
||||||
|
66
X10D.Tests/src/Core/RangeTests.cs
Normal file
66
X10D.Tests/src/Core/RangeTests.cs
Normal 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--;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
@ -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>
|
||||||
|
53
X10D/src/Core/RangeEnumerator.cs
Normal file
53
X10D/src/Core/RangeEnumerator.cs
Normal 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;
|
||||||
|
}
|
||||||
|
}
|
48
X10D/src/Core/RangeExtensions.cs
Normal file
48
X10D/src/Core/RangeExtensions.cs
Normal 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);
|
||||||
|
}
|
||||||
|
}
|
@ -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.
|
@ -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>
|
||||||
|
Loading…
Reference in New Issue
Block a user