template<typename T> using ref_t = boost::intrusive_ptr<T>;
template<typename T> using cref_t = boost::intrusive_ptr<const T>;
template<class T, class U>
-boost::intrusive_ptr<T> ref_cast(const boost::intrusive_ptr<U>& r) noexcept {
+ref_t<T> ref_cast(const ref_t<U>& r) noexcept {
return static_cast<T*>(r.get());
}
template<class T, class U>
-boost::intrusive_ptr<T> ref_cast(boost::intrusive_ptr<U>&& r) noexcept {
+ref_t<T> ref_cast(ref_t<U>&& r) noexcept {
return {static_cast<T*>(r.detach()), false};
}
template<class T, class U>
-boost::intrusive_ptr<const T> ref_cast(const boost::intrusive_ptr<const U>& r) noexcept {
+cref_t<T> ref_cast(const cref_t<U>& r) noexcept {
return static_cast<const T*>(r.get());
}
+template<class T, typename... Args>
+ceph::ref_t<T> make_ref(Args&&... args) {
+ return {new T(std::forward<Args>(args)...), false};
}
+}
+
+// Friends cannot be partial specializations: https://en.cppreference.com/w/cpp/language/friend
+#define FRIEND_MAKE_REF(C) \
+template<class T, typename... Args> friend ceph::ref_t<T> ceph::make_ref(Args&&... args)
#endif