00001
00002
00003 #ifndef GAUDIUTILS_GETDATA_H
00004 #define GAUDIUTILS_GETDATA_H 1
00005
00006
00007
00008
00009
00010 #include "GaudiKernel/IDataProviderSvc.h"
00011 #include "GaudiKernel/SmartDataPtr.h"
00012
00013
00014
00015 #include "GaudiUtils/Range.h"
00016 #include "GaudiUtils/NamedRange.h"
00017
00018
00019
00020 template <class BASE> class GaudiCommon ;
00021
00022 namespace Gaudi
00023 {
00024 namespace Utils
00025 {
00026
00033 template <class TYPE>
00034 struct _GetType
00035 { typedef TYPE* return_type ; };
00036
00038 template <class TYPE>
00039 struct _GetType<TYPE*>
00040 { typedef TYPE* return_type ; };
00041
00043 template <class TYPE>
00044 struct _GetType<TYPE&>
00045 { typedef TYPE* return_type ; };
00046
00048 template <class CONTAINER>
00049 struct _GetType<Gaudi::Range_<CONTAINER> >
00050 { typedef Gaudi::Range_<CONTAINER> return_type ; };
00051
00053 template <class CONTAINER>
00054 struct _GetType<Gaudi::NamedRange_<CONTAINER> >
00055 { typedef Gaudi::NamedRange_<CONTAINER> return_type ; };
00056
00065 template <class TYPE>
00066 struct GetData
00067 {
00068 public:
00069
00070 typedef TYPE Type ;
00072 typedef typename _GetType<Type>::return_type return_type ;
00073
00074 public:
00075
00082 template <class COMMON>
00083 inline return_type operator()
00084 ( const COMMON& common ,
00085 IDataProviderSvc* service ,
00086 const std::string& location ) const
00087 {
00089 SmartDataPtr<TYPE> obj ( service , location ) ;
00090 return_type aux = obj ;
00092 common.Assert ( !(!aux) , "get():: No valid data at '" + location + "'" ) ;
00094 if ( common.msgLevel ( MSG::DEBUG ) )
00095 { common.debug() << "The object of type '"
00096 << System::typeinfoName(typeid(aux))
00097 << "' has been retrieved from TS at address '"
00098 << location << "'" << endreq ; }
00099
00100 return aux ;
00101
00102 }
00103 };
00104
00106 template <class TYPE>
00107 struct GetData<Gaudi::Range_<std::vector<const TYPE*> > >
00108 {
00109 public:
00110
00112 typedef Gaudi::Range_<std::vector<const TYPE*> > Type ;
00113 typedef typename _GetType<Type>::return_type return_type ;
00114
00115 public:
00116
00123 template <class COMMON>
00124 inline return_type operator()
00125 ( const COMMON& common ,
00126 IDataProviderSvc* service ,
00127 const std::string& location ) const
00128 {
00129 {
00130 SmartDataPtr<typename TYPE::Selection> obj ( service , location ) ;
00131 typename TYPE::Selection* aux = obj ;
00132 if ( 0 != aux )
00133 {
00134 if ( common.msgLevel ( MSG::DEBUG ) )
00135 { common.debug() << "The object of type '"
00136 << System::typeinfoName(typeid(*aux))
00137 << "' has been retrieved from TS at address '"
00138 << location << "'" << endreq ; }
00139 return make_range ( aux->begin() , aux->end() ) ;
00140 }
00141 }
00142 {
00143 SmartDataPtr<typename TYPE::Container> obj ( service , location ) ;
00144 typename TYPE::Container* aux = obj ;
00145 if ( 0 != aux )
00146 {
00147 if ( common.msgLevel ( MSG::DEBUG ) )
00148 { common.debug() << "The object of type '"
00149 << System::typeinfoName(typeid(*aux))
00150 << "' has been retrieved from TS at address '"
00151 << location << "'" << endreq ; }
00152 return make_range ( aux->begin() , aux->end() ) ;
00153 }
00154 }
00155
00156 common.Assert ( false , "get():: No valid data at '" + location + "'" ) ;
00157
00158 return return_type () ;
00159 }
00160
00161 private:
00162
00163 template <class ITERATOR>
00164 return_type make_range
00165 ( ITERATOR first ,
00166 ITERATOR last ) const
00167 {
00168 ITERATOR _begin = first ;
00169 ITERATOR _end = last ;
00170 return return_type
00171 ( *reinterpret_cast<typename return_type::const_iterator*> ( &_begin ) ,
00172 *reinterpret_cast<typename return_type::const_iterator*> ( &_end ) ) ;
00173 }
00174
00175 } ;
00176
00178 template <class TYPE>
00179 struct GetData<Gaudi::NamedRange_<std::vector<const TYPE*> > >
00180 {
00181 public:
00182
00184 typedef Gaudi::NamedRange_<std::vector<const TYPE*> > Type ;
00185 typedef typename _GetType<Type>::return_type return_type ;
00186
00187 public:
00188
00195 template <class COMMON>
00196 inline return_type operator()
00197 ( const COMMON& common ,
00198 IDataProviderSvc* service ,
00199 const std::string& location ) const
00200 {
00201 {
00202 SmartDataPtr<typename TYPE::Selection> obj ( service , location ) ;
00203 typename TYPE::Selection* aux = obj ;
00204 if ( 0 != obj )
00205 {
00206 if ( common.msgLevel ( MSG::DEBUG ) )
00207 { common.debug() << "The object of type '"
00208 << System::typeinfoName(typeid(*aux))
00209 << "' has been retrieved from TS at address '"
00210 << location << "'" << endreq ; }
00211 return make_range ( aux -> begin() , aux -> end() , location ) ;
00212 }
00213 }
00214 {
00215 SmartDataPtr<typename TYPE::Container> obj ( service , location ) ;
00216 typename TYPE::Container* aux = obj ;
00217 if ( 0 != obj )
00218 {
00219 if ( common.msgLevel ( MSG::DEBUG ) )
00220 { common.debug() << "The object of type '"
00221 << System::typeinfoName(typeid(*aux))
00222 << "' has been retrieved from TS at address '"
00223 << location << "'" << endreq ; }
00224 return make_range ( aux -> begin() , aux -> end() , location ) ;
00225 }
00226 }
00227
00228 common.Assert ( false , "get():: No valid data at '" + location + "'" ) ;
00229
00230 return return_type () ;
00231 }
00232
00233 private:
00234
00235 template <class ITERATOR>
00236 return_type make_range
00237 ( ITERATOR first ,
00238 ITERATOR last ,
00239 const std::string& location ) const
00240 {
00241 ITERATOR _begin = first ;
00242 ITERATOR _end = last ;
00243 return return_type
00244 ( *reinterpret_cast<typename return_type::const_iterator*> ( &_begin ) ,
00245 *reinterpret_cast<typename return_type::const_iterator*> ( &_end ) ,
00246 location ) ;
00247 }
00248
00249 } ;
00250
00252 template <class TYPE>
00253 struct GetData<TYPE*> : public GetData<TYPE> {} ;
00254
00256 template <class TYPE>
00257 struct GetData<TYPE&> : public GetData<TYPE> {} ;
00258
00259 }
00260
00261 }
00262
00263
00264
00265 #endif // GAUDIUTILS_GETDATA_H
00266