1717namespace nodepp { template < class T > class ptr_t {
1818private:
1919
20- struct NODE { ulong count, length; T* value; };
20+ struct NODE { atomic_t < ulong> count, length; T* value; };
2121
2222 inline int _free_ ( NODE* address ) const noexcept {
2323 if ( address /* --*/ == nullptr ){ return -1 ; }
@@ -204,8 +204,8 @@ namespace nodepp { template< class T > class ptr_t {
204204
205205 /* ─······································································─*/
206206
207- ulong size () const noexcept { return null () ? 0 /* -*/ : address->length ; }
208- ulong count () const noexcept { return null () ? 0 /* -*/ : address->count ; }
207+ ulong size () const noexcept { return null () ? 0 /* -*/ : address->length . get () ; }
208+ ulong count () const noexcept { return null () ? 0 /* -*/ : address->count . get (); }
209209
210210 T* data () const noexcept { return null () ? nullptr : address->value ; }
211211 T* get () const noexcept { return null () ? nullptr : address->value ; }
@@ -233,4 +233,16 @@ namespace nodepp { template< class T > class ptr_t {
233233
234234/* ────────────────────────────────────────────────────────────────────────────*/
235235
236+ namespace nodepp { namespace type {
237+
238+ template < class T , class V > T* cast ( ptr_t <V>& object ){ if ( object==nullptr ){ return nullptr ; } return static_cast <T*>(object.get ()); }
239+
240+ template <class T > ptr_t <T> bind ( ptr_t <T>& object ){ if ( object==nullptr ){ return nullptr ; } return object.copy (); }
241+ template <class T > ptr_t <T> bind ( T* object ){ if ( object==nullptr ){ return nullptr ; } return new T ( *object ); }
242+ template <class T > ptr_t <T> bind ( T object ){ return new T ( object ); }
243+
244+ }}
245+
246+ /* ────────────────────────────────────────────────────────────────────────────*/
247+
236248#endif
0 commit comments