diff --git a/apiCount.include.md b/apiCount.include.md index bf6bbc26..0c1cc2ed 100644 --- a/apiCount.include.md +++ b/apiCount.include.md @@ -1,19 +1,19 @@ -**API count: 1020** +**API count: 1021** ### Per Target Framework | Target | APIs | | -- | -- | -| `net461` | 967 | -| `net462` | 967 | -| `net47` | 966 | -| `net471` | 965 | -| `net472` | 961 | -| `net48` | 961 | -| `net481` | 961 | -| `netstandard2.0` | 963 | +| `net461` | 968 | +| `net462` | 968 | +| `net47` | 967 | +| `net471` | 966 | +| `net472` | 962 | +| `net48` | 962 | +| `net481` | 962 | +| `netstandard2.0` | 964 | | `netstandard2.1` | 815 | -| `netcoreapp2.0` | 884 | +| `netcoreapp2.0` | 885 | | `netcoreapp2.1` | 826 | | `netcoreapp2.2` | 826 | | `netcoreapp3.0` | 773 | @@ -25,4 +25,4 @@ | `net9.0` | 183 | | `net10.0` | 130 | | `net11.0` | 62 | -| `uap10.0` | 953 | +| `uap10.0` | 954 | diff --git a/api_list.include.md b/api_list.include.md index ec671003..762d70f1 100644 --- a/api_list.include.md +++ b/api_list.include.md @@ -297,6 +297,11 @@ * `bool TryParse(string?, IFormatProvider?, double)` [reference](https://learn.microsoft.com/en-us/dotnet/api/system.double.tryparse?view=net-11.0#system-double-tryparse(system-string-system-iformatprovider-system-double@)) +#### Encoder + + * `void Convert(ReadOnlySpan, Span, bool, int, int, bool)` [reference](https://learn.microsoft.com/en-us/dotnet/api/system.text.encoder.convert?view=net-11.0#system-text-encoder-convert(system-readonlyspan((system-char))-system-span((system-byte))-system-boolean-system-int32@-system-int32@-system-boolean@)) + + #### Encoding * `int GetByteCount(ReadOnlySpan)` [reference](https://learn.microsoft.com/en-us/dotnet/api/system.text.encoding.getbytecount?view=net-11.0#system-text-encoding-getbytecount(system-readonlyspan((system-char)))) diff --git a/assemblySize.include.md b/assemblySize.include.md index 82bb6d98..4c85bdc0 100644 --- a/assemblySize.include.md +++ b/assemblySize.include.md @@ -2,15 +2,15 @@ | | Empty Assembly | With Polyfill | Diff | Ensure | ArgumentExceptions | StringInterpolation | Nullability | |----------------|----------------|---------------|-----------|-----------|--------------------|---------------------|-------------| -| netstandard2.0 | 8.0KB | 351.5KB | +343.5KB | +9.0KB | +6.5KB | +9.0KB | +13.5KB | +| netstandard2.0 | 8.0KB | 351.5KB | +343.5KB | +9.5KB | +6.5KB | +9.5KB | +14.0KB | | netstandard2.1 | 8.5KB | 306.0KB | +297.5KB | +8.5KB | +6.0KB | +9.0KB | +13.5KB | -| net461 | 8.5KB | 350.0KB | +341.5KB | +9.0KB | +6.5KB | +9.5KB | +14.0KB | -| net462 | 7.0KB | 353.5KB | +346.5KB | +9.0KB | +6.5KB | +9.5KB | +13.5KB | -| net47 | 7.0KB | 353.5KB | +346.5KB | +9.0KB | +6.5KB | +9.0KB | +13.5KB | -| net471 | 8.5KB | 352.5KB | +344.0KB | +9.0KB | +6.5KB | +9.5KB | +14.0KB | -| net472 | 8.5KB | 351.5KB | +343.0KB | +9.0KB | +6.0KB | +9.0KB | +13.5KB | -| net48 | 8.5KB | 351.5KB | +343.0KB | +9.0KB | +6.0KB | +9.0KB | +13.5KB | -| net481 | 8.5KB | 351.5KB | +343.0KB | +9.0KB | +6.0KB | +9.0KB | +13.5KB | +| net461 | 8.5KB | 350.5KB | +342.0KB | +9.0KB | +6.0KB | +9.0KB | +13.5KB | +| net462 | 7.0KB | 354.0KB | +347.0KB | +9.0KB | +6.5KB | +9.0KB | +13.5KB | +| net47 | 7.0KB | 353.5KB | +346.5KB | +9.0KB | +6.5KB | +9.5KB | +13.5KB | +| net471 | 8.5KB | 353.0KB | +344.5KB | +9.0KB | +6.0KB | +9.0KB | +13.5KB | +| net472 | 8.5KB | 351.5KB | +343.0KB | +9.0KB | +6.5KB | +9.0KB | +14.0KB | +| net48 | 8.5KB | 351.5KB | +343.0KB | +9.0KB | +6.5KB | +9.0KB | +13.5KB | +| net481 | 8.5KB | 351.5KB | +343.0KB | +9.0KB | +6.5KB | +9.0KB | +14.0KB | | netcoreapp2.0 | 9.0KB | 327.5KB | +318.5KB | +9.0KB | +6.5KB | +9.0KB | +13.5KB | | netcoreapp2.1 | 9.0KB | 308.0KB | +299.0KB | +9.0KB | +6.5KB | +9.0KB | +14.0KB | | netcoreapp2.2 | 9.0KB | 308.0KB | +299.0KB | +9.0KB | +6.5KB | +9.0KB | +14.0KB | @@ -29,16 +29,16 @@ | | Empty Assembly | With Polyfill | Diff | Ensure | ArgumentExceptions | StringInterpolation | Nullability | |----------------|----------------|---------------|-----------|-----------|--------------------|---------------------|-------------| -| netstandard2.0 | 8.0KB | 513.0KB | +505.0KB | +16.7KB | +8.2KB | +13.9KB | +18.9KB | +| netstandard2.0 | 8.0KB | 513.4KB | +505.4KB | +17.2KB | +8.2KB | +14.4KB | +19.4KB | | netstandard2.1 | 8.5KB | 441.7KB | +433.2KB | +16.2KB | +7.7KB | +13.9KB | +18.9KB | -| net461 | 8.5KB | 512.5KB | +504.0KB | +16.7KB | +8.2KB | +14.4KB | +19.4KB | -| net462 | 7.0KB | 516.0KB | +509.0KB | +16.7KB | +8.2KB | +14.4KB | +18.9KB | -| net47 | 7.0KB | 515.8KB | +508.8KB | +16.7KB | +8.2KB | +13.9KB | +18.9KB | -| net471 | 8.5KB | 514.4KB | +505.9KB | +16.7KB | +8.2KB | +14.4KB | +19.4KB | -| net472 | 8.5KB | 512.4KB | +503.9KB | +16.7KB | +7.7KB | +13.9KB | +18.9KB | -| net48 | 8.5KB | 512.4KB | +503.9KB | +16.7KB | +7.7KB | +13.9KB | +18.9KB | -| net481 | 8.5KB | 512.4KB | +503.9KB | +16.7KB | +7.7KB | +13.9KB | +18.9KB | -| netcoreapp2.0 | 9.0KB | 478.4KB | +469.4KB | +16.7KB | +8.2KB | +13.9KB | +18.9KB | +| net461 | 8.5KB | 513.5KB | +505.0KB | +16.7KB | +7.7KB | +13.9KB | +18.9KB | +| net462 | 7.0KB | 517.0KB | +510.0KB | +16.7KB | +8.2KB | +13.9KB | +18.9KB | +| net47 | 7.0KB | 516.2KB | +509.2KB | +16.7KB | +8.2KB | +14.4KB | +18.9KB | +| net471 | 8.5KB | 515.4KB | +506.9KB | +16.7KB | +7.7KB | +13.9KB | +18.9KB | +| net472 | 8.5KB | 512.8KB | +504.3KB | +16.7KB | +8.2KB | +13.9KB | +19.4KB | +| net48 | 8.5KB | 512.8KB | +504.3KB | +16.7KB | +8.2KB | +13.9KB | +18.9KB | +| net481 | 8.5KB | 512.8KB | +504.3KB | +16.7KB | +8.2KB | +13.9KB | +19.4KB | +| netcoreapp2.0 | 9.0KB | 478.9KB | +469.9KB | +16.7KB | +8.2KB | +13.9KB | +18.9KB | | netcoreapp2.1 | 9.0KB | 447.4KB | +438.4KB | +16.7KB | +8.2KB | +13.9KB | +19.4KB | | netcoreapp2.2 | 9.0KB | 447.4KB | +438.4KB | +16.7KB | +8.2KB | +13.9KB | +19.4KB | | netcoreapp3.0 | 9.5KB | 431.6KB | +422.1KB | +16.7KB | +8.2KB | +13.9KB | +18.9KB | diff --git a/readme.md b/readme.md index f3a2578c..50b1ea64 100644 --- a/readme.md +++ b/readme.md @@ -13,22 +13,22 @@ The package targets `netstandard2.0` and is designed to support the following ru * `uap10` -**API count: 1020** +**API count: 1021** ### Per Target Framework | Target | APIs | | -- | -- | -| `net461` | 967 | -| `net462` | 967 | -| `net47` | 966 | -| `net471` | 965 | -| `net472` | 961 | -| `net48` | 961 | -| `net481` | 961 | -| `netstandard2.0` | 963 | +| `net461` | 968 | +| `net462` | 968 | +| `net47` | 967 | +| `net471` | 966 | +| `net472` | 962 | +| `net48` | 962 | +| `net481` | 962 | +| `netstandard2.0` | 964 | | `netstandard2.1` | 815 | -| `netcoreapp2.0` | 884 | +| `netcoreapp2.0` | 885 | | `netcoreapp2.1` | 826 | | `netcoreapp2.2` | 826 | | `netcoreapp3.0` | 773 | @@ -40,7 +40,7 @@ The package targets `netstandard2.0` and is designed to support the following ru | `net9.0` | 183 | | `net10.0` | 130 | | `net11.0` | 62 | -| `uap10.0` | 953 | +| `uap10.0` | 954 | @@ -96,54 +96,54 @@ This project uses features from the newest stable SDK and C# language. As such c | | Empty Assembly | With Polyfill | Diff | Ensure | ArgumentExceptions | StringInterpolation | Nullability | |----------------|----------------|---------------|-----------|-----------|--------------------|---------------------|-------------| -| netstandard2.0 | 8.0KB | 347.5KB | +339.5KB | +9.0KB | +6.5KB | +9.0KB | +14.0KB | -| netstandard2.1 | 8.5KB | 302.0KB | +293.5KB | +9.0KB | +6.5KB | +9.0KB | +14.0KB | -| net461 | 8.5KB | 346.5KB | +338.0KB | +9.0KB | +6.5KB | +9.0KB | +13.5KB | -| net462 | 7.0KB | 350.0KB | +343.0KB | +9.0KB | +6.5KB | +9.0KB | +13.5KB | -| net47 | 7.0KB | 349.5KB | +342.5KB | +9.0KB | +6.5KB | +9.5KB | +14.0KB | -| net471 | 8.5KB | 349.0KB | +340.5KB | +9.0KB | +6.0KB | +9.0KB | +13.5KB | -| net472 | 8.5KB | 347.5KB | +339.0KB | +9.0KB | +6.5KB | +9.0KB | +13.5KB | -| net48 | 8.5KB | 347.5KB | +339.0KB | +9.0KB | +6.5KB | +9.0KB | +13.5KB | -| net481 | 8.5KB | 347.5KB | +339.0KB | +9.0KB | +6.5KB | +9.0KB | +13.5KB | -| netcoreapp2.0 | 9.0KB | 323.5KB | +314.5KB | +9.0KB | +6.5KB | +9.0KB | +13.5KB | -| netcoreapp2.1 | 9.0KB | 304.5KB | +295.5KB | +9.0KB | +6.5KB | +9.0KB | +13.5KB | -| netcoreapp2.2 | 9.0KB | 304.5KB | +295.5KB | +9.0KB | +6.5KB | +9.0KB | +13.5KB | -| netcoreapp3.0 | 9.5KB | 297.0KB | +287.5KB | +9.0KB | +6.5KB | +9.0KB | +14.0KB | -| netcoreapp3.1 | 9.5KB | 295.5KB | +286.0KB | +9.0KB | +6.5KB | +9.0KB | +13.5KB | -| net5.0 | 9.5KB | 259.0KB | +249.5KB | +9.0KB | +6.5KB | +9.5KB | +14.0KB | -| net6.0 | 10.0KB | 201.0KB | +191.0KB | +10.0KB | +6.5KB | +512bytes | +3.5KB | -| net7.0 | 10.0KB | 163.5KB | +153.5KB | +9.0KB | +5.5KB | +512bytes | +3.0KB | -| net8.0 | 9.5KB | 135.0KB | +125.5KB | +8.0KB | | +512bytes | +3.0KB | -| net9.0 | 9.5KB | 88.5KB | +79.0KB | +8.5KB | | +512bytes | +3.5KB | -| net10.0 | 10.0KB | 66.0KB | +56.0KB | +9.0KB | | +512bytes | +3.5KB | -| net11.0 | 10.0KB | 27.0KB | +17.0KB | +9.0KB | | +1.0KB | +3.5KB | +| netstandard2.0 | 8.0KB | 351.5KB | +343.5KB | +9.5KB | +6.5KB | +9.5KB | +14.0KB | +| netstandard2.1 | 8.5KB | 306.0KB | +297.5KB | +8.5KB | +6.0KB | +9.0KB | +13.5KB | +| net461 | 8.5KB | 350.5KB | +342.0KB | +9.0KB | +6.0KB | +9.0KB | +13.5KB | +| net462 | 7.0KB | 354.0KB | +347.0KB | +9.0KB | +6.5KB | +9.0KB | +13.5KB | +| net47 | 7.0KB | 353.5KB | +346.5KB | +9.0KB | +6.5KB | +9.5KB | +13.5KB | +| net471 | 8.5KB | 353.0KB | +344.5KB | +9.0KB | +6.0KB | +9.0KB | +13.5KB | +| net472 | 8.5KB | 351.5KB | +343.0KB | +9.0KB | +6.5KB | +9.0KB | +14.0KB | +| net48 | 8.5KB | 351.5KB | +343.0KB | +9.0KB | +6.5KB | +9.0KB | +13.5KB | +| net481 | 8.5KB | 351.5KB | +343.0KB | +9.0KB | +6.5KB | +9.0KB | +14.0KB | +| netcoreapp2.0 | 9.0KB | 327.5KB | +318.5KB | +9.0KB | +6.5KB | +9.0KB | +13.5KB | +| netcoreapp2.1 | 9.0KB | 308.0KB | +299.0KB | +9.0KB | +6.5KB | +9.0KB | +14.0KB | +| netcoreapp2.2 | 9.0KB | 308.0KB | +299.0KB | +9.0KB | +6.5KB | +9.0KB | +14.0KB | +| netcoreapp3.0 | 9.5KB | 301.0KB | +291.5KB | +9.0KB | +6.5KB | +9.0KB | +13.5KB | +| netcoreapp3.1 | 9.5KB | 299.0KB | +289.5KB | +9.0KB | +6.5KB | +9.0KB | +14.0KB | +| net5.0 | 9.5KB | 263.0KB | +253.5KB | +9.0KB | +6.5KB | +9.0KB | +14.0KB | +| net6.0 | 10.0KB | 205.0KB | +195.0KB | +9.5KB | +6.5KB | +512bytes | +3.0KB | +| net7.0 | 10.0KB | 167.0KB | +157.0KB | +9.5KB | +5.5KB | +1.0KB | +3.5KB | +| net8.0 | 9.5KB | 138.5KB | +129.0KB | +8.5KB | +512bytes | +512bytes | +3.5KB | +| net9.0 | 9.5KB | 92.5KB | +83.0KB | +8.5KB | | +512bytes | +3.5KB | +| net10.0 | 10.0KB | 70.0KB | +60.0KB | +9.0KB | | +512bytes | +3.5KB | +| net11.0 | 10.0KB | 31.5KB | +21.5KB | +9.0KB | | +512bytes | +3.5KB | ### Assembly Sizes with EmbedUntrackedSources | | Empty Assembly | With Polyfill | Diff | Ensure | ArgumentExceptions | StringInterpolation | Nullability | |----------------|----------------|---------------|-----------|-----------|--------------------|---------------------|-------------| -| netstandard2.0 | 8.0KB | 507.8KB | +499.8KB | +16.7KB | +8.2KB | +13.9KB | +19.4KB | -| netstandard2.1 | 8.5KB | 436.6KB | +428.1KB | +16.7KB | +8.2KB | +13.9KB | +19.4KB | -| net461 | 8.5KB | 507.8KB | +499.3KB | +16.7KB | +8.2KB | +13.9KB | +18.9KB | -| net462 | 7.0KB | 511.3KB | +504.3KB | +16.7KB | +8.2KB | +13.9KB | +18.9KB | -| net47 | 7.0KB | 510.6KB | +503.6KB | +16.7KB | +8.2KB | +14.4KB | +19.4KB | -| net471 | 8.5KB | 509.7KB | +501.2KB | +16.7KB | +7.7KB | +13.9KB | +18.9KB | -| net472 | 8.5KB | 507.2KB | +498.7KB | +16.7KB | +8.2KB | +13.9KB | +18.9KB | -| net48 | 8.5KB | 507.2KB | +498.7KB | +16.7KB | +8.2KB | +13.9KB | +18.9KB | -| net481 | 8.5KB | 507.2KB | +498.7KB | +16.7KB | +8.2KB | +13.9KB | +18.9KB | -| netcoreapp2.0 | 9.0KB | 473.2KB | +464.2KB | +16.7KB | +8.2KB | +13.9KB | +18.9KB | -| netcoreapp2.1 | 9.0KB | 442.8KB | +433.8KB | +16.7KB | +8.2KB | +13.9KB | +18.9KB | -| netcoreapp2.2 | 9.0KB | 442.8KB | +433.8KB | +16.7KB | +8.2KB | +13.9KB | +18.9KB | -| netcoreapp3.0 | 9.5KB | 426.5KB | +417.0KB | +16.7KB | +8.2KB | +13.9KB | +19.4KB | -| netcoreapp3.1 | 9.5KB | 425.0KB | +415.5KB | +16.7KB | +8.2KB | +13.9KB | +18.9KB | -| net5.0 | 9.5KB | 370.3KB | +360.8KB | +16.7KB | +8.2KB | +14.4KB | +19.4KB | -| net6.0 | 10.0KB | 292.3KB | +282.3KB | +17.7KB | +8.2KB | +1.1KB | +4.2KB | -| net7.0 | 10.0KB | 236.2KB | +226.2KB | +16.6KB | +6.9KB | +1.1KB | +3.7KB | -| net8.0 | 9.5KB | 192.7KB | +183.2KB | +15.5KB | +299bytes | +1.1KB | +3.7KB | -| net9.0 | 9.5KB | 125.2KB | +115.7KB | +16.0KB | | +1.1KB | +4.2KB | -| net10.0 | 10.0KB | 94.4KB | +84.4KB | +16.5KB | | +1.1KB | +4.2KB | -| net11.0 | 10.0KB | 41.3KB | +31.3KB | +16.5KB | | +1.6KB | +4.2KB | +| netstandard2.0 | 8.0KB | 513.4KB | +505.4KB | +17.2KB | +8.2KB | +14.4KB | +19.4KB | +| netstandard2.1 | 8.5KB | 441.7KB | +433.2KB | +16.2KB | +7.7KB | +13.9KB | +18.9KB | +| net461 | 8.5KB | 513.5KB | +505.0KB | +16.7KB | +7.7KB | +13.9KB | +18.9KB | +| net462 | 7.0KB | 517.0KB | +510.0KB | +16.7KB | +8.2KB | +13.9KB | +18.9KB | +| net47 | 7.0KB | 516.2KB | +509.2KB | +16.7KB | +8.2KB | +14.4KB | +18.9KB | +| net471 | 8.5KB | 515.4KB | +506.9KB | +16.7KB | +7.7KB | +13.9KB | +18.9KB | +| net472 | 8.5KB | 512.8KB | +504.3KB | +16.7KB | +8.2KB | +13.9KB | +19.4KB | +| net48 | 8.5KB | 512.8KB | +504.3KB | +16.7KB | +8.2KB | +13.9KB | +18.9KB | +| net481 | 8.5KB | 512.8KB | +504.3KB | +16.7KB | +8.2KB | +13.9KB | +19.4KB | +| netcoreapp2.0 | 9.0KB | 478.9KB | +469.9KB | +16.7KB | +8.2KB | +13.9KB | +18.9KB | +| netcoreapp2.1 | 9.0KB | 447.4KB | +438.4KB | +16.7KB | +8.2KB | +13.9KB | +19.4KB | +| netcoreapp2.2 | 9.0KB | 447.4KB | +438.4KB | +16.7KB | +8.2KB | +13.9KB | +19.4KB | +| netcoreapp3.0 | 9.5KB | 431.6KB | +422.1KB | +16.7KB | +8.2KB | +13.9KB | +18.9KB | +| netcoreapp3.1 | 9.5KB | 429.6KB | +420.1KB | +16.7KB | +8.2KB | +13.9KB | +19.4KB | +| net5.0 | 9.5KB | 375.4KB | +365.9KB | +16.7KB | +8.2KB | +13.9KB | +19.4KB | +| net6.0 | 10.0KB | 297.4KB | +287.4KB | +17.2KB | +8.2KB | +1.1KB | +3.7KB | +| net7.0 | 10.0KB | 240.8KB | +230.8KB | +17.1KB | +6.9KB | +1.6KB | +4.2KB | +| net8.0 | 9.5KB | 197.3KB | +187.8KB | +16.0KB | +811bytes | +1.1KB | +4.2KB | +| net9.0 | 9.5KB | 130.3KB | +120.8KB | +16.0KB | | +1.1KB | +4.2KB | +| net10.0 | 10.0KB | 99.5KB | +89.5KB | +16.5KB | | +1.1KB | +4.2KB | +| net11.0 | 10.0KB | 46.9KB | +36.9KB | +16.5KB | | +1.1KB | +4.2KB | @@ -828,6 +828,11 @@ The class `Polyfill` includes the following extension methods: * `bool TryParse(string?, IFormatProvider?, double)` [reference](https://learn.microsoft.com/en-us/dotnet/api/system.double.tryparse?view=net-11.0#system-double-tryparse(system-string-system-iformatprovider-system-double@)) +#### Encoder + + * `void Convert(ReadOnlySpan, Span, bool, int, int, bool)` [reference](https://learn.microsoft.com/en-us/dotnet/api/system.text.encoder.convert?view=net-11.0#system-text-encoder-convert(system-readonlyspan((system-char))-system-span((system-byte))-system-boolean-system-int32@-system-int32@-system-boolean@)) + + #### Encoding * `int GetByteCount(ReadOnlySpan)` [reference](https://learn.microsoft.com/en-us/dotnet/api/system.text.encoding.getbytecount?view=net-11.0#system-text-encoding-getbytecount(system-readonlyspan((system-char)))) diff --git a/src/Consume/Consume.cs b/src/Consume/Consume.cs index cc72a8e8..1495f0f6 100644 --- a/src/Consume/Consume.cs +++ b/src/Consume/Consume.cs @@ -881,6 +881,15 @@ void Encoding_Methods() #endif } + void Encoder_Methods() + { +#if FeatureMemory + var encoder = Encoding.UTF8.GetEncoder(); + var bytes = new byte[16]; + encoder.Convert("text".AsSpan(), bytes.AsSpan(), true, out var charsUsed, out var bytesUsed, out var completed); +#endif + } + void Environment_Methods() { var processPath = Environment.ProcessPath; diff --git a/src/Polyfill/Base64Polyfill.cs b/src/Polyfill/Base64Polyfill.cs index 6fc1d669..a72fffe3 100644 --- a/src/Polyfill/Base64Polyfill.cs +++ b/src/Polyfill/Base64Polyfill.cs @@ -207,14 +207,14 @@ public static byte[] DecodeFromUtf8(ReadOnlySpan source) chars[i] = (char) source[i]; } - return Convert.FromBase64CharArray(chars, 0, chars.Length); + return System.Convert.FromBase64CharArray(chars, 0, chars.Length); } static string EncodeBase64(ReadOnlySpan source) => - source.IsEmpty ? string.Empty : Convert.ToBase64String(source.ToArray()); + source.IsEmpty ? string.Empty : System.Convert.ToBase64String(source.ToArray()); static byte[] DecodeBase64(ReadOnlySpan source) => - source.IsEmpty ? Array.Empty() : Convert.FromBase64CharArray(source.ToArray(), 0, source.Length); + source.IsEmpty ? Array.Empty() : System.Convert.FromBase64CharArray(source.ToArray(), 0, source.Length); } } diff --git a/src/Polyfill/EnumPolyfill.cs b/src/Polyfill/EnumPolyfill.cs index de5cf072..d892c136 100644 --- a/src/Polyfill/EnumPolyfill.cs +++ b/src/Polyfill/EnumPolyfill.cs @@ -55,7 +55,7 @@ public static Array GetValuesAsUnderlyingType(Type enumType) var result = Array.CreateInstance(underlyingType, values.Length); for (var i = 0; i < values.Length; i++) { - result.SetValue(Convert.ChangeType(values.GetValue(i)!, underlyingType), i); + result.SetValue(System.Convert.ChangeType(values.GetValue(i)!, underlyingType), i); } return result; diff --git a/src/Polyfill/Polyfill_Encoder.cs b/src/Polyfill/Polyfill_Encoder.cs new file mode 100644 index 00000000..900bf93b --- /dev/null +++ b/src/Polyfill/Polyfill_Encoder.cs @@ -0,0 +1,36 @@ +#if FeatureMemory + +namespace Polyfills; + +using System; +using System.Text; + +static partial class Polyfill +{ +#if !NETCOREAPP2_1_OR_GREATER && !NETSTANDARD2_1_OR_GREATER + /// + /// Converts a span of characters to an encoded byte sequence and stores the result in a byte span. + /// + //Link: https://learn.microsoft.com/en-us/dotnet/api/system.text.encoder.convert?view=net-11.0#system-text-encoder-convert(system-readonlyspan((system-char))-system-span((system-byte))-system-boolean-system-int32@-system-int32@-system-boolean@) +#if AllowUnsafeBlocks + public static unsafe void Convert(this Encoder target, ReadOnlySpan chars, Span bytes, bool flush, out int charsUsed, out int bytesUsed, out bool completed) + { + fixed (char* charsPtr = chars) + fixed (byte* bytesPtr = bytes) + { + target.Convert(charsPtr, chars.Length, bytesPtr, bytes.Length, flush, out charsUsed, out bytesUsed, out completed); + } + } +#else + public static void Convert(this Encoder target, ReadOnlySpan chars, Span bytes, bool flush, out int charsUsed, out int bytesUsed, out bool completed) + { + var charArray = chars.ToArray(); + var byteArray = new byte[bytes.Length]; + target.Convert(charArray, 0, charArray.Length, byteArray, 0, byteArray.Length, flush, out charsUsed, out bytesUsed, out completed); + new ReadOnlySpan(byteArray, 0, bytesUsed).CopyTo(bytes); + } +#endif +#endif +} + +#endif diff --git a/src/Split/net10.0/Base64Polyfill.cs b/src/Split/net10.0/Base64Polyfill.cs index c2d7dfb5..c1f2e6f7 100644 --- a/src/Split/net10.0/Base64Polyfill.cs +++ b/src/Split/net10.0/Base64Polyfill.cs @@ -162,12 +162,12 @@ public static byte[] DecodeFromUtf8(ReadOnlySpan source) { chars[i] = (char) source[i]; } - return Convert.FromBase64CharArray(chars, 0, chars.Length); + return System.Convert.FromBase64CharArray(chars, 0, chars.Length); } static string EncodeBase64(ReadOnlySpan source) => - source.IsEmpty ? string.Empty : Convert.ToBase64String(source.ToArray()); + source.IsEmpty ? string.Empty : System.Convert.ToBase64String(source.ToArray()); static byte[] DecodeBase64(ReadOnlySpan source) => - source.IsEmpty ? Array.Empty() : Convert.FromBase64CharArray(source.ToArray(), 0, source.Length); + source.IsEmpty ? Array.Empty() : System.Convert.FromBase64CharArray(source.ToArray(), 0, source.Length); } } #endif diff --git a/src/Split/net461/Base64Polyfill.cs b/src/Split/net461/Base64Polyfill.cs index c2d7dfb5..c1f2e6f7 100644 --- a/src/Split/net461/Base64Polyfill.cs +++ b/src/Split/net461/Base64Polyfill.cs @@ -162,12 +162,12 @@ public static byte[] DecodeFromUtf8(ReadOnlySpan source) { chars[i] = (char) source[i]; } - return Convert.FromBase64CharArray(chars, 0, chars.Length); + return System.Convert.FromBase64CharArray(chars, 0, chars.Length); } static string EncodeBase64(ReadOnlySpan source) => - source.IsEmpty ? string.Empty : Convert.ToBase64String(source.ToArray()); + source.IsEmpty ? string.Empty : System.Convert.ToBase64String(source.ToArray()); static byte[] DecodeBase64(ReadOnlySpan source) => - source.IsEmpty ? Array.Empty() : Convert.FromBase64CharArray(source.ToArray(), 0, source.Length); + source.IsEmpty ? Array.Empty() : System.Convert.FromBase64CharArray(source.ToArray(), 0, source.Length); } } #endif diff --git a/src/Split/net461/EnumPolyfill.cs b/src/Split/net461/EnumPolyfill.cs index 0b6b6dbb..41e014cd 100644 --- a/src/Split/net461/EnumPolyfill.cs +++ b/src/Split/net461/EnumPolyfill.cs @@ -40,7 +40,7 @@ public static Array GetValuesAsUnderlyingType(Type enumType) var result = Array.CreateInstance(underlyingType, values.Length); for (var i = 0; i < values.Length; i++) { - result.SetValue(Convert.ChangeType(values.GetValue(i)!, underlyingType), i); + result.SetValue(System.Convert.ChangeType(values.GetValue(i)!, underlyingType), i); } return result; } diff --git a/src/Split/net461/Polyfill_Encoder.cs b/src/Split/net461/Polyfill_Encoder.cs new file mode 100644 index 00000000..728825d0 --- /dev/null +++ b/src/Split/net461/Polyfill_Encoder.cs @@ -0,0 +1,31 @@ +// +#pragma warning disable +#if FeatureMemory +namespace Polyfills; +using System; +using System.Text; +static partial class Polyfill +{ + /// + /// Converts a span of characters to an encoded byte sequence and stores the result in a byte span. + /// +#if AllowUnsafeBlocks + public static unsafe void Convert(this Encoder target, ReadOnlySpan chars, Span bytes, bool flush, out int charsUsed, out int bytesUsed, out bool completed) + { + fixed (char* charsPtr = chars) + fixed (byte* bytesPtr = bytes) + { + target.Convert(charsPtr, chars.Length, bytesPtr, bytes.Length, flush, out charsUsed, out bytesUsed, out completed); + } + } +#else + public static void Convert(this Encoder target, ReadOnlySpan chars, Span bytes, bool flush, out int charsUsed, out int bytesUsed, out bool completed) + { + var charArray = chars.ToArray(); + var byteArray = new byte[bytes.Length]; + target.Convert(charArray, 0, charArray.Length, byteArray, 0, byteArray.Length, flush, out charsUsed, out bytesUsed, out completed); + new ReadOnlySpan(byteArray, 0, bytesUsed).CopyTo(bytes); + } +#endif +} +#endif diff --git a/src/Split/net462/Base64Polyfill.cs b/src/Split/net462/Base64Polyfill.cs index c2d7dfb5..c1f2e6f7 100644 --- a/src/Split/net462/Base64Polyfill.cs +++ b/src/Split/net462/Base64Polyfill.cs @@ -162,12 +162,12 @@ public static byte[] DecodeFromUtf8(ReadOnlySpan source) { chars[i] = (char) source[i]; } - return Convert.FromBase64CharArray(chars, 0, chars.Length); + return System.Convert.FromBase64CharArray(chars, 0, chars.Length); } static string EncodeBase64(ReadOnlySpan source) => - source.IsEmpty ? string.Empty : Convert.ToBase64String(source.ToArray()); + source.IsEmpty ? string.Empty : System.Convert.ToBase64String(source.ToArray()); static byte[] DecodeBase64(ReadOnlySpan source) => - source.IsEmpty ? Array.Empty() : Convert.FromBase64CharArray(source.ToArray(), 0, source.Length); + source.IsEmpty ? Array.Empty() : System.Convert.FromBase64CharArray(source.ToArray(), 0, source.Length); } } #endif diff --git a/src/Split/net462/EnumPolyfill.cs b/src/Split/net462/EnumPolyfill.cs index 0b6b6dbb..41e014cd 100644 --- a/src/Split/net462/EnumPolyfill.cs +++ b/src/Split/net462/EnumPolyfill.cs @@ -40,7 +40,7 @@ public static Array GetValuesAsUnderlyingType(Type enumType) var result = Array.CreateInstance(underlyingType, values.Length); for (var i = 0; i < values.Length; i++) { - result.SetValue(Convert.ChangeType(values.GetValue(i)!, underlyingType), i); + result.SetValue(System.Convert.ChangeType(values.GetValue(i)!, underlyingType), i); } return result; } diff --git a/src/Split/net462/Polyfill_Encoder.cs b/src/Split/net462/Polyfill_Encoder.cs new file mode 100644 index 00000000..728825d0 --- /dev/null +++ b/src/Split/net462/Polyfill_Encoder.cs @@ -0,0 +1,31 @@ +// +#pragma warning disable +#if FeatureMemory +namespace Polyfills; +using System; +using System.Text; +static partial class Polyfill +{ + /// + /// Converts a span of characters to an encoded byte sequence and stores the result in a byte span. + /// +#if AllowUnsafeBlocks + public static unsafe void Convert(this Encoder target, ReadOnlySpan chars, Span bytes, bool flush, out int charsUsed, out int bytesUsed, out bool completed) + { + fixed (char* charsPtr = chars) + fixed (byte* bytesPtr = bytes) + { + target.Convert(charsPtr, chars.Length, bytesPtr, bytes.Length, flush, out charsUsed, out bytesUsed, out completed); + } + } +#else + public static void Convert(this Encoder target, ReadOnlySpan chars, Span bytes, bool flush, out int charsUsed, out int bytesUsed, out bool completed) + { + var charArray = chars.ToArray(); + var byteArray = new byte[bytes.Length]; + target.Convert(charArray, 0, charArray.Length, byteArray, 0, byteArray.Length, flush, out charsUsed, out bytesUsed, out completed); + new ReadOnlySpan(byteArray, 0, bytesUsed).CopyTo(bytes); + } +#endif +} +#endif diff --git a/src/Split/net47/Base64Polyfill.cs b/src/Split/net47/Base64Polyfill.cs index c2d7dfb5..c1f2e6f7 100644 --- a/src/Split/net47/Base64Polyfill.cs +++ b/src/Split/net47/Base64Polyfill.cs @@ -162,12 +162,12 @@ public static byte[] DecodeFromUtf8(ReadOnlySpan source) { chars[i] = (char) source[i]; } - return Convert.FromBase64CharArray(chars, 0, chars.Length); + return System.Convert.FromBase64CharArray(chars, 0, chars.Length); } static string EncodeBase64(ReadOnlySpan source) => - source.IsEmpty ? string.Empty : Convert.ToBase64String(source.ToArray()); + source.IsEmpty ? string.Empty : System.Convert.ToBase64String(source.ToArray()); static byte[] DecodeBase64(ReadOnlySpan source) => - source.IsEmpty ? Array.Empty() : Convert.FromBase64CharArray(source.ToArray(), 0, source.Length); + source.IsEmpty ? Array.Empty() : System.Convert.FromBase64CharArray(source.ToArray(), 0, source.Length); } } #endif diff --git a/src/Split/net47/EnumPolyfill.cs b/src/Split/net47/EnumPolyfill.cs index 0b6b6dbb..41e014cd 100644 --- a/src/Split/net47/EnumPolyfill.cs +++ b/src/Split/net47/EnumPolyfill.cs @@ -40,7 +40,7 @@ public static Array GetValuesAsUnderlyingType(Type enumType) var result = Array.CreateInstance(underlyingType, values.Length); for (var i = 0; i < values.Length; i++) { - result.SetValue(Convert.ChangeType(values.GetValue(i)!, underlyingType), i); + result.SetValue(System.Convert.ChangeType(values.GetValue(i)!, underlyingType), i); } return result; } diff --git a/src/Split/net47/Polyfill_Encoder.cs b/src/Split/net47/Polyfill_Encoder.cs new file mode 100644 index 00000000..728825d0 --- /dev/null +++ b/src/Split/net47/Polyfill_Encoder.cs @@ -0,0 +1,31 @@ +// +#pragma warning disable +#if FeatureMemory +namespace Polyfills; +using System; +using System.Text; +static partial class Polyfill +{ + /// + /// Converts a span of characters to an encoded byte sequence and stores the result in a byte span. + /// +#if AllowUnsafeBlocks + public static unsafe void Convert(this Encoder target, ReadOnlySpan chars, Span bytes, bool flush, out int charsUsed, out int bytesUsed, out bool completed) + { + fixed (char* charsPtr = chars) + fixed (byte* bytesPtr = bytes) + { + target.Convert(charsPtr, chars.Length, bytesPtr, bytes.Length, flush, out charsUsed, out bytesUsed, out completed); + } + } +#else + public static void Convert(this Encoder target, ReadOnlySpan chars, Span bytes, bool flush, out int charsUsed, out int bytesUsed, out bool completed) + { + var charArray = chars.ToArray(); + var byteArray = new byte[bytes.Length]; + target.Convert(charArray, 0, charArray.Length, byteArray, 0, byteArray.Length, flush, out charsUsed, out bytesUsed, out completed); + new ReadOnlySpan(byteArray, 0, bytesUsed).CopyTo(bytes); + } +#endif +} +#endif diff --git a/src/Split/net471/Base64Polyfill.cs b/src/Split/net471/Base64Polyfill.cs index c2d7dfb5..c1f2e6f7 100644 --- a/src/Split/net471/Base64Polyfill.cs +++ b/src/Split/net471/Base64Polyfill.cs @@ -162,12 +162,12 @@ public static byte[] DecodeFromUtf8(ReadOnlySpan source) { chars[i] = (char) source[i]; } - return Convert.FromBase64CharArray(chars, 0, chars.Length); + return System.Convert.FromBase64CharArray(chars, 0, chars.Length); } static string EncodeBase64(ReadOnlySpan source) => - source.IsEmpty ? string.Empty : Convert.ToBase64String(source.ToArray()); + source.IsEmpty ? string.Empty : System.Convert.ToBase64String(source.ToArray()); static byte[] DecodeBase64(ReadOnlySpan source) => - source.IsEmpty ? Array.Empty() : Convert.FromBase64CharArray(source.ToArray(), 0, source.Length); + source.IsEmpty ? Array.Empty() : System.Convert.FromBase64CharArray(source.ToArray(), 0, source.Length); } } #endif diff --git a/src/Split/net471/EnumPolyfill.cs b/src/Split/net471/EnumPolyfill.cs index 0b6b6dbb..41e014cd 100644 --- a/src/Split/net471/EnumPolyfill.cs +++ b/src/Split/net471/EnumPolyfill.cs @@ -40,7 +40,7 @@ public static Array GetValuesAsUnderlyingType(Type enumType) var result = Array.CreateInstance(underlyingType, values.Length); for (var i = 0; i < values.Length; i++) { - result.SetValue(Convert.ChangeType(values.GetValue(i)!, underlyingType), i); + result.SetValue(System.Convert.ChangeType(values.GetValue(i)!, underlyingType), i); } return result; } diff --git a/src/Split/net471/Polyfill_Encoder.cs b/src/Split/net471/Polyfill_Encoder.cs new file mode 100644 index 00000000..728825d0 --- /dev/null +++ b/src/Split/net471/Polyfill_Encoder.cs @@ -0,0 +1,31 @@ +// +#pragma warning disable +#if FeatureMemory +namespace Polyfills; +using System; +using System.Text; +static partial class Polyfill +{ + /// + /// Converts a span of characters to an encoded byte sequence and stores the result in a byte span. + /// +#if AllowUnsafeBlocks + public static unsafe void Convert(this Encoder target, ReadOnlySpan chars, Span bytes, bool flush, out int charsUsed, out int bytesUsed, out bool completed) + { + fixed (char* charsPtr = chars) + fixed (byte* bytesPtr = bytes) + { + target.Convert(charsPtr, chars.Length, bytesPtr, bytes.Length, flush, out charsUsed, out bytesUsed, out completed); + } + } +#else + public static void Convert(this Encoder target, ReadOnlySpan chars, Span bytes, bool flush, out int charsUsed, out int bytesUsed, out bool completed) + { + var charArray = chars.ToArray(); + var byteArray = new byte[bytes.Length]; + target.Convert(charArray, 0, charArray.Length, byteArray, 0, byteArray.Length, flush, out charsUsed, out bytesUsed, out completed); + new ReadOnlySpan(byteArray, 0, bytesUsed).CopyTo(bytes); + } +#endif +} +#endif diff --git a/src/Split/net472/Base64Polyfill.cs b/src/Split/net472/Base64Polyfill.cs index c2d7dfb5..c1f2e6f7 100644 --- a/src/Split/net472/Base64Polyfill.cs +++ b/src/Split/net472/Base64Polyfill.cs @@ -162,12 +162,12 @@ public static byte[] DecodeFromUtf8(ReadOnlySpan source) { chars[i] = (char) source[i]; } - return Convert.FromBase64CharArray(chars, 0, chars.Length); + return System.Convert.FromBase64CharArray(chars, 0, chars.Length); } static string EncodeBase64(ReadOnlySpan source) => - source.IsEmpty ? string.Empty : Convert.ToBase64String(source.ToArray()); + source.IsEmpty ? string.Empty : System.Convert.ToBase64String(source.ToArray()); static byte[] DecodeBase64(ReadOnlySpan source) => - source.IsEmpty ? Array.Empty() : Convert.FromBase64CharArray(source.ToArray(), 0, source.Length); + source.IsEmpty ? Array.Empty() : System.Convert.FromBase64CharArray(source.ToArray(), 0, source.Length); } } #endif diff --git a/src/Split/net472/EnumPolyfill.cs b/src/Split/net472/EnumPolyfill.cs index 0b6b6dbb..41e014cd 100644 --- a/src/Split/net472/EnumPolyfill.cs +++ b/src/Split/net472/EnumPolyfill.cs @@ -40,7 +40,7 @@ public static Array GetValuesAsUnderlyingType(Type enumType) var result = Array.CreateInstance(underlyingType, values.Length); for (var i = 0; i < values.Length; i++) { - result.SetValue(Convert.ChangeType(values.GetValue(i)!, underlyingType), i); + result.SetValue(System.Convert.ChangeType(values.GetValue(i)!, underlyingType), i); } return result; } diff --git a/src/Split/net472/Polyfill_Encoder.cs b/src/Split/net472/Polyfill_Encoder.cs new file mode 100644 index 00000000..728825d0 --- /dev/null +++ b/src/Split/net472/Polyfill_Encoder.cs @@ -0,0 +1,31 @@ +// +#pragma warning disable +#if FeatureMemory +namespace Polyfills; +using System; +using System.Text; +static partial class Polyfill +{ + /// + /// Converts a span of characters to an encoded byte sequence and stores the result in a byte span. + /// +#if AllowUnsafeBlocks + public static unsafe void Convert(this Encoder target, ReadOnlySpan chars, Span bytes, bool flush, out int charsUsed, out int bytesUsed, out bool completed) + { + fixed (char* charsPtr = chars) + fixed (byte* bytesPtr = bytes) + { + target.Convert(charsPtr, chars.Length, bytesPtr, bytes.Length, flush, out charsUsed, out bytesUsed, out completed); + } + } +#else + public static void Convert(this Encoder target, ReadOnlySpan chars, Span bytes, bool flush, out int charsUsed, out int bytesUsed, out bool completed) + { + var charArray = chars.ToArray(); + var byteArray = new byte[bytes.Length]; + target.Convert(charArray, 0, charArray.Length, byteArray, 0, byteArray.Length, flush, out charsUsed, out bytesUsed, out completed); + new ReadOnlySpan(byteArray, 0, bytesUsed).CopyTo(bytes); + } +#endif +} +#endif diff --git a/src/Split/net48/Base64Polyfill.cs b/src/Split/net48/Base64Polyfill.cs index c2d7dfb5..c1f2e6f7 100644 --- a/src/Split/net48/Base64Polyfill.cs +++ b/src/Split/net48/Base64Polyfill.cs @@ -162,12 +162,12 @@ public static byte[] DecodeFromUtf8(ReadOnlySpan source) { chars[i] = (char) source[i]; } - return Convert.FromBase64CharArray(chars, 0, chars.Length); + return System.Convert.FromBase64CharArray(chars, 0, chars.Length); } static string EncodeBase64(ReadOnlySpan source) => - source.IsEmpty ? string.Empty : Convert.ToBase64String(source.ToArray()); + source.IsEmpty ? string.Empty : System.Convert.ToBase64String(source.ToArray()); static byte[] DecodeBase64(ReadOnlySpan source) => - source.IsEmpty ? Array.Empty() : Convert.FromBase64CharArray(source.ToArray(), 0, source.Length); + source.IsEmpty ? Array.Empty() : System.Convert.FromBase64CharArray(source.ToArray(), 0, source.Length); } } #endif diff --git a/src/Split/net48/EnumPolyfill.cs b/src/Split/net48/EnumPolyfill.cs index 0b6b6dbb..41e014cd 100644 --- a/src/Split/net48/EnumPolyfill.cs +++ b/src/Split/net48/EnumPolyfill.cs @@ -40,7 +40,7 @@ public static Array GetValuesAsUnderlyingType(Type enumType) var result = Array.CreateInstance(underlyingType, values.Length); for (var i = 0; i < values.Length; i++) { - result.SetValue(Convert.ChangeType(values.GetValue(i)!, underlyingType), i); + result.SetValue(System.Convert.ChangeType(values.GetValue(i)!, underlyingType), i); } return result; } diff --git a/src/Split/net48/Polyfill_Encoder.cs b/src/Split/net48/Polyfill_Encoder.cs new file mode 100644 index 00000000..728825d0 --- /dev/null +++ b/src/Split/net48/Polyfill_Encoder.cs @@ -0,0 +1,31 @@ +// +#pragma warning disable +#if FeatureMemory +namespace Polyfills; +using System; +using System.Text; +static partial class Polyfill +{ + /// + /// Converts a span of characters to an encoded byte sequence and stores the result in a byte span. + /// +#if AllowUnsafeBlocks + public static unsafe void Convert(this Encoder target, ReadOnlySpan chars, Span bytes, bool flush, out int charsUsed, out int bytesUsed, out bool completed) + { + fixed (char* charsPtr = chars) + fixed (byte* bytesPtr = bytes) + { + target.Convert(charsPtr, chars.Length, bytesPtr, bytes.Length, flush, out charsUsed, out bytesUsed, out completed); + } + } +#else + public static void Convert(this Encoder target, ReadOnlySpan chars, Span bytes, bool flush, out int charsUsed, out int bytesUsed, out bool completed) + { + var charArray = chars.ToArray(); + var byteArray = new byte[bytes.Length]; + target.Convert(charArray, 0, charArray.Length, byteArray, 0, byteArray.Length, flush, out charsUsed, out bytesUsed, out completed); + new ReadOnlySpan(byteArray, 0, bytesUsed).CopyTo(bytes); + } +#endif +} +#endif diff --git a/src/Split/net481/Base64Polyfill.cs b/src/Split/net481/Base64Polyfill.cs index c2d7dfb5..c1f2e6f7 100644 --- a/src/Split/net481/Base64Polyfill.cs +++ b/src/Split/net481/Base64Polyfill.cs @@ -162,12 +162,12 @@ public static byte[] DecodeFromUtf8(ReadOnlySpan source) { chars[i] = (char) source[i]; } - return Convert.FromBase64CharArray(chars, 0, chars.Length); + return System.Convert.FromBase64CharArray(chars, 0, chars.Length); } static string EncodeBase64(ReadOnlySpan source) => - source.IsEmpty ? string.Empty : Convert.ToBase64String(source.ToArray()); + source.IsEmpty ? string.Empty : System.Convert.ToBase64String(source.ToArray()); static byte[] DecodeBase64(ReadOnlySpan source) => - source.IsEmpty ? Array.Empty() : Convert.FromBase64CharArray(source.ToArray(), 0, source.Length); + source.IsEmpty ? Array.Empty() : System.Convert.FromBase64CharArray(source.ToArray(), 0, source.Length); } } #endif diff --git a/src/Split/net481/EnumPolyfill.cs b/src/Split/net481/EnumPolyfill.cs index 0b6b6dbb..41e014cd 100644 --- a/src/Split/net481/EnumPolyfill.cs +++ b/src/Split/net481/EnumPolyfill.cs @@ -40,7 +40,7 @@ public static Array GetValuesAsUnderlyingType(Type enumType) var result = Array.CreateInstance(underlyingType, values.Length); for (var i = 0; i < values.Length; i++) { - result.SetValue(Convert.ChangeType(values.GetValue(i)!, underlyingType), i); + result.SetValue(System.Convert.ChangeType(values.GetValue(i)!, underlyingType), i); } return result; } diff --git a/src/Split/net481/Polyfill_Encoder.cs b/src/Split/net481/Polyfill_Encoder.cs new file mode 100644 index 00000000..728825d0 --- /dev/null +++ b/src/Split/net481/Polyfill_Encoder.cs @@ -0,0 +1,31 @@ +// +#pragma warning disable +#if FeatureMemory +namespace Polyfills; +using System; +using System.Text; +static partial class Polyfill +{ + /// + /// Converts a span of characters to an encoded byte sequence and stores the result in a byte span. + /// +#if AllowUnsafeBlocks + public static unsafe void Convert(this Encoder target, ReadOnlySpan chars, Span bytes, bool flush, out int charsUsed, out int bytesUsed, out bool completed) + { + fixed (char* charsPtr = chars) + fixed (byte* bytesPtr = bytes) + { + target.Convert(charsPtr, chars.Length, bytesPtr, bytes.Length, flush, out charsUsed, out bytesUsed, out completed); + } + } +#else + public static void Convert(this Encoder target, ReadOnlySpan chars, Span bytes, bool flush, out int charsUsed, out int bytesUsed, out bool completed) + { + var charArray = chars.ToArray(); + var byteArray = new byte[bytes.Length]; + target.Convert(charArray, 0, charArray.Length, byteArray, 0, byteArray.Length, flush, out charsUsed, out bytesUsed, out completed); + new ReadOnlySpan(byteArray, 0, bytesUsed).CopyTo(bytes); + } +#endif +} +#endif diff --git a/src/Split/net5.0/Base64Polyfill.cs b/src/Split/net5.0/Base64Polyfill.cs index c2d7dfb5..c1f2e6f7 100644 --- a/src/Split/net5.0/Base64Polyfill.cs +++ b/src/Split/net5.0/Base64Polyfill.cs @@ -162,12 +162,12 @@ public static byte[] DecodeFromUtf8(ReadOnlySpan source) { chars[i] = (char) source[i]; } - return Convert.FromBase64CharArray(chars, 0, chars.Length); + return System.Convert.FromBase64CharArray(chars, 0, chars.Length); } static string EncodeBase64(ReadOnlySpan source) => - source.IsEmpty ? string.Empty : Convert.ToBase64String(source.ToArray()); + source.IsEmpty ? string.Empty : System.Convert.ToBase64String(source.ToArray()); static byte[] DecodeBase64(ReadOnlySpan source) => - source.IsEmpty ? Array.Empty() : Convert.FromBase64CharArray(source.ToArray(), 0, source.Length); + source.IsEmpty ? Array.Empty() : System.Convert.FromBase64CharArray(source.ToArray(), 0, source.Length); } } #endif diff --git a/src/Split/net5.0/EnumPolyfill.cs b/src/Split/net5.0/EnumPolyfill.cs index f8ddd8bb..567a7490 100644 --- a/src/Split/net5.0/EnumPolyfill.cs +++ b/src/Split/net5.0/EnumPolyfill.cs @@ -18,7 +18,7 @@ public static Array GetValuesAsUnderlyingType(Type enumType) var result = Array.CreateInstance(underlyingType, values.Length); for (var i = 0; i < values.Length; i++) { - result.SetValue(Convert.ChangeType(values.GetValue(i)!, underlyingType), i); + result.SetValue(System.Convert.ChangeType(values.GetValue(i)!, underlyingType), i); } return result; } diff --git a/src/Split/net6.0/Base64Polyfill.cs b/src/Split/net6.0/Base64Polyfill.cs index c2d7dfb5..c1f2e6f7 100644 --- a/src/Split/net6.0/Base64Polyfill.cs +++ b/src/Split/net6.0/Base64Polyfill.cs @@ -162,12 +162,12 @@ public static byte[] DecodeFromUtf8(ReadOnlySpan source) { chars[i] = (char) source[i]; } - return Convert.FromBase64CharArray(chars, 0, chars.Length); + return System.Convert.FromBase64CharArray(chars, 0, chars.Length); } static string EncodeBase64(ReadOnlySpan source) => - source.IsEmpty ? string.Empty : Convert.ToBase64String(source.ToArray()); + source.IsEmpty ? string.Empty : System.Convert.ToBase64String(source.ToArray()); static byte[] DecodeBase64(ReadOnlySpan source) => - source.IsEmpty ? Array.Empty() : Convert.FromBase64CharArray(source.ToArray(), 0, source.Length); + source.IsEmpty ? Array.Empty() : System.Convert.FromBase64CharArray(source.ToArray(), 0, source.Length); } } #endif diff --git a/src/Split/net6.0/EnumPolyfill.cs b/src/Split/net6.0/EnumPolyfill.cs index 92d275b6..3210c9e1 100644 --- a/src/Split/net6.0/EnumPolyfill.cs +++ b/src/Split/net6.0/EnumPolyfill.cs @@ -18,7 +18,7 @@ public static Array GetValuesAsUnderlyingType(Type enumType) var result = Array.CreateInstance(underlyingType, values.Length); for (var i = 0; i < values.Length; i++) { - result.SetValue(Convert.ChangeType(values.GetValue(i)!, underlyingType), i); + result.SetValue(System.Convert.ChangeType(values.GetValue(i)!, underlyingType), i); } return result; } diff --git a/src/Split/net7.0/Base64Polyfill.cs b/src/Split/net7.0/Base64Polyfill.cs index c2d7dfb5..c1f2e6f7 100644 --- a/src/Split/net7.0/Base64Polyfill.cs +++ b/src/Split/net7.0/Base64Polyfill.cs @@ -162,12 +162,12 @@ public static byte[] DecodeFromUtf8(ReadOnlySpan source) { chars[i] = (char) source[i]; } - return Convert.FromBase64CharArray(chars, 0, chars.Length); + return System.Convert.FromBase64CharArray(chars, 0, chars.Length); } static string EncodeBase64(ReadOnlySpan source) => - source.IsEmpty ? string.Empty : Convert.ToBase64String(source.ToArray()); + source.IsEmpty ? string.Empty : System.Convert.ToBase64String(source.ToArray()); static byte[] DecodeBase64(ReadOnlySpan source) => - source.IsEmpty ? Array.Empty() : Convert.FromBase64CharArray(source.ToArray(), 0, source.Length); + source.IsEmpty ? Array.Empty() : System.Convert.FromBase64CharArray(source.ToArray(), 0, source.Length); } } #endif diff --git a/src/Split/net8.0/Base64Polyfill.cs b/src/Split/net8.0/Base64Polyfill.cs index c2d7dfb5..c1f2e6f7 100644 --- a/src/Split/net8.0/Base64Polyfill.cs +++ b/src/Split/net8.0/Base64Polyfill.cs @@ -162,12 +162,12 @@ public static byte[] DecodeFromUtf8(ReadOnlySpan source) { chars[i] = (char) source[i]; } - return Convert.FromBase64CharArray(chars, 0, chars.Length); + return System.Convert.FromBase64CharArray(chars, 0, chars.Length); } static string EncodeBase64(ReadOnlySpan source) => - source.IsEmpty ? string.Empty : Convert.ToBase64String(source.ToArray()); + source.IsEmpty ? string.Empty : System.Convert.ToBase64String(source.ToArray()); static byte[] DecodeBase64(ReadOnlySpan source) => - source.IsEmpty ? Array.Empty() : Convert.FromBase64CharArray(source.ToArray(), 0, source.Length); + source.IsEmpty ? Array.Empty() : System.Convert.FromBase64CharArray(source.ToArray(), 0, source.Length); } } #endif diff --git a/src/Split/net9.0/Base64Polyfill.cs b/src/Split/net9.0/Base64Polyfill.cs index c2d7dfb5..c1f2e6f7 100644 --- a/src/Split/net9.0/Base64Polyfill.cs +++ b/src/Split/net9.0/Base64Polyfill.cs @@ -162,12 +162,12 @@ public static byte[] DecodeFromUtf8(ReadOnlySpan source) { chars[i] = (char) source[i]; } - return Convert.FromBase64CharArray(chars, 0, chars.Length); + return System.Convert.FromBase64CharArray(chars, 0, chars.Length); } static string EncodeBase64(ReadOnlySpan source) => - source.IsEmpty ? string.Empty : Convert.ToBase64String(source.ToArray()); + source.IsEmpty ? string.Empty : System.Convert.ToBase64String(source.ToArray()); static byte[] DecodeBase64(ReadOnlySpan source) => - source.IsEmpty ? Array.Empty() : Convert.FromBase64CharArray(source.ToArray(), 0, source.Length); + source.IsEmpty ? Array.Empty() : System.Convert.FromBase64CharArray(source.ToArray(), 0, source.Length); } } #endif diff --git a/src/Split/netcoreapp2.0/Base64Polyfill.cs b/src/Split/netcoreapp2.0/Base64Polyfill.cs index c2d7dfb5..c1f2e6f7 100644 --- a/src/Split/netcoreapp2.0/Base64Polyfill.cs +++ b/src/Split/netcoreapp2.0/Base64Polyfill.cs @@ -162,12 +162,12 @@ public static byte[] DecodeFromUtf8(ReadOnlySpan source) { chars[i] = (char) source[i]; } - return Convert.FromBase64CharArray(chars, 0, chars.Length); + return System.Convert.FromBase64CharArray(chars, 0, chars.Length); } static string EncodeBase64(ReadOnlySpan source) => - source.IsEmpty ? string.Empty : Convert.ToBase64String(source.ToArray()); + source.IsEmpty ? string.Empty : System.Convert.ToBase64String(source.ToArray()); static byte[] DecodeBase64(ReadOnlySpan source) => - source.IsEmpty ? Array.Empty() : Convert.FromBase64CharArray(source.ToArray(), 0, source.Length); + source.IsEmpty ? Array.Empty() : System.Convert.FromBase64CharArray(source.ToArray(), 0, source.Length); } } #endif diff --git a/src/Split/netcoreapp2.0/EnumPolyfill.cs b/src/Split/netcoreapp2.0/EnumPolyfill.cs index 30299e17..f035874c 100644 --- a/src/Split/netcoreapp2.0/EnumPolyfill.cs +++ b/src/Split/netcoreapp2.0/EnumPolyfill.cs @@ -40,7 +40,7 @@ public static Array GetValuesAsUnderlyingType(Type enumType) var result = Array.CreateInstance(underlyingType, values.Length); for (var i = 0; i < values.Length; i++) { - result.SetValue(Convert.ChangeType(values.GetValue(i)!, underlyingType), i); + result.SetValue(System.Convert.ChangeType(values.GetValue(i)!, underlyingType), i); } return result; } diff --git a/src/Split/netcoreapp2.0/Polyfill_Encoder.cs b/src/Split/netcoreapp2.0/Polyfill_Encoder.cs new file mode 100644 index 00000000..728825d0 --- /dev/null +++ b/src/Split/netcoreapp2.0/Polyfill_Encoder.cs @@ -0,0 +1,31 @@ +// +#pragma warning disable +#if FeatureMemory +namespace Polyfills; +using System; +using System.Text; +static partial class Polyfill +{ + /// + /// Converts a span of characters to an encoded byte sequence and stores the result in a byte span. + /// +#if AllowUnsafeBlocks + public static unsafe void Convert(this Encoder target, ReadOnlySpan chars, Span bytes, bool flush, out int charsUsed, out int bytesUsed, out bool completed) + { + fixed (char* charsPtr = chars) + fixed (byte* bytesPtr = bytes) + { + target.Convert(charsPtr, chars.Length, bytesPtr, bytes.Length, flush, out charsUsed, out bytesUsed, out completed); + } + } +#else + public static void Convert(this Encoder target, ReadOnlySpan chars, Span bytes, bool flush, out int charsUsed, out int bytesUsed, out bool completed) + { + var charArray = chars.ToArray(); + var byteArray = new byte[bytes.Length]; + target.Convert(charArray, 0, charArray.Length, byteArray, 0, byteArray.Length, flush, out charsUsed, out bytesUsed, out completed); + new ReadOnlySpan(byteArray, 0, bytesUsed).CopyTo(bytes); + } +#endif +} +#endif diff --git a/src/Split/netcoreapp2.1/Base64Polyfill.cs b/src/Split/netcoreapp2.1/Base64Polyfill.cs index c2d7dfb5..c1f2e6f7 100644 --- a/src/Split/netcoreapp2.1/Base64Polyfill.cs +++ b/src/Split/netcoreapp2.1/Base64Polyfill.cs @@ -162,12 +162,12 @@ public static byte[] DecodeFromUtf8(ReadOnlySpan source) { chars[i] = (char) source[i]; } - return Convert.FromBase64CharArray(chars, 0, chars.Length); + return System.Convert.FromBase64CharArray(chars, 0, chars.Length); } static string EncodeBase64(ReadOnlySpan source) => - source.IsEmpty ? string.Empty : Convert.ToBase64String(source.ToArray()); + source.IsEmpty ? string.Empty : System.Convert.ToBase64String(source.ToArray()); static byte[] DecodeBase64(ReadOnlySpan source) => - source.IsEmpty ? Array.Empty() : Convert.FromBase64CharArray(source.ToArray(), 0, source.Length); + source.IsEmpty ? Array.Empty() : System.Convert.FromBase64CharArray(source.ToArray(), 0, source.Length); } } #endif diff --git a/src/Split/netcoreapp2.1/EnumPolyfill.cs b/src/Split/netcoreapp2.1/EnumPolyfill.cs index 30299e17..f035874c 100644 --- a/src/Split/netcoreapp2.1/EnumPolyfill.cs +++ b/src/Split/netcoreapp2.1/EnumPolyfill.cs @@ -40,7 +40,7 @@ public static Array GetValuesAsUnderlyingType(Type enumType) var result = Array.CreateInstance(underlyingType, values.Length); for (var i = 0; i < values.Length; i++) { - result.SetValue(Convert.ChangeType(values.GetValue(i)!, underlyingType), i); + result.SetValue(System.Convert.ChangeType(values.GetValue(i)!, underlyingType), i); } return result; } diff --git a/src/Split/netcoreapp2.2/Base64Polyfill.cs b/src/Split/netcoreapp2.2/Base64Polyfill.cs index c2d7dfb5..c1f2e6f7 100644 --- a/src/Split/netcoreapp2.2/Base64Polyfill.cs +++ b/src/Split/netcoreapp2.2/Base64Polyfill.cs @@ -162,12 +162,12 @@ public static byte[] DecodeFromUtf8(ReadOnlySpan source) { chars[i] = (char) source[i]; } - return Convert.FromBase64CharArray(chars, 0, chars.Length); + return System.Convert.FromBase64CharArray(chars, 0, chars.Length); } static string EncodeBase64(ReadOnlySpan source) => - source.IsEmpty ? string.Empty : Convert.ToBase64String(source.ToArray()); + source.IsEmpty ? string.Empty : System.Convert.ToBase64String(source.ToArray()); static byte[] DecodeBase64(ReadOnlySpan source) => - source.IsEmpty ? Array.Empty() : Convert.FromBase64CharArray(source.ToArray(), 0, source.Length); + source.IsEmpty ? Array.Empty() : System.Convert.FromBase64CharArray(source.ToArray(), 0, source.Length); } } #endif diff --git a/src/Split/netcoreapp2.2/EnumPolyfill.cs b/src/Split/netcoreapp2.2/EnumPolyfill.cs index 30299e17..f035874c 100644 --- a/src/Split/netcoreapp2.2/EnumPolyfill.cs +++ b/src/Split/netcoreapp2.2/EnumPolyfill.cs @@ -40,7 +40,7 @@ public static Array GetValuesAsUnderlyingType(Type enumType) var result = Array.CreateInstance(underlyingType, values.Length); for (var i = 0; i < values.Length; i++) { - result.SetValue(Convert.ChangeType(values.GetValue(i)!, underlyingType), i); + result.SetValue(System.Convert.ChangeType(values.GetValue(i)!, underlyingType), i); } return result; } diff --git a/src/Split/netcoreapp3.0/Base64Polyfill.cs b/src/Split/netcoreapp3.0/Base64Polyfill.cs index c2d7dfb5..c1f2e6f7 100644 --- a/src/Split/netcoreapp3.0/Base64Polyfill.cs +++ b/src/Split/netcoreapp3.0/Base64Polyfill.cs @@ -162,12 +162,12 @@ public static byte[] DecodeFromUtf8(ReadOnlySpan source) { chars[i] = (char) source[i]; } - return Convert.FromBase64CharArray(chars, 0, chars.Length); + return System.Convert.FromBase64CharArray(chars, 0, chars.Length); } static string EncodeBase64(ReadOnlySpan source) => - source.IsEmpty ? string.Empty : Convert.ToBase64String(source.ToArray()); + source.IsEmpty ? string.Empty : System.Convert.ToBase64String(source.ToArray()); static byte[] DecodeBase64(ReadOnlySpan source) => - source.IsEmpty ? Array.Empty() : Convert.FromBase64CharArray(source.ToArray(), 0, source.Length); + source.IsEmpty ? Array.Empty() : System.Convert.FromBase64CharArray(source.ToArray(), 0, source.Length); } } #endif diff --git a/src/Split/netcoreapp3.0/EnumPolyfill.cs b/src/Split/netcoreapp3.0/EnumPolyfill.cs index 30299e17..f035874c 100644 --- a/src/Split/netcoreapp3.0/EnumPolyfill.cs +++ b/src/Split/netcoreapp3.0/EnumPolyfill.cs @@ -40,7 +40,7 @@ public static Array GetValuesAsUnderlyingType(Type enumType) var result = Array.CreateInstance(underlyingType, values.Length); for (var i = 0; i < values.Length; i++) { - result.SetValue(Convert.ChangeType(values.GetValue(i)!, underlyingType), i); + result.SetValue(System.Convert.ChangeType(values.GetValue(i)!, underlyingType), i); } return result; } diff --git a/src/Split/netcoreapp3.1/Base64Polyfill.cs b/src/Split/netcoreapp3.1/Base64Polyfill.cs index c2d7dfb5..c1f2e6f7 100644 --- a/src/Split/netcoreapp3.1/Base64Polyfill.cs +++ b/src/Split/netcoreapp3.1/Base64Polyfill.cs @@ -162,12 +162,12 @@ public static byte[] DecodeFromUtf8(ReadOnlySpan source) { chars[i] = (char) source[i]; } - return Convert.FromBase64CharArray(chars, 0, chars.Length); + return System.Convert.FromBase64CharArray(chars, 0, chars.Length); } static string EncodeBase64(ReadOnlySpan source) => - source.IsEmpty ? string.Empty : Convert.ToBase64String(source.ToArray()); + source.IsEmpty ? string.Empty : System.Convert.ToBase64String(source.ToArray()); static byte[] DecodeBase64(ReadOnlySpan source) => - source.IsEmpty ? Array.Empty() : Convert.FromBase64CharArray(source.ToArray(), 0, source.Length); + source.IsEmpty ? Array.Empty() : System.Convert.FromBase64CharArray(source.ToArray(), 0, source.Length); } } #endif diff --git a/src/Split/netcoreapp3.1/EnumPolyfill.cs b/src/Split/netcoreapp3.1/EnumPolyfill.cs index 30299e17..f035874c 100644 --- a/src/Split/netcoreapp3.1/EnumPolyfill.cs +++ b/src/Split/netcoreapp3.1/EnumPolyfill.cs @@ -40,7 +40,7 @@ public static Array GetValuesAsUnderlyingType(Type enumType) var result = Array.CreateInstance(underlyingType, values.Length); for (var i = 0; i < values.Length; i++) { - result.SetValue(Convert.ChangeType(values.GetValue(i)!, underlyingType), i); + result.SetValue(System.Convert.ChangeType(values.GetValue(i)!, underlyingType), i); } return result; } diff --git a/src/Split/netstandard2.0/Base64Polyfill.cs b/src/Split/netstandard2.0/Base64Polyfill.cs index c2d7dfb5..c1f2e6f7 100644 --- a/src/Split/netstandard2.0/Base64Polyfill.cs +++ b/src/Split/netstandard2.0/Base64Polyfill.cs @@ -162,12 +162,12 @@ public static byte[] DecodeFromUtf8(ReadOnlySpan source) { chars[i] = (char) source[i]; } - return Convert.FromBase64CharArray(chars, 0, chars.Length); + return System.Convert.FromBase64CharArray(chars, 0, chars.Length); } static string EncodeBase64(ReadOnlySpan source) => - source.IsEmpty ? string.Empty : Convert.ToBase64String(source.ToArray()); + source.IsEmpty ? string.Empty : System.Convert.ToBase64String(source.ToArray()); static byte[] DecodeBase64(ReadOnlySpan source) => - source.IsEmpty ? Array.Empty() : Convert.FromBase64CharArray(source.ToArray(), 0, source.Length); + source.IsEmpty ? Array.Empty() : System.Convert.FromBase64CharArray(source.ToArray(), 0, source.Length); } } #endif diff --git a/src/Split/netstandard2.0/EnumPolyfill.cs b/src/Split/netstandard2.0/EnumPolyfill.cs index 0b6b6dbb..41e014cd 100644 --- a/src/Split/netstandard2.0/EnumPolyfill.cs +++ b/src/Split/netstandard2.0/EnumPolyfill.cs @@ -40,7 +40,7 @@ public static Array GetValuesAsUnderlyingType(Type enumType) var result = Array.CreateInstance(underlyingType, values.Length); for (var i = 0; i < values.Length; i++) { - result.SetValue(Convert.ChangeType(values.GetValue(i)!, underlyingType), i); + result.SetValue(System.Convert.ChangeType(values.GetValue(i)!, underlyingType), i); } return result; } diff --git a/src/Split/netstandard2.0/Polyfill_Encoder.cs b/src/Split/netstandard2.0/Polyfill_Encoder.cs new file mode 100644 index 00000000..728825d0 --- /dev/null +++ b/src/Split/netstandard2.0/Polyfill_Encoder.cs @@ -0,0 +1,31 @@ +// +#pragma warning disable +#if FeatureMemory +namespace Polyfills; +using System; +using System.Text; +static partial class Polyfill +{ + /// + /// Converts a span of characters to an encoded byte sequence and stores the result in a byte span. + /// +#if AllowUnsafeBlocks + public static unsafe void Convert(this Encoder target, ReadOnlySpan chars, Span bytes, bool flush, out int charsUsed, out int bytesUsed, out bool completed) + { + fixed (char* charsPtr = chars) + fixed (byte* bytesPtr = bytes) + { + target.Convert(charsPtr, chars.Length, bytesPtr, bytes.Length, flush, out charsUsed, out bytesUsed, out completed); + } + } +#else + public static void Convert(this Encoder target, ReadOnlySpan chars, Span bytes, bool flush, out int charsUsed, out int bytesUsed, out bool completed) + { + var charArray = chars.ToArray(); + var byteArray = new byte[bytes.Length]; + target.Convert(charArray, 0, charArray.Length, byteArray, 0, byteArray.Length, flush, out charsUsed, out bytesUsed, out completed); + new ReadOnlySpan(byteArray, 0, bytesUsed).CopyTo(bytes); + } +#endif +} +#endif diff --git a/src/Split/netstandard2.1/Base64Polyfill.cs b/src/Split/netstandard2.1/Base64Polyfill.cs index c2d7dfb5..c1f2e6f7 100644 --- a/src/Split/netstandard2.1/Base64Polyfill.cs +++ b/src/Split/netstandard2.1/Base64Polyfill.cs @@ -162,12 +162,12 @@ public static byte[] DecodeFromUtf8(ReadOnlySpan source) { chars[i] = (char) source[i]; } - return Convert.FromBase64CharArray(chars, 0, chars.Length); + return System.Convert.FromBase64CharArray(chars, 0, chars.Length); } static string EncodeBase64(ReadOnlySpan source) => - source.IsEmpty ? string.Empty : Convert.ToBase64String(source.ToArray()); + source.IsEmpty ? string.Empty : System.Convert.ToBase64String(source.ToArray()); static byte[] DecodeBase64(ReadOnlySpan source) => - source.IsEmpty ? Array.Empty() : Convert.FromBase64CharArray(source.ToArray(), 0, source.Length); + source.IsEmpty ? Array.Empty() : System.Convert.FromBase64CharArray(source.ToArray(), 0, source.Length); } } #endif diff --git a/src/Split/netstandard2.1/EnumPolyfill.cs b/src/Split/netstandard2.1/EnumPolyfill.cs index 0b6b6dbb..41e014cd 100644 --- a/src/Split/netstandard2.1/EnumPolyfill.cs +++ b/src/Split/netstandard2.1/EnumPolyfill.cs @@ -40,7 +40,7 @@ public static Array GetValuesAsUnderlyingType(Type enumType) var result = Array.CreateInstance(underlyingType, values.Length); for (var i = 0; i < values.Length; i++) { - result.SetValue(Convert.ChangeType(values.GetValue(i)!, underlyingType), i); + result.SetValue(System.Convert.ChangeType(values.GetValue(i)!, underlyingType), i); } return result; } diff --git a/src/Split/uap10.0/Base64Polyfill.cs b/src/Split/uap10.0/Base64Polyfill.cs index c2d7dfb5..c1f2e6f7 100644 --- a/src/Split/uap10.0/Base64Polyfill.cs +++ b/src/Split/uap10.0/Base64Polyfill.cs @@ -162,12 +162,12 @@ public static byte[] DecodeFromUtf8(ReadOnlySpan source) { chars[i] = (char) source[i]; } - return Convert.FromBase64CharArray(chars, 0, chars.Length); + return System.Convert.FromBase64CharArray(chars, 0, chars.Length); } static string EncodeBase64(ReadOnlySpan source) => - source.IsEmpty ? string.Empty : Convert.ToBase64String(source.ToArray()); + source.IsEmpty ? string.Empty : System.Convert.ToBase64String(source.ToArray()); static byte[] DecodeBase64(ReadOnlySpan source) => - source.IsEmpty ? Array.Empty() : Convert.FromBase64CharArray(source.ToArray(), 0, source.Length); + source.IsEmpty ? Array.Empty() : System.Convert.FromBase64CharArray(source.ToArray(), 0, source.Length); } } #endif diff --git a/src/Split/uap10.0/EnumPolyfill.cs b/src/Split/uap10.0/EnumPolyfill.cs index 0b6b6dbb..41e014cd 100644 --- a/src/Split/uap10.0/EnumPolyfill.cs +++ b/src/Split/uap10.0/EnumPolyfill.cs @@ -40,7 +40,7 @@ public static Array GetValuesAsUnderlyingType(Type enumType) var result = Array.CreateInstance(underlyingType, values.Length); for (var i = 0; i < values.Length; i++) { - result.SetValue(Convert.ChangeType(values.GetValue(i)!, underlyingType), i); + result.SetValue(System.Convert.ChangeType(values.GetValue(i)!, underlyingType), i); } return result; } diff --git a/src/Split/uap10.0/Polyfill_Encoder.cs b/src/Split/uap10.0/Polyfill_Encoder.cs new file mode 100644 index 00000000..728825d0 --- /dev/null +++ b/src/Split/uap10.0/Polyfill_Encoder.cs @@ -0,0 +1,31 @@ +// +#pragma warning disable +#if FeatureMemory +namespace Polyfills; +using System; +using System.Text; +static partial class Polyfill +{ + /// + /// Converts a span of characters to an encoded byte sequence and stores the result in a byte span. + /// +#if AllowUnsafeBlocks + public static unsafe void Convert(this Encoder target, ReadOnlySpan chars, Span bytes, bool flush, out int charsUsed, out int bytesUsed, out bool completed) + { + fixed (char* charsPtr = chars) + fixed (byte* bytesPtr = bytes) + { + target.Convert(charsPtr, chars.Length, bytesPtr, bytes.Length, flush, out charsUsed, out bytesUsed, out completed); + } + } +#else + public static void Convert(this Encoder target, ReadOnlySpan chars, Span bytes, bool flush, out int charsUsed, out int bytesUsed, out bool completed) + { + var charArray = chars.ToArray(); + var byteArray = new byte[bytes.Length]; + target.Convert(charArray, 0, charArray.Length, byteArray, 0, byteArray.Length, flush, out charsUsed, out bytesUsed, out completed); + new ReadOnlySpan(byteArray, 0, bytesUsed).CopyTo(bytes); + } +#endif +} +#endif diff --git a/src/Tests/PolyfillTests_Encoder.cs b/src/Tests/PolyfillTests_Encoder.cs new file mode 100644 index 00000000..4d6c82dd --- /dev/null +++ b/src/Tests/PolyfillTests_Encoder.cs @@ -0,0 +1,52 @@ +#if FeatureMemory +partial class PolyfillTests +{ + [Test] + public async Task Encoder_Convert() + { + var encoder = Encoding.UTF8.GetEncoder(); + var chars = "Hello, World!".AsSpan(); + var bytes = new byte[Encoding.UTF8.GetByteCount("Hello, World!")]; + + encoder.Convert(chars, bytes.AsSpan(), true, out var charsUsed, out var bytesUsed, out var completed); + + await Assert.That(charsUsed).IsEqualTo(13); + await Assert.That(bytesUsed).IsEqualTo(13); + await Assert.That(completed).IsTrue(); + await Assert.That(bytes).IsEquivalentTo(Encoding.UTF8.GetBytes("Hello, World!")); + } + + [Test] + public async Task Encoder_Convert_PartialOutput() + { + var encoder = Encoding.UTF8.GetEncoder(); + var chars = "Hello, World!".AsSpan(); + // Output buffer smaller than the encoded length: only a prefix should be converted. + var bytes = new byte[5]; + + encoder.Convert(chars, bytes.AsSpan(), false, out var charsUsed, out var bytesUsed, out var completed); + + await Assert.That(charsUsed).IsEqualTo(5); + await Assert.That(bytesUsed).IsEqualTo(5); + await Assert.That(completed).IsFalse(); + await Assert.That(bytes).IsEquivalentTo(Encoding.UTF8.GetBytes("Hello")); + } + + [Test] + public async Task Encoder_Convert_SurrogatePair() + { + var encoder = Encoding.UTF8.GetEncoder(); + // U+1F600 GRINNING FACE, a surrogate pair that encodes to 4 UTF-8 bytes. + var text = "\U0001F600"; + var chars = text.AsSpan(); + var bytes = new byte[Encoding.UTF8.GetByteCount(text)]; + + encoder.Convert(chars, bytes.AsSpan(), true, out var charsUsed, out var bytesUsed, out var completed); + + await Assert.That(charsUsed).IsEqualTo(2); + await Assert.That(bytesUsed).IsEqualTo(4); + await Assert.That(completed).IsTrue(); + await Assert.That(bytes).IsEquivalentTo(Encoding.UTF8.GetBytes(text)); + } +} +#endif