Add ReadOnlySpan constructors to BitArray - #131500
Conversation
Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com> Copilot-Session: 4236475d-0243-488d-93d8-cd78e94d532b
|
Azure Pipelines: Successfully started running 3 pipeline(s). 13 pipeline(s) were filtered out due to trigger conditions. There may be pipelines that require an authorized user to comment /azp run to run. |
There was a problem hiding this comment.
Pull request overview
Adds new ReadOnlySpan<T>-based constructors to System.Collections.BitArray to enable allocation-free construction from span-backed inputs, while preserving existing array-constructor behaviors by routing them through the new span overloads. This extends the public System.Collections contract and provides test coverage for span-specific scenarios (slices, stackalloc, copy semantics, and SIMD boundary safety).
Changes:
- Added
BitArray(ReadOnlySpan<bool>),BitArray(ReadOnlySpan<byte>), andBitArray(ReadOnlySpan<int>)constructors and routed existing array constructors through them. - Updated the
System.Collectionsreference assembly to expose the new public constructors. - Expanded unit tests to validate span parity with array constructors, slicing/stackalloc usage, source independence, non-canonical bool handling, and vector boundary safety.
Reviewed changes
Copilot reviewed 3 out of 3 changed files in this pull request and generated no comments.
| File | Description |
|---|---|
| src/libraries/System.Private.CoreLib/src/System/Collections/BitArray.cs | Implements the new span constructors and reuses them from existing array constructors without changing established behaviors (null/overflow handling, packing semantics). |
| src/libraries/System.Collections/tests/BitArray/BitArray_CtorTests.cs | Adds coverage for span constructors (slices, stackalloc, copy semantics, non-canonical bools, and BoundedMemory OOB checks). |
| src/libraries/System.Collections/ref/System.Collections.cs | Adds the new public constructor signatures to the ref surface for System.Collections.BitArray. |
|
Azure Pipelines: Successfully started running 3 pipeline(s). 13 pipeline(s) were filtered out due to trigger conditions. There may be pipelines that require an authorized user to comment /azp run to run. |
Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com> Copilot-Session: 4236475d-0243-488d-93d8-cd78e94d532b
Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com> Copilot-Session: 4236475d-0243-488d-93d8-cd78e94d532b
jeffhandley
left a comment
There was a problem hiding this comment.
Suggestions for comments on the tests to make them easier to maintain over time (probably applies to existing tests too), but non-blocking.
| bool[] boolValues = [false, true, false, true, true, false]; | ||
| AssertBitArray(new BitArray(boolValues.AsSpan(1, 4)), [true, false, true, true]); |
There was a problem hiding this comment.
Suggestion: Add a comment that declares if/why the ordering of these values is intentional so that future maintainers know what can and cannot be changed without leaking a regression.
This could also be accomplished with a more descriptive test name.
| } | ||
|
|
||
| [Fact] | ||
| public static void Ctor_StackAllocatedSpans() |
There was a problem hiding this comment.
Suggestion: More descriptive test name or a comment here too
| [InlineData(64)] | ||
| [InlineData(67)] | ||
| [InlineData(100)] | ||
| public static void Ctor_BoolSpan_NonCanonicalTrueValues(int length) |
| Assert.Equal(bitArray.Length, clone.Length); | ||
| } | ||
|
|
||
| private static void AssertBitArray(BitArray bitArray, ReadOnlySpan<bool> expected) |
There was a problem hiding this comment.
Good idea refactoring this out
| /// "<paramref name="values"/>[0] & 1" represents bit 0, "<paramref name="values"/>[0] & 2" represents bit 1, | ||
| /// "<paramref name="values"/>[0] & 4" represents bit 2, and so on. | ||
| /// | ||
| /// This constructor is an <c>O(n)</c> operation, where <c>n</c> is the number of elements in <paramref name="values"/>. |
Summary
ReadOnlySpan<bool>,ReadOnlySpan<byte>, andReadOnlySpan<int>constructors toBitArray.Fixes #80263
Validation
BitArray_CtorTestspassed with default hardware intrinsicsBitArray_CtorTestspassed withDOTNET_EnableAVX2=0BitArray_CtorTestspassed withDOTNET_EnableHWIntrinsic=0System.Collectionstests passedPerformance
Full BenchmarkDotNet results from Windows ARM64 Release:
span.ToArray()workaround across the measured sizes.Note
This pull request description was generated with GitHub Copilot.