1*44844408SAndroid Build Coastguard Worker // Copyright 2007-2010 Baptiste Lepilleur and The JsonCpp Authors 2*44844408SAndroid Build Coastguard Worker // Distributed under MIT license, or public domain if desired and 3*44844408SAndroid Build Coastguard Worker // recognized in your jurisdiction. 4*44844408SAndroid Build Coastguard Worker // See file LICENSE for detail or copy at http://jsoncpp.sourceforge.net/LICENSE 5*44844408SAndroid Build Coastguard Worker 6*44844408SAndroid Build Coastguard Worker #ifndef JSON_ALLOCATOR_H_INCLUDED 7*44844408SAndroid Build Coastguard Worker #define JSON_ALLOCATOR_H_INCLUDED 8*44844408SAndroid Build Coastguard Worker 9*44844408SAndroid Build Coastguard Worker #include <cstring> 10*44844408SAndroid Build Coastguard Worker #include <memory> 11*44844408SAndroid Build Coastguard Worker 12*44844408SAndroid Build Coastguard Worker #pragma pack(push, 8) 13*44844408SAndroid Build Coastguard Worker 14*44844408SAndroid Build Coastguard Worker namespace Json { 15*44844408SAndroid Build Coastguard Worker template <typename T> class SecureAllocator { 16*44844408SAndroid Build Coastguard Worker public: 17*44844408SAndroid Build Coastguard Worker // Type definitions 18*44844408SAndroid Build Coastguard Worker using value_type = T; 19*44844408SAndroid Build Coastguard Worker using pointer = T*; 20*44844408SAndroid Build Coastguard Worker using const_pointer = const T*; 21*44844408SAndroid Build Coastguard Worker using reference = T&; 22*44844408SAndroid Build Coastguard Worker using const_reference = const T&; 23*44844408SAndroid Build Coastguard Worker using size_type = std::size_t; 24*44844408SAndroid Build Coastguard Worker using difference_type = std::ptrdiff_t; 25*44844408SAndroid Build Coastguard Worker 26*44844408SAndroid Build Coastguard Worker /** 27*44844408SAndroid Build Coastguard Worker * Allocate memory for N items using the standard allocator. 28*44844408SAndroid Build Coastguard Worker */ allocate(size_type n)29*44844408SAndroid Build Coastguard Worker pointer allocate(size_type n) { 30*44844408SAndroid Build Coastguard Worker // allocate using "global operator new" 31*44844408SAndroid Build Coastguard Worker return static_cast<pointer>(::operator new(n * sizeof(T))); 32*44844408SAndroid Build Coastguard Worker } 33*44844408SAndroid Build Coastguard Worker 34*44844408SAndroid Build Coastguard Worker /** 35*44844408SAndroid Build Coastguard Worker * Release memory which was allocated for N items at pointer P. 36*44844408SAndroid Build Coastguard Worker * 37*44844408SAndroid Build Coastguard Worker * The memory block is filled with zeroes before being released. 38*44844408SAndroid Build Coastguard Worker */ deallocate(pointer p,size_type n)39*44844408SAndroid Build Coastguard Worker void deallocate(pointer p, size_type n) { 40*44844408SAndroid Build Coastguard Worker // memset_s is used because memset may be optimized away by the compiler 41*44844408SAndroid Build Coastguard Worker memset_s(p, n * sizeof(T), 0, n * sizeof(T)); 42*44844408SAndroid Build Coastguard Worker // free using "global operator delete" 43*44844408SAndroid Build Coastguard Worker ::operator delete(p); 44*44844408SAndroid Build Coastguard Worker } 45*44844408SAndroid Build Coastguard Worker 46*44844408SAndroid Build Coastguard Worker /** 47*44844408SAndroid Build Coastguard Worker * Construct an item in-place at pointer P. 48*44844408SAndroid Build Coastguard Worker */ construct(pointer p,Args &&...args)49*44844408SAndroid Build Coastguard Worker template <typename... Args> void construct(pointer p, Args&&... args) { 50*44844408SAndroid Build Coastguard Worker // construct using "placement new" and "perfect forwarding" 51*44844408SAndroid Build Coastguard Worker ::new (static_cast<void*>(p)) T(std::forward<Args>(args)...); 52*44844408SAndroid Build Coastguard Worker } 53*44844408SAndroid Build Coastguard Worker max_size()54*44844408SAndroid Build Coastguard Worker size_type max_size() const { return size_t(-1) / sizeof(T); } 55*44844408SAndroid Build Coastguard Worker address(reference x)56*44844408SAndroid Build Coastguard Worker pointer address(reference x) const { return std::addressof(x); } 57*44844408SAndroid Build Coastguard Worker address(const_reference x)58*44844408SAndroid Build Coastguard Worker const_pointer address(const_reference x) const { return std::addressof(x); } 59*44844408SAndroid Build Coastguard Worker 60*44844408SAndroid Build Coastguard Worker /** 61*44844408SAndroid Build Coastguard Worker * Destroy an item in-place at pointer P. 62*44844408SAndroid Build Coastguard Worker */ destroy(pointer p)63*44844408SAndroid Build Coastguard Worker void destroy(pointer p) { 64*44844408SAndroid Build Coastguard Worker // destroy using "explicit destructor" 65*44844408SAndroid Build Coastguard Worker p->~T(); 66*44844408SAndroid Build Coastguard Worker } 67*44844408SAndroid Build Coastguard Worker 68*44844408SAndroid Build Coastguard Worker // Boilerplate SecureAllocator()69*44844408SAndroid Build Coastguard Worker SecureAllocator() {} SecureAllocator(const SecureAllocator<U> &)70*44844408SAndroid Build Coastguard Worker template <typename U> SecureAllocator(const SecureAllocator<U>&) {} 71*44844408SAndroid Build Coastguard Worker template <typename U> struct rebind { using other = SecureAllocator<U>; }; 72*44844408SAndroid Build Coastguard Worker }; 73*44844408SAndroid Build Coastguard Worker 74*44844408SAndroid Build Coastguard Worker template <typename T, typename U> 75*44844408SAndroid Build Coastguard Worker bool operator==(const SecureAllocator<T>&, const SecureAllocator<U>&) { 76*44844408SAndroid Build Coastguard Worker return true; 77*44844408SAndroid Build Coastguard Worker } 78*44844408SAndroid Build Coastguard Worker 79*44844408SAndroid Build Coastguard Worker template <typename T, typename U> 80*44844408SAndroid Build Coastguard Worker bool operator!=(const SecureAllocator<T>&, const SecureAllocator<U>&) { 81*44844408SAndroid Build Coastguard Worker return false; 82*44844408SAndroid Build Coastguard Worker } 83*44844408SAndroid Build Coastguard Worker 84*44844408SAndroid Build Coastguard Worker } // namespace Json 85*44844408SAndroid Build Coastguard Worker 86*44844408SAndroid Build Coastguard Worker #pragma pack(pop) 87*44844408SAndroid Build Coastguard Worker 88*44844408SAndroid Build Coastguard Worker #endif // JSON_ALLOCATOR_H_INCLUDED 89