2 Copyright 2019 Glen Joseph Fernandes
5 Distributed under the Boost Software License, Version 1.0.
6 (http://www.boost.org/LICENSE_1_0.txt)
8 #ifndef BOOST_CORE_ALLOC_CONSTRUCT_HPP
9 #define BOOST_CORE_ALLOC_CONSTRUCT_HPP
11 #include <boost/core/noinit_adaptor.hpp>
15 #if !defined(BOOST_NO_CXX11_ALLOCATOR)
16 template<class A, class T>
18 alloc_destroy(A& a, T* p)
20 std::allocator_traits<A>::destroy(a, p);
23 template<class A, class T>
25 alloc_destroy_n(A& a, T* p, std::size_t n)
28 std::allocator_traits<A>::destroy(a, p + --n);
32 template<class A, class T>
34 alloc_destroy(A&, T* p)
39 template<class A, class T>
41 alloc_destroy_n(A&, T* p, std::size_t n)
51 template<class A, class T>
52 class alloc_destroyer {
54 alloc_destroyer(A& a, T* p) BOOST_NOEXCEPT
60 boost::alloc_destroy_n(a_, p_, n_);
63 std::size_t& size() BOOST_NOEXCEPT {
68 alloc_destroyer(const alloc_destroyer&);
69 alloc_destroyer& operator=(const alloc_destroyer&);
78 #if !defined(BOOST_NO_CXX11_ALLOCATOR)
79 template<class A, class T>
81 alloc_construct(A& a, T* p)
83 std::allocator_traits<A>::construct(a, p);
86 #if !defined(BOOST_NO_CXX11_RVALUE_REFERENCES)
87 #if !defined(BOOST_NO_CXX11_VARIADIC_TEMPLATES)
88 template<class A, class T, class U, class... V>
90 alloc_construct(A& a, T* p, U&& u, V&&... v)
92 std::allocator_traits<A>::construct(a, p, std::forward<U>(u),
93 std::forward<V>(v)...);
96 template<class A, class T, class U>
98 alloc_construct(A& a, T* p, U&& u)
100 std::allocator_traits<A>::construct(a, p, std::forward<U>(u));
104 template<class A, class T, class U>
106 alloc_construct(A& a, T* p, const U& u)
108 std::allocator_traits<A>::construct(a, p, u);
111 template<class A, class T, class U>
113 alloc_construct(A& a, T* p, U& u)
115 std::allocator_traits<A>::construct(a, p, u);
119 template<class A, class T>
121 alloc_construct_n(A& a, T* p, std::size_t n)
123 detail::alloc_destroyer<A, T> hold(a, p);
124 for (std::size_t& i = hold.size(); i < n; ++i) {
125 std::allocator_traits<A>::construct(a, p + i);
130 template<class A, class T>
132 alloc_construct_n(A& a, T* p, std::size_t n, const T* l, std::size_t m)
134 detail::alloc_destroyer<A, T> hold(a, p);
135 for (std::size_t& i = hold.size(); i < n; ++i) {
136 std::allocator_traits<A>::construct(a, p + i, l[i % m]);
141 template<class A, class T, class I>
143 alloc_construct_n(A& a, T* p, std::size_t n, I b)
145 detail::alloc_destroyer<A, T> hold(a, p);
146 for (std::size_t& i = hold.size(); i < n; void(++i), void(++b)) {
147 std::allocator_traits<A>::construct(a, p + i, *b);
152 template<class A, class T>
154 alloc_construct(A&, T* p)
156 ::new(static_cast<void*>(p)) T();
159 template<class A, class T>
161 alloc_construct(noinit_adaptor<A>&, T* p)
163 ::new(static_cast<void*>(p)) T;
166 #if !defined(BOOST_NO_CXX11_RVALUE_REFERENCES)
167 #if !defined(BOOST_NO_CXX11_VARIADIC_TEMPLATES)
168 template<class A, class T, class U, class... V>
170 alloc_construct(A&, T* p, U&& u, V&&... v)
172 ::new(static_cast<void*>(p)) T(std::forward<U>(u), std::forward<V>(v)...);
175 template<class A, class T, class U>
177 alloc_construct(A& a, T* p, U&& u)
179 ::new(static_cast<void*>(p)) T(std::forward<U>(u));
183 template<class A, class T, class U>
185 alloc_construct(A&, T* p, const U& u)
187 ::new(static_cast<void*>(p)) T(u);
190 template<class A, class T, class U>
192 alloc_construct(A&, T* p, U& u)
194 ::new(static_cast<void*>(p)) T(u);
198 template<class A, class T>
200 alloc_construct_n(A& a, T* p, std::size_t n)
202 detail::alloc_destroyer<A, T> hold(a, p);
203 for (std::size_t& i = hold.size(); i < n; ++i) {
204 ::new(static_cast<void*>(p + i)) T();
209 template<class A, class T>
211 alloc_construct_n(noinit_adaptor<A>& a, T* p, std::size_t n)
213 detail::alloc_destroyer<noinit_adaptor<A>, T> hold(a, p);
214 for (std::size_t& i = hold.size(); i < n; ++i) {
215 ::new(static_cast<void*>(p + i)) T;
220 template<class A, class T>
222 alloc_construct_n(A& a, T* p, std::size_t n, const T* l, std::size_t m)
224 detail::alloc_destroyer<A, T> hold(a, p);
225 for (std::size_t& i = hold.size(); i < n; ++i) {
226 ::new(static_cast<void*>(p + i)) T(l[i % m]);
231 template<class A, class T, class I>
233 alloc_construct_n(A& a, T* p, std::size_t n, I b)
235 detail::alloc_destroyer<A, T> hold(a, p);
236 for (std::size_t& i = hold.size(); i < n; void(++i), void(++b)) {
237 ::new(static_cast<void*>(p + i)) T(*b);