void add (uint32_t id, char side, uint32_t price, uint32_t size) { if (orders.end () != orders.find (id, OrderIdHasher (), OrderIdEqual ())) { throw std::runtime_error ("duplicate add"); } AggregateOrders::iterator found = aggregateOrders.find (std::make_pair (side, price), AggregateOrderLess ()); if (found == aggregateOrders.end ()) { AggregateOrder *a = aggregateOrderPool.construct (boost::in_place (side, price)); found = aggregateOrders.insert (*a).first; } assert(aggregateOrders.end () != found); Order *order = orderPool.construct (boost::in_place (id, boost::ref (*found))); assert(order); bool orderInserted __attribute__((unused)) = orders.insert (*order).second; assert(orderInserted); order->size = size; order->aggregateOrder.size += size; assert(order->size); assert(order->aggregateOrder.size); }
void reduce (uint32_t id, uint32_t size) { Orders::iterator found = orders.find (id, OrderIdHasher (), OrderIdEqual ()); if (found == orders.end ()) { throw std::runtime_error ("order not found"); } assert(&*found); assert(&found->aggregateOrder); Order &o = *found; AggregateOrder &a = found->aggregateOrder; if (size > o.size) { throw std::runtime_error ("attempt to over reduce"); } if (size == o.size) { a.size -= o.size; orders.erase (found); orderPool.destroy (&o); if (0 == a.size) { aggregateOrders.erase (AggregateOrders::s_iterator_to (a)); aggregateOrderPool.destroy (&a); } } else { o.size -= size; a.size -= size; assert(o.size); assert(a.size); } }