diff options
| author | Wim Leflere <wim.leflere@gmail.com> | 2021-01-19 14:33:30 -0500 |
|---|---|---|
| committer | Louis Dionne <ldionne.2@gmail.com> | 2021-01-19 14:35:07 -0500 |
| commit | 6ac9cb2a7c6c19797fc778f3d441a6fb7b69793c (patch) | |
| tree | 9f9dead4611ca9e64b9cf36c4a942063b0c297c9 /libcxx/test/std/strings/string.view | |
| parent | 7113de301a846521a2bdd73d44ac9cf5827b37a6 (diff) | |
[libc++][P1679] add string contains
C++23 string contains implementation and tests
Paper: https://wg21.link/P1679R3
Standard (string): https://eel.is/c++draft/string.contains
Standard (string_view): https://eel.is/c++draft/string.view.ops#lib:contains,basic_string_view
Differential Revision: https://reviews.llvm.org/D93912
Diffstat (limited to 'libcxx/test/std/strings/string.view')
3 files changed, 206 insertions, 0 deletions
diff --git a/libcxx/test/std/strings/string.view/string.view.template/contains.char.pass.cpp b/libcxx/test/std/strings/string.view/string.view.template/contains.char.pass.cpp new file mode 100644 index 000000000000..658e10d21182 --- /dev/null +++ b/libcxx/test/std/strings/string.view/string.view.template/contains.char.pass.cpp @@ -0,0 +1,44 @@ +//===----------------------------------------------------------------------===// +// +// 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, c++2a + +// <string_view> + +// constexpr bool contains(charT x) const noexcept; + +#include <string_view> +#include <cassert> + +#include "test_macros.h" + +constexpr bool test() +{ + using SV = std::string_view; + + SV sv1 {}; + SV sv2 {"abcde", 5}; + + ASSERT_NOEXCEPT(sv1.contains('e')); + + assert(!sv1.contains('c')); + assert(!sv1.contains('e')); + assert(!sv1.contains('x')); + assert( sv2.contains('c')); + assert( sv2.contains('e')); + assert(!sv2.contains('x')); + + return true; +} + +int main(int, char**) +{ + test(); + static_assert(test()); + + return 0; +} diff --git a/libcxx/test/std/strings/string.view/string.view.template/contains.ptr.pass.cpp b/libcxx/test/std/strings/string.view/string.view.template/contains.ptr.pass.cpp new file mode 100644 index 000000000000..f22e77d38d06 --- /dev/null +++ b/libcxx/test/std/strings/string.view/string.view.template/contains.ptr.pass.cpp @@ -0,0 +1,74 @@ +//===----------------------------------------------------------------------===// +// +// 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, c++2a + +// <string_view> + +// constexpr bool contains(const CharT *x) const; + +#include <string_view> +#include <cassert> + +#include "test_macros.h" + +constexpr bool test() +{ + using SV = std::string_view; + + const char* s = "abcde"; + SV sv0; + SV sv1 {s + 4, 1}; + SV sv3 {s + 2, 3}; + SV svNot {"xyz", 3}; + + assert( sv0.contains("")); + assert(!sv0.contains("e")); + + assert( sv1.contains("")); + assert(!sv1.contains("d")); + assert( sv1.contains("e")); + assert(!sv1.contains("de")); + assert(!sv1.contains("cd")); + assert(!sv1.contains("cde")); + assert(!sv1.contains("bcde")); + assert(!sv1.contains("abcde")); + assert(!sv1.contains("xyz")); + + assert( sv3.contains("")); + assert( sv3.contains("d")); + assert( sv3.contains("e")); + assert( sv3.contains("de")); + assert( sv3.contains("cd")); + assert(!sv3.contains("ce")); + assert( sv3.contains("cde")); + assert(!sv3.contains("edc")); + assert(!sv3.contains("bcde")); + assert(!sv3.contains("abcde")); + assert(!sv3.contains("xyz")); + + assert( svNot.contains("")); + assert(!svNot.contains("d")); + assert(!svNot.contains("e")); + assert(!svNot.contains("de")); + assert(!svNot.contains("cd")); + assert(!svNot.contains("cde")); + assert(!svNot.contains("bcde")); + assert(!svNot.contains("abcde")); + assert( svNot.contains("xyz")); + assert(!svNot.contains("zyx")); + + return true; +} + +int main(int, char**) +{ + test(); + static_assert(test()); + + return 0; +} diff --git a/libcxx/test/std/strings/string.view/string.view.template/contains.string_view.pass.cpp b/libcxx/test/std/strings/string.view/string.view.template/contains.string_view.pass.cpp new file mode 100644 index 000000000000..0b7976846173 --- /dev/null +++ b/libcxx/test/std/strings/string.view/string.view.template/contains.string_view.pass.cpp @@ -0,0 +1,88 @@ +//===----------------------------------------------------------------------===// +// +// 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, c++2a + +// <string_view> + +// constexpr bool contains(string_view x) const noexcept; + +#include <string_view> +#include <cassert> + +#include "test_macros.h" + +constexpr bool test() +{ + using SV = std::string_view; + + const char* s = "abcde"; + SV sv0; + SV sv1 {s + 1, 1}; + SV sv2 {s + 1, 2}; + SV sv3 {s + 1, 3}; + SV sv4 {s + 1, 4}; + SV sv5 {s , 5}; + SV svNot {"xyz", 3}; + SV svNot2 {"bd" , 2}; + SV svNot3 {"dcb", 3}; + + ASSERT_NOEXCEPT(sv0.contains(sv0)); + + assert( sv0.contains(sv0)); + assert(!sv0.contains(sv1)); + + assert( sv1.contains(sv0)); + assert( sv1.contains(sv1)); + assert(!sv1.contains(sv2)); + assert(!sv1.contains(sv3)); + assert(!sv1.contains(sv4)); + assert(!sv1.contains(sv5)); + assert(!sv1.contains(svNot)); + assert(!sv1.contains(svNot2)); + assert(!sv1.contains(svNot3)); + + assert( sv3.contains(sv0)); + assert( sv3.contains(sv1)); + assert( sv3.contains(sv2)); + assert( sv3.contains(sv3)); + assert(!sv3.contains(sv4)); + assert(!sv3.contains(sv5)); + assert(!sv3.contains(svNot)); + assert(!sv3.contains(svNot2)); + assert(!sv3.contains(svNot3)); + + assert( sv5.contains(sv0)); + assert( sv5.contains(sv1)); + assert( sv5.contains(sv2)); + assert( sv5.contains(sv3)); + assert( sv5.contains(sv4)); + assert( sv5.contains(sv5)); + assert(!sv5.contains(svNot)); + assert(!sv5.contains(svNot2)); + assert(!sv5.contains(svNot3)); + + assert( svNot.contains(sv0)); + assert(!svNot.contains(sv1)); + assert(!svNot.contains(sv2)); + assert(!svNot.contains(sv3)); + assert(!svNot.contains(sv4)); + assert(!svNot.contains(sv5)); + assert( svNot.contains(svNot)); + assert(!svNot.contains(svNot2)); + assert(!svNot.contains(svNot3)); + + return true; +} + +int main(int, char**) +{ + test(); + static_assert(test()); + + return 0; +} |
