Teuchos - Trilinos Tools Package Version of the Day
Loading...
Searching...
No Matches
Teuchos_Details_Allocator.hpp
Go to the documentation of this file.
1// @HEADER
2// *****************************************************************************
3// Teuchos: Common Tools Package
4//
5// Copyright 2004 NTESS and the Teuchos contributors.
6// SPDX-License-Identifier: BSD-3-Clause
7// *****************************************************************************
8// @HEADER
9
17
18#ifndef TEUCHOS_DETAILS_ALLOCATOR
19#define TEUCHOS_DETAILS_ALLOCATOR
20
22#include <iostream>
23#include <limits>
24#include <type_traits>
25#include <typeinfo>
26
27namespace Teuchos {
28namespace Details {
29
44public:
48 typedef std::size_t size_type;
49
73 static void
74 logAllocation (std::ostream& out,
75 const size_type numEntries,
76 const size_type numBytes,
77 const char typeName[],
78 const bool verbose);
79
107 static void
108 logDeallocation (std::ostream& out,
109 const size_type numEntries,
110 const size_type numBytes,
111 const char typeName[],
112 const bool verbose);
113
117 static size_type curAllocInBytes ();
118
122 static size_type maxAllocInBytes ();
123
127 static void resetAllocationCounts ();
128
129private:
131 static size_type curAllocInBytes_;
132
134 static size_type maxAllocInBytes_;
135};
136
155template<class T>
157private:
160 enum EAllocatorOp {
161 ALLOCATOR_ALLOCATE,
162 ALLOCATOR_DEALLOCATE
163 };
164
166 bool tracking () const { return track_; }
167
169 bool verbose () const { return verbose_; }
170
171 // This lets tracking() and verbose() stay private,
172 // without breaking the templated copy constructor.
173 template<class U>
174 friend class Allocator;
175
176public:
178 typedef T value_type;
179
183 typedef T* pointer;
187 typedef const T* const_pointer;
191 typedef T& reference;
195 typedef const T& const_reference;
196
203
211#ifdef HAVE_TEUCHOSCORE_CXX11
212 typedef std::make_signed<size_type>::type difference_type;
213#else
214 typedef std::ptrdiff_t difference_type;
215#endif // HAVE_TEUCHOSCORE_CXX11
216
219 track_ (true), verbose_ (false)
220 {}
221
230 const bool verboseOutput) :
231 track_ (trackMemory), verbose_ (verboseOutput)
232 {}
233
235 template<class U>
237 track_ (src.tracking ()), verbose_ (src.verbose ())
238 {}
239
249 template<class U>
250 struct rebind { typedef Allocator<U> other; };
251
257 return std::numeric_limits<size_type>::max();
258 }
259
268 value_type* allocate (const size_type& n, const void* = 0) {
269 if (tracking ()) {
270 AllocationLogger::logAllocation (std::cerr, n, n * sizeof (value_type),
271 typeid (value_type).name (), verbose_);
272 }
273 return (value_type*) (::operator new (n * sizeof (T)));
274 }
275
280 void deallocate (value_type* p, const size_type& n) {
281 if (tracking ()) {
282 // Thankfully, this method accepts the array size. Thus, we don't
283 // have to do tricks like allocating extra space and stashing the
284 // size in the array.
285 AllocationLogger::logDeallocation (std::cerr, n, n * sizeof (value_type),
286 typeid (value_type).name (), verbose_);
287 }
288 ::operator delete ((void*) p);
289 }
290
295
300
301#ifndef HAVE_TEUCHOSCORE_CXX11
314 new ((void*) p) T (val);
315 }
316#endif // HAVE_TEUCHOSCORE_CXX11
317
318#ifndef HAVE_TEUCHOSCORE_CXX11
329 ((T*)p)->~T ();
330 }
331#endif // HAVE_TEUCHOSCORE_CXX11
332
333private:
334 bool track_;
335 bool verbose_;
336};
337
338
346template<class T, class U>
348 return true;
349}
350
352template<class T, class U>
354 return ! (a_t == a_u);
355}
356
357} // namespace Details
358} // namespace Teuchos
359
360#endif // TEUCHOS_DETAILS_ALLOCATOR
Teuchos header file which uses auto-configuration information to include necessary C++ headers.
Logging implementation used by Allocator (see below).
static void resetAllocationCounts()
Reset the current and max total allocation numbers to zero.
static size_type curAllocInBytes()
Current total allocation in bytes.
static void logAllocation(std::ostream &out, const size_type numEntries, const size_type numBytes, const char typeName[], const bool verbose)
Log an allocation.
static size_type maxAllocInBytes()
Max total allocation ("high water mark") in bytes.
std::size_t size_type
Type of the size of an allocation or deallocation.
static void logDeallocation(std::ostream &out, const size_type numEntries, const size_type numBytes, const char typeName[], const bool verbose)
Log a deallocation, that was previously logged using logAllocation().
Optional tracking allocator for Teuchos Memory Management classes.
size_type curAllocInBytes()
Current total allocation in bytes, over all Allocator.
T & reference
Type of a reference to T.
std::ptrdiff_t difference_type
Integer type representing the difference between two pointers.
void construct(pointer p, const_reference val)
Invoke the constructor of an instance of T, without allocating.
const T * const_pointer
Type of a pointer to const T.
void deallocate(value_type *p, const size_type &n)
Deallocate n instances of value_type.
value_type * allocate(const size_type &n, const void *=0)
Allocate an array of n instances of value_type.
T value_type
Type of the template parameter of this class.
void destroy(pointer p)
Invoke the destructor of an instance of T, without deallocating.
Allocator(const bool trackMemory, const bool verboseOutput)
Constructor.
size_type max_size() const
Upper bound (possibly loose) on maximum allocation size.
AllocationLogger::size_type size_type
Type of the size of an allocation or deallocation.
Allocator(const Allocator< U > &src)
Copy constructor that takes an Allocator for any U.
size_type maxAllocInBytes()
Max total allocation ("high water mark") in bytes, over all Allocator.
const T & const_reference
Type of a reference to const T.
Smart reference counting pointer class for automatic garbage collection.
std::string typeName(const T &t)
Template function for returning the concrete type name of a passed-in object.
Namespace of implementation details.
The Teuchos namespace contains all of the classes, structs and enums used by Teuchos,...
Mapping to an Allocator for a different type U.