From 31e1b08e1587fad0fdc176a6a5d8231d1386a21e Mon Sep 17 00:00:00 2001 From: Brian Gianforcaro Date: Wed, 24 Feb 2021 04:50:00 -0800 Subject: [PATCH] AK: Add support for AK::StringView literals with operator""sv A new operator, operator""sv was added as of C++17 to support string_view literals. This allows string_views to be constructed from string literals and with no runtime cost to find the string length. See: https://en.cppreference.com/w/cpp/string/basic_string_view/operator%22%22sv This change implements that functionality in AK::StringView. We do have to suppress some warnings about implementing reserved operators as we are essentially implementing STL functions in AK as we have no STL :). --- AK/StringView.h | 5 +++++ AK/Tests/TestStringView.cpp | 9 +++++++++ CMakeLists.txt | 4 ++-- Meta/Lagom/CMakeLists.txt | 2 +- 4 files changed, 17 insertions(+), 3 deletions(-) diff --git a/AK/StringView.h b/AK/StringView.h index 8d6192a795b..1237e147b69 100644 --- a/AK/StringView.h +++ b/AK/StringView.h @@ -213,4 +213,9 @@ struct Traits : public GenericTraits { } +[[nodiscard]] ALWAYS_INLINE constexpr AK::StringView operator"" sv(const char* cstring, size_t length) +{ + return AK::StringView(cstring, length); +} + using AK::StringView; diff --git a/AK/Tests/TestStringView.cpp b/AK/Tests/TestStringView.cpp index 56cf440720e..a95be835bde 100644 --- a/AK/Tests/TestStringView.cpp +++ b/AK/Tests/TestStringView.cpp @@ -59,6 +59,15 @@ TEST_CASE(compare_views) EXPECT_EQ(view1, "foo"); } +TEST_CASE(string_view_literal_operator) +{ + StringView literal_view = "foo"sv; + String test_string = "foo"; + + EXPECT_EQ(literal_view.length(), test_string.length()); + EXPECT_EQ(literal_view, test_string); +} + TEST_CASE(starts_with) { String test_string = "ABCDEF"; diff --git a/CMakeLists.txt b/CMakeLists.txt index 30edc118cc2..3d53990a129 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -80,9 +80,9 @@ else() endif() if ("${CMAKE_CXX_COMPILER_ID}" STREQUAL "GNU") - add_compile_options(-fconcepts) + add_compile_options(-fconcepts -Wno-literal-suffix) elseif ("${CMAKE_CXX_COMPILER_ID}" STREQUAL "Clang") - add_compile_options(-Wno-overloaded-virtual) + add_compile_options(-Wno-overloaded-virtual -Wno-user-defined-literals) endif() if (ENABLE_ALL_THE_DEBUG_MACROS) diff --git a/Meta/Lagom/CMakeLists.txt b/Meta/Lagom/CMakeLists.txt index 51739f72cdb..44aa1ce8c88 100644 --- a/Meta/Lagom/CMakeLists.txt +++ b/Meta/Lagom/CMakeLists.txt @@ -9,7 +9,7 @@ endif() if ("${CMAKE_CXX_COMPILER_ID}" STREQUAL "Clang") - set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -Wno-overloaded-virtual") + set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -Wno-overloaded-virtual -Wno-user-defined-literals") if (ENABLE_ADDRESS_SANITIZER) add_definitions(-fsanitize=address -fno-omit-frame-pointer)