Skip to content

Commit ba6b4ec

Browse files
committed
feat: static Concat helpers
1 parent 0bca3d7 commit ba6b4ec

File tree

5 files changed

+160
-23
lines changed

5 files changed

+160
-23
lines changed
Lines changed: 108 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,108 @@
1+
namespace LinkDotNet.StringBuilder;
2+
3+
public ref partial struct ValueStringBuilder
4+
{
5+
/// <summary>
6+
/// Concatenates multiple objects together.
7+
/// </summary>
8+
/// <param name="values">Values, which will be concatenated together.</param>
9+
/// <typeparam name="T">Any given type, which can be translated to string.</typeparam>
10+
/// <returns>Concatenated string or an empty string if <see cref="values"/> is empty.</returns>
11+
public static string Concat<T>(params T[] values)
12+
{
13+
if (values.Length == 0)
14+
{
15+
return string.Empty;
16+
}
17+
18+
using var sb = new ValueStringBuilder(stackalloc char[128]);
19+
sb.AppendJoin(string.Empty, values);
20+
return sb.ToString();
21+
}
22+
23+
/// <summary>
24+
/// Concatenates two different types together.
25+
/// </summary>
26+
/// <typeparam name="T1">Typeparameter of <paramref name="arg1"/>.</typeparam>
27+
/// <typeparam name="T2">Typeparameter of <paramref name="arg2"/>.</typeparam>
28+
/// <param name="arg1">First argument.</param>
29+
/// <param name="arg2">Second argument.</param>
30+
/// <returns>String representation of the concateneted result.</returns>
31+
public static string Concat<T1, T2>(T1 arg1, T2 arg2)
32+
{
33+
using var sb = new ValueStringBuilder(stackalloc char[128]);
34+
sb.AppendInternal(arg1);
35+
sb.AppendInternal(arg2);
36+
37+
return sb.ToString();
38+
}
39+
40+
/// <summary>
41+
/// Concatenates two different types together.
42+
/// </summary>
43+
/// <typeparam name="T1">Typeparameter of <paramref name="arg1"/>.</typeparam>
44+
/// <typeparam name="T2">Typeparameter of <paramref name="arg2"/>.</typeparam>
45+
/// <typeparam name="T3">Typeparameter of <paramref name="arg3"/>.</typeparam>
46+
/// <param name="arg1">First argument.</param>
47+
/// <param name="arg2">Second argument.</param>
48+
/// <param name="arg3">Third argument.</param>
49+
/// <returns>String representation of the concateneted result.</returns>
50+
public static string Concat<T1, T2, T3>(T1 arg1, T2 arg2, T3 arg3)
51+
{
52+
using var sb = new ValueStringBuilder(stackalloc char[128]);
53+
sb.AppendInternal(arg1);
54+
sb.AppendInternal(arg2);
55+
sb.AppendInternal(arg3);
56+
57+
return sb.ToString();
58+
}
59+
60+
/// <summary>
61+
/// Concatenates two different types together.
62+
/// </summary>
63+
/// <typeparam name="T1">Typeparameter of <paramref name="arg1"/>.</typeparam>
64+
/// <typeparam name="T2">Typeparameter of <paramref name="arg2"/>.</typeparam>
65+
/// <typeparam name="T3">Typeparameter of <paramref name="arg3"/>.</typeparam>
66+
/// <typeparam name="T4">Typeparameter of <paramref name="arg4"/>.</typeparam>
67+
/// <param name="arg1">First argument.</param>
68+
/// <param name="arg2">Second argument.</param>
69+
/// <param name="arg3">Third argument.</param>
70+
/// <param name="arg4">Fourth argument.</param>
71+
/// <returns>String representation of the concateneted result.</returns>
72+
public static string Concat<T1, T2, T3, T4>(T1 arg1, T2 arg2, T3 arg3, T4 arg4)
73+
{
74+
using var sb = new ValueStringBuilder(stackalloc char[128]);
75+
sb.AppendInternal(arg1);
76+
sb.AppendInternal(arg2);
77+
sb.AppendInternal(arg3);
78+
sb.AppendInternal(arg4);
79+
80+
return sb.ToString();
81+
}
82+
83+
/// <summary>
84+
/// Concatenates two different types together.
85+
/// </summary>
86+
/// <typeparam name="T1">Typeparameter of <paramref name="arg1"/>.</typeparam>
87+
/// <typeparam name="T2">Typeparameter of <paramref name="arg2"/>.</typeparam>
88+
/// <typeparam name="T3">Typeparameter of <paramref name="arg3"/>.</typeparam>
89+
/// <typeparam name="T4">Typeparameter of <paramref name="arg4"/>.</typeparam>
90+
/// <typeparam name="T5">Typeparameter of <paramref name="arg5"/>.</typeparam>
91+
/// <param name="arg1">First argument.</param>
92+
/// <param name="arg2">Second argument.</param>
93+
/// <param name="arg3">Third argument.</param>
94+
/// <param name="arg4">Fourth argument.</param>
95+
/// <param name="arg5">Fifth argument.</param>
96+
/// <returns>String representation of the concateneted result.</returns>
97+
public static string Concat<T1, T2, T3, T4, T5>(T1 arg1, T2 arg2, T3 arg3, T4 arg4, T5 arg5)
98+
{
99+
using var sb = new ValueStringBuilder(stackalloc char[128]);
100+
sb.AppendInternal(arg1);
101+
sb.AppendInternal(arg2);
102+
sb.AppendInternal(arg3);
103+
sb.AppendInternal(arg4);
104+
sb.AppendInternal(arg5);
105+
106+
return sb.ToString();
107+
}
108+
}

