123 lines
2.4 KiB
C++
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
|