aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorStefan Boberg <[email protected]>2021-09-01 11:16:29 +0200
committerStefan Boberg <[email protected]>2021-09-01 11:16:29 +0200
commit9b56218bd354b46b157ecdefd3254fa8d5c3e94d (patch)
tree88a679f2e770b39e34eecb120460e2d43ab49c74
parentFixed a race in bucket open/create logic (diff)
downloadzen-9b56218bd354b46b157ecdefd3254fa8d5c3e94d.tar.xz
zen-9b56218bd354b46b157ecdefd3254fa8d5c3e94d.zip
CompactBinary: Added explicit operator bool for array and object types
p4 CL16069971
-rw-r--r--zencore/compactbinary.cpp27
-rw-r--r--zencore/compactbinarypackage.cpp6
-rw-r--r--zencore/compactbinaryvalidation.cpp2
-rw-r--r--zencore/include/zencore/compactbinary.h6
-rw-r--r--zencore/include/zencore/compactbinarypackage.h2
5 files changed, 29 insertions, 14 deletions
diff --git a/zencore/compactbinary.cpp b/zencore/compactbinary.cpp
index 065d6309b..5f3a60db9 100644
--- a/zencore/compactbinary.cpp
+++ b/zencore/compactbinary.cpp
@@ -65,7 +65,7 @@ TimeSpan::Set(int Days, int Hours, int Minutes, int Seconds, int FractionNano)
//////////////////////////////////////////////////////////////////////////
-namespace usonprivate {
+namespace CompactBinaryPrivate {
static constexpr const uint8_t GEmptyObjectPayload[] = {uint8_t(CbFieldType::Object), 0x00};
static constexpr const uint8_t GEmptyArrayPayload[] = {uint8_t(CbFieldType::Array), 0x01, 0x00};
@@ -81,7 +81,7 @@ namespace usonprivate {
return Value;
#endif
}
-} // namespace usonprivate
+} // namespace CompactBinaryPrivate
//////////////////////////////////////////////////////////////////////////
@@ -238,7 +238,7 @@ CbFieldView::AsFloat(const float Default)
case CbFieldType::Float32:
{
Error = CbFieldError::None;
- const uint32_t Value = FromNetworkOrder(usonprivate::ReadUnaligned<uint32_t>(Payload));
+ const uint32_t Value = FromNetworkOrder(CompactBinaryPrivate::ReadUnaligned<uint32_t>(Payload));
return reinterpret_cast<const float&>(Value);
}
case CbFieldType::Float64:
@@ -270,13 +270,13 @@ CbFieldView::AsDouble(const double Default)
case CbFieldType::Float32:
{
Error = CbFieldError::None;
- const uint32_t Value = FromNetworkOrder(usonprivate::ReadUnaligned<uint32_t>(Payload));
+ const uint32_t Value = FromNetworkOrder(CompactBinaryPrivate::ReadUnaligned<uint32_t>(Payload));
return reinterpret_cast<const float&>(Value);
}
case CbFieldType::Float64:
{
Error = CbFieldError::None;
- const uint64_t Value = FromNetworkOrder(usonprivate::ReadUnaligned<uint64_t>(Payload));
+ const uint64_t Value = FromNetworkOrder(CompactBinaryPrivate::ReadUnaligned<uint64_t>(Payload));
return reinterpret_cast<const double&>(Value);
}
default:
@@ -410,7 +410,7 @@ CbFieldView::AsDateTimeTicks(const int64_t Default)
if (CbFieldTypeOps::IsDateTime(Type))
{
Error = CbFieldError::None;
- return FromNetworkOrder(usonprivate::ReadUnaligned<int64_t>(Payload));
+ return FromNetworkOrder(CompactBinaryPrivate::ReadUnaligned<int64_t>(Payload));
}
else
{
@@ -437,7 +437,7 @@ CbFieldView::AsTimeSpanTicks(const int64_t Default)
if (CbFieldTypeOps::IsTimeSpan(Type))
{
Error = CbFieldError::None;
- return FromNetworkOrder(usonprivate::ReadUnaligned<int64_t>(Payload));
+ return FromNetworkOrder(CompactBinaryPrivate::ReadUnaligned<int64_t>(Payload));
}
else
{
@@ -574,7 +574,7 @@ CbFieldView::GetViewNoType() const
///////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
-CbArrayView::CbArrayView() : CbFieldView(usonprivate::GEmptyArrayPayload)
+CbArrayView::CbArrayView() : CbFieldView(CompactBinaryPrivate::GEmptyArrayPayload)
{
}
@@ -666,7 +666,7 @@ CbArrayView::CopyTo(BinaryWriter& Ar) const
///////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
-CbObjectView::CbObjectView() : CbFieldView(usonprivate::GEmptyObjectPayload)
+CbObjectView::CbObjectView() : CbFieldView(CompactBinaryPrivate::GEmptyObjectPayload)
{
}
@@ -721,6 +721,11 @@ CbObjectView::FindViewIgnoreCase(const std::string_view Name) const
return CbFieldView();
}
+CbObjectView::operator bool() const
+{
+ return GetSize() > sizeof(CompactBinaryPrivate::GEmptyObjectPayload);
+}
+
uint64_t
CbObjectView::GetSize() const
{
@@ -1240,6 +1245,10 @@ TEST_CASE("uson")
static_assert(!std::is_assignable<CbFieldView, const CbObjectView&>::value, "Invalid assignment for CbField");
static_assert(!std::is_convertible<CbFieldView, CbObjectView>::value, "Invalid conversion to CbObject");
static_assert(!std::is_assignable<CbObjectView, const CbFieldView&>::value, "Invalid assignment for CbObject");
+
+ static_assert(std::is_constructible<CbField>::value, "Missing constructor for CbField");
+ static_assert(std::is_constructible<CbField, const CbField&>::value, "Missing constructor for CbField");
+ static_assert(std::is_constructible<CbField, CbField&&>::value, "Missing constructor for CbField");
}
TEST_CASE("uson.null")
diff --git a/zencore/compactbinarypackage.cpp b/zencore/compactbinarypackage.cpp
index 074be79b3..2d89bd342 100644
--- a/zencore/compactbinarypackage.cpp
+++ b/zencore/compactbinarypackage.cpp
@@ -220,7 +220,7 @@ CbAttachment::Save(BinaryWriter& Writer) const
void
CbPackage::SetObject(CbObject InObject, const IoHash* InObjectHash, AttachmentResolver* InResolver)
{
- if (InObject.CreateIterator())
+ if (InObject)
{
Object = InObject.IsOwned() ? std::move(InObject) : CbObject::Clone(InObject);
if (InObjectHash)
@@ -432,7 +432,7 @@ CbPackage::TryLoad(BinaryReader& Reader, BufferAllocator Allocator, AttachmentRe
return false;
}
Object.MakeOwned();
- if (Object.CreateViewIterator())
+ if (Object)
{
CbField HashField = LoadCompactBinary(Reader, StackAllocator);
ObjectHash = HashField.AsObjectAttachment();
@@ -452,7 +452,7 @@ CbPackage::TryLoad(BinaryReader& Reader, BufferAllocator Allocator, AttachmentRe
void
CbPackage::Save(CbWriter& Writer) const
{
- if (Object.CreateIterator())
+ if (Object)
{
Writer.AddObject(Object);
Writer.AddObjectAttachment(ObjectHash);
diff --git a/zencore/compactbinaryvalidation.cpp b/zencore/compactbinaryvalidation.cpp
index 0d4283550..80b8bf32a 100644
--- a/zencore/compactbinaryvalidation.cpp
+++ b/zencore/compactbinaryvalidation.cpp
@@ -461,7 +461,7 @@ ValidateCbPackageObject(CbFieldView& Value, MemoryView& View, CbValidateMode Mod
const IoHash Hash = HashField.AsAttachment();
if (EnumHasAnyFlags(Mode, CbValidateMode::Package))
{
- if (!Object.CreateViewIterator())
+ if (!Object)
{
AddError(Error, CbValidateError::NullPackageObject);
}
diff --git a/zencore/include/zencore/compactbinary.h b/zencore/include/zencore/compactbinary.h
index 2dc9c0ce0..839218940 100644
--- a/zencore/include/zencore/compactbinary.h
+++ b/zencore/include/zencore/compactbinary.h
@@ -821,6 +821,9 @@ public:
/** Construct an array from an array field. No type check is performed! */
static inline CbArrayView FromFieldView(const CbFieldView& Field) { return CbArrayView(Field); }
+ /** Whether the array has any fields. */
+ inline explicit operator bool() const { return Num() > 0; }
+
/** Returns the size of the array in bytes if serialized by itself with no name. */
ZENCORE_API uint64_t GetSize() const;
@@ -903,6 +906,9 @@ public:
/** Construct an object from an object field. No type check is performed! */
static inline CbObjectView FromFieldView(const CbFieldView& Field) { return CbObjectView(Field); }
+ /** Whether the object has any fields. */
+ ZENCORE_API explicit operator bool() const;
+
/** Returns the size of the object in bytes if serialized by itself with no name. */
ZENCORE_API uint64_t GetSize() const;
diff --git a/zencore/include/zencore/compactbinarypackage.h b/zencore/include/zencore/compactbinarypackage.h
index d7a8ea7fc..493eb2ba7 100644
--- a/zencore/include/zencore/compactbinarypackage.h
+++ b/zencore/include/zencore/compactbinarypackage.h
@@ -193,7 +193,7 @@ public:
inline explicit operator bool() const { return !IsNull(); }
/** Whether the package has an empty object and no attachments. */
- inline bool IsNull() const { return !Object.CreateIterator() && Attachments.size() == 0; }
+ inline bool IsNull() const { return !Object && Attachments.size() == 0; }
/** Returns the compact binary object for the package. */
inline const CbObject& GetObject() const { return Object; }