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