1*58b9f456SAndroid Build Coastguard Worker //===----------------------------------------------------------------------===//
2*58b9f456SAndroid Build Coastguard Worker //
3*58b9f456SAndroid Build Coastguard Worker // The LLVM Compiler Infrastructure
4*58b9f456SAndroid Build Coastguard Worker //
5*58b9f456SAndroid Build Coastguard Worker // This file is dual licensed under the MIT and the University of Illinois Open
6*58b9f456SAndroid Build Coastguard Worker // Source Licenses. See LICENSE.TXT for details.
7*58b9f456SAndroid Build Coastguard Worker //
8*58b9f456SAndroid Build Coastguard Worker //===----------------------------------------------------------------------===//
9*58b9f456SAndroid Build Coastguard Worker // UNSUPPORTED: c++98, c++03, c++11, c++14, c++17
10*58b9f456SAndroid Build Coastguard Worker
11*58b9f456SAndroid Build Coastguard Worker // <string>
12*58b9f456SAndroid Build Coastguard Worker
13*58b9f456SAndroid Build Coastguard Worker // template <class charT, class traits, class Allocator, class U>
14*58b9f456SAndroid Build Coastguard Worker // void erase(basic_string<charT, traits, Allocator>& c, const U& value);
15*58b9f456SAndroid Build Coastguard Worker
16*58b9f456SAndroid Build Coastguard Worker
17*58b9f456SAndroid Build Coastguard Worker #include <string>
18*58b9f456SAndroid Build Coastguard Worker #include <optional>
19*58b9f456SAndroid Build Coastguard Worker
20*58b9f456SAndroid Build Coastguard Worker #include "test_macros.h"
21*58b9f456SAndroid Build Coastguard Worker #include "test_allocator.h"
22*58b9f456SAndroid Build Coastguard Worker #include "min_allocator.h"
23*58b9f456SAndroid Build Coastguard Worker
24*58b9f456SAndroid Build Coastguard Worker template <class S, class U>
25*58b9f456SAndroid Build Coastguard Worker void
test0(S s,U val,S expected)26*58b9f456SAndroid Build Coastguard Worker test0(S s, U val, S expected)
27*58b9f456SAndroid Build Coastguard Worker {
28*58b9f456SAndroid Build Coastguard Worker ASSERT_SAME_TYPE(void, decltype(std::erase(s, val)));
29*58b9f456SAndroid Build Coastguard Worker std::erase(s, val);
30*58b9f456SAndroid Build Coastguard Worker LIBCPP_ASSERT(s.__invariants());
31*58b9f456SAndroid Build Coastguard Worker assert(s == expected);
32*58b9f456SAndroid Build Coastguard Worker }
33*58b9f456SAndroid Build Coastguard Worker
34*58b9f456SAndroid Build Coastguard Worker template <class S>
test()35*58b9f456SAndroid Build Coastguard Worker void test()
36*58b9f456SAndroid Build Coastguard Worker {
37*58b9f456SAndroid Build Coastguard Worker
38*58b9f456SAndroid Build Coastguard Worker test0(S(""), 'a', S(""));
39*58b9f456SAndroid Build Coastguard Worker
40*58b9f456SAndroid Build Coastguard Worker test0(S("a"), 'a', S(""));
41*58b9f456SAndroid Build Coastguard Worker test0(S("a"), 'b', S("a"));
42*58b9f456SAndroid Build Coastguard Worker
43*58b9f456SAndroid Build Coastguard Worker test0(S("ab"), 'a', S("b"));
44*58b9f456SAndroid Build Coastguard Worker test0(S("ab"), 'b', S("a"));
45*58b9f456SAndroid Build Coastguard Worker test0(S("ab"), 'c', S("ab"));
46*58b9f456SAndroid Build Coastguard Worker test0(S("aa"), 'a', S(""));
47*58b9f456SAndroid Build Coastguard Worker test0(S("aa"), 'c', S("aa"));
48*58b9f456SAndroid Build Coastguard Worker
49*58b9f456SAndroid Build Coastguard Worker test0(S("abc"), 'a', S("bc"));
50*58b9f456SAndroid Build Coastguard Worker test0(S("abc"), 'b', S("ac"));
51*58b9f456SAndroid Build Coastguard Worker test0(S("abc"), 'c', S("ab"));
52*58b9f456SAndroid Build Coastguard Worker test0(S("abc"), 'd', S("abc"));
53*58b9f456SAndroid Build Coastguard Worker
54*58b9f456SAndroid Build Coastguard Worker test0(S("aab"), 'a', S("b"));
55*58b9f456SAndroid Build Coastguard Worker test0(S("aab"), 'b', S("aa"));
56*58b9f456SAndroid Build Coastguard Worker test0(S("aab"), 'c', S("aab"));
57*58b9f456SAndroid Build Coastguard Worker test0(S("abb"), 'a', S("bb"));
58*58b9f456SAndroid Build Coastguard Worker test0(S("abb"), 'b', S("a"));
59*58b9f456SAndroid Build Coastguard Worker test0(S("abb"), 'c', S("abb"));
60*58b9f456SAndroid Build Coastguard Worker test0(S("aaa"), 'a', S(""));
61*58b9f456SAndroid Build Coastguard Worker test0(S("aaa"), 'b', S("aaa"));
62*58b9f456SAndroid Build Coastguard Worker
63*58b9f456SAndroid Build Coastguard Worker // Test cross-type erasure
64*58b9f456SAndroid Build Coastguard Worker using opt = std::optional<typename S::value_type>;
65*58b9f456SAndroid Build Coastguard Worker test0(S("aba"), opt(), S("aba"));
66*58b9f456SAndroid Build Coastguard Worker test0(S("aba"), opt('a'), S("b"));
67*58b9f456SAndroid Build Coastguard Worker test0(S("aba"), opt('b'), S("aa"));
68*58b9f456SAndroid Build Coastguard Worker test0(S("aba"), opt('c'), S("aba"));
69*58b9f456SAndroid Build Coastguard Worker }
70*58b9f456SAndroid Build Coastguard Worker
main()71*58b9f456SAndroid Build Coastguard Worker int main()
72*58b9f456SAndroid Build Coastguard Worker {
73*58b9f456SAndroid Build Coastguard Worker test<std::string>();
74*58b9f456SAndroid Build Coastguard Worker test<std::basic_string<char, std::char_traits<char>, min_allocator<char>>> ();
75*58b9f456SAndroid Build Coastguard Worker test<std::basic_string<char, std::char_traits<char>, test_allocator<char>>> ();
76*58b9f456SAndroid Build Coastguard Worker }
77