diff options
Diffstat (limited to 'core/fxcrt')
-rw-r--r-- | core/fxcrt/bytestring.cpp | 92 | ||||
-rw-r--r-- | core/fxcrt/bytestring.h | 11 | ||||
-rw-r--r-- | core/fxcrt/bytestring_unittest.cpp | 68 |
3 files changed, 66 insertions, 105 deletions
diff --git a/core/fxcrt/bytestring.cpp b/core/fxcrt/bytestring.cpp index ad3814b57e..e868678c9f 100644 --- a/core/fxcrt/bytestring.cpp +++ b/core/fxcrt/bytestring.cpp @@ -91,6 +91,57 @@ namespace fxcrt { static_assert(sizeof(ByteString) <= sizeof(char*), "Strings must not require more space than pointers"); +#define FORCE_ANSI 0x10000 +#define FORCE_UNICODE 0x20000 +#define FORCE_INT64 0x40000 + +// static +ByteString ByteString::FormatInteger(int i) { + char buf[32]; + FXSYS_snprintf(buf, 32, "%d", i); + return ByteString(buf); +} + +// static +ByteString ByteString::FormatFloat(float d) { + char buf[32]; + return ByteString(buf, FX_ftoa(d, buf)); +} + +// static +ByteString ByteString::FormatV(const char* pFormat, va_list argList) { + va_list argListCopy; + va_copy(argListCopy, argList); + int nMaxLen = vsnprintf(nullptr, 0, pFormat, argListCopy); + va_end(argListCopy); + + if (nMaxLen <= 0) + return ""; + + ByteString ret; + char* buf = ret.GetBuffer(nMaxLen); + if (buf) { + // In the following two calls, there's always space in the buffer for + // a terminating NUL that's not included in nMaxLen. + memset(buf, 0, nMaxLen + 1); + va_copy(argListCopy, argList); + vsnprintf(buf, nMaxLen + 1, pFormat, argListCopy); + va_end(argListCopy); + ret.ReleaseBuffer(ret.GetStringLength()); + } + return ret; +} + +// static +ByteString ByteString::Format(const char* pFormat, ...) { + va_list argList; + va_start(argList, pFormat); + ByteString ret = FormatV(pFormat, argList); + va_end(argList); + + return ret; +} + ByteString::ByteString(const char* pStr, size_t nLen) { if (nLen) m_pData.Reset(StringData::Create(pStr, nLen)); @@ -485,42 +536,6 @@ void ByteString::AllocCopy(ByteString& dest, dest.m_pData.Swap(pNewData); } -#define FORCE_ANSI 0x10000 -#define FORCE_UNICODE 0x20000 -#define FORCE_INT64 0x40000 - -ByteString ByteString::FormatInteger(int i) { - char buf[32]; - FXSYS_snprintf(buf, 32, "%d", i); - return ByteString(buf); -} - -void ByteString::FormatV(const char* pFormat, va_list argList) { - va_list argListCopy; - va_copy(argListCopy, argList); - int nMaxLen = vsnprintf(nullptr, 0, pFormat, argListCopy); - va_end(argListCopy); - if (nMaxLen > 0) { - GetBuffer(nMaxLen); - if (m_pData) { - // In the following two calls, there's always space in the buffer for - // a terminating NUL that's not included in nMaxLen. - memset(m_pData->m_String, 0, nMaxLen + 1); - va_copy(argListCopy, argList); - vsnprintf(m_pData->m_String, nMaxLen + 1, pFormat, argListCopy); - va_end(argListCopy); - ReleaseBuffer(GetStringLength()); - } - } -} - -void ByteString::Format(const char* pFormat, ...) { - va_list argList; - va_start(argList, pFormat); - FormatV(pFormat, argList); - va_end(argList); -} - void ByteString::SetAt(size_t index, char c) { ASSERT(IsValidIndex(index)); ReallocBeforeWrite(m_pData->m_nDataLength); @@ -783,11 +798,6 @@ void ByteString::TrimLeft() { TrimLeft("\x09\x0a\x0b\x0c\x0d\x20"); } -ByteString ByteString::FormatFloat(float d) { - char buf[32]; - return ByteString(buf, FX_ftoa(d, buf)); -} - std::ostream& operator<<(std::ostream& os, const ByteString& str) { return os.write(str.c_str(), str.GetLength()); } diff --git a/core/fxcrt/bytestring.h b/core/fxcrt/bytestring.h index f534b08b8a..1acece3aee 100644 --- a/core/fxcrt/bytestring.h +++ b/core/fxcrt/bytestring.h @@ -32,6 +32,11 @@ class ByteString { using const_iterator = const CharType*; using const_reverse_iterator = std::reverse_iterator<const_iterator>; + static ByteString FormatInteger(int i); + static ByteString FormatFloat(float f); + static ByteString Format(const char* lpszFormat, ...); + static ByteString FormatV(const char* lpszFormat, va_list argList); + ByteString(); ByteString(const ByteString& other); ByteString(ByteString&& other) noexcept; @@ -138,9 +143,6 @@ class ByteString { size_t InsertAtBack(char ch) { return Insert(GetLength(), ch); } size_t Delete(size_t index, size_t count = 1); - void Format(const char* lpszFormat, ...); - void FormatV(const char* lpszFormat, va_list argList); - void Reserve(size_t len); char* GetBuffer(size_t len); void ReleaseBuffer(size_t len); @@ -181,9 +183,6 @@ class ByteString { uint32_t GetID() const { return AsStringView().GetID(); } - static ByteString FormatInteger(int i); - static ByteString FormatFloat(float f); - protected: using StringData = StringDataTemplate<char>; diff --git a/core/fxcrt/bytestring_unittest.cpp b/core/fxcrt/bytestring_unittest.cpp index 4668fe1cc8..08c0e9211c 100644 --- a/core/fxcrt/bytestring_unittest.cpp +++ b/core/fxcrt/bytestring_unittest.cpp @@ -1448,67 +1448,19 @@ TEST(ByteStringView, AnyAllNoneOf) { } TEST(ByteString, FormatWidth) { - { - ByteString str; - str.Format("%5d", 1); - EXPECT_EQ(" 1", str); - } - - { - ByteString str; - str.Format("%d", 1); - EXPECT_EQ("1", str); - } - - { - ByteString str; - str.Format("%*d", 5, 1); - EXPECT_EQ(" 1", str); - } - - { - ByteString str; - str.Format("%-1d", 1); - EXPECT_EQ("1", str); - } - - { - ByteString str; - str.Format("%0d", 1); - EXPECT_EQ("1", str); - } + EXPECT_EQ(" 1", ByteString::Format("%5d", 1)); + EXPECT_EQ("1", ByteString::Format("%d", 1)); + EXPECT_EQ(" 1", ByteString::Format("%*d", 5, 1)); + EXPECT_EQ("1", ByteString::Format("%-1d", 1)); + EXPECT_EQ("1", ByteString::Format("%0d", 1)); } TEST(ByteString, FormatPrecision) { - { - ByteString str; - str.Format("%.2f", 1.12345); - EXPECT_EQ("1.12", str); - } - - { - ByteString str; - str.Format("%.*f", 3, 1.12345); - EXPECT_EQ("1.123", str); - } - - { - ByteString str; - str.Format("%f", 1.12345); - EXPECT_EQ("1.123450", str); - } - - { - ByteString str; - str.Format("%-1f", 1.12345); - EXPECT_EQ("1.123450", str); - } - - { - ByteString str; - str.Format("%0f", 1.12345); - EXPECT_EQ("1.123450", str); - } + EXPECT_EQ("1.12", ByteString::Format("%.2f", 1.12345)); + EXPECT_EQ("1.123", ByteString::Format("%.*f", 3, 1.12345)); + EXPECT_EQ("1.123450", ByteString::Format("%f", 1.12345)); + EXPECT_EQ("1.123450", ByteString::Format("%-1f", 1.12345)); + EXPECT_EQ("1.123450", ByteString::Format("%0f", 1.12345)); } TEST(ByteString, Empty) { |