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()); }
ExpressionResult* BinaryExpression::eval(const BSONObj& bson) { switch (_oper) { case FO_EQUALS: return evalEqual(bson, _left, _right); case FO_NOT_EQUALS: return evalNotEqual(bson, _left, _right); case FO_AND: case FO_OR: return evalAndOr(bson, _oper, _left, _right); case FO_LESSTHAN: case FO_LESSEQUALTHAN: case FO_GREATERTHAN: case FO_GREATEREQUALTHAN: return evalComparison(bson, _oper, _left, _right); } }