[coco] Introduce BinaryOp trait (#1873)
author박종현/동작제어Lab(SR)/Staff Engineer/삼성전자 <jh1302.park@samsung.com>
Tue, 16 Oct 2018 01:35:52 +0000 (10:35 +0900)
committerGitHub Enterprise <noreply-CODE@samsung.com>
Tue, 16 Oct 2018 01:35:52 +0000 (10:35 +0900)
This commit extracts BinaryOp trait from Add, and simplifies the
declaration and implementation of Add class using this BinaryOp trait.

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

index 670973e..940c438 100644 (file)
@@ -184,6 +184,39 @@ private:
   Part _arg;
 };
 
+/**
+ * @brief Op with two arguments
+ */
+class BinaryOp : public Op
+{
+public:
+  explicit BinaryOp();
+
+public:
+  BinaryOp(const BinaryOp &) = delete;
+  BinaryOp(BinaryOp &&) = delete;
+
+public:
+  virtual ~BinaryOp() = default;
+
+public:
+  std::set<Object *> uses(void) const final;
+
+public:
+  Op *left(void) const { return _left.child(); }
+  void left(Op *op) { _left.child(op); }
+
+public:
+  Op *right(void) const { return _right.child(); }
+  void right(Op *op) { _right.child(op); }
+
+private:
+  // @brief Left-hand side (LHS) argument
+  Part _left;
+  // @brief Right-hand side (RHS) argument
+  Part _right;
+};
+
 } // namespace coco
 
 #endif // __COCO_IR_OP_H__
index 12ab3a9..21eaeac 100644 (file)
@@ -259,35 +259,18 @@ public:
  *
  * Add(L, R) is valid only when L and R have identical kind/shape/dtype
  */
-class Add final : public Op
+class Add final : public BinaryOp
 {
 public:
-  explicit Add();
+  explicit Add() = default;
 
 public:
   Add(const Add &) = delete;
   Add(Add &&) = delete;
 
 public:
-  std::set<Object *> uses(void) const override;
-
-public:
   Add *asAdd(void) override { return this; }
   const Add *asAdd(void) const override { return this; }
-
-public:
-  Op *left(void) const { return _left.child(); }
-  void left(Op *op) { _left.child(op); }
-
-public:
-  Op *right(void) const { return _right.child(); }
-  void right(Op *op) { _right.child(op); }
-
-private:
-  // @brief Left-hand side (LHS) argument
-  Part _left;
-  // @brief Right-hand side (RHS) argument
-  Part _right;
 };
 
 } // namesapce coco
index a2ab605..8dbb9b0 100644 (file)
@@ -76,4 +76,35 @@ std::set<Object *> UnaryOp::uses(void) const
   return res;
 }
 
+//
+// BinaryOp trait
+//
+BinaryOp::BinaryOp() : _left{this}, _right{this}
+{
+  // DO NOTHING
+}
+
+std::set<Object *> BinaryOp::uses(void) const
+{
+  std::set<Object *> res;
+
+  if (auto l = left())
+  {
+    for (auto obj : l->uses())
+    {
+      res.insert(obj);
+    }
+  }
+
+  if (auto r = right())
+  {
+    for (auto obj : r->uses())
+    {
+      res.insert(obj);
+    }
+  }
+
+  return res;
+}
+
 } // namespace coco
index 3f796da..1c1ef5d 100644 (file)
 namespace coco
 {
 
-/**
- * Operator: Add
- */
-Add::Add() : _left{this}, _right{this}
-{
-  // DO NOTHING
-}
-
-std::set<Object *> Add::uses(void) const
-{
-  std::set<Object *> res;
-
-  if (auto l = left())
-  {
-    for (auto obj : l->uses())
-    {
-      res.insert(obj);
-    }
-  }
-
-  if (auto r = right())
-  {
-    for (auto obj : r->uses())
-    {
-      res.insert(obj);
-    }
-  }
-
-  return res;
-}
-
 } // namespace coco