Сделал реализацию 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/
|
bin/
|
||||||
lib/
|
lib/
|
||||||
|
CMakeLists.txt.user
|
||||||
|
|
||||||
|
|||||||
@ -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()
|
||||||
|
|
||||||
|
|||||||
@ -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)
|
||||||
{
|
{
|
||||||
|
|||||||
@ -437,7 +437,7 @@ TEST(Ustring, find_symbol)
|
|||||||
|
|
||||||
TEST(Ustring, find_string)
|
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(13, str.find("asdf"));
|
||||||
EXPECT_EQ(25, str.find("asdf", 14));
|
EXPECT_EQ(25, str.find("asdf", 14));
|
||||||
}
|
}
|
||||||
|
|||||||
Loading…
Reference in New Issue
Block a user