aboutsummaryrefslogtreecommitdiffstats
path: root/src/diagram
diff options
context:
space:
mode:
Diffstat (limited to 'src/diagram')
-rw-r--r--src/diagram/branch.cpp (renamed from src/diagram/branchstatement.cpp)4
-rw-r--r--src/diagram/iterator.cpp (renamed from src/diagram/iteratorstatement.cpp)4
-rw-r--r--src/diagram/scope.cpp47
-rw-r--r--src/diagram/statement.cpp41
4 files changed, 84 insertions, 12 deletions
diff --git a/src/diagram/branchstatement.cpp b/src/diagram/branch.cpp
index 6511c6c..ccb17de 100644
--- a/src/diagram/branchstatement.cpp
+++ b/src/diagram/branch.cpp
@@ -1,8 +1,8 @@
-#include "diagram/branchstatement.h"
+#include "diagram/branch.h"
using namespace samb;
-BranchStatement::BranchStatement(Type t, const QString &condition, pointer next) :
+Branch::Branch(Type t, const QString &condition, pointer next) :
Statement(t, condition, next)
{
switch (t) {
diff --git a/src/diagram/iteratorstatement.cpp b/src/diagram/iterator.cpp
index a68234b..43085b4 100644
--- a/src/diagram/iteratorstatement.cpp
+++ b/src/diagram/iterator.cpp
@@ -1,8 +1,8 @@
-#include "diagram/iteratorstatement.h"
+#include "diagram/iterator.h"
using namespace samb;
-IteratorStatement::IteratorStatement(Statement::Type t, const QString &condition, Statement::pointer next) :
+Iterator::Iterator(Statement::Type t, const QString &condition, Statement::pointer next) :
Statement(t, condition, next),
_inner("")
{
diff --git a/src/diagram/scope.cpp b/src/diagram/scope.cpp
index b0f56cf..7f64a0d 100644
--- a/src/diagram/scope.cpp
+++ b/src/diagram/scope.cpp
@@ -1,4 +1,5 @@
#include "diagram/scope.h"
+#include "debugtools.h"
using namespace samb;
@@ -7,6 +8,9 @@ using namespace samb;
Scope::iterator::iterator(Statement::pointer statement) :
_current(statement)
{
+ if (_current == nullptr) {
+ debug_err("invalid iterator interating nullptr");
+ }
}
@@ -15,15 +19,24 @@ Scope::iterator::~iterator()
}
+bool Scope::iterator::operator==(const iterator &other) const
+{
+ return *_current == *other;
+}
+
+bool Scope::iterator::operator!=(const iterator &other) const
+{
+ return !(*_current == *other);
+}
+
Scope::iterator& Scope::iterator::operator++()
{
- if (_current->next() == nullptr) {
- // TODO: remove throw
- throw std::logic_error("Statement::iterator::operator++() m_current->next() is nullptr");
+ if (_current->next() != nullptr) {
+ _current = _current->next();
+ } else {
+ // throw std::logic_error("Statement::iterator::operator++() m_current->next() is nullptr");
}
- _current = _current->next();
-
return *this;
}
@@ -39,7 +52,7 @@ Scope::iterator& Scope::iterator::operator++(int)
Statement& Scope::iterator::operator*() const
{
if (_current == nullptr)
- throw std::logic_error("Statement::iterator::operator*() m_current is nullptr");
+ throw std::logic_error("Scope::iterator::operator*() m_current is nullptr");
return *_current;
}
@@ -56,7 +69,7 @@ Scope::Scope(const QString &label) :
Statement(Statement::Type::SCOPE, label, nullptr),
_head(nullptr), _tail(nullptr)
{
-
+ _head = _tail = new Statement(Statement::PROCESS, "");
}
Scope::Scope(const QString &label, Statement::pointer first) :
@@ -92,3 +105,23 @@ Scope::iterator Scope::erase_after(Scope::iterator it)
return it;
}
+
+Scope::iterator Scope::begin()
+{
+ return iterator(_head);
+}
+
+const Scope::iterator Scope::begin() const
+{
+ return begin();
+}
+
+Scope::iterator Scope::end()
+{
+ return iterator(_tail);
+}
+
+const Scope::iterator Scope::end() const
+{
+ return end();
+}
diff --git a/src/diagram/statement.cpp b/src/diagram/statement.cpp
index eae5cd3..7f1109b 100644
--- a/src/diagram/statement.cpp
+++ b/src/diagram/statement.cpp
@@ -1,9 +1,48 @@
#include "diagram/statement.h"
+#include "diagram/branch.h"
+#include "diagram/iterator.h"
+#include "diagram/scope.h"
+
+#include "debugtools.h"
+
using namespace samb;
/* Statement */
+template<class... Args>
+static Statement::pointer make(Statement::Type t, Args&& ...args)
+{
+ Statement::pointer stat;
+
+ switch (t) {
+ case Statement::Type::PROCESS:
+ stat = new Statement(t, args...);
+ break;
+
+ case Statement::Type::DECISION:
+ case Statement::Type::PARALLEL:
+ case Statement::Type::SWITCH:
+ stat = new Branch(t, args...);
+ break;
+
+ case Statement::Type::WHILE:
+ case Statement::Type::UNTIL:
+ stat = new Iterator(t, args...);
+ break;
+
+ case Statement::Type::SCOPE:
+ stat = new Scope(t, args...);
+ break;
+
+ default:
+ debug_err("invalid type");
+ break;
+ }
+
+ return stat;
+}
+
Statement::Statement(Type t, const QString &text) :
type(t), _text(text), _next(nullptr)
{
@@ -21,7 +60,7 @@ Statement::~Statement()
}
-bool Statement::operator==(const Statement& other) const {
+bool Statement::operator==(const Statement &other) const {
// comparison by pointers
return (this == &other);
}