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

125 lines, 61 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
10class BigStr;
11
12namespace mops {
13
14// BigInt library
15// TODO: Make it arbitrary size. Right now it's int64_t, which is distinct
16// from int.
17
18typedef int64_t BigInt;
19
20// For convenience
21extern const BigInt ZERO;
22extern const BigInt ONE;
23extern const BigInt MINUS_ONE;
24extern const BigInt MINUS_TWO;
25
26BigStr* ToStr(BigInt b);
27BigStr* ToOctal(BigInt b);
28BigStr* ToHexUpper(BigInt b);
29BigStr* ToHexLower(BigInt b);
30
31BigInt FromStr(BigStr* s, int base = 10);
32
33inline int BigTruncate(BigInt b) {
34 return static_cast<int>(b);
35}
36
37inline BigInt IntWiden(int b) {
38 return static_cast<BigInt>(b);
39}
40
41inline BigInt FromC(int64_t i) {
42 return i;
43}
44
45inline BigInt FromBool(bool b) {
46 return b ? BigInt(1) : BigInt(0);
47}
48
49inline float ToFloat(BigInt b) {
50 // TODO: test this
51 return static_cast<float>(b);
52}
53
54inline BigInt FromFloat(float f) {
55 // TODO: test this
56 return static_cast<BigInt>(f);
57}
58
59inline BigInt Negate(BigInt b) {
60 return -b;
61}
62
63inline BigInt Add(BigInt a, BigInt b) {
64 return a + b;
65}
66
67inline BigInt Sub(BigInt a, BigInt b) {
68 return a - b;
69}
70
71inline BigInt Mul(BigInt a, BigInt b) {
72 return a * b;
73}
74
75inline BigInt Div(BigInt a, BigInt b) {
76 // Is the behavior of negative values defined in C++? Avoid difference with
77 // Python.
78 DCHECK(a >= 0);
79 DCHECK(b >= 0);
80 return a / b;
81}
82
83inline BigInt Rem(BigInt a, BigInt b) {
84 // Is the behavior of negative values defined in C++? Avoid difference with
85 // Python.
86 DCHECK(a >= 0);
87 DCHECK(b >= 0);
88 return a % b;
89}
90
91inline bool Equal(BigInt a, BigInt b) {
92 return a == b;
93}
94
95inline bool Greater(BigInt a, BigInt b) {
96 return a > b;
97}
98
99inline BigInt LShift(BigInt a, BigInt b) {
100 return a << b;
101}
102
103inline BigInt RShift(BigInt a, BigInt b) {
104 return a >> b;
105}
106
107inline BigInt BitAnd(BigInt a, BigInt b) {
108 return a & b;
109}
110
111inline BigInt BitOr(BigInt a, BigInt b) {
112 return a | b;
113}
114
115inline BigInt BitXor(BigInt a, BigInt b) {
116 return a ^ b;
117}
118
119inline BigInt BitNot(BigInt a) {
120 return ~a;
121}
122
123} // namespace mops
124
125#endif // MYCPP_GC_MOPS_H