diff --git a/core/Common/Image.cpp b/core/Common/Image.cpp index 9f8c3b56..b7f33899 100644 --- a/core/Common/Image.cpp +++ b/core/Common/Image.cpp @@ -41,7 +41,7 @@ void e2d::Image::loadFrom(const String & strFilePath) return; } - m_pBitmap = s_mBitmapsFromFile.at(strFilePath.hash()); + m_pBitmap = s_mBitmapsFromFile.at(strFilePath.getHash()); m_fSourceClipX = m_fSourceClipY = 0; m_fSourceClipWidth = m_pBitmap->GetSize().width; m_fSourceClipHeight = m_pBitmap->GetSize().height; @@ -132,7 +132,7 @@ e2d::Point e2d::Image::getClipPos() const bool e2d::Image::preload(const String & fileName) { - if (s_mBitmapsFromFile.find(fileName.hash()) != s_mBitmapsFromFile.end()) + if (s_mBitmapsFromFile.find(fileName.getHash()) != s_mBitmapsFromFile.end()) { return true; } @@ -192,7 +192,7 @@ bool e2d::Image::preload(const String & fileName) // 保存图片指针和图片的 Hash 名 s_mBitmapsFromFile.insert( std::map::value_type( - fileName.hash(), + fileName.getHash(), pBitmap) ); } diff --git a/core/Common/String.cpp b/core/Common/String.cpp index c872ff83..50c1aef4 100644 --- a/core/Common/String.cpp +++ b/core/Common/String.cpp @@ -1,148 +1,60 @@ #include "..\ecommon.h" #include -using namespace e2d; -String::String() +e2d::String::String() + : m_str(L"") { - _size = 0; - _string = new wchar_t[1]; - _string[0] = 0; } -e2d::String::String(const wchar_t ch) +e2d::String::String(const wchar_t *str) + : m_str(str) { - _size = 1; - _string = new wchar_t[2]; - _string[0] = ch; - _string[1] = 0; } -String::String(const wchar_t *str) +e2d::String::String(e2d::String && str) { - if (str) - { - _size = static_cast(wcslen(str)); - _string = new wchar_t[_size + 1]; - wcscpy_s(_string, _size + 1, str); - } - else - { - _size = 0; - _string = new wchar_t[1]; - _string[0] = 0; - } + m_str = std::move(str.m_str); } -String::String(String && str) +e2d::String::String(const e2d::String &str) + : m_str(str.m_str) { - _size = str._size; - _string = str._string; - str._string = nullptr; -} - -String::String(const String &str) -{ - if (str._size) - { - _size = str._size; - _string = new wchar_t[_size + 1]; - wcscpy_s(_string, _size + 1, str._string); - } - else - { - _size = 0; - _string = new wchar_t[1]; - _string[0] = 0; - } } e2d::String::String(const std::wstring &str) + : m_str(str) { - if (!str.empty()) - { - _size = static_cast(str.length()); - _string = new wchar_t[_size + 1]; - wcscpy_s(_string, _size + 1, str.c_str()); - } - else - { - _size = 0; - _string = new wchar_t[1]; - _string[0] = 0; - } } -String::~String() +e2d::String::~String() { - delete[] _string; + m_str.clear(); } -String &String::operator=(const wchar_t *str) +e2d::String &e2d::String::operator=(const wchar_t *str) { - if (_string == str) - return *this; - - if (str) - { - delete[] _string; - _size = static_cast(wcslen(str)); - _string = new wchar_t[_size + 1]; - wcscpy_s(_string, _size + 1, str); - } - else - { - _size = 0; - _string = new wchar_t[1]; - _string[0] = 0; - } + m_str = str; return *this; } -String &String::operator=(const String &str) +e2d::String & e2d::String::operator=(const String &str) { - if (_string == str._string) - return *this; - - if (str._size) - { - delete[] _string; - _size = str._size; - _string = new wchar_t[_size + 1]; - wcscpy_s(_string, _size + 1, str._string); - } - else - { - _size = 0; - _string = new wchar_t[1]; - _string[0] = 0; - } + m_str = str.m_str; return *this; } -String & e2d::String::operator=(const std::wstring &str) +e2d::String & e2d::String::operator=(const std::wstring &str) { - if (!str.empty()) - { - delete[] _string; - _size = static_cast(str.length()); - _string = new wchar_t[_size + 1]; - wcscpy_s(_string, _size + 1, str.c_str()); - } - else - { - _size = 0; - _string = new wchar_t[1]; - _string[0] = 0; - } + m_str = str; return *this; } -bool String::operator==(const wchar_t *str) +bool e2d::String::operator==(const wchar_t *str) { if (str) { - return (wcscmp(str, _string) == 0); + return (m_str.compare(str) == 0); } else { @@ -150,248 +62,227 @@ bool String::operator==(const wchar_t *str) } } -bool String::operator ==(const String &str) +bool e2d::String::operator ==(const e2d::String &str) { - return (wcscmp(str._string, _string) == 0); + return m_str == str.m_str; } bool e2d::String::operator==(const std::wstring &str) { - return (str.compare(_string) == 0); + return m_str == str; } bool e2d::String::operator!=(const wchar_t *str) { - return (wcscmp(str, _string) != 0); + if (str) + { + return (m_str.compare(str) != 0); + } + else + { + return true; + } } -bool e2d::String::operator!=(const String &str) +bool e2d::String::operator!=(const e2d::String &str) { - return (wcscmp(str._string, _string) != 0); + return m_str != str.m_str; } bool e2d::String::operator!=(const std::wstring &str) { - return (str.compare(_string) != 0); + return m_str != str; } -wchar_t &String::operator[](int index) +wchar_t &e2d::String::operator[](int index) { - ASSERT(index >= 0 && index < _size, "String subscript out of range"); - return _string[index]; + return m_str[static_cast(index)]; } -String String::operator+(const wchar_t *str) +e2d::String e2d::String::operator+(const wchar_t *str) { - String str_temp(*this); - - str_temp += str; - return std::move(str_temp); + String temp; + temp.m_str = m_str + str; + return std::move(temp); } -String String::operator+(const wchar_t x) +e2d::String e2d::String::operator+(const wchar_t x) { - String str_temp(*this); - - str_temp += x; - return std::move(str_temp); + String temp; + temp.m_str = m_str + x; + return std::move(temp); } -String String::operator+(const String &str) +e2d::String e2d::String::operator+(const e2d::String &str) { - String str_temp(*this); - - str_temp += str; - return std::move(str_temp); + String temp; + temp.m_str = m_str + str.m_str; + return std::move(temp); } -String e2d::String::operator+(const std::wstring &str) +e2d::String e2d::String::operator+(const std::wstring &str) { - String str_temp(*this); - - str_temp += str; - return std::move(str_temp); + String temp; + temp.m_str = m_str + str; + return std::move(temp); } -String &String::operator+=(const wchar_t x) +e2d::String e2d::operator+(const wchar_t ch, const e2d::String &str) { - wchar_t *str_temp = new wchar_t[_size + 2]; - if (_string) wcscpy_s(str_temp, _size + 2, _string); - str_temp[_size] = x; - str_temp[_size + 1] = 0; + String temp; + temp.m_str = ch + str.m_str; + return std::move(temp); +} - delete[] _string; - _string = str_temp; - _size++; +e2d::String e2d::operator+(const wchar_t *str1, const e2d::String &str2) +{ + String temp; + temp.m_str = str1 + str2.m_str; + return std::move(temp); +} + +e2d::String e2d::operator+(const std::wstring &str1, const e2d::String &str2) +{ + String temp; + temp.m_str = str1 + str2.m_str; + return std::move(temp); +} + +e2d::String &e2d::String::operator+=(const wchar_t x) +{ + m_str += x; return *this; } -String &String::operator+=(const wchar_t *str) +e2d::String &e2d::String::operator+=(const wchar_t *str) { - if (!str) return *this; - - int d_size = static_cast(wcslen(str)); - if (d_size == 0) return *this; - - wchar_t *str_temp = new wchar_t[_size + d_size + 1]; - if (_string) wcscpy_s(str_temp, _size + d_size + 1, _string); - wcscpy_s(str_temp + _size, d_size + 1, str); - - delete[] _string; - _string = str_temp; - _size += d_size; + m_str += str; return *this; } -String &String::operator+=(const String &str) +e2d::String &e2d::String::operator+=(const e2d::String &str) { - if (str._size == 0) return *this; - - wchar_t *str_temp = new wchar_t[_size + str._size + 1]; - if (_string) wcscpy_s(str_temp, _size + str._size + 1, _string); - wcscpy_s(str_temp + _size, str._size + 1, str._string); - - delete[] _string; - _string = str_temp; - _size += str._size; + m_str += str.m_str; return *this; } -String & e2d::String::operator+=(const std::wstring &str) +e2d::String & e2d::String::operator+=(const std::wstring &str) { - if (str.length() == 0) return *this; - - wchar_t *str_temp = new wchar_t[_size + str.length() + 1]; - if (_string) wcscpy_s(str_temp, _size + str.length() + 1, _string); - wcscpy_s(str_temp + _size, str.length() + 1, str.c_str()); - - delete[] _string; - _string = str_temp; - _size += static_cast(str.length()); + m_str += str; return *this; } -bool e2d::String::operator<(String const &str) const +e2d::String::operator const wchar_t*() const { - for (int i = 0; i <= _size; i++) - if (_string[i] != str._string[i]) - return _string[i] < str[i]; - return false; + return m_str.c_str(); } -bool e2d::String::operator<=(String const &str) const +e2d::String::operator bool() const { - for (int i = 0; i <= _size; i++) - if (_string[i] != str._string[i]) - return _string[i] < str[i]; - return true; + return getLength() != 0; } -bool e2d::String::operator>(String const &str) const +bool e2d::String::isEmpty() const { - for (int i = 0; i <= _size; i++) - if (_string[i] != str._string[i]) - return _string[i] > str[i]; - return false; + return m_str.empty(); } -bool e2d::String::operator>=(String const &str) const +int e2d::String::getLength() const { - for (int i = 0; i <= _size; i++) - if (_string[i] != str._string[i]) - return _string[i] > str[i]; - return true; + return static_cast(m_str.size()); } -unsigned int e2d::String::hash() const +unsigned int e2d::String::getHash() const { unsigned int hash = 0; - for (int i = 0; i < _size; i++) + for (int i = 0; i < getLength(); i++) { hash *= 16777619; - hash ^= (unsigned int)towupper(_string[i]); + hash ^= (unsigned int)towupper(m_str[i]); } - return (hash); + return hash; } -String e2d::operator+(const wchar_t ch, const String &str) +std::wistream & e2d::operator>>(std::wistream &cin, e2d::String &str) { - return std::move((String(ch) + str)); -} - -String e2d::operator+(const wchar_t *str1, const String &str2) -{ - return std::move((String(str1) + str2)); -} - -String e2d::operator+(const String &str1, const String &str2) -{ - return std::move((String(str1) + str2)); -} - -String e2d::operator+(const std::wstring &str1, const String &str2) -{ - return std::move((String(str1) + str2)); -} - -std::wistream & e2d::operator>>(std::wistream &cin, String &str) -{ - const int limit_string_size = 4096; - - str._string = new wchar_t[limit_string_size]; - - cin >> std::setw(limit_string_size) >> str._string; - str._size = static_cast(wcslen(str._string)); + cin >> str.m_str; return cin; } - -String e2d::String::upper() const +e2d::String e2d::String::toUpper() const { String str(*this); - for (int i = 0; i < str._size; i++) - if (str._string[i] >= L'a' && str._string[i] <= L'z') - str._string[i] -= (L'a' - L'A'); + for (int i = 0; i < getLength(); i++) + str[i] = towupper(str[i]); return std::move(str); } -String e2d::String::lower() const +e2d::String e2d::String::toLower() const { - String str(*this); + e2d::String str(*this); - for (int i = 0; i < str._size; i++) - str._string[i] = towlower(str._string[i]); + for (int i = 0; i < getLength(); i++) + str[i] = towlower(str[i]); return std::move(str); } -String e2d::String::sub(int offset, int count) const +int e2d::String::toInt() const { - if (_size == 0 || offset >= _size) - return std::move(String()); + if (getLength() == 0) + { + return 0; + } + return _wtoi(m_str.c_str()); +} + +double e2d::String::toDouble() const +{ + if (getLength() == 0) + { + return 0.0; + } + return _wtof(m_str.c_str()); +} + +bool e2d::String::toBool() const +{ + if (getLength() == 0) + { + return false; + } + + if (m_str.compare(L"0") == 0 || m_str.compare(L"false") == 0) + { + return false; + } + return true; +} + +e2d::String e2d::String::subtract(int offset, int count) const +{ + String temp; + int length = getLength(); + + if (length == 0 || offset >= length) + return std::move(temp); offset = offset >= 0 ? offset : 0; - if (count < 0 || (offset + count) > _size) - count = _size - offset; + if (count < 0 || (offset + count) > length) + count = length - offset; - String str_temp; - str_temp._string = new wchar_t[count + 1]; - - for (int i = 0; i < count; i++) - str_temp._string[i] = (_string + offset)[i]; - str_temp._string[count] = 0; - - return std::move(str_temp); + temp.m_str = m_str.substr(offset, count); + return std::move(temp); } int e2d::String::findFirstOf(const wchar_t ch) const { - for (int i = 0; i < _size; i++) - if (_string[i] == ch) + for (int i = 0; i < getLength(); i++) + if (m_str[i] == ch) return i; return -1; @@ -401,24 +292,24 @@ int e2d::String::findLastOf(const wchar_t ch) const { int index = -1; - for (int i = 0; i < _size; i++) - if (_string[i] == ch) + for (int i = 0; i < getLength(); i++) + if (m_str[i] == ch) index = i; return index; } -String & e2d::String::append(const wchar_t ch) +e2d::String & e2d::String::append(const wchar_t ch) { return (*this) += ch; } -String & e2d::String::append(const wchar_t * str) +e2d::String & e2d::String::append(const wchar_t * str) { return (*this) += str; } -String & e2d::String::append(const String & str) +e2d::String & e2d::String::append(const e2d::String & str) { return (*this) += str; } diff --git a/core/Manager/MusicManager.cpp b/core/Manager/MusicManager.cpp index b9369dee..1758e993 100644 --- a/core/Manager/MusicManager.cpp +++ b/core/Manager/MusicManager.cpp @@ -24,7 +24,7 @@ bool e2d::MusicManager::add(const String & strFilePath) } else { - UINT nRet = strFilePath.hash(); + UINT nRet = strFilePath.getHash(); pPlayer = new Music(); if (pPlayer->_open(strFilePath)) @@ -45,7 +45,7 @@ e2d::Music * e2d::MusicManager::get(const String & strFilePath) if (strFilePath.isEmpty()) return nullptr; - UINT nRet = strFilePath.hash(); + UINT nRet = strFilePath.getHash(); if (getMusicList().end() != getMusicList().find(nRet)) return getMusicList()[nRet]; diff --git a/core/Node/Node.cpp b/core/Node/Node.cpp index 99089c44..ab16c376 100644 --- a/core/Node/Node.cpp +++ b/core/Node/Node.cpp @@ -604,7 +604,7 @@ e2d::Node * e2d::Node::getChild(const String & name) { WARN_IF(name.isEmpty(), "Invalid Node name."); - unsigned int hash = name.hash(); + unsigned int hash = name.getHash(); for (auto child : m_vChildren) { @@ -621,7 +621,7 @@ std::vector e2d::Node::getChildren(const String & name) WARN_IF(name.isEmpty(), "Invalid Node name."); - unsigned int hash = name.hash(); + unsigned int hash = name.getHash(); for (auto child : m_vChildren) if (child->m_nHashName == hash && child->m_sName == name) @@ -684,7 +684,7 @@ void e2d::Node::removeChildren(const String & childName) } // 计算名称 Hash 值 - unsigned int hash = childName.hash(); + unsigned int hash = childName.getHash(); size_t size = m_vChildren.size(); for (size_t i = 0; i < size; i++) @@ -839,7 +839,7 @@ void e2d::Node::setName(const String & name) // 保存节点名 m_sName = name; // 保存节点 Hash 名 - m_nHashName = name.hash(); + m_nHashName = name.getHash(); } } diff --git a/core/Node/Text.cpp b/core/Node/Text.cpp index 7c7eea91..034ca3c6 100644 --- a/core/Node/Text.cpp +++ b/core/Node/Text.cpp @@ -103,7 +103,7 @@ void e2d::Text::onRender() Renderer::getSolidColorBrush()->SetColor(D2D1::ColorF(m_pFont->m_Color, m_fDisplayOpacity)); Renderer::getRenderTarget()->DrawTextW( m_sText, - UINT32(m_sText.length()), + static_cast(m_sText.getLength()), m_pFont->_getTextFormat(), D2D1::RectF( 0, @@ -140,7 +140,7 @@ void e2d::Text::_initTextLayout() HRESULT hr = Renderer::getIDWriteFactory()->CreateTextLayout( m_sText, - UINT32(m_sText.length()), + static_cast(m_sText.getLength()), m_pFont->_getTextFormat(), m_bWordWrapping ? m_fWordWrappingWidth : 0, 0, diff --git a/core/Tool/Data.cpp b/core/Tool/Data.cpp index d095d184..679a8eef 100644 --- a/core/Tool/Data.cpp +++ b/core/Tool/Data.cpp @@ -3,12 +3,12 @@ void e2d::Data::saveInt(const String & key, int value) { - ::WritePrivateProfileString(L"Default", key, String::parse(value), File::getDefaultSavePath()); + ::WritePrivateProfileString(L"Default", key, String::toString(value), File::getDefaultSavePath()); } void e2d::Data::saveFloat(const String & key, float value) { - ::WritePrivateProfileString(L"Default", key, String::parse(value), File::getDefaultSavePath()); + ::WritePrivateProfileString(L"Default", key, String::toString(value), File::getDefaultSavePath()); } void e2d::Data::saveString(const String & key, const String & value) @@ -24,7 +24,7 @@ int e2d::Data::getInt(const String & key, int default) float e2d::Data::getFloat(const String & key, float default) { wchar_t temp[32] = { 0 }; - ::GetPrivateProfileString(L"Default", key, String::parse(default), temp, 31, File::getDefaultSavePath()); + ::GetPrivateProfileString(L"Default", key, String::toString(default), temp, 31, File::getDefaultSavePath()); return std::stof(temp); } diff --git a/core/Tool/File.cpp b/core/Tool/File.cpp index c1efe892..d5d576b7 100644 --- a/core/Tool/File.cpp +++ b/core/Tool/File.cpp @@ -69,9 +69,9 @@ e2d::String e2d::File::getFileExtension(const String & filePath) if (pos != -1) { // 截取扩展名 - fileExtension = filePath.sub(pos, filePath.length()); + fileExtension = filePath.subtract(pos); // 转换为小写字母 - fileExtension = fileExtension.lower(); + fileExtension = fileExtension.toLower(); } return fileExtension; diff --git a/core/Tool/Music.cpp b/core/Tool/Music.cpp index 995f3a5e..048a504b 100644 --- a/core/Tool/Music.cpp +++ b/core/Tool/Music.cpp @@ -40,7 +40,7 @@ Music::~Music() _close(); } -bool Music::_open(LPWSTR strFileName) +bool Music::_open(LPCWSTR strFileName) { if (m_bOpened) { diff --git a/core/ecommon.h b/core/ecommon.h index 1f796799..5252f74b 100644 --- a/core/ecommon.h +++ b/core/ecommon.h @@ -92,7 +92,6 @@ class String { public: String(); - String(const wchar_t); String(const wchar_t *); String(const String &); String(const std::wstring &); @@ -100,87 +99,55 @@ public: ~String(); - String& operator=(const wchar_t *); - String& operator=(const String &); - String& operator=(const std::wstring &); + String& operator= (const wchar_t *); + String& operator= (const String &); + String& operator= (const std::wstring &); - bool operator==(const wchar_t *); - bool operator==(const String &); - bool operator==(const std::wstring &); + bool operator== (const wchar_t *); + bool operator== (const String &); + bool operator== (const std::wstring &); - bool operator!=(const wchar_t *); - bool operator!=(const String &); - bool operator!=(const std::wstring &); + bool operator!= (const wchar_t *); + bool operator!= (const String &); + bool operator!= (const std::wstring &); - wchar_t &operator[](int); + wchar_t &operator[] (int); - String operator+(const wchar_t); - String operator+(const wchar_t *); - String operator+(const String &); - String operator+(const std::wstring &); + String operator+ (const wchar_t); + String operator+ (const wchar_t *); + String operator+ (const String &); + String operator+ (const std::wstring &); + + friend String operator+ (const wchar_t, const String &); + friend String operator+ (const wchar_t*, const String &); + friend String operator+ (const std::wstring &, const String &); + + String& operator+= (const wchar_t); + String& operator+= (const wchar_t *); + String& operator+= (const String &); + String& operator+= (const std::wstring &); template - String operator+(const T value) - { - String str_temp(*this); - - str_temp += value; - return std::move(str_temp); - } - - String &operator +=(const wchar_t); - String &operator +=(const wchar_t *); - String &operator +=(const String &); - String &operator +=(const std::wstring &); - - template - String &operator +=(const T value) + String& operator<< (const T value) { std::wostringstream ss; ss << value; return (*this) += ss.str(); } - bool operator < (String const&) const; - bool operator <= (String const&) const; - bool operator > (String const&) const; - bool operator >= (String const&) const; + operator const wchar_t* () const; + operator bool () const; - operator wchar_t*() const { return _string; } - operator bool() const { return _size != 0; } - - friend String operator+(const wchar_t, const String &); - friend String operator+(const wchar_t*, const String &); - friend String operator+(const String &, const String &); - friend String operator+(const std::wstring &, const String &); - template - friend String operator+(const T &value, const String &str) - { - return std::move((String::parse(value) + str2)); - } - - friend std::wistream &operator>>(std::wistream &, String &); + friend std::wistream& operator>> (std::wistream &, String &); // 判断字符串是否为空 - bool isEmpty() const { return _size == 0; } + bool isEmpty() const; // 获取字符串长度 - int length() const { return _size; } + int getLength() const; - // 获取大写字符串 - String upper() const; - - // 获取小写字符串 - String lower() const; - - // 获取裁剪字符串 - String sub(int offset, int count = -1) const; - - // 获取字符串中第一个特定字符的下标 - int findFirstOf(const wchar_t ch) const; - - // 获取字符串中最后一个特定字符的下标 - int findLastOf(const wchar_t ch) const; + // 获取该字符串的散列值 + unsigned int getHash() const; // 后接字符 String &append(const wchar_t ch); @@ -198,25 +165,41 @@ public: return (*this) += value; } - // 获取该字符串的散列值 - unsigned int hash() const; + // 获取裁剪字符串 + String subtract(int offset, int count = -1) const; - // 将模板类型转化为字符串 + // 获取字符串中第一个特定字符的下标 + int findFirstOf(const wchar_t ch) const; + + // 获取字符串中最后一个特定字符的下标 + int findLastOf(const wchar_t ch) const; + + // 获取大写字符串 + String toUpper() const; + + // 获取小写字符串 + String toLower() const; + + // 将字符串转化为 int 型 + int toInt() const; + + // 将字符串转化为 double 型 + double toDouble() const; + + // 将字符串转化为 bool 型 + bool toBool() const; + + // 将任意类型转化为字符串 template - static String parse(const T value) + static String toString(const T value) { - String str; - std::wostringstream ss; ss << value; - str += ss.str(); - - return std::move(str); + return ss.str(); } private: - wchar_t *_string; - int _size; + std::wstring m_str; }; diff --git a/core/etools.h b/core/etools.h index 94275294..4dd8f04a 100644 --- a/core/etools.h +++ b/core/etools.h @@ -252,7 +252,7 @@ protected: virtual ~Music(); - bool _open(LPWSTR strFileName); + bool _open(LPCWSTR strFileName); void _close();