00001
00002
00003
00004
00005
00006
00007
00008
00009
00010 #ifndef KERNEL_SMARTREFVECTOR_H
00011 #define KERNEL_SMARTREFVECTOR_H 1
00012
00013
00014 #include <vector>
00015
00016
00017 #include "GaudiKernel/SmartRef.h"
00018
00054 template <class TYPE> class SmartRefVector : public std::vector < SmartRef<TYPE> > {
00055 protected:
00057 typedef SmartRef<TYPE> _Entry;
00059 typedef std::vector <_Entry> _Base;
00060 typedef typename std::vector<_Entry>::const_iterator _BaseConstIter;
00061 typedef typename std::vector<_Entry>::value_type _BaseValueType;
00062
00064 mutable const DataObject* m_data;
00066 mutable const ContainedObject* m_contd;
00067
00069 void _setEnvironment(const DataObject* pObj, const ContainedObject* pContd) const {
00070 m_data = pObj;
00071 m_contd = pContd;
00072 for ( _BaseConstIter i = _Base::begin(); i != _Base::end(); i++ ) {
00073 (*i)._setEnvironment(pObj, pContd);
00074 }
00075 }
00076 public:
00078 SmartRefVector() {
00079 m_contd = 0;
00080 m_data = 0;
00081 }
00083 template <class ITERATOR>
00084 SmartRefVector( ITERATOR first , ITERATOR last )
00085 : std::vector< SmartRef<TYPE> >( first , last )
00086 , m_data ( 0 )
00087 , m_contd ( 0 )
00088 {
00089
00090 }
00092 SmartRefVector(const SmartRefVector& copy)
00093 : std::vector< SmartRef<TYPE> >(copy) {
00094 *this = copy;
00095 }
00097
00098
00099
00101 SmartRefVector<TYPE>& operator() (ContainedObject* pObj) {
00102 _setEnvironment((0==pObj) ? 0 : pObj->parent(), pObj);
00103 return *this;
00104 }
00106 const SmartRefVector<TYPE>& operator() (const ContainedObject* pObj) const {
00107 _setEnvironment((0==pObj) ? 0 : pObj->parent(), pObj);
00108 return *this;
00109 }
00111 SmartRefVector<TYPE>& operator() (DataObject* pObj) {
00112 _setEnvironment(pObj,0);
00113 return *this;
00114 }
00116 const SmartRefVector<TYPE>& operator() (const DataObject* pObj) const {
00117 _setEnvironment(pObj,0);
00118 return *this;
00119 }
00121 SmartRefVector<TYPE>& operator=(const SmartRefVector<TYPE>& copy) {
00122 _Base::operator=(copy);
00123
00124
00125
00126
00127 m_data = copy.m_data;
00128 m_contd = copy.m_contd;
00129 return *this;
00130 }
00132 const std::type_info* type() const {
00133 return &typeid(TYPE);
00134 }
00136 StreamBuffer& readRefs(StreamBuffer& s);
00138 StreamBuffer& writeRefs(StreamBuffer& s) const;
00140 friend StreamBuffer& operator<< (StreamBuffer& s, const SmartRefVector<TYPE>& ptr) {
00141 return ptr.writeRefs(s);
00142 }
00144 friend StreamBuffer& operator>> (StreamBuffer& s, SmartRefVector<TYPE>& ptr) {
00145 return ptr.readRefs(s);
00146 }
00147 };
00148
00149 template <class TYPE> inline
00150 StreamBuffer& SmartRefVector<TYPE>::writeRefs(StreamBuffer& s) const {
00151 long len = _Base::size();
00152 s << len;
00153 for ( _BaseConstIter i = _Base::begin(); i != _Base::end(); i++ ) {
00154 (*i)._setEnvironment(m_data, m_contd);
00155 (*i).writeRef(s);
00156 }
00157 return s;
00158 }
00159
00160 template <class TYPE> inline
00161 StreamBuffer& SmartRefVector<TYPE>::readRefs(StreamBuffer& s) {
00162 long len;
00163 _Base::erase( _Base::begin(), _Base::end() );
00164 s >> len;
00165 for ( long i = 0; i < len; i++ ) {
00166 _BaseValueType entry;
00167 entry._setEnvironment(m_data, m_contd);
00168 entry.readRef(s);
00169 _Base::push_back( entry );
00170 }
00171 return s;
00172 }
00173
00174 #endif // KERNEL_SMARTREFVECTOR_H