From 5ea2b81236796ea6e10bb74d69722d4598990fda Mon Sep 17 00:00:00 2001 From: varunu28 Date: Sat, 26 Aug 2023 13:35:12 -0700 Subject: [PATCH] Added Reverse StringBuilder functionality --- CHANGELOG.md | 4 ++++ stringbuilder.go | 9 +++++++++ stringbuilder_test.go | 37 +++++++++++++++++++++++++++++++++++++ 3 files changed, 50 insertions(+) diff --git a/CHANGELOG.md b/CHANGELOG.md index 61c0442..b564d35 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -6,6 +6,10 @@ All notable changes to **ValueStringBuilder** will be documented in this file. T ## [Unreleased] +### Added + +- `Reverse` is added to the string builder + ## [0.9.0] - 2023-08-26 ### Added diff --git a/stringbuilder.go b/stringbuilder.go index 7978aad..ff3824c 100644 --- a/stringbuilder.go +++ b/stringbuilder.go @@ -280,6 +280,15 @@ func (s *StringBuilder) AsRuneArray() []rune { return s.data } +// Reverses the characters of a string builder +func (s *StringBuilder) Reverse() *StringBuilder { + for left, right := 0, s.position-1; left < right; left, right = left+1, right-1 { + s.data[left], s.data[right] = s.data[right], s.data[left] + } + + return s +} + func (s *StringBuilder) grow(lenToAdd int) { // Grow times 2 until lenToAdd fits newLen := len(s.data) diff --git a/stringbuilder_test.go b/stringbuilder_test.go index ab2a871..0c1e7b4 100644 --- a/stringbuilder_test.go +++ b/stringbuilder_test.go @@ -407,6 +407,43 @@ func TestTrimWithWhitespacesAtTheStartAndEnd(t *testing.T) { } } +func TestReverseStringBuilder(t *testing.T) { + tests := []struct { + name string + insert []string + want string + }{ + {"Reverse odd length string builder", []string{"A", "B", "C"}, "CBA"}, + {"Reverse even length string builder", []string{"A", "B"}, "BA"}, + {"Reverse string builder of size 1", []string{"A"}, "A"}, + {"Reverse empty string builder", []string{}, ""}, + } + for _, tt := range tests { + t.Run(tt.name, func(t *testing.T) { + sb := &StringBuilder{} + + for _, s := range tt.insert { + sb = sb.Append(s) + } + + sb = sb.Reverse() + + if got := sb.ToString(); got != tt.want { + t.Errorf("StringBuilder.Reverse() = %v, want %v", got, tt.want) + } + }) + } +} + +func TestReuseReversedStringBuilder(t *testing.T) { + sb := StringBuilder{} + + sb = *sb.Append("A").Append("B").Append("C").Reverse().Append("X") + if got := sb.ToString(); got != "CBAX" { + t.Errorf("StringBuilder.Reverse() = %v, want %v", got, "CBAX") + } +} + func slicesEqual(a []int, b []int) bool { if len(a) != len(b) { return false