xref: /aosp_15_r20/external/jsoncpp/include/json/allocator.h (revision 4484440890e2bc6e07362b4feaf15601abfe0071)
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