Back to home page

EIC code displayed by LXR

 
 

    


File indexing completed on 2025-01-18 09:59:08

0001 //
0002 // ********************************************************************
0003 // * License and Disclaimer                                           *
0004 // *                                                                  *
0005 // * The  Geant4 software  is  copyright of the Copyright Holders  of *
0006 // * the Geant4 Collaboration.  It is provided  under  the terms  and *
0007 // * conditions of the Geant4 Software License,  included in the file *
0008 // * LICENSE and available at  http://cern.ch/geant4/license .  These *
0009 // * include a list of copyright holders.                             *
0010 // *                                                                  *
0011 // * Neither the authors of this software system, nor their employing *
0012 // * institutes,nor the agencies providing financial support for this *
0013 // * work  make  any representation or  warranty, express or implied, *
0014 // * regarding  this  software system or assume any liability for its *
0015 // * use.  Please see the license in the file  LICENSE  and URL above *
0016 // * for the full disclaimer and the limitation of liability.         *
0017 // *                                                                  *
0018 // * This  code  implementation is the result of  the  scientific and *
0019 // * technical work of the GEANT4 collaboration.                      *
0020 // * By using,  copying,  modifying or  distributing the software (or *
0021 // * any work based  on the software)  you  agree  to acknowledge its *
0022 // * use  in  resulting  scientific  publications,  and indicate your *
0023 // * acceptance of all terms of the Geant4 Software license.          *
0024 // ********************************************************************
0025 //
0026 // G4String inline methods implementation
0027 //
0028 // Author: G.Cosmo, 11 November 1999
0029 //---------------------------------------------------------------------
0030 
0031 inline G4String::G4String(const std::string& str)
0032   : std::string(str)
0033 {}
0034 
0035 inline G4String::G4String(const G4String& str) = default;
0036 
0037 inline G4String::G4String(std::string&& str)
0038   : std::string(std::move(str))
0039 {}
0040 
0041 inline G4String::G4String(G4String&& str)
0042   : std::string(std::move(str))
0043 {}
0044 
0045 inline G4String& G4String::operator=(const G4String& str)
0046 {
0047   if(&str == this)
0048   {
0049     return *this;
0050   }
0051   std::string::operator=(str);
0052   return *this;
0053 }
0054 
0055 inline G4String& G4String::operator=(G4String&& str)
0056 {
0057   std::string::operator=(std::move(str));
0058   return *this;
0059 }
0060 
0061 inline G4String::operator const char*() const { return c_str(); }
0062 
0063 inline G4String::reference G4String::operator[](int pos)
0064 {
0065   return std::string::operator[](pos);
0066 }
0067 
0068 inline G4String::const_reference G4String::operator[](int pos) const
0069 {
0070     return std::string::operator[](pos);
0071 }
0072 
0073 inline G4int G4String::compareTo(std::string_view str, caseCompare mode) const
0074 {
0075   if(mode == exact)
0076   {
0077     return compare(str);
0078   }
0079 
0080   return G4StrUtil::icompare(*this, str);
0081 }
0082 
0083 inline std::istream& G4String::readLine(std::istream& strm, G4bool skipWhite)
0084 {
0085   return G4StrUtil::readline(strm, *this, skipWhite);
0086 }
0087 
0088 inline G4String& G4String::remove(size_type n)
0089 {
0090   G4StrUtil::safe_erase(*this, n);
0091   return *this;
0092 }
0093 
0094 inline G4bool G4String::contains(const std::string& str) const
0095 {
0096   // Use of const char* required to resolve ambiguity with std::string_view
0097   return G4StrUtil::contains(*this, str.c_str());
0098 }
0099 
0100 inline G4bool G4String::contains(char ch) const
0101 {
0102   return G4StrUtil::contains(*this, ch);
0103 }
0104 
0105 inline G4String G4String::strip(G4String::stripType strip_Type, char ch)
0106 {
0107   if(empty())
0108   {
0109     return "";
0110   }
0111 
0112   G4String retVal = *this;
0113 
0114   switch(strip_Type)
0115   {
0116     case G4String::leading:
0117       G4StrUtil::lstrip(retVal, ch);
0118       break;
0119     case G4String::trailing:
0120       G4StrUtil::rstrip(retVal, ch);
0121       break;
0122     case G4String::both:
0123       G4StrUtil::strip(retVal, ch);
0124       break;
0125     default:
0126       break;
0127   }
0128 
0129   return retVal;
0130 }
0131 
0132 inline void G4String::toLower() { G4StrUtil::to_lower(*this); }
0133 
0134 inline void G4String::toUpper() { G4StrUtil::to_upper(*this); }
0135 
0136 namespace G4StrUtil
0137 {
0138   inline void to_lower(G4String& str)
0139   {
0140     std::transform(str.begin(), str.end(), str.begin(),
0141                    [](unsigned char ch) { return std::tolower(ch); });
0142   }
0143 
0144   inline G4String to_lower_copy(G4String str)
0145   {
0146     to_lower(str);
0147     return str;
0148   }
0149 
0150   inline void to_upper(G4String& str)
0151   {
0152     std::transform(str.begin(), str.end(), str.begin(),
0153                    [](unsigned char ch) { return std::toupper(ch); });
0154   }
0155 
0156   inline G4String to_upper_copy(G4String str)
0157   {
0158     to_upper(str);
0159     return str;
0160   }
0161 
0162   inline void lstrip(G4String& str, char ch)
0163   {
0164     auto startIndex = str.find_first_not_of(ch);
0165     str.erase(0, startIndex);
0166   }
0167 
0168   inline void rstrip(G4String& str, char ch)
0169   {
0170     auto endIndex = str.find_last_not_of(ch);
0171     if(endIndex == G4String::npos)
0172     {
0173       str = "";
0174     }
0175     else
0176     {
0177       str.erase(endIndex + 1);
0178     }
0179   }
0180 
0181   inline void strip(G4String& str, char ch)
0182   {
0183     if(str.empty())
0184     {
0185       return;
0186     }
0187 
0188     lstrip(str, ch);
0189     rstrip(str, ch);
0190   }
0191 
0192   inline G4String lstrip_copy(G4String str, char ch)
0193   {
0194     lstrip(str, ch);
0195     return str;
0196   }
0197 
0198   inline G4String rstrip_copy(G4String str, char ch)
0199   {
0200     rstrip(str, ch);
0201     return str;
0202   }
0203 
0204   inline G4String strip_copy(G4String str, char ch)
0205   {
0206     strip(str, ch);
0207     return str;
0208   }
0209 
0210   inline G4bool contains(const G4String& str, std::string_view ss)
0211   {
0212     return str.find(ss) != G4String::npos;
0213   }
0214 
0215   inline G4bool contains(const G4String& str, char ss)
0216   {
0217     return str.find(ss) != G4String::npos;
0218   }
0219 
0220   inline G4bool contains(const G4String& str, const char* ss)
0221   {
0222     return str.find(ss) != G4String::npos;
0223   }
0224 
0225   inline G4bool contains(const G4String& str, const G4String& ss)
0226   {
0227     return str.find(ss) != G4String::npos;
0228   }
0229 
0230   inline G4int icompare(std::string_view lhs, std::string_view rhs)
0231   {
0232     G4String buf1 = G4StrUtil::to_lower_copy(G4String(lhs.data(), lhs.size()));
0233     G4String buf2 = G4StrUtil::to_lower_copy(G4String(rhs.data(), rhs.size()));
0234     return buf1.compare(buf2);
0235   }
0236 
0237   inline bool starts_with(const G4String& str, std::string_view ss)
0238   {
0239     return str.rfind(ss, 0) == 0;
0240   }
0241 
0242   inline bool starts_with(const G4String& str, G4String::value_type ss)
0243   {
0244     return !str.empty() && (str[0] == ss);
0245   }
0246 
0247   inline bool starts_with(const G4String& str, const char* ss)
0248   {
0249     return str.rfind(ss, 0) == 0;
0250   }
0251 
0252   inline bool starts_with(const G4String& str, const G4String& ss)
0253   {
0254     return str.rfind(ss, 0) == 0;
0255   }
0256 
0257   inline bool ends_with(const G4String& str, std::string_view ss)
0258   {
0259     if(str.length() < ss.length())
0260     {
0261       return false;
0262     }
0263     return str.compare(str.length() - ss.length(), ss.length(), ss) == 0;
0264   }
0265 
0266   inline bool ends_with(const G4String& str, G4String::value_type ss)
0267   {
0268     return !str.empty() && (str.back() == ss);
0269   }
0270 
0271   inline bool ends_with(const G4String& str, const char* ss)
0272   {
0273     std::string_view sv(ss);
0274     return ends_with(str, sv);
0275   }
0276 
0277   inline bool ends_with(const G4String& str, const G4String& ss)
0278   {
0279     return ends_with(str, ss.c_str());
0280   }
0281 
0282   inline void safe_erase(G4String& str, G4String::size_type index,
0283                          G4String::size_type count)
0284   {
0285     if(index < str.size())
0286     {
0287       str.erase(index, count);
0288     }
0289   }
0290 
0291   inline std::istream& readline(std::istream& is, G4String& str,
0292                                 G4bool skipWhite)
0293   {
0294     char tmp[1024];
0295     if(skipWhite)
0296     {
0297       is >> std::ws;
0298     }
0299 
0300     is.getline(tmp, 1024);
0301     str = tmp;
0302 
0303     return is;
0304   }
0305 }  // namespace G4StrUtil