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// template <class Ptr> 16c52f43e72dfcea03037729649da84c23b3beb04aHoward Hinnant// static void destroy(allocator_type& a, Ptr p); 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 30c52f43e72dfcea03037729649da84c23b3beb04aHoward Hinnant}; 31c52f43e72dfcea03037729649da84c23b3beb04aHoward Hinnant 32c52f43e72dfcea03037729649da84c23b3beb04aHoward Hinnantint b_destroy = 0; 33c52f43e72dfcea03037729649da84c23b3beb04aHoward Hinnant 34c52f43e72dfcea03037729649da84c23b3beb04aHoward Hinnanttemplate <class T> 35c52f43e72dfcea03037729649da84c23b3beb04aHoward Hinnantstruct B 36c52f43e72dfcea03037729649da84c23b3beb04aHoward Hinnant{ 37c52f43e72dfcea03037729649da84c23b3beb04aHoward Hinnant typedef T value_type; 38c52f43e72dfcea03037729649da84c23b3beb04aHoward Hinnant 39c52f43e72dfcea03037729649da84c23b3beb04aHoward Hinnant template <class U> 40c52f43e72dfcea03037729649da84c23b3beb04aHoward Hinnant void destroy(U* p) 41c52f43e72dfcea03037729649da84c23b3beb04aHoward Hinnant { 42c52f43e72dfcea03037729649da84c23b3beb04aHoward Hinnant ++b_destroy; 43c52f43e72dfcea03037729649da84c23b3beb04aHoward Hinnant p->~U(); 44c52f43e72dfcea03037729649da84c23b3beb04aHoward Hinnant } 45c52f43e72dfcea03037729649da84c23b3beb04aHoward Hinnant}; 46c52f43e72dfcea03037729649da84c23b3beb04aHoward Hinnant 47c52f43e72dfcea03037729649da84c23b3beb04aHoward Hinnantstruct A0 48c52f43e72dfcea03037729649da84c23b3beb04aHoward Hinnant{ 49c52f43e72dfcea03037729649da84c23b3beb04aHoward Hinnant static int count; 50c52f43e72dfcea03037729649da84c23b3beb04aHoward Hinnant ~A0() {++count;} 51c52f43e72dfcea03037729649da84c23b3beb04aHoward Hinnant}; 52c52f43e72dfcea03037729649da84c23b3beb04aHoward Hinnant 53c52f43e72dfcea03037729649da84c23b3beb04aHoward Hinnantint A0::count = 0; 54c52f43e72dfcea03037729649da84c23b3beb04aHoward Hinnant 55c52f43e72dfcea03037729649da84c23b3beb04aHoward Hinnantint main() 56c52f43e72dfcea03037729649da84c23b3beb04aHoward Hinnant{ 57c52f43e72dfcea03037729649da84c23b3beb04aHoward Hinnant { 58c52f43e72dfcea03037729649da84c23b3beb04aHoward Hinnant A0::count = 0; 59c52f43e72dfcea03037729649da84c23b3beb04aHoward Hinnant A<int> a; 60c52f43e72dfcea03037729649da84c23b3beb04aHoward Hinnant std::aligned_storage<sizeof(A0)>::type a0; 61c52f43e72dfcea03037729649da84c23b3beb04aHoward Hinnant std::allocator_traits<A<int> >::construct(a, (A0*)&a0); 62c52f43e72dfcea03037729649da84c23b3beb04aHoward Hinnant assert(A0::count == 0); 63c52f43e72dfcea03037729649da84c23b3beb04aHoward Hinnant std::allocator_traits<A<int> >::destroy(a, (A0*)&a0); 64c52f43e72dfcea03037729649da84c23b3beb04aHoward Hinnant assert(A0::count == 1); 65c52f43e72dfcea03037729649da84c23b3beb04aHoward Hinnant } 66c52f43e72dfcea03037729649da84c23b3beb04aHoward Hinnant#ifndef _LIBCPP_HAS_NO_ADVANCED_SFINAE 67c52f43e72dfcea03037729649da84c23b3beb04aHoward Hinnant { 68c52f43e72dfcea03037729649da84c23b3beb04aHoward Hinnant A0::count = 0; 69c52f43e72dfcea03037729649da84c23b3beb04aHoward Hinnant b_destroy = 0; 70c52f43e72dfcea03037729649da84c23b3beb04aHoward Hinnant B<int> b; 71c52f43e72dfcea03037729649da84c23b3beb04aHoward Hinnant std::aligned_storage<sizeof(A0)>::type a0; 72c52f43e72dfcea03037729649da84c23b3beb04aHoward Hinnant std::allocator_traits<B<int> >::construct(b, (A0*)&a0); 73c52f43e72dfcea03037729649da84c23b3beb04aHoward Hinnant assert(A0::count == 0); 74c52f43e72dfcea03037729649da84c23b3beb04aHoward Hinnant assert(b_destroy == 0); 75c52f43e72dfcea03037729649da84c23b3beb04aHoward Hinnant std::allocator_traits<B<int> >::destroy(b, (A0*)&a0); 76c52f43e72dfcea03037729649da84c23b3beb04aHoward Hinnant assert(A0::count == 1); 77c52f43e72dfcea03037729649da84c23b3beb04aHoward Hinnant assert(b_destroy == 1); 78c52f43e72dfcea03037729649da84c23b3beb04aHoward Hinnant } 79c52f43e72dfcea03037729649da84c23b3beb04aHoward Hinnant#endif // _LIBCPP_HAS_NO_ADVANCED_SFINAE 80c52f43e72dfcea03037729649da84c23b3beb04aHoward Hinnant} 81