Skip to content

Commit 31de713

Browse files
committed
add flags ref
1 parent 187dfb4 commit 31de713

File tree

4 files changed

+70
-20
lines changed

4 files changed

+70
-20
lines changed

CSUtilities.Tests/Extensions/EnumExtensionsTests.cs

Lines changed: 27 additions & 13 deletions
Original file line numberDiff line numberDiff line change
@@ -1,24 +1,25 @@
1-
using CSUtilities.Attributes;
2-
using CSUtilities.Extensions;
1+
using CSUtilities.Extensions;
2+
using CSUtilities.Tests.Mock;
33
using System;
44
using Xunit;
55

66
namespace CSUtilities.Tests.Extensions
77
{
88
public class EnumExtensionsTests
99
{
10-
private enum MockStringValues
10+
[Fact]
11+
public void AddFlagTest()
1112
{
12-
[StringValue("Undefined value for enum")]
13-
Undefined = 0,
14-
15-
[StringValue("Enum String Value 1")]
16-
Value1 = 1,
13+
MockFlags flags = MockFlags.None;
1714

18-
[StringValue("Enum String Value 2")]
19-
Value2,
20-
21-
NoAttribute,
15+
flags.AddFlag(MockFlags.Flag1);
16+
Assert.Equal(MockFlags.Flag1, flags);
17+
flags.AddFlag(MockFlags.Flag2);
18+
Assert.Equal(MockFlags.Flag1 | MockFlags.Flag2, flags);
19+
flags.AddFlag(MockFlags.Flag3);
20+
Assert.Equal(MockFlags.All, flags);
21+
flags.AddFlag(MockFlags.Flag1);
22+
Assert.Equal(MockFlags.All, flags);
2223
}
2324

2425
[Fact]
@@ -38,6 +39,19 @@ public void ParseTest()
3839
Assert.Throws<ArgumentException>(() => EnumExtensions.Parse<MockStringValues>("value1", false));
3940
}
4041

42+
[Fact]
43+
public void RemoveFlagTest()
44+
{
45+
MockFlags flags = MockFlags.All;
46+
47+
flags.RemoveFlag(MockFlags.Flag1);
48+
Assert.Equal(MockFlags.Flag2 | MockFlags.Flag3, flags);
49+
flags.RemoveFlag(MockFlags.Flag2);
50+
Assert.Equal(MockFlags.Flag3, flags);
51+
flags.RemoveFlag(MockFlags.Flag3);
52+
Assert.Equal(MockFlags.None, flags);
53+
}
54+
4155
[Fact]
4256
public void TryParseTest()
4357
{
@@ -53,4 +67,4 @@ public void TryParseTest()
5367
Assert.Equal(default(MockStringValues), result);
5468
}
5569
}
56-
}
70+
}
Lines changed: 18 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,18 @@
1+
using System;
2+
3+
namespace CSUtilities.Tests.Mock
4+
{
5+
[Flags]
6+
public enum MockFlags
7+
{
8+
None = 0,
9+
10+
Flag1 = 1,
11+
12+
Flag2 = 2,
13+
14+
Flag3 = 4,
15+
16+
All = Flag1 | Flag2 | Flag3
17+
}
18+
}
Lines changed: 18 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,18 @@
1+
using CSUtilities.Attributes;
2+
3+
namespace CSUtilities.Tests.Mock
4+
{
5+
public enum MockStringValues
6+
{
7+
[StringValue("Undefined value for enum")]
8+
Undefined = 0,
9+
10+
[StringValue("Enum String Value 1")]
11+
Value1 = 1,
12+
13+
[StringValue("Enum String Value 2")]
14+
Value2,
15+
16+
NoAttribute,
17+
}
18+
}

CSUtilities/Extensions/EnumExtensions.cs

Lines changed: 7 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -32,23 +32,23 @@ public static T GetValueByName<T>(string name)
3232
}
3333

3434
/// <summary>
35-
/// Adds a flag value to enum
35+
/// Adds a flag value to enum.
3636
/// </summary>
37-
public static T AddFlag<T>(this T value, T flag)
37+
public static void AddFlag<T>(ref this T value, T flag)
3838
where T : struct, Enum
3939
{
4040
Type type = getEnumType(Convert.GetTypeCode(value));
41-
return (T)Convert.ChangeType((Convert.ToUInt64(value) | Convert.ToUInt64(flag)), type);
41+
value = (T)Convert.ChangeType((Convert.ToUInt64(value) | Convert.ToUInt64(flag)), type);
4242
}
4343

4444
/// <summary>
45-
/// Removes the flag value from enum
45+
/// Removes the flag value from enum.
4646
/// </summary>
47-
public static T RemoveFlag<T>(this T value, T flag)
48-
where T : Enum
47+
public static void RemoveFlag<T>(ref this T value, T flag)
48+
where T : struct, Enum
4949
{
5050
Type type = getEnumType(Convert.GetTypeCode(value));
51-
return (T)Convert.ChangeType((Convert.ToUInt64(value) & ~Convert.ToUInt64(flag)), type);
51+
value = (T)Convert.ChangeType((Convert.ToUInt64(value) & ~Convert.ToUInt64(flag)), type);
5252
}
5353

5454
/// <summary>

0 commit comments

Comments
 (0)