//===----------------------------------------------------------------------===//
//
//                     The LLVM Compiler Infrastructure
//
// This file is dual licensed under the MIT and the University of Illinois Open
// Source Licenses. See LICENSE.TXT for details.
//
//===----------------------------------------------------------------------===//

// UNSUPPORTED: c++98, c++03

// <experimental/memory_resource>

// template <class T> class polymorphic_allocator

// template <class U1, class U2, class ...Args1, class ...Args2>
// void polymorphic_allocator<T>::construct(pair<T1, T2>*, piecewise_construct_t
//                                          tuple<Args1...> x, tuple<Args2...>)

// The stardard specifiers a tranformation to uses-allocator construction as
// follows:
//  - If uses_allocator_v<T1,memory_resource*> is false and
//      is_constructible_v<T,Args1...> is true, then xprime is x.
//  - Otherwise, if uses_allocator_v<T1,memory_resource*> is true and
//      is_constructible_v<T1,allocator_arg_t,memory_resource*,Args1...> is true,
//      then xprime is
//      tuple_cat(make_tuple(allocator_arg, this->resource()), std::move(x)).
//  - Otherwise, if uses_allocator_v<T1,memory_resource*> is true and
//      is_constructible_v<T1,Args1...,memory_resource*> is true, then xprime is
//      tuple_cat(std::move(x), make_tuple(this->resource())).
//  - Otherwise the program is ill formed.
//
// The use of "xprime = tuple_cat(..., std::move(x), ...)" causes all of the
// objects in 'x' to be copied into 'xprime'. If 'x' contains any types which
// are stored by value this causes an unessary copy to occur. To prevent this
//  libc++ changes this call into
// "xprime = forward_as_tuple(..., std::get<Idx>(std::move(x))..., ...)".
// 'xprime' contains references to the values in 'x' instead of copying them.

// This test checks the number of copies incurred to the elements in
// 'tuple<Args1...>' and 'tuple<Args2...>'.

#include <experimental/memory_resource>
#include <type_traits>
#include <utility>
#include <tuple>
#include <cassert>
#include <cstdlib>
#include "test_memory_resource.hpp"

namespace ex = std::experimental::pmr;

template <class T>
struct TestHarness {
    TestResource R;
    ex::memory_resource * M = &R;
    ex::polymorphic_allocator<T> A = M;
    bool constructed = false;
    T * ptr;

    TestHarness() : ptr(A.allocate(1)) {}

    template <class ...Args>
    void construct(Args&&... args) {
        A.construct(ptr, std::forward<Args>(args)...);
        constructed = true;
    }

    ~TestHarness() {
        if (constructed) A.destroy(ptr);
        A.deallocate(ptr, 1);
    }
};

struct CountCopies {
  int count;
  CountCopies() : count(0) {}
  CountCopies(CountCopies const& o) : count(o.count + 1) {}
};

struct CountCopiesAllocV1 {
  typedef ex::memory_resource* allocator_type;
  allocator_type alloc;
  int count;
  CountCopiesAllocV1() : alloc(nullptr), count(0) {}
  CountCopiesAllocV1(std::allocator_arg_t, allocator_type const& a,
                     CountCopiesAllocV1 const& o) : alloc(a), count(o.count + 1)
  {}

  CountCopiesAllocV1(CountCopiesAllocV1 const& o) : count(o.count + 1) {}
};


struct CountCopiesAllocV2 {
  typedef ex::memory_resource* allocator_type;
  allocator_type alloc;
  int count;
  CountCopiesAllocV2() : alloc(nullptr), count(0) {}
  CountCopiesAllocV2(CountCopiesAllocV2 const& o, allocator_type const& a)
    : alloc(a), count(o.count + 1)
  { }

  CountCopiesAllocV2(CountCopiesAllocV2 const& o) : count(o.count + 1) {}
};


int main()
{
    using PMR = ex::memory_resource*;
    using PMA = ex::polymorphic_allocator<char>;

    {
        using T = CountCopies;
        using U = CountCopiesAllocV1;
        using P = std::pair<T, U>;
        using TH = TestHarness<P>;

        std::tuple<T> t1;
        std::tuple<U> t2;

        TestHarness<P> h;
        h.construct(std::piecewise_construct, t1, t2);
        P const& p = *h.ptr;
        assert(p.first.count == 2);
        assert(p.second.count == 2);
        assert(p.second.alloc == h.M);
    }
    {
        using T = CountCopiesAllocV1;
        using U = CountCopiesAllocV2;
        using P = std::pair<T, U>;
        using TH = TestHarness<P>;

        std::tuple<T> t1;
        std::tuple<U> t2;

        TestHarness<P> h;
        h.construct(std::piecewise_construct, std::move(t1), std::move(t2));
        P const& p = *h.ptr;
        assert(p.first.count == 2);
        assert(p.first.alloc == h.M);
        assert(p.second.count == 2);
        assert(p.second.alloc == h.M);
    }
    {
        using T = CountCopiesAllocV2;
        using U = CountCopiesAllocV1;
        using P = std::pair<T, U>;
        using TH = TestHarness<P>;

        std::tuple<T> t1;
        std::tuple<U> t2;

        TestHarness<P> h;
        h.construct(std::piecewise_construct, std::move(t1), std::move(t2));
        P const& p = *h.ptr;
        assert(p.first.count == 2);
        assert(p.first.alloc == h.M);
        assert(p.second.count == 2);
        assert(p.second.alloc == h.M);
    }
    {
        using T = CountCopiesAllocV2;
        using U = CountCopies;
        using P = std::pair<T, U>;
        using TH = TestHarness<P>;

        std::tuple<T> t1;
        std::tuple<U> t2;

        TestHarness<P> h;
        h.construct(std::piecewise_construct, t1, t2);
        P const& p = *h.ptr;
        assert(p.first.count == 2);
        assert(p.first.alloc == h.M);
        assert(p.second.count == 2);
    }
}
