// Copyright 2007-2010 Baptiste Lepilleur and The JsonCpp Authors // Distributed under MIT license, or public domain if desired and // recognized in your jurisdiction. // See file LICENSE for detail or copy at http://jsoncpp.sourceforge.net/LICENSE #ifndef JSON_ALLOCATOR_H_INCLUDED #define JSON_ALLOCATOR_H_INCLUDED #include #include #pragma pack(push, 8) namespace Json { template class SecureAllocator { public: // Type definitions using value_type = T; using pointer = T*; using const_pointer = const T*; using reference = T&; using const_reference = const T&; using size_type = std::size_t; using difference_type = std::ptrdiff_t; /** * Allocate memory for N items using the standard allocator. */ pointer allocate(size_type n) { // allocate using "global operator new" return static_cast(::operator new(n * sizeof(T))); } /** * Release memory which was allocated for N items at pointer P. * * The memory block is filled with zeroes before being released. * The pointer argument is tagged as "volatile" to prevent the * compiler optimizing out this critical step. */ void deallocate(volatile pointer p, size_type n) { std::memset(p, 0, n * sizeof(T)); // free using "global operator delete" ::operator delete(p); } /** * Construct an item in-place at pointer P. */ template void construct(pointer p, Args&&... args) { // construct using "placement new" and "perfect forwarding" ::new (static_cast(p)) T(std::forward(args)...); } size_type max_size() const { return size_t(-1) / sizeof(T); } pointer address(reference x) const { return std::addressof(x); } const_pointer address(const_reference x) const { return std::addressof(x); } /** * Destroy an item in-place at pointer P. */ void destroy(pointer p) { // destroy using "explicit destructor" p->~T(); } // Boilerplate SecureAllocator() {} template SecureAllocator(const SecureAllocator&) {} template struct rebind { using other = SecureAllocator; }; }; template bool operator==(const SecureAllocator&, const SecureAllocator&) { return true; } template bool operator!=(const SecureAllocator&, const SecureAllocator&) { return false; } } // namespace Json #pragma pack(pop) #endif // JSON_ALLOCATOR_H_INCLUDED