Skip to content

Commit 95efd4f

Browse files
committed
Improved codegen in non-generated Guard APIs
1 parent f99764a commit 95efd4f

File tree

6 files changed

+304
-152
lines changed

6 files changed

+304
-152
lines changed

Microsoft.Toolkit/Diagnostics/Guard.Comparable.Generic.cs

Lines changed: 72 additions & 36 deletions
Original file line numberDiff line numberDiff line change
@@ -25,10 +25,12 @@ public static partial class Guard
2525
public static void IsDefault<T>(T value, string name)
2626
where T : struct, IEquatable<T>
2727
{
28-
if (!value.Equals(default))
28+
if (value.Equals(default))
2929
{
30-
ThrowHelper.ThrowArgumentExceptionForIsDefault(value, name);
30+
return;
3131
}
32+
33+
ThrowHelper.ThrowArgumentExceptionForIsDefault(value, name);
3234
}
3335

3436
/// <summary>
@@ -42,10 +44,12 @@ public static void IsDefault<T>(T value, string name)
4244
public static void IsNotDefault<T>(T value, string name)
4345
where T : struct, IEquatable<T>
4446
{
45-
if (value.Equals(default))
47+
if (!value.Equals(default))
4648
{
47-
ThrowHelper.ThrowArgumentExceptionForIsNotDefault<T>(name);
49+
return;
4850
}
51+
52+
ThrowHelper.ThrowArgumentExceptionForIsNotDefault<T>(name);
4953
}
5054

5155
/// <summary>
@@ -61,10 +65,12 @@ public static void IsNotDefault<T>(T value, string name)
6165
public static void IsEqualTo<T>(T value, T target, string name)
6266
where T : notnull, IEquatable<T>
6367
{
64-
if (!value.Equals(target))
68+
if (value.Equals(target))
6569
{
66-
ThrowHelper.ThrowArgumentExceptionForIsEqualTo(value, target, name);
70+
return;
6771
}
72+
73+
ThrowHelper.ThrowArgumentExceptionForIsEqualTo(value, target, name);
6874
}
6975

7076
/// <summary>
@@ -80,10 +86,12 @@ public static void IsEqualTo<T>(T value, T target, string name)
8086
public static void IsNotEqualTo<T>(T value, T target, string name)
8187
where T : notnull, IEquatable<T>
8288
{
83-
if (value.Equals(target))
89+
if (!value.Equals(target))
8490
{
85-
ThrowHelper.ThrowArgumentExceptionForIsNotEqualTo(value, target, name);
91+
return;
8692
}
93+
94+
ThrowHelper.ThrowArgumentExceptionForIsNotEqualTo(value, target, name);
8795
}
8896

8997
/// <summary>
@@ -110,10 +118,12 @@ public static void IsBitwiseEqualTo<T>(T value, T target, string name)
110118
byte valueByte = Unsafe.As<T, byte>(ref value);
111119
byte targetByte = Unsafe.As<T, byte>(ref target);
112120

