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);