src/LinkDotNet.StringBuilder/ValueStringBuilder.Helper.cs

Lines changed: 0 additions & 22 deletions
This file was deleted.

stylecop.analyzers.ruleset

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -242,7 +242,7 @@
242242
<Rule Id="S2376" Action="Info" />
243243
<Rule Id="S2386" Action="Info" />
244244
<Rule Id="S2387" Action="None" />
245-
<Rule Id="S2436" Action="Info" />
245+
<Rule Id="S2436" Action="None" />
246246
<Rule Id="S2437" Action="Info" />
247247
<Rule Id="S2479" Action="Info" />
248248
<Rule Id="S2486" Action="Info" />
Lines changed: 19 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,19 @@
1+
using BenchmarkDotNet.Attributes;
2+
3+
namespace LinkDotNet.StringBuilder.Benchmarks;
4+
5+
[MemoryDiagnoser]
6+
public class ConcatBenchmark
7+
{
8+
[Params("Hello World. How are you? What's going on?")]
9+
public string SomeString { get; set; } = default!;
10+
11+
[Params(2000)]
12+
public int SomeInt { get; set; }
13+
14+
[Benchmark]
15+
public string ConcatDotNet() => string.Concat(SomeString, SomeInt, 2d, DateTime.Now, 1f / 3f);
16+
17+
[Benchmark]
18+
public string Concat() => ValueStringBuilder.Concat(SomeString, SomeInt, 2d, DateTime.Now, 1f / 3f);
19+
}

tests/LinkDotNet.StringBuilder.UnitTests/ValueStringBuilderTests.cs

Lines changed: 32 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -352,4 +352,36 @@ public void ShouldConcatStringsTogether()
352352

353353
result.Should().Be("Hello World");
354354
}
355+
356+
[Fact]
357+
public void ConcatDifferentTypesWithTwoArguments()
358+
{
359+
var result = ValueStringBuilder.Concat("Test", 1);
360+
361+
result.Should().Be("Test1");
362+
}
363+
364+
[Fact]
365+
public void ConcatDifferentTypesWithThreeArguments()
366+
{
367+
var result = ValueStringBuilder.Concat("Test", 1, 2);
368+
369+
result.Should().Be("Test12");
370+
}
371+
372+
[Fact]
373+
public void ConcatDifferentTypesWithFourArguments()
374+
{
375+
var result = ValueStringBuilder.Concat("Test", 1, 2, 3);
376+
377+
result.Should().Be("Test123");
378+
}
379+
380+
[Fact]
381+
public void ConcatDifferentTypesWithFiveArguments()
382+
{
383+
var result = ValueStringBuilder.Concat("Test", 1, 2, 3, 4);
384+
385+
result.Should().Be("Test1234");
386+
}
355387
}

0 commit comments

Comments
 (0)