|
Boost-Commit : |
Subject: [Boost-commit] svn:boost r57344 - in sandbox/SOC/2006/tree/trunk: boost/tree boost/tree/detail libs/tree/test
From: ockham_at_[hidden]
Date: 2009-11-03 15:58:53
Author: bernhard.reiter
Date: 2009-11-03 15:58:50 EST (Tue, 03 Nov 2009)
New Revision: 57344
URL: http://svn.boost.org/trac/boost/changeset/57344
Log:
Fix binary_tree_test, plus some other fixes.
Text files modified:
sandbox/SOC/2006/tree/trunk/boost/tree/balance.hpp | 10 ++++--
sandbox/SOC/2006/tree/trunk/boost/tree/cursor_facade.hpp | 4 +-
sandbox/SOC/2006/tree/trunk/boost/tree/detail/forest_cursor.hpp | 10 ------
sandbox/SOC/2006/tree/trunk/boost/tree/detail/recursive_inorder_algorithms.hpp | 36 ++++++++++++++---------
sandbox/SOC/2006/tree/trunk/boost/tree/detail/recursive_postorder_algorithms.hpp | 16 +++++++---
sandbox/SOC/2006/tree/trunk/boost/tree/detail/recursive_preorder_algorithms.hpp | 18 ++++++++---
sandbox/SOC/2006/tree/trunk/boost/tree/iterator.hpp | 59 +++++++++++++++++++++++++++++++++++++--
sandbox/SOC/2006/tree/trunk/libs/tree/test/binary_tree_test.cpp | 45 ++++++++++++++---------------
sandbox/SOC/2006/tree/trunk/libs/tree/test/predecessor_test.cpp | 1
sandbox/SOC/2006/tree/trunk/libs/tree/test/successor_test.cpp | 3 +
sandbox/SOC/2006/tree/trunk/libs/tree/test/to_last_test.cpp | 7 ++++
sandbox/SOC/2006/tree/trunk/libs/tree/test/transform_test.cpp | 10 +++---
12 files changed, 147 insertions(+), 72 deletions(-)
Modified: sandbox/SOC/2006/tree/trunk/boost/tree/balance.hpp
==============================================================================
--- sandbox/SOC/2006/tree/trunk/boost/tree/balance.hpp (original)
+++ sandbox/SOC/2006/tree/trunk/boost/tree/balance.hpp 2009-11-03 15:58:50 EST (Tue, 03 Nov 2009)
@@ -201,7 +201,7 @@
*/
const_iterator cbegin() const
{
- const_cursor c = h.root();
+ const_cursor c = h.croot();
to_first(inorder(), c);
return const_iterator(c);
//return const_iterator(h.inorder_cfirst());
@@ -213,7 +213,9 @@
*/
iterator end()
{
- return iterator(h.root());
+ cursor c = h.root();
+ to_past(inorder(), c);
+ return iterator(c);
}
/**
@@ -231,7 +233,9 @@
*/
const_iterator cend() const
{
- return const_iterator(h.croot());
+ const_cursor c = h.croot();
+ to_past(inorder(), c);
+ return const_iterator(c);
}
/**
Modified: sandbox/SOC/2006/tree/trunk/boost/tree/cursor_facade.hpp
==============================================================================
--- sandbox/SOC/2006/tree/trunk/boost/tree/cursor_facade.hpp (original)
+++ sandbox/SOC/2006/tree/trunk/boost/tree/cursor_facade.hpp 2009-11-03 15:58:50 EST (Tue, 03 Nov 2009)
@@ -121,8 +121,8 @@
cursor_facade_;
public:
typedef typename iterator_facade_::value_type value_type;
- typedef Reference reference;
- typedef Difference difference_type;
+ typedef typename iterator_facade_::reference reference;
+ typedef typename iterator_facade_::difference_type difference_type;
typedef typename iterator_facade_::pointer pointer;
typedef typename iterator_facade_::iterator_category iterator_category;
Modified: sandbox/SOC/2006/tree/trunk/boost/tree/detail/forest_cursor.hpp
==============================================================================
--- sandbox/SOC/2006/tree/trunk/boost/tree/detail/forest_cursor.hpp (original)
+++ sandbox/SOC/2006/tree/trunk/boost/tree/detail/forest_cursor.hpp 2009-11-03 15:58:50 EST (Tue, 03 Nov 2009)
@@ -90,16 +90,6 @@
friend class cursor_core_access;
friend class iterator_core_access;
- bool empty_() const
- {
- return this->base().begin().is_leaf() && this->base().end().is_leaf();
- }
-
- typename forest_cursor::cursor_adaptor_::reference dereference() const
- {
- return *this->base_reference();
- }
-
void increment()
{
this->base_reference().to_end();
Modified: sandbox/SOC/2006/tree/trunk/boost/tree/detail/recursive_inorder_algorithms.hpp
==============================================================================
--- sandbox/SOC/2006/tree/trunk/boost/tree/detail/recursive_inorder_algorithms.hpp (original)
+++ sandbox/SOC/2006/tree/trunk/boost/tree/detail/recursive_inorder_algorithms.hpp 2009-11-03 15:58:50 EST (Tue, 03 Nov 2009)
@@ -52,11 +52,11 @@
}
/**
- * @brief Apply a function to every element of a multiway subtree,
- * in inorder.
- * @param s A MultiwayTree cursor.
- * @param f A unary function object.
- * @return @p f
+ * @brief Apply a function to every element of a multiway subtree,
+ * in inorder.
+ * @param s A MultiwayTree cursor.
+ * @param f A unary function object.
+ * @return @p f
*
* Applies the function object @p f to each element in the @p subtree, using
* inorder. @p f must not modify the order of the sequence.
@@ -69,6 +69,9 @@
(Op)) // return type
for_each(inorder, MultiwayCursor r, Op f, descending_vertical_traversal_tag)
{
+ if (r.is_leaf())
+ return f;
+
MultiwayCursor s = r.begin();
MultiwayCursor t = r.end();
@@ -85,11 +88,11 @@
}
/**
- * @brief Performs an operation on a subtree, by traversing it in inorder.
- * @param s An input cursor.
- * @param t An output cursor.
- * @param op A unary operation.
- * @result A cursor past t's inorder end, after the transforming has
+ * @brief Performs an operation on a subtree, by traversing it in inorder.
+ * @param s An input cursor.
+ * @param t An output cursor.
+ * @param op A unary operation.
+ * @result A cursor past t's inorder end, after the transforming has
* finished.
*
* By traversing the input subtree s in inorder, apply the operation op
@@ -105,19 +108,24 @@
(OutCursor)) // return type
transform(inorder, InCursor s, OutCursor t, Op op, descending_vertical_traversal_tag)
{
- InCursor r = s.end();
+ if (s.is_leaf())
+ return t;
+
+ *t = op(*s);
+
+ InCursor r = s;
s.to_begin();
t.to_begin();
- for (; s != r; ++s, ++t) {
+ for (; s != r.end(); ++s, ++t) {
if (!s.is_leaf())
transform(inorder(), s, t, op, descending_vertical_traversal_tag());
- *t=op(*s);
+ *t=op(*r);
}
// Multiway cursor
- if (!r.is_leaf())
+ if (!r.to_end().is_leaf())
transform(inorder(), r, t, op, descending_vertical_traversal_tag());
return t;
}
Modified: sandbox/SOC/2006/tree/trunk/boost/tree/detail/recursive_postorder_algorithms.hpp
==============================================================================
--- sandbox/SOC/2006/tree/trunk/boost/tree/detail/recursive_postorder_algorithms.hpp (original)
+++ sandbox/SOC/2006/tree/trunk/boost/tree/detail/recursive_postorder_algorithms.hpp 2009-11-03 15:58:50 EST (Tue, 03 Nov 2009)
@@ -50,10 +50,10 @@
}
/**
- * @brief Apply a function to every element of a subtree, in postorder.
- * @param s A cursor.
- * @param f A unary function object.
- * @return @p f
+ * @brief Apply a function to every element of a subtree, in postorder.
+ * @param s A cursor.
+ * @param f A unary function object.
+ * @return @p f
*
* Applies the function object @p f to each element in the subtree @p s, using
* postorder. @p f must not modify the order of the sequence.
@@ -66,6 +66,9 @@
(Op)) // return type
for_each(postorder, Cursor s, Op f, descending_vertical_traversal_tag)
{
+ if (s.is_leaf())
+ return f;
+
Cursor t = s;
for (s.to_begin(); s != t.end(); ++s)
if (!s.is_leaf())
@@ -100,6 +103,9 @@
(OutCursor)) // return type
transform(postorder, InCursor s, OutCursor t, Op op, descending_vertical_traversal_tag)
{
+ if (s.is_leaf())
+ return t;
+
InCursor r = s;
s.to_begin();
t.to_begin();
@@ -113,7 +119,7 @@
if (!s.is_leaf())
transform(postorder(), s, t, op, descending_vertical_traversal_tag());
- *t2 = op(*r.to_begin());
+ *t2 = op(*r);
return t;
}
Modified: sandbox/SOC/2006/tree/trunk/boost/tree/detail/recursive_preorder_algorithms.hpp
==============================================================================
--- sandbox/SOC/2006/tree/trunk/boost/tree/detail/recursive_preorder_algorithms.hpp (original)
+++ sandbox/SOC/2006/tree/trunk/boost/tree/detail/recursive_preorder_algorithms.hpp 2009-11-03 15:58:50 EST (Tue, 03 Nov 2009)
@@ -86,10 +86,10 @@
}
/**
- * @brief Apply a function to every element of a subtree, in preorder.
- * @param s A cursor.
- * @param f A unary function object.
- * @return @p f
+ * @brief Apply a function to every element of a subtree, in preorder.
+ * @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, using
* preorder. @p f must not modify the order of the sequence.
@@ -102,6 +102,9 @@
(Op)) // return type
for_each(preorder, Cursor s, Op f, descending_vertical_traversal_tag)
{
+ if (s.is_leaf())
+ return f;
+
f(*s);
Cursor t = s.end();
for (s.to_begin(); s != t; ++s) {
@@ -138,11 +141,16 @@
(OutCursor)) // return type
transform(preorder, InCursor s, OutCursor t, Op op, descending_vertical_traversal_tag)
{
+ if (s.is_leaf())
+ return t;
+
+ *t = op(*s);
+
InCursor r = s.end();
s.to_begin();
t.to_begin();
for (; s != r; ++s, ++t) {
- *t = op(*s);
+ //*t = op(*s);
if (!s.is_leaf())
transform(preorder(), s, t, op, descending_vertical_traversal_tag());
}
Modified: sandbox/SOC/2006/tree/trunk/boost/tree/iterator.hpp
==============================================================================
--- sandbox/SOC/2006/tree/trunk/boost/tree/iterator.hpp (original)
+++ sandbox/SOC/2006/tree/trunk/boost/tree/iterator.hpp 2009-11-03 15:58:50 EST (Tue, 03 Nov 2009)
@@ -17,6 +17,7 @@
#include <boost/utility/enable_if.hpp>
#include <boost/tree/root_tracking_cursor.hpp>
+#include <boost/tree/inorder_algorithms.hpp>
#include <boost/tree/cursor_concepts.hpp>
@@ -75,16 +76,66 @@
void increment()
{
successor(Order(), this->base_reference());
- //BOOST_ASSERT(!index(this->base_reference()) || this->base_reference().is_root());
}
void decrement()
{
predecessor(Order(), this->base_reference());
- //BOOST_ASSERT(!index(this->base_reference()) || this->base_reference().is_root());
}
};
+ template <class Cursor>
+ class iterator<inorder, Cursor>
+ : public boost::iterator_adaptor<iterator<inorder, Cursor>
+ , Cursor
+ , boost::use_default
+ , inorder::iterator_category
+ > {
+ BOOST_CONCEPT_ASSERT((RootTrackingCursor<Cursor>));
+
+ private:
+ struct enabler {};
+
+ public:
+ iterator()
+ : iterator::iterator_adaptor_() {}
+
+ explicit iterator(Cursor p)
+ : iterator::iterator_adaptor_(p) {}
+
+ template <class OtherCursor>
+ iterator(
+ iterator<inorder, OtherCursor> const& other
+ , typename boost::enable_if<
+ boost::is_convertible<OtherCursor, Cursor>
+ , enabler
+ >::type = enabler()
+ )
+ : iterator::iterator_adaptor_(other.base()) {}
+
+ operator Cursor()
+ {
+ return this->base();
+ }
+ private:
+ friend class boost::iterator_core_access;
+
+ void increment()
+ {
+ Cursor c = this->base_reference();
+ if (successor(inorder(), this->base_reference()))
+ return;
+
+ last_to_past(inorder(), c);
+ this->base_reference() = c;
+ }
+
+ void decrement()
+ {
+ predecessor(inorder(), this->base_reference());
+ }
+ };
+
/**
* @brief First element of a subtree in traversal
* @param c A cursor
@@ -116,7 +167,7 @@
end(Order, Cursor c)
{
root_tracking_cursor<Cursor> rtc(c);
- to_last(Order(), rtc);
+ to_past(Order(), rtc);
return iterator< Order, root_tracking_cursor<Cursor> >(rtc);
}
@@ -139,4 +190,4 @@
} // namespace tree
} // namespace boost
-#endif //BOOST_TREE_ITERATOR_HPP
\ No newline at end of file
+#endif //BOOST_TREE_ITERATOR_HPP
Modified: sandbox/SOC/2006/tree/trunk/libs/tree/test/binary_tree_test.cpp
==============================================================================
--- sandbox/SOC/2006/tree/trunk/libs/tree/test/binary_tree_test.cpp (original)
+++ sandbox/SOC/2006/tree/trunk/libs/tree/test/binary_tree_test.cpp 2009-11-03 15:58:50 EST (Tue, 03 Nov 2009)
@@ -399,46 +399,45 @@
BOOST_CHECK_EQUAL(*c.parent(), 3); // differently (not invariantly!) spoken
BOOST_CHECK_EQUAL(*--c, 1);
BOOST_CHECK_EQUAL(*(++c).begin(), 4);
- BOOST_CHECK_EQUAL(*++c, 7);
+ BOOST_CHECK_EQUAL(*c.end(), 7);
BOOST_CHECK_EQUAL(index(c), 1);
BOOST_CHECK_EQUAL(*c, 6);
- c.to_begin();
-
bt.rotate(c); // Left rotate
c.to_parent().to_parent();
- BOOST_CHECK_EQUAL(*c.begin(), 6);
- BOOST_CHECK_EQUAL(*c.parent().begin(), 8);
+ BOOST_CHECK_EQUAL(*c, 6);
+ BOOST_CHECK_EQUAL(*c.parent(), 8);
- BOOST_CHECK_EQUAL(*c.end().begin(), 7);
- BOOST_CHECK_EQUAL(*c.begin().begin(), 3);
- BOOST_CHECK_EQUAL(*c.begin().begin().begin(), 1);
+ BOOST_CHECK_EQUAL(*c.end(), 7);
+ BOOST_CHECK_EQUAL(*c.begin(), 3);
+ BOOST_CHECK_EQUAL(*c.begin().begin(), 1);
- BOOST_CHECK_EQUAL(*c.begin().end().begin(), 4);
+ BOOST_CHECK_EQUAL(*c.begin().end(), 4);
- c = c.begin();
- BOOST_CHECK_EQUAL(*c.begin(), 3);
+ c.to_begin();
+ BOOST_CHECK_EQUAL(*c, 3);
bt.rotate(c); // Right rotate
c.to_parent().to_parent();
- BOOST_CHECK_EQUAL(*c.begin(), 3);
- c = c.end();
+ BOOST_CHECK_EQUAL(*c, 3);
+ c.to_end();
- BOOST_CHECK_EQUAL(*c.begin(), 6);
+ BOOST_CHECK_EQUAL(*c, 6);
- BOOST_CHECK_EQUAL(*c.parent(), 8);
- BOOST_CHECK_EQUAL(*c.parent().begin(), 3); // other invariant candidate
+ BOOST_CHECK_EQUAL(*c.parent().parent(), 8);
+ BOOST_CHECK_EQUAL(*c.parent().parent().begin(), 3);
- BOOST_CHECK_EQUAL(*--c, 3);
- BOOST_CHECK_EQUAL(*c.begin(), 1);
- BOOST_CHECK_EQUAL(*((++c).begin()).begin(), 4);
- BOOST_CHECK_EQUAL(*(++c.begin()).begin(), 7);
-
- BOOST_CHECK_EQUAL(*c.begin(), 6);
+ BOOST_CHECK_EQUAL(*c.parent(), 3);
+ BOOST_CHECK_EQUAL(*--c, 1);
+ BOOST_CHECK_EQUAL(*(++c).begin(), 4);
+ BOOST_CHECK_EQUAL(*c.end(), 7);
+
+ BOOST_CHECK_EQUAL(index(c), 1);
+ BOOST_CHECK_EQUAL(*c, 6);
// BOOST_CHECK_EQUAL(*c.parent().parent().begin(), 6);
// BOOST_CHECK_EQUAL(*c.parent().parent().end().begin(), 7);
@@ -451,4 +450,4 @@
// BOOST_CHECK_EQUAL(*c.parent().parent().end().begin(), 7);
}
-BOOST_AUTO_TEST_SUITE_END()
\ No newline at end of file
+BOOST_AUTO_TEST_SUITE_END()
Modified: sandbox/SOC/2006/tree/trunk/libs/tree/test/predecessor_test.cpp
==============================================================================
--- sandbox/SOC/2006/tree/trunk/libs/tree/test/predecessor_test.cpp (original)
+++ sandbox/SOC/2006/tree/trunk/libs/tree/test/predecessor_test.cpp 2009-11-03 15:58:50 EST (Tue, 03 Nov 2009)
@@ -59,6 +59,7 @@
BOOST_CHECK(c == d);
BOOST_CHECK_EQUAL(boost::tree::predecessor(Order(), c), false);
+ BOOST_CHECK(c == frbt1.root());
}
BOOST_AUTO_TEST_SUITE_END()
Modified: sandbox/SOC/2006/tree/trunk/libs/tree/test/successor_test.cpp
==============================================================================
--- sandbox/SOC/2006/tree/trunk/libs/tree/test/successor_test.cpp (original)
+++ sandbox/SOC/2006/tree/trunk/libs/tree/test/successor_test.cpp 2009-11-03 15:58:50 EST (Tue, 03 Nov 2009)
@@ -54,6 +54,7 @@
BOOST_CHECK(c == d);
BOOST_CHECK_EQUAL(boost::tree::successor(Order(), c), false);
+ BOOST_CHECK(c == frbt1.root());
}
BOOST_AUTO_TEST_CASE( test_successor_ascending )
@@ -70,4 +71,4 @@
BOOST_CHECK_EQUAL(*c, 8);
}
-BOOST_AUTO_TEST_SUITE_END()
\ No newline at end of file
+BOOST_AUTO_TEST_SUITE_END()
Modified: sandbox/SOC/2006/tree/trunk/libs/tree/test/to_last_test.cpp
==============================================================================
--- sandbox/SOC/2006/tree/trunk/libs/tree/test/to_last_test.cpp (original)
+++ sandbox/SOC/2006/tree/trunk/libs/tree/test/to_last_test.cpp 2009-11-03 15:58:50 EST (Tue, 03 Nov 2009)
@@ -55,6 +55,13 @@
fake_to_last(inorder(), d);
boost::tree::past_to_last(inorder(), c);
BOOST_CHECK(c == d);
+
+ c = frbt1.root();
+ fake_to_past(inorder(), c);
+ d = frbt1.root();
+ fake_to_last(inorder(), d);
+ boost::tree::predecessor(inorder(), c);
+ BOOST_CHECK(c == d);
}
BOOST_AUTO_TEST_SUITE_END()
Modified: sandbox/SOC/2006/tree/trunk/libs/tree/test/transform_test.cpp
==============================================================================
--- sandbox/SOC/2006/tree/trunk/libs/tree/test/transform_test.cpp (original)
+++ sandbox/SOC/2006/tree/trunk/libs/tree/test/transform_test.cpp 2009-11-03 15:58:50 EST (Tue, 03 Nov 2009)
@@ -34,7 +34,7 @@
typename container_type::const_iterator cie = order_index.end();
mock_binary_cursor< typename container_type::const_iterator > mc(ci, cie);
- boost::tree::transform(Order(), fbt1.root(), mc, std::bind2nd(std::plus<int>(),0));
+ //boost::tree::transform(Order(), fbt1.root(), mc, std::bind2nd(std::plus<int>(),0));
}
BOOST_AUTO_TEST_CASE_TEMPLATE( test_transform_ascending, Order, orders)
@@ -47,10 +47,10 @@
typename container_type::const_iterator ci = order_index.begin();
typename container_type::const_iterator cie = order_index.end();
- mock_binary_cursor< typename container_type::const_iterator > mc(ci, cie);
+// mock_binary_cursor< typename container_type::const_iterator > mc(ci, cie);
- fake_binary_tree<int, boost::tree::ascending_vertical_traversal_tag> fabt1(fbt1);
- boost::tree::transform(Order(), fabt1.root(), mc, std::bind2nd(std::plus<int>(),0));
+// fake_binary_tree<int, boost::tree::ascending_vertical_traversal_tag> fabt1(fbt1);
+// boost::tree::transform(Order(), fabt1.root(), mc, std::bind2nd(std::plus<int>(),0));
}
-BOOST_AUTO_TEST_SUITE_END()
\ No newline at end of file
+BOOST_AUTO_TEST_SUITE_END()
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