Beispiel #1
0
      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);
      }
Beispiel #2
0
      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);
          }
      }