[nest] Add 'DerefNode' class (#685)
author박종현/동작제어Lab(SR)/Staff Engineer/삼성전자 <jh1302.park@samsung.com>
Tue, 17 Jul 2018 07:53:15 +0000 (16:53 +0900)
committerGitHub Enterprise <noreply-CODE@samsung.com>
Tue, 17 Jul 2018 07:53:15 +0000 (16:53 +0900)
This commit adds 'DerefNode' class under nest::expr namesapce.
'DerefNode' class serves as an internal representation of the
dereference expression (read a value from a domain with specific
indicies).

Signed-off-by: Jonghyun Park <jh1302.park@samsung.com>
contrib/nest/include/nest/Expr.h
contrib/nest/include/nest/expr/DerefNode.h [new file with mode: 0644]
contrib/nest/include/nest/expr/Node.def
contrib/nest/src/expr/DerefNode.test.cpp [new file with mode: 0644]

index 66b2e43..aef73b3 100644 (file)
@@ -5,6 +5,7 @@
 #include "nest/expr/Visitor.h"
 
 #include "nest/expr/VarNode.h"
+#include "nest/expr/DerefNode.h"
 
 #include <memory>
 
diff --git a/contrib/nest/include/nest/expr/DerefNode.h b/contrib/nest/include/nest/expr/DerefNode.h
new file mode 100644 (file)
index 0000000..c6ef591
--- /dev/null
@@ -0,0 +1,38 @@
+#ifndef __NEXT_EXPR_DEREF_NODE_H__
+#define __NEXT_EXPR_DEREF_NODE_H__
+
+#include "nest/DomainID.h"
+
+#include "nest/expr/Subscript.h"
+
+namespace nest
+{
+namespace expr
+{
+
+class DerefNode final : public Node
+{
+public:
+  template <typename... Args>
+  DerefNode(const DomainID &id, Args &&... indicies)
+      : _id{id}, _sub{std::forward<Args>(indicies)...}
+  {
+    // DO NOTHING
+  }
+
+public:
+  const DerefNode *asDeref(void) const override { return this; }
+
+public:
+  const DomainID &id(void) const { return _id; }
+  const Subscript &sub(void) const { return _sub; }
+
+private:
+  DomainID const _id;
+  Subscript const _sub;
+};
+
+} // namespace expr
+} // namespace nest
+
+#endif // __NEXT_EXPR_DEREF_NODE_H__
diff --git a/contrib/nest/src/expr/DerefNode.test.cpp b/contrib/nest/src/expr/DerefNode.test.cpp
new file mode 100644 (file)
index 0000000..37543ad
--- /dev/null
@@ -0,0 +1,23 @@
+#include "nest/expr/DerefNode.h"
+
+#include <memory>
+
+#include <gtest/gtest.h>
+
+namespace
+{
+struct DummyNode final : public nest::expr::Node
+{
+};
+}
+
+TEST(DEREF_NODE, cast)
+{
+  const nest::DomainID dom_id{0};
+
+  auto derived = std::make_shared<nest::expr::DerefNode>(dom_id, std::make_shared<DummyNode>());
+  std::shared_ptr<nest::expr::Node> base = derived;
+
+  ASSERT_NE(derived.get(), nullptr);
+  ASSERT_EQ(base->asDeref(), derived.get());
+}