113-
if (valueByte != targetByte)
121+
if (valueByte == targetByte)
114122
{
115-
ThrowHelper.ThrowArgumentExceptionForsBitwiseEqualTo(value, target, name);
123+
return;
116124
}
125+
126+
ThrowHelper.ThrowArgumentExceptionForsBitwiseEqualTo(value, target, name);
117127
}
118128
else if (typeof(T) == typeof(ushort) ||
119129
typeof(T) == typeof(short) ||
@@ -122,10 +132,12 @@ public static void IsBitwiseEqualTo<T>(T value, T target, string name)
122132
ushort valueUShort = Unsafe.As<T, ushort>(ref value);
123133
ushort targetUShort = Unsafe.As<T, ushort>(ref target);
124134

125-
if (valueUShort != targetUShort)
135+
if (valueUShort == targetUShort)
126136
{
127-
ThrowHelper.ThrowArgumentExceptionForsBitwiseEqualTo(value, target, name);
137+
return;
128138
}
139+
140+
ThrowHelper.ThrowArgumentExceptionForsBitwiseEqualTo(value, target, name);
129141
}
130142
else if (typeof(T) == typeof(uint) ||
131143
typeof(T) == typeof(int) ||
@@ -134,10 +146,12 @@ public static void IsBitwiseEqualTo<T>(T value, T target, string name)
134146
uint valueUInt = Unsafe.As<T, uint>(ref value);
135147
uint targetUInt = Unsafe.As<T, uint>(ref target);
136148

137-
if (valueUInt != targetUInt)
149+
if (valueUInt == targetUInt)
138150
{
139-
ThrowHelper.ThrowArgumentExceptionForsBitwiseEqualTo(value, target, name);
151+
return;
140152
}
153+
154+
ThrowHelper.ThrowArgumentExceptionForsBitwiseEqualTo(value, target, name);
141155
}
142156
else if (typeof(T) == typeof(ulong) ||
143157
typeof(T) == typeof(long) ||
@@ -146,10 +160,12 @@ public static void IsBitwiseEqualTo<T>(T value, T target, string name)
146160
ulong valueULong = Unsafe.As<T, ulong>(ref value);
147161
ulong targetULong = Unsafe.As<T, ulong>(ref target);
148162

149-
if (valueULong != targetULong)
163+
if (valueULong == targetULong)
150164
{
151-
ThrowHelper.ThrowArgumentExceptionForsBitwiseEqualTo(value, target, name);
165+
return;
152166
}
167+
168+
ThrowHelper.ThrowArgumentExceptionForsBitwiseEqualTo(value, target, name);
153169
}
154170
else
155171
{
@@ -183,10 +199,12 @@ public static void IsBitwiseEqualTo<T>(T value, T target, string name)
183199
public static void IsLessThan<T>(T value, T maximum, string name)
184200
where T : notnull, IComparable<T>
185201
{
186-
if (value.CompareTo(maximum) >= 0)
202+
if (value.CompareTo(maximum) < 0)
187203
{
188-
ThrowHelper.ThrowArgumentOutOfRangeExceptionForIsLessThan(value, maximum, name);
204+
return;
189205
}
206+
207+
ThrowHelper.ThrowArgumentOutOfRangeExceptionForIsLessThan(value, maximum, name);
190208
}
191209

192210
/// <summary>
@@ -202,10 +220,12 @@ public static void IsLessThan<T>(T value, T maximum, string name)
202220
public static void IsLessThanOrEqualTo<T>(T value, T maximum, string name)
203221
where T : notnull, IComparable<T>
204222
{
205-
if (value.CompareTo(maximum) > 0)
223+
if (value.CompareTo(maximum) >= 0)
206224
{
207-
ThrowHelper.ThrowArgumentOutOfRangeExceptionForIsLessThanOrEqualTo(value, maximum, name);
225+
return;
208226
}
227+
228+
ThrowHelper.ThrowArgumentOutOfRangeExceptionForIsLessThanOrEqualTo(value, maximum, name);
209229
}
210230

211231
/// <summary>
@@ -221,10 +241,12 @@ public static void IsLessThanOrEqualTo<T>(T value, T maximum, string name)
221241
public static void IsGreaterThan<T>(T value, T minimum, string name)
222242
where T : notnull, IComparable<T>
223243
{
224-
if (value.CompareTo(minimum) <= 0)
244+
if (value.CompareTo(minimum) > 0)
225245
{
226-
ThrowHelper.ThrowArgumentOutOfRangeExceptionForIsGreaterThan(value, minimum, name);
246+
return;
227247
}
248+
249+
ThrowHelper.ThrowArgumentOutOfRangeExceptionForIsGreaterThan(value, minimum, name);
228250
}
229251

230252
/// <summary>
@@ -240,10 +262,12 @@ public static void IsGreaterThan<T>(T value, T minimum, string name)
240262
public static void IsGreaterThanOrEqualTo<T>(T value, T minimum, string name)
241263
where T : notnull, IComparable<T>
242264
{
243-
if (value.CompareTo(minimum) < 0)
265+
if (value.CompareTo(minimum) >= 0)
244266
{
245-
ThrowHelper.ThrowArgumentOutOfRangeExceptionForIsGreaterThanOrEqualTo(value, minimum, name);
267+
return;
246268
}
269+
270+
ThrowHelper.ThrowArgumentOutOfRangeExceptionForIsGreaterThanOrEqualTo(value, minimum, name);
247271
}
248272

249273
/// <summary>
@@ -263,10 +287,12 @@ public static void IsGreaterThanOrEqualTo<T>(T value, T minimum, string name)
263287
public static void IsInRange<T>(T value, T minimum, T maximum, string name)
264288
where T : notnull, IComparable<T>
265289
{
266-
if (value.CompareTo(minimum) < 0 || value.CompareTo(maximum) >= 0)
290+
if (value.CompareTo(minimum) >= 0 && value.CompareTo(maximum) < 0)
267291
{
268-
ThrowHelper.ThrowArgumentOutOfRangeExceptionForIsInRange(value, minimum, maximum, name);
292+
return;
269293
}
294+
295+
ThrowHelper.ThrowArgumentOutOfRangeExceptionForIsInRange(value, minimum, maximum, name);
270296
}
271297

272298
/// <summary>
@@ -286,10 +312,12 @@ public static void IsInRange<T>(T value, T minimum, T maximum, string name)
286312
public static void IsNotInRange<T>(T value, T minimum, T maximum, string name)
287313
where T : notnull, IComparable<T>
288314
{
289-
if (value.CompareTo(minimum) >= 0 && value.CompareTo(maximum) < 0)
315+
if (value.CompareTo(minimum) < 0 || value.CompareTo(maximum) >= 0)
290316
{
291-
ThrowHelper.ThrowArgumentOutOfRangeExceptionForIsNotInRange(value, minimum, maximum, name);
317+
return;
292318
}
319+
320+
ThrowHelper.ThrowArgumentOutOfRangeExceptionForIsNotInRange(value, minimum, maximum, name);
293321
}
294322

295323
/// <summary>
@@ -309,10 +337,12 @@ public static void IsNotInRange<T>(T value, T minimum, T maximum, string name)
309337
public static void IsBetween<T>(T value, T minimum, T maximum, string name)
310338
where T : notnull, IComparable<T>
311339
{
312-
if (value.CompareTo(minimum) <= 0 || value.CompareTo(maximum) >= 0)
340+
if (value.CompareTo(minimum) > 0 && value.CompareTo(maximum) < 0)
313341
{
314-
ThrowHelper.ThrowArgumentOutOfRangeExceptionForIsBetween(value, minimum, maximum, name);
342+
return;
315343
}
344+
345+
ThrowHelper.ThrowArgumentOutOfRangeExceptionForIsBetween(value, minimum, maximum, name);
316346
}
317347

318348
/// <summary>
@@ -332,10 +362,12 @@ public static void IsBetween<T>(T value, T minimum, T maximum, string name)
332362
public static void IsNotBetween<T>(T value, T minimum, T maximum, string name)
333363
where T : notnull, IComparable<T>
334364
{
335-
if (value.CompareTo(minimum) > 0 && value.CompareTo(maximum) < 0)
365+
if (value.CompareTo(minimum) <= 0 || value.CompareTo(maximum) >= 0)
336366
{
337-
ThrowHelper.ThrowArgumentOutOfRangeExceptionForIsNotBetween(value, minimum, maximum, name);
367+
return;
338368
}
369+
370+
ThrowHelper.ThrowArgumentOutOfRangeExceptionForIsNotBetween(value, minimum, maximum, name);
339371
}
340372

341373
/// <summary>
@@ -355,10 +387,12 @@ public static void IsNotBetween<T>(T value, T minimum, T maximum, string name)
355387
public static void IsBetweenOrEqualTo<T>(T value, T minimum, T maximum, string name)
356388
where T : notnull, IComparable<T>
357389
{
358-
if (value.CompareTo(minimum) < 0 || value.CompareTo(maximum) > 0)
390+
if (value.CompareTo(minimum) >= 0 && value.CompareTo(maximum) <= 0)
359391
{
360-
ThrowHelper.ThrowArgumentOutOfRangeExceptionForIsBetweenOrEqualTo(value, minimum, maximum, name);
392+
return;
361393
}
394+
395+
ThrowHelper.ThrowArgumentOutOfRangeExceptionForIsBetweenOrEqualTo(value, minimum, maximum, name);
362396
}
363397

364398
/// <summary>
@@ -378,10 +412,12 @@ public static void IsBetweenOrEqualTo<T>(T value, T minimum, T maximum, string n
378412
public static void IsNotBetweenOrEqualTo<T>(T value, T minimum, T maximum, string name)
379413
where T : notnull, IComparable<T>
380414
{
381-
if (value.CompareTo(minimum) >= 0 && value.CompareTo(maximum) <= 0)
415+
if (value.CompareTo(minimum) < 0 || value.CompareTo(maximum) > 0)
382416
{
383-
ThrowHelper.ThrowArgumentOutOfRangeExceptionForIsNotBetweenOrEqualTo(value, minimum, maximum, name);
417+
return;
384418
}
419+
420+
ThrowHelper.ThrowArgumentOutOfRangeExceptionForIsNotBetweenOrEqualTo(value, minimum, maximum, name);
385421
}
386422
}
387423
}

