1 #ifndef ANDROID_PDX_RPC_DEFAULT_INITIALIZATION_ALLOCATOR_H_ 2 #define ANDROID_PDX_RPC_DEFAULT_INITIALIZATION_ALLOCATOR_H_ 3 4 #include <memory> 5 6 namespace android { 7 namespace pdx { 8 namespace rpc { 9 10 // Allocator adaptor that interposes construct() calls to convert value 11 // initialization into default initialization. All standard containers 12 // value-initialize their elements when constructed with a single size_type 13 // argument or when grown by a call to resize. This allocator avoids potentially 14 // costly value-initialization in these situations for value types that are 15 // default constructible. As a consequence, elements of non-class types are left 16 // uninitialized; this is desirable when using std::vector as a resizable 17 // buffer, for example. 18 template <typename T, typename Allocator = std::allocator<T>> 19 class DefaultInitializationAllocator : public Allocator { 20 typedef std::allocator_traits<Allocator> AllocatorTraits; 21 22 public: 23 template <typename U> 24 struct rebind { 25 using other = DefaultInitializationAllocator< 26 U, typename AllocatorTraits::template rebind_alloc<U>>; 27 }; 28 29 using Allocator::Allocator; 30 31 template <typename U> construct(U * pointer)32 void construct(U* pointer) noexcept( 33 std::is_nothrow_default_constructible<U>::value) { 34 ::new (static_cast<void*>(pointer)) U; 35 } 36 template <typename U, typename... Args> construct(U * pointer,Args &&...args)37 void construct(U* pointer, Args&&... args) { 38 AllocatorTraits::construct(static_cast<Allocator&>(*this), pointer, 39 std::forward<Args>(args)...); 40 } 41 }; 42 43 } // namespace rpc 44 } // namespace pdx 45 } // namespace android 46 47 #endif // ANDROID_PDX_RPC_DEFAULT_INITIALIZATION_ALLOCATOR_H_ 48