[GIT] ppl/ppl(sparse_matrices): CO_Tree: use the first element of indexes[] as a marker, speeding up some iterator operations.
Module: ppl/ppl Branch: sparse_matrices Commit: 91cd9a12cacdb355dacdebb1604532378b0672cb URL: http://www.cs.unipr.it/git/gitweb.cgi?p=ppl/ppl.git;a=commit;h=91cd9a12cacdb... Author: Marco Poletti <poletti.marco@gmail.com> Date: Fri May 7 17:00:04 2010 +0200 CO_Tree: use the first element of indexes[] as a marker, speeding up some iterator operations. --- src/CO_Tree.cc | 4 +++- src/CO_Tree.defs.hh | 5 ++--- src/CO_Tree.inlines.hh | 16 ++++++++++------ 3 files changed, 15 insertions(+), 10 deletions(-) diff --git a/src/CO_Tree.cc b/src/CO_Tree.cc index fc73bf9..292a7be 100644 --- a/src/CO_Tree.cc +++ b/src/CO_Tree.cc @@ -189,7 +189,8 @@ PPL::CO_Tree::init(dimension_type reserved_size1) { for (dimension_type i = 1; i <= reserved_size; ++i) new (&(indexes[i])) dimension_type(unused_index); - // This is used as a marker by unordered iterators. + // These are used as markers by iterators. + new (&(indexes[0])) dimension_type(0); new (&(indexes[reserved_size + 1])) dimension_type(0); max_depth = l; @@ -212,6 +213,7 @@ PPL::CO_Tree::destroy() { data[i].~data_type(); indexes[i].~dimension_type(); } + indexes[0].~dimension_type(); indexes[reserved_size + 1].~dimension_type(); // We use malloc()/free() instead of operator new()/operator delete() diff --git a/src/CO_Tree.defs.hh b/src/CO_Tree.defs.hh index b81e6a8..79c7421 100644 --- a/src/CO_Tree.defs.hh +++ b/src/CO_Tree.defs.hh @@ -408,11 +408,10 @@ private: //! The depth of the leaves in the static tree. dimension_type max_depth; - // TODO: don't waste the first element. //! The vector that contains the keys in the tree. //! If a pair has \p unused_index as first element, it means it is not used. - //! Its size is reserved_size + 2, because the first element is not used, - //! and the last element is used as marker for unordered iterators. + //! Its size is reserved_size + 2, because the first and the last elements + //! are used as markers for iterators. dimension_type* indexes; //! The vector that contains the data of the keys in the tree. diff --git a/src/CO_Tree.inlines.hh b/src/CO_Tree.inlines.hh index 59e3dcf..8de94c1 100644 --- a/src/CO_Tree.inlines.hh +++ b/src/CO_Tree.inlines.hh @@ -419,10 +419,12 @@ CO_Tree::rebuild_bigger_tree() { new (&(new_indexes[j])) dimension_type(unused_index); } - // This was used as a marker by unordered iterators. + // These were used as markers by iterators. + indexes[0].~dimension_type(); indexes[reserved_size + 1].~dimension_type(); - // This is used as a marker by unordered iterators. + // These are used as markers by iterators. + new (&(new_indexes[0])) dimension_type(0); new (&(new_indexes[new_reserved_size + 1])) dimension_type(0); free(indexes); @@ -1094,8 +1096,9 @@ CO_Tree::inorder_iterator::get_previous_value() { #ifdef USE_PPL_CO_TREE_DFS_LAYOUT --i; - while (i != 0 && tree->indexes[i] == unused_index) - --i; + if (!tree->empty()) + while (tree->indexes[i] == unused_index) + --i; #endif // defined(USE_PPL_CO_TREE_DFS_LAYOUT) } @@ -1743,8 +1746,9 @@ CO_Tree::inorder_const_iterator::get_previous_value() { #ifdef USE_PPL_CO_TREE_DFS_LAYOUT --i; - while (i != 0 && tree->indexes[i] == unused_index) - --i; + if (!tree->empty()) + while (tree->indexes[i] == unused_index) + --i; #endif // defined(USE_PPL_CO_TREE_DFS_LAYOUT) }
participants (1)
-
Marco Poletti