OSDN Git Service

2011-11-18 Paolo Carlini <paolo.carlini@oracle.com>
[pf3gnuchains/gcc-fork.git] / libstdc++-v3 / src / list.cc
index e1f82e6..6dbad69 100644 (file)
@@ -1,11 +1,11 @@
 // std::list utilities implementation -*- C++ -*-
 
-// Copyright (C) 2003, 2005 Free Software Foundation, Inc.
+// Copyright (C) 2003, 2005, 2009, 2010, 2011 Free Software Foundation, Inc.
 //
 // This file is part of the GNU ISO C++ Library.  This library is free
 // software; you can redistribute it and/or modify it under the
 // terms of the GNU General Public License as published by the
-// Free Software Foundation; either version 2, or (at your option)
+// Free Software Foundation; either version 3, or (at your option)
 // any later version.
 
 // This library is distributed in the hope that it will be useful,
 // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
 // GNU General Public License for more details.
 
-// You should have received a copy of the GNU General Public License along
-// with this library; see the file COPYING.  If not, write to the Free
-// Software Foundation, 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301,
-// USA.
+// Under Section 7 of GPL version 3, you are granted additional
+// permissions described in the GCC Runtime Library Exception, version
+// 3.1, as published by the Free Software Foundation.
 
-// As a special exception, you may use this file as part of a free software
-// library without restriction.  Specifically, if other files instantiate
-// templates or use macros or inline functions from this file, or you compile
-// this file and link it with other files to produce an executable, this
-// file does not by itself cause the resulting executable to be covered by
-// the GNU General Public License.  This exception does not however
-// invalidate any other reasons why the executable file might be covered by
-// the GNU General Public License.
+// You should have received a copy of the GNU General Public License and
+// a copy of the GCC Runtime Library Exception along with this program;
+// see the files COPYING3 and COPYING.RUNTIME respectively.  If not, see
+// <http://www.gnu.org/licenses/>.
 
 /*
  *
 
 #include <list>
 
-_GLIBCXX_BEGIN_NESTED_NAMESPACE(std, _GLIBCXX_STD)
-
-  void
-  _List_node_base::swap(_List_node_base& __x, _List_node_base& __y)
+namespace std _GLIBCXX_VISIBILITY(default)
+{
+  namespace __detail
   {
-    if ( __x._M_next != &__x )
-    {
-      if ( __y._M_next != &__y )
-      {
-        // Both __x and __y are not empty.
-        std::swap(__x._M_next,__y._M_next);
-        std::swap(__x._M_prev,__y._M_prev);
-        __x._M_next->_M_prev = __x._M_prev->_M_next = &__x;
-        __y._M_next->_M_prev = __y._M_prev->_M_next = &__y;
-      }
-      else
-      {
-        // __x is not empty, __y is empty.
-        __y._M_next = __x._M_next;
-        __y._M_prev = __x._M_prev;
-        __y._M_next->_M_prev = __y._M_prev->_M_next = &__y;        
-        __x._M_next = __x._M_prev = &__x;
-      }
-    }
-    else if ( __y._M_next != &__y )
+  _GLIBCXX_BEGIN_NAMESPACE_VERSION
+
+    void
+    _List_node_base::swap(_List_node_base& __x,
+                         _List_node_base& __y) _GLIBCXX_USE_NOEXCEPT
     {
-      // __x is empty, __y is not empty.
-      __x._M_next = __y._M_next;
-      __x._M_prev = __y._M_prev;
-      __x._M_next->_M_prev = __x._M_prev->_M_next = &__x;      
-      __y._M_next = __y._M_prev = &__y;
+      if ( __x._M_next != &__x )
+       {
+         if ( __y._M_next != &__y )
+           {
+             // Both __x and __y are not empty.
+             std::swap(__x._M_next,__y._M_next);
+             std::swap(__x._M_prev,__y._M_prev);
+             __x._M_next->_M_prev = __x._M_prev->_M_next = &__x;
+             __y._M_next->_M_prev = __y._M_prev->_M_next = &__y;
+           }
+         else
+           {
+             // __x is not empty, __y is empty.
+             __y._M_next = __x._M_next;
+             __y._M_prev = __x._M_prev;
+             __y._M_next->_M_prev = __y._M_prev->_M_next = &__y;
+             __x._M_next = __x._M_prev = &__x;
+           }
+       }
+      else if ( __y._M_next != &__y )
+       {
+         // __x is empty, __y is not empty.
+         __x._M_next = __y._M_next;
+         __x._M_prev = __y._M_prev;
+         __x._M_next->_M_prev = __x._M_prev->_M_next = &__x;
+         __y._M_next = __y._M_prev = &__y;
+       }
     }
-  }
 
-  void
-  _List_node_base::transfer(_List_node_base * const __first,
-                            _List_node_base * const __last)
-  {
-    if (this != __last)
+    void
+    _List_node_base::
+    _M_transfer(_List_node_base * const __first,
+               _List_node_base * const __last) _GLIBCXX_USE_NOEXCEPT
     {
-      // Remove [first, last) from its old position.
-      __last->_M_prev->_M_next  = this;
-      __first->_M_prev->_M_next = __last;
-      this->_M_prev->_M_next    = __first;
-  
-      // Splice [first, last) into its new position.
-      _List_node_base* const __tmp = this->_M_prev;
-      this->_M_prev                = __last->_M_prev;
-      __last->_M_prev              = __first->_M_prev;
-      __first->_M_prev             = __tmp;
+      if (this != __last)
+       {
+         // Remove [first, last) from its old position.
+         __last->_M_prev->_M_next  = this;
+         __first->_M_prev->_M_next = __last;
+         this->_M_prev->_M_next    = __first;
+
+         // Splice [first, last) into its new position.
+         _List_node_base* const __tmp = this->_M_prev;
+         this->_M_prev                = __last->_M_prev;
+         __last->_M_prev              = __first->_M_prev;
+         __first->_M_prev             = __tmp;
+       }
     }
-  }
 
-  void
-  _List_node_base::reverse()
-  {
-    _List_node_base* __tmp = this;
-    do
+    void
+    _List_node_base::_M_reverse() _GLIBCXX_USE_NOEXCEPT
     {
-      std::swap(__tmp->_M_next, __tmp->_M_prev);
+      _List_node_base* __tmp = this;
+      do
+       {
+         std::swap(__tmp->_M_next, __tmp->_M_prev);
 
-      // Old next node is now prev.
-      __tmp = __tmp->_M_prev;     
-    } 
-    while (__tmp != this);
-  }
+         // Old next node is now prev.
+         __tmp = __tmp->_M_prev;
+       }
+      while (__tmp != this);
+    }
 
-  void
-  _List_node_base::hook(_List_node_base* const __position)
-  {
-    this->_M_next = __position;
-    this->_M_prev = __position->_M_prev;
-    __position->_M_prev->_M_next = this;
-    __position->_M_prev = this;
-  }
+    void
+    _List_node_base::
+    _M_hook(_List_node_base* const __position) _GLIBCXX_USE_NOEXCEPT
+    {
+      this->_M_next = __position;
+      this->_M_prev = __position->_M_prev;
+      __position->_M_prev->_M_next = this;
+      __position->_M_prev = this;
+    }
 
-  void
-  _List_node_base::unhook()
-  {
-    _List_node_base* const __next_node = this->_M_next;
-    _List_node_base* const __prev_node = this->_M_prev;
-    __prev_node->_M_next = __next_node;
-    __next_node->_M_prev = __prev_node;
-  }
+    void
+    _List_node_base::_M_unhook() _GLIBCXX_USE_NOEXCEPT
+    {
+      _List_node_base* const __next_node = this->_M_next;
+      _List_node_base* const __prev_node = this->_M_prev;
+      __prev_node->_M_next = __next_node;
+      __next_node->_M_prev = __prev_node;
+    }
 
-_GLIBCXX_END_NESTED_NAMESPACE
+  _GLIBCXX_END_NAMESPACE_VERSION
+  } // namespace __detail
+} // namespace std