This commit replaces Bag * inside Object with 'Dep'.
Signed-off-by: Jonghyun Park <jh1302.park@samsung.com>
#define __COCO_IR_OBJECT_H__
#include "coco/IR/Bag.h"
+#include "coco/IR/Dep.h"
#include "coco/IR/ObjectInfo.forward.h"
#include "coco/IR/FeatureObject.forward.h"
virtual void get(ObjectInfo **) const = 0;
void setBagLink(const PtrLink<Bag, BagInfo> *);
-private:
- coco::Bag *_bag;
-
public:
- coco::Bag *bag(void) const { return _bag; }
- void bag(coco::Bag *bag);
+ coco::Bag *bag(void) const { return _dep.bag(); }
+ void bag(coco::Bag *bag) { _dep.bag(bag); }
public:
virtual FeatureObject *asFeature(void) { return nullptr; }
private:
ObjectInfo *info(void) const;
- BagInfo *info(const Bag *) const;
public:
Def *def(void) const;
const User *user(void) const;
private:
- const PtrLink<Bag, BagInfo> *_bag_link;
+ Dep _dep;
};
} // namespace coco
namespace coco
{
-Object::Object() : _bag{nullptr}
+Object::Object()
{
- // DO NOTHING
+ // Register self to Dep
+ _dep.object(this);
}
-void Object::setBagLink(const PtrLink<Bag, BagInfo> *bag_link) { _bag_link = bag_link; }
-
-void Object::bag(coco::Bag *bag)
-{
- if (_bag != nullptr)
- {
- auto bag_info = info(_bag);
- assert(bag_info != nullptr);
- assert(bag_info->object()->find(this) != bag_info->object()->end());
-
- bag_info->object()->erase(this);
-
- _bag = nullptr;
- }
-
- assert(_bag == nullptr);
-
- if (bag != nullptr)
- {
- // TODO Update bag-object relation
- _bag = bag;
-
- auto bag_info = info(_bag);
- assert(bag_info != nullptr);
- bag_info->object()->insert(this);
- }
-}
+void Object::setBagLink(const PtrLink<Bag, BagInfo> *bag_link) { _dep.link(bag_link); }
ObjectInfo *Object::info(void) const
{
return res;
}
-BagInfo *Object::info(const Bag *bag) const
-{
- assert(_bag_link != nullptr);
- return _bag_link->find(bag);
-}
-
Object::Def *Object::def(void) const { return info()->def(); }
const Object::User *Object::user(void) const { return info()->user(); }
ASSERT_EQ(bag->object()->size(), 0);
}
+
+TEST_F(ObjectTest, destructor)
+{
+ auto bag = bag_mgr.create(1);
+
+ // Destruct Object after proper initialization
+ {
+ ::mock::Object obj;
+
+ obj.info = make_unique<coco::ObjectInfo>();
+ obj.link(&link);
+
+ obj.bag(bag);
+ }
+
+ // Object SHOULD be unlinked from Bag on destruction
+ ASSERT_EQ(bag->object()->size(), 0);
+}