Attempt to represent the S^2->S^3 header reorganisation as a series of "hg rename" operations
1 //=======================================================================
2 // Copyright 2002 Indiana University.
3 // Authors: Andrew Lumsdaine, Lie-Quan Lee, Jeremy G. Siek
5 // Distributed under the Boost Software License, Version 1.0. (See
6 // accompanying file LICENSE_1_0.txt or copy at
7 // http://www.boost.org/LICENSE_1_0.txt)
8 //=======================================================================
10 #ifndef BOOST_LIST_BASE_HPP
11 #define BOOST_LIST_BASE_HPP
13 #include <boost/iterator_adaptors.hpp>
15 // Perhaps this should go through formal review, and move to <boost/>.
18 An alternate interface idea:
19 Extend the std::list functionality by creating remove/insert
20 functions that do not require the container object!
26 //=========================================================================
27 // Linked-List Generic Implementation Functions
29 template <class Node, class Next>
31 slist_insert_after(Node pos, Node x,
39 // return next(pos) or next(next(pos)) ?
40 template <class Node, class Next>
42 slist_remove_after(Node pos,
50 template <class Node, class Next>
52 slist_remove_range(Node before_first, Node last,
55 next(before_first) = last;
59 template <class Node, class Next>
61 slist_previous(Node head, Node x, Node nil,
64 while (head != nil && next(head) != x)
69 template<class Node, class Next>
71 slist_splice_after(Node pos, Node before_first, Node before_last,
74 if (pos != before_first && pos != before_last) {
75 Node first = next(before_first);
76 Node after = next(pos);
77 next(before_first) = next(before_last);
79 next(before_last) = after;
83 template <class Node, class Next>
85 slist_reverse(Node node, Node nil,
92 Node next = next(node);
100 template <class Node, class Next>
102 slist_size(Node head, Node nil,
106 for ( ; head != nil; head = next(head))
111 template <class Next, class Data>
112 class slist_iterator_policies
115 explicit slist_iterator_policies(const Next& n, const Data& d)
116 : m_next(n), m_data(d) { }
118 template <class Reference, class Node>
119 Reference dereference(type<Reference>, const Node& x) const
120 { return m_data(x); }
122 template <class Node>
123 void increment(Node& x) const
126 template <class Node>
127 bool equal(Node& x, Node& y) const
135 //===========================================================================
136 // Doubly-Linked List Generic Implementation Functions
138 template <class Node, class Next, class Prev>
140 dlist_insert_before(Node pos, Node x,
141 Next next, Prev prev)
149 template <class Node, class Next, class Prev>
151 dlist_remove(Node pos,
152 Next next, Prev prev)
154 Node next_node = next(pos);
155 Node prev_node = prev(pos);
156 next(prev_node) = next_node;
157 prev(next_node) = prev_node;
160 // This deletes every node in the list except the
162 template <class Node, class Delete>
164 dlist_clear(Node sentinel, Delete del)
168 while (i != sentinel) {
175 template <class Node>
177 dlist_empty(Node dummy)
179 return next(dummy) == dummy;
182 template <class Node, class Next, class Prev>
184 dlist_transfer(Node pos, Node first, Node last,
185 Next next, Prev prev)
188 // Remove [first,last) from its old position
189 next(prev(last)) = pos;
190 next(prev(first)) = last;
191 next(prev(pos)) = first;
193 // Splice [first,last) into its new position
194 Node tmp = prev(pos);
195 prev(pos) = prev(last);
196 prev(last) = prev(first);
201 template <class Next, class Prev, class Data>
202 class dlist_iterator_policies
203 : public slist_iterator_policies<Next, Data>
205 typedef slist_iterator_policies<Next, Data> Base;
207 template <class Node>
208 void decrement(Node& x) const
211 dlist_iterator_policies(Next n, Prev p, Data d)
212 : Base(n,d), m_prev(p) { }
217 } // namespace detail
220 #endif // BOOST_LIST_BASE_HPP