Welcome to mirror list, hosted at ThFree Co, Russian Federation.

git.blender.org/blender.git - Unnamed repository; edit this file 'description' to name the repository.
summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorSergey Sharybin <sergey.vfx@gmail.com>2016-05-25 14:51:35 +0300
committerSergey Sharybin <sergey.vfx@gmail.com>2016-05-25 14:52:02 +0300
commitcec629ae425d3e2f37f1b0d7ecda84a4233e5438 (patch)
tree3e136dac808915da70a928792e8df607e81173c2
parentf83f7bb98848eb9d0c0a2fa773df985454a96690 (diff)
Depsgraph: Simplify some loops using foreach()
-rw-r--r--source/blender/depsgraph/intern/depsgraph.cc7
-rw-r--r--source/blender/depsgraph/intern/depsgraph_build.cc25
-rw-r--r--source/blender/depsgraph/intern/depsgraph_debug.cc85
-rw-r--r--source/blender/depsgraph/intern/depsgraph_eval.cc25
-rw-r--r--source/blender/depsgraph/intern/depsgraph_tag.cc13
-rw-r--r--source/blender/depsgraph/intern/depsnode.cc7
-rw-r--r--source/blender/depsgraph/util/depsgraph_util_foreach.h51
7 files changed, 86 insertions, 127 deletions
diff --git a/source/blender/depsgraph/intern/depsgraph.cc b/source/blender/depsgraph/intern/depsgraph.cc
index d293d03f63d..87dbb2333a6 100644
--- a/source/blender/depsgraph/intern/depsgraph.cc
+++ b/source/blender/depsgraph/intern/depsgraph.cc
@@ -55,6 +55,7 @@ extern "C" {
#include "depsnode_operation.h"
#include "depsnode_component.h"
#include "depsgraph_intern.h"
+#include "depsgraph_util_foreach.h"
static DEG_EditorUpdateIDCb deg_editor_update_id_cb = NULL;
static DEG_EditorUpdateSceneCb deg_editor_update_scene_cb = NULL;
@@ -295,11 +296,7 @@ void Depsgraph::remove_subgraph_node(SubgraphDepsNode *subgraph_node)
void Depsgraph::clear_subgraph_nodes()
{
- for (Subgraphs::iterator it = subgraphs.begin();
- it != subgraphs.end();
- ++it)
- {
- SubgraphDepsNode *subgraph_node = *it;
+ foreach (SubgraphDepsNode *subgraph_node, subgraphs) {
OBJECT_GUARDED_DELETE(subgraph_node, SubgraphDepsNode);
}
subgraphs.clear();
diff --git a/source/blender/depsgraph/intern/depsgraph_build.cc b/source/blender/depsgraph/intern/depsgraph_build.cc
index 877ce6e52e9..fed1433840e 100644
--- a/source/blender/depsgraph/intern/depsgraph_build.cc
+++ b/source/blender/depsgraph/intern/depsgraph_build.cc
@@ -100,6 +100,7 @@ extern "C" {
#include "depsgraph_intern.h"
#include "depsgraph_util_cycle.h"
+#include "depsgraph_util_foreach.h"
#include "depsgraph_util_transitive.h"
/* ****************** */
@@ -184,18 +185,10 @@ static void deg_graph_build_finalize(Depsgraph *graph)
{
std::stack<OperationDepsNode *> stack;
- for (Depsgraph::OperationNodes::const_iterator it_op = graph->operations.begin();
- it_op != graph->operations.end();
- ++it_op)
- {
- OperationDepsNode *node = *it_op;
+ foreach (OperationDepsNode *node, graph->operations) {
node->done = 0;
node->num_links_pending = 0;
- for (OperationDepsNode::Relations::const_iterator it_rel = node->inlinks.begin();
- it_rel != node->inlinks.end();
- ++it_rel)
- {
- DepsRelation *rel = *it_rel;
+ foreach (DepsRelation *rel, node->inlinks) {
if ((rel->from->type == DEPSNODE_TYPE_OPERATION) &&
(rel->flag & DEPSREL_FLAG_CYCLIC) == 0)
{
@@ -212,11 +205,7 @@ static void deg_graph_build_finalize(Depsgraph *graph)
while (!stack.empty()) {
OperationDepsNode *node = stack.top();
if (node->done == 0 && node->outlinks.size() != 0) {
- for (OperationDepsNode::Relations::const_iterator it_rel = node->outlinks.begin();
- it_rel != node->outlinks.end();
- ++it_rel)
- {
- DepsRelation *rel = *it_rel;
+ foreach (DepsRelation *rel, node->outlinks) {
if (rel->to->type == DEPSNODE_TYPE_OPERATION) {
OperationDepsNode *to = (OperationDepsNode *)rel->to;
if ((rel->flag & DEPSREL_FLAG_CYCLIC) == 0) {
@@ -233,11 +222,7 @@ static void deg_graph_build_finalize(Depsgraph *graph)
else {
stack.pop();
IDDepsNode *id_node = node->owner->owner;
- for (OperationDepsNode::Relations::const_iterator it_rel = node->outlinks.begin();
- it_rel != node->outlinks.end();
- ++it_rel)
- {
- DepsRelation *rel = *it_rel;
+ foreach (DepsRelation *rel, node->outlinks) {
if (rel->to->type == DEPSNODE_TYPE_OPERATION) {
OperationDepsNode *to = (OperationDepsNode *)rel->to;
IDDepsNode *id_to = to->owner->owner;
diff --git a/source/blender/depsgraph/intern/depsgraph_debug.cc b/source/blender/depsgraph/intern/depsgraph_debug.cc
index efb3e330857..5d21effe0f6 100644
--- a/source/blender/depsgraph/intern/depsgraph_debug.cc
+++ b/source/blender/depsgraph/intern/depsgraph_debug.cc
@@ -55,6 +55,7 @@ extern "C" {
#include "depsnode_component.h"
#include "depsnode_operation.h"
#include "depsgraph_intern.h"
+#include "depsgraph_util_foreach.h"
/* ****************** */
/* Graphviz Debugging */
@@ -1018,33 +1019,18 @@ bool DEG_debug_scene_relations_validate(Main *bmain,
bool DEG_debug_consistency_check(Depsgraph *graph)
{
/* Validate links exists in both directions. */
- for (Depsgraph::OperationNodes::const_iterator it_op = graph->operations.begin();
- it_op != graph->operations.end();
- ++it_op)
- {
- OperationDepsNode *node = *it_op;
- for (OperationDepsNode::Relations::const_iterator it_rel = node->outlinks.begin();
- it_rel != node->outlinks.end();
- ++it_rel)
- {
- DepsRelation *rel = *it_rel;
-
+ foreach (OperationDepsNode *node, graph->operations) {
+ foreach (DepsRelation *rel, node->outlinks) {
int counter1 = 0;
- for (OperationDepsNode::Relations::const_iterator tmp_rel = node->outlinks.begin();
- tmp_rel != node->outlinks.end();
- ++tmp_rel)
- {
- if (*tmp_rel == rel) {
+ foreach (DepsRelation *tmp_rel, node->outlinks) {
+ if (tmp_rel == rel) {
++counter1;
}
}
int counter2 = 0;
- for (OperationDepsNode::Relations::const_iterator tmp_rel = rel->to->inlinks.begin();
- tmp_rel != rel->to->inlinks.end();
- ++tmp_rel)
- {
- if (*tmp_rel == rel) {
+ foreach (DepsRelation *tmp_rel, rel->to->inlinks) {
+ if (tmp_rel == rel) {
++counter2;
}
}
@@ -1057,33 +1043,18 @@ bool DEG_debug_consistency_check(Depsgraph *graph)
}
}
- for (Depsgraph::OperationNodes::const_iterator it_op = graph->operations.begin();
- it_op != graph->operations.end();
- ++it_op)
- {
- OperationDepsNode *node = *it_op;
- for (OperationDepsNode::Relations::const_iterator it_rel = node->inlinks.begin();
- it_rel != node->inlinks.end();
- ++it_rel)
- {
- DepsRelation *rel = *it_rel;
-
+ foreach (OperationDepsNode *node, graph->operations) {
+ foreach (DepsRelation *rel, node->inlinks) {
int counter1 = 0;
- for (OperationDepsNode::Relations::const_iterator tmp_rel = node->inlinks.begin();
- tmp_rel != node->inlinks.end();
- ++tmp_rel)
- {
- if (*tmp_rel == rel) {
+ foreach (DepsRelation *tmp_rel, node->inlinks) {
+ if (tmp_rel == rel) {
++counter1;
}
}
int counter2 = 0;
- for (OperationDepsNode::Relations::const_iterator tmp_rel = rel->from->outlinks.begin();
- tmp_rel != rel->from->outlinks.end();
- ++tmp_rel)
- {
- if (*tmp_rel == rel) {
+ foreach (DepsRelation *tmp_rel, rel->from->outlinks) {
+ if (tmp_rel == rel) {
++counter2;
}
}
@@ -1096,30 +1067,18 @@ bool DEG_debug_consistency_check(Depsgraph *graph)
}
/* Validate node valency calculated in both directions. */
- for (Depsgraph::OperationNodes::const_iterator it_op = graph->operations.begin();
- it_op != graph->operations.end();
- ++it_op)
- {
- OperationDepsNode *node = *it_op;
+ foreach (OperationDepsNode *node, graph->operations) {
node->num_links_pending = 0;
node->done = 0;
}
- for (Depsgraph::OperationNodes::const_iterator it_op = graph->operations.begin();
- it_op != graph->operations.end();
- ++it_op)
- {
- OperationDepsNode *node = *it_op;
+ foreach (OperationDepsNode *node, graph->operations) {
if (node->done) {
printf("Node %s is twice in the operations!\n",
node->identifier().c_str());
return false;
}
- for (OperationDepsNode::Relations::const_iterator it_rel = node->outlinks.begin();
- it_rel != node->outlinks.end();
- ++it_rel)
- {
- DepsRelation *rel = *it_rel;
+ foreach (DepsRelation *rel, node->outlinks) {
if (rel->to->type == DEPSNODE_TYPE_OPERATION) {
OperationDepsNode *to = (OperationDepsNode *)rel->to;
BLI_assert(to->num_links_pending < to->inlinks.size());
@@ -1129,17 +1088,9 @@ bool DEG_debug_consistency_check(Depsgraph *graph)
node->done = 1;
}
- for (Depsgraph::OperationNodes::const_iterator it_op = graph->operations.begin();
- it_op != graph->operations.end();
- ++it_op)
- {
- OperationDepsNode *node = *it_op;
+ foreach (OperationDepsNode *node, graph->operations) {
int num_links_pending = 0;
- for (OperationDepsNode::Relations::const_iterator it_rel = node->inlinks.begin();
- it_rel != node->inlinks.end();
- ++it_rel)
- {
- DepsRelation *rel = *it_rel;
+ foreach (DepsRelation *rel, node->inlinks) {
if (rel->from->type == DEPSNODE_TYPE_OPERATION) {
++num_links_pending;
}
diff --git a/source/blender/depsgraph/intern/depsgraph_eval.cc b/source/blender/depsgraph/intern/depsgraph_eval.cc
index 66535f5214b..e584e8a2a60 100644
--- a/source/blender/depsgraph/intern/depsgraph_eval.cc
+++ b/source/blender/depsgraph/intern/depsgraph_eval.cc
@@ -51,6 +51,7 @@ extern "C" {
#include "depsnode_component.h"
#include "depsnode_operation.h"
#include "depsgraph_debug.h"
+#include "depsgraph_util_foreach.h"
#ifdef WITH_LEGACY_DEPSGRAPH
static bool use_legacy_depsgraph = true;
@@ -302,11 +303,7 @@ static void calculate_eval_priority(OperationDepsNode *node)
/* NOOP nodes have no cost */
node->eval_priority = node->is_noop() ? cost : 0.0f;
- for (OperationDepsNode::Relations::const_iterator it = node->outlinks.begin();
- it != node->outlinks.end();
- ++it)
- {
- DepsRelation *rel = *it;
+ foreach (DepsRelation *rel, node->outlinks) {
OperationDepsNode *to = (OperationDepsNode *)rel->to;
BLI_assert(to->type == DEPSNODE_TYPE_OPERATION);
calculate_eval_priority(to);
@@ -362,11 +359,7 @@ static void schedule_graph(TaskPool *pool,
Depsgraph *graph,
const int layers)
{
- for (Depsgraph::OperationNodes::const_iterator it = graph->operations.begin();
- it != graph->operations.end();
- ++it)
- {
- OperationDepsNode *node = *it;
+ foreach (OperationDepsNode *node, graph->operations) {
schedule_node(pool, graph, layers, node, false, 0);
}
}
@@ -429,21 +422,13 @@ void DEG_evaluate_on_refresh_ex(EvaluationContext *eval_ctx,
calculate_pending_parents(graph, layers);
/* Clear tags. */
- for (Depsgraph::OperationNodes::const_iterator it = graph->operations.begin();
- it != graph->operations.end();
- ++it)
- {
- OperationDepsNode *node = *it;
+ foreach (OperationDepsNode *node, graph->operations) {
node->done = 0;
}
/* Calculate priority for operation nodes. */
#ifdef USE_EVAL_PRIORITY
- for (Depsgraph::OperationNodes::const_iterator it = graph->operations.begin();
- it != graph->operations.end();
- ++it)
- {
- OperationDepsNode *node = *it;
+ foreach (OperationDepsNode *node, graph->operations) {
calculate_eval_priority(node);
}
#endif
diff --git a/source/blender/depsgraph/intern/depsgraph_tag.cc b/source/blender/depsgraph/intern/depsgraph_tag.cc
index 3ca23965749..9676fb0326c 100644
--- a/source/blender/depsgraph/intern/depsgraph_tag.cc
+++ b/source/blender/depsgraph/intern/depsgraph_tag.cc
@@ -60,6 +60,7 @@ extern "C" {
#include "depsnode_component.h"
#include "depsnode_operation.h"
#include "depsgraph_intern.h"
+#include "depsgraph_util_foreach.h"
/* *********************** */
/* Update Tagging/Flushing */
@@ -304,11 +305,7 @@ void DEG_graph_flush_updates(Main *bmain, Depsgraph *graph)
* NOTE: Count how many nodes we need to handle - entry nodes may be
* component nodes which don't count for this purpose!
*/
- for (Depsgraph::EntryTags::const_iterator it = graph->entry_tags.begin();
- it != graph->entry_tags.end();
- ++it)
- {
- OperationDepsNode *node = *it;
+ foreach (OperationDepsNode *node, graph->entry_tags) {
IDDepsNode *id_node = node->owner->owner;
queue.push(node);
if (id_node->done == 0) {
@@ -349,11 +346,7 @@ void DEG_graph_flush_updates(Main *bmain, Depsgraph *graph)
}
/* Flush to nodes along links... */
- for (OperationDepsNode::Relations::const_iterator it = node->outlinks.begin();
- it != node->outlinks.end();
- ++it)
- {
- DepsRelation *rel = *it;
+ foreach (DepsRelation *rel, node->outlinks) {
OperationDepsNode *to_node = (OperationDepsNode *)rel->to;
if (to_node->scheduled == false) {
to_node->flag |= DEPSOP_FLAG_NEEDS_UPDATE;
diff --git a/source/blender/depsgraph/intern/depsnode.cc b/source/blender/depsgraph/intern/depsnode.cc
index 8aa1059d2dc..ca9a7d9bac8 100644
--- a/source/blender/depsgraph/intern/depsnode.cc
+++ b/source/blender/depsgraph/intern/depsnode.cc
@@ -46,6 +46,7 @@ extern "C" {
#include "depsnode_component.h"
#include "depsnode_operation.h"
#include "depsgraph_intern.h"
+#include "depsgraph_util_foreach.h"
/* *************** */
/* Node Management */
@@ -100,11 +101,7 @@ string DepsNode::identifier() const
void TimeSourceDepsNode::tag_update(Depsgraph *graph)
{
- for (DepsNode::Relations::const_iterator it = outlinks.begin();
- it != outlinks.end();
- ++it)
- {
- DepsRelation *rel = *it;
+ foreach (DepsRelation *rel, outlinks) {
DepsNode *node = rel->to;
node->tag_update(graph);
}
diff --git a/source/blender/depsgraph/util/depsgraph_util_foreach.h b/source/blender/depsgraph/util/depsgraph_util_foreach.h
new file mode 100644
index 00000000000..b2f1ebf3ac0
--- /dev/null
+++ b/source/blender/depsgraph/util/depsgraph_util_foreach.h
@@ -0,0 +1,51 @@
+/*
+ * ***** BEGIN GPL LICENSE BLOCK *****
+ *
+ * This program is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU General Public License
+ * as published by the Free Software Foundation; either version 2
+ * of the License, or (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program; if not, write to the Free Software Foundation,
+ * Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
+ *
+ * The Original Code is Copyright (C) 2016 Blender Foundation.
+ * All rights reserved.
+ *
+ * Original Author: Sergey Sharybin
+ * Contributor(s):
+ *
+ * ***** END GPL LICENSE BLOCK *****
+ */
+
+/** \file blender/depsgraph/util/depsgraph_util_foreach.h
+ * \ingroup depsgraph
+ */
+
+#ifndef __DEPSGRAPH_UTIL_FOREACH_H__
+#define __DEPSGRAPH_UTIL_FOREACH_H__
+
+#if (__cplusplus > 199711L) || (defined(_MSC_VER) && _MSC_VER >= 1800)
+# define foreach(x, y) for(x : y)
+#elif defined(HAVE_BOOST_FUNCTION_BINDINGS)
+# include <boost/foreach.hpp>
+# define foreach BOOST_FOREACH
+#else
+#pragma message("No available foreach() implementation. Using stub instead, disabling new depsgraph")
+
+#ifndef WITH_LEGACY_DEPSGRAPH
+# error "Unable to build new depsgraph and legacy one is disabled."
+#endif
+
+#define DISABLE_NEW_DEPSGRAPH
+
+# define foreach(x, y) for (x; false; (void)y)
+#endif
+
+#endif /* __DEPSGRAPH_UTIL_FOREACH_H__ */