The Gaudi Framework  v30r3 (a5ef0a68)
SmartRefVector.h
Go to the documentation of this file.
1 // ====================================================================
2 // SmartRefVector.h
3 // --------------------------------------------------------------------
4 //
5 // Package : Kernel
6 //
7 // Author : Markus Frank
8 //
9 // ====================================================================
10 #ifndef KERNEL_SMARTREFVECTOR_H
11 #define KERNEL_SMARTREFVECTOR_H 1
12 
13 // STL include files
14 #include <vector>
15 
16 // Include files
17 #include "GaudiKernel/SmartRef.h"
18 
54 template <class TYPE>
55 class SmartRefVector : public std::vector<SmartRef<TYPE>>
56 {
57 protected:
64 
66  mutable const DataObject* m_data;
68  mutable const ContainedObject* m_contd;
69 
71  void _setEnvironment( const DataObject* pObj, const ContainedObject* pContd ) const
72  {
73  m_data = pObj;
74  m_contd = pContd;
75  for ( _BaseConstIter i = _Base::begin(); i != _Base::end(); i++ ) {
76  ( *i )._setEnvironment( pObj, pContd );
77  }
78  }
79 
80 public:
83  {
84  m_contd = 0;
85  m_data = 0;
86  }
88  template <class ITERATOR>
89  SmartRefVector( ITERATOR first, ITERATOR last )
90  : std::vector<SmartRef<TYPE>>( first, last ), m_data( 0 ), m_contd( 0 )
91  {
92  }
94  SmartRefVector( const SmartRefVector& copy ) : std::vector<SmartRef<TYPE>>( copy ) { *this = copy; }
96  // virtual ~SmartRefVector() {
97  //}
98 
101  {
102  _setEnvironment( ( 0 == pObj ) ? 0 : pObj->parent(), pObj );
103  return *this;
104  }
106  const SmartRefVector<TYPE>& operator()( const ContainedObject* pObj ) const
107  {
108  _setEnvironment( ( 0 == pObj ) ? 0 : pObj->parent(), pObj );
109  return *this;
110  }
113  {
114  _setEnvironment( pObj, 0 );
115  return *this;
116  }
118  const SmartRefVector<TYPE>& operator()( const DataObject* pObj ) const
119  {
120  _setEnvironment( pObj, 0 );
121  return *this;
122  }
125  {
126  _Base::operator=( copy );
127  // Harms.... MF
128  // on copy we MUST make a 1 to 1 copy
129  // _setEnvironment( copy.m_data, copy.m_contd );
130  // use instead:
131  m_data = copy.m_data;
132  m_contd = copy.m_contd;
133  return *this;
134  }
136  const std::type_info* type() const { return &typeid( TYPE ); }
140  StreamBuffer& writeRefs( StreamBuffer& s ) const;
142  // MCl: it is "_s" instead of the most common "s" to avoid a fake icc remark #1599
143  friend StreamBuffer& operator<<( StreamBuffer& _s, const SmartRefVector<TYPE>& ptr ) { return ptr.writeRefs( _s ); }
145  // MCl: it is "_s" instead of the most common "s" to avoid a fake icc remark #1599
146  friend StreamBuffer& operator>>( StreamBuffer& _s, SmartRefVector<TYPE>& ptr ) { return ptr.readRefs( _s ); }
147 };
148 
149 template <class TYPE>
151 {
152  long len = _Base::size();
153  s << len;
154  for ( _BaseConstIter i = _Base::begin(); i != _Base::end(); i++ ) {
155  ( *i )._setEnvironment( m_data, m_contd );
156  ( *i ).writeRef( s );
157  }
158  return s;
159 }
160 
161 template <class TYPE>
163 {
164  long len;
166  s >> len;
167  for ( long i = 0; i < len; i++ ) {
168  _BaseValueType entry;
169  entry._setEnvironment( m_data, m_contd );
170  entry.readRef( s );
171  _Base::push_back( entry );
172  }
173  return s;
174 }
175 
176 #endif // KERNEL_SMARTREFVECTOR_H
std::vector< _Entry >::value_type _BaseValueType
T operator=(T...args)
const std::type_info * type() const
Access to embedded type.
The stream buffer is a small object collecting object data.
Definition: StreamBuffer.h:41
SmartRefVector< TYPE > & operator()(ContainedObject *pObj)
Standard destructor.
STL namespace.
Kernel objects: SmartRef.
Definition: SmartRef.h:66
T end(T...args)
SmartRefVector()
Standard Constructor.
const ContainedObject * m_contd
Object data: Pointer to the Contained object (if applicable)
const ObjectContainerBase * parent() const
Access to parent object.
Kernel objects: SmartRefVector.
SmartRefVector< TYPE > & operator()(DataObject *pObj)
operator(): assigns parent object for serialisation
T push_back(T...args)
std::vector< _Entry >::const_iterator _BaseConstIter
T erase(T...args)
SmartRefVector(const SmartRefVector &copy)
Copy Constructor.
StreamBuffer & readRefs(StreamBuffer &s)
Helper to read references.
All classes that their objects may be contained in an LHCb ObjectContainer (e.g.
T size(T...args)
STL class.
SmartRefVector(ITERATOR first, ITERATOR last)
templated Constructor
T begin(T...args)
const SmartRefVector< TYPE > & operator()(const DataObject *pObj) const
operator() const: assigns parent object for serialisation
std::vector< _Entry > _Base
Object types: typedef myself as Base.
string s
Definition: gaudirun.py:253
friend StreamBuffer & operator>>(StreamBuffer &_s, SmartRefVector< TYPE > &ptr)
Input Streamer operator.
const DataObject * m_data
Object data: Pointer to the identifiable object the link originates.
void _setEnvironment(const DataObject *pObj, const ContainedObject *pContd) const
Set the environment for the vector and all contained objects references.
A DataObject is the base class of any identifiable object on any data store.
Definition: DataObject.h:30
SmartRef< TYPE > _Entry
That&#39;s the type of crap I am hosting.
const SmartRefVector< TYPE > & operator()(const ContainedObject *pObj) const
operator() const: assigns parent object for serialisation
StreamBuffer & writeRefs(StreamBuffer &s) const
Helper to write references.
SmartRefVector< TYPE > & operator=(const SmartRefVector< TYPE > &copy)
Assignment.