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