Сделал реализацию find через memmem для GCC, упростил функцию load_from_file

This commit is contained in:
Selim Mustafaev 2013-10-12 15:48:08 +04:00
parent 0d6e6e7333
commit 23f2e7f927
4 changed files with 14 additions and 21 deletions

1
.gitignore vendored
View File

@ -1,3 +1,4 @@
bin/ bin/
lib/ lib/
CMakeLists.txt.user

View File

@ -6,7 +6,7 @@ if(WIN32)
set(CMAKE_CXX_FLAGS " /D _VARIADIC_MAX=10") set(CMAKE_CXX_FLAGS " /D _VARIADIC_MAX=10")
else() else()
set(CMAKE_CXX_FLAGS "-std=c++11") set(CMAKE_CXX_FLAGS "-std=c++11")
set(CMAKE_CXX_FLAGS_DEBUG "-O0") set(CMAKE_CXX_FLAGS_DEBUG "-g -O0")
set(CMAKE_CXX_FLAGS_RELEASE "-O2") set(CMAKE_CXX_FLAGS_RELEASE "-O2")
endif() endif()

View File

@ -377,11 +377,18 @@ std::size_t ustring::find(char32_t symbol, std::size_t pos /* = 0 */) const
*/ */
std::size_t ustring::find(const ustring& str, std::size_t pos /* = 0 */) const std::size_t ustring::find(const ustring& str, std::size_t pos /* = 0 */) const
{ {
if(str.length() > _len) if(str.length() > (_len - pos))
{ {
return npos; return npos;
} }
#ifdef __GNUC__
char32_t* fpos = reinterpret_cast<char32_t*>(memmem(_pData + pos, (_len - pos)*sizeof(char32_t), str._pData, str._len*sizeof(char32_t)));
if(fpos)
{
return (fpos - _pData);
}
#else
const char32_t* pStr = str._pData; const char32_t* pStr = str._pData;
const std::size_t len = _len - str.length(); const std::size_t len = _len - str.length();
for(std::size_t i = pos; i <= len; ++i) for(std::size_t i = pos; i <= len; ++i)
@ -394,6 +401,7 @@ std::size_t ustring::find(const ustring& str, std::size_t pos /* = 0 */) const
} }
} }
} }
#endif
return npos; return npos;
} }
@ -407,7 +415,6 @@ std::size_t ustring::find(const ustring& str, std::size_t pos /* = 0 */) const
std::size_t ustring::load_from_file( const ustring& fileName, encoding enc ) // TODO: this terrible function needs refactoring std::size_t ustring::load_from_file( const ustring& fileName, encoding enc ) // TODO: this terrible function needs refactoring
{ {
std::ifstream file; std::ifstream file;
std::size_t symbolTypeSize = 0;
#ifdef WIN32 #ifdef WIN32
file.open(fileName.utf16_str(), std::ios::binary); file.open(fileName.utf16_str(), std::ios::binary);
@ -420,24 +427,9 @@ std::size_t ustring::load_from_file( const ustring& fileName, encoding enc ) //
std::size_t fileLength = static_cast<std::size_t>(file.tellg()); std::size_t fileLength = static_cast<std::size_t>(file.tellg());
file.seekg(0, std::ios::beg); file.seekg(0, std::ios::beg);
switch(enc) char* fileData = new char[fileLength + sizeof(char32_t)];
{
case ustring::UTF8:
symbolTypeSize = sizeof(char);
break;
case ustring::UTF16LE:
symbolTypeSize = sizeof(char16_t);
break;
case ustring::UTF32LE:
symbolTypeSize = sizeof(char32_t);
break;
default:
break;
}
char* fileData = new char[fileLength + symbolTypeSize];
file.read(fileData, fileLength); file.read(fileData, fileLength);
std::memset(fileData + fileLength, 0, symbolTypeSize); std::memset(fileData + fileLength, 0, sizeof(char32_t));
switch(enc) switch(enc)
{ {