Skip to content

Commit

Permalink
[ADT] add StringViewExtras llvm::starts_with for std::string_view
Browse files Browse the repository at this point in the history
std::string_view::starts_with isn't available until C++20. Create
llvm::starts_with for now; we can delete this when LLVM moves to C++20
one day.

To run the newly added unit test:
$ cd llvm/build; ninja ADTTests; cd -
$ ./llvm/build/unittests/ADT/ADTTests --gtest_filter=StringViewExtrasTest.\*

Reviewed By: MaskRay, erichkeane

Differential Revision: https://reviews.llvm.org/D148367
  • Loading branch information
nickdesaulniers committed Apr 14, 2023
1 parent 5084abb commit d6d30dd
Show file tree
Hide file tree
Showing 3 changed files with 68 additions and 0 deletions.
35 changes: 35 additions & 0 deletions llvm/include/llvm/ADT/StringViewExtras.h
Original file line number Diff line number Diff line change
@@ -0,0 +1,35 @@
//===- 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 <string_view>

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.

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
1 change: 1 addition & 0 deletions llvm/unittests/ADT/CMakeLists.txt
Original file line number Diff line number Diff line change
Expand Up @@ -79,6 +79,7 @@ add_llvm_unittest(ADTTests
StringRefTest.cpp
StringSetTest.cpp
StringSwitchTest.cpp
StringViewExtrasTest.cpp
TinyPtrVectorTest.cpp
TwineTest.cpp
TypeSwitchTest.cpp
Expand Down
32 changes: 32 additions & 0 deletions llvm/unittests/ADT/StringViewExtrasTest.cpp
Original file line number Diff line number Diff line change
@@ -0,0 +1,32 @@
//===- 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 <string_view>

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_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, ""));
}

0 comments on commit d6d30dd

Please sign in to comment.