Files
sousa-gecko/layout/base/gtest/TestUniqueOrNonOwningPtr.cpp
serge-sans-paille ae7a934674 Bug 2064119 - Use default operator equal implementation when possible r=necko-reviewers,ipc-reviewers,layout-reviewers,nika,dshin
Fallback to spaceship operator when it makes sense.
Also default inequality operator when it depends on defaulted equality
operator.

All cases spotted through the analysis from Bug 2064388.

Differential Revision: https://phabricator.services.mozilla.com/D319780
2026-08-27 17:30:49 +00:00

84 lines
1.9 KiB
C++

/* This Source Code Form is subject to the terms of the Mozilla Public
* License, v. 2.0. If a copy of the MPL was not distributed with this
* file, You can obtain one at http://mozilla.org/MPL/2.0/. */
#include "UniqueOrNonOwningPtr.h"
#include "gtest/gtest.h"
using mozilla::MakeUniqueOfUniqueOrNonOwning;
using mozilla::UniqueOrNonOwningPtr;
TEST(UniqueOrNonOwningPtrTest, Empty)
{
#ifdef HAVE_64BIT_BUILD
using T = uint64_t;
#else
using T = uint32_t;
#endif
using Ptr = UniqueOrNonOwningPtr<T>;
static_assert(sizeof(Ptr) == sizeof(T), "Unexpected size bloat");
Ptr ptr;
EXPECT_FALSE(ptr);
EXPECT_EQ(ptr.get(), nullptr);
}
struct Foo {
uint64_t mA;
uint32_t mB;
Foo(uint64_t aA, uint32_t aB) : mA{aA}, mB{aB} {}
Foo(const Foo& aOther) = default;
bool operator==(const Foo& aOther) const = default;
};
TEST(UniqueOrNonOwningPtrTest, NonOwningStruct)
{
using T = Foo;
using Ptr = UniqueOrNonOwningPtr<T>;
T val{12, 918};
Ptr ptr = Ptr::NonOwning(&val);
EXPECT_TRUE(ptr);
EXPECT_EQ(ptr.get(), &val);
EXPECT_EQ(*ptr, val);
EXPECT_EQ(ptr->mA, val.mA);
EXPECT_EQ(ptr->mB, val.mB);
Ptr ptr2 = std::move(ptr);
EXPECT_FALSE(ptr);
EXPECT_EQ(ptr.get(), nullptr);
EXPECT_TRUE(ptr2);
EXPECT_EQ(ptr2.get(), &val);
EXPECT_EQ(*ptr2, val);
EXPECT_EQ(ptr2->mA, val.mA);
EXPECT_EQ(ptr2->mB, val.mB);
}
TEST(UniqueOrNonOwningPtrTest, OwnedStruct)
{
using T = Foo;
using Ptr = UniqueOrNonOwningPtr<T>;
T copy{12, 918};
Ptr ptr = MakeUniqueOfUniqueOrNonOwning<T>(copy);
EXPECT_TRUE(ptr);
EXPECT_NE(ptr.get(), nullptr);
EXPECT_NE(ptr.get(), &copy);
EXPECT_EQ(*ptr, copy);
EXPECT_EQ(ptr->mA, copy.mA);
EXPECT_EQ(ptr->mB, copy.mB);
Ptr ptr2 = std::move(ptr);
EXPECT_FALSE(ptr);
EXPECT_EQ(ptr.get(), nullptr);
EXPECT_TRUE(ptr2);
EXPECT_NE(ptr2.get(), nullptr);
EXPECT_NE(ptr2.get(), &copy);
EXPECT_EQ(*ptr2, copy);
EXPECT_EQ(ptr2->mA, copy.mA);
EXPECT_EQ(ptr2->mB, copy.mB);
}