[coco] Maintain Dep(s) instead of Object(s) (#1424)
author박종현/동작제어Lab(SR)/Staff Engineer/삼성전자 <jh1302.park@samsung.com>
Tue, 11 Sep 2018 00:35:31 +0000 (09:35 +0900)
committerGitHub Enterprise <noreply-CODE@samsung.com>
Tue, 11 Sep 2018 00:35:31 +0000 (09:35 +0900)
As the first step to support Bag substitution, this commit revises
BagInfo to internally maintain a list of Dep(s) in each dependent
Object instead of Object itself.

Signed-off-by: Jonghyun Park <jh1302.park@samsung.com>
contrib/coco/core/include/coco/IR/BagInfo.h
contrib/coco/core/include/coco/IR/DepSet.h [new file with mode: 0644]
contrib/coco/core/src/IR/Bag.cpp
contrib/coco/core/src/IR/Dep.cpp
contrib/coco/core/src/IR/Object.test.cpp

index ba77cff..aaf4a0b 100644 (file)
@@ -2,7 +2,7 @@
 #define __COCO_IR_BAG_INFO_H__
 
 #include "coco/IR/Bag.h"
-#include "coco/IR/ObjectSet.h"
+#include "coco/IR/DepSet.h"
 
 #include <set>
 
@@ -55,11 +55,8 @@ private:
   uint32_t const _size;
 
 public:
-  ObjectSet *object(void) { return &_object; }
-  const ObjectSet *object(void) const { return &_object; }
-
-private:
-  ObjectSet _object;
+  DepSet *deps(void) { return &_deps; }
+  const DepSet *deps(void) const { return &_deps; }
 
 public:
   Bag::ReaderSet *reads(void) { return &_reads; }
@@ -74,6 +71,8 @@ public:
   const BagMask *mask(void) const { return &_mask; }
 
 private:
+  /** @brief Links to dependent Object(s) */
+  DepSet _deps;
   /** @brief Direct reads (not through Object) */
   Bag::ReaderSet _reads;
   /** @brief Direct updates (not through Object) */
diff --git a/contrib/coco/core/include/coco/IR/DepSet.h b/contrib/coco/core/include/coco/IR/DepSet.h
new file mode 100644 (file)
index 0000000..3b27c95
--- /dev/null
@@ -0,0 +1,15 @@
+#ifndef __COCO_IR_DEP_SET_H__
+#define __COCO_IR_DEP_SET_H__
+
+#include "coco/IR/Dep.h"
+
+#include <set>
+
+namespace coco
+{
+
+using DepSet = std::set<Dep *>;
+
+} // namespace coco
+
+#endif // __COCO_IR_DEP_SET_H__
index 84188f4..366912c 100644 (file)
@@ -23,7 +23,20 @@ uint32_t Bag::size(void) const { return _info->size(); }
 bool Bag::isInput(void) const { return _info->mask()->masked(BagMask::Input); }
 bool Bag::isOutput(void) const { return _info->mask()->masked(BagMask::Output); }
 
-ObjectSet Bag::deps(void) const { return *_info->object(); }
+ObjectSet Bag::deps(void) const
+{
+  ObjectSet res;
+
+  for (const auto &dep : *(_info->deps()))
+  {
+    if (auto obj = dep->object())
+    {
+      res.insert(obj);
+    }
+  }
+
+  return res;
+}
 
 Bag::ReaderSet Bag::reads(void) const
 {
index cf3569e..6951111 100644 (file)
@@ -13,14 +13,14 @@ void Dep::bag(Bag *bag)
 {
   if (_bag != nullptr)
   {
-    // Remove bag <-> object link (if possible)
-    if (_link && _object)
+    // Remove bag <-> dep link (if possible)
+    if (_link)
     {
       auto info = _link->find(_bag);
       assert(info != nullptr);
-      assert(info->object()->find(_object) != info->object()->end());
+      assert(info->deps()->find(this) != info->deps()->end());
 
-      info->object()->erase(_object);
+      info->deps()->erase(this);
     }
 
     // Reset _bag
@@ -34,12 +34,12 @@ void Dep::bag(Bag *bag)
     // Set _bag
     _bag = bag;
 
-    // Create bag <-> object link (if possible)
-    if (_link && _object)
+    // Create bag <-> dep link (if possible)
+    if (_link)
     {
       auto info = _link->find(bag);
       assert(info != nullptr);
-      info->object()->insert(_object);
+      info->deps()->insert(this);
     }
   }
 
index dde0216..0411ddc 100644 (file)
@@ -74,12 +74,6 @@ TEST_F(ObjectTest, bag_update)
   // 'bag(Bag *)' should affect the return of 'bag(void)'
   ASSERT_EQ(obj.bag(), bag);
 
-  // The dependent object list of each bag should be updated on 'bag(...)' call.
-  auto bag_info = link.find(bag);
-
-  ASSERT_EQ(bag_info->object()->size(), 1);
-  ASSERT_EQ(bag_info->object()->count(&obj), 1);
-
   // User SHOULD be able to access dependent objects through 'bag'
   {
     auto deps = bag->deps();