|
Boost-Commit : |
Subject: [Boost-commit] svn:boost r48985 - in sandbox/SOC/2006/tree/trunk/boost/tree: . detail/algorithm/cursor
From: ockham_at_[hidden]
Date: 2008-09-27 16:57:23
Author: bernhard.reiter
Date: 2008-09-27 16:57:23 EDT (Sat, 27 Sep 2008)
New Revision: 48985
URL: http://svn.boost.org/trac/boost/changeset/48985
Log:
Outsource redundant cursor algorithms.
Added:
sandbox/SOC/2006/tree/trunk/boost/tree/detail/algorithm/cursor/_order.hpp (contents, props changed)
Text files modified:
sandbox/SOC/2006/tree/trunk/boost/tree/ascending_cursor.hpp | 24 +++++++++---
sandbox/SOC/2006/tree/trunk/boost/tree/detail/algorithm/cursor/_order_iterative.hpp | 75 +++++++++++++++++++++++++++++++++++++--
sandbox/SOC/2006/tree/trunk/boost/tree/detail/algorithm/cursor/inorder.hpp | 75 +++++++++++----------------------------
sandbox/SOC/2006/tree/trunk/boost/tree/detail/algorithm/cursor/postorder.hpp | 73 ++++++++++++--------------------------
sandbox/SOC/2006/tree/trunk/boost/tree/detail/algorithm/cursor/preorder.hpp | 67 ++++++++++-------------------------
sandbox/SOC/2006/tree/trunk/boost/tree/root_tracking_cursor.hpp | 24 ++++++------
6 files changed, 165 insertions(+), 173 deletions(-)
Modified: sandbox/SOC/2006/tree/trunk/boost/tree/ascending_cursor.hpp
==============================================================================
--- sandbox/SOC/2006/tree/trunk/boost/tree/ascending_cursor.hpp (original)
+++ sandbox/SOC/2006/tree/trunk/boost/tree/ascending_cursor.hpp 2008-09-27 16:57:23 EDT (Sat, 27 Sep 2008)
@@ -216,7 +216,7 @@
struct enabler {};
typedef root_tracking_cursor< ascending_cursor<Cursor> > self_type;
public:
- typedef typename ascending_cursor<Cursor>::value_type value_type;
+ typedef typename ascending_cursor<Cursor>::value_type value_type;
// Container-specific:
typedef typename ascending_cursor<Cursor>::size_type size_type;
@@ -245,18 +245,30 @@
root_tracking_cursor(
root_tracking_cursor< ascending_cursor<OtherCursor> > const& other
, typename boost::enable_if<
- boost::is_convertible<ascending_cursor<OtherCursor>*
- , ascending_cursor<Cursor>*>
+ boost::is_convertible<OtherCursor*
+ , Cursor*>
, enabler
>::type = enabler()
)
: root_tracking_cursor::cursor_adaptor_(other.base())
- , m_root_depth(other.base().m_s.size()) {}
+ , m_root_depth(other.m_root_depth) {}
+//
+// template <class OtherCursor>
+// root_tracking_cursor(
+// root_tracking_cursor<OtherCursor> const& other
+// , typename boost::enable_if<
+// boost::is_convertible<OtherCursor*
+// , ascending_cursor<Cursor>*>
+// , enabler
+// >::type = enabler()
+// )
+// : root_tracking_cursor::cursor_adaptor_(other.base())
+// , m_root_depth(other.base().m_s.size()) {}
private:
- std::size_t const m_root_depth;
+ std::size_t const m_root_depth;
- friend class boost::iterator_core_access;
+ friend class boost::iterator_core_access;
friend class boost::tree::cursor_core_access;
// bool equal(cursor const& other) const
Added: sandbox/SOC/2006/tree/trunk/boost/tree/detail/algorithm/cursor/_order.hpp
==============================================================================
--- (empty file)
+++ sandbox/SOC/2006/tree/trunk/boost/tree/detail/algorithm/cursor/_order.hpp 2008-09-27 16:57:23 EDT (Sat, 27 Sep 2008)
@@ -0,0 +1,70 @@
+// Copyright (c) 2006-2008, Bernhard Reiter
+//
+// Distributed under the Boost Software License, Version 1.0.
+// (See accompanying file LICENSE_1_0.txt or copy at
+// http://www.boost.org/LICENSE_1_0.txt)
+
+/** @file _order.hpp
+ *
+ * Some algorithm versions that are identical for all *order cursors
+ * (as we are just calling the appropriate traversal function that are
+ * defined in the respective *order.hpp files).
+ */
+
+// NO guards, as this is context-included!
+
+/**
+ * @brief Successor
+ * @param c A cursor
+ * @param n Optional parameter to indicate how many steps to move forward
+ * @return Successor of @a c
+ */
+template <class Cursor>
+inline Cursor next(Cursor c
+ , typename Cursor::difference_type n = 1)
+{
+ for (; n!=0; --n)
+ forward(c);
+ return c;
+}
+
+/**
+ * @brief Predecessor
+ * @param c A cursor
+ * @param n Optional parameter to indicate how many steps to move back
+ * @return Predecessor of @a c
+ */
+template <class Cursor>
+inline Cursor prior(Cursor c
+ , typename Cursor::difference_type n = 1)
+{
+ for (; n!=0; --n)
+ back(c);
+ return c;
+}
+
+/**
+ * @brief First element of a subtree in preorder traversal
+ * @param c A cursor
+ * @return Cursor to the first element of @a c in preorder traversal
+ */
+template <class Cursor>
+Cursor first(Cursor c)
+{
+ to_first(c);
+ return c;
+}
+
+/**
+ * @brief One position past the last element of a subtree in preorder
+ * traversal
+ * @param c A cursor
+ * @return Cursor one position past the last element of @a c in preorder
+ * traversal
+ */
+template <class Cursor>
+Cursor last(Cursor c)
+{
+ to_last(c);
+ return c;
+}
\ No newline at end of file
Modified: sandbox/SOC/2006/tree/trunk/boost/tree/detail/algorithm/cursor/_order_iterative.hpp
==============================================================================
--- sandbox/SOC/2006/tree/trunk/boost/tree/detail/algorithm/cursor/_order_iterative.hpp (original)
+++ sandbox/SOC/2006/tree/trunk/boost/tree/detail/algorithm/cursor/_order_iterative.hpp 2008-09-27 16:57:23 EDT (Sat, 27 Sep 2008)
@@ -4,7 +4,7 @@
// (See accompanying file LICENSE_1_0.txt or copy at
// http://www.boost.org/LICENSE_1_0.txt)
-/** @file _order.hpp
+/** @file _order_iterative.hpp
*
* Some iterative algorithm versions that are identical for all *order cursors
* (as we are just calling the appropriate traversal function that are
@@ -16,18 +16,85 @@
template <class Cursor, class Op>
Op for_each(root_tracking_cursor<Cursor> s, Op f)
{
- root_tracking_cursor<Cursor> t = last(s);
+ root_tracking_cursor<Cursor> s2 = last(s);
s = first(s);
- while (s!=t) {
+ while (s!=s2) {
f(*s);
forward(s);
}
return f;
}
-
+/**
+ * @brief Apply a function to every element of a subtree, in the given order.
+ * @param s A cursor.
+ * @param f A unary function object.
+ * @return @p f
+ *
+ * Applies the function object @p f to each element in the @p subtree.
+ * @p f must not modify the order of the sequence.
+ * If @p f has a return value it is ignored.
+ */
+//[ for_each
template <class Cursor, class Op>
Op for_each(Cursor s, Op f)
+//]
{
return for_each(root_tracking_cursor<Cursor>(s), f);
+}
+
+template <class InCursor, class OutCursor>
+OutCursor copy (root_tracking_cursor<InCursor> s, OutCursor t)
+{
+ root_tracking_cursor<InCursor> s2(last(s));
+ s = first(s);
+ while (s!=s2) {
+ *t = *s;
+ forward(s);
+ }
+ return t;
+}
+
+/**
+ * @brief Copies the subtree s into t, by traversing s in the given order.
+ * @param s An input cursor.
+ * @param t An output cursor.
+ * @result A cursor past t's *order end, after the copying operation.
+ */
+template <class InCursor, class OutCursor>
+OutCursor copy (InCursor s, OutCursor t)
+{
+ return copy(root_tracking_cursor<InCursor>(s), t);
+}
+
+template <class InCursor, class OutCursor, class Op>
+OutCursor transform (root_tracking_cursor<InCursor> s, OutCursor t, Op op)
+{
+ root_tracking_cursor<InCursor> s2(last(s));
+ s = first(s);
+ while (s!=s2) {
+ *t = op(*s);
+ forward(s);
+ }
+ return t;
+}
+
+/**
+ * @brief Performs an operation on a subtree, by traversing it in
+ * the given order.
+ * @param s An input cursor.
+ * @param t An output cursor.
+ * @param op A unary operation.
+ * @result A cursor past t's preorder end, after the transforming has
+ * finished.
+ *
+ * By traversing the input subtree s, apply the operation op
+ * to each element and write the result to the output subtree t.
+ *
+ * op must not change its argument.
+ */
+template <class InCursor, class OutCursor, class Op>
+OutCursor transform (InCursor s, OutCursor t, Op op)
+{
+ return transform(root_tracking_cursor<InCursor>(s), t, op);
}
\ No newline at end of file
Modified: sandbox/SOC/2006/tree/trunk/boost/tree/detail/algorithm/cursor/inorder.hpp
==============================================================================
--- sandbox/SOC/2006/tree/trunk/boost/tree/detail/algorithm/cursor/inorder.hpp (original)
+++ sandbox/SOC/2006/tree/trunk/boost/tree/detail/algorithm/cursor/inorder.hpp 2008-09-27 16:57:23 EDT (Sat, 27 Sep 2008)
@@ -15,6 +15,7 @@
#define BOOST_TREE_DETAIL_ALGORITHM_CURSOR_INORDER_HPP
#include <boost/tree/root_tracking_cursor.hpp>
+#include <boost/tree/ascending_cursor.hpp>
#include <algorithm>
@@ -45,22 +46,6 @@
}
/**
- * @brief Inorder successor
- * @param c A cursor
- * @param n Optional parameter to indicate how many steps to move forward
- * @return Inorder successor of @a c
- * @ingroup traversal
- */
-template <class MultiwayCursor>
-inline MultiwayCursor next(MultiwayCursor c
- , typename MultiwayCursor::difference_type n = 1)
-{
- for (; n!=0; --n)
- forward(c);
- return c;
-}
-
-/**
* @brief Inorder predecessor
* @param c MultiwayCursor to be set to its inorder predecessor
*/
@@ -81,49 +66,35 @@
}
/**
- * @brief Inorder predecessor
- * @param c MultiwayCursor
- * @param n Optional parameter to indicate how many steps to move back
- * @return Inorder predecessor of @a c
- */
-template <class MultiwayCursor>
-inline MultiwayCursor prior(MultiwayCursor c
- , typename MultiwayCursor::difference_type n = 1)
-{
- for (; n!=0; --n)
- back(c);
- return c;
-}
-
-/**
- * @brief First element of a Multiway subtree in inorder traversal
- * @param c A MultiwayCursor
- * @return Cursor to the first element of @a c in inorder traversal
+ * @brief First element of a subtree in inorder traversal
+ * @param c Subtree root cursor that will be set to the first inorder
+ * position in the subtree.
*/
-template <class MultiwayCursor>
-MultiwayCursor first(MultiwayCursor c)
+template <class Cursor>
+void to_first(Cursor& c)
{
while (!c.empty())
c.to_begin();
- return c;
}
/**
- * @brief One position past the last element of a Multiway subtree in
- * inorder traversal
- * @param c A MultiwayCursor
- * @return Cursor one position past the last element of @a c in inorder
- * traversal
- */
-template <class MultiwayCursor>
-MultiwayCursor last(MultiwayCursor c)
-{
- return c;
-}
+ * @brief One position past the last element of a subtree in inorder
+ * traversal
+ * @param c Subtree root cursor that will be set to the last inorder
+ * position in the subtree.
+ */
+template <class Cursor>
+void to_last(Cursor& c)
+{ }
+
+#include <boost/tree/detail/algorithm/cursor/_order.hpp>
/*\@}*/
-#ifdef BOOST_RECURSIVE_ORDER_ALGORITHMS
+//#ifndef BOOST_RECURSIVE_ORDER_ALGORITHMS
+//#include <boost/tree/detail/algorithm/cursor/_order_iterative.hpp>
+//#else
+
/**
* @if maint
* Helper function for for_each, using a reference parameter in order to
@@ -176,10 +147,6 @@
return f;
}
-#else
-#include <boost/tree/detail/algorithm/cursor/_order_iterative.hpp>
-#endif //BOOST_RECURSIVE_ORDER_ALGORITHMS
-
/**
* @brief Copies the subtree s into t, by traversing s in inorder.
* @param s An input cursor.
@@ -239,6 +206,8 @@
return t;
}
+//#endif //BOOST_RECURSIVE_ORDER_ALGORITHMS
+
/// Search
/**
Modified: sandbox/SOC/2006/tree/trunk/boost/tree/detail/algorithm/cursor/postorder.hpp
==============================================================================
--- sandbox/SOC/2006/tree/trunk/boost/tree/detail/algorithm/cursor/postorder.hpp (original)
+++ sandbox/SOC/2006/tree/trunk/boost/tree/detail/algorithm/cursor/postorder.hpp 2008-09-27 16:57:23 EDT (Sat, 27 Sep 2008)
@@ -15,6 +15,7 @@
#define BOOST_TREE_DETAIL_ALGORITHM_CURSOR_POSTORDER_HPP
#include <boost/tree/root_tracking_cursor.hpp>
+#include <boost/tree/ascending_cursor.hpp>
namespace boost {
namespace tree {
@@ -54,21 +55,6 @@
}
/**
- * @brief Postorder successor
- * @param c A cursor
- * @param n Optional parameter to indicate how many steps to move forward
- * @return Postorder successor of @a c
- */
-template <class Cursor>
-inline Cursor next(Cursor c
- , typename Cursor::difference_type n = 1)
-{
- for (; n!=0; --n)
- forward(c);
- return c;
-}
-
-/**
* @brief Postorder predecessor
* @param c Cursor to be set to its postorder predecessor
*/
@@ -103,53 +89,42 @@
}
/**
- * @brief Postorder predecessor
- * @param c A cursor
- * @param n Optional parameter to indicate how many steps to move back
- * @return Postorder predecessor of @a c
- */
-template <class Cursor>
-inline Cursor prior(Cursor c
- , typename Cursor::difference_type n = 1)
-{
- for (; n!=0; --n)
- back(c);
- return c;
-}
-
-/**
- * @brief First element of a subtree in postorder traversal
- * @param c A cursor
- * @return Cursor to the first element of @a c in postorder traversal
+ * @brief First element of a subtree in postorder traversal
+ * @param c Subtree root cursor that will be set to the first postorder
+ * position in the subtree.
*/
template <class Cursor>
-Cursor first(Cursor c)
+void to_first(Cursor& c)
{
while (true)
if (!c.empty())
c.to_begin();
else if (!(++c).empty())
c.to_begin();
- else
- return --c;
+ else {
+ --c;
+ return;
+ }
}
/**
- * @brief One position past the last element of a subtree in postorder
- * traversal
- * @param c A cursor
- * @return Cursor one position past the last element of @a c in
- * postorder traversal
+ * @brief One position past the last element of a subtree in postorder
+ * traversal
+ * @param c Subtree root cursor that will be set to the last postorder
+ * position in the subtree.
*/
template <class Cursor>
-Cursor last(Cursor c)
-{
- return c;
-}
+void to_last(Cursor& c)
+{ }
+
+#include <boost/tree/detail/algorithm/cursor/_order.hpp>
/*\@}*/
-#ifdef BOOST_RECURSIVE_ORDER_ALGORITHMS
+//#ifndef BOOST_RECURSIVE_ORDER_ALGORITHMS
+//#include <boost/tree/detail/algorithm/cursor/_order_iterative.hpp>
+//#else
+
/**
* @if maint
* Helper function for for_each, using a reference parameter in order to
@@ -200,10 +175,6 @@
return f;
}
-#else
-#include <boost/tree/detail/algorithm/cursor/_order_iterative.hpp>
-#endif //BOOST_RECURSIVE_ORDER_ALGORITHMS
-
/**
* @brief Copies the subtree s into t, by traversing s in postorder.
* @param s An input cursor.
@@ -264,6 +235,8 @@
return t;
}
+//#endif //BOOST_RECURSIVE_ORDER_ALGORITHMS
+
} // namespace postorder
} // namespace tree
Modified: sandbox/SOC/2006/tree/trunk/boost/tree/detail/algorithm/cursor/preorder.hpp
==============================================================================
--- sandbox/SOC/2006/tree/trunk/boost/tree/detail/algorithm/cursor/preorder.hpp (original)
+++ sandbox/SOC/2006/tree/trunk/boost/tree/detail/algorithm/cursor/preorder.hpp 2008-09-27 16:57:23 EDT (Sat, 27 Sep 2008)
@@ -15,6 +15,7 @@
#define BOOST_TREE_DETAIL_ALGORITHM_CURSOR_PREORDER_HPP
#include <boost/tree/root_tracking_cursor.hpp>
+#include <boost/tree/ascending_cursor.hpp>
namespace boost {
namespace tree {
@@ -61,21 +62,6 @@
}
/**
- * @brief Preorder successor
- * @param c A cursor
- * @param n Optional parameter to indicate how many steps to move forward
- * @return Preorder successor of @a c
- */
-template <class Cursor>
-inline Cursor next(Cursor c
- , typename Cursor::difference_type n = 1)
-{
- for (; n!=0; --n)
- forward(c);
- return c;
-}
-
-/**
* @brief Preorder predecessor
* @param c Cursor to be set to its preorder predecessor
*/
@@ -106,47 +92,34 @@
}
/**
- * @brief Preorder predecessor
- * @param c A cursor
- * @param n Optional parameter to indicate how many steps to move back
- * @return Preorder predecessor of @a c
+ * @brief First element of a subtree in preorder traversal
+ * @param c Subtree root cursor that will be set to the first preorder
+ * position in the subtree.
*/
template <class Cursor>
-inline Cursor prior(Cursor c
- , typename Cursor::difference_type n = 1)
+void to_first(Cursor& c)
{
- for (; n!=0; --n)
- back(c);
- return c;
+ c.to_begin();
}
/**
- * @brief First element of a subtree in preorder traversal
- * @param c A cursor
- * @return Cursor to the first element of @a c in preorder traversal
+ * @brief One position past the last element of a subtree in preorder
+ * traversal
+ * @param c Subtree root cursor that will be set to the last preorder
+ * position in the subtree.
*/
template <class Cursor>
-Cursor first(Cursor c)
-{
- return c.begin();
-}
+void to_last(Cursor& c)
+{ }
-/**
- * @brief One position past the last element of a subtree in preorder
- * traversal
- * @param c A cursor
- * @return Cursor one position past the last element of @a c in preorder
- * traversal
- */
-template <class Cursor>
-Cursor last(Cursor c)
-{
- return c;
-}
+#include <boost/tree/detail/algorithm/cursor/_order.hpp>
/*\@}*/
-#ifdef BOOST_RECURSIVE_ORDER_ALGORITHMS
+//#ifndef BOOST_RECURSIVE_ORDER_ALGORITHMS
+//#include <boost/tree/detail/algorithm/cursor/_order_iterative.hpp>
+//#else
+
/**
* @if maint
* Helper function for for_each, using a reference parameter in order to
@@ -197,10 +170,6 @@
return f;
}
-#else
-#include <boost/tree/detail/algorithm/cursor/_order_iterative.hpp>
-#endif //BOOST_RECURSIVE_ORDER_ALGORITHMS
-
/**
* @brief Copies the subtree s into t, by traversing s in preorder.
* @param s An input cursor.
@@ -259,6 +228,8 @@
return t;
}
+//#endif //BOOST_RECURSIVE_ORDER_ALGORITHMS
+
} // namespace preorder
} // namespace tree
Modified: sandbox/SOC/2006/tree/trunk/boost/tree/root_tracking_cursor.hpp
==============================================================================
--- sandbox/SOC/2006/tree/trunk/boost/tree/root_tracking_cursor.hpp (original)
+++ sandbox/SOC/2006/tree/trunk/boost/tree/root_tracking_cursor.hpp 2008-09-27 16:57:23 EDT (Sat, 27 Sep 2008)
@@ -60,22 +60,22 @@
explicit root_tracking_cursor(Cursor c)
: root_tracking_cursor::cursor_adaptor_(c), m_depth(0) {}
- template <class OtherCursor>
- root_tracking_cursor(
- root_tracking_cursor<OtherCursor> const& other
- , typename boost::enable_if<
- boost::is_convertible<OtherCursor*, Cursor*>
- , enabler
- >::type = enabler()
- )
- : root_tracking_cursor::cursor_adaptor_(other.base())
- , m_depth(other.m_depth) {}
+// template <class OtherCursor>
+// root_tracking_cursor(
+// root_tracking_cursor<OtherCursor> const& other
+// , typename boost::enable_if<
+// boost::is_convertible<OtherCursor*, Cursor*>
+// , enabler
+// >::type = enabler()
+// )
+// : root_tracking_cursor::cursor_adaptor_(other.base())
+// , m_depth(other.m_depth) {}
private:
- friend class boost::iterator_core_access;
+ friend class boost::iterator_core_access;
friend class boost::tree::cursor_core_access;
- std::size_t m_depth;
+ std::size_t m_depth;
// bool equal(cursor const& other) const
// {
Boost-Commit list run by bdawes at acm.org, david.abrahams at rcn.com, gregod at cs.rpi.edu, cpdaniel at pacbell.net, john at johnmaddock.co.uk