File indexing completed on 2025-02-21 10:00:35
0001
0002
0003
0004
0005
0006
0007
0008
0009
0010
0011
0012
0013
0014
0015
0016
0017
0018
0019
0020 #ifndef KERNEL_SMARTREFVECTOR_H
0021 #define KERNEL_SMARTREFVECTOR_H 1
0022
0023
0024 #include <vector>
0025
0026
0027 #include "GaudiKernel/SmartRef.h"
0028
0029
0030 struct _object;
0031 namespace SmartRefVectorImpl {
0032 using PyObject = _object;
0033
0034 struct SmartRefVectorPythonizer {
0035
0036
0037
0038
0039 static void __cppyy_pythonize__( PyObject* klass, const std::string& name );
0040 };
0041 }
0042
0043
0044
0045
0046
0047
0048
0049
0050
0051
0052
0053
0054
0055
0056
0057
0058
0059
0060
0061
0062
0063
0064
0065
0066
0067
0068
0069
0070
0071
0072
0073
0074
0075
0076
0077
0078 template <class TYPE>
0079 class SmartRefVector : public std::vector<SmartRef<TYPE>>, SmartRefVectorImpl::SmartRefVectorPythonizer {
0080 protected:
0081
0082 typedef SmartRef<TYPE> _Entry;
0083
0084 typedef std::vector<_Entry> _Base;
0085 typedef typename std::vector<_Entry>::const_iterator _BaseConstIter;
0086 typedef typename std::vector<_Entry>::value_type _BaseValueType;
0087
0088
0089 mutable const DataObject* m_data;
0090
0091 mutable const ContainedObject* m_contd;
0092
0093
0094 void _setEnvironment( const DataObject* pObj, const ContainedObject* pContd ) const {
0095 m_data = pObj;
0096 m_contd = pContd;
0097 for ( _BaseConstIter i = _Base::begin(); i != _Base::end(); i++ ) { ( *i )._setEnvironment( pObj, pContd ); }
0098 }
0099
0100 public:
0101 using SmartRefVectorPythonizer::__cppyy_pythonize__;
0102
0103
0104 SmartRefVector() {
0105 m_contd = 0;
0106 m_data = 0;
0107 }
0108
0109 template <class ITERATOR>
0110 SmartRefVector( ITERATOR first, ITERATOR last )
0111 : std::vector<SmartRef<TYPE>>( first, last ), m_data( 0 ), m_contd( 0 ) {}
0112
0113 SmartRefVector( const SmartRefVector& copy ) : std::vector<SmartRef<TYPE>>( copy ) { *this = copy; }
0114
0115
0116
0117
0118
0119 SmartRefVector<TYPE>& operator()( ContainedObject* pObj ) {
0120 _setEnvironment( ( 0 == pObj ) ? 0 : pObj->parent(), pObj );
0121 return *this;
0122 }
0123
0124 const SmartRefVector<TYPE>& operator()( const ContainedObject* pObj ) const {
0125 _setEnvironment( ( 0 == pObj ) ? 0 : pObj->parent(), pObj );
0126 return *this;
0127 }
0128
0129 SmartRefVector<TYPE>& operator()( DataObject* pObj ) {
0130 _setEnvironment( pObj, 0 );
0131 return *this;
0132 }
0133
0134 const SmartRefVector<TYPE>& operator()( const DataObject* pObj ) const {
0135 _setEnvironment( pObj, 0 );
0136 return *this;
0137 }
0138
0139 SmartRefVector<TYPE>& operator=( const SmartRefVector<TYPE>& copy ) {
0140 _Base::operator=( copy );
0141
0142
0143
0144
0145 m_data = copy.m_data;
0146 m_contd = copy.m_contd;
0147 return *this;
0148 }
0149
0150 const std::type_info* type() const { return &typeid( TYPE ); }
0151
0152 StreamBuffer& readRefs( StreamBuffer& s );
0153
0154 StreamBuffer& writeRefs( StreamBuffer& s ) const;
0155
0156
0157 friend StreamBuffer& operator<<( StreamBuffer& _s, const SmartRefVector<TYPE>& ptr ) { return ptr.writeRefs( _s ); }
0158
0159
0160 friend StreamBuffer& operator>>( StreamBuffer& _s, SmartRefVector<TYPE>& ptr ) { return ptr.readRefs( _s ); }
0161 };
0162
0163 template <class TYPE>
0164 inline StreamBuffer& SmartRefVector<TYPE>::writeRefs( StreamBuffer& s ) const {
0165 long len = _Base::size();
0166 s << len;
0167 for ( _BaseConstIter i = _Base::begin(); i != _Base::end(); i++ ) {
0168 ( *i )._setEnvironment( m_data, m_contd );
0169 ( *i ).writeRef( s );
0170 }
0171 return s;
0172 }
0173
0174 template <class TYPE>
0175 inline StreamBuffer& SmartRefVector<TYPE>::readRefs( StreamBuffer& s ) {
0176 long len;
0177 _Base::erase( _Base::begin(), _Base::end() );
0178 s >> len;
0179 for ( long i = 0; i < len; i++ ) {
0180 _BaseValueType entry;
0181 entry._setEnvironment( m_data, m_contd );
0182 entry.readRef( s );
0183 _Base::push_back( entry );
0184 }
0185 return s;
0186 }
0187
0188 #endif