Skip to content

Commit

Permalink
Allow Shared, SharedView, and Unqiue to be default constructed
Browse files Browse the repository at this point in the history
PiperOrigin-RevId: 589206139
  • Loading branch information
jcking authored and copybara-github committed Dec 9, 2023
1 parent dc096f2 commit a6a0abd
Show file tree
Hide file tree
Showing 2 changed files with 45 additions and 7 deletions.
18 changes: 11 additions & 7 deletions common/memory.h
Original file line number Diff line number Diff line change
Expand Up @@ -85,7 +85,7 @@ struct HandleFactory;
template <typename T>
class ABSL_ATTRIBUTE_TRIVIAL_ABI Shared final {
public:
Shared() = delete;
Shared() = default;

Shared(const Shared& other)
: value_(other.value_), refcount_(other.refcount_) {
Expand Down Expand Up @@ -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_);
Expand Down Expand Up @@ -222,11 +224,9 @@ struct NativeTypeTraits<Shared<T>> final {
template <typename T>
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,
Expand Down Expand Up @@ -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_);
Expand Down Expand Up @@ -349,7 +351,7 @@ class ABSL_ATTRIBUTE_TRIVIAL_ABI Unique final {
public:
static_assert(!std::is_array_v<T>);

Unique() = delete;
Unique() = default;
Unique(const Unique&) = delete;
Unique& operator=(const Unique&) = delete;

Expand Down Expand Up @@ -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_);
Expand Down Expand Up @@ -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
Expand Down
34 changes: 34 additions & 0 deletions common/memory_test.cc
Original file line number Diff line number Diff line change
Expand Up @@ -40,6 +40,8 @@
namespace cel {
namespace {

// NOLINTBEGIN(bugprone-use-after-move)

using testing::_;
using testing::IsFalse;
using testing::IsNull;
Expand Down Expand Up @@ -244,6 +246,7 @@ TEST_P(MemoryManagerTest, Shared) {
bool deleted = false;
{
auto object = memory_manager().MakeShared<Object>(deleted);
EXPECT_TRUE(object);
EXPECT_FALSE(deleted);
}
switch (memory_management()) {
Expand All @@ -261,8 +264,10 @@ TEST_P(MemoryManagerTest, SharedCopyConstruct) {
bool deleted = false;
{
auto object = memory_manager().MakeShared<Object>(deleted);
EXPECT_TRUE(object);
// NOLINTNEXTLINE(performance-unnecessary-copy-initialization)
Shared<Object> copied_object(object);
EXPECT_TRUE(copied_object);
EXPECT_FALSE(deleted);
}
switch (memory_management()) {
Expand All @@ -280,8 +285,11 @@ TEST_P(MemoryManagerTest, SharedMoveConstruct) {
bool deleted = false;
{
auto object = memory_manager().MakeShared<Object>(deleted);
EXPECT_TRUE(object);
// NOLINTNEXTLINE(performance-unnecessary-copy-initialization)
Shared<Object> moved_object(std::move(object));
EXPECT_FALSE(object);
EXPECT_TRUE(moved_object);
EXPECT_FALSE(deleted);
}
switch (memory_management()) {
Expand All @@ -299,9 +307,13 @@ TEST_P(MemoryManagerTest, SharedCopyAssign) {
bool deleted = false;
{
auto object = memory_manager().MakeShared<Object>(deleted);
EXPECT_TRUE(object);
// NOLINTNEXTLINE(performance-unnecessary-copy-initialization)
Shared<Object> moved_object(std::move(object));
EXPECT_FALSE(object);
EXPECT_TRUE(moved_object);
object = moved_object;
EXPECT_TRUE(object);
EXPECT_FALSE(deleted);
}
switch (memory_management()) {
Expand All @@ -319,9 +331,14 @@ TEST_P(MemoryManagerTest, SharedMoveAssign) {
bool deleted = false;
{
auto object = memory_manager().MakeShared<Object>(deleted);
EXPECT_TRUE(object);
// NOLINTNEXTLINE(performance-unnecessary-copy-initialization)
Shared<Object> 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()) {
Expand All @@ -339,8 +356,10 @@ TEST_P(MemoryManagerTest, SharedCopyConstructConvertible) {
bool deleted = false;
{
auto object = memory_manager().MakeShared<Subobject>(deleted);
EXPECT_TRUE(object);
// NOLINTNEXTLINE(performance-unnecessary-copy-initialization)
Shared<Object> copied_object(object);
EXPECT_TRUE(copied_object);
EXPECT_FALSE(deleted);
}
switch (memory_management()) {
Expand All @@ -358,8 +377,11 @@ TEST_P(MemoryManagerTest, SharedMoveConstructConvertible) {
bool deleted = false;
{
auto object = memory_manager().MakeShared<Subobject>(deleted);
EXPECT_TRUE(object);
// NOLINTNEXTLINE(performance-unnecessary-copy-initialization)
Shared<Object> moved_object(std::move(object));
EXPECT_FALSE(object);
EXPECT_TRUE(moved_object);
EXPECT_FALSE(deleted);
}
switch (memory_management()) {
Expand All @@ -377,8 +399,12 @@ TEST_P(MemoryManagerTest, SharedCopyAssignConvertible) {
bool deleted = false;
{
auto subobject = memory_manager().MakeShared<Subobject>(deleted);
EXPECT_TRUE(subobject);
auto object = memory_manager().MakeShared<Object>();
EXPECT_TRUE(object);
object = subobject;
EXPECT_TRUE(object);
EXPECT_TRUE(subobject);
EXPECT_FALSE(deleted);
}
switch (memory_management()) {
Expand All @@ -396,8 +422,12 @@ TEST_P(MemoryManagerTest, SharedMoveAssignConvertible) {
bool deleted = false;
{
auto subobject = memory_manager().MakeShared<Subobject>(deleted);
EXPECT_TRUE(subobject);
auto object = memory_manager().MakeShared<Object>();
EXPECT_TRUE(object);
object = std::move(subobject);
EXPECT_TRUE(object);
EXPECT_FALSE(subobject);
EXPECT_FALSE(deleted);
}
switch (memory_management()) {
Expand Down Expand Up @@ -434,6 +464,7 @@ TEST_P(MemoryManagerTest, SharedViewConstruct) {
{
auto object = memory_manager().MakeShared<Object>(deleted);
dangling_object_view.emplace(object);
EXPECT_TRUE(*dangling_object_view);
{
auto copied_object = Shared<Object>(*dangling_object_view);
EXPECT_FALSE(deleted);
Expand Down Expand Up @@ -645,6 +676,7 @@ TEST_P(MemoryManagerTest, Unique) {
bool deleted = false;
{
auto object = memory_manager().MakeUnique<Object>(deleted);
EXPECT_TRUE(object);
EXPECT_FALSE(deleted);
}
EXPECT_TRUE(deleted);
Expand Down Expand Up @@ -754,5 +786,7 @@ TEST(MemoryManagerRefCasting, Pooling) {
EXPECT_TRUE(InstanceOf<PoolingMemoryManager>(MemoryManagerRef(pooling)));
}

// NOLINTEND(bugprone-use-after-move)

} // namespace
} // namespace cel

0 comments on commit a6a0abd

Please # to comment.