Some minor changes in the String functions.

This commit is contained in:
Martín Lucas Golini
2014-07-27 04:18:18 -03:00
parent 3010bbfab3
commit cc3f05307a
10 changed files with 77 additions and 93 deletions

View File

@@ -88,16 +88,22 @@ class EE_API String {
static std::string Trim( const std::string & str );
/** Convert the string into upper case string */
static void ToUpper( std::string & str );
static void ToUpperInPlace( std::string & str );
/** Convert the string into lower case string */
static void ToLower( std::string & str );
/** Convert a string to lower case */
static std::string ToUpper( std::string str );
/** Convert the reference of a string into lower case string */
static void ToLowerInPlace( std::string & str );
/** Convert a string to lower case */
static std::string ToLower( std::string str );
/** Convert the string to an std::vector<Uint8> */
static std::vector<Uint8> StringToUint8( const std::string& str );
/** Convert the std::vector<Uint8> to an string */
static std::string Uint8ToString( const std::vector<Uint8> v );
static std::string Uint8ToString( const std::vector<Uint8> & v );
/** Insert a char into String on pos (added this function to avoid a bug on String) */
static void InsertChar( String& str, const unsigned int& pos, const Uint32& tchar );
@@ -110,21 +116,24 @@ class EE_API String {
static void StrCopy( char * Dst, const char * Src, unsigned int DstSize );
/** Compare two strings from its beginning.
* @param Start String start
* @param Str String to compare
* @return The position of the last char compared ( -1 if fails )
* @param haystack The string to search in.
* @param needle The searched string.
* @return true if string starts with the substring
*/
static Int32 StartsWith( const std::string& Start, const std::string Str );
static bool StartsWith( const std::string& haystack, const std::string& needle );
/** Compare two strings from its beginning.
* @param Start String start
* @param Str String to compare
* @return The position of the last char compared ( -1 if fails )
* @param haystack The string to search in.
* @param needle The searched string.
* @return true if string starts with the substring
*/
static Int32 StartsWith( const String& Start, const String Str );
static bool StartsWith( const String& haystack, const String& needle );
/** Replaces a substring by another string inside a string */
static void ReplaceSubStr(std::string &target, const std::string& that, const std::string& with );
/** Replace all occurrences of the search string with the replacement string. */
static void ReplaceAll( std::string &target, const std::string& that, const std::string& with );
/** Replace the first ocurrence of the search string with the replacement string. */
static void Replace( std::string& target, const std::string& that, const std::string& with );
/** Removes the numbers at the end of the string */
static std::string RemoveNumbersAtEnd( std::string txt );

View File

@@ -93,7 +93,6 @@ std::vector < std::string > String::Split ( const std::string& str, const Int8&
return tmp;
}
std::string String::LTrim( const std::string & str ) {
std::string::size_type pos1 = str.find_first_not_of(' ');
return ( pos1 == std::string::npos ) ? str : str.substr( pos1 );
@@ -105,70 +104,47 @@ std::string String::Trim( const std::string & str ) {
return str.substr(pos1 == std::string::npos ? 0 : pos1, pos2 == std::string::npos ? str.length() - 1 : pos2 - pos1 + 1);
}
void String::ToUpper( std::string & str ) {
void String::ToUpperInPlace( std::string & str ) {
std::transform(str.begin(), str.end(), str.begin(), (int(*)(int)) std::toupper);
}
void String::ToLower( std::string & str ) {
std::string String::ToUpper( std::string str ) {
for (std::string::iterator i = str.begin(); i != str.end(); ++i)
*i = static_cast<char>(std::toupper(*i));
return str;
}
void String::ToLowerInPlace( std::string & str ) {
std::transform(str.begin(), str.end(), str.begin(), (int(*)(int)) std::tolower);
}
std::string String::ToLower( std::string str ) {
for (std::string::iterator i = str.begin(); i != str.end(); ++i)
*i = static_cast<char>(std::tolower(*i));
return str;
}
std::vector<Uint8> String::StringToUint8( const std::string& str ) {
return std::vector<Uint8>( str.begin(), str.end() );
}
std::string String::Uint8ToString( const std::vector<Uint8> v ) {
std::string String::Uint8ToString( const std::vector<Uint8>& v ) {
return std::string( v.begin(), v.end() );
}
void String::StrCopy( char * Dst, const char * Src, unsigned int DstSize ) {
char * DstEnd = Dst + DstSize - 1;
while ( Dst < DstEnd && *Src ) {
*Dst = *Src;
Dst++;
Src++;
}
*Dst = 0;
strncpy( Dst, Src, DstSize );
}
Int32 String::StartsWith( const std::string& Start, const std::string Str ) {
Int32 Pos = -1;
Int32 s = (Int32)Start.size();
if ( (Int32)Str.size() >= s ) {
for ( Int32 i = 0; i < s; i++ ) {
if ( Start[i] == Str[i] ) {
Pos = i;
} else {
Pos = -1;
break;
}
}
}
return Pos;
bool String::StartsWith( const std::string& haystack, const std::string & needle ) {
return needle.length() <= haystack.length() && std::equal(needle.begin(), needle.end(), haystack.begin() );
}
Int32 String::StartsWith( const String& Start, const String Str ) {
Int32 Pos = -1;
if ( Str.size() >= Start.size() ) {
for ( Uint32 i = 0; i < Start.size(); i++ ) {
if ( Start[i] == Str[i] ) {
Pos = (Int32)i;
} else {
Pos = -1;
break;
}
}
}
return Pos;
bool String::StartsWith( const String& haystack, const String & needle ) {
return needle.length() <= haystack.length() && std::equal(needle.begin(), needle.end(), haystack.begin() );
}
void String::ReplaceSubStr( std::string &target, const std::string& that, const std::string& with ) {
void String::ReplaceAll( std::string &target, const std::string& that, const std::string& with ) {
std::string::size_type pos=0;
while( ( pos = target.find( that, pos ) ) != std::string::npos ) {
@@ -178,6 +154,15 @@ void String::ReplaceSubStr( std::string &target, const std::string& that, const
}
}
void String::Replace( std::string& target, const std::string& that, const std::string& with ) {
std::size_t start_pos = target.find( that );
if( start_pos == std::string::npos )
return;
target.replace( start_pos, that.length(), with );
}
std::string String::RemoveNumbersAtEnd( std::string txt ) {
while ( txt.size() && txt[ txt.size() - 1 ] >= '0' && txt[ txt.size() - 1 ] <= '9' ) {
txt.resize( txt.size() - 1 );

View File

@@ -415,7 +415,7 @@ void Console::PrintCommandsStartingWith( const String& start ) {
std::map < String, ConsoleCallback >::iterator it;
for ( it = mCallbacks.begin(); it != mCallbacks.end(); it++ ) {
if ( -1 != String::StartsWith( start, it->first ) ) {
if ( String::StartsWith( it->first, start ) ) {
cmds.push_back( it->first );
}
}
@@ -470,7 +470,7 @@ void Console::GetFilesFrom( std::string txt, const Uint32& curPos ) {
String res;
for ( size_t i = 0; i < files.size(); i++ ) {
if ( !file.size() || -1 != String::StartsWith( file, files[i] ) ) {
if ( !file.size() || String::StartsWith( files[i], file ) ) {
res += "\t" + files[i] + "\n";
count++;
lasti = i;

View File

@@ -155,12 +155,12 @@ void Shader::EnsureVersion() {
mSource = "#version 330\nin vec4 gl_Color;\nin vec4 gl_TexCoord[ 1 ];\nout vec4 gl_FragColor;\n" + mSource;
}
String::ReplaceSubStr( mSource, "gl_Color" , "dgl_Color" );
String::ReplaceSubStr( mSource, "gl_TexCoord" , "dgl_TexCoord" );
String::ReplaceAll( mSource, "gl_Color" , "dgl_Color" );
String::ReplaceAll( mSource, "gl_TexCoord" , "dgl_TexCoord" );
if ( GLi->Version() == GLv_3CP ) {
#ifndef EE_GLES
String::ReplaceSubStr( mSource, "gl_FragColor" , "dgl_FragColor" );
String::ReplaceAll( mSource, "gl_FragColor" , "dgl_FragColor" );
#endif
}
}
@@ -169,7 +169,7 @@ void Shader::EnsureVersion() {
if ( GLi->Version() == GLv_3CP ) {
#ifndef EE_GLES
String::ReplaceSubStr( mSource, "texture2D" , "texture" );
String::ReplaceAll( mSource, "texture2D" , "texture" );
#endif
}
#endif

View File

@@ -329,7 +329,7 @@ static bool IsImage( std::string path ) {
if ( FileSystem::FileSize( path ) ) {
std::string File = path.substr( path.find_last_of("/\\") + 1 );
std::string Ext = File.substr( File.find_last_of(".") + 1 );
String::ToLower( Ext );
String::ToLowerInPlace( Ext );
if ( Ext == "png" ||
Ext == "tga" ||

View File

@@ -8,15 +8,6 @@
using namespace EE::Network::SSL;
namespace {
// Convert a string to lower case
std::string toLower(std::string str) {
for (std::string::iterator i = str.begin(); i != str.end(); ++i)
*i = static_cast<char>(std::tolower(*i));
return str;
}
}
namespace EE { namespace Network {
Http::Request::Request(const std::string& uri, Method method, const std::string& body, bool validateCertificate, bool validateHostname ) :
@@ -30,7 +21,7 @@ Http::Request::Request(const std::string& uri, Method method, const std::string&
}
void Http::Request::SetField(const std::string& field, const std::string& value) {
mFields[toLower(field)] = value;
mFields[String::ToLower(field)] = value;
}
void Http::Request::SetMethod(Http::Request::Method method) {
@@ -107,7 +98,7 @@ std::string Http::Request::Prepare() const {
}
bool Http::Request::HasField(const std::string& field) const {
return mFields.find(toLower(field)) != mFields.end();
return mFields.find(String::ToLower(field)) != mFields.end();
}
Http::Response::Response() :
@@ -118,7 +109,7 @@ Http::Response::Response() :
}
const std::string& Http::Response::GetField(const std::string& field) const {
FieldTable::const_iterator it = mFields.find(toLower(field));
FieldTable::const_iterator it = mFields.find(String::ToLower(field));
if (it != mFields.end()) {
return it->second;
} else {
@@ -152,7 +143,7 @@ void Http::Response::Parse(const std::string& data) {
if (in >> version) {
std::locale loc;
if ((version.size() >= 8) && (version[6] == '.') &&
(toLower(version.substr(0, 5)) == "http/") &&
(String::ToLower(version.substr(0, 5)) == "http/") &&
std::isdigit(version[5],loc) && std::isdigit(version[7],loc)) {
mMajorVersion = version[5] - '0';
mMinorVersion = version[7] - '0';
@@ -184,7 +175,7 @@ void Http::Response::Parse(const std::string& data) {
mBody.clear();
// Determine whether the transfer is chunked
if (toLower(GetField("transfer-encoding")) != "chunked") {
if (String::ToLower(GetField("transfer-encoding")) != "chunked") {
// Not chunked - everything at once
std::copy(std::istreambuf_iterator<char>(in), std::istreambuf_iterator<char>(), std::back_inserter(mBody));
} else {
@@ -225,7 +216,7 @@ void Http::Response::ParseFields(std::istream &in) {
value.erase(value.size() - 1);
// Add the field
mFields[toLower(field)] = value;
mFields[String::ToLower(field)] = value;
}
}
}
@@ -265,11 +256,11 @@ Http::~Http() {
void Http::SetHost(const std::string& host, unsigned short port, bool useSSL) {
// Check the protocol
if (toLower(host.substr(0, 7)) == "http://") {
if (String::ToLower(host.substr(0, 7)) == "http://") {
// HTTP protocol
mHostName = host.substr(7);
mPort = (port != 0 ? port : 80);
} else if (toLower(host.substr(0, 8)) == "https://") {
} else if (String::ToLower(host.substr(0, 8)) == "https://") {
// HTTPS protocol
#ifdef EE_SSL_SUPPORT
mIsSSL = true;

View File

@@ -108,7 +108,7 @@ std::string FileSystem::FileExtension( const std::string& filepath, const bool&
std::string tstr( filepath.substr( filepath.find_last_of(".") + 1 ) );
if ( lowerExt )
String::ToLower( tstr );
String::ToLowerInPlace( tstr );
return tstr;
}
@@ -128,10 +128,9 @@ std::string FileSystem::FileRemoveFileName( const std::string& filepath ) {
void FileSystem::FilePathRemoveProcessPath( std::string& path ) {
static std::string ProcessPath = Sys::GetProcessPath();
Int32 pos = String::StartsWith( ProcessPath, path );
if ( -1 != pos && (Uint32)(pos + 1) < path.size() )
path = path.substr( pos + 1 );
if ( String::StartsWith( path, ProcessPath ) && ProcessPath.length() < path.size() ) {
path = path.substr( ProcessPath.length() );
}
}

View File

@@ -89,7 +89,7 @@ void TextureAtlasNew::OKClick( const UIEvent * Event ) {
if ( MouseEvent->Flags() & EE_BUTTON_LMASK ) {
std::string ext( mSaveFileType->Text() );
String::ToLower( ext );
String::ToLowerInPlace( ext );
UICommonDialog * TGDialog = mTheme->CreateCommonDialog( NULL, Sizei(), Vector2i(), UI_CONTROL_DEFAULT_FLAGS_CENTERED, UI_WIN_DEFAULT_FLAGS | UI_WIN_MAXIMIZE_BUTTON | UI_WIN_MODAL, Sizei(), 255, UI_CDL_DEFAULT_FLAGS | CDL_FLAG_SAVE_DIALOG, "*." + ext );
@@ -140,7 +140,7 @@ void TextureAtlasNew::TextureAtlasSave( const UIEvent * Event ) {
ext = mSaveFileType->Text();
String::ToLower( ext );
String::ToLowerInPlace( ext );
FPath += "." + ext;
}

View File

@@ -282,7 +282,7 @@ WindowSettings Engine::CreateWindowSettings( IniFile * ini, std::string iniKeyNa
std::string Backend = ini->GetValue( iniKeyName, "Backend", "" );
Uint32 WinBackend = GetDefaultBackend();
String::ToLower( Backend );
String::ToLowerInPlace( Backend );
if ( "sdl2" == Backend ) WinBackend = WindowBackend::SDL2;
else if ( "sdl" == Backend ) WinBackend = WindowBackend::SDL;
@@ -325,7 +325,7 @@ ContextSettings Engine::CreateContextSettings( IniFile * ini, std::string iniKey
bool VSync = ini->GetValueB( iniKeyName, "VSync", true );
std::string GLVersion = ini->GetValue( iniKeyName, "GLVersion", "0" );
String::ToLower( GLVersion );
String::ToLowerInPlace( GLVersion );
EEGL_version GLVer;
if ( "3" == GLVersion || "opengl 3" == GLVersion || "gl3" == GLVersion || "opengl3" == GLVersion ) GLVer = GLv_3;

View File

@@ -241,7 +241,7 @@ EE_MAIN_FUNC int main (int argc, char * argv [])
/// Since fixed-pipeline OpenGL use gl_FrontColor for glColorPointer, we need to replace the color attribute
/// This is all to show how it works, in a real world scenario, you will choose to work fixed-pipeline or programmable-pipeline.
if ( GLi->Version() == GLv_2 ) {
String::ReplaceSubStr( fs, "gl_FragColor = dgl_Color", "gl_FragColor = gl_FrontColor" );
String::ReplaceAll( fs, "gl_FragColor = dgl_Color", "gl_FragColor = gl_FrontColor" );
}
/// Create the new shader program