Line | % of fetches | Source | |
---|---|---|---|
1 | // nonstandard construct and destroy functions -*- C++ -*- | ||
2 | |||
3 | // Copyright (C) 2001-2015 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 | |||
63 | namespace 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 ![]() | 0.7% | { ::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 |
Copyright (c) 2006-2012 Rogue Wave Software, Inc. All Rights Reserved.
Patents pending.