#include "../Include.h"
#include "OrderEntryItem.h"
#include <boost/algorithm/string.hpp>
class OrderBook
{
public:
#ifdef MAP_BASED_ORDERBOOK
typedef std::map<double, double, std::greater<double>> BidMap;
typedef std::map<double, double, std::less<double>> AskMap;
#else
typedef std::vector<std::pair<double, double>> BidMap;
typedef std::vector<std::pair<double, double>> AskMap;
#endif
#ifdef ITERATOR_BASED_ORDERBOOK
struct Entry
{
EntrySide side;
BidMap::iterator bidIt;
AskMap::iterator askIt;
};
#endif
public:
OrderBook(const std::string&);
void addOrder(EntrySide, double, double);
void removeOrder(EntrySide, double);
const BidMap& getBids() { return mBidLevels; }
const AskMap& getAsks() { return mAskLevels; }
int getBookWidth() { return mInitBookWidth; }
int getBidBookSize() { return mBidLevels.size(); }
int getAskBookSize() { return mAskLevels.size(); }
std::string toStr(int depth = 0, int spacing = 0);
void clear();
private:
#ifdef ITERATOR_BASED_ORDERBOOK
template<class T>
typename T::iterator add(T&, double, double);
template<class T>
void remove(typename T::iterator, T&);
#else
#ifdef MAP_BASED_ORDERBOOK
template<class T>
void add(T&, double, double);
template<class T>
void remove(T&, double price);
#else
template<class T, class C>
void add(T&, double, double, C);
template<class T, class C>
void remove(T&, double price, C);
#endif
#endif
private:
BidMap mBidLevels;
AskMap mAskLevels;
std::string mSymbol;
int mInitBookWidth;
#ifdef ITERATOR_BASED_ORDERBOOK
std::unordered_map<double, Entry> mLookup;
#endif
};