00001
00002
00003 #ifndef XAODCORE_ADDDVPROXY_H
00004 #define XAODCORE_ADDDVPROXY_H
00005
00006
00007 #include <vector>
00008 #include <set>
00009
00010
00011 #include <TClass.h>
00012 #include <TError.h>
00013 #include <TInterpreter.h>
00014 #if ROOT_VERSION_CODE < ROOT_VERSION( 5, 99, 0 )
00015 # include <Cintex/Cintex.h>
00016 #endif // ROOT_VERSION
00017
00018
00019 #include "AthContainers/DataVector.h"
00020
00021
00022 #include "xAODCore/tools/TDVCollectionProxy.h"
00023
00024 #if ROOT_VERSION_CODE >= ROOT_VERSION( 5, 99, 0 )
00025
00042 #define ADD_DV_PROXY( TYPE ) \
00043 namespace ROOT { \
00044 TGenericClassInfo* GenerateInitInstance( const TYPE* ); \
00045 } \
00046 int register_##TYPE##_CollectionProxy() { \
00047 xAOD::AddDVProxy::add< TYPE >( ROOT::GenerateInitInstance( ( TYPE* ) 0x0 ) ); \
00048 return 1; \
00049 } \
00050 static int _R__UNIQUE_( dummy_##TYPE##_Var ) = \
00051 register_##TYPE##_CollectionProxy(); \
00052 R__UseDummy( _R__UNIQUE_( dummy_##TYPE##_Var ) )
00053
00070 #define ADD_NS_DV_PROXY( NS, TYPE ) \
00071 namespace ROOT { \
00072 TGenericClassInfo* GenerateInitInstance( const NS::TYPE* ); \
00073 } \
00074 int register_##NS##_##TYPE##_CollectionProxy() { \
00075 xAOD::AddDVProxy::add< NS::TYPE >( ROOT::GenerateInitInstance( ( NS::TYPE* ) 0x0 ) ); \
00076 return 1; \
00077 } \
00078 static int _R__UNIQUE_( dummy_##NS##_##TYPE##_Var ) = \
00079 register_##NS##_##TYPE##_CollectionProxy(); \
00080 R__UseDummy( _R__UNIQUE_( dummy_##NS##_##TYPE##_Var ) )
00081
00082 #else
00083
00100 #define ADD_DV_PROXY( TYPE ) \
00101 int register_##TYPE##_CollectionProxy() { \
00102 xAOD::AddDVProxy::add< TYPE >( 0 ); \
00103 return 1; \
00104 } \
00105 static int _R__UNIQUE_( dummy_##TYPE##_Var ) = \
00106 register_##TYPE##_CollectionProxy(); \
00107 R__UseDummy( _R__UNIQUE_( dummy_##TYPE##_Var ) )
00108
00125 #define ADD_NS_DV_PROXY( NS, TYPE ) \
00126 int register_##NS##_##TYPE##_CollectionProxy() { \
00127 xAOD::AddDVProxy::add< NS::TYPE >( 0 ); \
00128 return 1; \
00129 } \
00130 static int _R__UNIQUE_( dummy_##NS##_##TYPE##_Var ) = \
00131 register_##NS##_##TYPE##_CollectionProxy(); \
00132 R__UseDummy( _R__UNIQUE_( dummy_##NS##_##TYPE##_Var ) )
00133
00134 #endif // ROOT_VERSION
00135
00136 namespace xAOD {
00137
00144 class AddDVProxy {
00145
00146 private:
00158 template< class T >
00159 struct Helper {
00160
00162 typedef T Cont_t;
00164 typedef typename Cont_t::base_value_type Value_t;
00165
00171 static void resize( void* obj, size_t size ) {
00172
00173
00174 Cont_t* c = reinterpret_cast< Cont_t* >( obj );
00175
00176
00177 c->setStore( ( SG::IAuxStore* ) 0 );
00178
00179
00180 c->resize( size );
00181
00182
00183 for( size_t i = 0; i < size; ++i ) {
00184
00185
00186 if( ( *c )[ i ] ) continue;
00187
00188
00189 ( *c )[ i ] = new Value_t();
00190 }
00191
00192 return;
00193 }
00194
00195 };
00196
00198 static void loadDictionaries();
00199
00200 public:
00206 template < typename T >
00207 static void add( ROOT::TGenericClassInfo* clInfo ) {
00208
00209
00210 gInterpreter->EnableAutoLoading();
00211 #if ROOT_VERSION_CODE < ROOT_VERSION( 5, 99, 0 )
00212 ROOT::Cintex::Cintex::Enable();
00213 #endif // ROOT_VERSION
00214
00215
00216 loadDictionaries();
00217
00218
00219 TDVCollectionProxy* proxy =
00220 new TDVCollectionProxy( ClassName< T >::name().c_str() );
00221 proxy->SetResize( Helper< T >::resize );
00222
00223 if( clInfo ) {
00224
00225
00226
00227
00228 clInfo->AdoptCollectionProxy( proxy );
00229
00230 } else {
00231
00232
00233
00234
00235 TClass* cl = TClass::GetClass( typeid( T ) );
00236 if( ! cl ) {
00237 ::Error( "xAOD::AddDVProxy::add",
00238 "Couldn't find dictionary for type \"%s\"",
00239 ClassName< T >::name().c_str() );
00240 delete proxy;
00241 return;
00242 }
00243
00244
00245 cl->CopyCollectionProxy( *proxy );
00246
00247 delete proxy;
00248
00249 }
00250
00251 return;
00252 }
00253
00254 };
00255
00256 }
00257
00258 #endif // XAODCORE_ADDDVPROXY_H