[coco] Non-template DefSlot (#1480)
author박종현/동작제어Lab(SR)/Staff Engineer/삼성전자 <jh1302.park@samsung.com>
Thu, 13 Sep 2018 01:24:29 +0000 (10:24 +0900)
committerGitHub Enterprise <noreply-CODE@samsung.com>
Thu, 13 Sep 2018 01:24:29 +0000 (10:24 +0900)
DefSlot is revised as a non-template version, which is a step to
support Object-to-Object substitution.

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

index 537cfee..7ed5bee 100644 (file)
@@ -6,7 +6,7 @@
 namespace coco
 {
 
-template <typename T> class DefSlot final
+class DefSlot final
 {
 public:
   DefSlot(const PtrLink<Object, ObjectInfo> *obj_link, Object::Producer *use)
@@ -18,10 +18,10 @@ public:
   ~DefSlot() { value(nullptr); }
 
 public:
-  T *value(void) const { return _value; }
+  Object *value(void) const { return _value; }
 
 public:
-  void value(T *value)
+  void value(Object *value)
   {
     if (_value)
     {
@@ -42,7 +42,7 @@ public:
 
 private:
   DefHook _hook;
-  T *_value;
+  Object *_value;
 };
 
 } // namespace coco
index 4348235..46eeacb 100644 (file)
@@ -172,10 +172,10 @@ public:
   void ifm(FeatureObject *ifm);
 
 private:
-  DefSlot<FeatureObject> _ofm;
+  DefSlot _ofm;
 
 public:
-  FeatureObject *ofm(void) const { return _ofm.value(); }
+  FeatureObject *ofm(void) const;
   void ofm(FeatureObject *ofm);
 };
 
index 26a9681..47aaf66 100644 (file)
@@ -30,7 +30,7 @@ TEST_F(DefSlotTest, constructor)
 
   ::mock::Def def;
 
-  coco::DefSlot<coco::FeatureObject> slot{&obj_link, &def};
+  coco::DefSlot slot{&obj_link, &def};
 
   ASSERT_EQ(slot.value(), nullptr);
 }
@@ -41,7 +41,7 @@ TEST_F(DefSlotTest, value)
 
   ::mock::Def def;
 
-  coco::DefSlot<coco::FeatureObject> slot{&obj_link, &def};
+  coco::DefSlot slot{&obj_link, &def};
 
   slot.value(o);
 
@@ -60,7 +60,7 @@ TEST_F(DefSlotTest, unlink_on_destruction)
 
   ::mock::Def def;
 
-  auto slot = make_unique<coco::DefSlot<coco::FeatureObject>>(&obj_link, &def);
+  auto slot = make_unique<coco::DefSlot>(&obj_link, &def);
 
   slot->value(o);
   ASSERT_EQ(o->def(), &def);
index 8f37af8..7da448d 100644 (file)
@@ -1,6 +1,8 @@
 #include "coco/IR/Instr.h"
 #include "coco/IR/Block.h"
 
+#include <cassert>
+
 namespace coco
 {
 
@@ -23,4 +25,15 @@ FeatureInstr::FeatureInstr(const PtrLink<Object, ObjectInfo> *obj_link)
 void FeatureInstr::ifm(FeatureObject *ifm) { _ifm.value(ifm); }
 void FeatureInstr::ofm(FeatureObject *ofm) { _ofm.value(ofm); }
 
+FeatureObject *FeatureInstr::ofm(void) const
+{
+  if (auto obj = _ofm.value())
+  {
+    assert(obj->asFeature() != nullptr);
+    return obj->asFeature();
+  }
+
+  return nullptr;
+}
+
 } // namespace coco