aboutsummaryrefslogtreecommitdiffstats
path: root/src/engine/Node.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'src/engine/Node.cpp')
-rw-r--r--src/engine/Node.cpp66
1 files changed, 33 insertions, 33 deletions
diff --git a/src/engine/Node.cpp b/src/engine/Node.cpp
index 4de00d2..d8d89b9 100644
--- a/src/engine/Node.cpp
+++ b/src/engine/Node.cpp
@@ -53,16 +53,16 @@ Node::Node(const Node& copy)
{
for (Edges::const_iterator i = copy._edges.begin(); i != copy._edges.end();
++i) {
- SharedPtr<Edge> edge(new Edge(*i->get()));
- _edges.push_back(edge);
+ SPtr<Edge> edge(new Edge(*i->get()));
+ _edges.insert(edge);
}
}
/** Always returns an edge, unless there are none */
-SharedPtr<Edge>
+SPtr<Edge>
Node::random_edge()
{
- SharedPtr<Edge> ret;
+ SPtr<Edge> ret;
if (_edges.empty()) {
return ret;
}
@@ -115,14 +115,14 @@ Node::set_selector(bool yn)
}
void
-Node::set_enter_action(SharedPtr<Action> action)
+Node::set_enter_action(SPtr<Action> action)
{
_enter_action = action;
_changed = true;
}
void
-Node::set_exit_action(SharedPtr<Action> action)
+Node::set_exit_action(SPtr<Action> action)
{
_exit_action = action;
_changed = true;
@@ -156,52 +156,52 @@ Node::exit(MIDISink* sink, TimeStamp time)
_enter_time = 0;
}
-void
-Node::add_edge(SharedPtr<Edge> edge)
+SPtr<Edge>
+Node::edge_to(SPtr<Node> head) const
{
- assert(edge->tail().lock().get() == this);
+ // TODO: Make logarithmic
for (Edges::const_iterator i = _edges.begin(); i != _edges.end(); ++i) {
- if ((*i)->head() == edge->head()) {
- return;
+ if ((*i)->head() == head) {
+ return *i;
}
}
+ return SPtr<Edge>();
+}
+
+void
+Node::add_edge(SPtr<Edge> edge)
+{
+ assert(edge->tail().lock().get() == this);
+ if (edge_to(edge->head())) {
+ return;
+ }
- _edges.push_back(edge);
+ _edges.insert(edge);
edges_changed();
}
void
-Node::remove_edge(SharedPtr<Edge> edge)
+Node::remove_edge(SPtr<Edge> edge)
{
- _edges.erase(std::find(_edges.begin(), _edges.end(), edge));
+ _edges.erase(edge);
edges_changed();
}
bool
-Node::connected_to(SharedPtr<Node> node)
+Node::connected_to(SPtr<Node> node)
{
- for (Edges::const_iterator i = _edges.begin(); i != _edges.end(); ++i) {
- if ((*i)->head() == node) {
- return true;
- }
- }
-
- return false;
+ return bool(edge_to(node));
}
-SharedPtr<Edge>
-Node::remove_edge_to(SharedPtr<Node> node)
+SPtr<Edge>
+Node::remove_edge_to(SPtr<Node> node)
{
- for (Edges::iterator i = _edges.begin(); i != _edges.end(); ++i) {
- if ((*i)->head() == node) {
- SharedPtr<Edge> edge(*i);
- _edges.erase(i);
- edges_changed();
- return edge;
- }
+ SPtr<Edge> edge = edge_to(node);
+ if (edge) {
+ _edges.erase(edge); // TODO: avoid double search
+ edges_changed();
}
-
- return SharedPtr<Edge>();
+ return edge;
}
void