1ffeaf689SAlexander Kabaev // std::list utilities implementation -*- C++ -*-
2ffeaf689SAlexander Kabaev
3*f8a1b7d9SAlexander Kabaev // Copyright (C) 2003, 2005 Free Software Foundation, Inc.
4ffeaf689SAlexander Kabaev //
5ffeaf689SAlexander Kabaev // This file is part of the GNU ISO C++ Library. This library is free
6ffeaf689SAlexander Kabaev // software; you can redistribute it and/or modify it under the
7ffeaf689SAlexander Kabaev // terms of the GNU General Public License as published by the
8ffeaf689SAlexander Kabaev // Free Software Foundation; either version 2, or (at your option)
9ffeaf689SAlexander Kabaev // any later version.
10ffeaf689SAlexander Kabaev
11ffeaf689SAlexander Kabaev // This library is distributed in the hope that it will be useful,
12ffeaf689SAlexander Kabaev // but WITHOUT ANY WARRANTY; without even the implied warranty of
13ffeaf689SAlexander Kabaev // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
14ffeaf689SAlexander Kabaev // GNU General Public License for more details.
15ffeaf689SAlexander Kabaev
16ffeaf689SAlexander Kabaev // You should have received a copy of the GNU General Public License along
17ffeaf689SAlexander Kabaev // with this library; see the file COPYING. If not, write to the Free
18*f8a1b7d9SAlexander Kabaev // Software Foundation, 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301,
19ffeaf689SAlexander Kabaev // USA.
20ffeaf689SAlexander Kabaev
21ffeaf689SAlexander Kabaev // As a special exception, you may use this file as part of a free software
22ffeaf689SAlexander Kabaev // library without restriction. Specifically, if other files instantiate
23ffeaf689SAlexander Kabaev // templates or use macros or inline functions from this file, or you compile
24ffeaf689SAlexander Kabaev // this file and link it with other files to produce an executable, this
25ffeaf689SAlexander Kabaev // file does not by itself cause the resulting executable to be covered by
26ffeaf689SAlexander Kabaev // the GNU General Public License. This exception does not however
27ffeaf689SAlexander Kabaev // invalidate any other reasons why the executable file might be covered by
28ffeaf689SAlexander Kabaev // the GNU General Public License.
29ffeaf689SAlexander Kabaev
30ffeaf689SAlexander Kabaev /*
31ffeaf689SAlexander Kabaev *
32ffeaf689SAlexander Kabaev * Copyright (c) 1994
33ffeaf689SAlexander Kabaev * Hewlett-Packard Company
34ffeaf689SAlexander Kabaev *
35ffeaf689SAlexander Kabaev * Permission to use, copy, modify, distribute and sell this software
36ffeaf689SAlexander Kabaev * and its documentation for any purpose is hereby granted without fee,
37ffeaf689SAlexander Kabaev * provided that the above copyright notice appear in all copies and
38ffeaf689SAlexander Kabaev * that both that copyright notice and this permission notice appear
39ffeaf689SAlexander Kabaev * in supporting documentation. Hewlett-Packard Company makes no
40ffeaf689SAlexander Kabaev * representations about the suitability of this software for any
41ffeaf689SAlexander Kabaev * purpose. It is provided "as is" without express or implied warranty.
42ffeaf689SAlexander Kabaev *
43ffeaf689SAlexander Kabaev *
44ffeaf689SAlexander Kabaev * Copyright (c) 1996,1997
45ffeaf689SAlexander Kabaev * Silicon Graphics Computer Systems, Inc.
46ffeaf689SAlexander Kabaev *
47ffeaf689SAlexander Kabaev * Permission to use, copy, modify, distribute and sell this software
48ffeaf689SAlexander Kabaev * and its documentation for any purpose is hereby granted without fee,
49ffeaf689SAlexander Kabaev * provided that the above copyright notice appear in all copies and
50ffeaf689SAlexander Kabaev * that both that copyright notice and this permission notice appear
51ffeaf689SAlexander Kabaev * in supporting documentation. Silicon Graphics makes no
52ffeaf689SAlexander Kabaev * representations about the suitability of this software for any
53ffeaf689SAlexander Kabaev * purpose. It is provided "as is" without express or implied warranty.
54ffeaf689SAlexander Kabaev */
55ffeaf689SAlexander Kabaev
56ffeaf689SAlexander Kabaev #include <list>
57ffeaf689SAlexander Kabaev
_GLIBCXX_BEGIN_NESTED_NAMESPACE(std,_GLIBCXX_STD)58*f8a1b7d9SAlexander Kabaev _GLIBCXX_BEGIN_NESTED_NAMESPACE(std, _GLIBCXX_STD)
59*f8a1b7d9SAlexander Kabaev
60ffeaf689SAlexander Kabaev void
61ffeaf689SAlexander Kabaev _List_node_base::swap(_List_node_base& __x, _List_node_base& __y)
62ffeaf689SAlexander Kabaev {
63ffeaf689SAlexander Kabaev if ( __x._M_next != &__x )
64ffeaf689SAlexander Kabaev {
65ffeaf689SAlexander Kabaev if ( __y._M_next != &__y )
66ffeaf689SAlexander Kabaev {
67ffeaf689SAlexander Kabaev // Both __x and __y are not empty.
68ffeaf689SAlexander Kabaev std::swap(__x._M_next,__y._M_next);
69ffeaf689SAlexander Kabaev std::swap(__x._M_prev,__y._M_prev);
70ffeaf689SAlexander Kabaev __x._M_next->_M_prev = __x._M_prev->_M_next = &__x;
71ffeaf689SAlexander Kabaev __y._M_next->_M_prev = __y._M_prev->_M_next = &__y;
72ffeaf689SAlexander Kabaev }
73ffeaf689SAlexander Kabaev else
74ffeaf689SAlexander Kabaev {
75ffeaf689SAlexander Kabaev // __x is not empty, __y is empty.
76ffeaf689SAlexander Kabaev __y._M_next = __x._M_next;
77ffeaf689SAlexander Kabaev __y._M_prev = __x._M_prev;
78ffeaf689SAlexander Kabaev __y._M_next->_M_prev = __y._M_prev->_M_next = &__y;
79ffeaf689SAlexander Kabaev __x._M_next = __x._M_prev = &__x;
80ffeaf689SAlexander Kabaev }
81ffeaf689SAlexander Kabaev }
82ffeaf689SAlexander Kabaev else if ( __y._M_next != &__y )
83ffeaf689SAlexander Kabaev {
84ffeaf689SAlexander Kabaev // __x is empty, __y is not empty.
85ffeaf689SAlexander Kabaev __x._M_next = __y._M_next;
86ffeaf689SAlexander Kabaev __x._M_prev = __y._M_prev;
87ffeaf689SAlexander Kabaev __x._M_next->_M_prev = __x._M_prev->_M_next = &__x;
88ffeaf689SAlexander Kabaev __y._M_next = __y._M_prev = &__y;
89ffeaf689SAlexander Kabaev }
90ffeaf689SAlexander Kabaev }
91ffeaf689SAlexander Kabaev
92ffeaf689SAlexander Kabaev void
transfer(_List_node_base * const __first,_List_node_base * const __last)93ffeaf689SAlexander Kabaev _List_node_base::transfer(_List_node_base * const __first,
94ffeaf689SAlexander Kabaev _List_node_base * const __last)
95ffeaf689SAlexander Kabaev {
96ffeaf689SAlexander Kabaev if (this != __last)
97ffeaf689SAlexander Kabaev {
98ffeaf689SAlexander Kabaev // Remove [first, last) from its old position.
99ffeaf689SAlexander Kabaev __last->_M_prev->_M_next = this;
100ffeaf689SAlexander Kabaev __first->_M_prev->_M_next = __last;
101ffeaf689SAlexander Kabaev this->_M_prev->_M_next = __first;
102ffeaf689SAlexander Kabaev
103ffeaf689SAlexander Kabaev // Splice [first, last) into its new position.
104ffeaf689SAlexander Kabaev _List_node_base* const __tmp = this->_M_prev;
105ffeaf689SAlexander Kabaev this->_M_prev = __last->_M_prev;
106ffeaf689SAlexander Kabaev __last->_M_prev = __first->_M_prev;
107ffeaf689SAlexander Kabaev __first->_M_prev = __tmp;
108ffeaf689SAlexander Kabaev }
109ffeaf689SAlexander Kabaev }
110ffeaf689SAlexander Kabaev
111ffeaf689SAlexander Kabaev void
reverse()112ffeaf689SAlexander Kabaev _List_node_base::reverse()
113ffeaf689SAlexander Kabaev {
114ffeaf689SAlexander Kabaev _List_node_base* __tmp = this;
115ffeaf689SAlexander Kabaev do
116ffeaf689SAlexander Kabaev {
117ffeaf689SAlexander Kabaev std::swap(__tmp->_M_next, __tmp->_M_prev);
118ffeaf689SAlexander Kabaev __tmp = __tmp->_M_prev; // Old next node is now prev.
119ffeaf689SAlexander Kabaev }
120ffeaf689SAlexander Kabaev while (__tmp != this);
121ffeaf689SAlexander Kabaev }
122ffeaf689SAlexander Kabaev
123ffeaf689SAlexander Kabaev void
hook(_List_node_base * const __position)124ffeaf689SAlexander Kabaev _List_node_base::hook(_List_node_base* const __position)
125ffeaf689SAlexander Kabaev {
126ffeaf689SAlexander Kabaev this->_M_next = __position;
127ffeaf689SAlexander Kabaev this->_M_prev = __position->_M_prev;
128ffeaf689SAlexander Kabaev __position->_M_prev->_M_next = this;
129ffeaf689SAlexander Kabaev __position->_M_prev = this;
130ffeaf689SAlexander Kabaev }
131ffeaf689SAlexander Kabaev
132ffeaf689SAlexander Kabaev void
unhook()133ffeaf689SAlexander Kabaev _List_node_base::unhook()
134ffeaf689SAlexander Kabaev {
135ffeaf689SAlexander Kabaev _List_node_base* const __next_node = this->_M_next;
136ffeaf689SAlexander Kabaev _List_node_base* const __prev_node = this->_M_prev;
137ffeaf689SAlexander Kabaev __prev_node->_M_next = __next_node;
138ffeaf689SAlexander Kabaev __next_node->_M_prev = __prev_node;
139ffeaf689SAlexander Kabaev }
140ffeaf689SAlexander Kabaev
141*f8a1b7d9SAlexander Kabaev _GLIBCXX_END_NESTED_NAMESPACE
142