pinned: Fix CTAD
This makes it much easier to utilize as we don't need to fully specify
types.
Change-Id: I73552a11782f6762a68a9f675ed380feea37326b
Signed-off-by: William A. Kennington III <wak@google.com>
diff --git a/include/stdplus/pinned.hpp b/include/stdplus/pinned.hpp
index 085ea8d..abf6c7f 100644
--- a/include/stdplus/pinned.hpp
+++ b/include/stdplus/pinned.hpp
@@ -63,6 +63,9 @@
};
template <typename T>
+Pinned(T t) -> Pinned<std::remove_cvref_t<T>>;
+
+template <typename T>
struct PinnedRef : std::reference_wrapper<T>
{
using type = T;
@@ -99,6 +102,21 @@
}
};
+template <typename T>
+PinnedRef(T t) -> PinnedRef<std::remove_reference_t<T>>;
+
+template <typename T>
+PinnedRef(Pinned<T>& t) -> PinnedRef<T>;
+
+template <typename T>
+PinnedRef(const Pinned<T>& t) -> PinnedRef<const T>;
+
+template <typename T, typename Deleter>
+PinnedRef(const std::unique_ptr<T, Deleter>& t) -> PinnedRef<T>;
+
+template <typename T>
+PinnedRef(const std::shared_ptr<T>& t) -> PinnedRef<T>;
+
} // namespace stdplus
template <class T>
diff --git a/test/pinned.cpp b/test/pinned.cpp
index c8daa3c..a46d949 100644
--- a/test/pinned.cpp
+++ b/test/pinned.cpp
@@ -12,10 +12,10 @@
TEST(Pinned, Basic)
{
EXPECT_EQ("hi", Pinned<std::string>("hi"));
- EXPECT_EQ("hi", Pinned<std::string>(std::string("hi")));
+ EXPECT_EQ("hi", Pinned(std::string("hi")));
auto s = std::string("hi");
- EXPECT_EQ("hi", Pinned<std::string>(s));
- EXPECT_EQ("hi", Pinned<std::string>(std::move(s)));
+ EXPECT_EQ("hi", Pinned(s));
+ EXPECT_EQ("hi", Pinned(std::move(s)));
Pinned<std::string> ps = "hi";
EXPECT_EQ("hi", Pinned<std::string>(ps));
// EXPECT_EQ("hi", Pinned<std::string>(std::move(ps)));
@@ -37,7 +37,7 @@
TEST(Pinned, Fundamental)
{
- Pinned<int> pi = 4;
+ Pinned pi = 4;
EXPECT_EQ(4, [](int& f) { return f; }(pi));
EXPECT_EQ(4, [](int f) { return f; }(pi));
}
@@ -66,7 +66,7 @@
TEST(PinnedRef, Basic)
{
auto uptr = std::make_unique<std::string>("hi");
- PinnedRef<std::string>(uptr).get()[0] = 'd';
+ PinnedRef(uptr).get()[0] = 'd';
EXPECT_EQ("di", *uptr);
PinnedRef<const std::string> cref(uptr);
// cref.get()[0] = 'e';
@@ -81,6 +81,7 @@
const Pinned<std::string> cpstr("hi");
// EXPECT_EQ("hi", PinnedRef<std::string>(cpstr).get());
EXPECT_EQ("hi", PinnedRef<const std::string>(cpstr).get());
+ EXPECT_EQ("hi", PinnedRef(cpstr).get());
}
TEST(PinnedRef, Fundamental)
@@ -102,6 +103,7 @@
// PinnedRef<NoMove2> rnm2(nm2);
NoMove3 nm3;
PinnedRef<NoMove3> rnm3(nm3);
+ PinnedRef rnm3i(nm3);
}
} // namespace stdplus