// -*- 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++98, 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;
}
