mirror of
https://github.com/RPCS3/llvm-mirror.git
synced 2024-11-26 04:32:44 +01:00
Add partial implementation of std::to_address() as llvm::to_address()
Summary: Following on from the review for D58088, this patch provides the prerequisite to_address() implementation that's needed to have pointer_iterator support unique_ptr. The late bound return should be removed once we move to C++14 to better align with the C++20 declaration. Also, this implementation can be removed once we move to C++20 where it's defined as std::to_addres() The std::pointer_traits<>::to_address(p) variations of these overloads has not been implemented. Reviewers: dblaikie, paquette Reviewed By: dblaikie Subscribers: dexonsmith, kristina, llvm-commits Tags: #llvm Differential Revision: https://reviews.llvm.org/D58421 llvm-svn: 354491
This commit is contained in:
parent
c8095b709a
commit
9daa37762d
@ -1576,6 +1576,19 @@ bool hasNItemsOrMore(
|
|||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/// Returns a raw pointer that represents the same address as the argument.
|
||||||
|
///
|
||||||
|
/// The late bound return should be removed once we move to C++14 to better
|
||||||
|
/// align with the C++20 declaration. Also, this implementation can be removed
|
||||||
|
/// once we move to C++20 where it's defined as std::to_addres()
|
||||||
|
///
|
||||||
|
/// The std::pointer_traits<>::to_address(p) variations of these overloads has
|
||||||
|
/// not been implemented.
|
||||||
|
template <class Ptr> auto to_address(const Ptr &P) -> decltype(P.operator->()) {
|
||||||
|
return P.operator->();
|
||||||
|
}
|
||||||
|
template <class T> constexpr T *to_address(T *P) { return P; }
|
||||||
|
|
||||||
} // end namespace llvm
|
} // end namespace llvm
|
||||||
|
|
||||||
#endif // LLVM_ADT_STLEXTRAS_H
|
#endif // LLVM_ADT_STLEXTRAS_H
|
||||||
|
@ -446,4 +446,27 @@ TEST(STLExtrasTest, splat) {
|
|||||||
EXPECT_FALSE(is_splat(V));
|
EXPECT_FALSE(is_splat(V));
|
||||||
}
|
}
|
||||||
|
|
||||||
|
TEST(STLExtrasTest, to_address) {
|
||||||
|
int *V1 = new int;
|
||||||
|
EXPECT_EQ(V1, to_address(V1));
|
||||||
|
|
||||||
|
// Check fancy pointer overload for unique_ptr
|
||||||
|
std::unique_ptr<int> V2 = make_unique<int>(0);
|
||||||
|
EXPECT_EQ(V2.get(), to_address(V2));
|
||||||
|
|
||||||
|
V2.reset(V1);
|
||||||
|
EXPECT_EQ(V1, to_address(V2));
|
||||||
|
V2.release();
|
||||||
|
|
||||||
|
// Check fancy pointer overload for shared_ptr
|
||||||
|
std::shared_ptr<int> V3 = std::make_shared<int>(0);
|
||||||
|
std::shared_ptr<int> V4 = V3;
|
||||||
|
EXPECT_EQ(V3.get(), V4.get());
|
||||||
|
EXPECT_EQ(V3.get(), to_address(V3));
|
||||||
|
EXPECT_EQ(V4.get(), to_address(V4));
|
||||||
|
|
||||||
|
V3.reset(V1);
|
||||||
|
EXPECT_EQ(V1, to_address(V3));
|
||||||
|
}
|
||||||
|
|
||||||
} // namespace
|
} // namespace
|
||||||
|
Loading…
Reference in New Issue
Block a user