]> oss.titaniummirror.com Git - msp430-gcc.git/blobdiff - libstdc++-v3/include/bits/stl_construct.h
Imported gcc-4.4.3
[msp430-gcc.git] / libstdc++-v3 / include / bits / stl_construct.h
index 685913888c855fe4c82a8f7da66121c81289e557..9df37fe19505c86f8709b9e0f2340f6b01f9ab83 100644 (file)
@@ -1,11 +1,12 @@
 // nonstandard construct and destroy functions -*- C++ -*-
 
-// Copyright (C) 2001, 2002 Free Software Foundation, Inc.
+// Copyright (C) 2001, 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/>.
 
 /*
  *
  *  You should not attempt to use it directly.
  */
 
-#ifndef _CPP_BITS_STL_CONSTRUCT_H
-#define _CPP_BITS_STL_CONSTRUCT_H 1
+#ifndef _STL_CONSTRUCT_H
+#define _STL_CONSTRUCT_H 1
 
-#include <bits/type_traits.h>
 #include <new>
 
-namespace std
-{
+_GLIBCXX_BEGIN_NAMESPACE(std)
+
   /**
-   * @if maint
    * Constructs an object in existing memory by invoking an allocated
    * object's constructor with an initializer.
-   * @endif
    */
-  template <class _T1, class _T2>
+  template<typename _T1, typename _T2>
     inline void
     _Construct(_T1* __p, const _T2& __value)
-    { new (static_cast<void*>(__p)) _T1(__value); }
-  
-  /**
-   * @if maint
-   * Constructs an object in existing memory by invoking an allocated
-   * object's default constructor (no initializers).
-   * @endif
-   */
-  template <class _T1>
-    inline void
-    _Construct(_T1* __p)
-    { new (static_cast<void*>(__p)) _T1(); }
-
-  /**
-   * @if maint
-   * Destroy a range of objects with nontrivial destructors.  
-   *
-   * This is a helper function used only by _Destroy().
-   * @endif
-   */
-  template <class _ForwardIterator>
-    inline void
-    __destroy_aux(_ForwardIterator __first, _ForwardIterator __last, __false_type)
-    { for ( ; __first != __last; ++__first) _Destroy(&*__first); }
-
-  /**
-   * @if maint
-   * Destroy a range of objects with trivial destructors.  Since the destructors
-   * are trivial, there's nothing to do and hopefully this function will be
-   * entirely optimized away.
-   *
-   * This is a helper function used only by _Destroy().
-   * @endif
-   */
-  template <class _ForwardIterator> 
-    inline void
-    __destroy_aux(_ForwardIterator, _ForwardIterator, __true_type)
-    { }
+    {
+      // _GLIBCXX_RESOLVE_LIB_DEFECTS
+      // 402. wrong new expression in [some_]allocator::construct
+      ::new(static_cast<void*>(__p)) _T1(__value);
+    }
 
   /**
-   * @if maint
    * Destroy the object pointed to by a pointer type.
-   * @endif
    */
-  template <class _Tp>
+  template<typename _Tp>
     inline void
     _Destroy(_Tp* __pointer)
     { __pointer->~_Tp(); }
-  
+
+  template<bool>
+    struct _Destroy_aux
+    {
+      template<typename _ForwardIterator>
+        static void
+        __destroy(_ForwardIterator __first, _ForwardIterator __last)
+       {
+         for (; __first != __last; ++__first)
+           std::_Destroy(&*__first);
+       }
+    };
+
+  template<>
+    struct _Destroy_aux<true>
+    {
+      template<typename _ForwardIterator>
+        static void
+        __destroy(_ForwardIterator, _ForwardIterator) { }
+    };
+
   /**
-   * @if maint
    * Destroy a range of objects.  If the value_type of the object has
    * a trivial destructor, the compiler should optimize all of this
    * away, otherwise the objects' destructors must be invoked.
-   * @endif
    */
-  template <class _ForwardIterator>
+  template<typename _ForwardIterator>
     inline void
     _Destroy(_ForwardIterator __first, _ForwardIterator __last)
     {
       typedef typename iterator_traits<_ForwardIterator>::value_type
                        _Value_type;
-      typedef typename __type_traits<_Value_type>::has_trivial_destructor
-                       _Has_trivial_destructor;
+      std::_Destroy_aux<__has_trivial_destructor(_Value_type)>::
+       __destroy(__first, __last);
+    }
+
+  /**
+   * Destroy a range of objects using the supplied allocator.  For
+   * nondefault allocators we do not optimize away invocation of 
+   * destroy() even if _Tp has a trivial destructor.
+   */
 
-      __destroy_aux(__first, __last, _Has_trivial_destructor());
+  template <typename _Tp> class allocator;
+
+  template<typename _ForwardIterator, typename _Allocator>
+    void
+    _Destroy(_ForwardIterator __first, _ForwardIterator __last,
+            _Allocator& __alloc)
+    {
+      for (; __first != __last; ++__first)
+       __alloc.destroy(&*__first);
     }
-} // namespace std
 
-#endif /* _CPP_BITS_STL_CONSTRUCT_H */
+  template<typename _ForwardIterator, typename _Tp>
+    inline void
+    _Destroy(_ForwardIterator __first, _ForwardIterator __last,
+            allocator<_Tp>&)
+    {
+      _Destroy(__first, __last);
+    }
+
+_GLIBCXX_END_NAMESPACE
+
+#endif /* _STL_CONSTRUCT_H */