diff options
| author | Stefan Boberg <[email protected]> | 2021-09-01 11:16:29 +0200 |
|---|---|---|
| committer | Stefan Boberg <[email protected]> | 2021-09-01 11:16:29 +0200 |
| commit | 9b56218bd354b46b157ecdefd3254fa8d5c3e94d (patch) | |
| tree | 88a679f2e770b39e34eecb120460e2d43ab49c74 | |
| parent | Fixed a race in bucket open/create logic (diff) | |
| download | zen-9b56218bd354b46b157ecdefd3254fa8d5c3e94d.tar.xz zen-9b56218bd354b46b157ecdefd3254fa8d5c3e94d.zip | |
CompactBinary: Added explicit operator bool for array and object types
p4 CL16069971
| -rw-r--r-- | zencore/compactbinary.cpp | 27 | ||||
| -rw-r--r-- | zencore/compactbinarypackage.cpp | 6 | ||||
| -rw-r--r-- | zencore/compactbinaryvalidation.cpp | 2 | ||||
| -rw-r--r-- | zencore/include/zencore/compactbinary.h | 6 | ||||
| -rw-r--r-- | zencore/include/zencore/compactbinarypackage.h | 2 |
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; } |