Files
UnrealEngine/Engine/Source/Developer/Zen/Private/ZenVersion.cpp
2025-05-18 13:04:45 +08:00

123 lines
2.4 KiB
C++

// Copyright Epic Games, Inc. All Rights Reserved.
#include "ZenVersion.h"
#include "Containers/StringFwd.h"
#include "Misc/StringBuilder.h"
namespace UE::Zen
{
void FZenVersion::Reset()
{
MajorVersion = 0;
MinorVersion = 0;
PatchVersion = 0;
Details.Empty();
}
bool FZenVersion::TryParse(const TCHAR* InString)
{
Reset();
if (InString == nullptr)
{
return false;
}
const TCHAR* CurrentSegment = InString;
uint32 CurrentSegmentIndex;
for (CurrentSegmentIndex = 0; CurrentSegmentIndex < 3; ++CurrentSegmentIndex)
{
TCHAR* End = nullptr;
uint64 ParsedValue = FCString::Strtoui64(CurrentSegment, &End, 10);
if (End == CurrentSegment)
{
// A segment with zero parsable characters is an error
break;
}
switch (CurrentSegmentIndex)
{
case 0:
MajorVersion = (uint32)ParsedValue;
break;
case 1:
MinorVersion = (uint32)ParsedValue;
break;
case 2:
PatchVersion = (uint32)ParsedValue;
break;
}
if (*End != TCHAR('.'))
{
CurrentSegment = End;
if (*End == TCHAR('-'))
{
Details = End + 1;
CurrentSegment = End + 1 + Details.Len();
}
++CurrentSegmentIndex;
break;
}
CurrentSegment = End + 1;
}
// Successful parsing is determined by whether we managed to parse at least 1 numeric segment
// and we've parsed to the end of the given string. Details are optional.
return (CurrentSegmentIndex > 0) && (*CurrentSegment == TEXT('\0'));
}
FString FZenVersion::ToString(bool bDetailed) const
{
TStringBuilder<64> Builder;
Builder << MajorVersion;
Builder.AppendChar(TEXT('.'));
Builder << MinorVersion;
Builder.AppendChar(TEXT('.'));
Builder << PatchVersion;
if (bDetailed && !Details.IsEmpty())
{
Builder.AppendChar(TEXT('-'));
Builder << Details;
}
return FString(Builder);
}
bool FZenVersion::operator<(FZenVersion& Other) const
{
if (MajorVersion < Other.MajorVersion)
{
return true;
}
else if (MajorVersion == Other.MajorVersion)
{
if (MinorVersion < Other.MinorVersion)
{
return true;
}
else if (MinorVersion == Other.MinorVersion)
{
if (PatchVersion < Other.PatchVersion)
{
return true;
}
else if (PatchVersion == Other.PatchVersion)
{
return Details < Other.Details;
}
}
}
return false;
}
FZenVersion::operator bool() const
{
return MajorVersion != 0 ||
MinorVersion != 0 ||
PatchVersion != 0 ||
!Details.IsEmpty();
}
} // namespace UE::Zen