1#ifndef SOURCEMETA_CORE_NUMERIC_ZIGZAG_H_
2#define SOURCEMETA_CORE_NUMERIC_ZIGZAG_H_
4#include <sourcemeta/core/numeric_decimal.h>
10namespace sourcemeta::core {
16 if constexpr (std::same_as<T, Decimal>) {
17 assert(value.is_integral());
21 const Decimal absolute{value.is_signed() ? -value : value};
24 const auto signed_value{
static_cast<std::int64_t
>(value)};
25 if (signed_value >= 0) {
26 return static_cast<std::uint64_t
>(signed_value) * 2;
29 return (
static_cast<std::uint64_t
>(0) -
30 static_cast<std::uint64_t
>(signed_value)) *
39 if constexpr (std::same_as<T, Decimal>) {
40 assert(value.is_integral());
43 return value.divide_integer(
Decimal{2});
47 const auto unsigned_value{
static_cast<std::uint64_t
>(value)};
48 if (unsigned_value % 2 == 0) {
49 return static_cast<std::int64_t
>(unsigned_value / 2);
53 return static_cast<std::int64_t
>(~(unsigned_value / 2));
auto zigzag_decode(const T &value)
Definition numeric_zigzag.h:38
auto zigzag_encode(const T &value)
Definition numeric_zigzag.h:15