00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015
00016
00017
00018
00019
00020
00021
00022
00023
00024
00025
00026
00027 #ifndef CEYLAN_HOLDER_H_
00028 #define CEYLAN_HOLDER_H_
00029
00030
00031
00032
00033 namespace Ceylan
00034 {
00035
00036
00037
00066 template <typename Held>
00067 class Holder
00068 {
00069
00070
00071 public:
00072
00073
00074
00082 explicit Holder( Held & heldReference ) ;
00083
00084
00085
00090 ~Holder() throw() ;
00091
00092
00093
00098 Held & get() const ;
00099
00100
00102 Held & operator*() const ;
00103
00104
00106 Held * operator->() const ;
00107
00108
00109
00110 private:
00111
00112
00114 Held * _held ;
00115
00116
00124 Holder( const Holder & source ) ;
00125
00126
00134 Holder & operator = ( const Holder & source ) ;
00135
00136
00137 } ;
00138
00139
00140
00142
00143
00144 template <typename Held>
00145 Holder<Held>::Holder( Held & heldReference ) :
00146 _held( & heldReference )
00147 {
00148
00149 }
00150
00151
00152 template <typename Held>
00153 Holder<Held>::~Holder() throw()
00154 {
00155
00156 delete Holder<Held>::_held ;
00157
00158 }
00159
00160
00161 template <typename Held>
00162 Held & Holder<Held>::get() const
00163 {
00164
00165 return *Holder<Held>::_held ;
00166
00167 }
00168
00169
00170 template <typename Held>
00171 Held & Holder<Held>::operator*() const
00172 {
00173
00174 return Holder<Held>::get() ;
00175
00176 }
00177
00178
00179 template <typename Held>
00180 Held * Holder<Held>::operator->() const
00181 {
00182
00183 return & Holder<Held>::get() ;
00184
00185 }
00186
00187
00188 }
00189
00190
00191
00192 #endif // CEYLAN_HOLDER_H_
00193