diff options
| author | Stefan Boberg <[email protected]> | 2021-10-19 22:27:19 +0200 |
|---|---|---|
| committer | Stefan Boberg <[email protected]> | 2021-10-19 22:27:19 +0200 |
| commit | d5ec07a2ab50185b0e33e14da87cf54e8e7cd962 (patch) | |
| tree | 6ba4acb74ee4785b3487952c44eba5a5e7a9180e /zencore | |
| parent | Some gc interface stubs (diff) | |
| parent | cas: Factored out OpenOrCreateManifest (diff) | |
| download | zen-d5ec07a2ab50185b0e33e14da87cf54e8e7cd962.tar.xz zen-d5ec07a2ab50185b0e33e14da87cf54e8e7cd962.zip | |
Merge branch 'gc' of https://github.com/EpicGames/zen into gc
Diffstat (limited to 'zencore')
| -rw-r--r-- | zencore/compactbinary.cpp | 91 | ||||
| -rw-r--r-- | zencore/include/zencore/compactbinary.h | 2 | ||||
| -rw-r--r-- | zencore/include/zencore/iobuffer.h | 3 | ||||
| -rw-r--r-- | zencore/include/zencore/string.h | 4 | ||||
| -rw-r--r-- | zencore/string.cpp | 6 |
5 files changed, 80 insertions, 26 deletions
diff --git a/zencore/compactbinary.cpp b/zencore/compactbinary.cpp index c4694733c..aafb365f3 100644 --- a/zencore/compactbinary.cpp +++ b/zencore/compactbinary.cpp @@ -16,6 +16,10 @@ #include <fmt/format.h> #include <string_view> +#if ZEN_PLATFORM_WINDOWS +# include <zencore/windows.h> +#endif + #if ZEN_WITH_TESTS # include <json11.hpp> # include <zencore/compactbinarybuilder.h> @@ -42,6 +46,18 @@ IsLeapYear(int Year) return false; } +DateTime +DateTime::Now() +{ +#if ZEN_PLATFORM_WINDOWS + FILETIME SysTime; + GetSystemTimeAsFileTime(&SysTime); + return DateTime{504911232000000000ull + (uint64_t(SysTime.dwHighDateTime) << 32) | SysTime.dwLowDateTime}; +#else +# error Needs implementation +#endif +} + void DateTime::Set(int Year, int Month, int Day, int Hour, int Minute, int Second, int MilliSecond) { @@ -96,31 +112,31 @@ TimeSpan::ToString(const char* Format) const switch (*Format) { case 'd': - Result.Append("%i"_format(GetDays())); + Result.Append("{}"_format(GetDays())); break; case 'D': - Result.Append("%08i"_format(GetDays())); + Result.Append("{:08}"_format(GetDays())); break; case 'h': - Result.Append("%02i"_format(GetHours())); + Result.Append("{:02}"_format(GetHours())); break; case 'm': - Result.Append("%02i"_format(GetMinutes())); + Result.Append("{:02}"_format(GetMinutes())); break; case 's': - Result.Append("%02i"_format(GetSeconds())); + Result.Append("{:02}"_format(GetSeconds())); break; case 'f': - Result.Append("%03i"_format(GetFractionMilli())); + Result.Append("{:03}"_format(GetFractionMilli())); break; case 'u': - Result.Append("%06i"_format(GetFractionMicro())); + Result.Append("{:06}"_format(GetFractionMicro())); break; case 't': - Result.Append("%07i"_format(GetFractionTicks())); + Result.Append("{:07}"_format(GetFractionTicks())); break; case 'n': - Result.Append("%09i"_format(GetFractionNano())); + Result.Append("{:09}"_format(GetFractionNano())); break; default: Result.Append(*Format); @@ -247,8 +263,8 @@ DateTime::ToString(const char* Format) const { using namespace fmt::literals; - StringBuilder<32> Result; - int Year, Month, Day; + ExtendableStringBuilder<32> Result; + int Year, Month, Day; GetDate(Year, Month, Day); @@ -263,32 +279,32 @@ DateTime::ToString(const char* Format) const // case 'a': Result.Append(IsMorning() ? TEXT("am") : TEXT("pm")); break; // case 'A': Result.Append(IsMorning() ? TEXT("AM") : TEXT("PM")); break; case 'd': - Result.Append("%02i"_format(Day)); + Result.Append("{:02}"_format(Day)); break; // case 'D': Result.Appendf(TEXT("%03i"), GetDayOfYear()); break; case 'm': - Result.Append("%02i"_format(Month)); + Result.Append("{:02}"_format(Month)); break; case 'y': - Result.Append("%02i"_format(Year % 100)); + Result.Append("{:02}"_format(Year % 100)); break; case 'Y': - Result.Append("%04i"_format(Year % 100)); + Result.Append("{:04}"_format(Year)); break; case 'h': - Result.Append("%02i"_format(GetHour12())); + Result.Append("{:02}"_format(GetHour12())); break; case 'H': - Result.Append("%02i"_format(GetHour())); + Result.Append("{:02}"_format(GetHour())); break; case 'M': - Result.Append("%02i"_format(GetMinute())); + Result.Append("{:02}"_format(GetMinute())); break; case 'S': - Result.Append("%02i"_format(GetSecond())); + Result.Append("{:02}"_format(GetSecond())); break; case 's': - Result.Append("%03i"_format(GetMillisecond())); + Result.Append("{:03}"_format(GetMillisecond())); break; default: Result.Append(*Format); @@ -1659,10 +1675,10 @@ private: } private: - StringBuilderBase& Builder; - StringBuilder<32> NewLineAndIndent; - bool NeedsComma{false}; - bool NeedsNewLine{false}; + StringBuilderBase& Builder; + ExtendableStringBuilder<32> NewLineAndIndent; + bool NeedsComma{false}; + bool NeedsNewLine{false}; }; void @@ -1902,6 +1918,33 @@ TEST_CASE("uson.json") CHECK(DoubleValue == 0); } } + +TEST_CASE("uson.datetime") +{ + using namespace std::literals; + + { + DateTime D1600(1601, 1, 1); + CHECK_EQ(D1600.GetYear(), 1601); + CHECK_EQ(D1600.GetMonth(), 1); + CHECK_EQ(D1600.GetDay(), 1); + CHECK_EQ(D1600.GetHour(), 0); + CHECK_EQ(D1600.GetMinute(), 0); + CHECK_EQ(D1600.GetSecond(), 0); + + CHECK_EQ(D1600.ToIso8601(), "1601-01-01T00:00:00.000Z"sv); + } + + { + DateTime D72(1972, 2, 23, 17, 30, 10); + CHECK_EQ(D72.GetYear(), 1972); + CHECK_EQ(D72.GetMonth(), 2); + CHECK_EQ(D72.GetDay(), 23); + CHECK_EQ(D72.GetHour(), 17); + CHECK_EQ(D72.GetMinute(), 30); + CHECK_EQ(D72.GetSecond(), 10); + } +} #endif } // namespace zen diff --git a/zencore/include/zencore/compactbinary.h b/zencore/include/zencore/compactbinary.h index ab01402f8..06331c510 100644 --- a/zencore/include/zencore/compactbinary.h +++ b/zencore/include/zencore/compactbinary.h @@ -43,6 +43,8 @@ public: inline uint64_t GetTicks() const { return Ticks; } + static DateTime Now(); + int GetYear() const; int GetMonth() const; int GetDay() const; diff --git a/zencore/include/zencore/iobuffer.h b/zencore/include/zencore/iobuffer.h index db462e238..8679511c9 100644 --- a/zencore/include/zencore/iobuffer.h +++ b/zencore/include/zencore/iobuffer.h @@ -357,6 +357,9 @@ public: [[nodiscard]] inline ZenContentType GetContentType() const { return m_Core->GetContentType(); } [[nodiscard]] ZENCORE_API bool GetFileReference(IoBufferFileReference& OutRef) const; + template<typename T> + [[nodiscard]] const T* Data() const { return reinterpret_cast<const T*>(m_Core->DataPointer()); } + private: RefPtr<IoBufferCore> m_Core = new IoBufferCore; diff --git a/zencore/include/zencore/string.h b/zencore/include/zencore/string.h index a94e063a4..630341056 100644 --- a/zencore/include/zencore/string.h +++ b/zencore/include/zencore/string.h @@ -632,7 +632,7 @@ HashStringAsLowerDjb2(const std::string_view& InString) { uint32_t HashValue = 5381; - for (int CurChar : InString) + for (uint8_t CurChar : InString) { CurChar -= ((CurChar - 'A') <= ('Z' - 'A')) * ('A' - 'a'); // this should be compiled into branchless logic HashValue = HashValue * 33 + CurChar; @@ -650,7 +650,7 @@ ToLower(const std::string_view& InString) for (char& CurChar : Out) { - CurChar -= ((CurChar - 'A') <= ('Z' - 'A')) * ('A' - 'a'); // this should be compiled into branchless logic + CurChar -= (uint8_t(CurChar - 'A') <= ('Z' - 'A')) * ('A' - 'a'); // this should be compiled into branchless logic } return Out; diff --git a/zencore/string.cpp b/zencore/string.cpp index 8e7921bb6..43381aa5d 100644 --- a/zencore/string.cpp +++ b/zencore/string.cpp @@ -936,6 +936,12 @@ TEST_CASE("string") CHECK(HashStringAsLowerDjb2("aBCd"sv) == HashStringDjb2(ToLower("aBCd"sv))); } + SUBCASE("tolower") + { + CHECK_EQ(ToLower("te!st"sv), "te!st"sv); + CHECK_EQ(ToLower("TE%St"sv), "te%st"sv); + } + SUBCASE("ForEachStrTok") { const auto Tokens = "here,is,my,different,tokens"sv; |