LCOV - code coverage report
Current view: top level - source/ps - CStr.h (source / functions) Hit Total Coverage
Test: 0 A.D. test coverage report Lines: 5 5 100.0 %
Date: 2023-01-19 00:18:29 Functions: 24 26 92.3 %

          Line data    Source code
       1             : /* Copyright (C) 2022 Wildfire Games.
       2             :  * This file is part of 0 A.D.
       3             :  *
       4             :  * 0 A.D. is free software: you can redistribute it and/or modify
       5             :  * it under the terms of the GNU General Public License as published by
       6             :  * the Free Software Foundation, either version 2 of the License, or
       7             :  * (at your option) any later version.
       8             :  *
       9             :  * 0 A.D. is distributed in the hope that it will be useful,
      10             :  * but WITHOUT ANY WARRANTY; without even the implied warranty of
      11             :  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
      12             :  * GNU General Public License for more details.
      13             :  *
      14             :  * You should have received a copy of the GNU General Public License
      15             :  * along with 0 A.D.  If not, see <http://www.gnu.org/licenses/>.
      16             :  */
      17             : 
      18             : /**
      19             :  * Description : Contains CStr class which is a versatile class for making string use easy.
      20             :  *             : The class implements a series of string manipulation/formatting functions.
      21             :  **/
      22             : 
      23             : #ifndef INCLUDED_CSTR
      24             : #define INCLUDED_CSTR
      25             : 
      26             : /**
      27             :  * Whitespace trim identifier for Trim and Pad functions
      28             :  **/
      29             : enum PS_TRIM_MODE
      30             : {
      31             :     PS_TRIM_LEFT,   /// Trim all white space from the beginning of the string
      32             :     PS_TRIM_RIGHT,  /// Trim all white space from the end of the string
      33             :     PS_TRIM_BOTH    /// Trim all white space from the beginning and end of the string
      34             : };
      35             : 
      36             : #ifndef IN_UNIDOUBLER
      37             :  #define UNIDOUBLER_HEADER "CStr.h"
      38             :  #include "UniDoubler.h"
      39             : #endif
      40             : 
      41             : #endif
      42             : 
      43             : // Include this section when in unidoubler mode, and when this unicode/ascii
      44             : // version has not already been included.
      45             : #if defined(IN_UNIDOUBLER) && ( (defined(_UNICODE) && !defined(CSTR_H_U)) || (!defined(_UNICODE) && !defined(CSTR_H_A)) )
      46             : 
      47             : #ifdef _UNICODE
      48             : #define CSTR_H_U
      49             : #else
      50             : #define CSTR_H_A
      51             : #endif
      52             : 
      53             : #include "ps/CStrForward.h"
      54             : 
      55             : #include <string>
      56             : 
      57             : /**
      58             :  * The base class of all strings
      59             :  **/
      60      104836 : class CStr : public std::tstring
      61             : {
      62             : public:
      63             :     using StrBase = std::tstring;
      64             :     using Char = typename std::tstring::value_type;
      65             : 
      66       76562 :     CStr(const StrBase& str) : StrBase(str) {}
      67             : 
      68        7331 :     using StrBase::StrBase;
      69             : 
      70             :     /**
      71             :      * Repeat: Named constructor, to avoid overload overload.
      72             :      *
      73             :      * @param const CStr & str reference to another CStr object to be repeated for initialization
      74             :      * @param size_t Reps number of times to repeat the initialization
      75             :      * @return CStr new CStr object
      76             :      **/
      77             :     static CStr Repeat(const CStr& str, size_t reps);
      78             : 
      79             :     /**
      80             :      * Construction from u16strings.
      81             :      *
      82             :      * @param u16string String u16string to be used for initialization.
      83             :      **/
      84             :     explicit CStr(const std::u16string& str) : StrBase(str.begin(), str.end()) {}
      85             : 
      86             :     // Conversion to/from UTF-8, encoded in a CStr8.
      87             :     // Invalid bytes/characters (e.g. broken UTF-8, and Unicode characters
      88             :     // above U+FFFF) are silently replaced with U+FFFD.
      89             :     #ifdef _UNICODE
      90             :         CStr8 ToUTF8() const;
      91             :     #else
      92             :         CStrW FromUTF8() const;
      93             :     #endif
      94             : 
      95             :     // Conversions:
      96             : 
      97             :     static CStr FromInt(int n);
      98             :     static CStr FromUInt(unsigned int n);
      99             :     static CStr FromInt64(i64 n);
     100             :     static CStr FromDouble(double n);
     101             : 
     102             :     /**
     103             :      * Return CStr as Integer.
     104             :      * Conversion is from the beginning of CStr.
     105             :      *
     106             :      * @return int CStr represented as an integer.
     107             :      **/
     108             :     int ToInt() const;
     109             :     /**
     110             :      * Return CStr as Unsigned Integer.
     111             :      * Conversion is from the beginning of CStr.
     112             :      *
     113             :      * @return unsigned int CStr represented as an unsigned integer.
     114             :      **/
     115             :     unsigned int ToUInt() const;
     116             :     /**
     117             :      * Return CStr as Long.
     118             :      * Conversion is from the beginning of CStr.
     119             :      *
     120             :      * @return long CStr represented as a long.
     121             :      **/
     122             :     long ToLong() const;
     123             :     /**
     124             :      * Return CStr as Unsigned Long.
     125             :      * Conversion is from the beginning of CStr.
     126             :      *
     127             :      * @return unsigned long CStr represented as an unsigned long.
     128             :      **/
     129             :     unsigned long ToULong() const;
     130             :     /**
     131             :      * Return CStr as Float.
     132             :      * Conversion is from the beginning of CStr.
     133             :      *
     134             :      * @return float CStr represented as a float.
     135             :      **/
     136             :     float ToFloat() const;
     137             :     /**
     138             :      * Return CStr as Double.
     139             :      * Conversion is from the beginning of CStr.
     140             :      *
     141             :      * @return double CStr represented as a double.
     142             :      **/
     143             :     double ToDouble() const;
     144             : 
     145             :     /**
     146             :      * Search the CStr for another string.
     147             :      * The search is case-sensitive.
     148             :      *
     149             :      * @param const CStr & str reference to the search string
     150             :      * @return long offset into the CStr of the first occurrence of the search string
     151             :      *              -1 if the search string is not found
     152             :      **/
     153             :     long Find(const CStr& str) const;
     154             :     /**
     155             :      * Search the CStr for another string.
     156             :      * The search is case-sensitive.
     157             :      *
     158             :      * @param const {t|w}char_t & chr reference to the search string
     159             :      * @return long offset into the CStr of the first occurrence of the search string
     160             :      *              -1 if the search string is not found
     161             :      **/
     162             :     long Find(const Char chr) const;
     163             :     /**
     164             :      * Search the CStr for another string with starting offset.
     165             :      * The search is case-sensitive.
     166             :      *
     167             :      * @param const int & start character offset into CStr to begin search
     168             :      * @param const {t|w}char_t & chr reference to the search string
     169             :      * @return long offset into the CStr of the first occurrence of the search string
     170             :      *              -1 if the search string is not found
     171             :      **/
     172             :     long Find(const int start, const Char chr) const;
     173             : 
     174             :     /**
     175             :      * Search the CStr for another string.
     176             :      * The search is case-insensitive.
     177             :      *
     178             :      * @param const CStr & str reference to the search string
     179             :      * @return long offset into the CStr of the first occurrence of the search string
     180             :      *              -1 if the search string is not found
     181             :      **/
     182             :     long FindInsensitive(const CStr& str) const;
     183             :     /**
     184             :      * Search the CStr for another string.
     185             :      * The search is case-insensitive.
     186             :      *
     187             :      * @param const {t|w}char_t & chr reference to the search string
     188             :      * @return long offset into the CStr of the first occurrence of the search string
     189             :      *              -1 if the search string is not found
     190             :      **/
     191             :     long FindInsensitive(const Char chr) const;
     192             :     /**
     193             :      * Search the CStr for another string with starting offset.
     194             :      * The search is case-insensitive.
     195             :      *
     196             :      * @param const int & start character offset into CStr to begin search
     197             :      * @param const {t|w}char_t & chr reference to the search string
     198             :      * @return long offset into the CStr of the first occurrence of the search string
     199             :      *              -1 if the search string is not found
     200             :      **/
     201             :     long FindInsensitive(const int start, const Char chr) const;
     202             : 
     203             :     /**
     204             :      * Search the CStr for another string.
     205             :      * The search is case-sensitive.
     206             :      *
     207             :      * @param const CStr & str reference to the search string
     208             :      * @return long offset into the CStr of the last occurrence of the search string
     209             :      *              -1 if the search string is not found
     210             :      **/
     211             :     long ReverseFind(const CStr& str) const;
     212             : 
     213             :     /**
     214             :      * Make a copy of the CStr in lower-case.
     215             :      *
     216             :      * @return CStr converted copy of CStr.
     217             :      **/
     218             :     CStr LowerCase() const;
     219             :     /**
     220             :      * Make a copy of the CStr in upper-case.
     221             :      *
     222             :      * @return CStr converted copy of CStr.
     223             :      **/
     224             :     CStr UpperCase() const;
     225             : 
     226             :     /**
     227             :      * Retrieve first n characters of the CStr.
     228             :      *
     229             :      * @param size_t len the number of characters to retrieve.
     230             :      * @return CStr retrieved substring.
     231             :      **/
     232             :     CStr Left(size_t len) const;
     233             : 
     234             :     /**
     235             :      * Retrieve last n characters of the CStr.
     236             :      *
     237             :      * @param size_t len the number of characters to retrieve.
     238             :      * @return CStr retrieved substring.
     239             :      **/
     240             :     CStr Right(size_t len) const;
     241             : 
     242             :     /**
     243             :      * Retrieve substring of the CStr after last occurrence of a string.
     244             :      * Return substring of the CStr after the last occurrence of the search string.
     245             :      *
     246             :      * @param const CStr & str reference to search string
     247             :      * @param size_t startPos character position to start searching from
     248             :      * @return CStr substring remaining after match
     249             :      *                   the CStr if no match is found
     250             :      **/
     251             :     CStr AfterLast(const CStr& str, size_t startPos = npos) const;
     252             : 
     253             :     /**
     254             :      * Retrieve substring of the CStr preceding last occurrence of a string.
     255             :      * Return substring of the CStr preceding the last occurrence of the search string.
     256             :      *
     257             :      * @param const CStr & str reference to search string
     258             :      * @param size_t startPos character position to start searching from
     259             :      * @return CStr substring preceding before match
     260             :      *                   the CStr if no match is found
     261             :      **/
     262             :     CStr BeforeLast(const CStr& str, size_t startPos = npos) const;
     263             : 
     264             :     /**
     265             :      * Retrieve substring of the CStr after first occurrence of a string.
     266             :      * Return substring of the CStr after the first occurrence of the search string.
     267             :      *
     268             :      * @param const CStr & str reference to search string
     269             :      * @param size_t startPos character position to start searching from
     270             :      * @return CStr substring remaining after match
     271             :      *                   the CStr if no match is found
     272             :      **/
     273             :     CStr AfterFirst(const CStr& str, size_t startPos = 0) const;
     274             : 
     275             :     /**
     276             :      * Retrieve substring of the CStr preceding first occurrence of a string.
     277             :      * Return substring of the CStr preceding the first occurrence of the search string.
     278             :      *
     279             :      * @param const CStr & str reference to search string
     280             :      * @param size_t startPos character position to start searching from
     281             :      * @return CStr substring preceding before match
     282             :      *                   the CStr if no match is found
     283             :      **/
     284             :     CStr BeforeFirst(const CStr& str, size_t startPos = 0) const;
     285             : 
     286             :     /**
     287             :      * Remove all occurrences of a string from the CStr.
     288             :      *
     289             :      * @param const CStr & str reference to search string to remove.
     290             :      **/
     291             :     void Remove(const CStr& str);
     292             : 
     293             :     /**
     294             :      * Replace all occurrences of one string by another string in the CStr.
     295             :      *
     296             :      * @param const CStr & strToReplace reference to search string.
     297             :      * @param const CStr & replaceWith reference to replace string.
     298             :      **/
     299             :     void Replace(const CStr& toReplace, const CStr& replaceWith);
     300             : 
     301             :     /**
     302             :      * Convert strings to printable ASCII characters with JSON-style escapes.
     303             :      */
     304             :     std::string EscapeToPrintableASCII() const;
     305             : 
     306             :     /**
     307             :      * Return a trimmed copy of the CStr.
     308             :      *
     309             :      * @param PS_TRIM_MODE Mode value from trim mode enumeration.
     310             :      * @return CStr copy of trimmed CStr.
     311             :      **/
     312             :     CStr Trim(PS_TRIM_MODE mode) const;
     313             : 
     314             :     /**
     315             :      * Return a space padded copy of the CStr.
     316             :      *
     317             :      * @param PS_TRIM_MODE Mode value from trim mode enumeration.
     318             :      * @param size_t Length number of pad spaces to add
     319             :      * @return CStr copy of padded CStr.
     320             :      **/
     321             :     CStr Pad(PS_TRIM_MODE mode, size_t len) const;
     322             : 
     323             :     // Conversion to u16string
     324             :     std::u16string utf16() const { return std::u16string(begin(), end()); }
     325             : 
     326             :     // Calculates a hash of the string's contents
     327             :     size_t GetHashCode() const;
     328             : 
     329             :     // Serialization functions
     330             :     // (These are not virtual or inherited from ISerializable, to avoid
     331             :     // adding a vtable and making the strings larger than std::string)
     332             :     size_t GetSerializedLength() const;
     333             :     u8* Serialize(u8* buffer) const;
     334             :     const u8* Deserialize(const u8* buffer, const u8* bufferend);
     335             : };
     336             : 
     337             : namespace std
     338             : {
     339             : template <>
     340             : struct hash<CStr>
     341             : {
     342          84 :     std::size_t operator()(const CStr& str) const
     343             :     {
     344          84 :         return str.GetHashCode();
     345             :     }
     346             : };
     347             : }
     348             : 
     349             : #endif // INCLUDED_CSTR

Generated by: LCOV version 1.13