Chris@16: // Chris@16: //======================================================================= Chris@16: // Copyright 1997, 1998, 1999, 2000 University of Notre Dame. Chris@16: // Authors: Andrew Lumsdaine, Lie-Quan Lee, Jeremy G. Siek Chris@16: // Chris@16: // Distributed under the Boost Software License, Version 1.0. (See Chris@16: // accompanying file LICENSE_1_0.txt or copy at Chris@16: // http://www.boost.org/LICENSE_1_0.txt) Chris@16: //======================================================================= Chris@16: // Chris@16: #ifndef BOOST_ARRAY_BINARY_TREE_HPP Chris@16: #define BOOST_ARRAY_BINARY_TREE_HPP Chris@16: Chris@16: #include Chris@16: #include Chris@16: #include Chris@16: Chris@16: namespace boost { Chris@16: Chris@16: /* Chris@16: * Note: array_binary_tree is a completey balanced binary tree. Chris@16: */ Chris@16: #if !defined BOOST_NO_STD_ITERATOR_TRAITS Chris@16: template Chris@16: #else Chris@16: template Chris@16: #endif Chris@16: class array_binary_tree_node { Chris@16: public: Chris@16: typedef array_binary_tree_node ArrayBinaryTreeNode; Chris@16: typedef RandomAccessIterator rep_iterator; Chris@16: #if !defined BOOST_NO_STD_ITERATOR_TRAITS Chris@16: typedef typename std::iterator_traits::difference_type Chris@16: difference_type; Chris@16: typedef typename std::iterator_traits::value_type Chris@16: value_type; Chris@16: #else Chris@16: typedef int difference_type; Chris@16: typedef ValueType value_type; Chris@16: #endif Chris@16: typedef difference_type size_type; Chris@16: Chris@16: struct children_type { Chris@16: struct iterator Chris@16: : boost::iterator Chris@16: { // replace with iterator_adaptor implementation -JGS Chris@16: Chris@16: inline iterator() : i(0), n(0) { } Chris@16: inline iterator(const iterator& x) : r(x.r), i(x.i), n(x.n), id(x.id) { } Chris@16: inline iterator& operator=(const iterator& x) { Chris@16: r = x.r; i = x.i; n = x.n; Chris@16: /*egcs generate a warning*/ Chris@16: id = x.id; Chris@16: return *this; Chris@16: } Chris@16: inline iterator(rep_iterator rr, Chris@16: size_type ii, Chris@16: size_type nn, Chris@16: const ID& _id) : r(rr), i(ii), n(nn), id(_id) { } Chris@16: inline array_binary_tree_node operator*() { Chris@16: return ArrayBinaryTreeNode(r, i, n, id); } Chris@16: inline iterator& operator++() { ++i; return *this; } Chris@16: inline iterator operator++(int) Chris@16: { iterator t = *this; ++(*this); return t; } Chris@16: inline bool operator==(const iterator& x) const { return i == x.i; } Chris@16: inline bool operator!=(const iterator& x) const Chris@16: { return !(*this == x); } Chris@16: rep_iterator r; Chris@16: size_type i; Chris@16: size_type n; Chris@16: ID id; Chris@16: }; Chris@16: inline children_type() : i(0), n(0) { } Chris@16: inline children_type(const children_type& x) Chris@16: : r(x.r), i(x.i), n(x.n), id(x.id) { } Chris@16: inline children_type& operator=(const children_type& x) { Chris@16: r = x.r; i = x.i; n = x.n; Chris@16: /*egcs generate a warning*/ Chris@16: id = x.id; Chris@16: return *this; Chris@16: } Chris@16: inline children_type(rep_iterator rr, Chris@16: size_type ii, Chris@16: size_type nn, Chris@16: const ID& _id) : r(rr), i(ii), n(nn), id(_id) { } Chris@16: inline iterator begin() { return iterator(r, 2 * i + 1, n, id); } Chris@16: inline iterator end() { return iterator(r, 2 * i + 1 + size(), n, id); } Chris@16: inline size_type size() const { Chris@16: size_type c = 2 * i + 1; Chris@16: size_type s; Chris@16: if (c + 1 < n) s = 2; Chris@16: else if (c < n) s = 1; Chris@16: else s = 0; Chris@16: return s; Chris@16: } Chris@16: rep_iterator r; Chris@16: size_type i; Chris@16: size_type n; Chris@16: ID id; Chris@16: }; Chris@16: inline array_binary_tree_node() : i(0), n(0) { } Chris@16: inline array_binary_tree_node(const array_binary_tree_node& x) Chris@16: : r(x.r), i(x.i), n(x.n), id(x.id) { } Chris@16: inline ArrayBinaryTreeNode& operator=(const ArrayBinaryTreeNode& x) { Chris@16: r = x.r; Chris@16: i = x.i; Chris@16: n = x.n; Chris@16: /*egcs generate a warning*/ Chris@16: id = x.id; Chris@16: return *this; Chris@16: } Chris@16: inline array_binary_tree_node(rep_iterator start, Chris@16: rep_iterator end, Chris@16: rep_iterator pos, const ID& _id) Chris@16: : r(start), i(pos - start), n(end - start), id(_id) { } Chris@16: inline array_binary_tree_node(rep_iterator rr, Chris@16: size_type ii, Chris@16: size_type nn, const ID& _id) Chris@16: : r(rr), i(ii), n(nn), id(_id) { } Chris@16: inline value_type& value() { return *(r + i); } Chris@16: inline const value_type& value() const { return *(r + i); } Chris@16: inline ArrayBinaryTreeNode parent() const { Chris@16: return ArrayBinaryTreeNode(r, (i - 1) / 2, n, id); Chris@16: } Chris@16: inline bool has_parent() const { return i != 0; } Chris@16: inline children_type children() { return children_type(r, i, n, id); } Chris@16: /* Chris@16: inline void swap(array_binary_tree_node x) { Chris@16: value_type tmp = x.value(); Chris@16: x.value() = value(); Chris@16: value() = tmp; Chris@16: i = x.i; Chris@16: } Chris@16: */ Chris@16: template Chris@16: inline void swap(ArrayBinaryTreeNode x, ExternalData& edata ) { Chris@16: using boost::get; Chris@16: Chris@16: value_type tmp = x.value(); Chris@16: Chris@16: /*swap external data*/ Chris@16: edata[ get(id, tmp) ] = i; Chris@16: edata[ get(id, value()) ] = x.i; Chris@16: Chris@16: x.value() = value(); Chris@16: value() = tmp; Chris@16: i = x.i; Chris@16: } Chris@16: inline const children_type children() const { Chris@16: return children_type(r, i, n); Chris@16: } Chris@16: inline size_type index() const { return i; } Chris@16: rep_iterator r; Chris@16: size_type i; Chris@16: size_type n; Chris@16: ID id; Chris@16: }; Chris@16: Chris@16: template > Chris@16: struct compare_array_node { Chris@16: typedef typename RandomAccessContainer::value_type value_type; Chris@16: compare_array_node(const Compare& x) : comp(x) {} Chris@16: compare_array_node(const compare_array_node& x) : comp(x.comp) {} Chris@16: Chris@16: template< class node_type > Chris@16: inline bool operator()(const node_type& x, const node_type& y) { Chris@16: return comp(x.value(), y.value()); Chris@16: } Chris@16: Chris@16: template< class node_type > Chris@16: inline bool operator()(const node_type& x, const node_type& y) const { Chris@16: return comp(x.value(), y.value()); Chris@16: } Chris@16: Compare comp; Chris@16: }; Chris@16: Chris@16: } // namespace boost Chris@16: Chris@16: #endif /* BOOST_ARRAY_BINARY_TREE_HPP */