3#include "fastmm/core/config_macros.hpp"
4#include "fastmm/core/fixed_string.hpp"
5#include "fastmm/core/hex.hpp"
19template <class Tag, class Rep, Rep kInvalid = std::numeric_limits<Rep>::max()>
21 static_assert(std::is_integral_v<Rep>);
27 constexpr explicit
StrongId(Rep v) noexcept : value(v) {}
29 [[nodiscard]]
constexpr bool valid() const noexcept {
return value != kInvalid; }
30 [[nodiscard]]
constexpr Rep get() const noexcept {
return value; }
31 constexpr auto operator<=>(
const StrongId&)
const noexcept =
default;
44static_assert(std::is_trivially_copyable_v<InstrumentId>);
49inline constexpr std::uint32_t
kNullHandle = std::numeric_limits<std::uint32_t>::max();
54 constexpr Handle() noexcept = default;
55 constexpr explicit
Handle(std::uint32_t i) noexcept :
idx(i) {}
67 const std::uint64_t hi = hex8(
static_cast<std::uint32_t
>((
id.value >> 32) & 0xFFFF));
68 const std::uint64_t lo = hex8(
static_cast<std::uint32_t
>(
id.value));
71 const std::uint64_t head = std::uint64_t{
'f'} | (std::uint64_t{
'm'} << 8) | ((hi >> 32) << 16);
72 std::memcpy(dst, &head, 8);
73 std::memcpy(dst + 6, &lo, 8);
83[[nodiscard]]
inline std::optional<ClientOrderId>
decode_cl_ord_id(std::string_view s)
noexcept {
84 if (s.size() !=
kClOrdIdChars || s[0] !=
'f' || s[1] !=
'm')
return std::nullopt;
89 if (c >=
'0' && c <=
'9') {
90 d =
static_cast<unsigned>(c -
'0');
91 }
else if (c >=
'a' && c <=
'f') {
92 d =
static_cast<unsigned>(c -
'a') + 10U;
98 if (v == 0)
return std::nullopt;
103 std::uint32_t seq)
noexcept {
104 return ClientOrderId{(
static_cast<std::uint64_t
>(epoch) << 32) | seq};
107 return static_cast<std::uint16_t
>((
id.value >> 32) & 0xFFFF);
110 return static_cast<std::uint32_t
>(
id.value & 0xFFFF'FFFFULL);
115template <
class Tag,
class Rep, Rep I>
116struct std::hash<
fastmm::StrongId<Tag, Rep, I>> {
118 return std::hash<Rep>{}(
id.value);
Definition strategy.hpp:16
StrongId< struct ClientOrderTag, std::uint64_t, 0 > ClientOrderId
48-bit: session_epoch(16) << 32 | seq(32). 0 is never issued.
Definition strong_id.hpp:41
constexpr std::uint32_t kNullHandle
32-bit pool index handle.
Definition strong_id.hpp:51
constexpr ClientOrderId make_cl_ord_id(std::uint16_t epoch, std::uint32_t seq) noexcept
Definition strong_id.hpp:103
FixedString< 40 > VenueOrderId
Definition strong_id.hpp:42
constexpr std::size_t kClOrdIdChars
"fm" + 12 lowercase hex digits (48 bits) = 14 chars. Fits Binance (36) and Bybit (36).
Definition strong_id.hpp:63
constexpr std::uint32_t cl_ord_id_seq(ClientOrderId id) noexcept
Definition strong_id.hpp:110
std::optional< ClientOrderId > decode_cl_ord_id(std::string_view s) noexcept
Definition strong_id.hpp:84
StrongId< struct InstrumentTag, std::uint32_t > InstrumentId
Dense index into the engine's instrument table.
Definition strong_id.hpp:38
FASTMM_FORCE_INLINE void write_cl_ord_id(char *dst, ClientOrderId id) noexcept
Writes the kClOrdIdChars characters of the wire form to dst (no terminator) with two 8-byte stores.
Definition strong_id.hpp:67
FixedString< 16 > encode_cl_ord_id(ClientOrderId id) noexcept
Definition strong_id.hpp:77
FixedString< 40 > ExecId
Definition strong_id.hpp:44
constexpr std::uint16_t cl_ord_id_epoch(ClientOrderId id) noexcept
Definition strong_id.hpp:107
Definition strong_id.hpp:54
constexpr bool valid() const noexcept
Definition strong_id.hpp:58
std::uint32_t idx
Definition strong_id.hpp:55
constexpr auto operator<=>(const Handle &) const noexcept=default
constexpr Handle() noexcept=default
Definition strong_id.hpp:22
Rep rep_type
Definition strong_id.hpp:24