00001
00002 #ifndef GAUDIALG_TUPLE_H
00003 #define GAUDIALG_TUPLE_H 1
00004
00005
00006
00007
00008
00009 #include <string>
00010
00011
00019
00020
00021
00029
00030
00031 #include "GaudiAlg/TupleObj.h"
00032
00033 namespace Tuples
00034 {
00035
00036 template <class ITEM> class TupleItem ;
00037
00116 class Tuple
00117 {
00118 public:
00119
00124 Tuple ( TupleObj* tuple ) ;
00125
00127 Tuple ( const Tuple& tuple ) ;
00128
00130 virtual ~Tuple() ;
00131
00136 Tuple& operator=( const Tuple& tuple ) ;
00137
00141 TupleObj* operator-> () const { return tuple () ; }
00142
00144 bool valid () const { return 0 != tuple () ; }
00145
00146 protected:
00147
00149 TupleObj* tuple() const { return m_tuple ; }
00150
00151 private:
00152
00154 Tuple();
00155
00156 private:
00157
00159 TupleObj* m_tuple ;
00160
00161 };
00162
00277 template<class ITEM>
00278 class TupleColumn
00279 {
00280 public:
00281 TupleColumn ( const std::string& name ,
00282 const ITEM& value )
00283 : m_name ( name ) , m_value ( value ) {};
00284 public:
00286 const std::string& name () const { return m_name ; }
00288 const ITEM& value () const { return m_value ; }
00289 private:
00290 TupleColumn();
00291 private:
00292 std::string m_name ;
00293 ITEM m_value ;
00294 };
00295
00300 template<class ITEM>
00301 inline TupleColumn<ITEM>
00302 make_column ( const std::string& name , const ITEM& item )
00303 { return TupleColumn<ITEM> ( name , item ) ; }
00304
00309 template<class ITEM>
00310 inline TupleColumn<const ITEM*>
00311 make_column ( const std::string& name , const ITEM* item )
00312 { return TupleColumn<const ITEM*>( name , item ) ; }
00313
00318 template<class ITEM>
00319 inline TupleColumn<ITEM*>
00320 make_column ( const std::string& name , ITEM* item )
00321 { return TupleColumn<ITEM*> ( name , item ) ; }
00322
00323 template<class ITEM>
00324 inline TupleColumn<ITEM>
00325 Column ( const std::string& name , const ITEM& item )
00326 { return make_column ( name , item ) ; }
00327
00328 template<class ITEM>
00329 inline TupleColumn<const ITEM*>
00330 Column ( const std::string& name , const ITEM* item )
00331 { return make_column ( name , item ) ; }
00332
00333 template<class ITEM>
00334 inline TupleColumn<ITEM*>
00335 Column ( const std::string& name , ITEM* item )
00336 { return make_column ( name , item ) ; }
00337
00338 }
00339
00340
00342
00343 template <class ITEM>
00344 inline Tuples::Tuple& operator<<
00345 ( Tuples::Tuple& tuple ,
00346 const Tuples::TupleColumn<ITEM>& item )
00347 {
00348 if ( !tuple.valid() ) { return tuple ; }
00349 tuple->column( item.name() , item.value () ) ;
00350 return tuple ;
00351 }
00352
00353
00354
00355
00356
00357
00358
00359 #endif // GAUDIALG_TUPLE_H
00360