]>
Commit | Line | Data |
---|---|---|
42526146 PE |
1 | // nonstandard construct and destroy functions -*- C++ -*- |
2 | ||
04b7c941 | 3 | // Copyright (C) 2001, 2002 Free Software Foundation, Inc. |
42526146 PE |
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 2, 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 | // You should have received a copy of the GNU General Public License along | |
17 | // with this library; see the file COPYING. If not, write to the Free | |
18 | // Software Foundation, 59 Temple Place - Suite 330, Boston, MA 02111-1307, | |
19 | // USA. | |
20 | ||
21 | // As a special exception, you may use this file as part of a free software | |
22 | // library without restriction. Specifically, if other files instantiate | |
23 | // templates or use macros or inline functions from this file, or you compile | |
24 | // this file and link it with other files to produce an executable, this | |
25 | // file does not by itself cause the resulting executable to be covered by | |
26 | // the GNU General Public License. This exception does not however | |
27 | // invalidate any other reasons why the executable file might be covered by | |
28 | // the GNU General Public License. | |
29 | ||
725dc051 BK |
30 | /* |
31 | * | |
32 | * Copyright (c) 1994 | |
33 | * Hewlett-Packard Company | |
34 | * | |
35 | * Permission to use, copy, modify, distribute and sell this software | |
36 | * and its documentation for any purpose is hereby granted without fee, | |
37 | * provided that the above copyright notice appear in all copies and | |
38 | * that both that copyright notice and this permission notice appear | |
39 | * in supporting documentation. Hewlett-Packard Company makes no | |
40 | * representations about the suitability of this software for any | |
41 | * purpose. It is provided "as is" without express or implied warranty. | |
42 | * | |
43 | * | |
44 | * Copyright (c) 1996,1997 | |
45 | * Silicon Graphics Computer Systems, Inc. | |
46 | * | |
47 | * Permission to use, copy, modify, distribute and sell this software | |
48 | * and its documentation for any purpose is hereby granted without fee, | |
49 | * provided that the above copyright notice appear in all copies and | |
50 | * that both that copyright notice and this permission notice appear | |
51 | * in supporting documentation. Silicon Graphics makes no | |
52 | * representations about the suitability of this software for any | |
53 | * purpose. It is provided "as is" without express or implied warranty. | |
54 | */ | |
55 | ||
729e3d3f PE |
56 | /** @file stl_construct.h |
57 | * This is an internal header file, included by other library headers. | |
58 | * You should not attempt to use it directly. | |
725dc051 BK |
59 | */ |
60 | ||
61 | #ifndef _CPP_BITS_STL_CONSTRUCT_H | |
62 | #define _CPP_BITS_STL_CONSTRUCT_H 1 | |
63 | ||
494fff4c | 64 | #include <bits/type_traits.h> |
a6863e25 | 65 | #include <new> |
725dc051 | 66 | |
d53d7f6e PE |
67 | namespace std |
68 | { | |
494fff4c | 69 | /** |
04b7c941 | 70 | * @if maint |
b0037845 PE |
71 | * Constructs an object in existing memory by invoking an allocated |
72 | * object's constructor with an initializer. | |
04b7c941 | 73 | * @endif |
494fff4c SW |
74 | */ |
75 | template <class _T1, class _T2> | |
76 | inline void | |
77 | _Construct(_T1* __p, const _T2& __value) | |
78 | { new (static_cast<void*>(__p)) _T1(__value); } | |
725dc051 | 79 | |
494fff4c | 80 | /** |
04b7c941 | 81 | * @if maint |
b0037845 PE |
82 | * Constructs an object in existing memory by invoking an allocated |
83 | * object's default constructor (no initializers). | |
04b7c941 | 84 | * @endif |
494fff4c SW |
85 | */ |
86 | template <class _T1> | |
87 | inline void | |
88 | _Construct(_T1* __p) | |
89 | { new (static_cast<void*>(__p)) _T1(); } | |
90 | ||
da73f9de PC |
91 | /** |
92 | * @if maint | |
93 | * Destroy the object pointed to by a pointer type. | |
94 | * @endif | |
95 | */ | |
96 | template <class _Tp> | |
97 | inline void | |
98 | _Destroy(_Tp* __pointer) | |
99 | { __pointer->~_Tp(); } | |
100 | ||
494fff4c | 101 | /** |
04b7c941 | 102 | * @if maint |
494fff4c SW |
103 | * Destroy a range of objects with nontrivial destructors. |
104 | * | |
105 | * This is a helper function used only by _Destroy(). | |
04b7c941 | 106 | * @endif |
494fff4c SW |
107 | */ |
108 | template <class _ForwardIterator> | |
109 | inline void | |
110 | __destroy_aux(_ForwardIterator __first, _ForwardIterator __last, __false_type) | |
da73f9de | 111 | { for ( ; __first != __last; ++__first) std::_Destroy(&*__first); } |
494fff4c SW |
112 | |
113 | /** | |
04b7c941 | 114 | * @if maint |
494fff4c SW |
115 | * Destroy a range of objects with trivial destructors. Since the destructors |
116 | * are trivial, there's nothing to do and hopefully this function will be | |
117 | * entirely optimized away. | |
118 | * | |
119 | * This is a helper function used only by _Destroy(). | |
04b7c941 | 120 | * @endif |
494fff4c SW |
121 | */ |
122 | template <class _ForwardIterator> | |
123 | inline void | |
124 | __destroy_aux(_ForwardIterator, _ForwardIterator, __true_type) | |
125 | { } | |
126 | ||
494fff4c | 127 | /** |
04b7c941 | 128 | * @if maint |
494fff4c SW |
129 | * Destroy a range of objects. If the value_type of the object has |
130 | * a trivial destructor, the compiler should optimize all of this | |
131 | * away, otherwise the objects' destructors must be invoked. | |
04b7c941 | 132 | * @endif |
494fff4c SW |
133 | */ |
134 | template <class _ForwardIterator> | |
135 | inline void | |
136 | _Destroy(_ForwardIterator __first, _ForwardIterator __last) | |
137 | { | |
138 | typedef typename iterator_traits<_ForwardIterator>::value_type | |
139 | _Value_type; | |
140 | typedef typename __type_traits<_Value_type>::has_trivial_destructor | |
141 | _Has_trivial_destructor; | |
142 | ||
da73f9de | 143 | std::__destroy_aux(__first, __last, _Has_trivial_destructor()); |
494fff4c | 144 | } |
d53d7f6e | 145 | } // namespace std |
725dc051 BK |
146 | |
147 | #endif /* _CPP_BITS_STL_CONSTRUCT_H */ | |
148 |