Skip to content

Commit c7194a6

Browse files
committed
A few style changes, and forwarding of Aligned<T> constructors using variadic templates
1 parent 83b417a commit c7194a6

8 files changed

+84
-63
lines changed

Aligned.hpp

+19-47
Original file line numberDiff line numberDiff line change
@@ -5,22 +5,26 @@
55
#include <cstdint>
66
#include <memory>
77
#include <type_traits>
8-
#include "AlignedArrayBase.hpp"
8+
99
#include "AlignedBase.hpp"
10+
#include "AlignedArrayConstructorCaller.hpp"
11+
#include "AlignedArrayDestructorCaller.hpp"
1012

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)))
1517

1618
template<typename T, std::size_t Alignment = -1>
1719
class Aligned : AlignedBase<T, Alignment> {
1820
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()
2223
: 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...); }
2428
~Aligned() { pValue->T::~T(); }
2529
T & Ref() { return *pValue; }
2630
T const & Ref() const { return *pValue; }
@@ -29,52 +33,20 @@ class Aligned : AlignedBase<T, Alignment> {
2933
template<typename T>
3034
class Aligned<T, -1> : AlignedBase<T, -1> {
3135
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)
3538
: AlignedBase(alignment)
3639
, pBytes(new uint8_t[ALIGNED_BYTES_SIZE(alignment, sizeOfTPaddedToAlignment)])
3740
, 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...); }
3945
~Aligned() { pValue->T::~T(); }
4046
T & Ref() { return *pValue; }
4147
T const & Ref() const { return *pValue; }
4248
};
4349

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-
7850
template<typename T, std::size_t Size, std::size_t Alignment>
7951
class Aligned<T[Size], Alignment> : AlignedBase<T, Alignment> {
8052
Aligned(Aligned const &);

AlignedArrayConstructorCaller.hpp

+21
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,21 @@
1+
#ifndef ALIGNEDARRAYCONSTRUCTORCALLER_HPP_INCLUDED
2+
#define ALIGNEDARRAYCONSTRUCTORCALLER_HPP_INCLUDED
3+
4+
template<typename T, bool IsTriviallyDefaultConstructible = std::is_trivially_default_constructible<T>::value>
5+
class AlignedArrayConstructorCaller {
6+
AlignedArrayConstructorCaller();
7+
public:
8+
static void Call(std::size_t const, T * const, std::size_t const) {}
9+
};
10+
11+
template<typename T>
12+
class AlignedArrayConstructorCaller<T, false> {
13+
AlignedArrayConstructorCaller();
14+
public:
15+
static void Call(std::size_t const size, T * const pFirstElement, std::size_t const sizeOfTPaddedToAlignment) {
16+
for (std::size_t i = 0; i != size; ++i)
17+
new (ALIGNED_ARRAY_INDEX_POINTER(T, pFirstElement, sizeOfTPaddedToAlignment, i)) T;
18+
}
19+
};
20+
21+
#endif

AlignedArrayDestructorCaller.hpp

+21
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,21 @@
1+
#ifndef ALIGNEDARRAYDESTRUCTORCALLER_HPP_INCLUDED
2+
#define ALIGNEDARRAYDESTRUCTORCALLER_HPP_INCLUDED
3+
4+
template<typename T, bool IsTriviallyDestructible = std::is_trivially_destructible<T>::value>
5+
class AlignedArrayDestructorCaller {
6+
AlignedArrayDestructorCaller();
7+
public:
8+
static void Call(std::size_t const, T * const, std::size_t const) {}
9+
};
10+
11+
template<typename T>
12+
class AlignedArrayDestructorCaller<T, false> {
13+
AlignedArrayDestructorCaller();
14+
public:
15+
static void Call(std::size_t const size, T * const pFirstElement, std::size_t const sizeOfTPaddedToAlignment) {
16+
for (std::size_t i = 0; i != size; ++i)
17+
ALIGNED_ARRAY_INDEX_POINTER(T, pFirstElement, sizeOfTPaddedToAlignment, i)->T::~T();
18+
}
19+
};
20+
21+
#endif

AlignedBase.hpp

+2-2
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,5 @@
1-
#ifndef ALIGNED_BASE_HPP_INCLUDED
2-
#define ALIGNED_BASE_HPP_INCLUDED
1+
#ifndef ALIGNEDBASE_HPP_INCLUDED
2+
#define ALIGNEDBASE_HPP_INCLUDED
33

44
#include <cstddef>
55
#include <exception>

CacheAligned.hpp

+4-4
Original file line numberDiff line numberDiff line change
@@ -1,18 +1,18 @@
1-
#ifndef CACHE_ALIGNED_HPP_INCLUDED
2-
#define CACHE_ALIGNED_HPP_INCLUDED
1+
#ifndef CACHEALIGNED_HPP_INCLUDED
2+
#define CACHEALIGNED_HPP_INCLUDED
33

44
#include <cstddef>
55
#include "CacheAlignedBase.hpp"
66

77
template<typename T>
8-
class CacheAligned : public Aligned<T>, CacheAlignedBase {
8+
class CacheAligned : public Aligned<T>, CacheAlignedBase<T> {
99
public:
1010
CacheAligned() : Aligned(cacheLineSize()) {}
1111
CacheAligned(T const & value) : Aligned(cacheLineSize(), value) {}
1212
};
1313

1414
template<typename T>
15-
class CacheAligned<T[]> : public Aligned<T[]>, CacheAlignedBase {
15+
class CacheAligned<T[]> : public Aligned<T[]>, CacheAlignedBase<T> {
1616
public:
1717
CacheAligned(std::size_t size) : Aligned(cacheLineSize(), size) {}
1818
};

CacheAlignedBase.hpp

+13-6
Original file line numberDiff line numberDiff line change
@@ -1,16 +1,23 @@
1-
#ifndef CACHE_ALIGNED_BASE_HPP_INCLUDED
2-
#define CACHE_ALIGNED_BASE_HPP_INCLUDED
1+
#ifndef CACHEALIGNEDBASE_HPP_INCLUDED
2+
#define CACHEALIGNEDBASE_HPP_INCLUDED
33

44
#include <cstddef>
5-
#include "CacheLineSize/cacheLineSize.h"
5+
extern "C" {
6+
#include "CacheLineSize/CacheLineSize.h"
7+
}
68

9+
template<typename T>
710
class CacheAlignedBase {
811
protected:
912
CacheAlignedBase() {}
10-
static std::size_t cacheLineSize() {
11-
static std::size_t cacheLineSize = cache_line_size();
13+
static size_t cacheLineSize;
14+
/*inline static std::size_t cacheLineSize() {
15+
static std::size_t cacheLineSize = CacheLineSize();
1216
return cacheLineSize;
13-
}
17+
}*/
1418
};
1519

20+
template<typename T>
21+
size_t CacheAlignedBase::cacheLineSize(CacheLineSize());
22+
1623
#endif

IsPowerOfTwo.hpp

+2-2
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,5 @@
1-
#ifndef IS_POWER_OF_TWO_HPP_INCLUDED
2-
#define IS_POWER_OF_TWO_HPP_INCLUDED
1+
#ifndef ISPOWEROFTWO_HPP_INCLUDED
2+
#define ISPOWEROFTWO_HPP_INCLUDED
33

44
#define IS_POWER_OF_TWO(x) ((x != 0) && ((x & (x - 1)) == 0))
55

RoundUp.hpp

+2-2
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,5 @@
1-
#ifndef ROUND_UP_HPP_INCLUDED
2-
#define ROUND_UP_HPP_INCLUDED
1+
#ifndef ROUNDUP_HPP_INCLUDED
2+
#define ROUNDUP_HPP_INCLUDED
33

44
#define ROUND_UP(from, to) (from + to - 1 - (from - 1) % to)
55

0 commit comments

Comments
 (0)