Титульная страница   Иерархия классов   Алфавитный указатель   Классы   Файлы   Члены классов   Члены файла   Примеры  

BGDNetShare.h

См. документацию.
00001 
00006 #ifndef __BGDNetShare_h__
00007 #define __BGDNetShare_h__
00008 
00009 #include "BGDNetConfig.h"
00010 
00011 #include <assert.h>
00012 
00013 namespace BGDNet
00014 {
00015 
00024 class BGDNET_API Share
00025 {
00026 public:
00027 
00028   Share( void );
00034   Share( const Share& );
00040   Share& operator =( const Share& );
00047   void addRef( void );
00052   void release( void );
00058   bool shared( void ) const;
00065 protected:
00066 
00067   virtual ~Share( void ) {};
00072 private:
00073 
00074   unsigned long m_refCnt;
00078 };
00079 
00080 inline
00081 Share::Share( void ) : m_refCnt(1)
00082 {
00083 }
00084 
00085 inline
00086 Share::Share( const Share& ) : m_refCnt(1)
00087 {
00088 }
00089 
00090 inline
00091 Share& Share::operator =( const Share& )
00092 {
00093   return *this;
00094 }
00095 
00096 inline
00097 void Share::addRef( void )
00098 {
00099   ++m_refCnt;
00100 }
00101 
00102 inline
00103 void Share::release( void )
00104 {
00105   if (!--m_refCnt)
00106     delete this;
00107 }
00108 
00109 inline
00110 bool Share::shared( void ) const
00111 {
00112   return m_refCnt > 0;
00113 }
00114 
00115 
00116 
00117 
00125 template <class S>
00126 class BGDNET_API SharePtr
00127 {
00128 public:
00129 
00130   SharePtr( S* p = 0 );
00138   SharePtr( const SharePtr& p );
00143   ~SharePtr( void );
00149   SharePtr& operator =( S* p );
00154   SharePtr& operator =( const SharePtr& p );
00159   const S* operator ->( void ) const;
00164   S* operator ->( void );
00169   const S& operator *( void ) const;
00174   S& operator *( void );
00179   operator const S*( void ) const;
00184   operator S*( void );
00189 private:
00190 
00191   S* m_pShare;
00195 };
00196 
00197 template <class S> inline
00198 SharePtr<S>::SharePtr( S* p ) : m_pShare(p)
00199 {
00200 }
00201 
00202 template <class S> inline
00203 SharePtr<S>::SharePtr( const SharePtr& p ) : m_pShare(p.m_pShare)
00204 {
00205   if (m_pShare)
00206     m_pShare->addRef();
00207 }
00208 
00209 template <class S> inline
00210 SharePtr<S>::~SharePtr( void )
00211 {
00212   if (m_pShare)
00213     m_pShare->release();
00214 }
00215 
00216 template <class S>
00217 SharePtr<S>& SharePtr<S>::operator =( S* p )
00218 {
00219   if (m_pShare != p) // не допускаем присваивания самому себе!
00220   {
00221     if (m_pShare)
00222       m_pShare->release();
00223     m_pShare = p;
00224   }
00225   return *this;
00226 }
00227 
00228 template <class S>
00229 SharePtr<S>& SharePtr<S>::operator =( const SharePtr& p )
00230 {
00231   if (this != &p)
00232   {
00233     // "Отпустить" текущий ресурс:
00234     if (m_pShare)
00235       m_pShare->release();
00236     
00237     // Привязаться к новому ресурсу:
00238     m_pShare = p.m_pShare;
00239 
00240     // Увеличить счетчик ссылок на новый ресурс:
00241     if (m_pShare)
00242       m_pShare->addRef();
00243   }
00244   return *this;
00245 }
00246 
00247 template <class S> inline
00248 const S* SharePtr<S>::operator ->( void ) const
00249 {
00250   return m_pShare;
00251 }
00252 
00253 template <class S> inline
00254 S* SharePtr<S>::operator ->( void )
00255 {
00256   return m_pShare;
00257 }
00258 
00259 template <class S> inline
00260 const S& SharePtr<S>::operator *( void ) const
00261 {
00262   assert(m_pShare);
00263   return *m_pShare;
00264 }
00265 
00266 template <class S> inline
00267 S& SharePtr<S>::operator *( void )
00268 {
00269   assert(m_pShare);
00270   return *m_pShare;
00271 }
00272 
00273 template <class S> inline
00274 SharePtr<S>::operator const S*( void ) const
00275 {
00276   return m_pShare;
00277 }
00278 
00279 template <class S> inline
00280 SharePtr<S>::operator S*( void )
00281 {
00282   return m_pShare;
00283 }
00284 
00285 } // namespace BGDNet
00286 
00287 #endif //__BGDNetShare_h__

РУП БЕЛГИПРОДОР Документация на BGDNet сгенерирована Mon Apr 1 18:36:52 2002, БЕЛГИПРОДОР ©  2001