aboutsummaryrefslogtreecommitdiff
path: root/zencore
diff options
context:
space:
mode:
authorStefan Boberg <[email protected]>2021-10-19 22:27:19 +0200
committerStefan Boberg <[email protected]>2021-10-19 22:27:19 +0200
commitd5ec07a2ab50185b0e33e14da87cf54e8e7cd962 (patch)
tree6ba4acb74ee4785b3487952c44eba5a5e7a9180e /zencore
parentSome gc interface stubs (diff)
parentcas: Factored out OpenOrCreateManifest (diff)
downloadzen-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.cpp91
-rw-r--r--zencore/include/zencore/compactbinary.h2
-rw-r--r--zencore/include/zencore/iobuffer.h3
-rw-r--r--zencore/include/zencore/string.h4
-rw-r--r--zencore/string.cpp6
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;