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