Skip to content

Commit 3eebf87

Browse files
committed
Implement methods
1 parent 0cda8af commit 3eebf87

1 file changed

Lines changed: 87 additions & 33 deletions

File tree

src/DynamoDBGenerator/Internal/MarshallHelper.cs

Lines changed: 87 additions & 33 deletions
Original file line numberDiff line numberDiff line change
@@ -1,10 +1,9 @@
11
using System;
2-
using System.Buffers;
3-
using System.Collections;
42
using System.Collections.Generic;
53
using System.Diagnostics.CodeAnalysis;
64
using System.Linq;
75
using System.Numerics;
6+
using System.Runtime.CompilerServices;
87
using Amazon.DynamoDBv2.Model;
98
using static System.Runtime.InteropServices.CollectionsMarshal;
109

@@ -24,9 +23,12 @@ public static class MarshallHelper
2423
[return: NotNullIfNotNull(nameof(dict))]
2524
public static AttributeValue? ToAttributeValue(
2625
[NotNullIfNotNull(nameof(dict))] Dictionary<string, AttributeValue>? dict
27-
) => dict is null
28-
? null
29-
: new AttributeValue { M = dict };
26+
)
27+
{
28+
return dict is null
29+
? null
30+
: new AttributeValue { M = dict };
31+
}
3032

3133
public static AttributeValue FromDictionary<T, TArgument>(
3234
IEnumerable<KeyValuePair<string, T>> dictionary,
@@ -74,9 +76,7 @@ public static AttributeValue FromNumberSet<T>(IEnumerable<T> numbers, string? da
7476
var list = new List<string>(count);
7577

7678
foreach (var @string in numbers)
77-
{
7879
list.Add(@string.ToString() ?? throw ExceptionHelper.NotNull($"{dataMember}[UNKNOWN]"));
79-
}
8080

8181
return new AttributeValue { NS = list };
8282
}
@@ -117,60 +117,114 @@ public static AttributeValue FromStringSet(IEnumerable<string> strings, string?
117117
var list = new List<string>(count);
118118

119119
foreach (var @string in strings)
120-
{
121120
list.Add(@string ?? throw ExceptionHelper.NotNull($"{dataMember}[UNKNOWN]"));
122-
}
123121

124122
return new AttributeValue { SS = list };
125123
}
126124
}
127125

128-
public static ISet<TNumber> ToNumberISet<TNumber>(List<string> ss, string? dataMember)
129-
where TNumber : struct, IParsable<TNumber>, INumber<TNumber>
126+
[MethodImpl(MethodImplOptions.AggressiveInlining)]
127+
private static TSet ToNumberSet<TNumber, TSet>(
128+
List<string> numbers,
129+
Func<int, TSet> factory,
130+
string? dataMember
131+
)
132+
where TSet : ICollection<TNumber>
133+
where TNumber : struct, INumber<TNumber>
130134
{
131-
throw new Exception();
135+
var span = AsSpan(numbers);
136+
var set = factory(span.Length);
137+
138+
foreach (var number in span)
139+
{
140+
if (number is null)
141+
throw ExceptionHelper.NotNull($"{dataMember}[UNKNOWN]");
142+
143+
set.Add(TNumber.Parse(number, null));
144+
}
145+
146+
return set;
132147
}
133148

134-
public static IReadOnlySet<TNumber> ToNumberIReadOnlySet<TNumber>(List<string> ss, string? dataMember)
135-
where TNumber : struct, IParsable<TNumber>, INumber<TNumber>
149+
[MethodImpl(MethodImplOptions.AggressiveInlining)]
150+
private static TSet ToNullableNumberSet<TNumber, TSet>(
151+
List<string?> numbers,
152+
Func<int, TSet> factory,
153+
string? _
154+
)
155+
where TSet : ICollection<TNumber?>
156+
where TNumber : struct, INumber<TNumber>
136157
{
137-
throw new Exception();
158+
var span = AsSpan(numbers);
159+
var set = factory(span.Length);
160+
161+
foreach (var number in span)
162+
{
163+
if (number is null)
164+
set.Add(null);
165+
166+
set.Add(TNumber.Parse(number, null));
167+
}
168+
169+
return set;
170+
}
171+
172+
public static ISet<TNumber> ToNumberISet<TNumber>(List<string> ns, string? dataMember)
173+
where TNumber : struct, INumber<TNumber>
174+
{
175+
return ToNumberSet<TNumber, HashSet<TNumber>>(ns, i => new HashSet<TNumber>(i), dataMember);
138176
}
139177

