Skip to content

Commit

Permalink
libdeng2: Added a semantic hint for number values
Browse files Browse the repository at this point in the history
The semantic hint suggests what the number is being used for. Added
a hint for Boolean values. These will be shown as "True" and "False"
when printed.

Serialization of NumberValue was changed.
  • Loading branch information
skyjake committed Nov 30, 2012
1 parent e19206b commit e70b397
Show file tree
Hide file tree
Showing 5 changed files with 52 additions and 24 deletions.
17 changes: 14 additions & 3 deletions doomsday/libdeng2/include/de/data/numbervalue.h
Expand Up @@ -22,6 +22,8 @@

#include "../Value"

#include <QFlags>

namespace de
{
/**
Expand All @@ -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.
Expand All @@ -71,7 +79,10 @@ namespace de

private:
Number _value;
SemanticHints _semantic;
};

Q_DECLARE_OPERATORS_FOR_FLAGS(NumberValue::SemanticHints)
}

#endif /* LIBDENG2_NUMBERVALUE_H */
27 changes: 21 additions & 6 deletions doomsday/libdeng2/src/data/numbervalue.cpp
Expand Up @@ -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
Expand All @@ -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;
}

Expand Down Expand Up @@ -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)
Expand All @@ -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);
}
4 changes: 2 additions & 2 deletions doomsday/libdeng2/src/scriptsys/constantexpression.cpp
Expand Up @@ -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()
Expand Down
10 changes: 6 additions & 4 deletions doomsday/libdeng2/src/scriptsys/operatorexpression.cpp
Expand Up @@ -31,9 +31,6 @@

using namespace de;

#define HAS_LEFT_OPERAND 0x80
#define OPERATOR_MASK 0x7f

OperatorExpression::OperatorExpression() : _op(NONE), _leftOperand(0), _rightOperand(0)
{}

Expand Down Expand Up @@ -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)
Expand Down Expand Up @@ -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);
Expand Down
18 changes: 9 additions & 9 deletions doomsday/libdeng2/src/scriptsys/parser.cpp
Expand Up @@ -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,
Expand Down

0 comments on commit e70b397

Please sign in to comment.