void VariantVisitor::visit(Trace::Enum *e)
{
- VariantVisitor vis;
- e->sig->second->visit(vis);
-
- QVariant val = vis.variant();
+ QVariant val = QVariant(e->sig->value);
m_variant = QVariant::fromValue(
- ApiEnum(QString::fromStdString(e->sig->first), val));
+ ApiEnum(QString::fromStdString(e->sig->name), val));
}
void VariantVisitor::visit(Trace::Bitmask *bitmask)
bool UInt ::toBool(void) const { return value != 0; }
bool Float ::toBool(void) const { return value != 0; }
bool String ::toBool(void) const { return true; }
-bool Enum ::toBool(void) const { return sig->second->toBool(); }
+bool Enum ::toBool(void) const { return sig->value != 0; }
bool Struct ::toBool(void) const { return true; }
bool Array ::toBool(void) const { return true; }
bool Blob ::toBool(void) const { return true; }
signed long long SInt ::toSInt(void) const { return value; }
signed long long UInt ::toSInt(void) const { assert(static_cast<signed long long>(value) >= 0); return static_cast<signed long long>(value); }
signed long long Float ::toSInt(void) const { return static_cast<signed long long>(value); }
-signed long long Enum ::toSInt(void) const { return sig->second->toSInt(); }
+signed long long Enum ::toSInt(void) const { return sig->value; }
// unsigned integer cast
unsigned long long SInt ::toUInt(void) const { assert(value >= 0); return static_cast<signed long long>(value); }
unsigned long long UInt ::toUInt(void) const { return value; }
unsigned long long Float ::toUInt(void) const { return static_cast<unsigned long long>(value); }
-unsigned long long Enum ::toUInt(void) const { return sig->second->toUInt(); }
+unsigned long long Enum ::toUInt(void) const { assert(sig->value >= 0); return sig->value; }
// floating point cast
float SInt ::toFloat(void) const { return static_cast<float>(value); }
float UInt ::toFloat(void) const { return static_cast<float>(value); }
float Float ::toFloat(void) const { return value; }
-float Enum ::toFloat(void) const { return sig->second->toFloat(); }
+float Enum ::toFloat(void) const { return static_cast<float>(sig->value); }
// floating point cast
double SInt ::toDouble(void) const { return static_cast<double>(value); }
double UInt ::toDouble(void) const { return static_cast<double>(value); }
double Float ::toDouble(void) const { return value; }
-double Enum ::toDouble(void) const { return sig->second->toDouble(); }
+double Enum ::toDouble(void) const { return static_cast<double>(sig->value); }
// pointer cast
void Visitor::visit(UInt *) { assert(0); }
void Visitor::visit(Float *) { assert(0); }
void Visitor::visit(String *) { assert(0); }
-void Visitor::visit(Enum *node) { _visit(node->sig->second); }
+void Visitor::visit(Enum *node) { assert(0); }
void Visitor::visit(Bitmask *node) { visit(static_cast<UInt *>(node)); }
void Visitor::visit(Struct *) { assert(0); }
void Visitor::visit(Array *) { assert(0); }
}
void visit(Enum *node) {
- os << literal << node->sig->first << normal;
+ os << literal << node->sig->name << normal;
}
void visit(Bitmask *bitmask) {
class Enum : public Value
{
public:
- struct Signature : public std::pair<const char *, Value *>
- {
- Signature()
- : std::pair<const char *, Value *>()
- {}
- Signature(const char *n, Trace::Value *val)
- : std::pair<const char *, Value *>(n, val)
- {}
- ~Signature()
- {
- delete second;
- }
- };
-
- Enum(const Signature *_sig) : sig(_sig) {}
+ Enum(const EnumSig *_sig) : sig(_sig) {}
bool toBool(void) const;
signed long long toSInt(void) const;
virtual double toDouble(void) const;
void visit(Visitor &visitor);
- const Signature *sig;
+ const EnumSig *sig;
};
Value *Parser::parse_enum() {
size_t id = read_uint();
- Enum::Signature *sig = lookup(enums, id);
+ EnumSig *sig = lookup(enums, id);
if (!sig) {
- const char *name = read_string();
+ sig = new EnumSig;
+ sig->id = id;
+ sig->name = read_string();
Value *value = parse_value();
- sig = new Enum::Signature(name, value);
+ sig->value = value->toSInt();
+ delete value;
enums[id] = sig;
}
assert(sig);