| 74 | } |
| 75 | |
| 76 | double constantDecodeAsDouble(const ConstantEncoded& enc) { |
| 77 | const uint8_t* ptr = enc.value_bytes.data(); |
| 78 | |
| 79 | auto load = [&]<typename T>(const T* /*tag*/) -> double { |
| 80 | T v{}; |
| 81 | std::memcpy(&v, ptr, sizeof(v)); |
| 82 | return static_cast<double>(v); |
| 83 | }; |
| 84 | |
| 85 | switch (enc.value_kind) { |
| 86 | case StorageKind::kFloat32: |
| 87 | return load(static_cast<const float*>(nullptr)); |
| 88 | case StorageKind::kFloat64: |
| 89 | return load(static_cast<const double*>(nullptr)); |
| 90 | case StorageKind::kInt32: |
| 91 | return load(static_cast<const int32_t*>(nullptr)); |
| 92 | case StorageKind::kInt64: |
| 93 | return load(static_cast<const int64_t*>(nullptr)); |
| 94 | case StorageKind::kUint64: |
| 95 | return load(static_cast<const uint64_t*>(nullptr)); |
| 96 | case StorageKind::kBool: |
| 97 | case StorageKind::kString: |
| 98 | break; |
| 99 | } |
| 100 | return 0.0; |
| 101 | } |
| 102 | |
| 103 | int64_t constantDecodeAsInt64(const ConstantEncoded& enc) { |
| 104 | const uint8_t* ptr = enc.value_bytes.data(); |