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// { 1508b4f3f99b3414503a127e34db4ab1a3abb966f3Marshall Clow// static size_type max_size(const allocator_type& a) noexcept; 16c52f43e72dfcea03037729649da84c23b3beb04aHoward Hinnant// ... 17c52f43e72dfcea03037729649da84c23b3beb04aHoward Hinnant// }; 18c52f43e72dfcea03037729649da84c23b3beb04aHoward Hinnant 19c52f43e72dfcea03037729649da84c23b3beb04aHoward Hinnant#include <memory> 20c52f43e72dfcea03037729649da84c23b3beb04aHoward Hinnant#include <new> 21c52f43e72dfcea03037729649da84c23b3beb04aHoward Hinnant#include <type_traits> 22c52f43e72dfcea03037729649da84c23b3beb04aHoward Hinnant#include <cassert> 23c52f43e72dfcea03037729649da84c23b3beb04aHoward Hinnant 24c52f43e72dfcea03037729649da84c23b3beb04aHoward Hinnanttemplate <class T> 25c52f43e72dfcea03037729649da84c23b3beb04aHoward Hinnantstruct A 26c52f43e72dfcea03037729649da84c23b3beb04aHoward Hinnant{ 27c52f43e72dfcea03037729649da84c23b3beb04aHoward Hinnant typedef T value_type; 28c52f43e72dfcea03037729649da84c23b3beb04aHoward Hinnant 29c52f43e72dfcea03037729649da84c23b3beb04aHoward Hinnant}; 30c52f43e72dfcea03037729649da84c23b3beb04aHoward Hinnant 31c52f43e72dfcea03037729649da84c23b3beb04aHoward Hinnanttemplate <class T> 32c52f43e72dfcea03037729649da84c23b3beb04aHoward Hinnantstruct B 33c52f43e72dfcea03037729649da84c23b3beb04aHoward Hinnant{ 34c52f43e72dfcea03037729649da84c23b3beb04aHoward Hinnant typedef T value_type; 35c52f43e72dfcea03037729649da84c23b3beb04aHoward Hinnant 36c52f43e72dfcea03037729649da84c23b3beb04aHoward Hinnant size_t max_size() const 37c52f43e72dfcea03037729649da84c23b3beb04aHoward Hinnant { 38c52f43e72dfcea03037729649da84c23b3beb04aHoward Hinnant return 100; 39c52f43e72dfcea03037729649da84c23b3beb04aHoward Hinnant } 40c52f43e72dfcea03037729649da84c23b3beb04aHoward Hinnant}; 41c52f43e72dfcea03037729649da84c23b3beb04aHoward Hinnant 42c52f43e72dfcea03037729649da84c23b3beb04aHoward Hinnantint main() 43c52f43e72dfcea03037729649da84c23b3beb04aHoward Hinnant{ 44c52f43e72dfcea03037729649da84c23b3beb04aHoward Hinnant#ifndef _LIBCPP_HAS_NO_ADVANCED_SFINAE 45c52f43e72dfcea03037729649da84c23b3beb04aHoward Hinnant { 46c52f43e72dfcea03037729649da84c23b3beb04aHoward Hinnant A<int> a; 47c52f43e72dfcea03037729649da84c23b3beb04aHoward Hinnant assert(std::allocator_traits<A<int> >::max_size(a) == 48c52f43e72dfcea03037729649da84c23b3beb04aHoward Hinnant std::numeric_limits<std::size_t>::max()); 49c52f43e72dfcea03037729649da84c23b3beb04aHoward Hinnant } 50c52f43e72dfcea03037729649da84c23b3beb04aHoward Hinnant { 51c52f43e72dfcea03037729649da84c23b3beb04aHoward Hinnant const A<int> a = {}; 52c52f43e72dfcea03037729649da84c23b3beb04aHoward Hinnant assert(std::allocator_traits<A<int> >::max_size(a) == 53c52f43e72dfcea03037729649da84c23b3beb04aHoward Hinnant std::numeric_limits<std::size_t>::max()); 54c52f43e72dfcea03037729649da84c23b3beb04aHoward Hinnant } 55c52f43e72dfcea03037729649da84c23b3beb04aHoward Hinnant#endif // _LIBCPP_HAS_NO_ADVANCED_SFINAE 56c52f43e72dfcea03037729649da84c23b3beb04aHoward Hinnant { 57c52f43e72dfcea03037729649da84c23b3beb04aHoward Hinnant B<int> b; 58c52f43e72dfcea03037729649da84c23b3beb04aHoward Hinnant assert(std::allocator_traits<B<int> >::max_size(b) == 100); 59c52f43e72dfcea03037729649da84c23b3beb04aHoward Hinnant } 60c52f43e72dfcea03037729649da84c23b3beb04aHoward Hinnant { 61c52f43e72dfcea03037729649da84c23b3beb04aHoward Hinnant const B<int> b = {}; 62c52f43e72dfcea03037729649da84c23b3beb04aHoward Hinnant assert(std::allocator_traits<B<int> >::max_size(b) == 100); 63c52f43e72dfcea03037729649da84c23b3beb04aHoward Hinnant } 6408b4f3f99b3414503a127e34db4ab1a3abb966f3Marshall Clow#if __cplusplus >= 201103 6508b4f3f99b3414503a127e34db4ab1a3abb966f3Marshall Clow { 6608b4f3f99b3414503a127e34db4ab1a3abb966f3Marshall Clow std::allocator<int> a; 6708b4f3f99b3414503a127e34db4ab1a3abb966f3Marshall Clow static_assert(noexcept(std::allocator_traits<std::allocator<int>>::max_size(a)) == true, ""); 6808b4f3f99b3414503a127e34db4ab1a3abb966f3Marshall Clow } 6908b4f3f99b3414503a127e34db4ab1a3abb966f3Marshall Clow#endif 70c52f43e72dfcea03037729649da84c23b3beb04aHoward Hinnant} 71