diff --git a/doomsday/libdeng2/include/de/data/numbervalue.h b/doomsday/libdeng2/include/de/data/numbervalue.h index 719b828059..180a2811c8 100644 --- a/doomsday/libdeng2/include/de/data/numbervalue.h +++ b/doomsday/libdeng2/include/de/data/numbervalue.h @@ -22,6 +22,8 @@ #include "../Value" +#include + namespace de { /** @@ -40,12 +42,18 @@ namespace de /// Truth values for logical operations. They are treated as /// number values. enum { - VALUE_FALSE = 0, - VALUE_TRUE = 1 + False = 0, + True = 1 + }; + + enum SemanticHint { + Boolean = 0x1, ///< The number is intended to be a boolean value. + DefaultSemantic = 0 }; + Q_DECLARE_FLAGS(SemanticHints, SemanticHint) public: - NumberValue(Number initialValue = 0); + NumberValue(Number initialValue = 0, SemanticHints semantic = DefaultSemantic); /** * Conversion template that forces a cast to another type. @@ -71,7 +79,10 @@ namespace de private: Number _value; + SemanticHints _semantic; }; + + Q_DECLARE_OPERATORS_FOR_FLAGS(NumberValue::SemanticHints) } #endif /* LIBDENG2_NUMBERVALUE_H */ diff --git a/doomsday/libdeng2/src/data/numbervalue.cpp b/doomsday/libdeng2/src/data/numbervalue.cpp index 25198d977c..7f344fac21 100644 --- a/doomsday/libdeng2/src/data/numbervalue.cpp +++ b/doomsday/libdeng2/src/data/numbervalue.cpp @@ -26,13 +26,13 @@ using namespace de; -NumberValue::NumberValue(Number initialValue) - : _value(initialValue) +NumberValue::NumberValue(Number initialValue, SemanticHints semantic) + : _value(initialValue), _semantic(semantic) {} Value *NumberValue::duplicate() const { - return new NumberValue(_value); + return new NumberValue(_value, _semantic); } Value::Number NumberValue::asNumber() const @@ -44,7 +44,14 @@ Value::Text NumberValue::asText() const { Text result; QTextStream s(&result); - s << _value; + if(_semantic.testFlag(Boolean) && (_value == True || _value == False)) + { + s << (isTrue()? "True" : "False"); + } + else + { + s << _value; + } return result; } @@ -128,9 +135,14 @@ void NumberValue::modulo(Value const &divisor) _value = int(_value) % int(other->_value); } +// Flags for serialization: +static duint8 const SEMANTIC_BOOLEAN = 0x01; + void NumberValue::operator >> (Writer &to) const { - to << SerialId(NUMBER) << _value; + duint8 flags = (_semantic.testFlag(Boolean)? SEMANTIC_BOOLEAN : 0); + + to << SerialId(NUMBER) << flags << _value; } void NumberValue::operator << (Reader &from) @@ -143,5 +155,8 @@ void NumberValue::operator << (Reader &from) /// serialized value was invalid. throw DeserializationError("NumberValue::operator <<", "Invalid ID"); } - from >> _value; + duint8 flags; + from >> flags >> _value; + + _semantic = SemanticHints(flags & SEMANTIC_BOOLEAN? Boolean : 0); } diff --git a/doomsday/libdeng2/src/scriptsys/constantexpression.cpp b/doomsday/libdeng2/src/scriptsys/constantexpression.cpp index ed5060b6da..ce52f00f8a 100644 --- a/doomsday/libdeng2/src/scriptsys/constantexpression.cpp +++ b/doomsday/libdeng2/src/scriptsys/constantexpression.cpp @@ -50,12 +50,12 @@ ConstantExpression *ConstantExpression::None() ConstantExpression *ConstantExpression::True() { - return new ConstantExpression(new NumberValue(NumberValue::VALUE_TRUE)); + return new ConstantExpression(new NumberValue(NumberValue::True, NumberValue::Boolean)); } ConstantExpression *ConstantExpression::False() { - return new ConstantExpression(new NumberValue(NumberValue::VALUE_FALSE)); + return new ConstantExpression(new NumberValue(NumberValue::False, NumberValue::Boolean)); } ConstantExpression *ConstantExpression::Pi() diff --git a/doomsday/libdeng2/src/scriptsys/operatorexpression.cpp b/doomsday/libdeng2/src/scriptsys/operatorexpression.cpp index 76dff9f71c..900336b8a4 100644 --- a/doomsday/libdeng2/src/scriptsys/operatorexpression.cpp +++ b/doomsday/libdeng2/src/scriptsys/operatorexpression.cpp @@ -31,9 +31,6 @@ using namespace de; -#define HAS_LEFT_OPERAND 0x80 -#define OPERATOR_MASK 0x7f - OperatorExpression::OperatorExpression() : _op(NONE), _leftOperand(0), _rightOperand(0) {} @@ -86,7 +83,8 @@ void OperatorExpression::push(Evaluator &evaluator, Record *names) const Value *OperatorExpression::newBooleanValue(bool isTrue) { - return new NumberValue(isTrue? NumberValue::VALUE_TRUE : NumberValue::VALUE_FALSE); + return new NumberValue(isTrue? NumberValue::True : NumberValue::False, + NumberValue::Boolean); } void OperatorExpression::verifyAssignable(Value *value) @@ -256,6 +254,10 @@ Value *OperatorExpression::evaluate(Evaluator &evaluator) const return result; } +// Flags for serialization: +static duint8 const HAS_LEFT_OPERAND = 0x80; +static duint8 const OPERATOR_MASK = 0x7f; + void OperatorExpression::operator >> (Writer &to) const { to << SerialId(OPERATOR); diff --git a/doomsday/libdeng2/src/scriptsys/parser.cpp b/doomsday/libdeng2/src/scriptsys/parser.cpp index e273bd121f..959f8e18a9 100644 --- a/doomsday/libdeng2/src/scriptsys/parser.cpp +++ b/doomsday/libdeng2/src/scriptsys/parser.cpp @@ -852,15 +852,15 @@ Expression *Parser::parseTokenExpression(TokenRange const &range, Expression::Fl Operator Parser::findLowestOperator(TokenRange const &range, TokenRange &leftSide, TokenRange &rightSide) { enum { - MAX_RANK = 0x7fffffff, - RANK_MEMBER = 13, - RANK_CALL = 14, - RANK_INDEX = 14, - RANK_SLICE = 14, - RANK_DOT = 15, - RANK_ARRAY = MAX_RANK - 1, - RANK_DICTIONARY = RANK_ARRAY, - RANK_PARENTHESIS = MAX_RANK - 1 + MAX_RANK = 0x7fffffff, + RANK_MEMBER = 13, + RANK_CALL = 14, + RANK_INDEX = 14, + RANK_SLICE = 14, + RANK_DOT = 15, + RANK_ARRAY = MAX_RANK - 1, + RANK_DICTIONARY = RANK_ARRAY, + RANK_PARENTHESIS = MAX_RANK - 1 }; enum Direction { LEFT_TO_RIGHT,