Slick OrderBook 1.1.0
High-Performance C++23 OrderBook Library
Loading...
Searching...
No Matches
slick::orderbook::OrderBookManager< OrderBookT > Class Template Reference

Multi-symbol OrderBook Manager. More...

#include <orderbook_manager.hpp>

Collaboration diagram for slick::orderbook::OrderBookManager< OrderBookT >:

Public Types

using OrderBookPtr = std::shared_ptr< OrderBookT >
 
using SymbolMap = detail::FlatMap< SymbolId, OrderBookPtr >
 

Public Member Functions

 OrderBookManager (std::size_t initial_symbol_capacity=64)
 Constructor.
 
 ~OrderBookManager ()=default
 Destructor.
 
 OrderBookManager (const OrderBookManager &)=delete
 
OrderBookManager & operator= (const OrderBookManager &)=delete
 
 OrderBookManager (OrderBookManager &&other) noexcept
 
OrderBookManager & operator= (OrderBookManager &&other) noexcept
 
OrderBookT * getOrCreateOrderBook (SymbolId symbol)
 Get existing orderbook or create new one if it doesn't exist Thread-safe: Uses shared_mutex for symbol map access Lifetime: pointer is invalidated by removeOrderBook(symbol)/clear() (see class docs)
 
const OrderBookT * getOrderBook (SymbolId symbol) const
 Get existing orderbook (read-only access) Thread-safe: Uses shared lock for read-only access Lifetime: pointer is invalidated by removeOrderBook(symbol)/clear() (see class docs)
 
OrderBookT * getOrderBook (SymbolId symbol)
 Get existing orderbook (mutable access) Thread-safe: Uses shared lock for read-only access to map Lifetime: pointer is invalidated by removeOrderBook(symbol)/clear() (see class docs)
 
std::shared_ptr< OrderBookT > getOrCreateSharedOrderBook (SymbolId symbol)
 Get existing orderbook or create new one, as a retaining handle Thread-safe; the orderbook stays alive while the handle is held, even if removeOrderBook()/clear() runs concurrently.
 
std::shared_ptr< OrderBookT > getSharedOrderBook (SymbolId symbol) const
 Get existing orderbook as a retaining handle Thread-safe; the orderbook stays alive while the handle is held, even if removeOrderBook()/clear() runs concurrently.
 
bool hasSymbol (SymbolId symbol) const
 Check if symbol exists in manager 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.
 
std::size_t symbolCount () const
 Get number of active symbols Thread-safe: Uses shared lock.
 
void clear ()
 Clear all orderbooks Thread-safe: Uses exclusive lock.
 
void reserve (std::size_t capacity)
 Reserve capacity for expected number of symbols Not thread-safe: Should be called before concurrent access begins.
 

Detailed Description

template<typename OrderBookT>
class slick::orderbook::OrderBookManager< OrderBookT >

Multi-symbol OrderBook Manager.

Manages multiple orderbook instances (L2 or L3) across different symbols. Thread-safe for concurrent access to different symbols.

Features:

  • Thread-safe symbol registry using shared_mutex
  • Per-symbol orderbook isolation (no cross-symbol locking)
  • Automatic orderbook creation on first access
  • Efficient symbol lookup via flat_map
  • Support for both L2 and L3 orderbooks via template

Thread Safety:

  • Multiple threads can simultaneously access different symbols (lock-free)
  • Symbol map protected by shared_mutex (read-write lock)
  • Each orderbook follows single-writer-per-symbol model

Orderbook Lifetime:

  • Raw pointers returned by getOrCreateOrderBook()/getOrderBook() are NOT retained by the manager lock. They are invalidated by removeOrderBook()/clear() for that symbol. Only use them when no thread can remove the symbol while the pointer is in use (e.g. symbols are removed only after all feed threads have stopped).
  • If symbols may be removed concurrently, use getOrCreateSharedOrderBook()/getSharedOrderBook(): the returned shared_ptr keeps the orderbook alive after removal from the manager.

