File tree 4 files changed +68
-0
lines changed
src/LinkDotNet.StringBuilder
tests/LinkDotNet.StringBuilder.UnitTests
4 files changed +68
-0
lines changed Original file line number Diff line number Diff line change @@ -6,6 +6,10 @@ All notable changes to **ValueStringBuilder** will be documented in this file. T
6
6
7
7
## [ Unreleased]
8
8
9
+ ### Added
10
+
11
+ - Added custom enumerator to ` ValueStringBuilder ` so it can be used in ` foreach ` loops
12
+
9
13
## [ 1.17.0] - 2023-04-13
10
14
11
15
### Added
Original file line number Diff line number Diff line change
1
+ using System . Runtime . CompilerServices ;
2
+ using System . Runtime . InteropServices ;
3
+
4
+ namespace LinkDotNet . StringBuilder ;
5
+
6
+ public ref partial struct ValueStringBuilder
7
+ {
8
+ public readonly Enumerator GetEnumerator ( ) => new ( buffer [ ..bufferPosition ] ) ;
9
+
10
+ /// <summary>Enumerates the elements of a <see cref="Span{T}"/>.</summary>
11
+ [ StructLayout ( LayoutKind . Auto ) ]
12
+ public ref struct Enumerator
13
+ {
14
+ private readonly Span < char > span ;
15
+ private int index ;
16
+
17
+ /// <summary>Initializes a new instance of the <see cref="Enumerator"/> struct.</summary>
18
+ /// <param name="span">The span to enumerate.</param>
19
+ [ MethodImpl ( MethodImplOptions . AggressiveInlining ) ]
20
+ internal Enumerator ( Span < char > span )
21
+ {
22
+ this . span = span ;
23
+ index = - 1 ;
24
+ }
25
+
26
+ /// <summary>Gets the element at the current position of the enumerator.</summary>
27
+ public ref char Current
28
+ {
29
+ [ MethodImpl ( MethodImplOptions . AggressiveInlining ) ]
30
+ get => ref span [ index ] ;
31
+ }
32
+
33
+ /// <summary>Advances the enumerator to the next element of the span.</summary>
34
+ /// <returns>True if the enumerator was successfully advanced to the next element; false if the enumerator has passed the end of the span.</returns>
35
+ [ MethodImpl ( MethodImplOptions . AggressiveInlining ) ]
36
+ public bool MoveNext ( )
37
+ {
38
+ var nextIndex = index + 1 ;
39
+ if ( nextIndex < span . Length )
40
+ {
41
+ index = nextIndex ;
42
+ return true ;
43
+ }
44
+
45
+ return false ;
46
+ }
47
+ }
48
+ }
Original file line number Diff line number Diff line change 9
9
<Rule Id =" CA1009" Action =" Warning" />
10
10
<Rule Id =" CA1016" Action =" Warning" />
11
11
<Rule Id =" CA1033" Action =" Warning" />
12
+ <Rule Id =" CA1034" Action =" None" />
13
+ <Rule Id =" CA1033" Action =" Warning" />
12
14
<Rule Id =" CA1049" Action =" Warning" />
13
15
<Rule Id =" CA1060" Action =" Warning" />
14
16
<Rule Id =" CA1061" Action =" Warning" />
Original file line number Diff line number Diff line change @@ -489,4 +489,18 @@ public void GivenAString_WhenCallingToStringWithRange_ThenShouldReturnSubstring(
489
489
490
490
builder . ToString ( 1 ..4 ) . Should ( ) . Be ( "ell" ) ;
491
491
}
492
+
493
+ [ Fact ]
494
+ public void GivenAString_WhenEnumerating_ThenShouldReturnCharacters ( )
495
+ {
496
+ using var builder = new ValueStringBuilder ( "Hello World" ) ;
497
+ var output = string . Empty ;
498
+
499
+ foreach ( var c in builder )
500
+ {
501
+ output += c ;
502
+ }
503
+
504
+ output . Should ( ) . Be ( "Hello World" ) ;
505
+ }
492
506
}
You can’t perform that action at this time.
0 commit comments