|
Boost-Commit : |
From: ockham_at_[hidden]
Date: 2008-08-03 05:33:18
Author: bernhard.reiter
Date: 2008-08-03 05:33:17 EDT (Sun, 03 Aug 2008)
New Revision: 47955
URL: http://svn.boost.org/trac/boost/changeset/47955
Log:
Cleanup of is_root() logic largely finished.
Text files modified:
sandbox/SOC/2006/tree/trunk/TODO | 30 ++++++++++++++++--------------
sandbox/SOC/2006/tree/trunk/boost/tree/balanced_tree.hpp | 38 ++++++++++++++++++++++++++++++++++++--
sandbox/SOC/2006/tree/trunk/boost/tree/binary_tree.hpp | 3 +--
sandbox/SOC/2006/tree/trunk/boost/tree/detail/cursor/nary.hpp | 7 ++-----
sandbox/SOC/2006/tree/trunk/libs/tree/doc/html/proposal.html | 2 +-
5 files changed, 56 insertions(+), 24 deletions(-)
Modified: sandbox/SOC/2006/tree/trunk/TODO
==============================================================================
--- sandbox/SOC/2006/tree/trunk/TODO (original)
+++ sandbox/SOC/2006/tree/trunk/TODO 2008-08-03 05:33:17 EDT (Sun, 03 Aug 2008)
@@ -15,22 +15,10 @@
General:
+* Revisit binary_tree (inorder::)iterator functions
* Possibly sort out some more concepts, like trees with "downwards" or "upwards" insertion
(insert()/insert_above()), trees with values only at the leaves (makes sense in combination
with "upwards" insertion"), etc.
-* === The is_root problem() and its solution ===
- Get rid of checks for/assignments to root in pre/post/inorder algorithms,
- as they are otherwise limited to "whole" trees and cannot be applied to subtrees.
- In order to work for subtrees, it's probable that we need at least an int to store
- the current depth.
- Solution:
- Introduce a root tracking cursor concept providing c.is_root(). *order::forward(), back(),
- next() and prior() functions as well as *order::iterators then require this concept.
- Write a root_tracking_cursor adaptor that does exactly that, with suitable specializations
- for different underlying cursors.
- (Why? Because any root_tracker object would have to be
- passed along with a cursor, plus in- or decremented when going down or up in the hierarchy,
- resp. This kind of naturally suggests some kind of encapsulation/adaptation.)
* Do we want/need an O(1) inorder_begin() for binary_tree?
Does Gnu's rb_tree (used in std::map) have one?
* Is it really a good idea to use InCursor::size_type for size(Cursor)?
@@ -110,7 +98,8 @@
(and output_cursor_iterator_wrapper?) proposal.
* Add a revision log:
* Add to_parent() (replaces operator!()), to_begin() and to_end() descending cursor members.
- * Remove shoot(), size()
+ * Remove shoot(), size() (rationale for size(): see std::list::size() O(n) vs O(1) discussion,
+ esp the Howard Hinnant comments, http://home.twcny.rr.com/hinnant/cpp_extensions/On_list_size.html )
* Change some occurences of "vector" (oops) to the respective tree type.
* Add (subtree) cursor algorithms.
* Probably split up cursor categories into: cursor (value access) category, vertical traversal
@@ -148,6 +137,19 @@
depict what is introduced at what step (nodes with pointers to their siblings, children, parents,
a frame around a given cursor [and possibly additionally required information stated]
that signifies what amount of information is contained within that cursor.
+* Add some rationale about the is_root problem() and its solution:
+ Get rid of checks for/assignments to root in pre/post/inorder algorithms,
+ as they are otherwise limited to "whole" trees and cannot be applied to subtrees.
+ In order to work for subtrees, we need at least an int to store
+ the current depth.
+ Solution:
+ Introduce a root tracking cursor concept providing c.is_root(). *order::forward(), back(),
+ next() and prior() functions as well as *order::iterators then require this concept.
+ Write a root_tracking_cursor adaptor that does exactly that, with suitable specializations
+ for different underlying cursors.
+ (Why? Because any root_tracker object would have to be
+ passed along with a cursor, plus in- or decremented when going down or up in the hierarchy,
+ resp. This kind of naturally suggests some kind of encapsulation/adaptation.)
Further applications:
Modified: sandbox/SOC/2006/tree/trunk/boost/tree/balanced_tree.hpp
==============================================================================
--- sandbox/SOC/2006/tree/trunk/boost/tree/balanced_tree.hpp (original)
+++ sandbox/SOC/2006/tree/trunk/boost/tree/balanced_tree.hpp 2008-08-03 05:33:17 EDT (Sun, 03 Aug 2008)
@@ -40,6 +40,8 @@
struct empty_class { };
+// TODO: Remove Meta2. This stuff must be done via some MPL magic.
+
template <class Val, class Meta, class Meta2 = empty_class>
struct augmented_type {
typedef Val value_type;
@@ -77,6 +79,38 @@
typedef typename augmented_type<Val,Meta,Meta2>::metadata_type type;
};
+template <class Cursor>
+class is_on_top_cursor
+: public Cursor {
+public:
+ is_on_top_cursor()
+ : Cursor() {}
+
+ is_on_top_cursor(Cursor p)
+ : Cursor(p) {}
+
+ bool is_root() const
+ {
+ return this->is_on_top();
+ }
+};
+
+template <class Cursor>
+class balanced_tree_iterator
+: public inorder::iterator< is_on_top_cursor<Cursor> > {
+public:
+ balanced_tree_iterator()
+ : inorder::iterator< is_on_top_cursor<Cursor> >() {}
+
+ explicit balanced_tree_iterator(Cursor p)
+ : inorder::iterator< is_on_top_cursor<Cursor> >(p) {}
+
+ operator Cursor()
+ {
+ return Cursor(this->base());
+ }
+};
+
/**
* @brief A %balanced_tree.
* This class models the hierarchy concept, the container concept and the
@@ -105,8 +139,8 @@
typedef typename hierarchy_type::const_cursor const_cursor;
public:
- typedef augmented_iterator<inorder::iterator<cursor>, typename data_type::extract_data, bidirectional_traversal_tag> iterator;
- typedef augmented_iterator<inorder::iterator<const_cursor>, typename data_type::extract_data, bidirectional_traversal_tag> const_iterator;
+ typedef augmented_iterator<balanced_tree_iterator<cursor>, typename data_type::extract_data, bidirectional_traversal_tag> iterator;
+ typedef augmented_iterator<balanced_tree_iterator<const_cursor>, typename data_type::extract_data, bidirectional_traversal_tag> const_iterator;
typedef std::reverse_iterator<iterator> reverse_iterator;
typedef std::reverse_iterator<const_iterator> const_reverse_iterator;
Modified: sandbox/SOC/2006/tree/trunk/boost/tree/binary_tree.hpp
==============================================================================
--- sandbox/SOC/2006/tree/trunk/boost/tree/binary_tree.hpp (original)
+++ sandbox/SOC/2006/tree/trunk/boost/tree/binary_tree.hpp 2008-08-03 05:33:17 EDT (Sun, 03 Aug 2008)
@@ -566,8 +566,7 @@
inline bool operator==(binary_tree<Tp, Alloc> const& x
, binary_tree<Tp, Alloc> const& y)
{
- return (size(x.root()) == size(y.root())
- && equal(x.root(), y.root()));
+ return (size(x.root()) == size(y.root()) && equal(x.root(), y.root()));
}
/// Based on operator==
Modified: sandbox/SOC/2006/tree/trunk/boost/tree/detail/cursor/nary.hpp
==============================================================================
--- sandbox/SOC/2006/tree/trunk/boost/tree/detail/cursor/nary.hpp (original)
+++ sandbox/SOC/2006/tree/trunk/boost/tree/detail/cursor/nary.hpp 2008-08-03 05:33:17 EDT (Sun, 03 Aug 2008)
@@ -59,8 +59,6 @@
public:
- //friend class inorder::iterator< nary_tree_cursor<Node> >;
-
typedef typename mpl::eval_if<
is_const<Node>
, add_const<typename Node::value_type>
@@ -181,9 +179,8 @@
m_node = static_cast<base_pointer>(m_node->parent());
}
-public:
- // TODO This isn't really a permanently public thing.
- bool is_root() const
+protected:
+ bool is_on_top() const
{
base_pointer parent_begin_node =
static_cast<base_pointer>(m_node->parent())
Modified: sandbox/SOC/2006/tree/trunk/libs/tree/doc/html/proposal.html
==============================================================================
--- sandbox/SOC/2006/tree/trunk/libs/tree/doc/html/proposal.html (original)
+++ sandbox/SOC/2006/tree/trunk/libs/tree/doc/html/proposal.html 2008-08-03 05:33:17 EDT (Sun, 03 Aug 2008)
@@ -2512,7 +2512,7 @@
<i>// capacity:</i>
bool empty() const { return h.empty(); }
- size_type size() const { return h.size(); }
+ size_type size() const;
size_type max_size() const;
void resize(size_type sz, T c = T());
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