Clingo
Loading...
Searching...
No Matches
number.hh
1#pragma once
2
3#include <clingo/util/print.hh>
4
5#include <cstdint>
6#include <optional>
7#include <ostream>
8#include <span>
9#include <string>
10
11namespace CppClingo {
12
15
17enum class Base : uint8_t {
18 dec = 10,
19 hex = 16,
20 oct = 8,
21 bin = 2,
22};
23
27class Number {
28 public:
30 Number(int32_t value) noexcept;
32 Number(char const *str, Base base = Base::dec);
34 Number(std::string_view str, Base base = Base::dec);
35
37 Number(Number const &other);
39 Number(Number &&other) noexcept;
41 auto operator=(Number const &other) -> Number &;
43 auto operator=(Number &&other) noexcept -> Number &;
44
46 ~Number() noexcept;
47
49 [[nodiscard]] auto as_int() const -> std::optional<int32_t>;
50
52 [[nodiscard]] auto as_string() const -> std::string;
53
55 void swap(Number &other) noexcept;
56
57 // comparison
58
60 [[nodiscard]] auto hash() const noexcept -> size_t;
61
63 friend auto compare(Number const &a, Number const &b) -> int;
65 friend auto compare(Number const &a, int32_t b) -> int;
67 friend auto compare(int32_t a, Number const &b) -> int;
68
70 friend auto operator==(Number const &a, Number const &b) { return compare(a, b) == 0; }
72 friend auto operator==(int32_t a, Number const &b) -> bool { return compare(a, b) == 0; }
74 friend auto operator==(Number const &a, int32_t b) -> bool { return compare(a, b) == 0; }
75
77 friend auto operator<=>(Number const &a, Number const &b) { return compare(a, b) <=> 0; }
79 friend auto operator<=>(int32_t a, Number const &b) { return compare(a, b) <=> 0; }
81 friend auto operator<=>(Number const &a, int32_t b) { return compare(a, b) <=> 0; }
82
83 // addition
84
86 friend auto operator+(Number const &a, Number const &b) -> Number;
88 friend auto operator+(Number &&a, Number const &b) -> Number;
90 friend auto operator+(Number const &a, Number &&b) -> Number;
92 friend auto operator+(Number &&a, Number &&b) -> Number;
93
95 friend auto operator+=(Number &a, Number const &b) -> Number &;
97 friend auto operator+=(Number &a, Number &&b) -> Number &;
98
99 // subtraction
100
102 friend auto operator-(Number const &a, Number const &b) -> Number;
104 friend auto operator-(Number &&a, Number const &b) -> Number;
106 friend auto operator-(Number const &a, Number &&b) -> Number;
108 friend auto operator-(Number &&a, Number &&b) -> Number;
109
111 friend auto operator-=(Number &a, Number const &b) -> Number &;
113 friend auto operator-=(Number &a, Number &&b) -> Number &;
114
115 // multiplication
116
118 friend auto operator*(Number const &a, Number const &b) -> Number;
120 friend auto operator*(Number &&a, Number const &b) -> Number;
122 friend auto operator*(Number const &a, Number &&b) -> Number;
124 friend auto operator*(Number &&a, Number &&b) -> Number;
125
127 friend auto operator*=(Number &a, Number const &b) -> Number &;
129 friend auto operator*=(Number &a, Number &&b) -> Number &;
130
131 // division
132
134 friend auto operator/(Number const &a, Number const &b) -> Number;
136 friend auto operator/(Number &&a, Number const &b) -> Number;
138 friend auto operator/(Number const &a, Number &&b) -> Number;
140 friend auto operator/(Number &&a, Number &&b) -> Number;
141
143 friend auto operator/=(Number &a, Number const &b) -> Number &;
145 friend auto operator/=(Number &a, Number &&b) -> Number &;
146
147 // modulus
148
150 friend auto operator%(Number const &a, Number const &b) -> Number;
152 friend auto operator%(Number &&a, Number const &b) -> Number;
154 friend auto operator%(Number const &a, Number &&b) -> Number;
156 friend auto operator%(Number &&a, Number &&b) -> Number;
157
159 friend auto operator%=(Number &a, Number const &b) -> Number &;
161 friend auto operator%=(Number &a, Number &&b) -> Number &;
162
163 // unary minus
164
166 friend auto operator-(Number const &a) -> Number;
168 friend auto operator-(Number &&a) -> Number;
169
170 // complement
171
173 friend auto operator~(Number const &a) -> Number;
175 friend auto operator~(Number &&a) -> Number;
176
177 // binary and
178
180 friend auto operator&(Number const &a, Number const &b) -> Number;
182 friend auto operator&(Number &&a, Number const &b) -> Number;
184 friend auto operator&(Number const &a, Number &&b) -> Number;
186 friend auto operator&(Number &&a, Number &&b) -> Number;
187
189 friend auto operator&=(Number &a, Number const &b) -> Number &;
191 friend auto operator&=(Number &a, Number &&b) -> Number &;
192
193 // binary or
194
196 friend auto operator|(Number const &a, Number const &b) -> Number;
198 friend auto operator|(Number &&a, Number const &b) -> Number;
200 friend auto operator|(Number const &a, Number &&b) -> Number;
202 friend auto operator|(Number &&a, Number &&b) -> Number;
203
205 friend auto operator|=(Number &a, Number const &b) -> Number &;
207 friend auto operator|=(Number &a, Number &&b) -> Number &;
208
209 // binary xor
210
212 friend auto operator^(Number const &a, Number const &b) -> Number;
214 friend auto operator^(Number &&a, Number const &b) -> Number;
216 friend auto operator^(Number const &a, Number &&b) -> Number;
218 friend auto operator^(Number &&a, Number &&b) -> Number;
219
221 friend auto operator^=(Number &a, Number const &b) -> Number &;
223 friend auto operator^=(Number &a, Number &&b) -> Number &;
224
225 // exponentiation
226
228 friend auto pow(Number const &a, Number const &b) -> Number;
230 friend auto pow(Number &&a, Number const &b) -> Number;
232 friend auto pow(Number const &a, Number &&b) -> Number;
234 friend auto pow(Number &&a, Number &&b) -> Number;
235
236 // absolute
237
239 friend auto abs(Number const &a) -> Number;
241 friend auto abs(Number &&a) -> Number;
242
243 // get the sign of the number
244
246 friend auto get_sign(Number const &a) -> int;
247
248 // output
249
251 friend auto operator<<(std::ostream &out, Number const &num) -> std::ostream &;
253 friend auto operator<<(Util::OutputBuffer &out, Number const &num) -> Util::OutputBuffer &;
254
255 // conversion between numbers and their representations
256
258 static auto from_repr(uint64_t repr) -> Number { return {repr}; }
259
263 static auto to_repr(Number const &num) -> uint64_t { return num.repr_; }
264
268 static auto release(Number &num) -> uint64_t {
269 auto repr = num.repr_;
270 num.repr_ = 0;
271 return repr;
272 }
273
274 private:
275 class Impl;
276 friend class Impl;
278 Number(uint64_t repr);
279
281 uint64_t repr_;
282};
283
285using NumberSpan = std::span<Number const>;
286
288
289} // namespace CppClingo
An arbitrary precision integer.
Definition number.hh:27
static auto release(Number &num) -> uint64_t
Get the internal representation of the number and set it to zero.
Definition number.hh:268
friend auto operator%=(Number &a, Number &&b) -> Number &
In place modulo the given number.
auto as_int() const -> std::optional< int32_t >
Convert the number to an integer if possible.
static auto from_repr(uint64_t repr) -> Number
Construct a number from the given representation.
Definition number.hh:258
Number(char const *str, Base base=Base::dec)
Construct a number from a string.
friend auto abs(Number const &a) -> Number
Get absolute of the given number.
friend auto pow(Number const &a, Number const &b) -> Number
Exponentiation of two numbers.
static auto to_repr(Number const &num) -> uint64_t
Get the internal representation of the number.
Definition number.hh:263
friend auto abs(Number &&a) -> Number
Get absolute of the given number.
auto operator=(Number const &other) -> Number &
Copy assign a number.
friend auto operator-=(Number &a, Number const &b) -> Number &
In place subtract the given number.
friend auto operator|(Number &&a, Number &&b) -> Number
Binary or of two numbers.
friend auto operator&=(Number &a, Number &&b) -> Number &
In place binary and the given number.
friend auto operator<<(std::ostream &out, Number const &num) -> std::ostream &
Output the given number.
Number(Number const &other)
Copy construct a number.
friend auto operator&(Number const &a, Number &&b) -> Number
Binary and of the two numbers.
friend auto operator+=(Number &a, Number &&b) -> Number &
In place add the given number.
friend auto pow(Number const &a, Number &&b) -> Number
Exponentiation of two numbers.
friend auto operator^(Number &&a, Number const &b) -> Number
Binary xor of two numbers.
friend auto operator~(Number &&a) -> Number
Binary complement of the number.
friend auto operator<=>(Number const &a, Number const &b)
Compare two numbers.
Definition number.hh:77
Number(int32_t value) noexcept
Construct a number from an integer.
friend auto operator+(Number const &a, Number &&b) -> Number
Sum up two numbers.
friend auto pow(Number &&a, Number const &b) -> Number
Exponentiation of two numbers.
friend auto operator+(Number &&a, Number &&b) -> Number
Sum up two numbers.
friend auto operator~(Number const &a) -> Number
Binary complement of the number.
friend auto operator<=>(Number const &a, int32_t b)
Compare two numbers.
Definition number.hh:81
friend auto operator-=(Number &a, Number &&b) -> Number &
In place subtract the given number.
Number(Number &&other) noexcept
Move construct a number.
friend auto operator-(Number &&a, Number const &b) -> Number
Subtract two numbers.
friend auto operator<=>(int32_t a, Number const &b)
Compare two numbers.
Definition number.hh:79
friend auto operator+=(Number &a, Number const &b) -> Number &
In place add the given number.
friend auto operator|(Number &&a, Number const &b) -> Number
Binary or of two numbers.
auto hash() const noexcept -> size_t
Get a hash code of the number suitable for unordered containers.
friend auto operator^(Number &&a, Number &&b) -> Number
Binary xor of two numbers.
friend auto operator^=(Number &a, Number const &b) -> Number &
In place binary xor the given number.
friend auto operator%(Number const &a, Number &&b) -> Number
Modulo of two numbers.
auto as_string() const -> std::string
Convert the number into a string.
friend auto operator^=(Number &a, Number &&b) -> Number &
In place binary xor the given number.
friend auto operator-(Number const &a, Number &&b) -> Number
Subtract two numbers.
friend auto operator^(Number const &a, Number const &b) -> Number
Binary xor of two numbers.
friend auto operator-(Number &&a, Number &&b) -> Number
Subtract two numbers.
friend auto operator&=(Number &a, Number const &b) -> Number &
In place binary and the given number.
friend auto operator/=(Number &a, Number const &b) -> Number &
In place divide the given number.
friend auto operator/(Number &&a, Number &&b) -> Number
Divide two numbers.
friend auto operator|=(Number &a, Number &&b) -> Number &
In place binary or the given number.
friend auto operator^(Number const &a, Number &&b) -> Number
Binary xor of two numbers.
auto operator=(Number &&other) noexcept -> Number &
Move assign a number.
friend auto operator*(Number &&a, Number const &b) -> Number
Multiply two numbers.
friend auto operator-(Number const &a) -> Number
Negate the number.
friend auto operator==(Number const &a, int32_t b) -> bool
Equality compare two numbers.
Definition number.hh:74
friend auto operator&(Number &&a, Number &&b) -> Number
Binary and of the two numbers.
friend auto operator*(Number const &a, Number const &b) -> Number
Multiply two numbers.
friend auto operator%=(Number &a, Number const &b) -> Number &
In place modulo the given number.
friend auto operator|(Number const &a, Number &&b) -> Number
Binary or of two numbers.
friend auto operator/(Number const &a, Number const &b) -> Number
Divide two numbers.
friend auto operator<<(Util::OutputBuffer &out, Number const &num) -> Util::OutputBuffer &
Output the given number.
friend auto operator|(Number const &a, Number const &b) -> Number
Binary or of two numbers.
friend auto operator*=(Number &a, Number const &b) -> Number &
In place multiply the given number.
friend auto operator+(Number &&a, Number const &b) -> Number
Sum up two numbers.
friend auto operator%(Number &&a, Number const &b) -> Number
Modulo of two numbers.
friend auto operator|=(Number &a, Number const &b) -> Number &
In place binary or the given number.
friend auto operator*(Number &&a, Number &&b) -> Number
Multiply two numbers.
friend auto operator&(Number const &a, Number const &b) -> Number
Binary and of the two numbers.
void swap(Number &other) noexcept
Swap two numbers.
Number(std::string_view str, Base base=Base::dec)
Construct a number from a string.
~Number() noexcept
Destroy the number freeing associated memory.
friend auto operator+(Number const &a, Number const &b) -> Number
Sum up two numbers.
friend auto operator%(Number const &a, Number const &b) -> Number
Modulo of two numbers.
friend auto operator*(Number const &a, Number &&b) -> Number
Multiply two numbers.
friend auto get_sign(Number const &a) -> int
Get the sign of the given number.
friend auto operator&(Number &&a, Number const &b) -> Number
Binary and of the two numbers.
friend auto operator-(Number const &a, Number const &b) -> Number
Subtract two numbers.
friend auto compare(Number const &a, Number const &b) -> int
Compare to numbers returning a comparator.
friend auto operator/=(Number &a, Number &&b) -> Number &
In place divide the given number.
friend auto operator/(Number const &a, Number &&b) -> Number
Divide two numbers.
friend auto operator%(Number &&a, Number &&b) -> Number
Modulo of two numbers.
friend auto operator==(int32_t a, Number const &b) -> bool
Equality compare two numbers.
Definition number.hh:72
friend auto operator-(Number &&a) -> Number
Negate the number.
friend auto operator/(Number &&a, Number const &b) -> Number
Divide two numbers.
friend auto operator*=(Number &a, Number &&b) -> Number &
In place multiply the given number.
friend auto pow(Number &&a, Number &&b) -> Number
Exponentiation of two numbers.
Create an output buffer that bears some similarities with C++'s iostreams.
Definition print.hh:24
Base
The base of a number.
Definition number.hh:17
std::span< Number const > NumberSpan
A span of numbers.
Definition number.hh:285
@ oct
Octal base.
@ dec
Decimal base.
@ hex
Hexadecimal base.
@ bin
Binary base.