AnimExpression::OpCode AnimExpression::evaluate(const AnimVariantMap& map) const { std::stack<OpCode> stack; for (auto& opCode : _opCodes) { switch (opCode.type) { case OpCode::Identifier: case OpCode::Int: case OpCode::Float: case OpCode::Bool: stack.push(opCode); break; case OpCode::And: evalAnd(map, stack); break; case OpCode::Or: evalOr(map, stack); break; case OpCode::GreaterThan: evalGreaterThan(map, stack); break; case OpCode::GreaterThanEqual: evalGreaterThanEqual(map, stack); break; case OpCode::LessThan: evalLessThan(map, stack); break; case OpCode::LessThanEqual: evalLessThanEqual(map, stack); break; case OpCode::Equal: evalEqual(map, stack); break; case OpCode::NotEqual: evalNotEqual(map, stack); break; case OpCode::Not: evalNot(map, stack); break; case OpCode::Subtract: evalSubtract(map, stack); break; case OpCode::Add: evalAdd(map, stack); break; case OpCode::Multiply: evalMultiply(map, stack); break; case OpCode::Divide: evalDivide(map, stack); break; case OpCode::Modulus: evalModulus(map, stack); break; case OpCode::UnaryMinus: evalUnaryMinus(map, stack); break; } } return coerseToValue(map, stack.top()); }
Query* UserQuery:: eval_query() { vector<string,allocator>::iterator it = _query->begin(), end_it = _query->end(); for ( ; it != end_it; ++it ) { switch( evalQueryString( *it )) { case WORD: evalWord( *it ); break; case AND: evalAnd(); break; case OR: evalOr(); break; case NOT: evalNot(); break; case LPAREN: ++_paren; ++_lparenOn; break; case RPAREN: --_paren; ++_rparenOn; evalRParen(); break; } cout << " lparenOn: " << _lparenOn << endl; cout << " rparenOn: " << _rparenOn << endl; } if ( integrity_check() ) { _eval = _query_stack.top(); _query_stack.pop(); if ( _rparenOn ) { _eval->rparen( _rparenOn ); _rparenOn = 0; } return _eval; } else return _eval = 0; }