Skip to content

Commit dd42f06

Browse files
committed
CodeJam:
* Enum constraints * NullIfEmpty, EmptyIfNull, DefaultIfEmpty extension methods
1 parent c4262b4 commit dd42f06

File tree

10 files changed

+411
-81
lines changed

10 files changed

+411
-81
lines changed

Experimental/tests/UseCases/EnumCodeUseCases.cs

Lines changed: 14 additions & 14 deletions
Original file line numberDiff line numberDiff line change
@@ -226,33 +226,33 @@ internal static class EnumExtSetBased
226226
{
227227
#region Flag checks
228228
public static bool Includes<TEnum>(this TEnum value, TEnum flag)
229-
where TEnum : struct, IComparable, IFormattable, IConvertible =>
229+
where TEnum : struct, Enum =>
230230
value.IsFlagSet(flag);
231231

232232
public static bool IncludesAny<TEnum>(this TEnum value, TEnum flags)
233-
where TEnum : struct, IComparable, IFormattable, IConvertible =>
233+
where TEnum : struct, Enum =>
234234
value.IsAnyFlagSet(flags);
235235

236236
public static bool ExcludesAny<TEnum>(this TEnum value, TEnum flag)
237-
where TEnum : struct, IComparable, IFormattable, IConvertible =>
237+
where TEnum : struct, Enum =>
238238
value.IsAnyFlagUnset(flag);
239239

240240
public static bool Excludes<TEnum>(this TEnum value, TEnum flags)
241-
where TEnum : struct, IComparable, IFormattable, IConvertible =>
241+
where TEnum : struct, Enum =>
242242
value.IsFlagUnset(flags);
243243
#endregion
244244

245245
#region Flag operations
246246
public static TEnum With<TEnum>(this TEnum value, TEnum flag)
247-
where TEnum : struct, IComparable, IFormattable, IConvertible =>
247+
where TEnum : struct, Enum =>
248248
value.SetFlag(flag);
249249

250250
public static TEnum Without<TEnum>(this TEnum value, TEnum flag)
251-
where TEnum : struct, IComparable, IFormattable, IConvertible =>
251+
where TEnum : struct, Enum =>
252252
value.ClearFlag(flag);
253253

254254
public static TEnum WithOrWithout<TEnum>(this TEnum value, TEnum flag, bool include)
255-
where TEnum : struct, IComparable, IFormattable, IConvertible =>
255+
where TEnum : struct, Enum =>
256256
value.SetFlag(flag, include);
257257
#endregion
258258
}
@@ -261,33 +261,33 @@ internal static class EnumExtCollectionBased
261261
{
262262
#region Flag checks
263263
public static bool Contains<TEnum>(this TEnum value, TEnum flag)
264-
where TEnum : struct, IComparable, IFormattable, IConvertible =>
264+
where TEnum : struct, Enum =>
265265
value.IsFlagSet(flag);
266266

267267
public static bool ContainsAny<TEnum>(this TEnum value, TEnum flags)
268-
where TEnum : struct, IComparable, IFormattable, IConvertible =>
268+
where TEnum : struct, Enum =>
269269
value.IsAnyFlagSet(flags);
270270

271271
public static bool DoesNotContainAny<TEnum>(this TEnum value, TEnum flag)
272-
where TEnum : struct, IComparable, IFormattable, IConvertible =>
272+
where TEnum : struct, Enum =>
273273
value.IsAnyFlagUnset(flag);
274274

275275
public static bool DoesNotContain<TEnum>(this TEnum value, TEnum flags)
276-
where TEnum : struct, IComparable, IFormattable, IConvertible =>
276+
where TEnum : struct, Enum =>
277277
value.IsFlagUnset(flags);
278278
#endregion
279279

280280
#region Flag operations
281281
public static TEnum Add<TEnum>(this TEnum value, TEnum flag)
282-
where TEnum : struct, IComparable, IFormattable, IConvertible =>
282+
where TEnum : struct, Enum =>
283283
value.SetFlag(flag);
284284

285285
public static TEnum Remove<TEnum>(this TEnum value, TEnum flag)
286-
where TEnum : struct, IComparable, IFormattable, IConvertible =>
286+
where TEnum : struct, Enum =>
287287
value.ClearFlag(flag);
288288

289289
public static TEnum AddOrRemove<TEnum>(this TEnum value, TEnum flag, bool include)
290-
where TEnum : struct, IComparable, IFormattable, IConvertible =>
290+
where TEnum : struct, Enum =>
291291
value.SetFlag(flag, include);
292292
#endregion
293293
}

