Сделал реализацию 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/
lib/
CMakeLists.txt.user

View File

@ -6,7 +6,7 @@ if(WIN32)
set(CMAKE_CXX_FLAGS " /D _VARIADIC_MAX=10")
else()
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")
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
{
if(str.length() > _len)
if(str.length() > (_len - pos))
{
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 std::size_t len = _len - str.length();
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;
}
@ -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::ifstream file;
std::size_t symbolTypeSize = 0;
#ifdef WIN32
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());
file.seekg(0, std::ios::beg);
switch(enc)
{
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];
char* fileData = new char[fileLength + sizeof(char32_t)];
file.read(fileData, fileLength);
std::memset(fileData + fileLength, 0, symbolTypeSize);
std::memset(fileData + fileLength, 0, sizeof(char32_t));
switch(enc)
{

View File

@ -437,7 +437,7 @@ TEST(Ustring, find_symbol)
TEST(Ustring, find_string)
{
ustring str = "Hello World! asdf qwerty asdf";
ustring str = "Hello World! asdf qwerty asdf";
EXPECT_EQ(13, str.find("asdf"));
EXPECT_EQ(25, str.find("asdf", 14));
}