From 79fc1bfcae1847743a6dee722a6da8476c418b68 Mon Sep 17 00:00:00 2001 From: Philipp Date: Mon, 25 Mar 2024 22:22:16 +0100 Subject: [PATCH 1/9] add API for trimming fcts --- kratos/utilities/string_utilities.h | 32 +++++++++++++++++++++++++++++ 1 file changed, 32 insertions(+) diff --git a/kratos/utilities/string_utilities.h b/kratos/utilities/string_utilities.h index b4ac15688737..2172bdd67309 100644 --- a/kratos/utilities/string_utilities.h +++ b/kratos/utilities/string_utilities.h @@ -8,6 +8,7 @@ // Kratos default license: kratos/license.txt // // Main authors: Vicente Mataix Ferrandiz +// Philipp Bucher (https://github.com/philbucher) // #pragma once @@ -119,6 +120,37 @@ namespace StringUtilities const std::string& rStringToReplace ); + /** + * @brief This function trims a string by removing whitespaces, tabs etc from left and right. Same as "strip" in Python + * @param rInputString The input string to trim + * @param RemoveNullChar Whether or not null-characters ('\0') should be removed + * @return The trimmed string + */ + std::string KRATOS_API(KRATOS_CORE) Trim( + const std::string& rInputString, + const bool RemoveNullChar = false); + + /** + * @brief This function trims a string by removing whitespaces, tabs etc from left. Same as "lstrip" in Python + * @param rInputString The input string to trim + * @param RemoveNullChar Whether or not null-characters ('\0') should be removed + * @return The trimmed string + */ + std::string KRATOS_API(KRATOS_CORE) TrimLeft( + const std::string& rInputString, + const bool RemoveNullChar = false); + + /** + * @brief This function trims a string by removing whitespaces, tabs etc and right. Same as "rstrip" in Python + * @param rInputString The input string to trim + * @param RemoveNullChar Whether or not null-characters ('\0') should be removed + * @return The trimmed string + */ + std::string KRATOS_API(KRATOS_CORE) TrimRight( + const std::string& rInputString, + const bool RemoveNullChar = false); + + /** * @brief Prints the data of an object of type TClass to the given output stream with indentation. * @param rOStream The output stream where the data will be printed. From 29a0f19fbce404b0b61ca26aa4ee147cd524a7b5 Mon Sep 17 00:00:00 2001 From: Philipp Date: Mon, 25 Mar 2024 22:22:27 +0100 Subject: [PATCH 2/9] add impl for trimming fcts --- kratos/utilities/string_utilities.cpp | 48 +++++++++++++++++++++++++++ 1 file changed, 48 insertions(+) diff --git a/kratos/utilities/string_utilities.cpp b/kratos/utilities/string_utilities.cpp index bbbb4757b55d..a6d08f000091 100644 --- a/kratos/utilities/string_utilities.cpp +++ b/kratos/utilities/string_utilities.cpp @@ -175,4 +175,52 @@ std::string ReplaceAllSubstrings( return output_string; } +std::string Trim( + const std::string& rInputString, + const bool RemoveNullChar) +{ + return TrimLeft(TrimRight(rInputString), RemoveNullChar); +} + +std::function TrimChar(const bool RemoveNullChar) +{ + if (RemoveNullChar) { + return [](auto character) { + return std::isspace(character) || character == '\0'; + }; + } + + return [](auto character) { + return std::isspace(character); + }; +} + +std::string TrimLeft( + const std::string& rInputString, + const bool RemoveNullChar) +{ + std::string output_string(rInputString); + + output_string.erase(output_string.begin(), std::find_if(output_string.begin(), output_string.end(), + [](std::string::value_type ch) {return !TrimChar(ch);} + ) + ); + + return output_string; +} + +std::string TrimRight( + const std::string& rInputString, + const bool RemoveNullChar) +{ + std::string output_string(rInputString); + + output_string.erase(std::find_if(output_string.rbegin(), output_string.rend(), + [](std::string::value_type ch) {return !TrimChar(ch);} + ).base(), output_string.end() + ); + + return output_string; +} + } // namespace Kratos::StringUtilities From 6f1fd6f9d0ead813137baae573146dfa731f902e Mon Sep 17 00:00:00 2001 From: Philipp Date: Mon, 25 Mar 2024 22:22:31 +0100 Subject: [PATCH 3/9] add tests --- .../utilities/test_string_utilities.cpp | 81 +++++++++++++++++-- 1 file changed, 76 insertions(+), 5 deletions(-) diff --git a/kratos/tests/cpp_tests/utilities/test_string_utilities.cpp b/kratos/tests/cpp_tests/utilities/test_string_utilities.cpp index 000bcb58aa75..e07168faf969 100644 --- a/kratos/tests/cpp_tests/utilities/test_string_utilities.cpp +++ b/kratos/tests/cpp_tests/utilities/test_string_utilities.cpp @@ -8,7 +8,7 @@ // Kratos default license: kratos/license.txt // // Main authors: Vicente Mataix Ferrandiz -// +// Philipp Bucher (https://github.com/philbucher) // // System includes @@ -19,8 +19,7 @@ #include "testing/testing.h" #include "utilities/string_utilities.h" -namespace Kratos { -namespace Testing { +namespace Kratos::Testing { KRATOS_TEST_CASE_IN_SUITE(ConvertCamelCaseToSnakeCase, KratosCoreFastSuite) { @@ -129,5 +128,77 @@ KRATOS_TEST_CASE_IN_SUITE(ReplaceAllSubstrings, KratosCoreFastSuite) KRATOS_EXPECT_EQ(correct_string, "JoJo Bizarre Adventure is an awesome show. JoJo Bizarre Adventure is the best!"); } -} // namespace Testing -} // namespace Kratos. +KRATOS_TEST_CASE_IN_SUITE(Trim, KratosCoreFastSuite) +{ + KRATOS_EXPECT_EQ(StringUtilities::Trim(""), ""); + KRATOS_EXPECT_EQ(StringUtilities::Trim(" "), ""); + KRATOS_EXPECT_EQ(StringUtilities::Trim("\n"), ""); + KRATOS_EXPECT_EQ(StringUtilities::Trim("\t"), ""); + KRATOS_EXPECT_EQ(StringUtilities::Trim("\0"), "\0"); + KRATOS_EXPECT_EQ(StringUtilities::Trim("\0", true), ""); + + KRATOS_EXPECT_EQ(StringUtilities::Trim("Kratos"), "Kratos"); + KRATOS_EXPECT_EQ(StringUtilities::Trim(" Kratos "), "Kratos"); + KRATOS_EXPECT_EQ(StringUtilities::Trim(" Kra tos "), "Kra tos"); + KRATOS_EXPECT_EQ(StringUtilities::Trim(" Kra\0tos "), "Kra\0tos"); + KRATOS_EXPECT_EQ(StringUtilities::Trim(" Kra\ntos "), "Kra\ntos"); + KRATOS_EXPECT_EQ(StringUtilities::Trim(" \0 Kra\ntos \0 "), "Kra\ntos"); + + KRATOS_EXPECT_EQ(StringUtilities::Trim("Kratos MP"), "Kratos MP"); + KRATOS_EXPECT_EQ(StringUtilities::Trim(" Kratos MP "), "Kratos MP"); + KRATOS_EXPECT_EQ(StringUtilities::Trim("\tKratos MP\n"), "Kratos MP"); + KRATOS_EXPECT_EQ(StringUtilities::Trim(" Kra tos MP "), "Kra tos MP"); + KRATOS_EXPECT_EQ(StringUtilities::Trim(" Kra\0tos MP "), "Kra\0tos MP"); + KRATOS_EXPECT_EQ(StringUtilities::Trim(" Kra\ntos MP "), "Kra\ntos MP"); +} + +KRATOS_TEST_CASE_IN_SUITE(TrimLeft, KratosCoreFastSuite) +{ + KRATOS_EXPECT_EQ(StringUtilities::Trim(""), ""); + KRATOS_EXPECT_EQ(StringUtilities::Trim(" "), ""); + KRATOS_EXPECT_EQ(StringUtilities::Trim("\n"), ""); + KRATOS_EXPECT_EQ(StringUtilities::Trim("\t"), ""); + KRATOS_EXPECT_EQ(StringUtilities::Trim("\0"), "\0"); + KRATOS_EXPECT_EQ(StringUtilities::Trim("\0", true), ""); + + KRATOS_EXPECT_EQ(StringUtilities::Trim("Kratos"), "Kratos"); + KRATOS_EXPECT_EQ(StringUtilities::Trim(" Kratos "), "Kratos "); + KRATOS_EXPECT_EQ(StringUtilities::Trim(" Kra tos "), "Kra tos "); + KRATOS_EXPECT_EQ(StringUtilities::Trim(" Kra\0tos "), "Kra\0tos "); + KRATOS_EXPECT_EQ(StringUtilities::Trim(" Kra\ntos "), "Kra\ntos "); + KRATOS_EXPECT_EQ(StringUtilities::Trim(" Kra\ntos\0"), " Kra\ntos"); + KRATOS_EXPECT_EQ(StringUtilities::Trim(" \0 Kra\ntos \0 "), "Kra\ntos \0 "); + + KRATOS_EXPECT_EQ(StringUtilities::Trim("Kratos MP"), "Kratos MP "); + KRATOS_EXPECT_EQ(StringUtilities::Trim(" Kratos MP "), "Kratos MP "); + KRATOS_EXPECT_EQ(StringUtilities::Trim("\tKratos MP\n"), "Kratos MP\n"); + KRATOS_EXPECT_EQ(StringUtilities::Trim(" Kra tos MP "), "Kra tos MP "); + KRATOS_EXPECT_EQ(StringUtilities::Trim(" Kra\0tos MP "), "Kra\0tos MP "); + KRATOS_EXPECT_EQ(StringUtilities::Trim(" Kra\ntos MP "), "Kra\ntos MP "); +} + +KRATOS_TEST_CASE_IN_SUITE(TrimRight, KratosCoreFastSuite) +{ + KRATOS_EXPECT_EQ(StringUtilities::Trim(""), ""); + KRATOS_EXPECT_EQ(StringUtilities::Trim(" "), ""); + KRATOS_EXPECT_EQ(StringUtilities::Trim("\n"), ""); + KRATOS_EXPECT_EQ(StringUtilities::Trim("\t"), ""); + KRATOS_EXPECT_EQ(StringUtilities::Trim("\0"), "\0"); + KRATOS_EXPECT_EQ(StringUtilities::Trim("\0", true), ""); + + KRATOS_EXPECT_EQ(StringUtilities::Trim("Kratos"), "Kratos"); + KRATOS_EXPECT_EQ(StringUtilities::Trim(" Kratos "), " Kratos"); + KRATOS_EXPECT_EQ(StringUtilities::Trim(" Kra tos "), " Kra tos"); + KRATOS_EXPECT_EQ(StringUtilities::Trim(" Kra\0tos "), " Kra\0tos"); + KRATOS_EXPECT_EQ(StringUtilities::Trim(" Kra\ntos "), " Kra\ntos"); + KRATOS_EXPECT_EQ(StringUtilities::Trim(" \0 Kra\ntos \0 "), " \0 Kra\ntos"); + + KRATOS_EXPECT_EQ(StringUtilities::Trim("Kratos MP"), "Kratos MP"); + KRATOS_EXPECT_EQ(StringUtilities::Trim(" Kratos MP "), " Kratos MP"); + KRATOS_EXPECT_EQ(StringUtilities::Trim("\tKratos MP\n"), "\tKratos MP"); + KRATOS_EXPECT_EQ(StringUtilities::Trim(" Kra tos MP "), " Kra tos MP"); + KRATOS_EXPECT_EQ(StringUtilities::Trim(" Kra\0tos MP "), " Kra\0tos MP"); + KRATOS_EXPECT_EQ(StringUtilities::Trim(" Kra\ntos MP "), " Kra\ntos MP"); +} + +} // namespace Kratos::Testing From 7f3d6097a7cd648ec13fb4ea4861198939d24ec9 Mon Sep 17 00:00:00 2001 From: Philipp Date: Mon, 25 Mar 2024 23:15:21 +0100 Subject: [PATCH 4/9] fix impl --- kratos/utilities/string_utilities.cpp | 9 ++++++--- 1 file changed, 6 insertions(+), 3 deletions(-) diff --git a/kratos/utilities/string_utilities.cpp b/kratos/utilities/string_utilities.cpp index a6d08f000091..4b88c32b49b9 100644 --- a/kratos/utilities/string_utilities.cpp +++ b/kratos/utilities/string_utilities.cpp @@ -179,7 +179,7 @@ std::string Trim( const std::string& rInputString, const bool RemoveNullChar) { - return TrimLeft(TrimRight(rInputString), RemoveNullChar); + return TrimLeft(TrimRight(rInputString, RemoveNullChar), RemoveNullChar); } std::function TrimChar(const bool RemoveNullChar) @@ -201,8 +201,10 @@ std::string TrimLeft( { std::string output_string(rInputString); + const auto trim_char = TrimChar(RemoveNullChar); + output_string.erase(output_string.begin(), std::find_if(output_string.begin(), output_string.end(), - [](std::string::value_type ch) {return !TrimChar(ch);} + [trim_char](std::string::value_type ch) {return !trim_char(ch);} ) ); @@ -214,9 +216,10 @@ std::string TrimRight( const bool RemoveNullChar) { std::string output_string(rInputString); + const auto trim_char = TrimChar(RemoveNullChar); output_string.erase(std::find_if(output_string.rbegin(), output_string.rend(), - [](std::string::value_type ch) {return !TrimChar(ch);} + [trim_char](std::string::value_type ch) {return !trim_char(ch);} ).base(), output_string.end() ); From 99434a851217b5fd43ab4687aa40eba72d39d2a6 Mon Sep 17 00:00:00 2001 From: Philipp Date: Mon, 25 Mar 2024 23:15:40 +0100 Subject: [PATCH 5/9] finalize tests --- .../utilities/test_string_utilities.cpp | 95 +++++++++++-------- 1 file changed, 53 insertions(+), 42 deletions(-) diff --git a/kratos/tests/cpp_tests/utilities/test_string_utilities.cpp b/kratos/tests/cpp_tests/utilities/test_string_utilities.cpp index e07168faf969..ac7b0cefe66c 100644 --- a/kratos/tests/cpp_tests/utilities/test_string_utilities.cpp +++ b/kratos/tests/cpp_tests/utilities/test_string_utilities.cpp @@ -130,6 +130,8 @@ KRATOS_TEST_CASE_IN_SUITE(ReplaceAllSubstrings, KratosCoreFastSuite) KRATOS_TEST_CASE_IN_SUITE(Trim, KratosCoreFastSuite) { + using namespace std::string_literals; // required for strings with null-chars => "asdf\0"s + KRATOS_EXPECT_EQ(StringUtilities::Trim(""), ""); KRATOS_EXPECT_EQ(StringUtilities::Trim(" "), ""); KRATOS_EXPECT_EQ(StringUtilities::Trim("\n"), ""); @@ -142,7 +144,8 @@ KRATOS_TEST_CASE_IN_SUITE(Trim, KratosCoreFastSuite) KRATOS_EXPECT_EQ(StringUtilities::Trim(" Kra tos "), "Kra tos"); KRATOS_EXPECT_EQ(StringUtilities::Trim(" Kra\0tos "), "Kra\0tos"); KRATOS_EXPECT_EQ(StringUtilities::Trim(" Kra\ntos "), "Kra\ntos"); - KRATOS_EXPECT_EQ(StringUtilities::Trim(" \0 Kra\ntos \0 "), "Kra\ntos"); + KRATOS_EXPECT_EQ(StringUtilities::Trim(" \0 Kra\ntos \0 "s), "\0 Kra\ntos \0"s); + KRATOS_EXPECT_EQ(StringUtilities::Trim(" \0 Kra\ntos \0 "s, true), "Kra\ntos"); KRATOS_EXPECT_EQ(StringUtilities::Trim("Kratos MP"), "Kratos MP"); KRATOS_EXPECT_EQ(StringUtilities::Trim(" Kratos MP "), "Kratos MP"); @@ -154,51 +157,59 @@ KRATOS_TEST_CASE_IN_SUITE(Trim, KratosCoreFastSuite) KRATOS_TEST_CASE_IN_SUITE(TrimLeft, KratosCoreFastSuite) { - KRATOS_EXPECT_EQ(StringUtilities::Trim(""), ""); - KRATOS_EXPECT_EQ(StringUtilities::Trim(" "), ""); - KRATOS_EXPECT_EQ(StringUtilities::Trim("\n"), ""); - KRATOS_EXPECT_EQ(StringUtilities::Trim("\t"), ""); - KRATOS_EXPECT_EQ(StringUtilities::Trim("\0"), "\0"); - KRATOS_EXPECT_EQ(StringUtilities::Trim("\0", true), ""); - - KRATOS_EXPECT_EQ(StringUtilities::Trim("Kratos"), "Kratos"); - KRATOS_EXPECT_EQ(StringUtilities::Trim(" Kratos "), "Kratos "); - KRATOS_EXPECT_EQ(StringUtilities::Trim(" Kra tos "), "Kra tos "); - KRATOS_EXPECT_EQ(StringUtilities::Trim(" Kra\0tos "), "Kra\0tos "); - KRATOS_EXPECT_EQ(StringUtilities::Trim(" Kra\ntos "), "Kra\ntos "); - KRATOS_EXPECT_EQ(StringUtilities::Trim(" Kra\ntos\0"), " Kra\ntos"); - KRATOS_EXPECT_EQ(StringUtilities::Trim(" \0 Kra\ntos \0 "), "Kra\ntos \0 "); - - KRATOS_EXPECT_EQ(StringUtilities::Trim("Kratos MP"), "Kratos MP "); - KRATOS_EXPECT_EQ(StringUtilities::Trim(" Kratos MP "), "Kratos MP "); - KRATOS_EXPECT_EQ(StringUtilities::Trim("\tKratos MP\n"), "Kratos MP\n"); - KRATOS_EXPECT_EQ(StringUtilities::Trim(" Kra tos MP "), "Kra tos MP "); - KRATOS_EXPECT_EQ(StringUtilities::Trim(" Kra\0tos MP "), "Kra\0tos MP "); - KRATOS_EXPECT_EQ(StringUtilities::Trim(" Kra\ntos MP "), "Kra\ntos MP "); + using namespace std::string_literals; // required for strings with null-chars => "asdf\0"s + + KRATOS_EXPECT_EQ(StringUtilities::TrimLeft(""), ""); + KRATOS_EXPECT_EQ(StringUtilities::TrimLeft(" "), ""); + KRATOS_EXPECT_EQ(StringUtilities::TrimLeft("\n"), ""); + KRATOS_EXPECT_EQ(StringUtilities::TrimLeft("\t"), ""); + KRATOS_EXPECT_EQ(StringUtilities::TrimLeft("\0"), "\0"); + KRATOS_EXPECT_EQ(StringUtilities::TrimLeft("\0", true), ""); + + KRATOS_EXPECT_EQ(StringUtilities::TrimLeft("Kratos"), "Kratos"); + KRATOS_EXPECT_EQ(StringUtilities::TrimLeft(" Kratos "), "Kratos "); + KRATOS_EXPECT_EQ(StringUtilities::TrimLeft(" Kra tos "), "Kra tos "); + KRATOS_EXPECT_EQ(StringUtilities::TrimLeft(" Kra\0tos "), "Kra\0tos "); + KRATOS_EXPECT_EQ(StringUtilities::TrimLeft(" Kra\ntos "), "Kra\ntos "); + KRATOS_EXPECT_EQ(StringUtilities::TrimLeft(" Kra\ntos\0"s), "Kra\ntos\0"s); + KRATOS_EXPECT_EQ(StringUtilities::TrimLeft(" \0 Kra\ntos \0 "s), "\0 Kra\ntos \0 "s); + KRATOS_EXPECT_EQ(StringUtilities::TrimLeft(" \0 Kra\ntos \0 "s, true), "Kra\ntos \0 "s); + + KRATOS_EXPECT_EQ(StringUtilities::TrimLeft("Kratos MP"), "Kratos MP"); + KRATOS_EXPECT_EQ(StringUtilities::TrimLeft(" Kratos MP "), "Kratos MP "); + KRATOS_EXPECT_EQ(StringUtilities::TrimLeft("\tKratos MP\n"), "Kratos MP\n"); + KRATOS_EXPECT_EQ(StringUtilities::TrimLeft(" Kra tos MP "), "Kra tos MP "); + KRATOS_EXPECT_EQ(StringUtilities::TrimLeft(" Kra\0tos MP "), "Kra\0tos MP "); + KRATOS_EXPECT_EQ(StringUtilities::TrimLeft(" Kra\ntos MP "), "Kra\ntos MP "); } KRATOS_TEST_CASE_IN_SUITE(TrimRight, KratosCoreFastSuite) { - KRATOS_EXPECT_EQ(StringUtilities::Trim(""), ""); - KRATOS_EXPECT_EQ(StringUtilities::Trim(" "), ""); - KRATOS_EXPECT_EQ(StringUtilities::Trim("\n"), ""); - KRATOS_EXPECT_EQ(StringUtilities::Trim("\t"), ""); - KRATOS_EXPECT_EQ(StringUtilities::Trim("\0"), "\0"); - KRATOS_EXPECT_EQ(StringUtilities::Trim("\0", true), ""); - - KRATOS_EXPECT_EQ(StringUtilities::Trim("Kratos"), "Kratos"); - KRATOS_EXPECT_EQ(StringUtilities::Trim(" Kratos "), " Kratos"); - KRATOS_EXPECT_EQ(StringUtilities::Trim(" Kra tos "), " Kra tos"); - KRATOS_EXPECT_EQ(StringUtilities::Trim(" Kra\0tos "), " Kra\0tos"); - KRATOS_EXPECT_EQ(StringUtilities::Trim(" Kra\ntos "), " Kra\ntos"); - KRATOS_EXPECT_EQ(StringUtilities::Trim(" \0 Kra\ntos \0 "), " \0 Kra\ntos"); - - KRATOS_EXPECT_EQ(StringUtilities::Trim("Kratos MP"), "Kratos MP"); - KRATOS_EXPECT_EQ(StringUtilities::Trim(" Kratos MP "), " Kratos MP"); - KRATOS_EXPECT_EQ(StringUtilities::Trim("\tKratos MP\n"), "\tKratos MP"); - KRATOS_EXPECT_EQ(StringUtilities::Trim(" Kra tos MP "), " Kra tos MP"); - KRATOS_EXPECT_EQ(StringUtilities::Trim(" Kra\0tos MP "), " Kra\0tos MP"); - KRATOS_EXPECT_EQ(StringUtilities::Trim(" Kra\ntos MP "), " Kra\ntos MP"); + using namespace std::string_literals; // required for strings with null-chars => "asdf\0"s + + KRATOS_EXPECT_EQ(StringUtilities::TrimRight(""), ""); + KRATOS_EXPECT_EQ(StringUtilities::TrimRight(" "), ""); + KRATOS_EXPECT_EQ(StringUtilities::TrimRight("\n"), ""); + KRATOS_EXPECT_EQ(StringUtilities::TrimRight("\t"), ""); + KRATOS_EXPECT_EQ(StringUtilities::TrimRight("\0"), "\0"); + KRATOS_EXPECT_EQ(StringUtilities::TrimRight("\0", true), ""); + + KRATOS_EXPECT_EQ(StringUtilities::TrimRight("Kratos"), "Kratos"); + KRATOS_EXPECT_EQ(StringUtilities::TrimRight(" Kratos "), " Kratos"); + KRATOS_EXPECT_EQ(StringUtilities::TrimRight(" Kra tos "), " Kra tos"); + KRATOS_EXPECT_EQ(StringUtilities::TrimRight(" Kra\0tos "), " Kra\0tos"); + KRATOS_EXPECT_EQ(StringUtilities::TrimRight(" Kra\ntos "), " Kra\ntos"); + KRATOS_EXPECT_EQ(StringUtilities::TrimRight(" Kra\ntos\0"s), " Kra\ntos\0"s); + KRATOS_EXPECT_EQ(StringUtilities::TrimRight(" Kra\ntos\0"s, true), " Kra\ntos"); + KRATOS_EXPECT_EQ(StringUtilities::TrimRight(" \0 Kra\ntos \0 "s), " \0 Kra\ntos \0"s); + KRATOS_EXPECT_EQ(StringUtilities::TrimRight(" \0 Kra\ntos \0 "s, true), " \0 Kra\ntos"s); + + KRATOS_EXPECT_EQ(StringUtilities::TrimRight("Kratos MP"), "Kratos MP"); + KRATOS_EXPECT_EQ(StringUtilities::TrimRight(" Kratos MP "), " Kratos MP"); + KRATOS_EXPECT_EQ(StringUtilities::TrimRight("\tKratos MP\n"), "\tKratos MP"); + KRATOS_EXPECT_EQ(StringUtilities::TrimRight(" Kra tos MP "), " Kra tos MP"); + KRATOS_EXPECT_EQ(StringUtilities::TrimRight(" Kra\0tos MP "), " Kra\0tos MP"); + KRATOS_EXPECT_EQ(StringUtilities::TrimRight(" Kra\ntos MP "), " Kra\ntos MP"); } } // namespace Kratos::Testing From 84f5dca66982db64fa7d5a25d9cfa83632c4005c Mon Sep 17 00:00:00 2001 From: Philipp Date: Sun, 31 Mar 2024 16:47:18 +0200 Subject: [PATCH 6/9] review suggestions --- kratos/utilities/string_utilities.cpp | 27 ++++++++++++--------------- 1 file changed, 12 insertions(+), 15 deletions(-) diff --git a/kratos/utilities/string_utilities.cpp b/kratos/utilities/string_utilities.cpp index 4b88c32b49b9..d6db22e55012 100644 --- a/kratos/utilities/string_utilities.cpp +++ b/kratos/utilities/string_utilities.cpp @@ -182,18 +182,14 @@ std::string Trim( return TrimLeft(TrimRight(rInputString, RemoveNullChar), RemoveNullChar); } -std::function TrimChar(const bool RemoveNullChar) -{ - if (RemoveNullChar) { - return [](auto character) { - return std::isspace(character) || character == '\0'; - }; - } - return [](auto character) { - return std::isspace(character); - }; -} +const auto trim_space_and_null_char = [](std::string::value_type character) -> bool { + return std::isspace(character) || character == '\0'; +}; + +const auto trim_space = [](std::string::value_type character) -> bool { + return std::isspace(character); +}; std::string TrimLeft( const std::string& rInputString, @@ -201,10 +197,10 @@ std::string TrimLeft( { std::string output_string(rInputString); - const auto trim_char = TrimChar(RemoveNullChar); + const auto trim_char = RemoveNullChar ? trim_space_and_null_char : trim_space; output_string.erase(output_string.begin(), std::find_if(output_string.begin(), output_string.end(), - [trim_char](std::string::value_type ch) {return !trim_char(ch);} + [&trim_char](std::string::value_type ch) {return !trim_char(ch);} ) ); @@ -216,10 +212,11 @@ std::string TrimRight( const bool RemoveNullChar) { std::string output_string(rInputString); - const auto trim_char = TrimChar(RemoveNullChar); + + const auto trim_char = RemoveNullChar ? trim_space_and_null_char : trim_space; output_string.erase(std::find_if(output_string.rbegin(), output_string.rend(), - [trim_char](std::string::value_type ch) {return !trim_char(ch);} + [&trim_char](std::string::value_type ch) {return !trim_char(ch);} ).base(), output_string.end() ); From ed570d941b5e29a39f5d428ffab3919621d016f8 Mon Sep 17 00:00:00 2001 From: Philipp Date: Sun, 21 Apr 2024 14:48:23 +0200 Subject: [PATCH 7/9] Revert "review suggestions" This reverts commit 84f5dca66982db64fa7d5a25d9cfa83632c4005c. --- kratos/utilities/string_utilities.cpp | 27 +++++++++++++++------------ 1 file changed, 15 insertions(+), 12 deletions(-) diff --git a/kratos/utilities/string_utilities.cpp b/kratos/utilities/string_utilities.cpp index d6db22e55012..4b88c32b49b9 100644 --- a/kratos/utilities/string_utilities.cpp +++ b/kratos/utilities/string_utilities.cpp @@ -182,14 +182,18 @@ std::string Trim( return TrimLeft(TrimRight(rInputString, RemoveNullChar), RemoveNullChar); } +std::function TrimChar(const bool RemoveNullChar) +{ + if (RemoveNullChar) { + return [](auto character) { + return std::isspace(character) || character == '\0'; + }; + } -const auto trim_space_and_null_char = [](std::string::value_type character) -> bool { - return std::isspace(character) || character == '\0'; -}; - -const auto trim_space = [](std::string::value_type character) -> bool { - return std::isspace(character); -}; + return [](auto character) { + return std::isspace(character); + }; +} std::string TrimLeft( const std::string& rInputString, @@ -197,10 +201,10 @@ std::string TrimLeft( { std::string output_string(rInputString); - const auto trim_char = RemoveNullChar ? trim_space_and_null_char : trim_space; + const auto trim_char = TrimChar(RemoveNullChar); output_string.erase(output_string.begin(), std::find_if(output_string.begin(), output_string.end(), - [&trim_char](std::string::value_type ch) {return !trim_char(ch);} + [trim_char](std::string::value_type ch) {return !trim_char(ch);} ) ); @@ -212,11 +216,10 @@ std::string TrimRight( const bool RemoveNullChar) { std::string output_string(rInputString); - - const auto trim_char = RemoveNullChar ? trim_space_and_null_char : trim_space; + const auto trim_char = TrimChar(RemoveNullChar); output_string.erase(std::find_if(output_string.rbegin(), output_string.rend(), - [&trim_char](std::string::value_type ch) {return !trim_char(ch);} + [trim_char](std::string::value_type ch) {return !trim_char(ch);} ).base(), output_string.end() ); From 1b0683cab68d27a794da48a4cacea8abd1dbabdf Mon Sep 17 00:00:00 2001 From: Philipp Date: Sun, 21 Apr 2024 14:51:12 +0200 Subject: [PATCH 8/9] add nodiscard --- kratos/utilities/string_utilities.h | 20 ++++++++++---------- 1 file changed, 10 insertions(+), 10 deletions(-) diff --git a/kratos/utilities/string_utilities.h b/kratos/utilities/string_utilities.h index 2172bdd67309..53ff20dd0bc0 100644 --- a/kratos/utilities/string_utilities.h +++ b/kratos/utilities/string_utilities.h @@ -55,7 +55,7 @@ namespace StringUtilities * @param rString The string to be transformed into snake_case * @return The string in snake_case */ - std::string KRATOS_API(KRATOS_CORE) ConvertCamelCaseToSnakeCase(const std::string& rString); + [[nodiscard]] std::string KRATOS_API(KRATOS_CORE) ConvertCamelCaseToSnakeCase(const std::string& rString); /** * @brief Convert snake_case to CamelCase. @@ -65,7 +65,7 @@ namespace StringUtilities * - contains special characters other than underscores (?![a-z0-9_]) * - contains repeated underscores __+ */ - std::string KRATOS_API(KRATOS_CORE) ConvertSnakeCaseToCamelCase(const std::string& rString); + [[nodiscard]] std::string KRATOS_API(KRATOS_CORE) ConvertSnakeCaseToCamelCase(const std::string& rString); /** * @brief Erase first occurrence of given substring from main string. @@ -73,7 +73,7 @@ namespace StringUtilities * @param rToErase The string to remove * @return The string without the part to remove */ - std::string KRATOS_API(KRATOS_CORE) ErasePartialString( + [[nodiscard]] std::string KRATOS_API(KRATOS_CORE) ErasePartialString( const std::string& rMainString, const std::string& rToErase ); @@ -84,7 +84,7 @@ namespace StringUtilities * @param rToCheck The string to search * @return True if the substring is found and false otherwise */ - bool KRATOS_API(KRATOS_CORE) ContainsPartialString( + [[nodiscard]] bool KRATOS_API(KRATOS_CORE) ContainsPartialString( const std::string& rMainString, const std::string& rToCheck ); @@ -94,7 +94,7 @@ namespace StringUtilities * @param rString The string to be transformed * @return The string without white spaces */ - std::string KRATOS_API(KRATOS_CORE) RemoveWhiteSpaces(const std::string& rString); + [[nodiscard]] std::string KRATOS_API(KRATOS_CORE) RemoveWhiteSpaces(const std::string& rString); /** * @brief This method splits a string by a delimiter @@ -102,7 +102,7 @@ namespace StringUtilities * @param Delimiter The delimiter by which the string is to be splitted * @return a vector containing the splitted string */ - std::vector KRATOS_API(KRATOS_CORE) SplitStringByDelimiter( + [[nodiscard]] std::vector KRATOS_API(KRATOS_CORE) SplitStringByDelimiter( const std::string& rString, const char Delimiter ); @@ -114,7 +114,7 @@ namespace StringUtilities * @param rStringToReplace The string which replaces the substring * @return The string updated with the new substring */ - std::string KRATOS_API(KRATOS_CORE) ReplaceAllSubstrings( + [[nodiscard]] std::string KRATOS_API(KRATOS_CORE) ReplaceAllSubstrings( const std::string& rInputString, const std::string& rStringToBeReplaced, const std::string& rStringToReplace @@ -126,7 +126,7 @@ namespace StringUtilities * @param RemoveNullChar Whether or not null-characters ('\0') should be removed * @return The trimmed string */ - std::string KRATOS_API(KRATOS_CORE) Trim( + [[nodiscard]] std::string KRATOS_API(KRATOS_CORE) Trim( const std::string& rInputString, const bool RemoveNullChar = false); @@ -136,7 +136,7 @@ namespace StringUtilities * @param RemoveNullChar Whether or not null-characters ('\0') should be removed * @return The trimmed string */ - std::string KRATOS_API(KRATOS_CORE) TrimLeft( + [[nodiscard]] std::string KRATOS_API(KRATOS_CORE) TrimLeft( const std::string& rInputString, const bool RemoveNullChar = false); @@ -146,7 +146,7 @@ namespace StringUtilities * @param RemoveNullChar Whether or not null-characters ('\0') should be removed * @return The trimmed string */ - std::string KRATOS_API(KRATOS_CORE) TrimRight( + [[nodiscard]] std::string KRATOS_API(KRATOS_CORE) TrimRight( const std::string& rInputString, const bool RemoveNullChar = false); From a7a24019cba5ab5e6961ff6a4a1866e8f3871d35 Mon Sep 17 00:00:00 2001 From: Philipp Date: Sun, 21 Apr 2024 15:18:13 +0200 Subject: [PATCH 9/9] fix nodiscard --- .../utilities/test_string_utilities.cpp | 32 ++++++++++--------- 1 file changed, 17 insertions(+), 15 deletions(-) diff --git a/kratos/tests/cpp_tests/utilities/test_string_utilities.cpp b/kratos/tests/cpp_tests/utilities/test_string_utilities.cpp index ac7b0cefe66c..4b74f94eb899 100644 --- a/kratos/tests/cpp_tests/utilities/test_string_utilities.cpp +++ b/kratos/tests/cpp_tests/utilities/test_string_utilities.cpp @@ -12,6 +12,7 @@ // // System includes +#include // External includes @@ -61,21 +62,22 @@ KRATOS_TEST_CASE_IN_SUITE(ConvertSnakeCaseToCamelCase, KratosCoreFastSuite) } \ catch (...) {} - KRATOS_EXPECT_THROWS(StringUtilities::ConvertSnakeCaseToCamelCase("Test")) - KRATOS_EXPECT_THROWS(StringUtilities::ConvertSnakeCaseToCamelCase("tesT")) - KRATOS_EXPECT_THROWS(StringUtilities::ConvertSnakeCaseToCamelCase("te__st")) - KRATOS_EXPECT_THROWS(StringUtilities::ConvertSnakeCaseToCamelCase("__te_st")) - KRATOS_EXPECT_THROWS(StringUtilities::ConvertSnakeCaseToCamelCase("test__")) - KRATOS_EXPECT_THROWS(StringUtilities::ConvertSnakeCaseToCamelCase("te st")) - KRATOS_EXPECT_THROWS(StringUtilities::ConvertSnakeCaseToCamelCase(" test")) - KRATOS_EXPECT_THROWS(StringUtilities::ConvertSnakeCaseToCamelCase("test ")) - KRATOS_EXPECT_THROWS(StringUtilities::ConvertSnakeCaseToCamelCase("*nullptr")) - KRATOS_EXPECT_THROWS(StringUtilities::ConvertSnakeCaseToCamelCase("core/stringutils")) - KRATOS_EXPECT_THROWS(StringUtilities::ConvertSnakeCaseToCamelCase("c-s")) - KRATOS_EXPECT_THROWS(StringUtilities::ConvertSnakeCaseToCamelCase("-cs")) - KRATOS_EXPECT_THROWS(StringUtilities::ConvertSnakeCaseToCamelCase("cs-")) - KRATOS_EXPECT_THROWS(StringUtilities::ConvertSnakeCaseToCamelCase("ph@")) - KRATOS_EXPECT_THROWS(StringUtilities::ConvertSnakeCaseToCamelCase("#include")) + // deliberately ignoring [[nodiscard]] as it is not relevant for this test + KRATOS_EXPECT_THROWS(std::ignore = StringUtilities::ConvertSnakeCaseToCamelCase("Test")) + KRATOS_EXPECT_THROWS(std::ignore = StringUtilities::ConvertSnakeCaseToCamelCase("tesT")) + KRATOS_EXPECT_THROWS(std::ignore = StringUtilities::ConvertSnakeCaseToCamelCase("te__st")) + KRATOS_EXPECT_THROWS(std::ignore = StringUtilities::ConvertSnakeCaseToCamelCase("__te_st")) + KRATOS_EXPECT_THROWS(std::ignore = StringUtilities::ConvertSnakeCaseToCamelCase("test__")) + KRATOS_EXPECT_THROWS(std::ignore = StringUtilities::ConvertSnakeCaseToCamelCase("te st")) + KRATOS_EXPECT_THROWS(std::ignore = StringUtilities::ConvertSnakeCaseToCamelCase(" test")) + KRATOS_EXPECT_THROWS(std::ignore = StringUtilities::ConvertSnakeCaseToCamelCase("test ")) + KRATOS_EXPECT_THROWS(std::ignore = StringUtilities::ConvertSnakeCaseToCamelCase("*nullptr")) + KRATOS_EXPECT_THROWS(std::ignore = StringUtilities::ConvertSnakeCaseToCamelCase("core/stringutils")) + KRATOS_EXPECT_THROWS(std::ignore = StringUtilities::ConvertSnakeCaseToCamelCase("c-s")) + KRATOS_EXPECT_THROWS(std::ignore = StringUtilities::ConvertSnakeCaseToCamelCase("-cs")) + KRATOS_EXPECT_THROWS(std::ignore = StringUtilities::ConvertSnakeCaseToCamelCase("cs-")) + KRATOS_EXPECT_THROWS(std::ignore = StringUtilities::ConvertSnakeCaseToCamelCase("ph@")) + KRATOS_EXPECT_THROWS(std::ignore = StringUtilities::ConvertSnakeCaseToCamelCase("#include")) #undef KRATOS_EXPECT_THROWS }