1#pragma once
2
3#include "duckdb/common/winapi.hpp"
4#include "duckdb/common/string.hpp"
5#include <stdint.h>
6
7namespace duckdb {
8
9struct hugeint_t {
10public:
11 uint64_t lower;
12 int64_t upper;
13
14public:
15 hugeint_t() = default;
16 DUCKDB_API hugeint_t(int64_t value); // NOLINT: Allow implicit conversion from `int64_t`
17 constexpr hugeint_t(int64_t upper, uint64_t lower) : lower(lower), upper(upper) {
18 }
19 constexpr hugeint_t(const hugeint_t &rhs) = default;
20 constexpr hugeint_t(hugeint_t &&rhs) = default;
21 hugeint_t &operator=(const hugeint_t &rhs) = default;
22 hugeint_t &operator=(hugeint_t &&rhs) = default;
23
24 DUCKDB_API string ToString() const;
25
26 // comparison operators
27 DUCKDB_API bool operator==(const hugeint_t &rhs) const;
28 DUCKDB_API bool operator!=(const hugeint_t &rhs) const;
29 DUCKDB_API bool operator<=(const hugeint_t &rhs) const;
30 DUCKDB_API bool operator<(const hugeint_t &rhs) const;
31 DUCKDB_API bool operator>(const hugeint_t &rhs) const;
32 DUCKDB_API bool operator>=(const hugeint_t &rhs) const;
33
34 // arithmetic operators
35 DUCKDB_API hugeint_t operator+(const hugeint_t &rhs) const;
36 DUCKDB_API hugeint_t operator-(const hugeint_t &rhs) const;
37 DUCKDB_API hugeint_t operator*(const hugeint_t &rhs) const;
38 DUCKDB_API hugeint_t operator/(const hugeint_t &rhs) const;
39 DUCKDB_API hugeint_t operator%(const hugeint_t &rhs) const;
40 DUCKDB_API hugeint_t operator-() const;
41
42 // bitwise operators
43 DUCKDB_API hugeint_t operator>>(const hugeint_t &rhs) const;
44 DUCKDB_API hugeint_t operator<<(const hugeint_t &rhs) const;
45 DUCKDB_API hugeint_t operator&(const hugeint_t &rhs) const;
46 DUCKDB_API hugeint_t operator|(const hugeint_t &rhs) const;
47 DUCKDB_API hugeint_t operator^(const hugeint_t &rhs) const;
48 DUCKDB_API hugeint_t operator~() const;
49
50 // in-place operators
51 DUCKDB_API hugeint_t &operator+=(const hugeint_t &rhs);
52 DUCKDB_API hugeint_t &operator-=(const hugeint_t &rhs);
53 DUCKDB_API hugeint_t &operator*=(const hugeint_t &rhs);
54 DUCKDB_API hugeint_t &operator/=(const hugeint_t &rhs);
55 DUCKDB_API hugeint_t &operator%=(const hugeint_t &rhs);
56 DUCKDB_API hugeint_t &operator>>=(const hugeint_t &rhs);
57 DUCKDB_API hugeint_t &operator<<=(const hugeint_t &rhs);
58 DUCKDB_API hugeint_t &operator&=(const hugeint_t &rhs);
59 DUCKDB_API hugeint_t &operator|=(const hugeint_t &rhs);
60 DUCKDB_API hugeint_t &operator^=(const hugeint_t &rhs);
61};
62
63} // namespace duckdb
64