-
Notifications
You must be signed in to change notification settings - Fork 6
/
Copy pathBoolean.cs
105 lines (82 loc) · 4.25 KB
/
Boolean.cs
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
using System.Runtime.CompilerServices;
using System.Runtime.Serialization;
using static System.Runtime.CompilerServices.MethodImplOptions;
namespace Plato
{
/// <summary>
/// A simple wrapper around the built-in <c>Boolean</c> type,
/// forwarding logical operations and common methods to <c>Boolean</c>.
/// </summary>
[DataContract]
public partial struct Boolean
{
// -------------------------------------------------------------------------------
// Field (the wrapped Boolean)
// -------------------------------------------------------------------------------
[DataMember] public readonly bool Value;
// -------------------------------------------------------------------------------
// Constructors
// -------------------------------------------------------------------------------
[MethodImpl(AggressiveInlining)]
public Boolean(bool value) => Value = value;
// -------------------------------------------------------------------------------
// Convert to/from Boolean
// -------------------------------------------------------------------------------
[MethodImpl(AggressiveInlining)]
public bool ToSystem() => Value;
[MethodImpl(AggressiveInlining)]
public static Boolean FromSystem(bool b) => new(b);
[MethodImpl(AggressiveInlining)]
public static implicit operator Boolean(bool b) => FromSystem(b);
[MethodImpl(AggressiveInlining)]
public static implicit operator bool(Boolean b) => b.ToSystem();
[MethodImpl(AggressiveInlining)]
public static bool operator true(Boolean b) => b.Value;
[MethodImpl(AggressiveInlining)]
public static bool operator false(Boolean b) => !b.Value;
// -------------------------------------------------------------------------------
// Operators (logical, equality, etc.)
// -------------------------------------------------------------------------------
/// <summary>
/// Logical AND operator (bitwise AND for booleans).
/// </summary>
[MethodImpl(AggressiveInlining)]
public static Boolean operator &(Boolean a, Boolean b)
=> a.Value & b.Value;
/// <summary>
/// Logical OR operator (bitwise OR for booleans).
/// </summary>
[MethodImpl(AggressiveInlining)]
public static Boolean operator |(Boolean a, Boolean b)
=> a.Value | b.Value;
/// <summary>
/// Logical XOR operator (bitwise exclusive OR for booleans).
/// </summary>
[MethodImpl(AggressiveInlining)]
public static Boolean operator ^(Boolean a, Boolean b)
=> a.Value ^ b.Value;
/// <summary>
/// Logical NOT operator (negates the value).
/// </summary>
[MethodImpl(AggressiveInlining)]
public static Boolean operator !(Boolean b)
=> !b.Value;
// -------------------------------------------------------------------------------
// Comparison operators
// -------------------------------------------------------------------------------
public static bool operator <=(Boolean a, Boolean b)
=> !a.Value || a.Value == b.Value;
public static bool operator >=(Boolean a, Boolean b)
=> a.Value || a.Value == b.Value;
public static bool operator <(Boolean a, Boolean b)
=> !a && b;
public static bool operator >(Boolean a, Boolean b)
=> a && !b;
// -------------------------------------------------------------------------------
// IComparable / IComparable<Boolean> Implementation
// -------------------------------------------------------------------------------
[MethodImpl(AggressiveInlining)]
public int CompareTo(Boolean other)
=> Value.CompareTo(other);
}
}