]> git.cworth.org Git - apitrace/blobdiff - trace_model.cpp
More efficient bitmask representation.
[apitrace] / trace_model.cpp
index 760093c780a4d1279ffd36bb88b1f04e891ee029..e6ec467ad10bd3cbae8eaeaae030f41ba2b3f982 100644 (file)
@@ -59,6 +59,10 @@ void Const::visit(Visitor &visitor) {
    visitor.visit(this);
 }
 
+void Bitmask::visit(Visitor &visitor) {
+   visitor.visit(this);
+}
+
 void Array::visit(Visitor &visitor) {
    visitor.visit(this);
 }
@@ -129,6 +133,29 @@ public:
       os << literal << node->name << normal;
    }
 
+   void visit(Bitmask *bitmask) {
+      unsigned long long value = bitmask->value;
+      const Bitmask::Signature *sig = bitmask->sig;
+      bool first = true;
+      for (Bitmask::Signature::const_iterator it = sig->begin(); value != 0 && it != sig->end(); ++it) {
+          assert(it->second);
+          if ((value & it->second) == it->second) {
+              if (!first) {
+                  os << " | ";
+              }
+              os << literal << it->first << normal;
+              value &= ~it->second;
+              first = false;
+          }
+      }
+      if (value || first) {
+          if (!first) {
+              os << " | ";
+          }
+          os << literal << std::hex << value << std::dec << normal;
+      }
+   }
+
    void visit(Array *array) {
       if (array->values.size() == 1) {
          os << "&";