select_on_container_copy_construction.pass.cpp revision ebedffde9adff4b56d3ccf6adcee8dc092404f0e
1//===----------------------------------------------------------------------===//
2//
3//                     The LLVM Compiler Infrastructure
4//
5// This file is dual licensed under the MIT and the University of Illinois Open
6// Source Licenses. See LICENSE.TXT for details.
7//
8//===----------------------------------------------------------------------===//
9
10// <memory>
11
12// template <class OuterAlloc, class... InnerAllocs>
13//   class scoped_allocator_adaptor
14
15// scoped_allocator_adaptor select_on_container_copy_construction() const;
16
17#include <scoped_allocator>
18#include <cassert>
19
20#include "allocators.h"
21
22int main()
23{
24#ifndef _LIBCPP_HAS_NO_RVALUE_REFERENCES
25
26    {
27        typedef std::scoped_allocator_adaptor<A1<int>> A;
28        A a1(A1<int>(3));
29        assert(a1.outer_allocator().id() == 3);
30        A a2 = std::allocator_traits<A>::select_on_container_copy_construction(a1);
31        assert(a2.outer_allocator().id() == 3);
32    }
33
34    {
35        typedef std::scoped_allocator_adaptor<A3<int>> A;
36        A a1(A3<int>(3));
37        assert(a1.outer_allocator().id() == 3);
38        A a2 = std::allocator_traits<A>::select_on_container_copy_construction(a1);
39        assert(a2.outer_allocator().id() == -1);
40    }
41
42    {
43        typedef std::scoped_allocator_adaptor<A1<int>, A2<int>, A3<int>> A;
44        A a1(A1<int>(1), A2<int>(2), A3<int>(3));
45        assert(a1.outer_allocator().id() == 1);
46        assert(a1.inner_allocator().outer_allocator().id() == 2);
47        assert(a1.inner_allocator().inner_allocator().outer_allocator().id() == 3);
48        A a2 = std::allocator_traits<A>::select_on_container_copy_construction(a1);
49        assert(a2.outer_allocator().id() == 1);
50        assert(a2.inner_allocator().outer_allocator().id() == 2);
51        assert(a2.inner_allocator().inner_allocator().outer_allocator().id() == -1);
52    }
53
54#endif  // _LIBCPP_HAS_NO_RVALUE_REFERENCES
55}
56