File indexing completed on 2024-04-06 12:13:13
0001 #ifndef FWCore_Utilities_zero_allocator_h
0002 #define FWCore_Utilities_zero_allocator_h
0003
0004
0005
0006
0007
0008
0009
0010
0011
0012
0013
0014
0015
0016
0017
0018
0019 #include "oneapi/tbb/tbb_allocator.h"
0020 #include <cstring>
0021
0022
0023
0024
0025
0026
0027
0028 namespace edm {
0029 template <typename T, template <typename X> class Allocator = oneapi::tbb::tbb_allocator>
0030 class zero_allocator : public Allocator<T> {
0031 public:
0032 using value_type = T;
0033 using base_allocator_type = Allocator<T>;
0034 template <typename U>
0035 struct rebind {
0036 typedef zero_allocator<U, Allocator> other;
0037 };
0038
0039 zero_allocator() throw() {}
0040 zero_allocator(const zero_allocator &a) throw() : base_allocator_type(a) {}
0041 template <typename U>
0042 zero_allocator(const zero_allocator<U> &a) throw() : base_allocator_type(Allocator<U>(a)) {}
0043
0044 T *allocate(const std::size_t n, const void *hint = nullptr) {
0045
0046 T *ptr = base_allocator_type::allocate(n);
0047 std::memset(static_cast<void *>(ptr), 0, n * sizeof(value_type));
0048 return ptr;
0049 }
0050 };
0051
0052 template <typename T1, template <typename X1> class B1, typename T2, template <typename X2> class B2>
0053 inline bool operator==(const zero_allocator<T1, B1> &a, const zero_allocator<T2, B2> &b) {
0054 return static_cast<B1<T1> >(a) == static_cast<B2<T2> >(b);
0055 }
0056 template <typename T1, template <typename X1> class B1, typename T2, template <typename X2> class B2>
0057 inline bool operator!=(const zero_allocator<T1, B1> &a, const zero_allocator<T2, B2> &b) {
0058 return static_cast<B1<T1> >(a) != static_cast<B2<T2> >(b);
0059 }
0060 }
0061 #endif