]> oss.titaniummirror.com Git - msp430-gcc.git/blobdiff - libstdc++-v3/include/ext/memory
Imported gcc-4.4.3
[msp430-gcc.git] / libstdc++-v3 / include / ext / memory
index 5626b70e6af5b030296b211a19f12dc82426ff2c..7776d730a4a01fa4634f72da9df753ed356190d9 100644 (file)
@@ -1,11 +1,12 @@
 // Memory extensions -*- C++ -*-
 
-// Copyright (C) 2002 Free Software Foundation, Inc.
+// Copyright (C) 2002, 2003, 2004, 2005, 2006, 2007, 2008, 2009
+// 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, 59 Temple Place - Suite 330, Boston, MA 02111-1307,
-// 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/>.
 
 /*
  *
 
 /** @file ext/memory
  *  This file is a GNU extension to the Standard C++ Library (possibly
- *  containing extensions from the HP/SGI STL subset).  You should only
- *  include this header if you are using GCC 3 or later.
+ *  containing extensions from the HP/SGI STL subset).
  */
 
 #ifndef _EXT_MEMORY
-#define _EXT_MEMORY
+#define _EXT_MEMORY 1
 
 #pragma GCC system_header
+
 #include <memory>
 #include <bits/stl_tempbuf.h>
 
-namespace __gnu_cxx
-{
+_GLIBCXX_BEGIN_NAMESPACE(__gnu_cxx)
+
   using std::ptrdiff_t;
   using std::pair;
   using std::__iterator_category;
   using std::_Temporary_buffer;
-  
 
   template<typename _InputIter, typename _Size, typename _ForwardIter>
     pair<_InputIter, _ForwardIter>
     __uninitialized_copy_n(_InputIter __first, _Size __count,
-                          _ForwardIter __result,
-                          std::input_iterator_tag)
+                          _ForwardIter __result, std::input_iterator_tag)
     {
       _ForwardIter __cur = __result;
-      try {
-       for ( ; __count > 0 ; --__count, ++__first, ++__cur) 
-         std::_Construct(&*__cur, *__first);
-       return pair<_InputIter, _ForwardIter>(__first, __cur);
-      }
-      catch(...)
+      __try
+       {
+         for (; __count > 0 ; --__count, ++__first, ++__cur)
+           std::_Construct(&*__cur, *__first);
+         return pair<_InputIter, _ForwardIter>(__first, __cur);
+       }
+      __catch(...)
        {
          std::_Destroy(__result, __cur);
-         __throw_exception_again; 
+         __throw_exception_again;
        }
     }
 
@@ -100,18 +95,16 @@ namespace __gnu_cxx
                           std::random_access_iterator_tag)
     {
       _RandomAccessIter __last = __first + __count;
-      return pair<_RandomAccessIter, _ForwardIter>(
-                    __last,
-                    std::uninitialized_copy(__first, __last, __result));
+      return (pair<_RandomAccessIter, _ForwardIter>
+             (__last, std::uninitialized_copy(__first, __last, __result)));
     }
 
   template<typename _InputIter, typename _Size, typename _ForwardIter>
     inline pair<_InputIter, _ForwardIter>
     __uninitialized_copy_n(_InputIter __first, _Size __count,
-                        _ForwardIter __result) {
-      return __uninitialized_copy_n(__first, __count, __result,
-                                   __iterator_category(__first));
-    }
+                          _ForwardIter __result)
+    { return __gnu_cxx::__uninitialized_copy_n(__first, __count, __result,
+                                              __iterator_category(__first)); }
 
   /**
    *  @brief Copies the range [first,last) into result.
@@ -126,11 +119,43 @@ namespace __gnu_cxx
   template<typename _InputIter, typename _Size, typename _ForwardIter>
     inline pair<_InputIter, _ForwardIter>
     uninitialized_copy_n(_InputIter __first, _Size __count,
-                        _ForwardIter __result) {
-      return __uninitialized_copy_n(__first, __count, __result,
-                                   __iterator_category(__first));
+                        _ForwardIter __result)
+    { return __gnu_cxx::__uninitialized_copy_n(__first, __count, __result,
+                                              __iterator_category(__first)); }
+
+
+  // An alternative version of uninitialized_copy_n that constructs
+  // and destroys objects with a user-provided allocator.
+  template<typename _InputIter, typename _Size, typename _ForwardIter,
+           typename _Allocator>
+    pair<_InputIter, _ForwardIter>
+    __uninitialized_copy_n_a(_InputIter __first, _Size __count,
+                            _ForwardIter __result,
+                            _Allocator __alloc)
+    {
+      _ForwardIter __cur = __result;
+      __try
+       {
+         for (; __count > 0 ; --__count, ++__first, ++__cur)
+           __alloc.construct(&*__cur, *__first);
+         return pair<_InputIter, _ForwardIter>(__first, __cur);
+       }
+      __catch(...)
+       {
+         std::_Destroy(__result, __cur, __alloc);
+         __throw_exception_again;
+       }
     }
 
+  template<typename _InputIter, typename _Size, typename _ForwardIter,
+           typename _Tp>
+    inline pair<_InputIter, _ForwardIter>
+    __uninitialized_copy_n_a(_InputIter __first, _Size __count,
+                            _ForwardIter __result,
+                            std::allocator<_Tp>)
+    {
+      return __gnu_cxx::uninitialized_copy_n(__first, __count, __result);
+    }
 
   /**
    *  This class provides similar behavior and semantics of the standard
@@ -152,19 +177,19 @@ namespace __gnu_cxx
    *
    *  @ingroup SGIextensions
   */
-  template <class _ForwardIterator, 
-           class _Tp 
-             = typename std::iterator_traits<_ForwardIterator>::value_type >
-  struct temporary_buffer : public _Temporary_buffer<_ForwardIterator, _Tp>
-  {
-    /// Requests storage large enough to hold a copy of [first,last).
-    temporary_buffer(_ForwardIterator __first, _ForwardIterator __last)
-      : _Temporary_buffer<_ForwardIterator, _Tp>(__first, __last) {}
-    /// Destroys objects and frees storage.
-    ~temporary_buffer() {}
-  };
-
-} // namespace __gnu_cxx
-
-#endif /* _EXT_MEMORY */
+  template <class _ForwardIterator, class _Tp
+           = typename std::iterator_traits<_ForwardIterator>::value_type >
+    struct temporary_buffer : public _Temporary_buffer<_ForwardIterator, _Tp>
+    {
+      /// Requests storage large enough to hold a copy of [first,last).
+      temporary_buffer(_ForwardIterator __first, _ForwardIterator __last)
+      : _Temporary_buffer<_ForwardIterator, _Tp>(__first, __last) { }
+      
+      /// Destroys objects and frees storage.
+      ~temporary_buffer() { }
+    };
+
+_GLIBCXX_END_NAMESPACE
+
+#endif