5#ifndef TABLEAU_HYPER_NUMERIC_HPP
6#define TABLEAU_HYPER_NUMERIC_HPP
12#include <hyperapi/hyperapi.h>
14class BigNumeric_rawValue_Test;
15class Numeric_rawValue_Test;
20struct hash<hyper_data128_t> {
23 return hash<uint64_t>()(n.data[0]) ^ hash<uint64_t>()(n.data[1]);
29template <
unsigned precision_value,
unsigned scale_value>
32template <
typename ReturnType>
35template <
unsigned p,
unsigned s>
36typename Numeric<p, s>::data_t numericInternalRepresentation(
const Numeric<p, s>& numeric)
noexcept;
39inline bool operator==(
const hyper_data128_t& a,
const hyper_data128_t& b)
noexcept {
return (a.data[0] == b.data[0]) && (a.data[1] == b.data[1]); }
41inline bool operator>(
const hyper_data128_t& a,
const hyper_data128_t& b)
noexcept {
42 if (a.data[1] != b.data[1])
return (
static_cast<int64_t
>(a.data[1]) >
static_cast<int64_t
>(b.data[1]));
43 if (a.data[0] != b.data[0])
return (a.data[0] > b.data[0]);
50template <
unsigned precision_value,
unsigned scale_value>
53 static constexpr unsigned precision = precision_value;
54 static constexpr unsigned scale = scale_value;
55 static_assert(precision >= scale,
"The precision of a numeric must be greater or equal than the scale");
56 static_assert(precision <= 38,
"Precision must be at most 38");
58 using data_t =
typename std::conditional<precision <= 18, int64_t, hyper_data128_t>::type;
125 template <
unsigned otherPrecision,
unsigned otherScale>
204 friend class ::Numeric_rawValue_Test;
205 friend class ::BigNumeric_rawValue_Test;
206 template <
unsigned otherPrecision,
unsigned otherScale>
209 template <
typename ReturnType>
210 friend struct internal::ValueAccess;
211 friend struct internal::ValueInserter;
212 template <
typename T>
213 friend struct std::hash;
214 friend typename Numeric<precision, scale>::data_t internal::numericInternalRepresentation(
const Numeric<precision, scale>& numeric)
noexcept;
223 explicit Numeric(data_t rawNumeric, raw_t) noexcept
224 : value_(rawNumeric) {
235 explicit Numeric(int64_t rawNumeric,
unsigned otherPrecision,
unsigned otherScale, raw_t);
245 explicit Numeric(hyper_data128_t rawNumeric,
unsigned otherPrecision,
unsigned otherScale, raw_t);
256template <
unsigned p,
unsigned s>
260 return std::hash<typename hyperapi::Numeric<p, s>::data_t>()(n.value_);
265#include <hyperapi/impl/Numeric.impl.hpp>
A fixed-point numeric data value with scale fraction digits and precision digits overall.
float floatValue() const noexcept
Gets a float representation of this value; may lose accuracy.
friend std::ostream & operator<<(std::ostream &os, const Numeric &obj)
Stream output operator.
std::string toString() const
Gets a string representation for debugging.
friend bool operator<(const Numeric &a, const Numeric &b) noexcept
Less than operator.
int64_t intValue() const
Gets an integer representation of this value; if the value has fraction digits, these will be truncat...
Numeric(short value)
Creates a numeric value from an integer.
Numeric(unsigned short value)
Creates a numeric value from an integer.
friend bool operator==(const Numeric &a, const Numeric &b) noexcept
Equality operator.
friend bool operator>(const Numeric &a, const Numeric &b) noexcept
Greater operator.
Numeric(unsigned long long value)
Creates a numeric value from an integer.
Numeric(hyperapi::Numeric< otherPrecision, otherScale > other)
Creates a numeric value from another numeric value with different precision and scale.
Numeric(unsigned value)
Creates a numeric value from an integer.
Numeric() noexcept
Default constructor.
friend bool operator<=(const Numeric &a, const Numeric &b) noexcept
Less than or equal operator.
friend bool operator!=(const Numeric &a, const Numeric &b) noexcept
Not equal operator.
Numeric(unsigned long value)
Creates a numeric value from an integer.
Numeric(hyperapi::string_view value)
Creates a numeric value from a string representation.
Numeric(long value)
Creates a numeric value from an integer.
friend bool operator>=(const Numeric &a, const Numeric &b) noexcept
Greater or equal operator.
double doubleValue() const noexcept
Gets a double representation of this value; may lose accuracy.
Numeric(long long value)
Creates a numeric value from an integer.
std::string stringValue() const
Gets an exact string representation, which is round-trip compatible with the constructor,...
Numeric(long double value)
Creates a numeric value from a double; may lose accuracy.
Numeric(int value)
Creates a numeric value from an integer.
Numeric(float value)
Creates a numeric value from a float; may lose accuracy.
Numeric(double value)
Creates a numeric value from a double; may lose accuracy.
Describes an object that can refer to a constant, contiguous sequence of char-like objects.
The primary namespace of the Hyper API for C++.
bool operator==(const DatabaseName &a, const DatabaseName &b) noexcept
Equality operator.
bool operator>(const DatabaseName &a, const DatabaseName &b) noexcept
Greater operator.
size_t operator()(hyper_data128_t n) const noexcept
Calculates the hash value of the given hyper_data128_t.
size_t operator()(hyperapi::Numeric< p, s > n) const noexcept
Calculates the hash value of the given numeric.