diff --git a/llvm/include/llvm/ADT/StringViewExtras.h b/llvm/include/llvm/ADT/StringViewExtras.h new file mode 100644 --- /dev/null +++ b/llvm/include/llvm/ADT/StringViewExtras.h @@ -0,0 +1,38 @@ +//===- llvm/ADT/StringViewExtras.h - Useful string_view functions 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 +// +//===----------------------------------------------------------------------===// +/// +/// \file +/// This file contains some functions that are useful when dealing with +/// string_views. +/// +//===----------------------------------------------------------------------===// + +#ifndef LLVM_ADT_STRINGVIEWEXTRAS_H +#define LLVM_ADT_STRINGVIEWEXTRAS_H + +#include + +namespace llvm { + +// FIXME: std::string_view::starts_with is not available until C++20. Once LLVM +// is upgraded to C++20, remove this header and users. +#ifdef __cpp_lib_starts_ends_with +#warning "remove llvm::starts_with" +#endif + +inline constexpr bool starts_with(std::string_view self, char C) { + return !self.empty() && self.front() == C; +} +inline constexpr bool starts_with(std::string_view haystack, + std::string_view needle) { + return haystack.substr(0, needle.size()) == needle; +} + +} // end namespace llvm + +#endif // LLVM_ADT_STRINGVIEWEXTRAS_H diff --git a/llvm/unittests/ADT/CMakeLists.txt b/llvm/unittests/ADT/CMakeLists.txt --- a/llvm/unittests/ADT/CMakeLists.txt +++ b/llvm/unittests/ADT/CMakeLists.txt @@ -79,6 +79,7 @@ StringRefTest.cpp StringSetTest.cpp StringSwitchTest.cpp + StringViewExtrasTest.cpp TinyPtrVectorTest.cpp TwineTest.cpp TypeSwitchTest.cpp diff --git a/llvm/unittests/ADT/StringViewExtrasTest.cpp b/llvm/unittests/ADT/StringViewExtrasTest.cpp new file mode 100644 --- /dev/null +++ b/llvm/unittests/ADT/StringViewExtrasTest.cpp @@ -0,0 +1,33 @@ +//===- StringExtrasTest.cpp - Unit tests for String extras ----------------===// +// +// 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 +// +//===----------------------------------------------------------------------===// + +#include "llvm/ADT/StringViewExtras.h" +#include "llvm/Support/raw_ostream.h" +#include "gmock/gmock.h" +#include "gtest/gtest.h" + +#include + +using namespace llvm; + +TEST(StringViewExtrasTest, starts_with) { + std::string haystack = "hello world"; + EXPECT_TRUE(llvm::starts_with(haystack, 'h')); + EXPECT_FALSE(llvm::starts_with(haystack, '\0')); + EXPECT_FALSE(llvm::starts_with(haystack, '\0')); + EXPECT_TRUE(llvm::starts_with(haystack, "hello")); + // TODO: should this differ from \0? + EXPECT_TRUE(llvm::starts_with(haystack, "")); + + std::string empty; + EXPECT_FALSE(llvm::starts_with(empty, 'h')); + EXPECT_FALSE(llvm::starts_with(empty, '\0')); + EXPECT_FALSE(llvm::starts_with(empty, "hello")); + // TODO: should this differ from \0? + EXPECT_TRUE(llvm::starts_with(empty, "")); +}