Skip to content

Commit a8b58b6

Browse files
authored
Merge pull request #7 from linkdotnet/reverse-stringbuilder
Added Reverse StringBuilder functionality
2 parents 76dc99e + 5ea2b81 commit a8b58b6

File tree

3 files changed

+50
-0
lines changed

3 files changed

+50
-0
lines changed

CHANGELOG.md

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -6,6 +6,10 @@ All notable changes to **ValueStringBuilder** will be documented in this file. T
66

77
## [Unreleased]
88

9+
### Added
10+
11+
- `Reverse` is added to the string builder
12+
913
## [0.9.0] - 2023-08-26
1014

1115
### Added

stringbuilder.go

Lines changed: 9 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -280,6 +280,15 @@ func (s *StringBuilder) AsRuneArray() []rune {
280280
return s.data
281281
}
282282

283+
// Reverses the characters of a string builder
284+
func (s *StringBuilder) Reverse() *StringBuilder {
285+
for left, right := 0, s.position-1; left < right; left, right = left+1, right-1 {
286+
s.data[left], s.data[right] = s.data[right], s.data[left]
287+
}
288+
289+
return s
290+
}
291+
283292
func (s *StringBuilder) grow(lenToAdd int) {
284293
// Grow times 2 until lenToAdd fits
285294
newLen := len(s.data)

stringbuilder_test.go

Lines changed: 37 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -407,6 +407,43 @@ func TestTrimWithWhitespacesAtTheStartAndEnd(t *testing.T) {
407407
}
408408
}
409409

410+
func TestReverseStringBuilder(t *testing.T) {
411+
tests := []struct {
412+
name string
413+
insert []string
414+
want string
415+
}{
416+
{"Reverse odd length string builder", []string{"A", "B", "C"}, "CBA"},
417+
{"Reverse even length string builder", []string{"A", "B"}, "BA"},
418+
{"Reverse string builder of size 1", []string{"A"}, "A"},
419+
{"Reverse empty string builder", []string{}, ""},
420+
}
421+
for _, tt := range tests {
422+
t.Run(tt.name, func(t *testing.T) {
423+
sb := &StringBuilder{}
424+
425+
for _, s := range tt.insert {
426+
sb = sb.Append(s)
427+
}
428+
429+
sb = sb.Reverse()
430+
431+
if got := sb.ToString(); got != tt.want {
432+
t.Errorf("StringBuilder.Reverse() = %v, want %v", got, tt.want)
433+
}
434+
})
435+
}
436+
}
437+
438+
func TestReuseReversedStringBuilder(t *testing.T) {
439+
sb := StringBuilder{}
440+
441+
sb = *sb.Append("A").Append("B").Append("C").Reverse().Append("X")
442+
if got := sb.ToString(); got != "CBAX" {
443+
t.Errorf("StringBuilder.Reverse() = %v, want %v", got, "CBAX")
444+
}
445+
}
446+
410447
func slicesEqual(a []int, b []int) bool {
411448
if len(a) != len(b) {
412449
return false

0 commit comments

Comments
 (0)