20#include "big_integer.h"
38 big_decimal() =
default;
52 big_decimal(
const std::int8_t *mag, std::int32_t len, std::int16_t scale, std::int8_t sign,
bool big_endian =
true)
53 : m_scale(std::int16_t(scale & 0x7FFF))
54 , m_magnitude(mag, len, sign, big_endian) {}
62 big_decimal(
const std::byte *data, std::size_t size);
140 [[nodiscard]] std::size_t
byte_size() const noexcept;
155 [[nodiscard]] std::vector<std::
byte>
to_bytes()
const {
156 std::vector<std::byte> bytes(
byte_size());
164 explicit operator double()
const {
return to_double(); }
169 explicit operator int64_t()
const {
return to_int64(); }
177 std::stringstream stream;
192 return m_magnitude.to_int64();
195 big_decimal zero_scaled;
199 return zero_scaled.m_magnitude.
to_int64();
207 [[nodiscard]] std::int16_t
get_scale() const noexcept {
return m_scale; }
223 [[nodiscard]] std::int32_t
get_precision() const noexcept {
return m_magnitude.get_precision(); }
237 friend void swap(big_decimal &lhs, big_decimal &rhs) {
240 swap(lhs.m_scale, rhs.m_scale);
241 swap(lhs.m_magnitude, rhs.m_magnitude);
258 std::stringstream converter;
260 converter.write(val, len);
271 m_magnitude.assign_int64(val);
282 std::stringstream converter;
284 converter.precision(16);
296 m_magnitude.assign_uint64(val);
352 [[nodiscard]]
bool is_negative() const noexcept {
return m_magnitude.is_negative(); }
359 [[nodiscard]]
bool is_zero() const noexcept {
return m_magnitude.is_zero(); }
366 [[nodiscard]]
bool is_positive() const noexcept {
return m_magnitude.is_positive(); }
388 std::int16_t m_scale = 0;
401inline bool operator==(
const big_decimal &lhs,
const big_decimal &rhs)
noexcept {
402 return lhs.compare(rhs) == 0;
413 return lhs.compare(rhs) != 0;
424 return lhs.compare(rhs) < 0;
435 return lhs.compare(rhs) <= 0;
446 return lhs.compare(rhs) > 0;
457 return lhs.compare(rhs) >= 0;
Definition big_decimal.h:35
std::vector< std::byte > to_bytes() const
Definition big_decimal.h:155
void add(const big_decimal &other, big_decimal &res) const
Definition big_decimal.cpp:161
big_decimal(big_integer &&val, int16_t scale)
Definition big_decimal.h:98
friend std::istream & operator>>(std::istream &is, big_decimal &val)
Definition big_decimal.cpp:112
void assign_double(double val)
Definition big_decimal.h:281
friend void swap(big_decimal &lhs, big_decimal &rhs)
Definition big_decimal.h:237
std::int32_t get_precision() const noexcept
Definition big_decimal.h:223
big_decimal(const big_integer &val, int16_t scale)
Definition big_decimal.h:88
bool is_positive() const noexcept
Definition big_decimal.h:366
double to_double() const
Definition big_decimal.h:176
void set_scale(std::int16_t new_scale, big_decimal &res) const
Definition big_decimal.cpp:43
bool is_zero() const noexcept
Definition big_decimal.h:359
big_decimal(const char *val, int32_t len)
Definition big_decimal.h:108
big_decimal(int64_t val)
Definition big_decimal.h:69
big_decimal(const std::int8_t *mag, std::int32_t len, std::int16_t scale, std::int8_t sign, bool big_endian=true)
Definition big_decimal.h:52
void assign_int64(int64_t val)
Definition big_decimal.h:270
void multiply(const big_decimal &other, big_decimal &res) const
Definition big_decimal.cpp:186
void divide(const big_decimal &other, big_decimal &res) const
Definition big_decimal.cpp:191
void assign_uint64(uint64_t val)
Definition big_decimal.h:295
big_decimal(const std::string &val)
Definition big_decimal.h:118
void assign_string(const std::string &val)
Definition big_decimal.h:249
bool is_negative() const noexcept
Definition big_decimal.h:352
std::int16_t get_scale() const noexcept
Definition big_decimal.h:207
std::size_t byte_size() const noexcept
Definition big_decimal.cpp:25
const big_integer & get_unscaled_value() const noexcept
Definition big_decimal.h:230
void negate()
Definition big_decimal.h:336
static big_decimal from_double(double val)
Definition big_decimal.h:129
big_decimal(int64_t val, int16_t scale)
Definition big_decimal.h:78
void store_bytes(std::byte *data) const
Definition big_decimal.cpp:29
int compare(const big_decimal &other) const
Definition big_decimal.cpp:64
int64_t to_int64() const
Definition big_decimal.h:190
friend std::ostream & operator<<(std::ostream &os, const big_decimal &val)
Definition big_decimal.cpp:85
void assign_string(const char *val, int32_t len)
Definition big_decimal.h:257
void subtract(const big_decimal &other, big_decimal &res) const
Definition big_decimal.cpp:174
Definition big_integer.h:37
std::int64_t to_int64() const
Definition big_integer.cpp:232