Fix unique_ref test cases

This commit is contained in:
Sebastian Messmer 2016-07-22 14:07:06 +02:00
parent 271cb0c42d
commit a4ce49aef4
4 changed files with 18 additions and 12 deletions

View File

@ -163,7 +163,8 @@ namespace blobstore {
ASSERT(beginIndex <= endIndex, "Invalid parameters");
if (0 == depth) {
ASSERT(beginIndex <= 1 && endIndex == 1, "With depth 0, we can only traverse one or zero leaves (i.e. traverse one leaf or traverse a gap leaf).");
auto leafCreator = (beginIndex == 0) ? onCreateLeaf : _createMaxSizeLeaf();
auto leafCreator = (beginIndex
== 0) ? onCreateLeaf : _createMaxSizeLeaf();
return _nodeStore->createNewLeafNode(leafCreator(leafOffset));
}

View File

@ -82,6 +82,7 @@ private:
template<typename U> friend class unique_ref;
template<typename DST, typename SRC> friend boost::optional<unique_ref<DST>> dynamic_pointer_move(unique_ref<SRC> &source);
template<typename U> friend std::unique_ptr<U> to_unique_ptr(unique_ref<U> ref);
template<class U> friend U* _extract_ptr(const unique_ref<U> &obj);
std::unique_ptr<T> _target;
@ -105,6 +106,10 @@ template<typename T> inline void destruct(unique_ref<T> ptr) {
to_unique_ptr(std::move(ptr)).reset();
}
template<class T> T* _extract_ptr(const unique_ref<T> &obj) {
return obj._target.get();
}
//TODO Also allow passing a rvalue reference, otherwise dynamic_pointer_move(func()) won't work
template<typename DST, typename SRC>
inline boost::optional<unique_ref<DST>> dynamic_pointer_move(unique_ref<SRC> &source) {
@ -119,7 +124,7 @@ inline std::unique_ptr<T> to_unique_ptr(unique_ref<T> ref) {
template<typename T>
inline bool operator==(const unique_ref<T> &lhs, const unique_ref<T> &rhs) {
return lhs.get() == rhs.get();
return _extract_ptr(lhs) == _extract_ptr(rhs);
}
template<typename T>
@ -148,14 +153,14 @@ namespace std {
// Allow using it in std::unordered_set / std::unordered_map
template<typename T> struct hash<cpputils::unique_ref<T>> {
size_t operator()(const cpputils::unique_ref<T> &ref) const {
return (size_t)ref.get();
return (size_t)_extract_ptr(ref);
}
};
// Allow using it in std::map / std::set
template <typename T> struct less<cpputils::unique_ref<T>> {
bool operator()(const cpputils::unique_ref<T> &lhs, const cpputils::unique_ref<T> &rhs) const {
return lhs.get() < rhs.get();
return _extract_ptr(lhs) < _extract_ptr(rhs);
}
};
}

View File

@ -67,7 +67,7 @@ TEST(UniqueRef_DynamicPointerMoveTest, ValidParentToChildCast) {
Child *obj = new Child();
unique_ref<Parent> source(nullcheck(unique_ptr<Parent>(obj)).value());
unique_ref<Child> casted = dynamic_pointer_move<Child>(source).value();
EXPECT_EQ(nullptr, source.get()); // source lost ownership
EXPECT_FALSE(source.isValid()); // source lost ownership
EXPECT_EQ(obj, casted.get());
}
@ -115,7 +115,7 @@ TEST(UniqueRef_DynamicPointerMoveTest, ChildToParentCast) {
Child *obj = new Child();
unique_ref<Child> source(nullcheck(unique_ptr<Child>(obj)).value());
unique_ref<Parent> casted = dynamic_pointer_move<Parent>(source).value();
EXPECT_EQ(nullptr, source.get()); // source lost ownership
EXPECT_FALSE(source.isValid()); // source lost ownership
EXPECT_EQ(obj, casted.get());
}

View File

@ -149,7 +149,7 @@ TEST_F(UniqueRefTest, Assignment) {
SomeClass *obj1ptr = obj1.get();
obj2 = std::move(obj1);
EXPECT_EQ(obj1ptr, obj2.get());
EXPECT_EQ(nullptr, obj1.get());
EXPECT_FALSE(obj1.isValid());
}
TEST_F(UniqueRefTest, MoveConstructor) {
@ -157,7 +157,7 @@ TEST_F(UniqueRefTest, MoveConstructor) {
SomeClass *obj1ptr = obj1.get();
unique_ref<SomeClass> obj2 = std::move(obj1);
EXPECT_EQ(obj1ptr, obj2.get());
EXPECT_EQ(nullptr, obj1.get());
EXPECT_FALSE(obj1.isValid());
}
TEST_F(UniqueRefTest, Swap) {
@ -177,7 +177,7 @@ TEST_F(UniqueRefTest, SwapFromInvalid) {
SomeClass *obj2ptr = obj2.get();
std::swap(obj1, obj2);
EXPECT_EQ(obj2ptr, obj1.get());
EXPECT_EQ(nullptr, obj2.get());
EXPECT_FALSE(obj2.isValid());
}
TEST_F(UniqueRefTest, SwapWithInvalid) {
@ -186,7 +186,7 @@ TEST_F(UniqueRefTest, SwapWithInvalid) {
makeInvalid(std::move(obj2));
SomeClass *obj1ptr = obj1.get();
std::swap(obj1, obj2);
EXPECT_EQ(nullptr, obj1.get());
EXPECT_FALSE(obj1.isValid());
EXPECT_EQ(obj1ptr, obj2.get());
}
@ -196,8 +196,8 @@ TEST_F(UniqueRefTest, SwapInvalidWithInvalid) {
makeInvalid(std::move(obj1));
makeInvalid(std::move(obj2));
std::swap(obj1, obj2);
EXPECT_EQ(nullptr, obj1.get());
EXPECT_EQ(nullptr, obj2.get());
EXPECT_FALSE(obj1.isValid());
EXPECT_FALSE(obj2.isValid());
}
TEST_F(UniqueRefTest, SwapFromRValue) {