8template<
typename OrderBookT>
14 if constexpr (
requires { symbol_map_.reserve(initial_symbol_capacity); }) {
15 symbol_map_.reserve(initial_symbol_capacity);
19template<
typename OrderBookT>
21 std::unique_lock lock(other.mutex_);
22 symbol_map_ = std::move(other.symbol_map_);
23 other.symbol_map_.clear();
26template<
typename OrderBookT>
28 if (
this != &other) [[likely]] {
31 std::scoped_lock lock(mutex_, other.mutex_);
32 released = std::exchange(symbol_map_, std::move(other.symbol_map_));
33 other.symbol_map_.clear();
39template<
typename OrderBookT>
40template<
typename Projection>
42 std::shared_lock lock(mutex_);
43 auto it = symbol_map_.find(symbol);
44 return proj(it != symbol_map_.end() ? &it->second : nullptr);
47template<
typename OrderBookT>
48template<
typename Projection>
49auto OrderBookManager<OrderBookT>::findOrCreate(
SymbolId symbol, Projection&& proj) {
52 std::shared_lock lock(mutex_);
53 auto it = symbol_map_.find(symbol);
54 if (it != symbol_map_.end()) [[likely]] {
55 return proj(it->second);
60 std::unique_lock lock(mutex_);
63 auto it = symbol_map_.find(symbol);
64 if (it == symbol_map_.end()) {
65 it = symbol_map_.emplace(symbol, std::make_shared<OrderBookT>(symbol)).first;
67 return proj(it->second);
70template<
typename OrderBookT>
72 return findOrCreate(symbol, [](
const OrderBookPtr& book) {
return book.get(); });
75template<
typename OrderBookT>
77 return findOrCreate(symbol, [](
const OrderBookPtr& book) {
return book; });
80template<
typename OrderBookT>
82 return find(symbol, [](
const OrderBookPtr* book) ->
const OrderBookT* {
return book ? book->get() :
nullptr; });
85template<
typename OrderBookT>
87 return find(symbol, [](
const OrderBookPtr* book) -> OrderBookT* {
return book ? book->get() :
nullptr; });
90template<
typename OrderBookT>
95template<
typename OrderBookT>
97 std::shared_lock lock(mutex_);
98 return symbol_map_.contains(symbol);
101template<
typename OrderBookT>
103 std::unique_lock lock(mutex_);
104 return symbol_map_.erase(symbol) > 0;
107template<
typename OrderBookT>
109 std::shared_lock lock(mutex_);
110 std::vector<SymbolId> symbols;
111 symbols.reserve(symbol_map_.size());
113 for (
const auto& [symbol_id, _] : symbol_map_) {
114 symbols.push_back(symbol_id);
120template<
typename OrderBookT>
122 std::shared_lock lock(mutex_);
123 return symbol_map_.size();
126template<
typename OrderBookT>
128 std::unique_lock lock(mutex_);
132template<
typename OrderBookT>
135 if constexpr (
requires { symbol_map_.reserve(capacity); }) {
136 symbol_map_.reserve(capacity);
Multi-symbol OrderBook Manager.
detail::FlatMap< SymbolId, OrderBookPtr > SymbolMap
OrderBookManager & operator=(const OrderBookManager &)=delete
std::size_t symbolCount() const
Get number of active symbols Thread-safe: Uses shared lock.
bool removeOrderBook(SymbolId symbol)
Remove orderbook for a symbol Thread-safe: Uses exclusive lock.
std::vector< SymbolId > getSymbols() const
Get all active symbol IDs Thread-safe: Uses shared lock.
const OrderBookT * getOrderBook(SymbolId symbol) const
Get existing orderbook (read-only access) Thread-safe: Uses shared lock for read-only access Lifetime...
OrderBookT * getOrCreateOrderBook(SymbolId symbol)
Get existing orderbook or create new one if it doesn't exist Thread-safe: Uses shared_mutex for symbo...
std::shared_ptr< OrderBookT > getOrCreateSharedOrderBook(SymbolId symbol)
Get existing orderbook or create new one, as a retaining handle Thread-safe; the orderbook stays aliv...
void reserve(std::size_t capacity)
Reserve capacity for expected number of symbols Not thread-safe: Should be called before concurrent a...
OrderBookManager(std::size_t initial_symbol_capacity=64)
Constructor.
bool hasSymbol(SymbolId symbol) const
Check if symbol exists in manager Thread-safe: Uses shared lock.
void clear()
Clear all orderbooks Thread-safe: Uses exclusive lock.
std::shared_ptr< OrderBookT > getSharedOrderBook(SymbolId symbol) const
Get existing orderbook as a retaining handle Thread-safe; the orderbook stays alive while the handle ...
std::shared_ptr< OrderBookT > OrderBookPtr
#define SLICK_NAMESPACE_END
#define SLICK_NAMESPACE_BEGIN
uint16_t SymbolId
Symbol identifier - can be hash or sequential ID.