Exemplo n.º 1
0
PrimitiveValue AssignmentExpression::eval (EvaluationContext * evaluationContext) const {
	shared_ptr<Variable> var = boost::dynamic_pointer_cast<Variable>(mVariable);
	if (!var) return errorValue (error::Eval_BadType, "Variable expected on left side");
	PrimitiveValue right = mArgument->eval(evaluationContext);

	if (right.error()) return right;
	evaluationContext->setVariable (var->id(), right);
	return right;
}
    virtual void onEnum(
        Token& fieldToken,
        const char *buffer,
        std::vector<Token>& tokens,
        std::size_t fromIndex,
        std::size_t toIndex,
        std::uint64_t actingVersion)
    {
        const Token& typeToken = tokens.at(fromIndex + 1);
        const Encoding& encoding = typeToken.encoding();

        printScope();
        std::cout << fieldToken.name() << "=";

        for (size_t i = fromIndex + 1; i < toIndex; i++)
        {
            const Token &token = tokens.at(i);
            const PrimitiveValue constValue = token.encoding().constValue();

            if (typeToken.isConstantEncoding())
            {
                std::cout << token.name();
                break;
            }

            if (encoding.primitiveType() == PrimitiveType::CHAR)
            {
                if (encoding.getAsInt(buffer) == constValue.getAsInt())
                {
                    std::cout << token.name();
                    break;
                }
            }
            else if (encoding.primitiveType() == PrimitiveType::UINT8)
            {
                if (encoding.getAsUInt(buffer) == constValue.getAsUInt())
                {
                    std::cout << token.name();
                    break;
                }
            }
        }

        std::cout << "\n";
    }
    void onEnum(
        Token& fieldToken,
        const char *buffer,
        std::vector<Token>& tokens,
        std::size_t fromIndex,
        std::size_t toIndex,
        std::uint64_t actingVersion)
    {
        cout << m_eventNumber << ": Enum " << fieldToken.name() << "\n";

        const Token& typeToken = tokens.at(fromIndex + 1);
        const Encoding& encoding = typeToken.encoding();

        switch (EventNumber(m_eventNumber))
        {
            case EN_available:
            {
                EXPECT_EQ(fieldToken.fieldId(), fieldIdAvailable);
                EXPECT_EQ(encoding.primitiveType(), PrimitiveType::UINT8);

                const std::uint64_t value = encoding.getAsUInt(buffer);
                EXPECT_EQ(value, static_cast<std::uint64_t>(1));

                bool found = false;
                for (size_t i = fromIndex + 1; i < toIndex; i++)
                {
                    const Token& token = tokens.at(i);
                    const std::uint64_t constValue = token.encoding().constValue().getAsUInt();

                    cout << "    " << token.name() << " = " << constValue << "\n";

                    if (constValue == value)
                    {
                        EXPECT_EQ(token.name(), std::string("T"));
                        found = true;
                    }
                }
                EXPECT_TRUE(found);
                break;
            }
            case EN_code:
            {
                EXPECT_EQ(fieldToken.fieldId(), fieldIdCode);
                EXPECT_EQ(encoding.primitiveType(), PrimitiveType::CHAR);

                const std::int64_t value = encoding.getAsInt(buffer);
                EXPECT_EQ(value, static_cast<std::int64_t>('A'));

                bool found = false;
                for (size_t i = fromIndex + 1; i < toIndex; i++)
                {
                    const Token& token = tokens.at(i);
                    const std::int64_t constValue = token.encoding().constValue().getAsUInt();

                    cout << "    " << token.name() << " = " << constValue << "\n";

                    if (constValue == value)
                    {
                        EXPECT_EQ(token.name(), std::string("A"));
                        found = true;
                    }
                }
                EXPECT_TRUE(found);
                break;
            }
            case EN_discountedModel:
            {
                EXPECT_EQ(fieldToken.fieldId(), fieldIdDiscountedModel);
                EXPECT_EQ(encoding.primitiveType(), PrimitiveType::CHAR);
                EXPECT_EQ(encoding.presence(), Presence::SBE_CONSTANT);
                EXPECT_TRUE(typeToken.isConstantEncoding());
                EXPECT_EQ(typeToken.encodedLength(), 0);

                const PrimitiveValue value = encoding.constValue();

                EXPECT_EQ(value.getAsInt(), static_cast<std::int64_t>('C'));
                bool found = false;
                for (size_t i = fromIndex + 1; i < toIndex; i++)
                {
                    const Token& token = tokens.at(i);
                    const std::int64_t constValue = token.encoding().constValue().getAsInt();

                    cout << "    " << token.name() << " = " << constValue << "\n";

                    if (constValue == value.getAsInt())
                    {
                        EXPECT_EQ(token.name(), std::string("C"));
                        found = true;
                    }
                }
                EXPECT_TRUE(found);
                break;
            }
            default:
                FAIL() << "unknown Enum event number " << m_eventNumber;
        }

        m_eventNumber++;
    }