Esempio n. 1
0
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());
}
Esempio n. 2
0
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);
	}
}