Пример #1
0
    type_t dequeue() {
      type_t event(heap[0].event);
      unsigned parent = 0;
      unsigned counter = heap[--heapsize].counter;

      while(true) {
        unsigned child = (parent << 1) + 1;
        if(child >= heapsize) break;
        if(child + 1 < heapsize && gte(heap[child].counter, heap[child + 1].counter)) child++;
        if(gte(heap[child].counter, counter)) break;

        heap[parent].counter = heap[child].counter;
        heap[parent].event = heap[child].event;
        parent = child;
      }

      heap[parent].counter = counter;
      heap[parent].event = heap[heapsize].event;
      return event;
    }
Пример #2
0
transform_list_ptr parse_transform(std::string const& str, std::string const& encoding)
{
    transform_list_ptr tl = boost::make_shared<transform_list>();
    transcoder tc(encoding);
    expression_grammar<std::string::const_iterator> ge(tc);
    transform_expression_grammar__string gte(ge);

    if (!parse_transform(*tl, str, gte))
    {
        tl.reset();
    }
    return tl;
}
Пример #3
0
    //counter is relative to current time (eg enqueue(64, ...) fires in 64 ticks);
    //counter cannot exceed std::numeric_limits<unsigned>::max() >> 1.
    void enqueue(unsigned counter, type_t event) {
      unsigned child = heapsize++;
      counter += basecounter;

      while(child) {
        unsigned parent = (child - 1) >> 1;
        if(gte(counter, heap[parent].counter)) break;

        heap[child].counter = heap[parent].counter;
        heap[child].event = heap[parent].event;
        child = parent;
      }

      heap[child].counter = counter;
      heap[child].event = event;
    }
Пример #4
0
    TEST(ExpressionAlgoIsSubsetOf, Compare_NaN) {
        ParsedMatchExpression nan("{x: NaN}");
        ParsedMatchExpression lt("{x: {$lt: 5}}");
        ParsedMatchExpression lte("{x: {$lte: 5}}");
        ParsedMatchExpression gte("{x: {$gte: 5}}");
        ParsedMatchExpression gt("{x: {$gt: 5}}");

        ASSERT_TRUE(expression::isSubsetOf(nan.get(), nan.get()));
        ASSERT_FALSE(expression::isSubsetOf(nan.get(), lt.get()));
        ASSERT_FALSE(expression::isSubsetOf(lt.get(), nan.get()));
        ASSERT_FALSE(expression::isSubsetOf(nan.get(), lte.get()));
        ASSERT_FALSE(expression::isSubsetOf(lte.get(), nan.get()));
        ASSERT_FALSE(expression::isSubsetOf(nan.get(), gte.get()));
        ASSERT_FALSE(expression::isSubsetOf(gte.get(), nan.get()));
        ASSERT_FALSE(expression::isSubsetOf(nan.get(), gt.get()));
        ASSERT_FALSE(expression::isSubsetOf(gt.get(), nan.get()));
    }
Пример #5
0
void Conditions::Gte(const string& name, const string& value) {
    shared_ptr<Condition::Base> gte(new Condition::Gte(name, value));
    vector< shared_ptr<Condition::Base> >::push_back(gte);
}
Пример #6
0
 inline void tick(unsigned ticks) {
   basecounter += ticks;
   while(heapsize && gte(basecounter, heap[0].counter)) callback(dequeue());
 }
Пример #7
0
int main( int argc , char * argv[] )  {
    std::cout << "算术" << std::endl;
    int a = 10 , b = 20;
    int ret;

    std::plus<int>add;
    ret = add(a,b);
    std::cout << ret << std::endl;

    std::minus<int> min;
    ret = min(b,a);
    std::cout << ret << std::endl;

    std::multiplies<int> mp;
    ret = mp(a,b);
    std::cout << ret << std::endl;

    std::divides<int> divi;
    ret = divi(a,b);
    std::cout << ret << std::endl;

    std::modulus<int> mod;
    ret = mod(a,b);
    std::cout << ret << std::endl;

    std::negate<int> neg;
    ret = neg(a);
    std::cout << ret << std::endl;


    std::cout << "关系" <<std::endl;
    int a2 = 10 , b2 = 20;
    int ret2;
    std::equal_to<int> et;
    ret2 = et(a,b);
    std::cout << ret2 <<std::endl;

    std::not_equal_to<int> net;
    ret2 = net(a,b);
    std::cout << ret2 << std::endl;

    std::greater<int>gt;
    ret2 = gt(b,a);
    std::cout << ret2 << std::endl;

    std::greater_equal<int> gte;
    ret2 = gte(a,b);
    std::cout << ret2 <<std::endl;

    std::less<int> ls;
    ret2 = ls(a,b);
    std::cout << ret2 << std::endl;

    std::less_equal<int> lel;
    ret2 = lel(a,b);
    std::cout << ret2 << std::endl;

    std::cout << "逻辑" << std::endl;
    int ret3;
    std::logical_and<int> la;
    ret3 = la(a,b);
    std::cout << ret3 <<std::endl;

    std::logical_or<int> lo;
    ret3 = lo(a,b);
    std::cout << ret3 << std::endl;

    std::logical_not<int>ln;
    ret3 = ln(b);
    std::cout << ret3 <<std::endl;

    return EXIT_SUCCESS;
}
Пример #8
0
inline bool gte(const T1& lhs, const T2& rhs) {
  return lhs.get_head() >= rhs.get_head()  &&
          ( !(rhs.get_head() >= lhs.get_head()) ||
            gte(lhs.get_tail(), rhs.get_tail()));
}