This is the mail archive of the libstdc++@gcc.gnu.org mailing list for the libstdc++ project.


Index Nav: [Date Index] [Subject Index] [Author Index] [Thread Index]
Message Nav: [Date Prev] [Date Next] [Thread Prev] [Thread Next]
Other format: [Raw text]

Re: [PATCH][GSoC] Extend shared_ptr to support arrays


On Sun, Jun 21, 2015 at 3:50 AM, Tim Shen <timshen@google.com> wrote:
> Quickly looked at __shared_ptr<__libfund_v1<_Tp>, _Lp>; will look at
> the rest parts later.

All suggestions apply for all occursions, not just for the quoted code.

+  // helpers for std::experimental::enable_shared_from_this
+
+  template<typename _Tp, _Lock_policy _Lp = __default_lock_policy>
+    struct __helper_for_experimental_enable_shared
+    {
+      void _Call_M_assign(__weak_ptr<__libfund_v1<_Tp>, _Lp>& __wp,
+                         _Tp* __ptr,
+                         const __shared_count<_Lp>& __refcount)
+       { __wp._M_assign(__ptr, __refcount); }
+    };
Make the function it static; Suggested class name: __weak_ptr_friend,
function name _S_assign.

+      // Used by __enable_shared_from_this.
+      void
+      _M_assign(_Tp* __ptr, const __shared_count<_Lp>& __refcount) noexcept
+      {
+       _M_ptr = __ptr;
+       _M_refcount = __refcount;
+      }
element_type* __ptr?

Also need a _Compatible; possible implementation:

template<typename _From_type, typename _To_type>
  struct __sp_compatible_helper
  {  static constexpr bool value = std::is_convertible<_From_type*,
_To_type*>::value;  };

template<size_t _Nm, typename _Tp>
  struct __sp_compatible_helper<_Tp[_Nm], _Tp[]>
  { static constexpr bool value = true; };

...

template<typename _Tp1>
  using _Compatible = typename std::enable_if<__sp_compatible<_Tp1,
_Tp>::value>::type;

+   template<typename _Tp1, typename _Tp2>
+     inline bool
+     operator<(const shared_ptr<_Tp1>& __a,
+              const shared_ptr<_Tp2>& __b) noexcept
+     {
+       using _Tp1_RE = typename remove_extent<_Tp1>::type;
+       using _Tp2_RE = typename remove_extent<_Tp2>::type;
+       using _CT = typename std::common_type<_Tp1_RE*, _Tp2_RE*>::type;
+       return std::less<_CT>()(__a.get(), __b.get());
+     }
using _Tp1_RE = typename shared_ptr<_Tp1>::element_type;

+   // 8.2.1.3, shared_ptr casts
+   template<typename _Tp, typename _Tp1>
+     inline shared_ptr<_Tp>
+     static_pointer_cast(const shared_ptr<_Tp1>& __r) noexcept
+     { shared_ptr<_Tp>(__r, static_cast<typename
shared_ptr<_Tp>::element_type*>(__r.get())); }
+
Missing "return". You can turn on -Wsystem-headers to check for warnings.


-- 
Regards,
Tim Shen


Index Nav: [Date Index] [Subject Index] [Author Index] [Thread Index]
Message Nav: [Date Prev] [Date Next] [Thread Prev] [Thread Next]