1 /*
2 Copyright 2019 Glen Joseph Fernandes
3 (glenjofe@gmail.com)
4
5 Distributed under the Boost Software License, Version 1.0.
6 (http://www.boost.org/LICENSE_1_0.txt)
7 */
8 #ifndef BOOST_CORE_NOINIT_ADAPTOR_HPP
9 #define BOOST_CORE_NOINIT_ADAPTOR_HPP
10
11 #include <boost/core/allocator_access.hpp>
12
13 namespace boost {
14
15 template<class A>
16 struct noinit_adaptor
17 : A {
18 template<class U>
19 struct rebind {
20 typedef noinit_adaptor<typename allocator_rebind<A, U>::type> other;
21 };
22
noinit_adaptorboost::noinit_adaptor23 noinit_adaptor()
24 : A() { }
25
26 #if !defined(BOOST_NO_CXX11_RVALUE_REFERENCES)
27 template<class U>
noinit_adaptorboost::noinit_adaptor28 noinit_adaptor(U&& u) BOOST_NOEXCEPT
29 : A(std::forward<U>(u)) { }
30 #else
31 template<class U>
noinit_adaptorboost::noinit_adaptor32 noinit_adaptor(const U& u) BOOST_NOEXCEPT
33 : A(u) { }
34
35 template<class U>
noinit_adaptorboost::noinit_adaptor36 noinit_adaptor(U& u) BOOST_NOEXCEPT
37 : A(u) { }
38 #endif
39
40 template<class U>
noinit_adaptorboost::noinit_adaptor41 noinit_adaptor(const noinit_adaptor<U>& u) BOOST_NOEXCEPT
42 : A(static_cast<const A&>(u)) { }
43
44 template<class U>
constructboost::noinit_adaptor45 void construct(U* p) {
46 ::new((void*)p) U;
47 }
48
49 #if defined(BOOST_NO_CXX11_ALLOCATOR)
50 template<class U, class V>
constructboost::noinit_adaptor51 void construct(U* p, const V& v) {
52 ::new((void*)p) U(v);
53 }
54 #endif
55
56 template<class U>
destroyboost::noinit_adaptor57 void destroy(U* p) {
58 p->~U();
59 }
60 };
61
62 template<class T, class U>
63 inline bool
operator ==(const noinit_adaptor<T> & lhs,const noinit_adaptor<U> & rhs)64 operator==(const noinit_adaptor<T>& lhs,
65 const noinit_adaptor<U>& rhs) BOOST_NOEXCEPT
66 {
67 return static_cast<const T&>(lhs) == static_cast<const U&>(rhs);
68 }
69
70 template<class T, class U>
71 inline bool
operator !=(const noinit_adaptor<T> & lhs,const noinit_adaptor<U> & rhs)72 operator!=(const noinit_adaptor<T>& lhs,
73 const noinit_adaptor<U>& rhs) BOOST_NOEXCEPT
74 {
75 return !(lhs == rhs);
76 }
77
78 template<class A>
79 inline noinit_adaptor<A>
noinit_adapt(const A & a)80 noinit_adapt(const A& a) BOOST_NOEXCEPT
81 {
82 return noinit_adaptor<A>(a);
83 }
84
85 } /* boost */
86
87 #endif
88