[coco] Introduce Op mutator interface (#1781)
author박종현/동작제어Lab(SR)/Staff Engineer/삼성전자 <jh1302.park@samsung.com>
Wed, 10 Oct 2018 00:37:43 +0000 (09:37 +0900)
committerGitHub Enterprise <noreply-CODE@samsung.com>
Wed, 10 Oct 2018 00:37:43 +0000 (09:37 +0900)
This commit introduces basic boilerplates for Op mutators.

Signed-off-by: Jonghyun Park <jh1302.park@samsung.com>
contrib/coco/core/include/coco/IR/Op.h

index 300a15e..b256a9a 100644 (file)
@@ -94,6 +94,47 @@ struct Op : public Entity
   template <typename T> T accept(Visitor<T> &&v) const { return accept(&v); }
 
 public:
+  /**
+   * @brief Op mutator interface
+   *
+   * WARN Use this interface only for coco-internal classes
+   *      (to minimize changes upon Instr extension)
+   */
+  struct IMutator
+  {
+    virtual ~IMutator() = default;
+
+#define OP(Name) virtual void mutate(Name *) = 0;
+#include "coco/IR/Op.lst"
+#undef OP
+  };
+
+  struct Mutator : public IMutator
+  {
+    virtual ~Mutator() = default;
+
+#define OP(Name) \
+  void mutate(Name *) override { throw std::runtime_error{"NYI"}; }
+#include "coco/IR/Op.lst"
+#undef OP
+  };
+
+  void accept(IMutator *m)
+  {
+#define OP(Name)            \
+  if (auto op = as##Name()) \
+  {                         \
+    return m->mutate(op);   \
+  }
+#include "coco/IR/Op.lst"
+#undef OP
+    throw std::runtime_error{"unreachable"};
+  }
+
+  void accept(IMutator &m) { return accept(&m); }
+  void accept(IMutator &&m) { return accept(&m); }
+
+public:
   Instr *parent(void) const;
 
   // @brief Return a pointer to the parent Op