//===----------------------------------------------------------------------===//
//
// 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, c++11, c++14, c++17

// <string>

// template <class charT, class traits, class Allocator, class U>
//   constexpr typename basic_string<charT, traits, Allocator>::size_type
//   erase(basic_string<charT, traits, Allocator>& c, const U& value);

#include <string>
#include <optional>

#include "test_macros.h"
#include "test_allocator.h"
#include "min_allocator.h"

template <class S, class U>
constexpr void test0(S s, U val, S expected, std::size_t expected_erased_count) {
  ASSERT_SAME_TYPE(typename S::size_type, decltype(std::erase(s, val)));
  assert(expected_erased_count == std::erase(s, val));
  LIBCPP_ASSERT(s.__invariants());
  assert(s == expected);
}

template <class S>
constexpr void test() {
  test0(S(""), 'a', S(""), 0);

  test0(S("a"), 'a', S(""), 1);
  test0(S("a"), 'b', S("a"), 0);

  test0(S("ab"), 'a', S("b"), 1);
  test0(S("ab"), 'b', S("a"), 1);
  test0(S("ab"), 'c', S("ab"), 0);
  test0(S("aa"), 'a', S(""), 2);
  test0(S("aa"), 'c', S("aa"), 0);

  test0(S("abc"), 'a', S("bc"), 1);
  test0(S("abc"), 'b', S("ac"), 1);
  test0(S("abc"), 'c', S("ab"), 1);
  test0(S("abc"), 'd', S("abc"), 0);

  test0(S("aab"), 'a', S("b"), 2);
  test0(S("aab"), 'b', S("aa"), 1);
  test0(S("aab"), 'c', S("aab"), 0);
  test0(S("abb"), 'a', S("bb"), 1);
  test0(S("abb"), 'b', S("a"), 2);
  test0(S("abb"), 'c', S("abb"), 0);
  test0(S("aaa"), 'a', S(""), 3);
  test0(S("aaa"), 'b', S("aaa"), 0);

  //  Test cross-type erasure
  using opt = std::optional<typename S::value_type>;
  test0(S("aba"), opt(), S("aba"), 0);
  test0(S("aba"), opt('a'), S("b"), 2);
  test0(S("aba"), opt('b'), S("aa"), 1);
  test0(S("aba"), opt('c'), S("aba"), 0);
}

constexpr bool test() {
  test<std::string>();
  test<std::basic_string<char, std::char_traits<char>, min_allocator<char>>>();
  test<std::basic_string<char, std::char_traits<char>, test_allocator<char>>>();

  return true;
}

int main(int, char**) {
  test();
  static_assert(test());

  return 0;
}
