1c52f43e72dfcea03037729649da84c23b3beb04aHoward Hinnant//===----------------------------------------------------------------------===// 2c52f43e72dfcea03037729649da84c23b3beb04aHoward Hinnant// 3c52f43e72dfcea03037729649da84c23b3beb04aHoward Hinnant// The LLVM Compiler Infrastructure 4c52f43e72dfcea03037729649da84c23b3beb04aHoward 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. 7c52f43e72dfcea03037729649da84c23b3beb04aHoward Hinnant// 8c52f43e72dfcea03037729649da84c23b3beb04aHoward Hinnant//===----------------------------------------------------------------------===// 9c52f43e72dfcea03037729649da84c23b3beb04aHoward Hinnant 10c52f43e72dfcea03037729649da84c23b3beb04aHoward Hinnant// <memory> 11c52f43e72dfcea03037729649da84c23b3beb04aHoward Hinnant 12c52f43e72dfcea03037729649da84c23b3beb04aHoward Hinnant// template <class Alloc> 13c52f43e72dfcea03037729649da84c23b3beb04aHoward Hinnant// struct allocator_traits 14c52f43e72dfcea03037729649da84c23b3beb04aHoward Hinnant// { 15c52f43e72dfcea03037729649da84c23b3beb04aHoward Hinnant// static pointer allocate(allocator_type& a, size_type n, const_void_pointer hint); 16c52f43e72dfcea03037729649da84c23b3beb04aHoward Hinnant// ... 17c52f43e72dfcea03037729649da84c23b3beb04aHoward Hinnant// }; 18c52f43e72dfcea03037729649da84c23b3beb04aHoward Hinnant 19c52f43e72dfcea03037729649da84c23b3beb04aHoward Hinnant#include <memory> 20c52f43e72dfcea03037729649da84c23b3beb04aHoward Hinnant#include <cassert> 21c52f43e72dfcea03037729649da84c23b3beb04aHoward Hinnant 22c52f43e72dfcea03037729649da84c23b3beb04aHoward Hinnanttemplate <class T> 23c52f43e72dfcea03037729649da84c23b3beb04aHoward Hinnantstruct A 24c52f43e72dfcea03037729649da84c23b3beb04aHoward Hinnant{ 25c52f43e72dfcea03037729649da84c23b3beb04aHoward Hinnant typedef T value_type; 26c52f43e72dfcea03037729649da84c23b3beb04aHoward Hinnant 27c52f43e72dfcea03037729649da84c23b3beb04aHoward Hinnant value_type* allocate(std::size_t n) 28c52f43e72dfcea03037729649da84c23b3beb04aHoward Hinnant { 29c52f43e72dfcea03037729649da84c23b3beb04aHoward Hinnant assert(n == 10); 30c52f43e72dfcea03037729649da84c23b3beb04aHoward Hinnant return (value_type*)0xDEADBEEF; 31c52f43e72dfcea03037729649da84c23b3beb04aHoward Hinnant } 32c52f43e72dfcea03037729649da84c23b3beb04aHoward Hinnant}; 33c52f43e72dfcea03037729649da84c23b3beb04aHoward Hinnant 34c52f43e72dfcea03037729649da84c23b3beb04aHoward Hinnanttemplate <class T> 35c52f43e72dfcea03037729649da84c23b3beb04aHoward Hinnantstruct B 36c52f43e72dfcea03037729649da84c23b3beb04aHoward Hinnant{ 37c52f43e72dfcea03037729649da84c23b3beb04aHoward Hinnant typedef T value_type; 38c52f43e72dfcea03037729649da84c23b3beb04aHoward Hinnant 39c52f43e72dfcea03037729649da84c23b3beb04aHoward Hinnant value_type* allocate(std::size_t n) 40c52f43e72dfcea03037729649da84c23b3beb04aHoward Hinnant { 41c52f43e72dfcea03037729649da84c23b3beb04aHoward Hinnant assert(n == 12); 42c52f43e72dfcea03037729649da84c23b3beb04aHoward Hinnant return (value_type*)0xEEADBEEF; 43c52f43e72dfcea03037729649da84c23b3beb04aHoward Hinnant } 44c52f43e72dfcea03037729649da84c23b3beb04aHoward Hinnant value_type* allocate(std::size_t n, const void* p) 45c52f43e72dfcea03037729649da84c23b3beb04aHoward Hinnant { 46c52f43e72dfcea03037729649da84c23b3beb04aHoward Hinnant assert(n == 11); 47c52f43e72dfcea03037729649da84c23b3beb04aHoward Hinnant assert(p == 0); 48c52f43e72dfcea03037729649da84c23b3beb04aHoward Hinnant return (value_type*)0xFEADBEEF; 49c52f43e72dfcea03037729649da84c23b3beb04aHoward Hinnant } 50c52f43e72dfcea03037729649da84c23b3beb04aHoward Hinnant}; 51c52f43e72dfcea03037729649da84c23b3beb04aHoward Hinnant 52c52f43e72dfcea03037729649da84c23b3beb04aHoward Hinnantint main() 53c52f43e72dfcea03037729649da84c23b3beb04aHoward Hinnant{ 54c52f43e72dfcea03037729649da84c23b3beb04aHoward Hinnant#ifndef _LIBCPP_HAS_NO_ADVANCED_SFINAE 55c52f43e72dfcea03037729649da84c23b3beb04aHoward Hinnant A<int> a; 56c52f43e72dfcea03037729649da84c23b3beb04aHoward Hinnant assert(std::allocator_traits<A<int> >::allocate(a, 10, nullptr) == (int*)0xDEADBEEF); 57c52f43e72dfcea03037729649da84c23b3beb04aHoward Hinnant#endif // _LIBCPP_HAS_NO_ADVANCED_SFINAE 58c52f43e72dfcea03037729649da84c23b3beb04aHoward Hinnant B<int> b; 59c52f43e72dfcea03037729649da84c23b3beb04aHoward Hinnant assert(std::allocator_traits<B<int> >::allocate(b, 11, nullptr) == (int*)0xFEADBEEF); 60c52f43e72dfcea03037729649da84c23b3beb04aHoward Hinnant} 61