123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239 |
- //
- //=======================================================================
- // Copyright 1997, 1998, 1999, 2000 University of Notre Dame.
- // Authors: Andrew Lumsdaine, Lie-Quan Lee, Jeremy G. Siek
- //
- // 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)
- //=======================================================================
- //
- #ifndef BOOST_ARRAY_BINARY_TREE_HPP
- #define BOOST_ARRAY_BINARY_TREE_HPP
- #include <iterator>
- #include <functional>
- #include <boost/config.hpp>
- namespace boost
- {
- /*
- * Note: array_binary_tree is a completey balanced binary tree.
- */
- #if !defined BOOST_NO_STD_ITERATOR_TRAITS
- template < class RandomAccessIterator, class ID >
- #else
- template < class RandomAccessIterator, class ValueType, class ID >
- #endif
- class array_binary_tree_node
- {
- public:
- typedef array_binary_tree_node ArrayBinaryTreeNode;
- typedef RandomAccessIterator rep_iterator;
- #if !defined BOOST_NO_STD_ITERATOR_TRAITS
- typedef
- typename std::iterator_traits< RandomAccessIterator >::difference_type
- difference_type;
- typedef typename std::iterator_traits< RandomAccessIterator >::value_type
- value_type;
- #else
- typedef int difference_type;
- typedef ValueType value_type;
- #endif
- typedef difference_type size_type;
- struct children_type
- {
- struct iterator
- { // replace with iterator_adaptor implementation -JGS
- typedef std::bidirectional_iterator_tag iterator_category;
- typedef ArrayBinaryTreeNode value_type;
- typedef size_type difference_type;
- typedef array_binary_tree_node* pointer;
- typedef ArrayBinaryTreeNode& reference;
- inline iterator() : i(0), n(0) {}
- inline iterator(const iterator& x)
- : r(x.r), i(x.i), n(x.n), id(x.id)
- {
- }
- inline iterator& operator=(const iterator& x)
- {
- r = x.r;
- i = x.i;
- n = x.n;
- /*egcs generate a warning*/
- id = x.id;
- return *this;
- }
- inline iterator(
- rep_iterator rr, size_type ii, size_type nn, const ID& _id)
- : r(rr), i(ii), n(nn), id(_id)
- {
- }
- inline array_binary_tree_node operator*()
- {
- return ArrayBinaryTreeNode(r, i, n, id);
- }
- inline iterator& operator++()
- {
- ++i;
- return *this;
- }
- inline iterator operator++(int)
- {
- iterator t = *this;
- ++(*this);
- return t;
- }
- inline iterator& operator--()
- {
- --i;
- return *this;
- }
- inline iterator operator--(int)
- {
- iterator t = *this;
- --(*this);
- return t;
- }
- inline bool operator==(const iterator& x) const { return i == x.i; }
- inline bool operator!=(const iterator& x) const
- {
- return !(*this == x);
- }
- rep_iterator r;
- size_type i;
- size_type n;
- ID id;
- };
- inline children_type() : i(0), n(0) {}
- inline children_type(const children_type& x)
- : r(x.r), i(x.i), n(x.n), id(x.id)
- {
- }
- inline children_type& operator=(const children_type& x)
- {
- r = x.r;
- i = x.i;
- n = x.n;
- /*egcs generate a warning*/
- id = x.id;
- return *this;
- }
- inline children_type(
- rep_iterator rr, size_type ii, size_type nn, const ID& _id)
- : r(rr), i(ii), n(nn), id(_id)
- {
- }
- inline iterator begin() { return iterator(r, 2 * i + 1, n, id); }
- inline iterator end() { return iterator(r, 2 * i + 1 + size(), n, id); }
- inline size_type size() const
- {
- size_type c = 2 * i + 1;
- size_type s;
- if (c + 1 < n)
- s = 2;
- else if (c < n)
- s = 1;
- else
- s = 0;
- return s;
- }
- rep_iterator r;
- size_type i;
- size_type n;
- ID id;
- };
- inline array_binary_tree_node() : i(0), n(0) {}
- inline array_binary_tree_node(const array_binary_tree_node& x)
- : r(x.r), i(x.i), n(x.n), id(x.id)
- {
- }
- inline ArrayBinaryTreeNode& operator=(const ArrayBinaryTreeNode& x)
- {
- r = x.r;
- i = x.i;
- n = x.n;
- /*egcs generate a warning*/
- id = x.id;
- return *this;
- }
- inline array_binary_tree_node(
- rep_iterator start, rep_iterator end, rep_iterator pos, const ID& _id)
- : r(start), i(pos - start), n(end - start), id(_id)
- {
- }
- inline array_binary_tree_node(
- rep_iterator rr, size_type ii, size_type nn, const ID& _id)
- : r(rr), i(ii), n(nn), id(_id)
- {
- }
- inline value_type& value() { return *(r + i); }
- inline const value_type& value() const { return *(r + i); }
- inline ArrayBinaryTreeNode parent() const
- {
- return ArrayBinaryTreeNode(r, (i - 1) / 2, n, id);
- }
- inline bool has_parent() const { return i != 0; }
- inline children_type children() { return children_type(r, i, n, id); }
- /*
- inline void swap(array_binary_tree_node x) {
- value_type tmp = x.value();
- x.value() = value();
- value() = tmp;
- i = x.i;
- }
- */
- template < class ExternalData >
- inline void swap(ArrayBinaryTreeNode x, ExternalData& edata)
- {
- using boost::get;
- value_type tmp = x.value();
- /*swap external data*/
- edata[get(id, tmp)] = i;
- edata[get(id, value())] = x.i;
- x.value() = value();
- value() = tmp;
- i = x.i;
- }
- inline const children_type children() const
- {
- return children_type(r, i, n);
- }
- inline size_type index() const { return i; }
- rep_iterator r;
- size_type i;
- size_type n;
- ID id;
- };
- template < class RandomAccessContainer,
- class Compare = std::less< typename RandomAccessContainer::value_type > >
- struct compare_array_node
- {
- typedef typename RandomAccessContainer::value_type value_type;
- compare_array_node(const Compare& x) : comp(x) {}
- compare_array_node(const compare_array_node& x) : comp(x.comp) {}
- template < class node_type >
- inline bool operator()(const node_type& x, const node_type& y)
- {
- return comp(x.value(), y.value());
- }
- template < class node_type >
- inline bool operator()(const node_type& x, const node_type& y) const
- {
- return comp(x.value(), y.value());
- }
- Compare comp;
- };
- } // namespace boost
- #endif /* BOOST_ARRAY_BINARY_TREE_HPP */
|