From 520414ca936b7b97530d0e9ebccb735a53fb93af Mon Sep 17 00:00:00 2001
From: =?UTF-8?q?Jakub=20Klinkovsk=C3=BD?= <klinkovsky@mmg.fjfi.cvut.cz>
Date: Thu, 9 Apr 2020 09:21:46 +0200
Subject: [PATCH] Added methods startsWith and endsWith to String

---
 src/TNL/String.h             | 10 +++++++
 src/TNL/String.hpp           | 16 ++++++++++
 src/UnitTests/StringTest.cpp | 58 +++++++++++++++++++++++++++++++++++-
 3 files changed, 83 insertions(+), 1 deletion(-)

diff --git a/src/TNL/String.h b/src/TNL/String.h
index 228cb5bcb1..b0fb6644ce 100644
--- a/src/TNL/String.h
+++ b/src/TNL/String.h
@@ -342,6 +342,16 @@ class String
        * \include StringExampleSplit.out   
        */
       std::vector< String > split( const char separator = ' ', SplitSkip skipEmpty = SplitSkip::NoSkip ) const;
+
+      /**
+       * \brief Checks if the string starts with given prefix.
+       */
+      bool startsWith( const String& prefix ) const;
+
+      /**
+       * \brief Checks if the string ends with given suffix.
+       */
+      bool endsWith( const String& suffix ) const;
 };
 
 /**
diff --git a/src/TNL/String.hpp b/src/TNL/String.hpp
index 3c38fe6b0c..64fae92cd5 100644
--- a/src/TNL/String.hpp
+++ b/src/TNL/String.hpp
@@ -223,6 +223,22 @@ String::split( const char separator, SplitSkip skip ) const
    return parts;
 }
 
+inline bool
+String::startsWith( const String& prefix ) const
+{
+   if( prefix.getSize() > getSize())
+      return false;
+   return std::equal( prefix.begin(), prefix.end(), begin() );
+}
+
+inline bool
+String::endsWith( const String& suffix ) const
+{
+   if( suffix.getSize() > getSize())
+      return false;
+   return std::equal( suffix.rbegin(), suffix.rend(), rbegin() );
+}
+
 inline String operator+( char string1, const String& string2 )
 {
    return convertToString( string1 ) + string2;
diff --git a/src/UnitTests/StringTest.cpp b/src/UnitTests/StringTest.cpp
index aa2a64a19f..7447c1e6c2 100644
--- a/src/UnitTests/StringTest.cpp
+++ b/src/UnitTests/StringTest.cpp
@@ -317,7 +317,63 @@ TEST( StringTest, SaveLoad )
    EXPECT_EQ( str1, str2 );
 
    EXPECT_EQ( std::remove( TEST_FILE_NAME ), 0 );
-};
+}
+
+TEST( StringTest, startsWith )
+{
+   String str( "abracadabra" );
+   EXPECT_TRUE( str.startsWith( "a" ) );
+   EXPECT_TRUE( str.startsWith( "ab" ) );
+   EXPECT_TRUE( str.startsWith( "abr" ) );
+   EXPECT_TRUE( str.startsWith( "abra" ) );
+   EXPECT_TRUE( str.startsWith( "abrac" ) );
+   EXPECT_TRUE( str.startsWith( "abraca" ) );
+   EXPECT_TRUE( str.startsWith( "abracad" ) );
+   EXPECT_TRUE( str.startsWith( "abracada" ) );
+   EXPECT_TRUE( str.startsWith( "abracadab" ) );
+   EXPECT_TRUE( str.startsWith( "abracadabr" ) );
+   EXPECT_TRUE( str.startsWith( "abracadabra" ) );
+   EXPECT_FALSE( str.startsWith( "b" ) );
+   EXPECT_FALSE( str.startsWith( "aa" ) );
+   EXPECT_FALSE( str.startsWith( "aba" ) );
+   EXPECT_FALSE( str.startsWith( "abrb" ) );
+   EXPECT_FALSE( str.startsWith( "abrad" ) );
+   EXPECT_FALSE( str.startsWith( "abracb" ) );
+   EXPECT_FALSE( str.startsWith( "abracaa" ) );
+   EXPECT_FALSE( str.startsWith( "abracadb" ) );
+   EXPECT_FALSE( str.startsWith( "abracadaa" ) );
+   EXPECT_FALSE( str.startsWith( "abracadaba" ) );
+   EXPECT_FALSE( str.startsWith( "abracadabrb" ) );
+   EXPECT_FALSE( str.startsWith( "abracadabrab" ) );
+}
+
+TEST( StringTest, endsWith )
+{
+   String str( "abracadabra" );
+   EXPECT_TRUE( str.endsWith( "a" ) );
+   EXPECT_TRUE( str.endsWith( "ra" ) );
+   EXPECT_TRUE( str.endsWith( "bra" ) );
+   EXPECT_TRUE( str.endsWith( "abra" ) );
+   EXPECT_TRUE( str.endsWith( "dabra" ) );
+   EXPECT_TRUE( str.endsWith( "adabra" ) );
+   EXPECT_TRUE( str.endsWith( "cadabra" ) );
+   EXPECT_TRUE( str.endsWith( "acadabra" ) );
+   EXPECT_TRUE( str.endsWith( "racadabra" ) );
+   EXPECT_TRUE( str.endsWith( "bracadabra" ) );
+   EXPECT_TRUE( str.endsWith( "abracadabra" ) );
+   EXPECT_FALSE( str.endsWith( "b" ) );
+   EXPECT_FALSE( str.endsWith( "ba" ) );
+   EXPECT_FALSE( str.endsWith( "ara" ) );
+   EXPECT_FALSE( str.endsWith( "bbra" ) );
+   EXPECT_FALSE( str.endsWith( "babra" ) );
+   EXPECT_FALSE( str.endsWith( "bdabra" ) );
+   EXPECT_FALSE( str.endsWith( "badabra" ) );
+   EXPECT_FALSE( str.endsWith( "bcadabra" ) );
+   EXPECT_FALSE( str.endsWith( "aacadabra" ) );
+   EXPECT_FALSE( str.endsWith( "aracadabra" ) );
+   EXPECT_FALSE( str.endsWith( "bbracadabra" ) );
+   EXPECT_FALSE( str.endsWith( "babracadabra" ) );
+}
 #endif
 
 #include "main.h"
-- 
GitLab