34 #ifndef __INCLUDE_MIST_POINTER_H__
35 #define __INCLUDE_MIST_POINTER_H__
38 #ifndef __INCLUDE_MIST_CONF_H__
52 namespace __shared_memory__
60 struct shared_memory_conter
65 size_t ref_weak_count;
67 shared_memory_conter( ) : ptr( NULL ), ref_count( 0 ), ref_weak_count( 0 ){ }
68 shared_memory_conter( pointer p,
size_t rc,
size_t rwc ) : ptr( p ), ref_count( rc ), ref_weak_count( rwc ){ }
71 typedef shared_memory_conter counter_type;
72 typedef std::map< pointer, counter_type > ref_table_type;
73 typedef typename ref_table_type::iterator ref_table_iterator;
76 static ref_table_type &get_ref_table( )
78 static ref_table_type ref_table_singleton_;
79 return( ref_table_singleton_ );
82 static ref_table_iterator get_ref_iterator( pointer p )
84 ref_table_type &ref_table_ = get_ref_table( );
88 return( get_null_reference( ) );
92 ref_table_iterator ite = ref_table_.find( p );
94 if( ite == ref_table_.end( ) )
97 ite = ref_table_.insert(
typename ref_table_type::value_type( p, counter_type( p, 0, 0 ) ) ).first;
103 static ref_table_iterator get_null_reference( )
105 ref_table_type &ref_table_ = get_ref_table( );
107 static ref_table_iterator null_ite_ = ref_table_.insert(
typename ref_table_type::value_type( NULL, counter_type( NULL, 0, 0 ) ) ).first;
111 ref_table_iterator ref_ite_;
113 shared_base( ) : ref_ite_( get_null_reference( ) ){ }
114 shared_base(
const shared_base &b ) : ref_ite_( b.ref_ite_ ){}
116 pointer get_pointer( )
const {
return( ref_ite_->second.ptr ); }
122 ref_ite_ = get_null_reference( );
129 ref_ite_->second.ref_count++;
133 void add_ref( pointer p )
135 ref_ite_ = get_ref_iterator( p );
138 ref_ite_->second.ref_count++;
142 void add_ref(
const shared_base &p )
144 ref_ite_ = p.ref_ite_;
147 ref_ite_->second.ref_count++;
154 ref_ite_->second.ref_weak_count++;
158 void add_weak_ref( pointer p )
160 ref_ite_ = get_ref_iterator( p );
163 ref_ite_->second.ref_weak_count++;
167 void add_weak_ref(
const shared_base &p )
169 ref_ite_ = p.ref_ite_;
172 ref_ite_->second.ref_weak_count++;
175 void release(
bool isArray )
177 counter_type &c = ref_ite_->second;
184 if( c.ref_count == 0 )
197 if( c.ref_weak_count == 0 )
199 ref_table_type &table = get_ref_table( );
200 table.erase( ref_ite_ );
212 counter_type &c = ref_ite_->second;
219 if( c.ref_weak_count == 0 && c.ref_count == 0 )
222 ref_table_type &table = get_ref_table( );
223 table.erase( ref_ite_ );
278 const_reference
operator *( )
const {
return( *ptr_ ); }
280 pointer operator ->( ){
return( ptr_ ); }
281 const_pointer operator ->( )
const {
return( ptr_ ); }
285 scoped_ptr(
const scoped_ptr &p );
286 const scoped_ptr &operator =(
const scoped_ptr &p );
331 const_reference
operator *( )
const {
return( *ptr_ ); }
333 pointer operator ->( ){
return( ptr_ ); }
334 const_pointer operator ->( )
const {
return( ptr_ ); }
336 reference operator []( difference_type index ){
return( ptr_[ index ] ); }
337 const_reference operator []( difference_type index )
const {
return( ptr_[ index ] ); }
340 scoped_array(
const scoped_array &p );
341 const scoped_array &operator =(
const scoped_array &p );
367 class shared_ptr :
public __shared_memory__::shared_base< T >
379 typedef __shared_memory__::shared_base< T > base;
408 base::release(
false );
423 pointer operator ->( ){
return( base::get_pointer( ) ); }
436 base::release(
false );
442 bool operator ==(
const shared_ptr &p )
const {
return( base::get_pointer( ) == p.get_pointer( ) ); }
445 bool operator !=(
const shared_ptr &p )
const {
return( base::get_pointer( ) != p.get_pointer( ) ); }
448 bool operator < (
const shared_ptr &p )
const {
return( base::get_pointer( ) < p.get_pointer( ) ); }
451 bool operator <=(
const shared_ptr &p )
const {
return( base::get_pointer( ) <= p.get_pointer( ) ); }
454 bool operator > (
const shared_ptr &p )
const {
return( base::get_pointer( ) > p.get_pointer( ) ); }
457 bool operator >=(
const shared_ptr &p )
const {
return( base::get_pointer( ) >= p.get_pointer( ) ); }
461 bool operator ==(
const pointer &p )
const {
return( base::get_pointer( ) == p ); }
464 bool operator !=(
const pointer &p )
const {
return( base::get_pointer( ) != p ); }
467 bool operator < (
const pointer &p )
const {
return( base::get_pointer( ) < p ); }
470 bool operator <=(
const pointer &p )
const {
return( base::get_pointer( ) <= p ); }
473 bool operator > (
const pointer &p )
const {
return( base::get_pointer( ) > p ); }
476 bool operator >=(
const pointer &p )
const {
return( base::get_pointer( ) >= p ); }
480 template <
class T >
inline bool operator ==(
const typename shared_ptr< T >::pointer p1,
const shared_ptr< T > &p2 ){
return( p2 == p1 ); }
481 template <
class T >
inline bool operator !=(
const typename shared_ptr< T >::pointer p1,
const shared_ptr< T > &p2 ){
return( p2 != p1 ); }
483 template <
class T >
inline bool operator < ( const typename shared_ptr< T >::pointer p1,
const shared_ptr< T > &p2 ){
return( !( p2 <= p1 ) ); }
484 template <
class T >
inline bool operator <=( const typename shared_ptr< T >::pointer p1,
const shared_ptr< T > &p2 ){
return( !( p2 < p1 ) ); }
485 template <
class T >
inline bool operator > (
const typename shared_ptr< T >::pointer p1,
const shared_ptr< T > &p2 ){
return( !( p2 >= p1 ) ); }
486 template <
class T >
inline bool operator >=(
const typename shared_ptr< T >::pointer p1,
const shared_ptr< T > &p2 ){
return( !( p2 > p1 ) ); }
528 typedef __shared_memory__::shared_base< T > base;
556 base::release(
true );
571 pointer operator ->( ){
return( base::get_pointer( ) ); }
589 base::release(
true );
596 bool operator ==(
const shared_array &p )
const {
return( base::get_pointer( ) == p.get_pointer( ) ); }
599 bool operator !=(
const shared_array &p )
const {
return( base::get_pointer( ) != p.get_pointer( ) ); }
602 bool operator < (
const shared_array &p )
const {
return( base::get_pointer( ) < p.get_pointer( ) ); }
605 bool operator <=(
const shared_array &p )
const {
return( base::get_pointer( ) <= p.get_pointer( ) ); }
608 bool operator > (
const shared_array &p )
const {
return( base::get_pointer( ) > p.get_pointer( ) ); }
611 bool operator >=(
const shared_array &p )
const {
return( base::get_pointer( ) >= p.get_pointer( ) ); }
615 bool operator ==(
const pointer &p )
const {
return( base::get_pointer( ) == p ); }
618 bool operator !=(
const pointer &p )
const {
return( base::get_pointer( ) != p ); }
621 bool operator < (
const pointer &p )
const {
return( base::get_pointer( ) < p ); }
624 bool operator <=(
const pointer &p )
const {
return( base::get_pointer( ) <= p ); }
627 bool operator > (
const pointer &p )
const {
return( base::get_pointer( ) > p ); }
630 bool operator >=(
const pointer &p )
const {
return( base::get_pointer( ) >= p ); }
634 template <
class T >
inline bool operator ==(
const typename shared_array< T >::pointer p1,
const shared_array< T > &p2 ){
return( p2 == p1 ); }
635 template <
class T >
inline bool operator !=(
const typename shared_array< T >::pointer p1,
const shared_array< T > &p2 ){
return( p2 != p1 ); }
637 template <
class T >
inline bool operator < ( const typename shared_array< T >::pointer p1,
const shared_array< T > &p2 ){
return( !( p2 <= p1 ) ); }
638 template <
class T >
inline bool operator <=( const typename shared_array< T >::pointer p1,
const shared_array< T > &p2 ){
return( !( p2 < p1 ) ); }
639 template <
class T >
inline bool operator > (
const typename shared_array< T >::pointer p1,
const shared_array< T > &p2 ){
return( !( p2 >= p1 ) ); }
640 template <
class T >
inline bool operator >=(
const typename shared_array< T >::pointer p1,
const shared_array< T > &p2 ){
return( !( p2 > p1 ) ); }
669 class weak_ptr :
public __shared_memory__::shared_base< T >
681 typedef __shared_memory__::shared_base< T > base;
712 base::release_weak( );
713 base::add_weak_ref( p );
726 base::release_weak( );
727 base::add_weak_ref( p );
739 base::release_weak( );
740 base::add_weak_ref( p );
754 pointer operator ->( ){
return( base::get_pointer( ) ); }
772 base::release_weak( );
779 bool operator ==(
const weak_ptr &p )
const {
return( base::get_pointer( ) == p.get_pointer( ) ); }
782 bool operator !=(
const weak_ptr &p )
const {
return( base::get_pointer( ) != p.get_pointer( ) ); }
785 bool operator < (
const weak_ptr &p )
const {
return( base::get_pointer( ) < p.get_pointer( ) ); }
788 bool operator <=(
const weak_ptr &p )
const {
return( base::get_pointer( ) <= p.get_pointer( ) ); }
791 bool operator > (
const weak_ptr &p )
const {
return( base::get_pointer( ) > p.get_pointer( ) ); }
794 bool operator >=(
const weak_ptr &p )
const {
return( base::get_pointer( ) >= p.get_pointer( ) ); }
798 bool operator ==(
const pointer &p )
const {
return( base::get_pointer( ) == p ); }
801 bool operator !=(
const pointer &p )
const {
return( base::get_pointer( ) != p ); }
804 bool operator < (
const pointer &p )
const {
return( base::get_pointer( ) < p ); }
807 bool operator <=(
const pointer &p )
const {
return( base::get_pointer( ) <= p ); }
810 bool operator > (
const pointer &p )
const {
return( base::get_pointer( ) > p ); }
813 bool operator >=(
const pointer &p )
const {
return( base::get_pointer( ) >= p ); }
818 template <
class T >
inline bool operator ==(
const typename weak_ptr< T >::pointer p1,
const weak_ptr< T > &p2 ){
return( p2 == p1 ); }
819 template <
class T >
inline bool operator !=(
const typename weak_ptr< T >::pointer p1,
const weak_ptr< T > &p2 ){
return( p2 != p1 ); }
821 template <
class T >
inline bool operator < ( const typename weak_ptr< T >::pointer p1,
const weak_ptr< T > &p2 ){
return( !( p2 <= p1 ) ); }
822 template <
class T >
inline bool operator <=( const typename weak_ptr< T >::pointer p1,
const weak_ptr< T > &p2 ){
return( !( p2 < p1 ) ); }
823 template <
class T >
inline bool operator > (
const typename weak_ptr< T >::pointer p1,
const weak_ptr< T > &p2 ){
return( !( p2 >= p1 ) ); }
824 template <
class T >
inline bool operator >=(
const typename weak_ptr< T >::pointer p1,
const
826 weak_ptr< T > &p2 ){
return( !( p2 > p1 ) ); }
837 inline std::ostream &operator <<( std::ostream &out, const scoped_ptr< T > &p )
852 inline std::ostream &operator <<( std::ostream &out, const scoped_array< T > &p )
867 inline std::ostream &operator <<( std::ostream &out, const shared_ptr< T > &p )
881 inline std::ostream &operator <<( std::ostream &out, const weak_ptr< T > &p )
896 #endif // __INCLUDE_MIST_POINTER_H__