15#ifndef ACTIONENGINE_MSGPACK_INT_H 
   16#define ACTIONENGINE_MSGPACK_INT_H 
   18#include "actionengine/msgpack/core_helpers.h" 
   20namespace act::msgpack {
 
   22inline absl::StatusOr<uint32_t> EgltMsgpackGetExtent(
const LookupPointer& data,
 
   23                                                     uint8_t* absl_nullable) {
 
   24  const auto [pos, end, _] = data;
 
   25  if (*pos == FormatSignature::kUInt8) {
 
   27      return GetInsufficientDataError(data, 
"uint8_t");
 
   33    return GetInvalidFormatSignatureError(pos, 
"uint8_t", data.begin);
 
   39inline absl::Status EgltMsgpackSerialize(uint8_t value,
 
   40                                         const InsertInfo& insert) {
 
   42    insert.bytes->insert(insert.at, value);
 
   43    return absl::OkStatus();
 
   45  insert.bytes->insert(insert.at, {FormatSignature::kUInt8, value});
 
   46  return absl::OkStatus();
 
   49inline absl::StatusOr<uint32_t> EgltMsgpackDeserialize(
 
   50    const LookupPointer& data, uint8_t* absl_nonnull output) {
 
   51  const auto [pos, end, _] = data;
 
   57  if (*pos == FormatSignature::kUInt8) {
 
   59      return GetInsufficientDataError(data, 
"uint8_t");
 
   61    *output = 
static_cast<uint8_t
>(*(pos + 1));
 
   65  return GetInvalidFormatSignatureError(pos, 
"uint8_t", data.begin);
 
   68inline absl::StatusOr<uint32_t> EgltMsgpackGetExtent(
const LookupPointer& data,
 
   69                                                     int8_t* absl_nullable) {
 
   70  const auto [pos, end, _] = data;
 
   71  if (*pos == FormatSignature::kInt8) {
 
   73      return GetInsufficientDataError(data, 
"int8_t");
 
   78  if (*pos <= 0x7f || *pos >= FormatSignature::kNegativeFixint) {
 
   82  return GetInvalidFormatSignatureError(pos, 
"int8_t", data.begin);
 
   85inline absl::Status EgltMsgpackSerialize(int8_t value,
 
   86                                         const InsertInfo& insert) {
 
   87  if (value >= 0 && value <= 0x7f) {
 
   88    insert.bytes->insert(insert.at, 
static_cast<Byte
>(value));
 
   89    return absl::OkStatus();
 
   91  if (value < 0 && value >= -32) {
 
   94        static_cast<Byte
>(FormatSignature::kNegativeFixint | (32 + value)));
 
   95    return absl::OkStatus();
 
   98  insert.bytes->insert(insert.at,
 
   99                       {FormatSignature::kInt8, static_cast<Byte>(value)});
 
  100  return absl::OkStatus();
 
  103inline absl::StatusOr<uint32_t> EgltMsgpackDeserialize(
 
  104    const LookupPointer& data, int8_t* absl_nonnull output) {
 
  105  const auto [pos, end, _] = data;
 
  107    *output = 
static_cast<int8_t
>(*pos);
 
  111  if (*pos >= FormatSignature::kNegativeFixint) {
 
  112    *output = 
static_cast<int8_t
>(-32 + (*pos & 0x1F));
 
  116  if (*pos == FormatSignature::kInt8) {
 
  118      return GetInsufficientDataError(data, 
"int8_t");
 
  120    *output = 
static_cast<int8_t
>(*(pos + 1));
 
  124  return GetInvalidFormatSignatureError(pos, 
"int8_t", data.begin);
 
  127inline absl::StatusOr<uint32_t> EgltMsgpackGetExtent(
const LookupPointer& data,
 
  128                                                     uint16_t* absl_nullable) {
 
  129  const auto [pos, end, _] = data;
 
  130  if (*pos == FormatSignature::kUInt16) {
 
  132      return GetInsufficientDataError(data, 
"uint16_t");
 
  137  if (
const auto uint8_extent = GetExtent<uint8_t>(pos, end);
 
  142  return GetInvalidFormatSignatureError(pos, 
"uint16_t", data.begin);
 
  145inline absl::Status EgltMsgpackSerialize(uint16_t value,
 
  146                                         const InsertInfo& insert) {
 
  148    insert.bytes->insert(insert.at, 
static_cast<Byte
>(value));
 
  149    return absl::OkStatus();
 
  152    insert.bytes->insert(insert.at,
 
  153                         {FormatSignature::kUInt8, static_cast<Byte>(value)});
 
  154    return absl::OkStatus();
 
  156  auto result = ToBigEndianBytes<uint16_t>(value, 1);
 
  157  result[0] = FormatSignature::kUInt16;
 
  158  insert.bytes->insert(insert.at, result.begin(), result.end());
 
  159  return absl::OkStatus();
 
  162inline absl::StatusOr<uint32_t> EgltMsgpackDeserialize(
 
  163    const LookupPointer& data, uint16_t* absl_nonnull output) {
 
  164  const auto [pos, end, _] = data;
 
  165  if (
auto deserialized = Deserialize<uint8_t>(data); deserialized.ok()) {
 
  166    *output = deserialized->value;
 
  167    return deserialized->extent;
 
  170  if (
auto deserialized = Deserialize<int8_t>(data); deserialized.ok()) {
 
  171    if (deserialized->value < 0) {
 
  172      return absl::InvalidArgumentError(
 
  173          "Expected a uint16_t value, but found a negative int8_t value.");
 
  175    *output = 
static_cast<uint16_t
>(deserialized->value);
 
  176    return deserialized->extent;
 
  179  if (*pos == FormatSignature::kUInt16) {
 
  181      return GetInsufficientDataError(data, 
"uint16_t");
 
  183    *output = FromBigEndianBytes<uint16_t>(pos + 1);
 
  187  return GetInvalidFormatSignatureError(pos, 
"uint16_t", data.begin);
 
  190inline absl::StatusOr<uint32_t> EgltMsgpackGetExtent(
const LookupPointer& data,
 
  191                                                     int16_t* absl_nullable) {
 
  192  const auto [pos, end, _] = data;
 
  193  if (*pos == FormatSignature::kInt16) {
 
  195      return GetInsufficientDataError(data, 
"int16_t");
 
  200  if (
const auto uint8_extent = GetExtent<uint8_t>(pos, end);
 
  205  if (
const auto int8_extent = GetExtent<int8_t>(pos, end); int8_extent.ok()) {
 
  209  return GetInvalidFormatSignatureError(pos, 
"int16_t", data.begin);
 
  212inline absl::Status EgltMsgpackSerialize(int16_t value,
 
  213                                         const InsertInfo& insert) {
 
  214  if (value >= -128 && value <= 127) {
 
  215    return Serialize<int8_t>(
static_cast<int8_t
>(value), insert);
 
  217  if (value >= 128 && value <= 255) {
 
  218    return Serialize<uint8_t>(
static_cast<uint8_t
>(value), insert);
 
  220  auto result = ToBigEndianBytes<int16_t>(value, 1);
 
  221  result[0] = FormatSignature::kInt16;
 
  222  insert.bytes->insert(insert.at, result.begin(), result.end());
 
  223  return absl::OkStatus();
 
  226inline absl::StatusOr<uint32_t> EgltMsgpackDeserialize(
 
  227    const LookupPointer& data, int16_t* absl_nonnull output) {
 
  228  const auto [pos, end, _] = data;
 
  229  if (
auto deserialized = Deserialize<uint8_t>(data); deserialized.ok()) {
 
  230    *output = 
static_cast<int16_t
>(deserialized->value);
 
  231    return deserialized->extent;
 
  234  if (
auto deserialized = Deserialize<int8_t>(data); deserialized.ok()) {
 
  235    *output = 
static_cast<int16_t
>(deserialized->value);
 
  236    return deserialized->extent;
 
  239  if (*pos == FormatSignature::kInt16) {
 
  241      return GetInsufficientDataError(data, 
"int16_t");
 
  243    *output = FromBigEndianBytes<int16_t>(pos + 1);
 
  247  return GetInvalidFormatSignatureError(pos, 
"int16_t", data.begin);
 
  250inline absl::StatusOr<uint32_t> EgltMsgpackGetExtent(
const LookupPointer& data,
 
  251                                                     uint32_t* absl_nullable) {
 
  252  const auto [pos, end, _] = data;
 
  253  if (*pos == FormatSignature::kUInt32) {
 
  255      return GetInsufficientDataError(data, 
"uint32_t");
 
  260  if (
const auto uint16_extent = GetExtent<uint16_t>(pos, end);
 
  261      uint16_extent.ok()) {
 
  262    return uint16_extent;
 
  265  return GetInvalidFormatSignatureError(pos, 
"uint32_t", data.begin);
 
  268inline absl::Status EgltMsgpackSerialize(uint32_t value,
 
  269                                         const InsertInfo& insert) {
 
  270  if (value <= 0xffff) {
 
  271    return Serialize<uint16_t>(
static_cast<uint16_t
>(value), insert);
 
  273  auto result = ToBigEndianBytes<uint32_t>(value, 1);
 
  274  result[0] = FormatSignature::kUInt32;
 
  275  insert.bytes->insert(insert.at, result.begin(), result.end());
 
  276  return absl::OkStatus();
 
  279inline absl::StatusOr<uint32_t> EgltMsgpackDeserialize(
 
  280    const LookupPointer& data, uint32_t* absl_nonnull output) {
 
  281  const auto [pos, end, _] = data;
 
  282  if (
auto deserialized = Deserialize<uint16_t>(data); deserialized.ok()) {
 
  283    *output = 
static_cast<uint32_t
>(deserialized->value);
 
  284    return deserialized->extent;
 
  287  if (
auto deserialized = Deserialize<int16_t>(data); deserialized.ok()) {
 
  288    if (deserialized->value < 0) {
 
  289      return absl::InvalidArgumentError(
 
  290          "Expected a uint32_t value, but found a negative int16_t value.");
 
  292    *output = 
static_cast<uint32_t
>(deserialized->value);
 
  293    return deserialized->extent;
 
  296  if (*pos == FormatSignature::kUInt32) {
 
  298      return GetInsufficientDataError(data, 
"uint32_t");
 
  300    *output = FromBigEndianBytes<uint32_t>(pos + 1);
 
  304  return GetInvalidFormatSignatureError(pos, 
"uint32_t", data.begin);
 
  307inline absl::StatusOr<uint32_t> EgltMsgpackGetExtent(
const LookupPointer& data,
 
  308                                                     int32_t* absl_nullable) {
 
  309  const auto [pos, end, _] = data;
 
  310  if (*pos == FormatSignature::kInt32) {
 
  312      return GetInsufficientDataError(data, 
"int32_t");
 
  317  if (
const auto uint16_extent = GetExtent<uint16_t>(pos, end);
 
  318      uint16_extent.ok()) {
 
  319    return uint16_extent;
 
  322  if (
const auto int16_extent = GetExtent<int16_t>(pos, end);
 
  327  return GetInvalidFormatSignatureError(pos, 
"int32_t", data.begin);
 
  330inline absl::Status EgltMsgpackSerialize(int32_t value,
 
  331                                         const InsertInfo& insert) {
 
  332  if (value >= -32768 && value <= 32767) {
 
  333    return Serialize<int16_t>(
static_cast<int16_t
>(value), insert);
 
  335  if (value >= 0 && value <= 0xFFFF) {
 
  336    return Serialize<uint16_t>(
static_cast<uint16_t
>(value), insert);
 
  338  auto result = ToBigEndianBytes<int32_t>(value, 1);
 
  339  result[0] = FormatSignature::kInt32;
 
  340  insert.bytes->insert(insert.at, result.begin(), result.end());
 
  341  return absl::OkStatus();
 
  344inline absl::StatusOr<uint32_t> EgltMsgpackDeserialize(
 
  345    const LookupPointer& data, int32_t* absl_nonnull output) {
 
  346  const auto [pos, end, _] = data;
 
  348  if (
auto deserialized = Deserialize<uint16_t>(data); deserialized.ok()) {
 
  349    *output = 
static_cast<int32_t
>(deserialized->value);
 
  350    return deserialized->extent;
 
  353  if (
auto deserialized = Deserialize<int16_t>(data); deserialized.ok()) {
 
  354    *output = 
static_cast<int32_t
>(deserialized->value);
 
  355    return deserialized->extent;
 
  358  if (*pos == FormatSignature::kInt32) {
 
  360      return GetInsufficientDataError(data, 
"int32_t");
 
  362    *output = FromBigEndianBytes<int32_t>(pos + 1);
 
  366  return GetInvalidFormatSignatureError(pos, 
"int32_t", data.begin);
 
  369inline absl::StatusOr<uint32_t> EgltMsgpackGetExtent(
const LookupPointer& data,
 
  370                                                     uint64_t* absl_nullable) {
 
  371  const auto [pos, end, _] = data;
 
  372  if (*pos == FormatSignature::kUInt64) {
 
  374      return GetInsufficientDataError(data, 
"uint64_t");
 
  379  if (
const auto uint32_extent = GetExtent<uint32_t>(pos, end);
 
  380      uint32_extent.ok()) {
 
  381    return uint32_extent;
 
  384  return GetInvalidFormatSignatureError(pos, 
"uint64_t", data.begin);
 
  387inline absl::Status EgltMsgpackSerialize(uint64_t value,
 
  388                                         const InsertInfo& insert) {
 
  389  if (value <= 0xFFFFFFFF) {
 
  390    return Serialize<uint32_t>(
static_cast<uint32_t
>(value), insert);
 
  392  auto result = ToBigEndianBytes<uint64_t>(value, 1);
 
  393  result[0] = FormatSignature::kUInt64;
 
  394  insert.bytes->insert(insert.at, result.begin(), result.end());
 
  395  return absl::OkStatus();
 
  398inline absl::StatusOr<uint32_t> EgltMsgpackDeserialize(
 
  399    const LookupPointer& data, uint64_t* absl_nonnull output) {
 
  400  const auto [pos, end, _] = data;
 
  401  if (
auto deserialized = Deserialize<uint32_t>(data); deserialized.ok()) {
 
  402    *output = 
static_cast<uint64_t
>(deserialized->value);
 
  403    return deserialized->extent;
 
  406  if (
auto deserialized = Deserialize<int32_t>(data); deserialized.ok()) {
 
  407    if (deserialized->value < 0) {
 
  408      return absl::InvalidArgumentError(
 
  409          "Expected a uint64_t value, but found a negative int32_t value.");
 
  411    *output = 
static_cast<uint64_t
>(deserialized->value);
 
  412    return deserialized->extent;
 
  415  if (*pos == FormatSignature::kUInt64) {
 
  417      return GetInsufficientDataError(data, 
"uint64_t");
 
  419    *output = FromBigEndianBytes<uint64_t>(pos + 1);
 
  423  return GetInvalidFormatSignatureError(pos, 
"uint64_t", data.begin);
 
  426inline absl::StatusOr<uint32_t> EgltMsgpackGetExtent(
const LookupPointer& data,
 
  427                                                     int64_t* absl_nullable) {
 
  428  const auto [pos, end, _] = data;
 
  429  if (*pos == FormatSignature::kInt64) {
 
  431      return GetInsufficientDataError(data, 
"int64_t");
 
  436  if (
const auto uint32_extent = GetExtent<uint32_t>(pos, end);
 
  437      uint32_extent.ok()) {
 
  438    return uint32_extent;
 
  441  if (
const auto int32_extent = GetExtent<int32_t>(pos, end);
 
  446  return GetInvalidFormatSignatureError(pos, 
"int64_t", data.begin);
 
  449inline absl::Status EgltMsgpackSerialize(int64_t value,
 
  450                                         const InsertInfo& insert) {
 
  451  if (value >= -2147483648 && value <= 2147483647) {
 
  452    return Serialize<int32_t>(
static_cast<int32_t
>(value), insert);
 
  454  if (value >= 0 && value <= 0xFFFFFFFF) {
 
  455    return Serialize<uint32_t>(
static_cast<uint32_t
>(value), insert);
 
  457  auto result = ToBigEndianBytes<int64_t>(value, 1);
 
  458  result[0] = FormatSignature::kInt64;
 
  459  insert.bytes->insert(insert.at, result.begin(), result.end());
 
  460  return absl::OkStatus();
 
  463inline absl::StatusOr<uint32_t> EgltMsgpackDeserialize(
 
  464    const LookupPointer& data, int64_t* absl_nonnull output) {
 
  465  const auto [pos, end, _] = data;
 
  466  if (
auto deserialized = Deserialize<uint32_t>(data); deserialized.ok()) {
 
  467    *output = 
static_cast<int64_t
>(deserialized->value);
 
  468    return deserialized->extent;
 
  471  if (
auto deserialized = Deserialize<int32_t>(data); deserialized.ok()) {
 
  472    *output = 
static_cast<int64_t
>(deserialized->value);
 
  473    return deserialized->extent;
 
  476  if (*pos == FormatSignature::kInt64) {
 
  478      return GetInsufficientDataError(data, 
"int64_t");
 
  480    *output = FromBigEndianBytes<int64_t>(pos + 1);
 
  484  return GetInvalidFormatSignatureError(pos, 
"int64_t", data.begin);