cpp

Coverage Report

Created: 2024-08-25 11:48

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