Microsoft.Toolkit/Diagnostics/Guard.Comparable.Numeric.cs

Lines changed: 32 additions & 16 deletions
Original file line numberDiff line numberDiff line change
@@ -36,10 +36,12 @@ public static void IsCloseTo(int value, int target, uint delta, string name)
3636
// The difference is then cast to uint as that's the maximum possible
3737
// value it can have, and comparing two 32 bit integer values
3838
// results in shorter and slightly faster code than using doubles.
39-
if ((uint)Math.Abs((double)((long)value - target)) > delta)
39+
if ((uint)Math.Abs((double)((long)value - target)) <= delta)
4040
{
41-
ThrowHelper.ThrowArgumentExceptionForIsCloseTo(value, target, delta, name);
41+
return;
4242
}
43+
44+
ThrowHelper.ThrowArgumentExceptionForIsCloseTo(value, target, delta, name);
4345
}
4446

4547
/// <summary>
@@ -53,10 +55,12 @@ public static void IsCloseTo(int value, int target, uint delta, string name)
5355
[MethodImpl(MethodImplOptions.AggressiveInlining)]
5456
public static void IsNotCloseTo(int value, int target, uint delta, string name)
5557
{
56-
if ((uint)Math.Abs((double)((long)value - target)) <= delta)
58+
if ((uint)Math.Abs((double)((long)value - target)) > delta)
5759
{
58-
ThrowHelper.ThrowArgumentExceptionForIsNotCloseTo(value, target, delta, name);
60+
return;
5961
}
62+
63+
ThrowHelper.ThrowArgumentExceptionForIsNotCloseTo(value, target, delta, name);
6064
}
6165

