OILS / mycpp / gc_mops.h View on Github | oilshell.org

121 lines, 63 significant
1// gc_mops.h - corresponds to mycpp/mops.py
2
3#ifndef MYCPP_GC_MOPS_H
4#define MYCPP_GC_MOPS_H
5
6#include <stdint.h>
7
8#include "mycpp/common.h" // DCHECK
9#include "mycpp/gc_tuple.h"
10
11class BigStr;
12
13namespace mops {
14
15// BigInt library
16// TODO: Make it arbitrary size. Right now it's int64_t, which is distinct
17// from int.
18
19typedef int64_t BigInt;
20
21// For convenience
22extern const BigInt ZERO;
23extern const BigInt ONE;
24extern const BigInt MINUS_ONE;
25extern const BigInt MINUS_TWO;
26
27BigStr* ToStr(BigInt b);
28BigStr* ToOctal(BigInt b);
29BigStr* ToHexUpper(BigInt b);
30BigStr* ToHexLower(BigInt b);
31
32BigInt FromStr(BigStr* s, int base = 10);
33Tuple2<bool, BigInt> FromFloat(double f);
34
35inline int BigTruncate(BigInt b) {
36 return static_cast<int>(b);
37}
38
39inline BigInt IntWiden(int b) {
40 return static_cast<BigInt>(b);
41}
42
43inline BigInt FromC(int64_t i) {
44 return i;
45}
46
47inline BigInt FromBool(bool b) {
48 return b ? BigInt(1) : BigInt(0);
49}
50
51inline double ToFloat(BigInt b) {
52 return static_cast<double>(b);
53}
54
55inline BigInt Negate(BigInt b) {
56 return -b;
57}
58
59inline BigInt Add(BigInt a, BigInt b) {
60 return a + b;
61}
62
63inline BigInt Sub(BigInt a, BigInt b) {
64 return a - b;
65}
66
67inline BigInt Mul(BigInt a, BigInt b) {
68 return a * b;
69}
70
71inline BigInt Div(BigInt a, BigInt b) {
72 // Same check as in mops.py
73 DCHECK(a >= 0);
74 DCHECK(b > 0); // can't be zero
75 return a / b;
76}
77
78inline BigInt Rem(BigInt a, BigInt b) {
79 // Same check as in mops.py
80 DCHECK(a >= 0);
81 DCHECK(b > 0); // can't be zero
82 return a % b;
83}
84
85inline bool Equal(BigInt a, BigInt b) {
86 return a == b;
87}
88
89inline bool Greater(BigInt a, BigInt b) {
90 return a > b;
91}
92
93inline BigInt LShift(BigInt a, BigInt b) {
94 DCHECK(b >= 0);
95 return a << b;
96}
97
98inline BigInt RShift(BigInt a, BigInt b) {
99 DCHECK(b >= 0);
100 return a >> b;
101}
102
103inline BigInt BitAnd(BigInt a, BigInt b) {
104 return a & b;
105}
106
107inline BigInt BitOr(BigInt a, BigInt b) {
108 return a | b;
109}
110
111inline BigInt BitXor(BigInt a, BigInt b) {
112 return a ^ b;
113}
114
115inline BigInt BitNot(BigInt a) {
116 return ~a;
117}
118
119} // namespace mops
120
121#endif // MYCPP_GC_MOPS_H