46 [[nodiscard]] std::expected<bool, BookError>
add(
const ItchMessage& message);
60#if defined(__linux__) && defined(__x86_64__)
67 void prefetch(std::uint64_t order, std::uint16_t locate)
const;
72 [[nodiscard]]
Bbo bbo(std::uint16_t locate)
const;
74 [[nodiscard]] std::size_t
order_count()
const {
return m_order_count; }
76 [[nodiscard]] std::size_t
level_count()
const {
return m_levels.size(); }
88 static constexpr std::uint64_t paged_orders = std::uint64_t{1} << 32U;
93 static constexpr unsigned page_bits = 7;
94 static constexpr std::size_t page_size = std::size_t{1} << page_bits;
97 using Page = std::array<Order, page_size>;
101 static constexpr unsigned chunk_bits = 9;
102 static constexpr std::size_t chunk_size = std::size_t{1} << chunk_bits;
104 std::array<std::unique_ptr<Page>, chunk_size> pages;
105 std::array<std::uint8_t, chunk_size> live{};
107 static_assert(page_size <= std::numeric_limits<std::uint8_t>::max());
112 bool reduce(std::uint64_t order, Order& resting, Shares quantity);
114 [[nodiscard]] Order* find(std::uint64_t order, std::uint16_t locate);
116 [[nodiscard]]
const Order* indexed(std::uint64_t order)
const;
118 [[nodiscard]] Chunk& chunk(std::uint64_t order);
120 [[nodiscard]]
static std::size_t page_slot(std::uint64_t order)
122 return (order >> page_bits) & (chunk_size - 1);
125 [[nodiscard]] BookLevels& book(std::uint16_t locate);
127 std::vector<BookLevels> m_books;
130 std::vector<std::unique_ptr<Chunk>> m_chunks;
132 std::vector<std::unique_ptr<Page>> m_spare_pages;
136 ankerl::unordered_dense::map<std::pair<std::uint64_t, std::uint16_t>, Order> m_overflow;
137 std::size_t m_order_count = 0;