1 /*
2 * hunt-proton: AMQP Protocol library for D programming language.
3 *
4 * Copyright (C) 2018-2019 HuntLabs
5 *
6 * Website: https://www.huntlabs.net/
7 *
8 * Licensed under the Apache-2.0 License.
9 *
10 */
11
12 module hunt.proton.amqp.UnsignedInteger;
13
14
15 import hunt.math;
16 import hunt.Number;
17 import std.algorithm.comparison;
18 import std.conv : to;
19 import hunt.logging;
20
21 import std.concurrency : initOnce;
22
23
24 class UnsignedInteger : AbstractNumber!int
25 {
26 // private int _underlying;
27 //__gshared UnsignedInteger[] cachedValues ;
28
29
30 //static UnsignedInteger ZERO() {
31 // return cachedValues[0];
32 //}
33 //static UnsignedInteger ONE () {return cachedValues[1];}
34
35 static UnsignedInteger ZERO()
36 {
37 __gshared UnsignedInteger inst;
38 return initOnce!inst(cachedValues[0]);
39 }
40
41 static UnsignedInteger ONE()
42 {
43 __gshared UnsignedInteger inst;
44 return initOnce!inst(cachedValues[1]);
45 }
46
47 static UnsignedInteger[] cachedValues()
48 {
49 __gshared UnsignedInteger[] inst;
50 return initOnce!inst(initCachedValues());
51 }
52
53 static UnsignedInteger MAX_VALUE()
54 {
55 __gshared UnsignedInteger inst;
56 return initOnce!inst(new UnsignedInteger(0xffffffff));
57 }
58
59 private static UnsignedInteger[] initCachedValues()
60 {
61 UnsignedInteger[] cached = new UnsignedInteger[256];
62 for(int i = 0; i < 256; i++)
63 {
64 cached[i] = new UnsignedInteger(i);
65 }
66
67 return cached;
68
69 }
70
71 //static this()
72 //{
73 //
74 // cachedValues = new UnsignedInteger[256];
75 // for(int i = 0; i < 256; i++)
76 // {
77 // cachedValues[i] = new UnsignedInteger(i);
78 // }
79 //
80 // static UnsignedInteger ZERO = cachedValues[0];
81 // static UnsignedInteger ONE = cachedValues[1];
82 // static UnsignedInteger MAX_VALUE = new UnsignedInteger(0xffffffff);
83 //}
84
85
86 this(int value)
87 {
88 super(value);
89 }
90
91 // override
92 // public int intValue()
93 // {
94 // return _underlying;
95 // }
96
97 // override
98 // public long longValue()
99 // {
100 // return (_underlying) & 0xFFFFFFFF;
101 // }
102
103 // override
104 // public float floatValue()
105 // {
106 // return cast(float) (longValue());
107 // }
108
109 // override
110 // public double doubleValue()
111 // {
112 // return cast(double) (longValue());
113 // }
114
115 // override bool opEquals(Object o)
116 // {
117 // if (this is o)
118 // {
119 // return true;
120 // }
121 // if (o is null || cast(UnsignedInteger)o is null)
122 // {
123 // return false;
124 // }
125
126 // UnsignedInteger that = cast(UnsignedInteger)o;
127
128 // if (_underlying != that.intValue())
129 // {
130 // return false;
131 // }
132
133 // return true;
134 // }
135
136 override int opCmp(Object o)
137 {
138 return cast(int)(longValue() - (cast(UnsignedInteger)o).longValue());
139 }
140
141 // override
142 // public size_t toHash() @trusted nothrow
143 // {
144 // return cast(size_t)_underlying;
145 // }
146 //
147 //override
148 //public string toString()
149 //{
150 // return to!string(longValue());
151 //}
152
153 public static UnsignedInteger valueOf(int underlying)
154 {
155 if((underlying & 0xFFFFFF00) == 0)
156 {
157 return cachedValues[underlying];
158 }
159 else
160 {
161 return new UnsignedInteger(underlying);
162 }
163 }
164
165 public UnsignedInteger add(UnsignedInteger i)
166 {
167 int val = intValue() + i.intValue();
168 return UnsignedInteger.valueOf(val);
169 }
170
171 public UnsignedInteger subtract(UnsignedInteger i)
172 {
173 int val = intValue() - i.intValue();
174 return UnsignedInteger.valueOf(val);
175 }
176
177 public static UnsignedInteger valueOf(string value)
178 {
179 long longVal = to!long(value);
180 return valueOf(longVal);
181 }
182
183 public static UnsignedInteger valueOf(long longVal)
184 {
185 if(longVal < 0L || longVal >= (1L<<32))
186 {
187 logError("lies outside the range");
188 }
189 return valueOf(cast (int)(longVal));
190 }
191
192
193 // override
194 // byte byteValue()
195 // {
196 // return 1;
197 // }
198
199 // override short shortValue()
200 // {
201 // return 1;
202 // }
203
204 // override string toString()
205 // {
206 // return "";
207 // }
208 }