[coco] Refine Bag::updates method interface (#1448)
author박종현/동작제어Lab(SR)/Staff Engineer/삼성전자 <jh1302.park@samsung.com>
Tue, 11 Sep 2018 08:37:24 +0000 (17:37 +0900)
committerGitHub Enterprise <noreply-CODE@samsung.com>
Tue, 11 Sep 2018 08:37:24 +0000 (17:37 +0900)
This commit changes Bag::updates method signature to support
constant-time access over Update links.

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

index 3e7c72c..d9a54a8 100644 (file)
@@ -6,6 +6,7 @@
 #include "coco/IR/ObjectSet.h"
 #include "coco/IR/DepSet.h"
 #include "coco/IR/ReadSet.h"
+#include "coco/IR/UpdateSet.h"
 #include "coco/IR/Locatable.h"
 
 #include <set>
@@ -61,8 +62,8 @@ public:
   const DepSet *deps(void) const;
   // @brief Return the set of Read links that point to this bag
   const ReadSet *reads(void) const;
-  // WARN This method will be dpercated. Please use below "updaters" instead
-  UpdaterSet updates(void) const;
+  // @brief Return the set of Update links that point to this bag
+  const UpdateSet *updates(void) const;
 
 private:
   std::unique_ptr<BagInfo> _info;
diff --git a/contrib/coco/core/include/coco/IR/Update.forward.h b/contrib/coco/core/include/coco/IR/Update.forward.h
new file mode 100644 (file)
index 0000000..9325e44
--- /dev/null
@@ -0,0 +1,11 @@
+#ifndef __COCO_IR_UPDATE_FORWARD_H__
+#define __COCO_IR_UPDATE_FORWARD_H__
+
+namespace coco
+{
+
+class Update;
+
+} // namespace coco
+
+#endif // __COCO_IR_UPDATE_FORWARD_H__
index ae36245..5dfc18d 100644 (file)
@@ -1,7 +1,7 @@
 #ifndef __COCO_IR_UPDATE_SET_H__
 #define __COCO_IR_UPDATE_SET_H__
 
-#include "coco/IR/Update.h"
+#include "coco/IR/Update.forward.h"
 
 #include <set>
 
index bd4d621..e3faf4c 100644 (file)
@@ -3,6 +3,7 @@
 
 #include "coco/IR/Object.h"
 #include "coco/IR/Read.h"
+#include "coco/IR/Update.h"
 
 #include <nncc/foundation/Memory.h>
 
@@ -26,28 +27,7 @@ bool Bag::isOutput(void) const { return _info->mask()->masked(BagMask::Output);
 
 const DepSet *Bag::deps(void) const { return _info->deps(); }
 const ReadSet *Bag::reads(void) const { return _info->reads(); }
-
-Bag::UpdaterSet Bag::updates(void) const
-{
-  Bag::UpdaterSet res;
-
-  for (auto obj : dependent_objects(this))
-  {
-    if (obj->def())
-    {
-      res.insert(obj->def());
-    }
-  }
-
-  for (auto update : *_info->updates())
-  {
-    auto updater = update->updater();
-    assert(updater != nullptr);
-    res.insert(updater);
-  }
-
-  return res;
-}
+const UpdateSet *Bag::updates(void) const { return _info->updates(); }
 
 ObjectSet dependent_objects(const Bag *b)
 {
@@ -86,6 +66,26 @@ Bag::ReaderSet readers(const Bag *b)
   return res;
 }
 
-Bag::UpdaterSet updaters(const Bag *b) { return b->updates(); }
+Bag::UpdaterSet updaters(const Bag *b)
+{
+  Bag::UpdaterSet res;
+
+  for (auto obj : dependent_objects(b))
+  {
+    if (obj->def())
+    {
+      res.insert(obj->def());
+    }
+  }
+
+  for (auto update : *b->updates())
+  {
+    auto updater = update->updater();
+    assert(updater != nullptr);
+    res.insert(updater);
+  }
+
+  return res;
+}
 
 } // namespace coco
index dbb3409..04263f1 100644 (file)
@@ -15,5 +15,5 @@ TEST(IR_BAG, ctor_should_set_size)
 
   // Bag has no read/updates at the beginning
   EXPECT_EQ(b.reads()->size(), 0);
-  EXPECT_EQ(b.updates().size(), 0);
+  EXPECT_EQ(b.updates()->size(), 0);
 }
index 84c0e03..21c5c6c 100644 (file)
@@ -40,22 +40,14 @@ TEST_F(UpdateTest, value)
 
   ASSERT_EQ(slot.bag(), bag);
 
-  {
-    auto updates = bag->updates();
-
-    ASSERT_EQ(updates.size(), 1);
-    ASSERT_NE(updates.find(&update), updates.end());
-  }
+  ASSERT_EQ(bag->updates()->size(), 1);
+  ASSERT_NE(bag->updates()->find(&slot), bag->updates()->end());
 
   slot.bag(nullptr);
 
-  {
-    auto updates = bag->updates();
-
-    ASSERT_EQ(slot.bag(), nullptr);
+  ASSERT_EQ(slot.bag(), nullptr);
 
-    ASSERT_EQ(updates.size(), 0);
-  }
+  ASSERT_EQ(bag->updates()->size(), 0);
 }
 
 TEST_F(UpdateTest, unlink_on_destruction)
@@ -67,8 +59,8 @@ TEST_F(UpdateTest, unlink_on_destruction)
   {
     coco::Update update{&bag_link, &updater};
     update.bag(bag);
-    ASSERT_EQ(bag->updates().size(), 1);
+    ASSERT_EQ(bag->updates()->size(), 1);
   }
 
-  ASSERT_EQ(bag->updates().size(), 0);
+  ASSERT_EQ(bag->updates()->size(), 0);
 }