5
5
#include < cstdint>
6
6
#include < memory>
7
7
#include < type_traits>
8
- # include " AlignedArrayBase.hpp "
8
+
9
9
#include " AlignedBase.hpp"
10
+ #include " AlignedArrayConstructorCaller.hpp"
11
+ #include " AlignedArrayDestructorCaller.hpp"
10
12
11
- #define ALIGNED_BYTES_SIZE (alignment, sizeOfTPaddedToAlignment ) alignment + sizeOfTPaddedToAlignment - 1
12
- #define ALIGNED_POINTER (T, bytes, sizeOfTPaddedToAlignment ) reinterpret_cast <T *>(uintptr_t (bytes) + (sizeOfTPaddedToAlignment - 1 ) & ~uintptr_t (sizeOfTPaddedToAlignment - 1 ))
13
- #define ALIGNED_ARRAY_BYTES_SIZE (T, sizeOfTPaddedToAlignment, size ) sizeof (T) + (sizeOfTPaddedToAlignment * size) - 1
14
- #define ALIGNED_ARRAY_INDEX_POINTER (T, pFirstElement, sizeOfTPaddedToAlignment, index ) reinterpret_cast <T *>(uintptr_t (pFirstElement) + (sizeOfTPaddedToAlignment * index))
13
+ #define ALIGNED_BYTES_SIZE (alignment, sizeOfTPaddedToAlignment ) ( alignment + sizeOfTPaddedToAlignment - 1 )
14
+ #define ALIGNED_POINTER (T, bytes, sizeOfTPaddedToAlignment ) ( reinterpret_cast <T *>(uintptr_t (bytes) + (sizeOfTPaddedToAlignment - 1 ) & ~uintptr_t (sizeOfTPaddedToAlignment - 1 ) ))
15
+ #define ALIGNED_ARRAY_BYTES_SIZE (T, sizeOfTPaddedToAlignment, size ) ( sizeof (T) + (sizeOfTPaddedToAlignment * size) - 1 )
16
+ #define ALIGNED_ARRAY_INDEX_POINTER (T, pFirstElement, sizeOfTPaddedToAlignment, index ) ( reinterpret_cast <T *>(uintptr_t (pFirstElement) + (sizeOfTPaddedToAlignment * index) ))
15
17
16
18
template <typename T, std::size_t Alignment = -1 >
17
19
class Aligned : AlignedBase<T, Alignment> {
18
20
uint8_t bytes[ALIGNED_BYTES_SIZE(Alignment, sizeOfTPaddedToAlignment)];
19
- T * pValue;
20
- public:
21
- Aligned (T const & value = T())
21
+ T * const pValue;
22
+ Aligned ()
22
23
: pValue(ALIGNED_POINTER(T, bytes, sizeOfTPaddedToAlignment))
23
- { *pValue = T (value); }
24
+ {}
25
+ public:
26
+ template <typename ... Args>
27
+ Aligned (Args &&... args) : Aligned() { new (pValue) T (args...); }
24
28
~Aligned () { pValue->T ::~T (); }
25
29
T & Ref () { return *pValue; }
26
30
T const & Ref () const { return *pValue; }
@@ -29,52 +33,20 @@ class Aligned : AlignedBase<T, Alignment> {
29
33
template <typename T>
30
34
class Aligned <T, -1 > : AlignedBase<T, -1 > {
31
35
std::unique_ptr<uint8_t []> const pBytes;
32
- T * pValue;
33
- public:
34
- Aligned (std::size_t alignment, T const & value = T())
36
+ T * const pValue;
37
+ Aligned (std::size_t alignment)
35
38
: AlignedBase(alignment)
36
39
, pBytes(new uint8_t [ALIGNED_BYTES_SIZE(alignment, sizeOfTPaddedToAlignment)])
37
40
, pValue(ALIGNED_POINTER(T, pBytes.get(), sizeOfTPaddedToAlignment))
38
- { *pValue = T (value); }
41
+ {}
42
+ public:
43
+ template <typename ... Args>
44
+ Aligned (std::size_t alignment, Args &&... args) : Aligned() { new (pValue) T (args...); }
39
45
~Aligned () { pValue->T ::~T (); }
40
46
T & Ref () { return *pValue; }
41
47
T const & Ref () const { return *pValue; }
42
48
};
43
49
44
- template <typename T, bool IsTriviallyDefaultConstructible = std::is_trivially_default_constructible<T>::value>
45
- class AlignedArrayConstructorCaller {
46
- AlignedArrayConstructorCaller ();
47
- public:
48
- static void Call (std::size_t const , T * const , std::size_t const ) {}
49
- };
50
-
51
- template <typename T>
52
- class AlignedArrayConstructorCaller <T, false > {
53
- AlignedArrayConstructorCaller ();
54
- public:
55
- static void Call (std::size_t const size, T * const pFirstElement, std::size_t const sizeOfTPaddedToAlignment) {
56
- for (std::size_t i = 0 ; i != size; ++i)
57
- new (ALIGNED_ARRAY_INDEX_POINTER (T, pFirstElement, sizeOfTPaddedToAlignment, i)) T;
58
- }
59
- };
60
-
61
- template <typename T, bool IsTriviallyDestructible = std::is_trivially_destructible<T>::value>
62
- class AlignedArrayDestructorCaller {
63
- AlignedArrayDestructorCaller ();
64
- public:
65
- static void Call (std::size_t const , T * const , std::size_t const ) {}
66
- };
67
-
68
- template <typename T>
69
- class AlignedArrayDestructorCaller <T, false > {
70
- AlignedArrayDestructorCaller ();
71
- public:
72
- static void Call (std::size_t const size, T * const pFirstElement, std::size_t const sizeOfTPaddedToAlignment) {
73
- for (std::size_t i = 0 ; i != size; ++i)
74
- ALIGNED_ARRAY_INDEX_POINTER (T, pFirstElement, sizeOfTPaddedToAlignment, i)->T ::~T ();
75
- }
76
- };
77
-
78
50
template <typename T, std::size_t Size , std::size_t Alignment>
79
51
class Aligned <T[Size ], Alignment> : AlignedBase<T, Alignment> {
80
52
Aligned (Aligned const &);
0 commit comments