1 # This file is part of NIT ( http://www.nitlanguage.org ).
3 # This file is free software, which comes along with NIT. This software is
4 # distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY;
5 # without even the implied warranty of MERCHANTABILITY or FITNESS FOR A
6 # PARTICULAR PURPOSE. You can modify it is you want, provided this header
7 # is kept unaltered, and a notification of the changes is added.
8 # You are allowed to redistribute it and sell it, alone or is a part of
11 # Basic integers of fixed-precision
13 # All classes defined here have C-equivalents and the semantics of their
14 # operations are the same as C's
18 # * UInt16 => uint16_t
20 # * UInt32 => uint32_t
22 # NOTE: No UInt8 is provided as Byte is the same
26 # All classes can be instanciated via a literal rule.
27 # Namely, a suffix to append after the literal integer.
45 # The Int8 equivalent of `self`
47 # assert (-1).to_i8 == 0xFFFFi8
48 # assert (1.9).to_i8 == 1i8
49 fun to_i8
: Int8 do return self.to_i
.to_i8
51 # The Int16 equivalent of `self`
53 # assert (-1).to_i16 == 0xFFFFi16
54 # assert (1.9).to_i16 == 1i16
55 fun to_i16
: Int16 do return self.to_i
.to_i16
57 # The UInt16 equivalent of `self`
59 # assert (-1).to_u16 == 0xFFFFu16
60 # assert (1.9).to_u16 == 1u16
61 fun to_u16
: UInt16 do return self.to_i
.to_u16
63 # The Int32 equivalent of `self`
65 # assert (-1).to_i32 == 0xFFFFFFFFi32
66 # assert (1.9).to_i32 == 1i32
67 fun to_i32
: Int32 do return self.to_i
.to_i32
69 # The UInt32 equivalent of `self`
71 # assert (-1).to_u32 == 0xFFFFFFFFu32
72 # assert (1.9).to_u32 == 1u32
73 fun to_u32
: UInt32 do return self.to_i
.to_u32
78 redef fun to_i8
is intern
79 redef fun to_i16
is intern
80 redef fun to_u16
is intern
81 redef fun to_i32
is intern
82 redef fun to_u32
is intern
86 redef fun to_i8
is intern
87 redef fun to_i16
is intern
88 redef fun to_u16
is intern
89 redef fun to_i32
is intern
90 redef fun to_u32
is intern
94 redef fun to_i8
is intern
95 redef fun to_i16
is intern
96 redef fun to_u16
is intern
97 redef fun to_i32
is intern
98 redef fun to_u32
is intern
101 # Native 8-bit signed integer.
102 # Same as a C `int8_t`
107 redef type OTHER: Int8
109 redef fun successor
(i
) do return self + i
.to_i8
110 redef fun predecessor
(i
) do return self - i
.to_i8
112 redef fun object_id
is intern
113 redef fun hash
do return self.to_i
114 redef fun ==(i
) is intern
115 redef fun !=(i
) is intern
116 redef fun output
is intern
118 redef fun <=(i
) is intern
119 redef fun <(i
) is intern
120 redef fun >=(i
) is intern
121 redef fun >(i
) is intern
122 redef fun +(i
) is intern
124 # assert -1i8 == 0xFFi8
125 # assert -0i8 == 0x00i8
126 redef fun - is intern
127 redef fun -(i
) is intern
128 redef fun *(i
) is intern
129 redef fun /(i
) is intern
131 # Modulo of `self` with `i`.
133 # Returns the remainder of division of `self` by `i`.
135 # assert 5i8 % 2i8 == 1i8
136 # assert 10i8 % 2i8 == 0i8
137 fun %(i
: Int8): Int8 is intern
139 redef fun zero
do return 0.to_i8
140 redef fun value_of
(val
) do return val
.to_i8
142 # `i` bits shift to the left
144 # assert 5i8 << 1 == 10i8
145 fun <<(i
: Int): Int8 is intern
147 # `i` bits shift to the right
149 # assert 5i8 >> 1 == 2i8
150 fun >>(i
: Int): Int8 is intern
152 redef fun to_i
is intern
153 redef fun to_f
is intern
154 redef fun to_b
is intern
155 redef fun to_i8
do return self
156 redef fun to_i16
is intern
157 redef fun to_u16
is intern
158 redef fun to_i32
is intern
159 redef fun to_u32
is intern
161 redef fun distance
(i
) do return (self - i
).to_i
167 else if other
< self then
174 redef fun is_between
(c
, d
)
176 if self < c
or d
< self then
201 # Returns the result of a binary AND operation on `self` and `i`
203 # assert 0x10i8 & 0x01i8 == 0i8
204 fun &(i
: Int8): Int8 is intern
206 # Returns the result of a binary OR operation on `self` and `i`
208 # assert 0x10i8 | 0x01i8 == 0x11i8
209 fun |(i
: Int8): Int8 is intern
211 # Returns the result of a binary XOR operation on `self` and `i`
213 # assert 0x101i8 ^ 0x110i8 == 0x11i8
214 fun ^
(i
: Int8): Int8 is intern
216 # Returns the 1's complement of `self`
218 # assert ~0x2Fi8 == 0xD0i8
219 fun ~
: Int8 is intern
222 # Native 16-bit signed integer.
223 # Same as a C `int16_t`
228 redef type OTHER: Int16
230 redef fun successor
(i
) do return self + i
.to_i16
231 redef fun predecessor
(i
) do return self - i
.to_i16
233 redef fun object_id
is intern
234 redef fun hash
do return self.to_i
235 redef fun ==(i
) is intern
236 redef fun !=(i
) is intern
237 redef fun output
is intern
239 redef fun <=(i
) is intern
240 redef fun <(i
) is intern
241 redef fun >=(i
) is intern
242 redef fun >(i
) is intern
243 redef fun +(i
) is intern
245 # assert -1i16 == 0xFFFFi16
246 # assert -0i16 == 0i16
247 redef fun - is intern
248 redef fun -(i
) is intern
249 redef fun *(i
) is intern
250 redef fun /(i
) is intern
252 # Modulo of `self` with `i`.
254 # Returns the remainder of division of `self` by `i`.
256 # assert 5i16 % 2i16 == 1i16
257 # assert 10i16 % 2i16 == 0i16
258 fun %(i
: Int16): Int16 is intern
260 redef fun zero
do return 0.to_i16
261 redef fun value_of
(val
) do return val
.to_i16
263 # `i` bits shift to the left
265 # assert 5i16 << 1 == 10i16
266 fun <<(i
: Int): Int16 is intern
268 # `i` bits shift to the right
270 # assert 5i16 >> 1 == 2i16
271 fun >>(i
: Int): Int16 is intern
273 redef fun to_i
is intern
274 redef fun to_f
is intern
275 redef fun to_b
is intern
276 redef fun to_i8
is intern
277 redef fun to_i16
do return self
278 redef fun to_u16
is intern
279 redef fun to_i32
is intern
280 redef fun to_u32
is intern
282 redef fun distance
(i
) do return (self - i
).to_i
288 else if other
< self then
295 redef fun is_between
(c
, d
)
297 if self < c
or d
< self then
322 # Returns the result of a binary AND operation on `self` and `i`
324 # assert 0x10i16 & 0x01i16 == 0i16
325 fun &(i
: Int16): Int16 is intern
327 # Returns the result of a binary OR operation on `self` and `i`
329 # assert 0x10i16 | 0x01i16 == 0x11i16
330 fun |(i
: Int16): Int16 is intern
332 # Returns the result of a binary XOR operation on `self` and `i`
334 # assert 0x101i16 ^ 0x110i16 == 0x11i16
335 fun ^
(i
: Int16): Int16 is intern
337 # Returns the 1's complement of `self`
339 # assert ~0x2Fi16 == 0xFFD0i16
340 fun ~
: Int16 is intern
343 # Native 16-bit unsigned integer.
344 # Same as a C `uint16_t`
349 redef type OTHER: UInt16
351 redef fun successor
(i
) do return self + i
.to_u16
352 redef fun predecessor
(i
) do return self - i
.to_u16
354 redef fun object_id
is intern
355 redef fun hash
do return self.to_i
356 redef fun ==(i
) is intern
357 redef fun !=(i
) is intern
358 redef fun output
is intern
360 redef fun <=(i
) is intern
361 redef fun <(i
) is intern
362 redef fun >=(i
) is intern
363 redef fun >(i
) is intern
364 redef fun +(i
) is intern
366 # assert -1u16 == 0xFFFFu16
367 # assert -0u16 == 0u16
368 redef fun - is intern
369 redef fun -(i
) is intern
370 redef fun *(i
) is intern
371 redef fun /(i
) is intern
373 # Modulo of `self` with `i`.
375 # Returns the remainder of division of `self` by `i`.
377 # assert 5u16 % 2u16 == 1u16
378 # assert 10u16 % 2u16 == 0u16
379 fun %(i
: UInt16): UInt16 is intern
381 redef fun zero
do return 0.to_u16
382 redef fun value_of
(val
) do return val
.to_u16
384 # `i` bits shift to the left
386 # assert 5u16 << 1 == 10u16
387 fun <<(i
: Int): UInt16 is intern
389 # `i` bits shift to the right
391 # assert 5u16 >> 1 == 2u16
392 fun >>(i
: Int): UInt16 is intern
394 redef fun to_i
is intern
395 redef fun to_f
is intern
396 redef fun to_b
is intern
397 redef fun to_i8
is intern
398 redef fun to_i16
is intern
399 redef fun to_u16
do return self
400 redef fun to_i32
is intern
401 redef fun to_u32
is intern
403 redef fun distance
(i
) do return (self - i
).to_i
409 else if other
< self then
416 redef fun is_between
(c
, d
)
418 if self < c
or d
< self then
443 # Returns the result of a binary AND operation on `self` and `i`
445 # assert 0x10u16 & 0x01u16 == 0u16
446 fun &(i
: UInt16): UInt16 is intern
448 # Returns the result of a binary OR operation on `self` and `i`
450 # assert 0x10u16 | 0x01u16 == 0x11u16
451 fun |(i
: UInt16): UInt16 is intern
453 # Returns the result of a binary XOR operation on `self` and `i`
455 # assert 0x101u16 ^ 0x110u16 == 0x11u16
456 fun ^
(i
: UInt16): UInt16 is intern
458 # Returns the 1's complement of `self`
460 # assert ~0x2Fu16 == 0xFFD0u16
461 fun ~
: UInt16 is intern
464 # Native 32-bit signed integer.
465 # Same as a C `int32_t`
470 redef type OTHER: Int32
472 redef fun successor
(i
) do return self + i
.to_i32
473 redef fun predecessor
(i
) do return self - i
.to_i32
475 redef fun object_id
is intern
476 redef fun hash
do return self.to_i
477 redef fun ==(i
) is intern
478 redef fun !=(i
) is intern
479 redef fun output
is intern
481 redef fun <=(i
) is intern
482 redef fun <(i
) is intern
483 redef fun >=(i
) is intern
484 redef fun >(i
) is intern
485 redef fun +(i
) is intern
487 # assert -1i32 == 0xFFFFFFFFi32
488 # assert -0i32 == 0x00i32
489 redef fun - is intern
490 redef fun -(i
) is intern
491 redef fun *(i
) is intern
492 redef fun /(i
) is intern
494 # Modulo of `self` with `i`.
496 # Returns the remainder of division of `self` by `i`.
498 # assert 5i32 % 2i32 == 1i32
499 # assert 10i32 % 2i32 == 0i32
500 fun %(i
: Int32): Int32 is intern
502 redef fun zero
do return 0.to_i32
503 redef fun value_of
(val
) do return val
.to_i32
505 # `i` bits shift to the left
507 # assert 5i32 << 1 == 10i32
508 fun <<(i
: Int): Int32 is intern
510 # `i` bits shift to the right
512 # assert 5i32 >> 1 == 2i32
513 fun >>(i
: Int): Int32 is intern
515 redef fun to_i
is intern
516 redef fun to_f
is intern
517 redef fun to_b
is intern
518 redef fun to_i8
is intern
519 redef fun to_i16
is intern
520 redef fun to_u16
is intern
521 redef fun to_i32
do return self
522 redef fun to_u32
is intern
524 redef fun distance
(i
) do return (self - i
).to_i
530 else if other
< self then
537 redef fun is_between
(c
, d
)
539 if self < c
or d
< self then
564 # Returns the result of a binary AND operation on `self` and `i`
566 # assert 0x10i32 & 0x01i32 == 0i32
567 fun &(i
: Int32): Int32 is intern
569 # Returns the result of a binary OR operation on `self` and `i`
571 # assert 0x10i32 | 0x01i32 == 0x11i32
572 fun |(i
: Int32): Int32 is intern
574 # Returns the result of a binary XOR operation on `self` and `i`
576 # assert 0x101i32 ^ 0x110i32 == 0x11i32
577 fun ^
(i
: Int32): Int32 is intern
579 # Returns the 1's complement of `self`
581 # assert ~0x2Fi32 == 0xFFFFFFD0i32
582 fun ~
: Int32 is intern
585 # Native 32-bit unsigned integer.
586 # Same as a C `uint32_t`
591 redef type OTHER: UInt32
593 redef fun successor
(i
) do return self + i
.to_u32
594 redef fun predecessor
(i
) do return self - i
.to_u32
596 redef fun object_id
is intern
597 redef fun hash
do return self.to_i
598 redef fun ==(i
) is intern
599 redef fun !=(i
) is intern
600 redef fun output
is intern
602 redef fun <=(i
) is intern
603 redef fun <(i
) is intern
604 redef fun >=(i
) is intern
605 redef fun >(i
) is intern
606 redef fun +(i
) is intern
608 # assert -1u32 == 0xFFFFFFFFu32
609 # assert -0u32 == 0x00u32
610 redef fun - is intern
611 redef fun -(i
) is intern
612 redef fun *(i
) is intern
613 redef fun /(i
) is intern
615 # Modulo of `self` with `i`.
617 # Returns the remainder of division of `self` by `i`.
619 # assert 5u32 % 2u32 == 1u32
620 # assert 10u32 % 2u32 == 0u32
621 fun %(i
: UInt32): UInt32 is intern
623 redef fun zero
do return 0.to_u32
624 redef fun value_of
(val
) do return val
.to_u32
626 # `i` bits shift to the left
628 # assert 5u32 << 1 == 10u32
629 fun <<(i
: Int): UInt32 is intern
631 # `i` bits shift to the right
633 # assert 5u32 >> 1 == 2u32
634 fun >>(i
: Int): UInt32 is intern
636 redef fun to_i
is intern
637 redef fun to_f
is intern
638 redef fun to_b
is intern
639 redef fun to_i8
is intern
640 redef fun to_i16
is intern
641 redef fun to_u16
is intern
642 redef fun to_i32
is intern
643 redef fun to_u32
do return self
645 redef fun distance
(i
) do return (self - i
).to_i
651 else if other
< self then
658 redef fun is_between
(c
, d
)
660 if self < c
or d
< self then
685 # Returns the result of a binary AND operation on `self` and `i`
687 # assert 0x10u32 & 0x01u32 == 0u32
688 fun &(i
: UInt32): UInt32 is intern
690 # Returns the result of a binary OR operation on `self` and `i`
692 # assert 0x10u32 | 0x01u32 == 0x11u32
693 fun |(i
: UInt32): UInt32 is intern
695 # Returns the result of a binary XOR operation on `self` and `i`
697 # assert 0x101u32 ^ 0x110u32 == 0x11u32
698 fun ^
(i
: UInt32): UInt32 is intern
700 # Returns the 1's complement of `self`
702 # assert ~0x2Fu32 == 0xFFFFFFD0u32
703 fun ~
: UInt32 is intern