15#ifndef ACTIONENGINE_MSGPACK_FLOAT_H 
   16#define ACTIONENGINE_MSGPACK_FLOAT_H 
   20#include "actionengine/msgpack/core_helpers.h" 
   21#include "actionengine/msgpack/int.h" 
   23namespace act::msgpack {
 
   25inline absl::StatusOr<uint32_t> EgltMsgpackGetExtent(
const LookupPointer& data,
 
   26                                                     float32_t* absl_nullable) {
 
   27  const auto [pos, end, _] = data;
 
   28  if (*pos == FormatSignature::kFloat32) {
 
   30      return GetInsufficientDataError(data, 
"float32_t");
 
   35  if (
const auto int64_extent = GetExtent<int64_t>(pos, end);
 
   40  if (
const auto uint64_extent = GetExtent<uint64_t>(pos, end);
 
   45  return GetInvalidFormatSignatureError(pos, 
"float32_t", data.begin);
 
   48inline absl::Status EgltMsgpackSerialize(float32_t value,
 
   49                                         const InsertInfo& insert) {
 
   50  if constexpr (!std::numeric_limits<float32_t>::is_iec559) {
 
   51    return SerializeNonIec559Float32(value, insert);
 
   53  auto result = ToBigEndianBytes<float32_t>(value, 1);
 
   54  result[0] = FormatSignature::kFloat32;
 
   55  insert.bytes->insert(insert.at, result.begin(), result.end());
 
   56  return absl::OkStatus();
 
   59inline absl::StatusOr<uint32_t> EgltMsgpackDeserialize(
 
   60    const LookupPointer& data, float32_t* absl_nonnull output) {
 
   61  const auto [pos, end, _] = data;
 
   62  if (*pos == FormatSignature::kFloat32) {
 
   64      return GetInsufficientDataError(data, 
"float32_t");
 
   66    *output = FromBigEndianBytes<float32_t>(pos + 1);
 
   70  if (*pos == FormatSignature::kFloat64) {
 
   72      return GetInsufficientDataError(data, 
"float32_t");
 
   74    *output = 
static_cast<float32_t
>(FromBigEndianBytes<float64_t>(pos + 1));
 
   78  if (
auto deserialized = Deserialize<int64_t>(data); deserialized.ok()) {
 
   79    *output = 
static_cast<float32_t
>(deserialized->value);
 
   80    return deserialized->extent;
 
   83  if (
auto deserialized = Deserialize<uint64_t>(data); deserialized.ok()) {
 
   84    *output = 
static_cast<float32_t
>(deserialized->value);
 
   85    return deserialized->extent;
 
   88  return GetInvalidFormatSignatureError(pos, 
"float32_t", data.begin);
 
   91inline absl::StatusOr<uint32_t> EgltMsgpackGetExtent(
const LookupPointer& data,
 
   92                                                     float64_t* absl_nullable) {
 
   93  const auto [pos, end, _] = data;
 
   94  if (*pos == FormatSignature::kFloat64) {
 
   96      return GetInsufficientDataError(data, 
"float64_t");
 
  101  if (
const auto float32_extent = GetExtent<float32_t>(pos, end);
 
  102      float32_extent.ok()) {
 
  103    return float32_extent;
 
  106  if (
const auto int64_extent = GetExtent<int64_t>(pos, end);
 
  111  if (
const auto uint64_extent = GetExtent<uint64_t>(pos, end);
 
  112      uint64_extent.ok()) {
 
  113    return uint64_extent;
 
  116  return GetInvalidFormatSignatureError(pos, 
"float64_t", data.begin);
 
  119inline absl::Status EgltMsgpackSerialize(float64_t value,
 
  120                                         const InsertInfo& insert) {
 
  121  if constexpr (!std::numeric_limits<float64_t>::is_iec559) {
 
  122    return SerializeNonIec559Float64(value, insert);
 
  124  auto result = ToBigEndianBytes<float64_t>(value, 1);
 
  125  result[0] = FormatSignature::kFloat64;
 
  126  insert.bytes->insert(insert.at, result.begin(), result.end());
 
  127  return absl::OkStatus();
 
  130inline absl::StatusOr<uint32_t> EgltMsgpackDeserialize(
 
  131    const LookupPointer& data, float64_t* absl_nonnull output) {
 
  132  const auto [pos, end, _] = data;
 
  133  if (*pos == FormatSignature::kFloat64) {
 
  135      return GetInsufficientDataError(data, 
"float64_t");
 
  137    *output = FromBigEndianBytes<float64_t>(pos + 1);
 
  141  if (*pos == FormatSignature::kFloat32) {
 
  143      return GetInsufficientDataError(data, 
"float64_t");
 
  145    *output = 
static_cast<float64_t
>(FromBigEndianBytes<float32_t>(pos + 1));
 
  149  if (
auto deserialized = Deserialize<int64_t>(data); deserialized.ok()) {
 
  150    *output = 
static_cast<float64_t
>(deserialized->value);
 
  151    return deserialized->extent;
 
  154  if (
auto deserialized = Deserialize<uint64_t>(data); deserialized.ok()) {
 
  155    *output = 
static_cast<float64_t
>(deserialized->value);
 
  156    return deserialized->extent;
 
  159  return GetInvalidFormatSignatureError(pos, 
"float64_t", data.begin);