• Home
  • History
  • Annotate
  • Line#
  • Navigate
  • Raw
  • Download
  • only in /asuswrt-rt-n18u-9.0.0.4.380.2695/release/src-rt-6.x.4708/toolchains/hndtools-armeabi-2013.11/arm-none-eabi/include/c++/4.8.1/bits/
1// nonstandard construct and destroy functions -*- C++ -*-
2
3// Copyright (C) 2001-2013 Free Software Foundation, Inc.
4//
5// This file is part of the GNU ISO C++ Library.  This library is free
6// software; you can redistribute it and/or modify it under the
7// terms of the GNU General Public License as published by the
8// Free Software Foundation; either version 3, or (at your option)
9// any later version.
10
11// This library is distributed in the hope that it will be useful,
12// but WITHOUT ANY WARRANTY; without even the implied warranty of
13// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
14// GNU General Public License for more details.
15
16// Under Section 7 of GPL version 3, you are granted additional
17// permissions described in the GCC Runtime Library Exception, version
18// 3.1, as published by the Free Software Foundation.
19
20// You should have received a copy of the GNU General Public License and
21// a copy of the GCC Runtime Library Exception along with this program;
22// see the files COPYING3 and COPYING.RUNTIME respectively.  If not, see
23// <http://www.gnu.org/licenses/>.
24
25/*
26 *
27 * Copyright (c) 1994
28 * Hewlett-Packard Company
29 *
30 * Permission to use, copy, modify, distribute and sell this software
31 * and its documentation for any purpose is hereby granted without fee,
32 * provided that the above copyright notice appear in all copies and
33 * that both that copyright notice and this permission notice appear
34 * in supporting documentation.  Hewlett-Packard Company makes no
35 * representations about the suitability of this software for any
36 * purpose.  It is provided "as is" without express or implied warranty.
37 *
38 *
39 * Copyright (c) 1996,1997
40 * Silicon Graphics Computer Systems, Inc.
41 *
42 * Permission to use, copy, modify, distribute and sell this software
43 * and its documentation for any purpose is hereby granted without fee,
44 * provided that the above copyright notice appear in all copies and
45 * that both that copyright notice and this permission notice appear
46 * in supporting documentation.  Silicon Graphics makes no
47 * representations about the suitability of this software for any
48 * purpose.  It is provided "as is" without express or implied warranty.
49 */
50
51/** @file bits/stl_construct.h
52 *  This is an internal header file, included by other library headers.
53 *  Do not attempt to use it directly. @headername{memory}
54 */
55
56#ifndef _STL_CONSTRUCT_H
57#define _STL_CONSTRUCT_H 1
58
59#include <new>
60#include <bits/move.h>
61#include <ext/alloc_traits.h>
62
63namespace std _GLIBCXX_VISIBILITY(default)
64{
65_GLIBCXX_BEGIN_NAMESPACE_VERSION
66
67  /**
68   * Constructs an object in existing memory by invoking an allocated
69   * object's constructor with an initializer.
70   */
71#if __cplusplus >= 201103L
72  template<typename _T1, typename... _Args>
73    inline void
74    _Construct(_T1* __p, _Args&&... __args)
75    { ::new(static_cast<void*>(__p)) _T1(std::forward<_Args>(__args)...); }
76#else
77  template<typename _T1, typename _T2>
78    inline void
79    _Construct(_T1* __p, const _T2& __value)
80    {
81      // _GLIBCXX_RESOLVE_LIB_DEFECTS
82      // 402. wrong new expression in [some_]allocator::construct
83      ::new(static_cast<void*>(__p)) _T1(__value);
84    }
85#endif
86
87  /**
88   * Destroy the object pointed to by a pointer type.
89   */
90  template<typename _Tp>
91    inline void
92    _Destroy(_Tp* __pointer)
93    { __pointer->~_Tp(); }
94
95  template<bool>
96    struct _Destroy_aux
97    {
98      template<typename _ForwardIterator>
99        static void
100        __destroy(_ForwardIterator __first, _ForwardIterator __last)
101	{
102	  for (; __first != __last; ++__first)
103	    std::_Destroy(std::__addressof(*__first));
104	}
105    };
106
107  template<>
108    struct _Destroy_aux<true>
109    {
110      template<typename _ForwardIterator>
111        static void
112        __destroy(_ForwardIterator, _ForwardIterator) { }
113    };
114
115  /**
116   * Destroy a range of objects.  If the value_type of the object has
117   * a trivial destructor, the compiler should optimize all of this
118   * away, otherwise the objects' destructors must be invoked.
119   */
120  template<typename _ForwardIterator>
121    inline void
122    _Destroy(_ForwardIterator __first, _ForwardIterator __last)
123    {
124      typedef typename iterator_traits<_ForwardIterator>::value_type
125                       _Value_type;
126      std::_Destroy_aux<__has_trivial_destructor(_Value_type)>::
127	__destroy(__first, __last);
128    }
129
130  /**
131   * Destroy a range of objects using the supplied allocator.  For
132   * nondefault allocators we do not optimize away invocation of
133   * destroy() even if _Tp has a trivial destructor.
134   */
135
136  template<typename _ForwardIterator, typename _Allocator>
137    void
138    _Destroy(_ForwardIterator __first, _ForwardIterator __last,
139	     _Allocator& __alloc)
140    {
141      typedef __gnu_cxx::__alloc_traits<_Allocator> __traits;
142      for (; __first != __last; ++__first)
143	__traits::destroy(__alloc, std::__addressof(*__first));
144    }
145
146  template<typename _ForwardIterator, typename _Tp>
147    inline void
148    _Destroy(_ForwardIterator __first, _ForwardIterator __last,
149	     allocator<_Tp>&)
150    {
151      _Destroy(__first, __last);
152    }
153
154_GLIBCXX_END_NAMESPACE_VERSION
155} // namespace std
156
157#endif /* _STL_CONSTRUCT_H */
158
159