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 
00028 
00029 
00030 
00031 #ifndef _GLIBCXX_DEBUG_SAFE_BASE_H
00032 #define _GLIBCXX_DEBUG_SAFE_BASE_H 1
00033 
00034 namespace __gnu_debug
00035 {
00036   class _Safe_sequence_base;
00037 
00050   class _Safe_iterator_base
00051   {
00052   public:
00055     _Safe_sequence_base* _M_sequence;
00056 
00064     unsigned int         _M_version;
00065 
00068     _Safe_iterator_base* _M_prior;
00069 
00072     _Safe_iterator_base* _M_next;
00073 
00074   protected:
00076     _Safe_iterator_base()
00077     : _M_sequence(0), _M_version(0), _M_prior(0), _M_next(0)
00078     { }
00079 
00087     _Safe_iterator_base(const _Safe_sequence_base* __seq, bool __constant)
00088     : _M_sequence(0), _M_version(0), _M_prior(0), _M_next(0)
00089     { this->_M_attach(const_cast<_Safe_sequence_base*>(__seq), __constant); }
00090 
00094     _Safe_iterator_base(const _Safe_iterator_base& __x, bool __constant)
00095     : _M_sequence(0), _M_version(0), _M_prior(0), _M_next(0)
00096     { this->_M_attach(__x._M_sequence, __constant); }
00097 
00098     _Safe_iterator_base&
00099     operator=(const _Safe_iterator_base&);
00100 
00101     explicit
00102     _Safe_iterator_base(const _Safe_iterator_base&);
00103 
00104     ~_Safe_iterator_base() { this->_M_detach(); }
00105 
00106   public:
00112     void _M_attach(_Safe_sequence_base* __seq, bool __constant);
00113 
00117     void _M_detach();
00118 
00120     bool _M_attached_to(const _Safe_sequence_base* __seq) const
00121     { return _M_sequence == __seq; }
00122 
00124     bool _M_singular() const;
00125 
00129     bool _M_can_compare(const _Safe_iterator_base& __x) const;
00130   };
00131 
00149   class _Safe_sequence_base
00150   {
00151   public:
00153     _Safe_iterator_base* _M_iterators;
00154 
00156     _Safe_iterator_base* _M_const_iterators;
00157 
00159     mutable unsigned int _M_version;
00160 
00161   protected:
00162     
00163     _Safe_sequence_base()
00164     : _M_iterators(0), _M_const_iterators(0), _M_version(1)
00165     { }
00166 
00169     ~_Safe_sequence_base()
00170     { this->_M_detach_all(); }
00171 
00173     void
00174     _M_detach_all();
00175 
00180     void
00181     _M_detach_singular();
00182 
00188     void
00189     _M_revalidate_singular();
00190 
00196     void
00197     _M_swap(_Safe_sequence_base& __x);
00198 
00199   public:
00201     void
00202     _M_invalidate_all() const
00203     { if (++_M_version == 0) _M_version = 1; }
00204   };
00205 } 
00206 
00207 #endif