Template Parameter:

Template Parameters
OrderBookTEither OrderBookL2 or OrderBookL3

Usage:

// L2 Manager
auto* book = l2_manager.getOrCreateOrderBook(symbol_id);
book->updateLevel(Side::Buy, 10000, 100, timestamp);
// L3 Manager
auto* book = l3_manager.getOrCreateOrderBook(symbol_id);
book->addOrder(order_id, Side::Buy, 10000, 100, timestamp);
Multi-symbol OrderBook Manager.
OrderBookT * getOrCreateOrderBook(SymbolId symbol)
Get existing orderbook or create new one if it doesn't exist Thread-safe: Uses shared_mutex for symbo...

Definition at line 61 of file orderbook_manager.hpp.

Member Typedef Documentation

◆ OrderBookPtr

template<typename OrderBookT >
using slick::orderbook::OrderBookManager< OrderBookT >::OrderBookPtr = std::shared_ptr<OrderBookT>

Definition at line 63 of file orderbook_manager.hpp.

◆ SymbolMap

template<typename OrderBookT >
using slick::orderbook::OrderBookManager< OrderBookT >::SymbolMap = detail::FlatMap<SymbolId, OrderBookPtr>

Definition at line 64 of file orderbook_manager.hpp.

Constructor & Destructor Documentation

◆ OrderBookManager() [1/3]

template<typename OrderBookT >
slick::orderbook::OrderBookManager< OrderBookT >::OrderBookManager ( std::size_t  initial_symbol_capacity = 64)
explicit

Constructor.

Parameters
initial_symbol_capacityInitial capacity for symbol map

Definition at line 9 of file orderbook_manager_impl.hpp.

◆ ~OrderBookManager()

template<typename OrderBookT >
slick::orderbook::OrderBookManager< OrderBookT >::~OrderBookManager ( )
default

Destructor.

◆ OrderBookManager() [2/3]

template<typename OrderBookT >
slick::orderbook::OrderBookManager< OrderBookT >::OrderBookManager ( const OrderBookManager< OrderBookT > &  )
delete

◆ OrderBookManager() [3/3]

template<typename OrderBookT >
slick::orderbook::OrderBookManager< OrderBookT >::OrderBookManager ( OrderBookManager< OrderBookT > &&  other)
noexcept

Definition at line 20 of file orderbook_manager_impl.hpp.

Member Function Documentation

◆ clear()

template<typename OrderBookT >
void slick::orderbook::OrderBookManager< OrderBookT >::clear ( )

Clear all orderbooks Thread-safe: Uses exclusive lock.

Definition at line 127 of file orderbook_manager_impl.hpp.

◆ getOrCreateOrderBook()

template<typename OrderBookT >
OrderBookT * slick::orderbook::OrderBookManager< OrderBookT >::getOrCreateOrderBook ( SymbolId  symbol)

Get existing orderbook or create new one if it doesn't exist Thread-safe: Uses shared_mutex for symbol map access Lifetime: pointer is invalidated by removeOrderBook(symbol)/clear() (see class docs)

Parameters
symbolSymbol identifier
Returns
Pointer to orderbook (never null)

Definition at line 71 of file orderbook_manager_impl.hpp.

◆ getOrCreateSharedOrderBook()

template<typename OrderBookT >
std::shared_ptr< OrderBookT > slick::orderbook::OrderBookManager< OrderBookT >::getOrCreateSharedOrderBook ( SymbolId  symbol)

Get existing orderbook or create new one, as a retaining handle Thread-safe; the orderbook stays alive while the handle is held, even if removeOrderBook()/clear() runs concurrently.

Parameters
symbolSymbol identifier
Returns
Shared pointer to orderbook (never null)

Definition at line 76 of file orderbook_manager_impl.hpp.

◆ getOrderBook() [1/2]

template<typename OrderBookT >
OrderBookT * slick::orderbook::OrderBookManager< OrderBookT >::getOrderBook ( SymbolId  symbol)

