class FeatureObject final : public Object
{
public:
- explicit FeatureObject(const nncc::core::ADT::feature::Shape &shape);
+ explicit FeatureObject(const PtrLink<Bag, BagInfo> *link, const nncc::core::ADT::feature::Shape &shape);
public:
virtual ~FeatureObject() = default;
class KernelObject final : public Object
{
public:
- explicit KernelObject(const nncc::core::ADT::kernel::Shape &shape);
+ explicit KernelObject(const PtrLink<Bag, BagInfo> *link, const nncc::core::ADT::kernel::Shape &shape);
public:
virtual ~KernelObject() = default;
#include "coco/IR/FeatureObject.forward.h"
#include "coco/IR/KernelObject.forward.h"
+#include "coco/ADT/PtrLink.h"
+
namespace coco
{
class Object
{
public:
- Object();
+ Object(const PtrLink<Bag, BagInfo> *link);
public:
virtual ~Object() = default;
+private:
+ const PtrLink<Bag, BagInfo> * const _link;
+
protected:
virtual void onUpdate(Bag *) { return; }
namespace coco
{
-FeatureObject::FeatureObject(const nncc::core::ADT::feature::Shape &shape) : _shape{shape}
+FeatureObject::FeatureObject(const PtrLink<Bag, BagInfo> *link, const nncc::core::ADT::feature::Shape &shape)
+ : Object{link}, _shape{shape}
{
_map.resize(nncc::core::ADT::feature::num_elements(shape));
}
TEST(IR_FEATURE_OBJECT, ctor_should_set_size)
{
+ coco::PtrLink<coco::Bag, coco::BagInfo> link;
+
const nncc::core::ADT::feature::Shape shape{1, 3, 3};
- const coco::FeatureObject o{shape};
+ const coco::FeatureObject o{&link, shape};
ASSERT_EQ(o.shape(), shape);
}
TEST(IR_FEATURE_OBJECT, at)
{
+ coco::PtrLink<coco::Bag, coco::BagInfo> link;
+
const uint32_t C = 1;
const uint32_t H = 3;
const uint32_t W = 3;
const nncc::core::ADT::feature::Shape shape{C, H, W};
- coco::FeatureObject o{shape};
+ coco::FeatureObject o{&link, shape};
coco::FeatureObject *mutable_ptr = &o;
const coco::FeatureObject *immutable_ptr = &o;
TEST(IR_FEATURE_OBJECT, asFeature)
{
+ coco::PtrLink<coco::Bag, coco::BagInfo> link;
+
const nncc::core::ADT::feature::Shape shape{1, 3, 3};
- coco::FeatureObject o{shape};
+ coco::FeatureObject o{&link, shape};
coco::Object *mutable_object = &o;
const coco::Object *immutable_object = &o;
namespace coco
{
-KernelObject::KernelObject(const nncc::core::ADT::kernel::Shape &shape) : _shape{shape}
+KernelObject::KernelObject(const PtrLink<Bag, BagInfo> *link, const nncc::core::ADT::kernel::Shape &shape)
+ : Object{link}, _shape{shape}
{
_map.resize(nncc::core::ADT::kernel::num_elements(shape));
}
TEST(IR_KERNEL_OBJECT, ctor_should_set_size)
{
+ coco::PtrLink<coco::Bag, coco::BagInfo> link;
+
const nncc::core::ADT::kernel::Shape shape{1, 1, 3, 3};
- const coco::KernelObject o{shape};
+ const coco::KernelObject o{&link, shape};
// TODO Use ASSERT_EQ(o.shape(), shape) (operator== overload is not yet available)
ASSERT_EQ(o.shape().depth(), shape.depth());
TEST(IR_KERNEL_OBJECT, asKernel)
{
+ coco::PtrLink<coco::Bag, coco::BagInfo> link;
+
const nncc::core::ADT::kernel::Shape shape{1, 1, 3, 3};
- coco::KernelObject o{shape};
+ coco::KernelObject o{&link, shape};
coco::Object *mutable_object = &o;
const coco::Object *immutable_object = &o;
TEST(IR_KERNEL_OBJECT, at)
{
+ coco::PtrLink<coco::Bag, coco::BagInfo> link;
+
const uint32_t N = 1;
const uint32_t C = 1;
const uint32_t H = 3;
const uint32_t W = 3;
const nncc::core::ADT::kernel::Shape shape{N, C, H, W};
- coco::KernelObject o{shape};
+ coco::KernelObject o{&link, shape};
coco::KernelObject *mutable_ptr = &o;
const coco::KernelObject *immutable_ptr = &o;
#include "coco/IR/Object.h"
+#include <cassert>
+#include <stdexcept>
+
namespace coco
{
-Object::Object() : _bag{nullptr}
+Object::Object(const PtrLink<Bag, BagInfo> *link) : _link{link}, _bag{nullptr}
{
// DO NOTHING
}
void Object::bag(coco::Bag *bag)
{
- // TODO Update bag-object relation
- _bag = bag;
- // Notify descendant
- onUpdate(bag);
+ if (_bag != nullptr)
+ {
+ throw std::runtime_error{"Bag unlink is not supported, yet"};
+ }
+
+ assert(_bag == nullptr);
+
+ if (bag != nullptr)
+ {
+ // TODO Update bag-object relation
+ _bag = bag;
+ // Notify descendant
+ onUpdate(bag);
+
+ auto bag_info = _link->find(_bag);
+ assert(bag_info != nullptr);
+ bag_info->object()->insert(this);
+ }
}
} // namespace coco
#include "coco/IR/Object.h"
+#include "coco/IR/BagManager.h"
#include <vector>
struct DummyObject : public coco::Object
{
public:
- DummyObject(std::vector<coco::Bag *> &updates) : _updates(updates)
+ DummyObject(const coco::PtrLink<coco::Bag, coco::BagInfo> *link, std::vector<coco::Bag *> &updates)
+ : coco::Object{link}, _updates(updates)
{
// DO NOTHING
}
TEST(IR_OBJECT, ctor)
{
- coco::Object obj{};
+ coco::PtrLink<coco::Bag, coco::BagInfo> link;
+ coco::Object obj{&link};
// Newly created object should not have a backing bag
ASSERT_EQ(obj.bag(), nullptr);
TEST(IR_OBJECT, bag_update)
{
- std::vector<coco::Bag *> updates;
+ coco::PtrLink<coco::Bag, coco::BagInfo> link;
+
+ // Prepare bag
+ coco::BagManager bag_mgr{&link};
+
+ auto bag = bag_mgr.create(1);
- coco::Bag bag{1};
- DummyObject obj{updates};
+ // Test 'Object' class through 'DummyObject'
+ std::vector<coco::Bag *> updates;
+ DummyObject obj{&link, updates};
- obj.bag(&bag);
+ obj.bag(bag);
// 'bag(Bag *)' should affect the return of 'bag(void)'
- ASSERT_EQ(obj.bag(), &bag);
+ ASSERT_EQ(obj.bag(), bag);
ASSERT_EQ(updates.size(), 1);
+
+ // 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()->at(0), &obj);
}
FeatureObject *ObjectManager::create(const nncc::core::ADT::feature::Shape &shape)
{
- return take(make_unique<FeatureObject>(shape));
+ return take(make_unique<FeatureObject>(_link, shape));
}
KernelObject *ObjectManager::create(const nncc::core::ADT::kernel::Shape &shape)
{
- return take(make_unique<KernelObject>(shape));
+ return take(make_unique<KernelObject>(_link, shape));
}
} // namespace coco