-
Notifications
You must be signed in to change notification settings - Fork 6
/
Copy pathInteger.cs
124 lines (100 loc) · 4.46 KB
/
Integer.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
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
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>int</c> type,
/// forwarding all arithmetic and common methods to <c>int</c>.
/// </summary>
[DataContract]
public partial struct Integer
{
// -------------------------------------------------------------------------------
// Field (the wrapped int)
// -------------------------------------------------------------------------------
[DataMember] public readonly int Value;
// -------------------------------------------------------------------------------
// Constructors
// -------------------------------------------------------------------------------
[MethodImpl(AggressiveInlining)]
public Integer(int value) => Value = value;
// -------------------------------------------------------------------------------
// Convert to/from int
// -------------------------------------------------------------------------------
[MethodImpl(AggressiveInlining)]
public int ToSystem() => Value;
[MethodImpl(AggressiveInlining)]
public static Integer FromSystem(int i) => new(i);
[MethodImpl(AggressiveInlining)]
public static implicit operator Integer(int i) => FromSystem(i);
[MethodImpl(AggressiveInlining)]
public static implicit operator int(Integer n) => n.ToSystem();
// -------------------------------------------------------------------------------
// Operators (forward to int)
// -------------------------------------------------------------------------------
[MethodImpl(AggressiveInlining)]
public static Integer operator +(Integer a, Integer b)
=> a.Value + b.Value;
[MethodImpl(AggressiveInlining)]
public static Integer operator -(Integer a, Integer b)
=> a.Value - b.Value;
[MethodImpl(AggressiveInlining)]
public static Integer operator *(Integer a, Integer b)
=> a.Value * b.Value;
[MethodImpl(AggressiveInlining)]
public static Integer operator /(Integer a, Integer b)
=> a.Value / b.Value;
[MethodImpl(AggressiveInlining)]
public static Integer operator %(Integer a, Integer b)
=> a.Value % b.Value;
[MethodImpl(AggressiveInlining)]
public static Integer operator -(Integer n)
=> -n.Value;
[MethodImpl(AggressiveInlining)]
public static Boolean operator <(Integer a, Integer b)
=> a.Value < b.Value;
[MethodImpl(AggressiveInlining)]
public static Boolean operator <=(Integer a, Integer b)
=> a.Value <= b.Value;
[MethodImpl(AggressiveInlining)]
public static Boolean operator >(Integer a, Integer b)
=> a.Value > b.Value;
[MethodImpl(AggressiveInlining)]
public static Boolean operator >=(Integer a, Integer b)
=> a.Value >= b.Value;
// -------------------------------------------------------------------------------
// IComparable / IComparable<Integer> Implementation
// -------------------------------------------------------------------------------
[MethodImpl(AggressiveInlining)]
public int CompareTo(Integer other)
=> Value.CompareTo(other.Value);
// -------------------------------------------------------------------------------
// Integer-specific Helper Properties/Methods
// -------------------------------------------------------------------------------
/// <summary>
/// The absolute value of the integer.
/// </summary>
public Integer Abs
{
[MethodImpl(AggressiveInlining)]
get => Math.Abs(Value);
}
/// <summary>
/// An integer that indicates the sign of this integer (-1, 0, or 1).
/// </summary>
public Integer Sign
{
[MethodImpl(AggressiveInlining)]
get => Math.Sign(Value);
}
/// <summary>
/// Linear interpolation, using default integer rounding.
/// </summary>
public Integer Lerp(Integer other, Number t)
{
var delta = other - this;
return (int)(Value + (delta.Value * t));
}
}
}