1bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant//===----------------------------------------------------------------------===// 2bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant// 3f5256e16dfc425c1d466f6308d4026d529ce9e0bHoward Hinnant// The LLVM Compiler Infrastructure 4bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant// 5b64f8b07c104c6cc986570ac8ee0ed16a9f23976Howard Hinnant// This file is dual licensed under the MIT and the University of Illinois Open 6b64f8b07c104c6cc986570ac8ee0ed16a9f23976Howard Hinnant// Source Licenses. See LICENSE.TXT for details. 7bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant// 8bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant//===----------------------------------------------------------------------===// 9bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant 10bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant// <memory> 11bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant 12bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant// template <class OuterAlloc, class... InnerAllocs> 13bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant// class scoped_allocator_adaptor 14bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant// : public OuterAlloc 15bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant// { 16bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant// public: 17bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant// typedef OuterAlloc outer_allocator_type; 18bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant// typedef typename OuterTraits::size_type size_type; 19bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant// typedef typename OuterTraits::difference_type difference_type; 20bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant// typedef typename OuterTraits::pointer pointer; 21bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant// typedef typename OuterTraits::const_pointer const_pointer; 22bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant// typedef typename OuterTraits::void_pointer void_pointer; 23bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant// typedef typename OuterTraits::const_void_pointer const_void_pointer; 24bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant// }; 25bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant 26e92c3d74cefe87767b620688ef083be8f976e62dHoward Hinnant#include <scoped_allocator> 27bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant#include <type_traits> 28bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant 29bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant#include "allocators.h" 30bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant 31bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnantint main() 32bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant{ 3373d21a4f0774d3fadab98e690619a359cfb160a3Howard Hinnant#ifndef _LIBCPP_HAS_NO_RVALUE_REFERENCES 34bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant 35bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant static_assert((std::is_base_of< 36bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant A1<int>, 37bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant std::scoped_allocator_adaptor<A1<int>> 38bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant >::value), ""); 39bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant 40bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant static_assert((std::is_same< 41bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant std::scoped_allocator_adaptor<A1<int>>::outer_allocator_type, 42bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant A1<int>>::value), ""); 43bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant 44bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant static_assert((std::is_same< 45bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant std::scoped_allocator_adaptor<A1<int>>::size_type, 46b8f787b18830ae120fc195f47735a02e84d1a344Howard Hinnant std::make_unsigned<std::ptrdiff_t>::type>::value), ""); 47bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant 48bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant static_assert((std::is_same< 49bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant std::scoped_allocator_adaptor<A1<int>>::difference_type, 50bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant std::ptrdiff_t>::value), ""); 51bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant 52bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant static_assert((std::is_same< 53bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant std::scoped_allocator_adaptor<A1<int>>::pointer, 54bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant int*>::value), ""); 55bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant 56bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant static_assert((std::is_same< 57bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant std::scoped_allocator_adaptor<A1<int>>::const_pointer, 58bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant const int*>::value), ""); 59bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant 60bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant static_assert((std::is_same< 61bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant std::scoped_allocator_adaptor<A1<int>>::void_pointer, 62bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant void*>::value), ""); 63bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant 64bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant static_assert((std::is_same< 65bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant std::scoped_allocator_adaptor<A1<int>>::const_void_pointer, 66bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant const void*>::value), ""); 67bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant 68bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant static_assert((std::is_base_of< 69bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant A2<int>, 70bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant std::scoped_allocator_adaptor<A2<int>, A1<int>> 71bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant >::value), ""); 72bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant 73bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant static_assert((std::is_same< 74bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant std::scoped_allocator_adaptor<A2<int>, A1<int>>::outer_allocator_type, 75bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant A2<int>>::value), ""); 76bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant 77bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant static_assert((std::is_same< 78bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant std::scoped_allocator_adaptor<A2<int>, A1<int>>::size_type, 79bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant unsigned>::value), ""); 80bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant 81bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant static_assert((std::is_same< 82bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant std::scoped_allocator_adaptor<A2<int>, A1<int>>::difference_type, 83bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant int>::value), ""); 84bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant 85bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant static_assert((std::is_same< 86bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant std::scoped_allocator_adaptor<A2<int>, A1<int>>::pointer, 87bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant int*>::value), ""); 88bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant 89bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant static_assert((std::is_same< 90bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant std::scoped_allocator_adaptor<A2<int>, A1<int>>::const_pointer, 91bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant const int*>::value), ""); 92bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant 93bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant static_assert((std::is_same< 94bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant std::scoped_allocator_adaptor<A2<int>, A1<int>>::void_pointer, 95bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant void*>::value), ""); 96bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant 97bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant static_assert((std::is_same< 98bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant std::scoped_allocator_adaptor<A2<int>, A1<int>>::const_void_pointer, 99bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant const void*>::value), ""); 100bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant 10173d21a4f0774d3fadab98e690619a359cfb160a3Howard Hinnant#endif // _LIBCPP_HAS_NO_RVALUE_REFERENCES 102bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant} 103