AlignedAllocator.h
Go to the documentation of this file.
1 //=================================================================================================
33 //=================================================================================================
34 
35 #ifndef _BLAZE_UTIL_ALIGNEDALLOCATOR_H_
36 #define _BLAZE_UTIL_ALIGNEDALLOCATOR_H_
37 
38 
39 //*************************************************************************************************
40 // Includes
41 //*************************************************************************************************
42 
43 #include <blaze/util/Memory.h>
45 #include <blaze/util/Unused.h>
46 
47 
48 namespace blaze {
49 
50 //=================================================================================================
51 //
52 // CLASS DEFINITION
53 //
54 //=================================================================================================
55 
56 //*************************************************************************************************
68 template< typename Type >
70 {
71  public:
72  //**Type definitions****************************************************************************
73  using ValueType = Type;
74  using Pointer = Type*;
75  using ConstPointer = const Type*;
76  using Reference = Type&;
77  using ConstReference = const Type&;
78  using SizeType = std::size_t;
79  using DifferenceType = std::ptrdiff_t;
80 
81  // STL allocator requirements
83  using pointer = Pointer;
85  using reference = Reference;
87  using size_type = SizeType;
89  //**********************************************************************************************
90 
91  //**rebind class definition*********************************************************************
94  template< typename Type2 >
95  struct rebind
96  {
98  };
99  //**********************************************************************************************
100 
101  //**Constructors********************************************************************************
104  explicit inline AlignedAllocator();
105 
106  template< typename Type2 >
107  inline AlignedAllocator( const AlignedAllocator<Type2>& );
109  //**********************************************************************************************
110 
111  //**Utility functions***************************************************************************
114  inline constexpr size_t max_size() const noexcept;
115  inline Pointer address( Reference x ) const noexcept;
116  inline ConstPointer address( ConstReference x ) const noexcept;
118  //**********************************************************************************************
119 
120  //**Allocation functions************************************************************************
123  inline Pointer allocate ( size_t numObjects, const void* localityHint = nullptr );
124  inline void deallocate( Pointer ptr, size_t numObjects );
126  //**********************************************************************************************
127 
128  //**Construction functions**********************************************************************
131  inline void construct( Pointer ptr, const Type& value );
132  inline void destroy ( Pointer ptr ) noexcept;
134  //**********************************************************************************************
135 };
136 //*************************************************************************************************
137 
138 
139 
140 
141 //=================================================================================================
142 //
143 // CONSTRUCTOR
144 //
145 //=================================================================================================
146 
147 //*************************************************************************************************
150 template< typename Type >
152 {}
153 //*************************************************************************************************
154 
155 
156 //*************************************************************************************************
161 template< typename Type >
162 template< typename Type2 >
164 {
165  UNUSED_PARAMETER( allocator );
166 }
167 //*************************************************************************************************
168 
169 
170 
171 
172 //=================================================================================================
173 //
174 // UTILITY FUNCTIONS
175 //
176 //=================================================================================================
177 
178 //*************************************************************************************************
183 template< typename Type >
184 inline constexpr size_t AlignedAllocator<Type>::max_size() const noexcept
185 {
186  return size_t(-1) / sizeof( Type );
187 }
188 //*************************************************************************************************
189 
190 
191 //*************************************************************************************************
196 template< typename Type >
197 inline typename AlignedAllocator<Type>::Pointer
199 {
200  return &x;
201 }
202 //*************************************************************************************************
203 
204 
205 //*************************************************************************************************
210 template< typename Type >
213 {
214  return &x;
215 }
216 //*************************************************************************************************
217 
218 
219 
220 
221 //=================================================================================================
222 //
223 // ALLOCATION FUNCTIONS
224 //
225 //=================================================================================================
226 
227 //*************************************************************************************************
240 template< typename Type >
241 inline typename AlignedAllocator<Type>::Pointer
242  AlignedAllocator<Type>::allocate( size_t numObjects, const void* localityHint )
243 {
244  UNUSED_PARAMETER( localityHint );
245 
246  const size_t alignment( AlignmentOf<Type>::value );
247 
248  if( alignment >= 8UL ) {
249  return reinterpret_cast<Type*>( allocate_backend( numObjects*sizeof(Type), alignment ) );
250  }
251  else {
252  return static_cast<Pointer>( operator new[]( numObjects * sizeof( Type ) ) );
253  }
254 }
255 //*************************************************************************************************
256 
257 
258 //*************************************************************************************************
269 template< typename Type >
270 inline void AlignedAllocator<Type>::deallocate( Pointer ptr, size_t numObjects )
271 {
272  UNUSED_PARAMETER( numObjects );
273 
274  if( ptr == nullptr )
275  return;
276 
277  const size_t alignment( AlignmentOf<Type>::value );
278 
279  if( alignment >= 8UL ) {
280  deallocate_backend( ptr );
281  }
282  else {
283  operator delete[]( ptr );
284  }
285 }
286 //*************************************************************************************************
287 
288 
289 
290 
291 //=================================================================================================
292 //
293 // CONSTRUCTION FUNCTIONS
294 //
295 //=================================================================================================
296 
297 //*************************************************************************************************
307 template< typename Type >
309 {
310  ::new( ptr ) Type( value );
311 }
312 //*************************************************************************************************
313 
314 
315 //*************************************************************************************************
324 template< typename Type >
325 inline void AlignedAllocator<Type>::destroy( Pointer ptr ) noexcept
326 {
327  ptr->~Type();
328 }
329 //*************************************************************************************************
330 
331 
332 
333 
334 //=================================================================================================
335 //
336 // GLOBAL OPERATORS
337 //
338 //=================================================================================================
339 
340 //*************************************************************************************************
343 template< typename T1, typename T2 >
344 inline bool operator==( const AlignedAllocator<T1>& lhs, const AlignedAllocator<T2>& rhs ) noexcept;
345 
346 template< typename T1, typename T2 >
347 inline bool operator!=( const AlignedAllocator<T1>& lhs, const AlignedAllocator<T2>& rhs ) noexcept;
349 //*************************************************************************************************
350 
351 
352 //*************************************************************************************************
359 template< typename T1 // Type of the left-hand side aligned allocator
360  , typename T2 > // Type of the right-hand side aligned allocator
361 inline bool operator==( const AlignedAllocator<T1>& lhs, const AlignedAllocator<T2>& rhs ) noexcept
362 {
363  UNUSED_PARAMETER( lhs, rhs );
364  return true;
365 }
366 //*************************************************************************************************
367 
368 
369 //*************************************************************************************************
376 template< typename T1 // Type of the left-hand side aligned allocator
377  , typename T2 > // Type of the right-hand side aligned allocator
378 inline bool operator!=( const AlignedAllocator<T1>& lhs, const AlignedAllocator<T2>& rhs ) noexcept
379 {
380  UNUSED_PARAMETER( lhs, rhs );
381  return false;
382 }
383 //*************************************************************************************************
384 
385 } // namespace blaze
386 
387 #endif
constexpr size_t max_size() const noexcept
Returns the maximum possible number of elements that can be allocated together.
Definition: AlignedAllocator.h:184
Header file for the AlignmentOf type trait.
Header file for the UNUSED_PARAMETER function template.
ValueType value_type
Type of the allocated values.
Definition: AlignedAllocator.h:82
Header file for memory allocation and deallocation functionality.
void destroy(Pointer ptr) noexcept
Destroys the object of type Type at the specified memory location.
Definition: AlignedAllocator.h:325
Pointer address(Reference x) const noexcept
Returns the address of the given element.
Definition: AlignedAllocator.h:198
DifferenceType difference_type
Difference type of the aligned allocator.
Definition: AlignedAllocator.h:88
ConstPointer const_pointer
Type of a pointer-to-const to the allocated values.
Definition: AlignedAllocator.h:84
Pointer pointer
Type of a pointer to the allocated values.
Definition: AlignedAllocator.h:83
Namespace of the Blaze C++ math library.
Definition: Blaze.h:57
Pointer allocate(size_t numObjects, const void *localityHint=nullptr)
Allocates aligned memory for the specified number of objects.
Definition: AlignedAllocator.h:242
SizeType size_type
Size type of the aligned allocator.
Definition: AlignedAllocator.h:87
Type * Pointer
Type of a pointer to the allocated values.
Definition: AlignedAllocator.h:74
constexpr bool operator==(const NegativeAccuracy< A > &lhs, const T &rhs)
Equality comparison between a NegativeAccuracy object and a floating point value. ...
Definition: Accuracy.h:250
void construct(Pointer ptr, const Type &value)
Constructs an object of type Type at the specified memory location.
Definition: AlignedAllocator.h:308
constexpr bool operator!=(const NegativeAccuracy< A > &lhs, const T &rhs)
Inequality comparison between a NegativeAccuracy object and a floating point value.
Definition: Accuracy.h:290
Allocator for type-specific aligned memory.The AlignedAllocator class template represents an implemen...
Definition: AlignedAllocator.h:69
const Type * ConstPointer
Type of a pointer-to-const to the allocated values.
Definition: AlignedAllocator.h:75
void deallocate(Pointer ptr, size_t numObjects)
Deallocation of memory.
Definition: AlignedAllocator.h:270
Type ValueType
Type of the allocated values.
Definition: AlignedAllocator.h:73
AlignedAllocator()
The default constructor for AlignedAllocator.
Definition: AlignedAllocator.h:151
Reference reference
Type of a reference to the allocated values.
Definition: AlignedAllocator.h:85
Type & Reference
Type of a reference to the allocated values.
Definition: AlignedAllocator.h:76
std::ptrdiff_t DifferenceType
Difference type of the aligned allocator.
Definition: AlignedAllocator.h:79
std::size_t SizeType
Size type of the aligned allocator.
Definition: AlignedAllocator.h:78
const Type & ConstReference
Type of a reference-to-const to the allocated values.
Definition: AlignedAllocator.h:77
void UNUSED_PARAMETER(const Args &...)
Suppression of unused parameter warnings.
Definition: Unused.h:81
ConstReference const_reference
Type of a reference-to-const to the allocated values.
Definition: AlignedAllocator.h:86
Size type of the Blaze library.
Evaluation of the required alignment of the given data type.The AlignmentOf type trait template evalu...
Definition: AlignmentOf.h:219
Implementation of the AlignedAllocator rebind mechanism.
Definition: AlignedAllocator.h:95