]> git.apps.os.sepia.ceph.com Git - ceph-ci.git/commitdiff
common: add make_ref factory for RefCountedObject
authorPatrick Donnelly <pdonnell@redhat.com>
Tue, 13 Aug 2019 16:15:56 +0000 (09:15 -0700)
committerKefu Chai <tchaikov@gmail.com>
Mon, 16 Sep 2019 11:52:36 +0000 (19:52 +0800)
Signed-off-by: Patrick Donnelly <pdonnell@redhat.com>
src/common/ref.h

index 6f3f7fd0b036b35b6d2e1d7e342e1e76c621b947..055c9a07a0bacbbbe87be50360dbbed486c8b50c 100644 (file)
@@ -10,17 +10,25 @@ namespace ceph {
 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