]> git.proxmox.com Git - ceph.git/blob - ceph/src/boost/boost/type_traits/aligned_storage.hpp
import quincy beta 17.1.0
[ceph.git] / ceph / src / boost / boost / type_traits / aligned_storage.hpp
1 //-----------------------------------------------------------------------------
2 // boost aligned_storage.hpp header file
3 // See http://www.boost.org for updates, documentation, and revision history.
4 //-----------------------------------------------------------------------------
5 //
6 // Copyright (c) 2002-2003
7 // Eric Friedman, Itay Maman
8 //
9 // Distributed under the Boost Software License, Version 1.0. (See
10 // accompanying file LICENSE_1_0.txt or copy at
11 // http://www.boost.org/LICENSE_1_0.txt)
12
13 #ifndef BOOST_TT_ALIGNED_STORAGE_HPP
14 #define BOOST_TT_ALIGNED_STORAGE_HPP
15
16 #include <cstddef> // for std::size_t
17
18 #include <boost/config.hpp>
19 #include <boost/detail/workaround.hpp>
20 #include <boost/type_traits/alignment_of.hpp>
21 #include <boost/type_traits/type_with_alignment.hpp>
22 #include <boost/type_traits/is_pod.hpp>
23 #include <boost/type_traits/conditional.hpp>
24
25 namespace boost {
26
27 namespace detail { namespace aligned_storage {
28
29 BOOST_STATIC_CONSTANT(
30 std::size_t
31 , alignment_of_max_align = ::boost::alignment_of<boost::detail::max_align>::value
32 );
33
34 //
35 // To be TR1 conforming this must be a POD type:
36 //
37 template <
38 std::size_t size_
39 , std::size_t alignment_
40 >
41 struct aligned_storage_imp
42 {
43 union data_t
44 {
45 char buf[size_];
46
47 typename ::boost::type_with_alignment<alignment_>::type align_;
48 } data_;
49 void* address() const { return const_cast<aligned_storage_imp*>(this); }
50 };
51 template <std::size_t size>
52 struct aligned_storage_imp<size, std::size_t(-1)>
53 {
54 union data_t
55 {
56 char buf[size];
57 ::boost::detail::max_align align_;
58 } data_;
59 void* address() const { return const_cast<aligned_storage_imp*>(this); }
60 };
61
62 template< std::size_t alignment_ >
63 struct aligned_storage_imp<0u,alignment_>
64 {
65 /* intentionally empty */
66 void* address() const { return 0; }
67 };
68
69 }} // namespace detail::aligned_storage
70
71 template <
72 std::size_t size_
73 , std::size_t alignment_ = std::size_t(-1)
74 >
75 class aligned_storage :
76 #ifndef BOOST_BORLANDC
77 private
78 #else
79 public
80 #endif
81 ::boost::detail::aligned_storage::aligned_storage_imp<size_, alignment_>
82 {
83
84 public: // constants
85
86 typedef ::boost::detail::aligned_storage::aligned_storage_imp<size_, alignment_> type;
87
88 BOOST_STATIC_CONSTANT(
89 std::size_t
90 , size = size_
91 );
92 BOOST_STATIC_CONSTANT(
93 std::size_t
94 , alignment = (
95 alignment_ == std::size_t(-1)
96 ? ::boost::detail::aligned_storage::alignment_of_max_align
97 : alignment_
98 )
99 );
100
101 private: // noncopyable
102
103 aligned_storage(const aligned_storage&);
104 aligned_storage& operator=(const aligned_storage&);
105
106 public: // structors
107
108 aligned_storage()
109 {
110 }
111
112 ~aligned_storage()
113 {
114 }
115
116 public: // accessors
117
118 void* address()
119 {
120 return static_cast<type*>(this)->address();
121 }
122
123 const void* address() const
124 {
125 return static_cast<const type*>(this)->address();
126 }
127 };
128
129 //
130 // Make sure that is_pod recognises aligned_storage<>::type
131 // as a POD (Note that aligned_storage<> itself is not a POD):
132 //
133 template <std::size_t size_, std::size_t alignment_>
134 struct is_pod< ::boost::detail::aligned_storage::aligned_storage_imp<size_, alignment_> > : public true_type{};
135
136 } // namespace boost
137
138 #endif // BOOST_ALIGNED_STORAGE_HPP