diff --git a/common/memory.h b/common/memory.h index 1911ac698..1a53afaff 100644 --- a/common/memory.h +++ b/common/memory.h @@ -85,7 +85,7 @@ struct HandleFactory; template class ABSL_ATTRIBUTE_TRIVIAL_ABI Shared final { public: - Shared() = delete; + Shared() = default; Shared(const Shared& other) : value_(other.value_), refcount_(other.refcount_) { @@ -180,6 +180,8 @@ class ABSL_ATTRIBUTE_TRIVIAL_ABI Shared final { return value_; } + explicit operator bool() const { return !IsEmpty(); } + friend void swap(Shared& lhs, Shared& rhs) noexcept { using std::swap; swap(lhs.value_, rhs.value_); @@ -222,11 +224,9 @@ struct NativeTypeTraits> final { template class ABSL_ATTRIBUTE_TRIVIAL_ABI SharedView final { public: - SharedView() = delete; + SharedView() = default; SharedView(const SharedView&) = default; - SharedView(SharedView&&) = default; SharedView& operator=(const SharedView&) = default; - SharedView& operator=(SharedView&&) = default; template < typename U, @@ -297,6 +297,8 @@ class ABSL_ATTRIBUTE_TRIVIAL_ABI SharedView final { return value_; } + explicit operator bool() const { return !IsEmpty(); } + friend void swap(SharedView& lhs, SharedView& rhs) noexcept { using std::swap; swap(lhs.value_, rhs.value_); @@ -349,7 +351,7 @@ class ABSL_ATTRIBUTE_TRIVIAL_ABI Unique final { public: static_assert(!std::is_array_v); - Unique() = delete; + Unique() = default; Unique(const Unique&) = delete; Unique& operator=(const Unique&) = delete; @@ -401,6 +403,8 @@ class ABSL_ATTRIBUTE_TRIVIAL_ABI Unique final { return ptr_; } + explicit operator bool() const { return !IsEmpty(); } + friend void swap(Unique& lhs, Unique& rhs) noexcept { using std::swap; swap(lhs.ptr_, rhs.ptr_); @@ -431,8 +435,8 @@ class ABSL_ATTRIBUTE_TRIVIAL_ABI Unique final { bool IsEmpty() const noexcept { return ptr_ == nullptr; } - T* ptr_; - MemoryManagement memory_management_; + T* ptr_ = nullptr; + MemoryManagement memory_management_ = MemoryManagement::kPooling; }; // `ReferenceCountingMemoryManager` is a `MemoryManager` which employs automatic diff --git a/common/memory_test.cc b/common/memory_test.cc index df45eb40b..cb175cde4 100644 --- a/common/memory_test.cc +++ b/common/memory_test.cc @@ -40,6 +40,8 @@ namespace cel { namespace { +// NOLINTBEGIN(bugprone-use-after-move) + using testing::_; using testing::IsFalse; using testing::IsNull; @@ -244,6 +246,7 @@ TEST_P(MemoryManagerTest, Shared) { bool deleted = false; { auto object = memory_manager().MakeShared(deleted); + EXPECT_TRUE(object); EXPECT_FALSE(deleted); } switch (memory_management()) { @@ -261,8 +264,10 @@ TEST_P(MemoryManagerTest, SharedCopyConstruct) { bool deleted = false; { auto object = memory_manager().MakeShared(deleted); + EXPECT_TRUE(object); // NOLINTNEXTLINE(performance-unnecessary-copy-initialization) Shared copied_object(object); + EXPECT_TRUE(copied_object); EXPECT_FALSE(deleted); } switch (memory_management()) { @@ -280,8 +285,11 @@ TEST_P(MemoryManagerTest, SharedMoveConstruct) { bool deleted = false; { auto object = memory_manager().MakeShared(deleted); + EXPECT_TRUE(object); // NOLINTNEXTLINE(performance-unnecessary-copy-initialization) Shared moved_object(std::move(object)); + EXPECT_FALSE(object); + EXPECT_TRUE(moved_object); EXPECT_FALSE(deleted); } switch (memory_management()) { @@ -299,9 +307,13 @@ TEST_P(MemoryManagerTest, SharedCopyAssign) { bool deleted = false; { auto object = memory_manager().MakeShared(deleted); + EXPECT_TRUE(object); // NOLINTNEXTLINE(performance-unnecessary-copy-initialization) Shared moved_object(std::move(object)); + EXPECT_FALSE(object); + EXPECT_TRUE(moved_object); object = moved_object; + EXPECT_TRUE(object); EXPECT_FALSE(deleted); } switch (memory_management()) { @@ -319,9 +331,14 @@ TEST_P(MemoryManagerTest, SharedMoveAssign) { bool deleted = false; { auto object = memory_manager().MakeShared(deleted); + EXPECT_TRUE(object); // NOLINTNEXTLINE(performance-unnecessary-copy-initialization) Shared moved_object(std::move(object)); + EXPECT_FALSE(object); + EXPECT_TRUE(moved_object); object = std::move(moved_object); + EXPECT_FALSE(moved_object); + EXPECT_TRUE(object); EXPECT_FALSE(deleted); } switch (memory_management()) { @@ -339,8 +356,10 @@ TEST_P(MemoryManagerTest, SharedCopyConstructConvertible) { bool deleted = false; { auto object = memory_manager().MakeShared(deleted); + EXPECT_TRUE(object); // NOLINTNEXTLINE(performance-unnecessary-copy-initialization) Shared copied_object(object); + EXPECT_TRUE(copied_object); EXPECT_FALSE(deleted); } switch (memory_management()) { @@ -358,8 +377,11 @@ TEST_P(MemoryManagerTest, SharedMoveConstructConvertible) { bool deleted = false; { auto object = memory_manager().MakeShared(deleted); + EXPECT_TRUE(object); // NOLINTNEXTLINE(performance-unnecessary-copy-initialization) Shared moved_object(std::move(object)); + EXPECT_FALSE(object); + EXPECT_TRUE(moved_object); EXPECT_FALSE(deleted); } switch (memory_management()) { @@ -377,8 +399,12 @@ TEST_P(MemoryManagerTest, SharedCopyAssignConvertible) { bool deleted = false; { auto subobject = memory_manager().MakeShared(deleted); + EXPECT_TRUE(subobject); auto object = memory_manager().MakeShared(); + EXPECT_TRUE(object); object = subobject; + EXPECT_TRUE(object); + EXPECT_TRUE(subobject); EXPECT_FALSE(deleted); } switch (memory_management()) { @@ -396,8 +422,12 @@ TEST_P(MemoryManagerTest, SharedMoveAssignConvertible) { bool deleted = false; { auto subobject = memory_manager().MakeShared(deleted); + EXPECT_TRUE(subobject); auto object = memory_manager().MakeShared(); + EXPECT_TRUE(object); object = std::move(subobject); + EXPECT_TRUE(object); + EXPECT_FALSE(subobject); EXPECT_FALSE(deleted); } switch (memory_management()) { @@ -434,6 +464,7 @@ TEST_P(MemoryManagerTest, SharedViewConstruct) { { auto object = memory_manager().MakeShared(deleted); dangling_object_view.emplace(object); + EXPECT_TRUE(*dangling_object_view); { auto copied_object = Shared(*dangling_object_view); EXPECT_FALSE(deleted); @@ -645,6 +676,7 @@ TEST_P(MemoryManagerTest, Unique) { bool deleted = false; { auto object = memory_manager().MakeUnique(deleted); + EXPECT_TRUE(object); EXPECT_FALSE(deleted); } EXPECT_TRUE(deleted); @@ -754,5 +786,7 @@ TEST(MemoryManagerRefCasting, Pooling) { EXPECT_TRUE(InstanceOf(MemoryManagerRef(pooling))); } +// NOLINTEND(bugprone-use-after-move) + } // namespace } // namespace cel