6266
/// <summary>
@@ -72,10 +76,12 @@ public static void IsCloseTo(long value, long target, ulong delta, string name)
7276
{
7377
// This method and the one below are not inlined because
7478
// using the decimal type results in quite a bit of code.
75-
if ((ulong)Math.Abs((decimal)value - target) > delta)
79+
if ((ulong)Math.Abs((decimal)value - target) <= delta)
7680
{
77-
ThrowHelper.ThrowArgumentExceptionForIsCloseTo(value, target, delta, name);
81+
return;
7882
}
83+
84+
ThrowHelper.ThrowArgumentExceptionForIsCloseTo(value, target, delta, name);
7985
}
8086

8187
/// <summary>
@@ -89,10 +95,12 @@ public static void IsCloseTo(long value, long target, ulong delta, string name)
8995
[MethodImpl(MethodImplOptions.NoInlining)]
9096
public static void IsNotCloseTo(long value, long target, ulong delta, string name)
9197
{
92-
if ((ulong)Math.Abs((decimal)value - target) <= delta)
98+
if ((ulong)Math.Abs((decimal)value - target) > delta)
9399
{
94-
ThrowHelper.ThrowArgumentExceptionForIsNotCloseTo(value, target, delta, name);
100+
return;
95101
}
102+
103+
ThrowHelper.ThrowArgumentExceptionForIsNotCloseTo(value, target, delta, name);
96104
}
97105

98106
/// <summary>
@@ -106,10 +114,12 @@ public static void IsNotCloseTo(long value, long target, ulong delta, string nam
106114
[MethodImpl(MethodImplOptions.AggressiveInlining)]
107115
public static void IsCloseTo(float value, float target, float delta, string name)
108116
{
109-
if (Math.Abs(value - target) > delta)
117+
if (Math.Abs(value - target) <= delta)
110118
{
111-
ThrowHelper.ThrowArgumentExceptionForIsCloseTo(value, target, delta, name);
119+
return;
112120
}
121+
122+
ThrowHelper.ThrowArgumentExceptionForIsCloseTo(value, target, delta, name);
113123
}
114124

115125
/// <summary>
@@ -123,10 +133,12 @@ public static void IsCloseTo(float value, float target, float delta, string name
123133
[MethodImpl(MethodImplOptions.AggressiveInlining)]
124134
public static void IsNotCloseTo(float value, float target, float delta, string name)
125135
{
126-
if (Math.Abs(value - target) <= delta)
136+
if (Math.Abs(value - target) > delta)
127137
{
128-
ThrowHelper.ThrowArgumentExceptionForIsNotCloseTo(value, target, delta, name);
138+
return;
129139
}
140+
141+
ThrowHelper.ThrowArgumentExceptionForIsNotCloseTo(value, target, delta, name);
130142
}
131143

132144
/// <summary>
@@ -140,10 +152,12 @@ public static void IsNotCloseTo(float value, float target, float delta, string n
140152
[MethodImpl(MethodImplOptions.AggressiveInlining)]
141153
public static void IsCloseTo(double value, double target, double delta, string name)
142154
{
143-
if (Math.Abs(value - target) > delta)
155+
if (Math.Abs(value - target) <= delta)
144156
{
145-
ThrowHelper.ThrowArgumentExceptionForIsCloseTo(value, target, delta, name);
157+
return;
146158
}
159+
160+
ThrowHelper.ThrowArgumentExceptionForIsCloseTo(value, target, delta, name);
147161
}
148162

149163
/// <summary>
@@ -157,10 +171,12 @@ public static void IsCloseTo(double value, double target, double delta, string n
157171
[MethodImpl(MethodImplOptions.AggressiveInlining)]
158172
public static void IsNotCloseTo(double value, double target, double delta, string name)
159173
{
160-
if (Math.Abs(value - target) <= delta)
174+
if (Math.Abs(value - target) > delta)
161175
{
162-
ThrowHelper.ThrowArgumentExceptionForIsNotCloseTo(value, target, delta, name);
176+
return;
163177
}
178+
179+
ThrowHelper.ThrowArgumentExceptionForIsNotCloseTo(value, target, delta, name);
164180
}
165181
}
166182
}

0 commit comments

Comments
 (0)