--- /dev/null
+#include "Set.h"
+
+namespace neurun
+{
+namespace graph
+{
+namespace operand
+{
+
+Index Set::append(const ::internal::tflite::operand::Shape &shape)
+{
+ uint32_t index = _objects.size();
+
+ _objects.emplace_back(new ::internal::tflite::operand::Object{shape});
+
+ return Index{index};
+}
+
+const ::internal::tflite::operand::Object &Set::at(const Index &index) const
+{
+ return *(_objects.at(index.asInt()));
+}
+
+::internal::tflite::operand::Object &Set::at(const Index &index)
+{
+ return *(_objects.at(index.asInt()));
+}
+
+bool Set::exist(const Index &index) const { return index.asInt() < _objects.size(); }
+
+} // namespace operand
+} // namespace graph
+} // namespace neurun
--- /dev/null
+#ifndef __NEURUN_GRAPH_OPERAND_SET_H__
+#define __NEURUN_GRAPH_OPERAND_SET_H__
+
+#include <memory>
+#include <vector>
+
+#include "internal/Model.h"
+#include "Index.h"
+
+namespace neurun
+{
+namespace graph
+{
+namespace operand
+{
+
+class Set
+{
+public:
+ Set() = default;
+
+public:
+ Index append(const ::internal::tflite::operand::Shape &);
+
+public:
+ const ::internal::tflite::operand::Object &at(const Index &) const;
+ ::internal::tflite::operand::Object &at(const Index &);
+ bool exist(const Index &) const;
+
+private:
+ std::vector<std::unique_ptr<::internal::tflite::operand::Object>> _objects;
+};
+
+} // namespace operand
+} // namespace graph
+} // namespace neurun
+
+#endif // __NEURUN_GRAPH_OPERAND_SET_H__
--- /dev/null
+#include <gtest/gtest.h>
+
+#include "graph/operand/Set.h"
+
+TEST(graph_operand_Set, set_test)
+{
+ neurun::graph::operand::Set set;
+
+ internal::tflite::operand::Shape shape0{3};
+ shape0.dim(0) = 1;
+ shape0.dim(1) = 2;
+ shape0.dim(2) = 3;
+
+ internal::tflite::operand::Shape shape1{4};
+ shape1.dim(0) = 10;
+ shape1.dim(1) = 20;
+ shape1.dim(2) = 30;
+ shape1.dim(3) = 40;
+
+ set.append(shape0);
+ set.append(shape1);
+
+ ASSERT_EQ(set.exist(neurun::graph::operand::Index{0u}), true);
+ ASSERT_EQ(set.exist(neurun::graph::operand::Index{1u}), true);
+ ASSERT_EQ(set.exist(neurun::graph::operand::Index{2u}), false);
+
+ ASSERT_EQ(set.at(neurun::graph::operand::Index{0u}).shape().dim(0), 1);
+ ASSERT_EQ(set.at(neurun::graph::operand::Index{0u}).shape().dim(1), 2);
+ ASSERT_EQ(set.at(neurun::graph::operand::Index{0u}).shape().dim(2), 3);
+}