Main/src/Assertions/DebugEnumCode.generated.cs

Lines changed: 14 additions & 14 deletions
Original file line numberDiff line numberDiff line change
@@ -33,7 +33,7 @@ public static class DebugEnumCode
3333
public static void Defined<TEnum>(
3434
TEnum value,
3535
[NotNull, InvokerParameterName] string argName)
36-
where TEnum : struct, IComparable, IFormattable, IConvertible
36+
where TEnum : struct, Enum
3737
{
3838
if (!EnumHelper.IsDefined(value))
3939
throw EnumCodeExceptions.ArgumentNotDefinedException(argName, value);
@@ -48,7 +48,7 @@ public static void Defined<TEnum>(
4848
public static void FlagsDefined<TEnum>(
4949
TEnum argFlags,
5050
[NotNull, InvokerParameterName] string argName)
51-
where TEnum : struct, IComparable, IFormattable, IConvertible
51+
where TEnum : struct, Enum
5252
{
5353
if (!EnumHelper.AreFlagsDefined(argFlags))
5454
throw EnumCodeExceptions.ArgumentNotDefinedException(argName, argFlags);
@@ -67,7 +67,7 @@ public static void FlagSet<TEnum>(
6767
TEnum value,
6868
[NotNull, InvokerParameterName] string argName,
6969
TEnum flag)
70-
where TEnum : struct, IComparable, IFormattable, IConvertible
70+
where TEnum : struct, Enum
7171
{
7272
if (!value.IsFlagSet(flag))
7373
throw EnumCodeExceptions.ArgumentAnyFlagUnset(argName, value, flag);
@@ -84,7 +84,7 @@ public static void AnyFlagUnset<TEnum>(
8484
TEnum value,
8585
[NotNull, InvokerParameterName] string argName,
8686
TEnum flags)
87-
where TEnum : struct, IComparable, IFormattable, IConvertible
87+
where TEnum : struct, Enum
8888
{
8989
if (!value.IsAnyFlagUnset(flags))
9090
throw EnumCodeExceptions.ArgumentFlagSet(argName, value, flags);
@@ -101,7 +101,7 @@ public static void AnyFlagSet<TEnum>(
101101
TEnum value,
102102
[NotNull, InvokerParameterName] string argName,
103103
TEnum flags)
104-
where TEnum : struct, IComparable, IFormattable, IConvertible
104+
where TEnum : struct, Enum
105105
{
106106
if (!value.IsAnyFlagSet(flags))
107107
throw EnumCodeExceptions.ArgumentFlagUnset(argName, value, flags);
@@ -118,7 +118,7 @@ public static void FlagUnset<TEnum>(
118118
TEnum value,
119119
[NotNull, InvokerParameterName] string argName,
120120
TEnum flag)
121-
where TEnum : struct, IComparable, IFormattable, IConvertible
121+
where TEnum : struct, Enum
122122
{
123123
if (!value.IsFlagUnset(flag))
124124
throw EnumCodeExceptions.ArgumentAnyFlagSet(argName, value, flag);
@@ -134,7 +134,7 @@ public static void FlagUnset<TEnum>(
134134
[Conditional(DebugCondition), DebuggerHidden, MethodImpl(AggressiveInlining)]
135135
[AssertionMethod]
136136
public static void StateFlagSet<TEnum>(TEnum value, TEnum flag, [NotNull] string message)
137-
where TEnum : struct, IComparable, IFormattable, IConvertible
137+
where TEnum : struct, Enum
138138
{
139139
if (!value.IsFlagSet(flag))
140140
throw CodeExceptions.InvalidOperation(message);
@@ -151,7 +151,7 @@ public static void StateFlagSet<TEnum>(
151151
TEnum value, TEnum flag,
152152
[NotNull] string messageFormat,
153153
[CanBeNull] params object[] args)
154-
where TEnum : struct, IComparable, IFormattable, IConvertible
154+
where TEnum : struct, Enum
155155
{
156156
if (!value.IsFlagSet(flag))
157157
throw CodeExceptions.InvalidOperation(messageFormat, args);
@@ -165,7 +165,7 @@ public static void StateFlagSet<TEnum>(
165165
[Conditional(DebugCondition), DebuggerHidden, MethodImpl(AggressiveInlining)]
166166
[AssertionMethod]
167167
public static void AnyStateFlagUnset<TEnum>(TEnum value, TEnum flags, [NotNull] string message)
168-
where TEnum : struct, IComparable, IFormattable, IConvertible
168+
where TEnum : struct, Enum
169169
{
170170
if (!value.IsAnyFlagUnset(flags))
171171
throw CodeExceptions.InvalidOperation(message);
@@ -183,7 +183,7 @@ public static void AnyStateFlagUnset<TEnum>(
183183
TEnum value, TEnum flags,
184184
[NotNull] string messageFormat,
185185
[CanBeNull] params object[] args)
186-
where TEnum : struct, IComparable, IFormattable, IConvertible
186+
where TEnum : struct, Enum
187187
{
188188
if (!value.IsAnyFlagUnset(flags))
189189
throw CodeExceptions.InvalidOperation(messageFormat, args);
@@ -197,7 +197,7 @@ public static void AnyStateFlagUnset<TEnum>(
197197
[Conditional(DebugCondition), DebuggerHidden, MethodImpl(AggressiveInlining)]
198198
[AssertionMethod]
199199
public static void AnyStateFlagSet<TEnum>(TEnum value, TEnum flags, [NotNull] string message)
200-
where TEnum : struct, IComparable, IFormattable, IConvertible
200+
where TEnum : struct, Enum
201201
{
202202
if (!value.IsAnyFlagSet(flags))
203203
throw CodeExceptions.InvalidOperation(message);
@@ -215,7 +215,7 @@ public static void AnyStateFlagSet<TEnum>(
215215
TEnum value, TEnum flags,
216216
[NotNull] string messageFormat,
217217
[CanBeNull] params object[] args)
218-
where TEnum : struct, IComparable, IFormattable, IConvertible
218+
where TEnum : struct, Enum
219219
{
220220
if (!value.IsAnyFlagSet(flags))
221221
throw CodeExceptions.InvalidOperation(messageFormat, args);
@@ -229,7 +229,7 @@ public static void AnyStateFlagSet<TEnum>(
229229
[Conditional(DebugCondition), DebuggerHidden, MethodImpl(AggressiveInlining)]
230230
[AssertionMethod]
231231
public static void StateFlagUnset<TEnum>(TEnum value, TEnum flag, [NotNull] string message)
232-
where TEnum : struct, IComparable, IFormattable, IConvertible
232+
where TEnum : struct, Enum
233233
{
234234
if (!value.IsFlagUnset(flag))
235235
throw CodeExceptions.InvalidOperation(message);
@@ -247,7 +247,7 @@ public static void StateFlagUnset<TEnum>(
247247
TEnum value, TEnum flag,
248248
[NotNull] string messageFormat,
249249
[CanBeNull] params object[] args)
250-
where TEnum : struct, IComparable, IFormattable, IConvertible
250+
where TEnum : struct, Enum
251251
{
252252
if (!value.IsFlagUnset(flag))
253253
throw CodeExceptions.InvalidOperation(messageFormat, args);

Main/src/Assertions/EnumCode.cs

Lines changed: 14 additions & 14 deletions
Original file line numberDiff line numberDiff line change
@@ -22,7 +22,7 @@ public static class EnumCode
2222
public static void Defined<TEnum>(
2323
TEnum value,
2424
[NotNull, InvokerParameterName] string argName)
25-
where TEnum : struct, IComparable, IFormattable, IConvertible
25+
where TEnum : struct, Enum
2626
{
2727
if (!EnumHelper.IsDefined(value))
2828
throw EnumCodeExceptions.ArgumentNotDefinedException(argName, value);
@@ -37,7 +37,7 @@ public static void Defined<TEnum>(
3737
public static void FlagsDefined<TEnum>(
3838
TEnum argFlags,
3939
[NotNull, InvokerParameterName] string argName)
40-
where TEnum : struct, IComparable, IFormattable, IConvertible
40+
where TEnum : struct, Enum
4141
{
4242
if (!EnumHelper.AreFlagsDefined(argFlags))
4343
throw EnumCodeExceptions.ArgumentNotDefinedException(argName, argFlags);
@@ -56,7 +56,7 @@ public static void FlagSet<TEnum>(
5656
TEnum value,
5757
[NotNull, InvokerParameterName] string argName,
5858
TEnum flag)
59-
where TEnum : struct, IComparable, IFormattable, IConvertible
59+
where TEnum : struct, Enum
6060
{
6161
if (!value.IsFlagSet(flag))
6262
throw EnumCodeExceptions.ArgumentAnyFlagUnset(argName, value, flag);
@@ -73,7 +73,7 @@ public static void AnyFlagUnset<TEnum>(
7373
TEnum value,
7474
[NotNull, InvokerParameterName] string argName,
7575
TEnum flags)
76-
where TEnum : struct, IComparable, IFormattable, IConvertible
76+
where TEnum : struct, Enum
7777
{
7878
if (!value.IsAnyFlagUnset(flags))
7979
throw EnumCodeExceptions.ArgumentFlagSet(argName, value, flags);
@@ -90,7 +90,7 @@ public static void AnyFlagSet<TEnum>(
9090
TEnum value,
9191
[NotNull, InvokerParameterName] string argName,
9292
TEnum flags)
93-
where TEnum : struct, IComparable, IFormattable, IConvertible
93+
where TEnum : struct, Enum
9494
{
9595
if (!value.IsAnyFlagSet(flags))
9696
throw EnumCodeExceptions.ArgumentFlagUnset(argName, value, flags);
@@ -107,7 +107,7 @@ public static void FlagUnset<TEnum>(
107107
TEnum value,
108108
[NotNull, InvokerParameterName] string argName,
109109
TEnum flag)
110-
where TEnum : struct, IComparable, IFormattable, IConvertible
110+
where TEnum : struct, Enum
111111
{
112112
if (!value.IsFlagUnset(flag))
113113
throw EnumCodeExceptions.ArgumentAnyFlagSet(argName, value, flag);
@@ -123,7 +123,7 @@ public static void FlagUnset<TEnum>(
123123
[DebuggerHidden, MethodImpl(AggressiveInlining)]
124124
[AssertionMethod]
125125
public static void StateFlagSet<TEnum>(TEnum value, TEnum flag, [NotNull] string message)
126-
where TEnum : struct, IComparable, IFormattable, IConvertible
126+
where TEnum : struct, Enum
127127
{
128128
if (!value.IsFlagSet(flag))
129129
throw CodeExceptions.InvalidOperation(message);
@@ -140,7 +140,7 @@ public static void StateFlagSet<TEnum>(
140140
TEnum value, TEnum flag,
141141
[NotNull] string messageFormat,
142142
[CanBeNull] params object[] args)
143-
where TEnum : struct, IComparable, IFormattable, IConvertible
143+
where TEnum : struct, Enum
144144
{
145145
if (!value.IsFlagSet(flag))
146146
throw CodeExceptions.InvalidOperation(messageFormat, args);
@@ -154,7 +154,7 @@ public static void StateFlagSet<TEnum>(
154154
[DebuggerHidden, MethodImpl(AggressiveInlining)]
155155
[AssertionMethod]
156156
public static void AnyStateFlagUnset<TEnum>(TEnum value, TEnum flags, [NotNull] string message)
157-
where TEnum : struct, IComparable, IFormattable, IConvertible
157+
where TEnum : struct, Enum
158158
{
159159
if (!value.IsAnyFlagUnset(flags))
160160
throw CodeExceptions.InvalidOperation(message);
@@ -172,7 +172,7 @@ public static void AnyStateFlagUnset<TEnum>(
172172
TEnum value, TEnum flags,
173173
[NotNull] string messageFormat,
174174
[CanBeNull] params object[] args)
175-
where TEnum : struct, IComparable, IFormattable, IConvertible
175+
where TEnum : struct, Enum
176176
{
177177
if (!value.IsAnyFlagUnset(flags))
178178
throw CodeExceptions.InvalidOperation(messageFormat, args);
@@ -186,7 +186,7 @@ public static void AnyStateFlagUnset<TEnum>(
186186
[DebuggerHidden, MethodImpl(AggressiveInlining)]
187187
[AssertionMethod]
188188
public static void AnyStateFlagSet<TEnum>(TEnum value, TEnum flags, [NotNull] string message)
189-
where TEnum : struct, IComparable, IFormattable, IConvertible
189+
where TEnum : struct, Enum
190190
{
191191
if (!value.IsAnyFlagSet(flags))
192192
throw CodeExceptions.InvalidOperation(message);
@@ -204,7 +204,7 @@ public static void AnyStateFlagSet<TEnum>(
204204
TEnum value, TEnum flags,
205205
[NotNull] string messageFormat,
206206
[CanBeNull] params object[] args)
207-
where TEnum : struct, IComparable, IFormattable, IConvertible
207+
where TEnum : struct, Enum
208208
{
209209
if (!value.IsAnyFlagSet(flags))
210210
throw CodeExceptions.InvalidOperation(messageFormat, args);
@@ -218,7 +218,7 @@ public static void AnyStateFlagSet<TEnum>(
218218
[DebuggerHidden, MethodImpl(AggressiveInlining)]
219219
[AssertionMethod]
220220
public static void StateFlagUnset<TEnum>(TEnum value, TEnum flag, [NotNull] string message)
221-
where TEnum : struct, IComparable, IFormattable, IConvertible
221+
where TEnum : struct, Enum
222222
{
223223
if (!value.IsFlagUnset(flag))
224224
throw CodeExceptions.InvalidOperation(message);
@@ -236,7 +236,7 @@ public static void StateFlagUnset<TEnum>(
236236
TEnum value, TEnum flag,
237237
[NotNull] string messageFormat,
238238
[CanBeNull] params object[] args)
239-
where TEnum : struct, IComparable, IFormattable, IConvertible
239+
where TEnum : struct, Enum
240240
{
241241
if (!value.IsFlagUnset(flag))
242242
throw CodeExceptions.InvalidOperation(messageFormat, args);

Main/src/Assertions/EnumCodeExceptions.cs

Lines changed: 5 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -24,7 +24,7 @@ public static class EnumCodeExceptions
2424
public static ArgumentOutOfRangeException ArgumentNotDefinedException<TEnum>(
2525
[NotNull, InvokerParameterName] string argumentName,
2626
TEnum value)
27-
where TEnum : struct, IComparable, IFormattable, IConvertible
27+
where TEnum : struct, Enum
2828
{
2929
BreakIfAttached();
3030
var valueType = value.GetType();
@@ -47,7 +47,7 @@ public static ArgumentOutOfRangeException ArgumentNotDefinedException<TEnum>(
4747
public static ArgumentException ArgumentFlagSet<TEnum>(
4848
[NotNull, InvokerParameterName] string argumentName,
4949
TEnum value, TEnum flag)
50-
where TEnum : struct, IComparable, IFormattable, IConvertible
50+
where TEnum : struct, Enum
5151
{
5252
BreakIfAttached();
5353
return new ArgumentException(
@@ -67,7 +67,7 @@ public static ArgumentException ArgumentFlagSet<TEnum>(
6767
public static ArgumentException ArgumentAnyFlagUnset<TEnum>(
6868
[NotNull, InvokerParameterName] string argumentName,
6969
TEnum value, TEnum flags)
70-
where TEnum : struct, IComparable, IFormattable, IConvertible
70+
where TEnum : struct, Enum
7171
{
7272
BreakIfAttached();
7373
return new ArgumentException(
@@ -87,7 +87,7 @@ public static ArgumentException ArgumentAnyFlagUnset<TEnum>(
8787
public static ArgumentException ArgumentAnyFlagSet<TEnum>(
8888
[NotNull, InvokerParameterName] string argumentName,
8989
TEnum value, TEnum flags)
90-
where TEnum : struct, IComparable, IFormattable, IConvertible
90+
where TEnum : struct, Enum
9191
{
9292
BreakIfAttached();
9393
return new ArgumentException(
@@ -107,7 +107,7 @@ public static ArgumentException ArgumentAnyFlagSet<TEnum>(
107107
public static ArgumentException ArgumentFlagUnset<TEnum>(
108108
[NotNull, InvokerParameterName] string argumentName,
109109
TEnum value, TEnum flag)
110-
where TEnum : struct, IComparable, IFormattable, IConvertible
110+
where TEnum : struct, Enum
111111
{
112112
BreakIfAttached();
113113
return new ArgumentException(

0 commit comments

Comments
 (0)