]> git.sesse.net Git - vlc/blob - modules/gui/skins2/utils/pointer.hpp
Copyright fixes
[vlc] / modules / gui / skins2 / utils / pointer.hpp
1 /*****************************************************************************
2  * pointer.hpp
3  *****************************************************************************
4  * Copyright (C) 2003 VideoLAN (Centrale Réseaux) and its contributors
5  * $Id$
6  *
7  * Authors: Cyril Deguet     <asmax@via.ecp.fr>
8  *          Olivier Teulière <ipkiss@via.ecp.fr>
9  *
10  * This program is free software; you can redistribute it and/or modify
11  * it under the terms of the GNU General Public License as published by
12  * the Free Software Foundation; either version 2 of the License, or
13  * (at your option) any later version.
14  *
15  * This program is distributed in the hope that it will be useful,
16  * but WITHOUT ANY WARRANTY; without even the implied warranty of
17  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
18  * GNU General Public License for more details.
19  *
20  * You should have received a copy of the GNU General Public License
21  * along with this program; if not, write to the Free Software
22  * Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA  02111, USA.
23  *****************************************************************************/
24
25 #ifndef POINTER_HPP
26 #define POINTER_HPP
27
28
29 /// Reference couting pointer
30 template <class T> class CountedPtr
31 {
32     public:
33         explicit CountedPtr( T *pPtr = 0 ): m_pCounter( 0 )
34         {
35             if( pPtr ) m_pCounter = new Counter( pPtr );
36         }
37
38         ~CountedPtr() { release(); }
39
40         CountedPtr(const CountedPtr &rPtr ) { acquire( rPtr.m_pCounter ); }
41
42         CountedPtr &operator=( const CountedPtr &rPtr )
43         {
44             if( this != &rPtr )
45             {
46                 release();
47                 acquire( rPtr.m_pCounter );
48             }
49             return *this;
50         }
51
52         T &operator*() const { return *m_pCounter->m_pPtr; }
53
54         T *operator->() const {return m_pCounter->m_pPtr; }
55
56         T *get() const { return m_pCounter ? m_pCounter->m_pPtr : 0; }
57
58         bool unique() const
59         {
60             return ( m_pCounter ? m_pCounter->m_count == 1 : true );
61         }
62
63     private:
64         struct Counter
65         {
66             Counter( T* pPtr = 0, unsigned int c = 1 ):
67                 m_pPtr( pPtr ), m_count( c ) {}
68             T* m_pPtr;
69             unsigned int m_count;
70         } *m_pCounter;
71
72         void acquire( Counter* pCount )
73         {
74             m_pCounter = pCount;
75             if( pCount ) ++pCount->m_count;
76         }
77
78         void release()
79         {
80             if( m_pCounter )
81             {
82                 if( --m_pCounter->m_count == 0 )
83                 {
84                     delete m_pCounter->m_pPtr;
85                     delete m_pCounter;
86                 }
87                 m_pCounter = 0;
88             }
89         }
90 };
91
92
93 #endif