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 allocator_type 16c52f43e72dfcea03037729649da84c23b3beb04aHoward Hinnant// select_on_container_copy_construction(const allocator_type& a); 17c52f43e72dfcea03037729649da84c23b3beb04aHoward Hinnant// ... 18c52f43e72dfcea03037729649da84c23b3beb04aHoward Hinnant// }; 19c52f43e72dfcea03037729649da84c23b3beb04aHoward Hinnant 20c52f43e72dfcea03037729649da84c23b3beb04aHoward Hinnant#include <memory> 21c52f43e72dfcea03037729649da84c23b3beb04aHoward Hinnant#include <new> 22c52f43e72dfcea03037729649da84c23b3beb04aHoward Hinnant#include <type_traits> 23c52f43e72dfcea03037729649da84c23b3beb04aHoward Hinnant#include <cassert> 24c52f43e72dfcea03037729649da84c23b3beb04aHoward Hinnant 25c52f43e72dfcea03037729649da84c23b3beb04aHoward Hinnanttemplate <class T> 26c52f43e72dfcea03037729649da84c23b3beb04aHoward Hinnantstruct A 27c52f43e72dfcea03037729649da84c23b3beb04aHoward Hinnant{ 28c52f43e72dfcea03037729649da84c23b3beb04aHoward Hinnant typedef T value_type; 29c52f43e72dfcea03037729649da84c23b3beb04aHoward Hinnant int id; 30c52f43e72dfcea03037729649da84c23b3beb04aHoward Hinnant explicit A(int i = 0) : id(i) {} 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 int id; 40c52f43e72dfcea03037729649da84c23b3beb04aHoward Hinnant explicit B(int i = 0) : id(i) {} 41c52f43e72dfcea03037729649da84c23b3beb04aHoward Hinnant 42c52f43e72dfcea03037729649da84c23b3beb04aHoward Hinnant B select_on_container_copy_construction() const 43c52f43e72dfcea03037729649da84c23b3beb04aHoward Hinnant { 44c52f43e72dfcea03037729649da84c23b3beb04aHoward Hinnant return B(100); 45c52f43e72dfcea03037729649da84c23b3beb04aHoward Hinnant } 46c52f43e72dfcea03037729649da84c23b3beb04aHoward Hinnant}; 47c52f43e72dfcea03037729649da84c23b3beb04aHoward Hinnant 48c52f43e72dfcea03037729649da84c23b3beb04aHoward Hinnantint main() 49c52f43e72dfcea03037729649da84c23b3beb04aHoward Hinnant{ 50c52f43e72dfcea03037729649da84c23b3beb04aHoward Hinnant { 51c52f43e72dfcea03037729649da84c23b3beb04aHoward Hinnant A<int> a; 52c52f43e72dfcea03037729649da84c23b3beb04aHoward Hinnant assert(std::allocator_traits<A<int> >::select_on_container_copy_construction(a).id == 0); 53c52f43e72dfcea03037729649da84c23b3beb04aHoward Hinnant } 54c52f43e72dfcea03037729649da84c23b3beb04aHoward Hinnant { 55c52f43e72dfcea03037729649da84c23b3beb04aHoward Hinnant const A<int> a(0); 56c52f43e72dfcea03037729649da84c23b3beb04aHoward Hinnant assert(std::allocator_traits<A<int> >::select_on_container_copy_construction(a).id == 0); 57c52f43e72dfcea03037729649da84c23b3beb04aHoward Hinnant } 58c52f43e72dfcea03037729649da84c23b3beb04aHoward Hinnant#ifndef _LIBCPP_HAS_NO_ADVANCED_SFINAE 59c52f43e72dfcea03037729649da84c23b3beb04aHoward Hinnant { 60c52f43e72dfcea03037729649da84c23b3beb04aHoward Hinnant B<int> b; 61c52f43e72dfcea03037729649da84c23b3beb04aHoward Hinnant assert(std::allocator_traits<B<int> >::select_on_container_copy_construction(b).id == 100); 62c52f43e72dfcea03037729649da84c23b3beb04aHoward Hinnant } 63c52f43e72dfcea03037729649da84c23b3beb04aHoward Hinnant { 64c52f43e72dfcea03037729649da84c23b3beb04aHoward Hinnant const B<int> b(0); 65c52f43e72dfcea03037729649da84c23b3beb04aHoward Hinnant assert(std::allocator_traits<B<int> >::select_on_container_copy_construction(b).id == 100); 66c52f43e72dfcea03037729649da84c23b3beb04aHoward Hinnant } 67c52f43e72dfcea03037729649da84c23b3beb04aHoward Hinnant#endif // _LIBCPP_HAS_NO_ADVANCED_SFINAE 68c52f43e72dfcea03037729649da84c23b3beb04aHoward Hinnant} 69