Skip to content

Commit d2b1558

Browse files
fix: circular reference
1 parent 0e71a6e commit d2b1558

File tree

3 files changed

+92
-49
lines changed

3 files changed

+92
-49
lines changed

Src/StringBuilderArray.Tests/StringBuilderArrayFixture.cs

Lines changed: 42 additions & 24 deletions
Original file line numberDiff line numberDiff line change
@@ -8,103 +8,115 @@ namespace StringBuilderArrayTests
88
[TestFixture]
99
public class StringBuilderArrayFixture
1010
{
11+
public static object[] LengthCases = { 5, 7, 10, 50, 100, 1000, 2500 };
12+
1113
[Test]
12-
public void AppendTest()
14+
[TestCaseSource(nameof(LengthCases))]
15+
public void AppendTest(int length)
1316
{
17+
var strBuilded = new string('a', length - 1);
1418
var sb = new StringBuilder();
1519
for (int i = 0; i < 53; i++)
1620
{
17-
sb.Append(i.ToString());
21+
sb.Append(i.ToString() + strBuilded);
1822
}
1923

2024
var sbArr = new StringBuilderArray.StringBuilderArray();
2125
for (int i = 0; i < 53; i++)
2226
{
23-
sbArr.Append(i.ToString());
27+
sbArr.Append(i.ToString() + strBuilded);
2428
}
2529

2630
Assert.That(sb.ToString(), Is.EqualTo(sbArr.ToString()));
2731
}
2832

2933
[Test]
30-
public void AppendClearTest()
34+
[TestCaseSource(nameof(LengthCases))]
35+
public void AppendClearTest(int length)
3136
{
37+
var strBuilded = new string('a', length - 1);
3238
var sb = new StringBuilder();
3339
for (int i = 53; i < 70; i++)
3440
{
35-
sb.Append(i.ToString());
41+
sb.Append(i.ToString() + strBuilded);
3642
}
3743

3844
var sbArr = new StringBuilderArray.StringBuilderArray();
3945
for (int i = 0; i < 53; i++)
4046
{
41-
sbArr.Append(i.ToString());
47+
sbArr.Append(i.ToString() + strBuilded);
4248
}
4349
sbArr.Clear();
4450
for (int i = 53; i < 70; i++)
4551
{
46-
sbArr.Append(i.ToString());
52+
sbArr.Append(i.ToString() + strBuilded);
4753
}
4854

4955
Assert.That(sb.ToString(), Is.EqualTo(sbArr.ToString()));
5056
}
5157

5258
[Test]
53-
public void AppendLineTest()
59+
[TestCaseSource(nameof(LengthCases))]
60+
public void AppendLineTest(int length)
5461
{
62+
var strBuilded = new string('a', length - 1);
5563
var sb = new StringBuilder();
5664
for (int i = 0; i < 53; i++)
5765
{
58-
sb.AppendLine(i.ToString());
66+
sb.AppendLine(i.ToString() + strBuilded);
5967
}
6068

6169
var sbArr = new StringBuilderArray.StringBuilderArray();
6270
for (int i = 0; i < 53; i++)
6371
{
64-
sbArr.AppendLine(i.ToString());
72+
sbArr.AppendLine(i.ToString() + strBuilded);
6573
}
6674

6775
Assert.That(sb.ToString(), Is.EqualTo(sbArr.ToString()));
6876
}
6977

7078
[Test]
71-
public void AppendLineClearTest()
79+
[TestCaseSource(nameof(LengthCases))]
80+
public void AppendLineClearTest(int length)
7281
{
82+
var strBuilded = new string('a', length - 1);
7383
var sb = new StringBuilder();
7484
for (int i = 53; i < 70; i++)
7585
{
76-
sb.AppendLine(i.ToString());
86+
sb.AppendLine(i.ToString() + strBuilded);
7787
}
7888

7989
var sbArr = new StringBuilderArray.StringBuilderArray();
8090
for (int i = 0; i < 53; i++)
8191
{
82-
sbArr.AppendLine(i.ToString());
92+
sbArr.AppendLine(i.ToString() + strBuilded);
8393
}
8494
sbArr.Clear();
8595
for (int i = 53; i < 70; i++)
8696
{
87-
sbArr.AppendLine(i.ToString());
97+
sbArr.AppendLine(i.ToString() + strBuilded);
8898
}
8999

90100
Assert.That(sb.ToString(), Is.EqualTo(sbArr.ToString()));
91101
}
92102

93103
[Test]
94-
public void AppendLineEnumerableTest()
104+
[TestCaseSource(nameof(LengthCases))]
105+
public void AppendLineEnumerableTest(int length)
95106
{
107+
var strBuilded = new string('a', length - 1);
96108
var list = new List<string>();
97109
for (int i = 0; i < 53; i++)
98110
{
99-
var text = i.ToString();
111+
var text = i.ToString() + strBuilded;
100112
list.Add(text);
101113
list.Add(Environment.NewLine);
102114
}
103115

104116
var sbArr = new StringBuilderArray.StringBuilderArray();
105117
for (int i = 0; i < 53; i++)
106118
{
107-
sbArr.AppendLine(i.ToString());
119+
sbArr.AppendLine(i.ToString() + strBuilded);
108120
}
109121

110122
var index = 0;
@@ -115,19 +127,21 @@ public void AppendLineEnumerableTest()
115127
}
116128

117129
[Test]
118-
public void AppendEnumerableTest()
130+
[TestCaseSource(nameof(LengthCases))]
131+
public void AppendEnumerableTest(int length)
119132
{
133+
var strBuilded = new string('a', length - 1);
120134
var list = new List<string>();
121135
for (int i = 0; i < 53; i++)
122136
{
123-
var text = i.ToString();
137+
var text = i.ToString() + strBuilded;
124138
list.Add(text);
125139
}
126140

127141
var sbArr = new StringBuilderArray.StringBuilderArray();
128142
for (int i = 0; i < 53; i++)
129143
{
130-
sbArr.Append(i.ToString());
144+
sbArr.Append(i.ToString() + strBuilded);
131145
}
132146

133147
var index = 0;
@@ -138,13 +152,15 @@ public void AppendEnumerableTest()
138152
}
139153

140154
[Test]
141-
public void AppendArrayTest()
155+
[TestCaseSource(nameof(LengthCases))]
156+
public void AppendArrayTest(int length)
142157
{
158+
var strBuilded = new string('a', length - 1);
143159
var sb = new StringBuilder();
144160
var list = new List<string>();
145161
for (int i = 0; i < 53; i++)
146162
{
147-
var text = i.ToString();
163+
var text = i.ToString() + strBuilded;
148164
list.Add(text);
149165
sb.Append(text);
150166
}
@@ -162,14 +178,16 @@ public void AppendArrayTest()
162178
}
163179

164180
[Test]
165-
public void AppendLineArrayTest()
181+
[TestCaseSource(nameof(LengthCases))]
182+
public void AppendLineArrayTest(int length)
166183
{
184+
var strBuilded = new string('a', length - 1);
167185
var sb = new StringBuilder();
168186
var list = new List<string>();
169187
var listInput = new List<string>();
170188
for (int i = 0; i < 53; i++)
171189
{
172-
var text = i.ToString();
190+
var text = i.ToString() + strBuilded;
173191
listInput.Add(text);
174192
list.Add(text);
175193
list.Add(Environment.NewLine);

Src/StringBuilderArray/StringBuilderArray.cs

Lines changed: 49 additions & 24 deletions
Original file line numberDiff line numberDiff line change
@@ -25,17 +25,8 @@ public StringBuilderArray(string[] buffer, int usedSize)
2525
_size = usedSize;
2626
}
2727

28-
private StringBuilderArray(StringBuilderArray stringBuilderArray)
28+
private StringBuilderArray()
2929
{
30-
_buffer = stringBuilderArray._buffer;
31-
_size = stringBuilderArray._size;
32-
_previous = stringBuilderArray._previous;
33-
if(_previous != null)
34-
{
35-
_previous._next = this;
36-
}
37-
38-
_next = stringBuilderArray;
3930
}
4031

4132
public int Length
@@ -76,24 +67,41 @@ private void MakeThisPrevious()
7667
{
7768
if(_next != null)
7869
{
79-
_previous = new StringBuilderArray(this);
80-
_next._previous = null;
81-
70+
var tempBuffer = _buffer;
8271
_buffer = _next._buffer;
83-
_next._buffer = null;
72+
_next._buffer = tempBuffer;
73+
74+
var tempSize = _size;
75+
_next._size = tempSize;
76+
_size = 0;
77+
78+
_previous = _next;
79+
_next._previous = this;
8480

8581
var tempNext = _next;
86-
_next = _next._next;
87-
tempNext._next = null;
82+
_next = tempNext._next;
83+
tempNext._next = this;
8884
}
8985
else
9086
{
91-
_previous = new StringBuilderArray(this);
87+
//create new as prev and swith data to prev
88+
var tempPrev = new StringBuilderArray();
89+
tempPrev._buffer = _buffer;
9290
int newBufferLength = Math.Max(10, Math.Min(_buffer.Length * 2, MaxChunkSize));
9391
_buffer = new string[newBufferLength];
94-
}
92+
93+
tempPrev._size = _size;
94+
_size = 0;
95+
96+
tempPrev._previous = _previous;
97+
_previous = tempPrev;
9598

96-
_size = 0;
99+
tempPrev._next = this;
100+
if(tempPrev._previous != null)
101+
{
102+
tempPrev._previous._next = tempPrev;
103+
}
104+
}
97105
}
98106

99107
public StringBuilderArray AppendLine(string str)
@@ -126,6 +134,17 @@ public StringBuilderArray AppendLine(IList<string> strings)
126134

127135
public StringBuilderArray Clear()
128136
{
137+
if(_previous == null && _next == null)
138+
{
139+
_size = 0;
140+
#if NET6_0_OR_GREATER
141+
Array.Clear(_buffer);
142+
#else
143+
Array.Clear(_buffer, 0, _buffer.Length);
144+
#endif
145+
return this;
146+
}
147+
129148
StringBuilderArray head = null;
130149
var current = this;
131150
do
@@ -153,12 +172,18 @@ public StringBuilderArray Clear()
153172
}
154173

155174
//make this head
156-
_previous = null;
157-
_next = head._next;
175+
//create new as prev and swith data to prev
176+
var tempBuffer = _buffer;
158177
_buffer = head._buffer;
159-
_size = 0;
160-
head._next = null;
161-
head._previous = null;
178+
head._buffer = tempBuffer;
179+
180+
var tempPr = _previous;
181+
_previous = null;
182+
if(tempPr._previous != null)
183+
{
184+
tempPr._previous._next = tempPr;
185+
}
186+
head._previous = tempPr;
162187

163188
return this;
164189
}

Src/StringBuilderArray/StringBuilderArray.csproj

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -5,7 +5,7 @@
55
</PropertyGroup>
66
<PropertyGroup>
77
<PackageId>StringBuilderArray</PackageId>
8-
<PackageVersion>1.2.0.0</PackageVersion>
8+
<PackageVersion>1.2.1.0</PackageVersion>
99
<Authors>Brevnov Vyacheslav Sergeevich</Authors>
1010
<RepositoryUrl>https://github.com/SoftStoneDevelop/StringBuilderArray</RepositoryUrl>
1111
<PackageRequireLicenseAcceptance>false</PackageRequireLicenseAcceptance>

0 commit comments

Comments
 (0)