![]() |
|
|
Generated: 8 Jan 2009 |
00001 // $Id: Tuple.h,v 1.9 2008/10/27 19:22:20 marcocle Exp $ 00002 #ifndef GAUDIALG_TUPLE_H 00003 #define GAUDIALG_TUPLE_H 1 00004 // ============================================================================ 00005 // Include files 00006 // ============================================================================ 00007 // STD & STL 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 } // end of the namespace Tuples 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 ; } // no action for invalid tuple 00349 tuple->column( item.name() , item.value () ) ; 00350 return tuple ; 00351 } 00352 // ============================================================================ 00353 00354 00355 00356 // ============================================================================ 00357 // THe END 00358 // ============================================================================ 00359 #endif // GAUDIALG_TUPLE_H 00360 // ============================================================================