// -*- C++ -*-
//===----------------------------------------------------------------------===//
//
// Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.
// See https://llvm.org/LICENSE.txt for license information.
// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception
//
//===----------------------------------------------------------------------===//

// UNSUPPORTED: c++03

// <experimental/string>

// namespace std { namespace experimental { namespace pmr {
// template <class Char, class Traits = ...>
// using basic_string =
//     ::std::basic_string<Char, Traits, polymorphic_allocator<Char>>
//
// typedef ... string
// typedef ... u16string
// typedef ... u32string
// typedef ... wstring
//
// }}} // namespace std::experimental::pmr

#include <experimental/string>
#include <experimental/memory_resource>
#include <type_traits>
#include <cassert>

#include "constexpr_char_traits.h"

#include "test_macros.h"

namespace pmr = std::experimental::pmr;

template <class Char, class PmrTypedef>
void test_string_typedef() {
    using StdStr = std::basic_string<Char, std::char_traits<Char>,
                                     pmr::polymorphic_allocator<Char>>;
    using PmrStr = pmr::basic_string<Char>;
    static_assert(std::is_same<StdStr, PmrStr>::value, "");
    static_assert(std::is_same<PmrStr, PmrTypedef>::value, "");
}

template <class Char, class Traits>
void test_basic_string_alias() {
    using StdStr = std::basic_string<Char, Traits,
                                     pmr::polymorphic_allocator<Char>>;
    using PmrStr = pmr::basic_string<Char, Traits>;
    static_assert(std::is_same<StdStr, PmrStr>::value, "");
}

int main(int, char**)
{
    {
        test_string_typedef<char,     pmr::string>();
        test_string_typedef<wchar_t,  pmr::wstring>();
        test_string_typedef<char16_t, pmr::u16string>();
        test_string_typedef<char32_t, pmr::u32string>();
    }
    {
        test_basic_string_alias<char,    constexpr_char_traits<char>>();
        test_basic_string_alias<wchar_t, constexpr_char_traits<wchar_t>>();
        test_basic_string_alias<char16_t, constexpr_char_traits<char16_t>>();
        test_basic_string_alias<char32_t, constexpr_char_traits<char32_t>>();
    }
    {
        // Check that std::basic_string has been included and is complete.
        pmr::string s;
        assert(s.get_allocator().resource() == pmr::get_default_resource());
    }

  return 0;
}
