Сделал реализацию find через memmem для GCC, упростил функцию load_from_file
This commit is contained in:
parent
0d6e6e7333
commit
23f2e7f927
1
.gitignore
vendored
1
.gitignore
vendored
@ -1,3 +1,4 @@
|
||||
bin/
|
||||
lib/
|
||||
CMakeLists.txt.user
|
||||
|
||||
|
||||
@ -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()
|
||||
|
||||
|
||||
@ -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)
|
||||
{
|
||||
|
||||
@ -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));
|
||||
}
|
||||
|
||||
Loading…
Reference in New Issue
Block a user