Attempt to represent the S^2->S^3 header reorganisation as a series of "hg rename" operations
1 /* Copyright 2003-2006 Joaquín M López Muñoz.
2 * Distributed under the Boost Software License, Version 1.0.
3 * (See accompanying file LICENSE_1_0.txt or copy at
4 * http://www.boost.org/LICENSE_1_0.txt)
6 * See http://www.boost.org/libs/multi_index for library home page.
9 #ifndef BOOST_MULTI_INDEX_DETAIL_SEQ_INDEX_NODE_HPP
10 #define BOOST_MULTI_INDEX_DETAIL_SEQ_INDEX_NODE_HPP
12 #if defined(_MSC_VER)&&(_MSC_VER>=1200)
20 namespace multi_index{
24 /* doubly-linked node for use by sequenced_index */
26 struct sequenced_index_node_impl
28 sequenced_index_node_impl*& prior(){return prior_;}
29 sequenced_index_node_impl* prior()const{return prior_;}
30 sequenced_index_node_impl*& next(){return next_;}
31 sequenced_index_node_impl* next()const{return next_;}
33 /* interoperability with bidir_node_iterator */
35 static void increment(sequenced_index_node_impl*& x){x=x->next();}
36 static void decrement(sequenced_index_node_impl*& x){x=x->prior();}
38 /* algorithmic stuff */
41 sequenced_index_node_impl* x,sequenced_index_node_impl* header)
43 x->prior()=header->prior();
45 x->prior()->next()=x->next()->prior()=x;
48 static void unlink(sequenced_index_node_impl* x)
50 x->prior()->next()=x->next();
51 x->next()->prior()=x->prior();
55 sequenced_index_node_impl* position,sequenced_index_node_impl* x)
58 x->prior()=position->prior();
60 x->prior()->next()=x->next()->prior()=x;
64 sequenced_index_node_impl* position,
65 sequenced_index_node_impl* x,sequenced_index_node_impl* y)
67 /* position is assumed not to be in [x,y) */
70 sequenced_index_node_impl* z=y->prior();
72 y->prior()=x->prior();
73 x->prior()=position->prior();
80 static void reverse(sequenced_index_node_impl* header)
82 sequenced_index_node_impl* x=header;
84 sequenced_index_node_impl* y=x->next();
85 std::swap(x->prior(),x->next());
90 static void swap(sequenced_index_node_impl* x,sequenced_index_node_impl* y)
92 /* This swap function does not exchange the header nodes,
93 * but rather their pointers. This is *not* used for implementing
94 * sequenced_index::swap.
99 std::swap(x->next(),y->next());
100 std::swap(x->prior(),y->prior());
101 x->next()->prior()=x->prior()->next()=x;
102 y->next()->prior()=y->prior()->next()=y;
106 y->prior()=x->prior();
107 x->next()=x->prior()=x;
108 y->next()->prior()=y->prior()->next()=y;
111 else if(y->next()!=y){
113 x->prior()=y->prior();
114 y->next()=y->prior()=y;
115 x->next()->prior()=x->prior()->next()=x;
120 sequenced_index_node_impl* prior_;
121 sequenced_index_node_impl* next_;
124 template<typename Super>
125 struct sequenced_index_node_trampoline:sequenced_index_node_impl{};
127 template<typename Super>
128 struct sequenced_index_node:Super,sequenced_index_node_trampoline<Super>
130 sequenced_index_node_impl*& prior(){return impl_type::prior();}
131 sequenced_index_node_impl* prior()const{return impl_type::prior();}
132 sequenced_index_node_impl*& next(){return impl_type::next();}
133 sequenced_index_node_impl* next()const{return impl_type::next();}
135 sequenced_index_node_impl* impl()
136 {return static_cast<impl_type*>(this);}
137 const sequenced_index_node_impl* impl()const
138 {return static_cast<const impl_type*>(this);}
140 static sequenced_index_node* from_impl(sequenced_index_node_impl *x)
141 {return static_cast<sequenced_index_node*>(static_cast<impl_type*>(x));}
142 static const sequenced_index_node* from_impl(
143 const sequenced_index_node_impl* x)
145 return static_cast<const sequenced_index_node*>(
146 static_cast<const impl_type*>(x));
149 /* interoperability with bidir_node_iterator */
151 static void increment(sequenced_index_node*& x)
153 sequenced_index_node_impl* xi=x->impl();
154 impl_type::increment(xi);
158 static void decrement(sequenced_index_node*& x)
160 sequenced_index_node_impl* xi=x->impl();
161 impl_type::decrement(xi);
166 typedef sequenced_index_node_trampoline<Super> impl_type;
169 } /* namespace multi_index::detail */
171 } /* namespace multi_index */
173 } /* namespace boost */