140-
public static HashSet<TNumber> ToNumberHashSet<TNumber>(List<string> ss, string? dataMember)
141-
where TNumber : struct, IParsable<TNumber>, INumber<TNumber>
178+
public static IReadOnlySet<TNumber> ToNumberIReadOnlySet<TNumber>(List<string> ns, string? dataMember)
179+
where TNumber : struct, INumber<TNumber>
142180
{
143-
throw new Exception();
181+
return ToNumberSet<TNumber, HashSet<TNumber>>(ns, i => new HashSet<TNumber>(i), dataMember);
144182
}
145183

146-
public static SortedSet<TNumber> ToNumberSortedSet<TNumber>(List<string> ss, string? dataMember)
147-
where TNumber : struct, IParsable<TNumber>, INumber<TNumber>
184+
public static HashSet<TNumber> ToNumberHashSet<TNumber>(List<string> ns, string? dataMember)
185+
where TNumber : struct, INumber<TNumber>
148186
{
149-
throw new Exception();
187+
return ToNumberSet<TNumber, HashSet<TNumber>>(ns, i => new HashSet<TNumber>(i), dataMember);
188+
}
189+
190+
public static SortedSet<TNumber> ToNumberSortedSet<TNumber>(List<string> ns, string? dataMember)
191+
where TNumber : struct, INumber<TNumber>
192+
{
193+
var span = AsSpan(ns);
194+
var set = new SortedSet<TNumber>();
195+
foreach (var se in span)
196+
{
197+
if (se is null)
198+
throw ExceptionHelper.NotNull($"{dataMember}[UNKNOWN]");
199+
200+
set.Add(TNumber.Parse(se, null));
201+
}
202+
203+
return set;
150204
}
151205

152-
public static ISet<TNumber?> ToNullableNumberISet<TNumber>(List<string?> ss, string? dataMember)
153-
where TNumber : struct, IParsable<TNumber>, INumber<TNumber>
206+
public static ISet<TNumber?> ToNullableNumberISet<TNumber>(List<string?> ns, string? dataMember)
207+
where TNumber : struct, INumber<TNumber>
154208
{
155-
throw new Exception();
209+
return ToNullableNumberSet<TNumber, HashSet<TNumber?>>(ns, i => new HashSet<TNumber?>(i), dataMember);
156210
}
157211

158-
public static IReadOnlySet<TNumber?> ToNullableNumberIReadOnlySet<TNumber>(List<string?> ss, string? dataMember)
159-
where TNumber : struct, IParsable<TNumber>, INumber<TNumber>
212+
public static IReadOnlySet<TNumber?> ToNullableNumberIReadOnlySet<TNumber>(List<string?> ns, string? dataMember)
213+
where TNumber : struct, INumber<TNumber>
160214
{
161-
throw new Exception();
215+
return ToNullableNumberSet<TNumber, HashSet<TNumber?>>(ns, i => new HashSet<TNumber?>(i), dataMember);
162216
}
163217

164-
public static HashSet<TNumber?> ToNullableNumberHashSet<TNumber>(List<string?> ss, string? dataMember)
165-
where TNumber : struct, IParsable<TNumber>, INumber<TNumber>
218+
public static HashSet<TNumber?> ToNullableNumberHashSet<TNumber>(List<string?> ns, string? dataMember)
219+
where TNumber : struct, INumber<TNumber>
166220
{
167-
throw new Exception();
221+
return ToNullableNumberSet<TNumber, HashSet<TNumber?>>(ns, i => new HashSet<TNumber?>(i), dataMember);
168222
}
169223

170-
public static SortedSet<TNumber?> ToNullableNumberSortedSet<TNumber>(List<string?> ss, string? dataMember)
171-
where TNumber : struct, IParsable<TNumber>, INumber<TNumber>
224+
public static SortedSet<TNumber?> ToNullableNumberSortedSet<TNumber>(List<string?> ns, string? _)
225+
where TNumber : struct, INumber<TNumber>
172226
{
173-
throw new Exception();
227+
return new SortedSet<TNumber?>(ns.Select(x => x is null ? (TNumber?)null : TNumber.Parse(x, null)));
174228
}
175229

176230
public static ILookup<string, T> ToLookup<T, TArgument>(

0 commit comments

Comments
 (0)