Skip to content

Commit 2e552c1

Browse files
committed
Add early exit on empty arguments
1 parent 930d8d7 commit 2e552c1

1 file changed

Lines changed: 42 additions & 11 deletions

File tree

src/DynamoDBGenerator/Internal/MarshallHelper.cs

Lines changed: 42 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -35,17 +35,21 @@ public static AttributeValue FromDictionary<T, TArgument>(
3535
string? dataMember,
3636
Func<T, TArgument, string?, AttributeValue> resultSelector)
3737
{
38-
var elements = dictionary switch
38+
Dictionary<string, AttributeValue> dict;
39+
if (dictionary.TryGetNonEnumeratedCount(out var count))
3940
{
40-
IReadOnlyDictionary<string, T> a => new Dictionary<string, AttributeValue>(a.Count),
41-
IDictionary<string, T> a => new Dictionary<string, AttributeValue>(a.Count),
42-
_ => new Dictionary<string, AttributeValue>()
43-
};
41+
if (count is 0)
42+
return new AttributeValue { M = [] };
43+
44+
dict = new Dictionary<string, AttributeValue>(count);
45+
}
46+
else
47+
dict = [];
4448

4549
foreach (var (key, value) in dictionary)
46-
elements[key] = resultSelector(value, argument, $"{dataMember}[{key}]");
50+
dict[key] = resultSelector(value, argument, $"{dataMember}[{key}]");
4751

48-
return new AttributeValue { M = elements };
52+
return new AttributeValue { M = dict };
4953
}
5054

5155
public static AttributeValue FromNullableNumberSet<T>(IEnumerable<T?> numbers, string? _)
@@ -239,7 +243,7 @@ public static HashSet<string> ToStringHashSet(List<string> ss, string? dataMembe
239243
{
240244
return ToStringSet<HashSet<string>>(ss, i => new HashSet<string>(i), dataMember);
241245
}
242-
246+
243247
public static ISet<string?> ToNullableStringISet(List<string?> ss, string? dataMember)
244248
{
245249
return ToNullableStringSet<HashSet<string?>>(ss, i => new HashSet<string?>(i), dataMember);
@@ -259,11 +263,12 @@ public static HashSet<string> ToStringHashSet(List<string> ss, string? dataMembe
259263
{
260264
var span = CollectionsMarshal.AsSpan(ss);
261265
var set = new SortedSet<string?>();
262-
foreach (var se in span)
266+
foreach (var se in span)
263267
set.Add(se);
264268

265269
return set;
266270
}
271+
267272
public static SortedSet<string> ToStringSortedSet(List<string> ss, string? dataMember)
268273
{
269274
var span = CollectionsMarshal.AsSpan(ss);
@@ -383,6 +388,9 @@ public static Dictionary<string, T> ToDictionary<T, TArgument>(
383388
string? dataMember,
384389
Func<AttributeValue, TArgument, string?, T> resultSelector)
385390
{
391+
if (dictionary.Count is 0)
392+
return [];
393+
386394
var elements = new Dictionary<string, T>(dictionary.Count);
387395

388396
foreach (var (key, value) in dictionary)
@@ -398,6 +406,8 @@ public static AttributeValue FromArray<T, TArgument>(
398406
Func<T, TArgument, string?, AttributeValue> resultSelector)
399407
{
400408
var span = array.AsSpan();
409+
if (span.Length is 0)
410+
return new AttributeValue { L = [] };
401411
var attributeValues = new List<AttributeValue>(span.Length);
402412
for (var i = 0; i < span.Length; i++)
403413
attributeValues.Add(resultSelector(span[i], argument, $"{dataMember}[{i}]"));
@@ -412,6 +422,9 @@ public static AttributeValue FromList<T, TArgument>(
412422
Func<T, TArgument, string?, AttributeValue> resultSelector)
413423
{
414424
var span = CollectionsMarshal.AsSpan(list);
425+
if (span.Length is 0)
426+
return new AttributeValue { L = [] };
427+
415428
var attributeValues = new List<AttributeValue>(span.Length);
416429
for (var i = 0; i < span.Length; i++)
417430
attributeValues.Add(resultSelector(span[i], argument, $"{dataMember}[{i}]"));
@@ -449,6 +462,9 @@ public static List<TResult> ToList<TResult, TArgument>(
449462
)
450463
{
451464
var span = CollectionsMarshal.AsSpan(attributeValues);
465+
if (span.Length is 0)
466+
return [];
467+
452468
var elements = new List<TResult>(span.Length);
453469
for (var i = 0; i < span.Length; i++)
454470
elements.Add(resultSelector(span[i], argument, $"{dataMember}[{i}]"));
@@ -463,8 +479,20 @@ public static IEnumerable<TResult> ToEnumerable<TResult, TArgument>(
463479
Func<AttributeValue, TArgument, string?, TResult> resultSelector
464480
)
465481
{
466-
for (var i = 0; i < attributeValues.Count; i++)
467-
yield return resultSelector(attributeValues[i], argument, $"{dataMember}[{i}]");
482+
return attributeValues.Count is 0
483+
? []
484+
: Iterator(attributeValues, argument, dataMember, resultSelector);
485+
486+
static IEnumerable<TResult> Iterator(
487+
List<AttributeValue> list,
488+
TArgument argument,
489+
string? dataMember,
490+
Func<AttributeValue, TArgument, string?, TResult> resultSelector
491+
)
492+
{
493+
for (var i = 0; i < list.Count; i++)
494+
yield return resultSelector(list[i], argument, $"{dataMember}[{i}]");
495+
}
468496
}
469497

470498
public static TResult[] ToArray<TResult, TArgument>(
@@ -475,6 +503,9 @@ public static TResult[] ToArray<TResult, TArgument>(
475503
)
476504
{
477505
var span = CollectionsMarshal.AsSpan(attributeValues);
506+
if (span.Length is 0)
507+
return [];
508+
478509
var elements = new TResult[span.Length];
479510
for (var i = 0; i < span.Length; i++)
480511
elements[i] = resultSelector(span[i], argument, $"{dataMember}[{i}]");

0 commit comments

Comments
 (0)