Get existing orderbook (mutable access) Thread-safe: Uses shared lock for read-only access to map Lifetime: pointer is invalidated by removeOrderBook(symbol)/clear() (see class docs)

Parameters
symbolSymbol identifier
Returns
Pointer to orderbook, or nullptr if symbol doesn't exist

Definition at line 86 of file orderbook_manager_impl.hpp.

◆ getOrderBook() [2/2]

template<typename OrderBookT >
const OrderBookT * slick::orderbook::OrderBookManager< OrderBookT >::getOrderBook ( SymbolId  symbol) const

Get existing orderbook (read-only access) Thread-safe: Uses shared lock for read-only access Lifetime: pointer is invalidated by removeOrderBook(symbol)/clear() (see class docs)

Parameters
symbolSymbol identifier
Returns
Pointer to orderbook, or nullptr if symbol doesn't exist

Definition at line 81 of file orderbook_manager_impl.hpp.

◆ getSharedOrderBook()

template<typename OrderBookT >
std::shared_ptr< OrderBookT > slick::orderbook::OrderBookManager< OrderBookT >::getSharedOrderBook ( SymbolId  symbol) const

Get existing orderbook as a retaining handle Thread-safe; the orderbook stays alive while the handle is held, even if removeOrderBook()/clear() runs concurrently.

Parameters
symbolSymbol identifier
Returns
Shared pointer to orderbook, or nullptr if symbol doesn't exist

Definition at line 91 of file orderbook_manager_impl.hpp.

◆ getSymbols()

template<typename OrderBookT >
std::vector< SymbolId > slick::orderbook::OrderBookManager< OrderBookT >::getSymbols ( ) const

Get all active symbol IDs Thread-safe: Uses shared lock.

Returns
Vector of symbol IDs (copy for thread safety)

Definition at line 108 of file orderbook_manager_impl.hpp.

◆ hasSymbol()

template<typename OrderBookT >
bool slick::orderbook::OrderBookManager< OrderBookT >::hasSymbol ( SymbolId  symbol) const

Check if symbol exists in manager Thread-safe: Uses shared lock.

Parameters
symbolSymbol identifier
Returns
true if orderbook exists for this symbol

Definition at line 96 of file orderbook_manager_impl.hpp.

◆ operator=() [1/2]

template<typename OrderBookT >
OrderBookManager & slick::orderbook::OrderBookManager< OrderBookT >::operator= ( const OrderBookManager< OrderBookT > &  )
delete

◆ operator=() [2/2]

template<typename OrderBookT >
OrderBookManager< OrderBookT > & slick::orderbook::OrderBookManager< OrderBookT >::operator= ( OrderBookManager< OrderBookT > &&  other)
noexcept

Definition at line 27 of file orderbook_manager_impl.hpp.

◆ removeOrderBook()

template<typename OrderBookT >
bool slick::orderbook::OrderBookManager< OrderBookT >::removeOrderBook ( SymbolId  symbol)

Remove orderbook for a symbol Thread-safe: Uses exclusive lock.

Parameters
symbolSymbol identifier
Returns
true if symbol was found and removed

Definition at line 102 of file orderbook_manager_impl.hpp.

◆ reserve()

template<typename OrderBookT >
void slick::orderbook::OrderBookManager< OrderBookT >::reserve ( std::size_t  capacity)

Reserve capacity for expected number of symbols Not thread-safe: Should be called before concurrent access begins.

Parameters
capacityExpected number of symbols

Definition at line 133 of file orderbook_manager_impl.hpp.

◆ symbolCount()

template<typename OrderBookT >
std::size_t slick::orderbook::OrderBookManager< OrderBookT >::symbolCount ( ) const

Get number of active symbols Thread-safe: Uses shared lock.

Returns
Number of orderbooks being managed

Definition at line 121 of file orderbook_manager_impl.hpp.


The documentation for this class was generated from the following files: