| Classes | Job Modules | Data Objects | Services | Algorithms | Tools | Packages | Directories | Tracs |

In This Package:

Property.h

Go to the documentation of this file.
00001 // $Id: Property.h,v 1.27 2008/12/01 19:57:43 marcocle Exp $
00002 // ============================================================================
00003 // CVS tag $Name: GAUDI_v20r4-pre $
00004 // ============================================================================
00005 #ifndef GAUDIKERNEL_PROPERTY_H
00006 #define GAUDIKERNEL_PROPERTY_H
00007 // ============================================================================
00008 // STD & STL
00009 // ============================================================================
00010 #include <string>
00011 #include <stdexcept>
00012 #include <typeinfo>
00013 // ============================================================================
00014 // Application C++ Class Headers
00015 // ============================================================================
00016 #include "GaudiKernel/Kernel.h"
00017 #include "GaudiKernel/PropertyVerifier.h"
00018 #include "GaudiKernel/Parsers.h"
00019 #include "GaudiKernel/ToStream.h"
00020 #include "GaudiKernel/SmartIF.h"
00021 // ============================================================================
00022 
00023 // ============================================================================
00024 class Property   ;
00025 class PropertyCallbackFunctor ;
00026 class IProperty  ;
00027 class IInterface ;
00028 // ============================================================================
00029 
00030 // ============================================================================
00032 // ============================================================================
00033 std::ostream&
00034 operator<<
00035   ( std::ostream&   stream ,
00036     const Property& prop   ) ;
00037 // ============================================================================
00046 class Property
00047 {
00048 public:
00050   const std::string&    name      () const { return m_name             ; } ;
00052   const   std::string&    documentation() const { return m_documentation; };
00054   const std::type_info* type_info () const { return m_typeinfo         ; } ;
00056   std::string           type      () const { return m_typeinfo->name() ; } ;
00058   virtual bool load   (       Property& dest   ) const = 0 ;
00060   virtual bool assign ( const Property& source )       = 0 ;
00061 public:
00063   virtual std::string  toString   ()  const = 0 ;
00065   virtual StatusCode   fromString ( const std::string& value ) = 0 ;
00066 public:
00068   const PropertyCallbackFunctor* readCallBack   () const ;
00070   const PropertyCallbackFunctor* updateCallBack () const ;
00072   virtual void  declareReadHandler   ( PropertyCallbackFunctor* pf ) ;
00074   virtual void  declareUpdateHandler ( PropertyCallbackFunctor* pf ) ;
00075   template< class HT >
00076   void declareReadHandler
00077   ( void ( HT::* MF ) ( Property& ) , HT* instance ) ;
00078   template< class HT >
00079   void declareUpdateHandler
00080   ( void ( HT::* MF ) ( Property& ) , HT* instance ) ;
00082   virtual void useReadHandler   () const ;
00084   virtual void useUpdateHandler ()       ;
00085 public:
00087   virtual ~Property() ;
00089   virtual Property*          clone     () const = 0 ;
00091   void setName ( const std::string& value ) { m_name = value ; }
00093   void setDocumentation( const std::string& documentation ) {
00094     m_documentation = documentation; };
00096   virtual std::ostream& fillStream ( std::ostream& ) const ;
00097 protected:
00099   Property
00100   ( const std::type_info& type      ,
00101     const std::string&    name = "" ) ;
00103   Property
00104   ( const std::string&    name      ,
00105     const std::type_info& type      ) ;
00107   Property           ( const Property& right ) ;
00109   Property& operator=( const Property& right ) ;
00110 private:
00111   // the default constructor is disabled
00112   Property() ;
00113 private:
00114   // property name
00115   std::string              m_name           ;
00116   // property doc string
00117   std::string              m_documentation;
00118   // property type
00119   const std::type_info*    m_typeinfo       ;
00120 protected:
00121   // call back funtor for reading
00122   mutable PropertyCallbackFunctor* m_readCallBack   ;
00123   // call back funtor for update
00124   PropertyCallbackFunctor* m_updateCallBack ;
00125 };
00126 // ============================================================================
00127 #include "GaudiKernel/PropertyCallbackFunctor.h"
00128 // ============================================================================
00129 template< class HT >
00130 inline void Property::declareReadHandler
00131 ( void ( HT::* MF ) ( Property& ) , HT* obj )
00132 { declareReadHandler ( new PropertyCallbackMemberFunctor< HT >( MF , obj ) ) ; }
00133 // ============================================================================
00134 template< class HT >
00135 inline void Property::declareUpdateHandler
00136 ( void ( HT::* MF ) ( Property& ) , HT* obj )
00137 { declareUpdateHandler ( new PropertyCallbackMemberFunctor< HT >( MF , obj ) ) ; }
00138 // ============================================================================
00146 // ============================================================================
00147 template <class TYPE>
00148 class PropertyWithValue
00149   : public Property
00150 {
00151 protected:
00153   PropertyWithValue
00154   ( const std::string& name  ,
00155     TYPE*              value ,
00156     const bool         owner ) ;
00158   PropertyWithValue ( const PropertyWithValue& rhs ) ;
00160   template <class OTHER>
00161   PropertyWithValue ( const PropertyWithValue<OTHER>& right ) ;
00163   virtual ~PropertyWithValue() ;
00165   PropertyWithValue& operator=( const TYPE& value ) ;
00166   // assignement operator (don't let the compiler generate a buggy one)
00167   PropertyWithValue& operator=( const PropertyWithValue& rhs ) ;
00168   // assignement operator
00169   template <class OTHER>
00170   PropertyWithValue& operator=( const PropertyWithValue<OTHER>& right ) ;
00171 public:
00172   operator const TYPE&      () const { return value() ;}
00173   const TYPE& value() const ;
00174 public:
00175   // NB: abstract : to be implemented when verifier is available
00176   virtual bool setValue ( const TYPE&     value  )  = 0  ;
00178   virtual bool assign   ( const Property& source )       ;
00180   virtual bool load     (       Property& dest   ) const ;
00182   virtual StatusCode fromString ( const std::string& s )  ;
00184   virtual std::string  toString   () const  ;
00185 protected:
00186   void  i_set ( const TYPE& value ) ;
00187   TYPE* i_get () const ;
00188 private:
00189   TYPE* m_value ;
00190   bool  m_own ;
00191 };
00192 // ============================================================================
00194 // ============================================================================
00195 template <class TYPE>
00196 inline PropertyWithValue<TYPE>::PropertyWithValue
00197 ( const std::string& name  ,
00198   TYPE*              value ,
00199   const bool         own   )
00200   : Property ( typeid( TYPE ) , name )
00201   , m_value  ( value )
00202   , m_own    ( own   )
00203 {}
00204 // ============================================================================
00205 // copy constructor
00206 // ============================================================================
00207 template <class TYPE>
00208 inline PropertyWithValue<TYPE>::PropertyWithValue
00209 ( const PropertyWithValue& right )
00210   : Property( right         )
00211   , m_value ( right.m_value )
00212   , m_own   ( right.own     )
00213 { if ( m_own ) { m_value = new TYPE(right.value()) ; } }
00214 // ============================================================================
00215 // "copy" constructor form any other type
00216 // ============================================================================
00217 template <class TYPE>
00218 template <class OTHER>
00219 inline PropertyWithValue<TYPE>::PropertyWithValue
00220 ( const PropertyWithValue<OTHER>& right )
00221   : Property( right         )
00222   , m_value ( right.m_value )
00223   , m_own   ( right.own     )
00224 { if ( m_own ) { m_value = new TYPE(right.value()) ; } }
00225 // ============================================================================
00227 // ============================================================================
00228 template <class TYPE>
00229 inline PropertyWithValue<TYPE>::~PropertyWithValue()
00230 { if ( m_own ) { delete m_value ; } ;  m_value = 0 ; }
00231 // ============================================================================
00233 // ============================================================================
00234 template <class TYPE>
00235 inline PropertyWithValue<TYPE>&
00236 PropertyWithValue<TYPE>::operator=( const TYPE& value )
00237 {
00238   if ( !setValue ( value ) )
00239   { throw std::out_of_range( "Value not verified" ) ; }
00240   return *this ;
00241 }
00242 // ============================================================================
00244 // ============================================================================
00245 template <class TYPE>
00246 inline bool
00247 PropertyWithValue<TYPE>::assign ( const Property& source )
00248 {
00249   // 1) Is the property of "the same" type?
00250   const PropertyWithValue<TYPE>* p =
00251     dynamic_cast<const PropertyWithValue<TYPE>*>       ( &source ) ;
00252   if ( 0 != p ) { return setValue ( p->value() ) ; }       // RETURN
00253   // 2) Else use the string representation
00254   return this->fromString( source.toString() ).isSuccess() ;
00255 }
00256 // ============================================================================
00258 // ============================================================================
00259 template <class TYPE>
00260 inline bool
00261 PropertyWithValue<TYPE>::load( Property& dest ) const
00262 {
00263   // gelegate to the 'opposite' method ;
00264   return dest.assign( *this ) ;
00265 }
00266 // ============================================================================
00268 // ============================================================================
00269 template <class TYPE>
00270 inline std::string
00271 PropertyWithValue<TYPE>::toString () const
00272 {
00273   useReadHandler();
00274   return Gaudi::Utils::toString( *m_value ) ;
00275 }
00276 // ============================================================================
00278 // ============================================================================
00279 template <class TYPE>
00280 inline StatusCode
00281 PropertyWithValue<TYPE>::fromString ( const std::string& source )
00282 {
00283   TYPE tmp ;
00284   StatusCode sc = Gaudi::Parsers::parse ( tmp , source ) ;
00285   if ( sc.isFailure() ) { return sc ; }
00286   return setValue ( tmp ) ? StatusCode::SUCCESS : StatusCode::FAILURE ;
00287 }
00288 // ============================================================================
00290 // ============================================================================
00291 template <>
00292 inline std::string
00293 PropertyWithValue<std::string>::toString () const
00294 { return this->value() ; }
00295 // ============================================================================
00296 template <>
00297 inline bool PropertyWithValue<std::string>::assign ( const Property& source )
00298 { return this->fromString( source.toString() ).isSuccess() ; }
00299 // ============================================================================
00300 
00301 // ============================================================================
00303 // ============================================================================
00304 template <class TYPE>
00305 inline const TYPE&
00306 PropertyWithValue<TYPE>::value() const
00307 { useReadHandler() ; return *m_value ; }
00308 // ============================================================================
00309 // the actual modification of internale data
00310 // ============================================================================
00311 template <class TYPE>
00312 inline  void PropertyWithValue<TYPE>::i_set
00313 ( const TYPE& value ) { *m_value = value ; }
00314 // ============================================================================
00315 // protected accessor to internal data
00316 // ============================================================================
00317 template <class TYPE>
00318 inline TYPE* PropertyWithValue<TYPE>::i_get() const { return m_value ; }
00319 // ============================================================================
00320 // assignement operator
00321 // ============================================================================
00322 template <class TYPE>
00323 PropertyWithValue<TYPE>& PropertyWithValue<TYPE>::operator=
00324 ( const PropertyWithValue& right )
00325 {
00326   // assign the base class
00327   Property::operator=( right ) ;
00328   // assign the value
00329   PropertyWithValue<TYPE>::operator=( right.value() ) ;
00330   return *this ;
00331 }
00332 // ============================================================================
00333 // templated assignement operator
00334 // ============================================================================
00335 template <class TYPE>
00336 template <class OTHER>
00337 PropertyWithValue<TYPE>& PropertyWithValue<TYPE>::operator=
00338 ( const PropertyWithValue<OTHER>& right )
00339 {
00340   // assign the base class
00341   Property::operator=( right ) ;
00342   // assign the value
00343   PropertyWithValue<TYPE>::operator=( right.value() ) ;
00344   return *this ;
00345 }
00346 // ============================================================================
00347 
00348 // ============================================================================
00356 // ============================================================================
00357 template<class TYPE,class VERIFIER>
00358 class PropertyWithVerifier
00359   : public PropertyWithValue<TYPE>
00360 {
00361 protected:
00363   PropertyWithVerifier
00364   ( const std::string& name     ,
00365     TYPE*              value    ,
00366     const bool         owner    ,
00367     const VERIFIER&    verifier )
00368     : PropertyWithValue<TYPE> ( name , value , owner )
00369     , m_verifier ( verifier )
00370   {}
00372   virtual ~PropertyWithVerifier() {};
00373 public:
00374   inline       VERIFIER& verifier()       { return m_verifier ; }
00375   inline const VERIFIER& verifier() const { return m_verifier ; }
00377   bool set( const TYPE& value ) ;
00379   virtual bool setValue( const TYPE& value ) { return set( value ) ; }
00381   template <class OTHER,class OTHERVERIFIER>
00382   PropertyWithVerifier& operator=
00383   ( const PropertyWithVerifier<OTHER,OTHERVERIFIER>& right ) ;
00385   template <class OTHER>
00386   PropertyWithVerifier& operator=( const PropertyWithValue<OTHER>& right ) ;
00388   PropertyWithVerifier& operator=( const TYPE& right ) ;
00389 private:
00391   PropertyWithVerifier() ;
00393   PropertyWithVerifier( const  PropertyWithVerifier& right );
00394 private:
00395   VERIFIER m_verifier ;
00396 } ;
00397 // ============================================================================
00399 // ============================================================================
00400 template <class TYPE,class VERIFIER>
00401 inline bool
00402 PropertyWithVerifier<TYPE,VERIFIER>::set( const TYPE& value )
00403 {
00405   if ( !m_verifier.isValid( &value ) ) { return false ; }
00407   i_set( value ) ;
00409   this->useUpdateHandler() ;
00410   return true ;
00411 }
00412 // ============================================================================
00414 // ============================================================================
00415 template <class TYPE,class VERIFIER>
00416 inline PropertyWithVerifier<TYPE,VERIFIER>&
00417 PropertyWithVerifier<TYPE,VERIFIER>::operator=( const TYPE& right )
00418 {
00419   PropertyWithValue<TYPE>::operator=( right ) ;
00420   return *this ;
00421 }
00422 // ============================================================================
00424 // ============================================================================
00425 template <class TYPE,class VERIFIER>
00426 template <class OTHER>
00427 inline PropertyWithVerifier<TYPE,VERIFIER>&
00428 PropertyWithVerifier<TYPE,VERIFIER>::operator=( const PropertyWithValue<OTHER>& right )
00429 {
00430   PropertyWithValue<TYPE>::operator=(right) ;
00431   return *this ;
00432 }
00433 // ============================================================================
00435 // ============================================================================
00436 template <class TYPE,class VERIFIER>
00437 template <class OTHER,class OTHERVERIFIER>
00438 inline PropertyWithVerifier<TYPE,VERIFIER>&
00439 PropertyWithVerifier<TYPE,VERIFIER>::operator=
00440 ( const PropertyWithVerifier<OTHER,OTHERVERIFIER>& right )
00441 {
00442   PropertyWithValue<TYPE>::operator=(right) ;
00443   return *this ;
00444 }
00445 // ============================================================================
00446 
00447 // ============================================================================
00457 // ============================================================================
00458 template <class TYPE,class VERIFIER = BoundedVerifier<TYPE> >
00459 class SimpleProperty
00460   : public PropertyWithVerifier<TYPE,VERIFIER>
00461 {
00462 public:
00464   SimpleProperty
00465   ( VERIFIER           verifier = VERIFIER() ) ;
00467   SimpleProperty
00468   ( const TYPE&        value                 ,
00469     VERIFIER           verifier = VERIFIER() ) ;
00471   SimpleProperty
00472   ( const std::string& name                  ,
00473     const TYPE&        value                 ,
00474     VERIFIER           verifier = VERIFIER() ) ;
00476   template <class OTHER>
00477   SimpleProperty ( const PropertyWithValue<OTHER>& right ) ;
00479   SimpleProperty ( const SimpleProperty& right ) ;
00481   virtual ~SimpleProperty() ;
00483   virtual SimpleProperty* clone() const ;
00485   SimpleProperty& operator=( const TYPE& value ) ;
00487   template <class OTHER>
00488   SimpleProperty& operator=( const PropertyWithValue<OTHER>& right ) ;
00489 };
00490 // ============================================================================
00492 // ============================================================================
00493 template <class TYPE,class VERIFIER>
00494 SimpleProperty<TYPE,VERIFIER>::SimpleProperty
00495 ( VERIFIER           verifier )
00496   : PropertyWithVerifier<TYPE,VERIFIER>
00497 ( "" , new TYPE() , true , verifier )
00498 {}
00499 // ============================================================================
00501 // ============================================================================
00502 template <class TYPE,class VERIFIER>
00503 SimpleProperty<TYPE,VERIFIER>::SimpleProperty
00504 ( const TYPE&        value    ,
00505   VERIFIER           verifier )
00506   : PropertyWithVerifier<TYPE,VERIFIER>
00507 ( "" , new TYPE(value) , true , verifier )
00508 {}
00509 // ============================================================================
00511 // ============================================================================
00512 template <class TYPE,class VERIFIER>
00513 SimpleProperty<TYPE,VERIFIER>::SimpleProperty
00514 ( const std::string& name     ,
00515   const TYPE&        value    ,
00516   VERIFIER           verifier )
00517   : PropertyWithVerifier<TYPE,VERIFIER>
00518 ( name , new TYPE(value) , true , verifier )
00519 {}
00520 // ============================================================================
00522 // ============================================================================
00523 template <class TYPE,class VERIFIER>
00524 template <class OTHER>
00525 SimpleProperty<TYPE,VERIFIER>::SimpleProperty
00526 ( const PropertyWithValue<OTHER>& right )
00527   : PropertyWithVerifier<TYPE,VERIFIER>
00528 ( right.name() , new TYPE( right.value() ) , true , VERIFIER() )
00529 {}
00530 // ============================================================================
00532 // ============================================================================
00533 template <class TYPE,class VERIFIER>
00534 SimpleProperty<TYPE,VERIFIER>::SimpleProperty
00535 ( const SimpleProperty& right )
00536   : PropertyWithVerifier<TYPE,VERIFIER>
00537 ( right.name() , new TYPE( right.value() ) , true , right.verifier() )
00538 {}
00539 // ============================================================================
00541 // ============================================================================
00542 template <class TYPE,class VERIFIER>
00543 SimpleProperty<TYPE,VERIFIER>::~SimpleProperty(){}
00544 // ============================================================================
00546 // ============================================================================
00547 template <class TYPE,class VERIFIER>
00548 inline
00549 SimpleProperty<TYPE,VERIFIER>*
00550 SimpleProperty<TYPE,VERIFIER>::clone() const
00551 { return new SimpleProperty(*this) ; }
00552 // ============================================================================
00554 // ============================================================================
00555 template <class TYPE,class VERIFIER>
00556 inline
00557 SimpleProperty<TYPE,VERIFIER>&
00558 SimpleProperty<TYPE,VERIFIER>::operator=( const TYPE& value )
00559 {
00560   PropertyWithVerifier<TYPE,VERIFIER>::operator=( value );
00561   return *this ;
00562 }
00563 // ============================================================================
00565 // ============================================================================
00566 template <class TYPE,class VERIFIER>
00567 template <class OTHER>
00568 inline
00569 SimpleProperty<TYPE,VERIFIER>&
00570 SimpleProperty<TYPE,VERIFIER>::operator=
00571 ( const PropertyWithValue<OTHER>& right )
00572 {
00573   PropertyWithVerifier<TYPE,VERIFIER>::operator=( right );
00574   return *this ;
00575 }
00576 // ============================================================================
00577 
00578 // ============================================================================
00587 // ============================================================================
00588 template< class TYPE, class VERIFIER = NullVerifier<TYPE> >
00589 class SimplePropertyRef :
00590   public PropertyWithVerifier<TYPE,VERIFIER>
00591 {
00592 public:
00594   SimplePropertyRef
00595   ( const std::string& name                  ,
00596     TYPE&              value                 ,  
00597     VERIFIER           verifier = VERIFIER() ) ;
00599   SimplePropertyRef ( const SimplePropertyRef& right ) ;
00601   virtual ~SimplePropertyRef() ;
00603   virtual SimplePropertyRef* clone() const ;
00605   SimplePropertyRef& operator=( const TYPE& value ) ;
00607   template <class OTHER>
00608   SimplePropertyRef& operator=( const PropertyWithValue<OTHER>& right ) ;
00609 private:
00610   // the default constructor is disabled
00611   SimplePropertyRef() ;
00612 };
00613 // ============================================================================
00615 // ============================================================================
00616 template <class TYPE,class VERIFIER>
00617 SimplePropertyRef<TYPE,VERIFIER>::SimplePropertyRef
00618 ( const std::string& name     ,
00619   TYPE&              value    ,  
00620   VERIFIER           verifier )
00621   : PropertyWithVerifier<TYPE,VERIFIER> ( name , &value , false , verifier )
00622 {}
00623 // ============================================================================
00625 // ============================================================================
00626 template <class TYPE,class VERIFIER>
00627 SimplePropertyRef<TYPE,VERIFIER>::SimplePropertyRef
00628 ( const SimplePropertyRef& right )
00629   : PropertyWithVerifier<TYPE,VERIFIER>
00630 ( right.name() , right.i_get() , false , right.verifier() )
00631 {}
00632 // ============================================================================
00634 // ============================================================================
00635 template <class TYPE,class VERIFIER>
00636 SimplePropertyRef<TYPE,VERIFIER>::~SimplePropertyRef(){}
00637 // ============================================================================
00639 // ============================================================================
00640 template <class TYPE,class VERIFIER>
00641 inline
00642 SimplePropertyRef<TYPE,VERIFIER>*
00643 SimplePropertyRef<TYPE,VERIFIER>::clone() const
00644 { return new SimplePropertyRef(*this) ; }
00645 // ============================================================================
00647 // ============================================================================
00648 template <class TYPE,class VERIFIER>
00649 inline
00650 SimplePropertyRef<TYPE,VERIFIER>&
00651 SimplePropertyRef<TYPE,VERIFIER>::operator=( const TYPE& value )
00652 {
00653   PropertyWithVerifier<TYPE,VERIFIER>::operator=( value ) ;
00654   return *this ;
00655 }
00656 // ============================================================================
00658 // ============================================================================
00659 template <class TYPE,class VERIFIER>
00660 template <class OTHER>
00661 inline
00662 SimplePropertyRef<TYPE,VERIFIER>&
00663 SimplePropertyRef<TYPE,VERIFIER>::operator=
00664 ( const PropertyWithValue<OTHER>& right )
00665 {
00666   PropertyWithVerifier<TYPE,VERIFIER>::operator=( right );
00667   return *this ;
00668 }
00669 // ============================================================================
00670 
00671 
00672 
00673 
00674 // Typedef Properties for built-in types
00675 typedef SimpleProperty< bool >              BooleanProperty;
00676 typedef SimpleProperty< char >              CharProperty;
00677 typedef SimpleProperty< signed char >       SignedCharProperty;
00678 typedef SimpleProperty< unsigned char >     UnsignedCharProperty;
00679 typedef SimpleProperty< short >             ShortProperty;
00680 typedef SimpleProperty< unsigned short >    UnsignedShortProperty;
00681 typedef SimpleProperty< int >               IntegerProperty;
00682 typedef SimpleProperty< unsigned int >      UnsignedIntegerProperty;
00683 typedef SimpleProperty< long >              LongProperty;
00684 typedef SimpleProperty< unsigned long >     UnsignedLongProperty;
00685 typedef SimpleProperty< long long>          LongLongProperty;
00686 typedef SimpleProperty< unsigned long long> UnsignedLongLongProperty;
00687 typedef SimpleProperty< float >             FloatProperty;
00688 typedef SimpleProperty< double >            DoubleProperty;
00689 typedef SimpleProperty< long double >       LongDoubleProperty;
00690 
00691 typedef SimpleProperty< std::string >       StringProperty;
00692 
00693 
00694 // Typedef PropertyRefs for built-in types
00695 typedef SimplePropertyRef< bool >                BooleanPropertyRef;
00696 typedef SimplePropertyRef< char >                CharPropertyRef;
00697 typedef SimplePropertyRef< signed char >         SignedCharPropertyRef;
00698 typedef SimplePropertyRef< unsigned char >       UnsignedCharPropertyRef;
00699 typedef SimplePropertyRef< short >               ShortPropertyRef;
00700 typedef SimplePropertyRef< unsigned short >      UnsignedShortPropertyRef;
00701 typedef SimplePropertyRef< int >                 IntegerPropertyRef;
00702 typedef SimplePropertyRef< unsigned int >        UnsignedIntegerPropertyRef;
00703 typedef SimplePropertyRef< long >                LongPropertyRef;
00704 typedef SimplePropertyRef< unsigned long >       UnsignedLongPropertyRef;
00705 typedef SimplePropertyRef< long long >           LongLongPropertyRef;
00706 typedef SimplePropertyRef< unsigned long long >  UnsignedLongLongPropertyRef;
00707 typedef SimplePropertyRef< float >               FloatPropertyRef;
00708 typedef SimplePropertyRef< double >              DoublePropertyRef;
00709 typedef SimplePropertyRef< long double >         LongDoublePropertyRef;
00710 
00711 typedef SimplePropertyRef< std::string >         StringPropertyRef;
00712 
00713 
00714 // Typedef "Arrays" of Properties for built-in types
00715 typedef SimpleProperty< std::vector< bool > >                BooleanArrayProperty;
00716 typedef SimpleProperty< std::vector< char > >                CharArrayProperty;
00717 typedef SimpleProperty< std::vector< signed char > >         SignedCharArrayProperty;
00718 typedef SimpleProperty< std::vector< unsigned char > >       UnsignedCharArrayProperty;
00719 typedef SimpleProperty< std::vector< short > >               ShortArrayProperty;
00720 typedef SimpleProperty< std::vector< unsigned short > >      UnsignedShortArrayProperty;
00721 typedef SimpleProperty< std::vector< int > >                 IntegerArrayProperty;
00722 typedef SimpleProperty< std::vector< unsigned int > >        UnsignedIntegerArrayProperty;
00723 typedef SimpleProperty< std::vector< long > >                LongArrayProperty;
00724 typedef SimpleProperty< std::vector< unsigned long > >       UnsignedLongArrayProperty;
00725 typedef SimpleProperty< std::vector< long long > >           LongLongArrayProperty;
00726 typedef SimpleProperty< std::vector< unsigned long long > >  UnsignedLongLongArrayProperty;
00727 typedef SimpleProperty< std::vector< float > >               FloatArrayProperty;
00728 typedef SimpleProperty< std::vector< double > >              DoubleArrayProperty;
00729 typedef SimpleProperty< std::vector< long double > >         LongDoubleArrayProperty;
00730 
00731 typedef SimpleProperty< std::vector< std::string > >         StringArrayProperty;
00732 
00733 
00734 // Typedef "Arrays" of PropertyRefs for built-in types
00735 typedef SimplePropertyRef< std::vector< bool > >                 BooleanArrayPropertyRef;
00736 typedef SimplePropertyRef< std::vector< char > >                 CharArrayPropertyRef;
00737 typedef SimplePropertyRef< std::vector< signed char > >          SignedCharArrayPropertyRef;
00738 typedef SimplePropertyRef< std::vector< unsigned char > >        UnsignedCharArrayPropertyRef;
00739 typedef SimplePropertyRef< std::vector< short > >                ShortArrayPropertyRef;
00740 typedef SimplePropertyRef< std::vector< unsigned short > >       UnsignedShortArrayPropertyRef;
00741 typedef SimplePropertyRef< std::vector< int > >                  IntegerArrayPropertyRef;
00742 typedef SimplePropertyRef< std::vector< unsigned int > >         UnsignedIntegerArrayPropertyRef;
00743 typedef SimplePropertyRef< std::vector< long > >                 LongArrayPropertyRef;
00744 typedef SimplePropertyRef< std::vector< unsigned long > >        UnsignedLongArrayPropertyRef;
00745 typedef SimplePropertyRef< std::vector< long long > >            LongLongArrayPropertyRef;
00746 typedef SimplePropertyRef< std::vector< unsigned long long > >   UnsignedLongLongArrayPropertyRef;
00747 typedef SimplePropertyRef< std::vector< float > >                FloatArrayPropertyRef;
00748 typedef SimplePropertyRef< std::vector< double > >               DoubleArrayPropertyRef;
00749 typedef SimplePropertyRef< std::vector< long double > >          LongDoubleArrayPropertyRef;
00750 
00751 typedef SimplePropertyRef< std::vector< std::string > >          StringArrayPropertyRef;
00752 
00753 // pre-declaration is sufficient here
00754 class GaudiHandleBase;
00755 
00756 class GaudiHandleProperty : public Property {
00757 public:
00758    GaudiHandleProperty( const std::string& name, GaudiHandleBase& ref );
00759 
00760   GaudiHandleProperty& operator=( const GaudiHandleBase& value );
00761 
00762   virtual GaudiHandleProperty* clone() const;
00763 
00764   virtual bool load( Property& destination ) const;
00765 
00766   virtual bool assign( const Property& source );
00767 
00768   virtual std::string toString() const;
00769 
00770   virtual StatusCode fromString(const std::string& s);
00771 
00772   const GaudiHandleBase& value() const;
00773 
00774   bool setValue( const GaudiHandleBase& value );
00775 
00776 private:
00779    GaudiHandleBase* m_pValue;
00780 };
00781 
00782 // implementation in header file only where the GaudiHandleBase class
00783 // definition is not needed. The rest goes into the .cpp file.
00784 // The goal is to decouple the header files, to avoid that the whole
00785 // world depends on GaudiHandle.h
00786 inline GaudiHandleProperty& GaudiHandleProperty::operator=( const GaudiHandleBase& value ) {
00787       setValue( value );
00788       return *this;
00789 }
00790 
00791 inline GaudiHandleProperty* GaudiHandleProperty::clone() const {
00792   return new GaudiHandleProperty( *this );
00793 }
00794 
00795 inline bool GaudiHandleProperty::load( Property& destination ) const {
00796   return destination.assign( *this );
00797 }
00798 
00799 inline bool GaudiHandleProperty::assign( const Property& source ) {
00800   return fromString( source.toString() ).isSuccess();
00801 }
00802 
00803 inline const GaudiHandleBase& GaudiHandleProperty::value() const {
00804   useReadHandler();
00805   return *m_pValue;
00806 }
00807 
00808 
00809 // pre-declaration is sufficient here
00810 class GaudiHandleArrayBase;
00811 
00812 class GaudiHandleArrayProperty : public Property {
00813 public:
00814 
00815   GaudiHandleArrayProperty( const std::string& name, GaudiHandleArrayBase& ref );
00816 
00817   GaudiHandleArrayProperty& operator=( const GaudiHandleArrayBase& value );
00818 
00819   virtual GaudiHandleArrayProperty* clone() const;
00820 
00821   virtual bool load( Property& destination ) const;
00822 
00823   virtual bool assign( const Property& source );
00824 
00825   virtual std::string toString() const;
00826 
00827   virtual StatusCode fromString(const std::string& s);
00828 
00829   const GaudiHandleArrayBase& value() const;
00830 
00831   bool setValue( const GaudiHandleArrayBase& value );
00832 
00833 private:
00836    GaudiHandleArrayBase* m_pValue;
00837 
00838 };
00839 
00840 // implementation in header file only where the GaudiHandleBase class
00841 // definition is not needed. The rest goes into the .cpp file.
00842 // The goal is to decouple the header files, to avoid that the whole
00843 // world depends on GaudiHandle.h
00844 inline GaudiHandleArrayProperty& GaudiHandleArrayProperty::operator=( const GaudiHandleArrayBase& value ) {
00845   setValue( value );
00846   return *this;
00847 }
00848 
00849 inline GaudiHandleArrayProperty* GaudiHandleArrayProperty::clone() const {
00850   return new GaudiHandleArrayProperty( *this );
00851 }
00852 
00853 inline bool GaudiHandleArrayProperty::load( Property& destination ) const {
00854   return destination.assign( *this );
00855 }
00856 
00857 inline bool GaudiHandleArrayProperty::assign( const Property& source ) {
00858   return fromString( source.toString() ) != 0;
00859 }
00860 
00861 inline const GaudiHandleArrayBase& GaudiHandleArrayProperty::value() const {
00862   useReadHandler();
00863   return *m_pValue;
00864 }
00865 
00866 
00867 namespace Gaudi
00868 {
00869   namespace Utils
00870   {
00871     // ========================================================================
00889     bool hasProperty ( const IProperty*   p , const std::string& name ) ;
00890     // ========================================================================
00908     bool hasProperty ( const IInterface*   p , const std::string& name ) ;
00909     // ========================================================================
00927     Property* getProperty
00928     ( const IProperty*   p , const std::string& name ) ;
00929     // ========================================================================
00947     Property* getProperty
00948     ( const IInterface*   p , const std::string& name ) ;
00949     // ========================================================================
00972     bool hasProperty
00973     ( const std::vector<const Property*>* p    ,
00974       const std::string&                  name ) ;
00975     // ========================================================================
00998     const Property* getProperty
00999     ( const std::vector<const Property*>* p    ,
01000       const std::string&                  name ) ;
01001     // ========================================================================
01025     template <class TYPE>
01026     StatusCode setProperty
01027     ( IProperty*         component  ,
01028       const std::string& name       ,
01029       const TYPE&        value      ,
01030       const std::string& doc        ) ;
01031     // ========================================================================
01054     template <class TYPE>
01055     StatusCode setProperty
01056     ( IProperty*         component  ,
01057       const std::string& name       ,
01058       const TYPE&        value      )
01059     { return setProperty ( component , name , value , std::string() ) ; }
01060     // ========================================================================
01074     StatusCode setProperty
01075     ( IProperty*         component  ,
01076       const std::string& name       ,
01077       const std::string& value      ,
01078       const std::string& doc   = "" ) ;
01079     // ========================================================================
01093     StatusCode setProperty
01094     ( IProperty*         component  ,
01095       const std::string& name       ,
01096       const char*        value      ,
01097       const std::string& doc   = "" ) ;
01098     // ========================================================================
01112     template <unsigned N>
01113     StatusCode setProperty
01114     ( IProperty*           component ,
01115       const std::string&   name      ,
01116       const char         (&value)[N] ,
01117       const std::string& doc   = ""  )
01118     {
01119       if ( 0 == component                    ) { return StatusCode::FAILURE ; }
01120       const std::string val = std::string ( value , value + N ) ;
01121       return setProperty ( component , name , val , doc ) ;
01122     }
01123     // ========================================================================
01154     template <class TYPE>
01155     StatusCode setProperty
01156     ( IProperty*         component  ,
01157       const std::string& name       ,
01158       const TYPE&        value      ,
01159       const std::string& doc        )
01160     {
01161       if ( 0 == component ) { return StatusCode::FAILURE ; }   // RETURN
01162       if ( !hasProperty ( component , name ) ) { return StatusCode::FAILURE ; }
01163       const std::string val = Gaudi::Utils::toString ( value ) ;
01164       return Gaudi::Utils::setProperty ( component , name , val , doc ) ;
01165     }
01166     // ========================================================================
01188     StatusCode
01189     setProperty
01190     ( IProperty*         component ,
01191       const std::string& name      ,
01192       const Property*    property  ,
01193       const std::string& doc = ""  ) ;
01194     // ========================================================================
01216     StatusCode
01217     setProperty
01218     ( IProperty*         component ,
01219       const std::string& name      ,
01220       const Property&    property  ,
01221       const std::string& doc = ""  ) ;
01222     // ========================================================================
01245     template <class TYPE>
01246     StatusCode
01247     setProperty
01248     ( IProperty*                  component ,
01249       const std::string&          name      ,
01250       const SimpleProperty<TYPE>& value     ,
01251       const std::string&          doc = ""  )
01252     {
01253       const Property* property = &value ;
01254       return setProperty ( component , name , property , doc ) ;
01255     }
01256     // ========================================================================
01277     template <class TYPE>
01278     StatusCode setProperty
01279     ( IInterface*        component ,
01280       const std::string& name      ,
01281       const TYPE&        value     ,
01282       const std::string& doc = ""  )
01283     {
01284       if ( 0 == component ) { return StatusCode::FAILURE ; }
01285       SmartIF<IProperty> property ( component ) ;
01286       if ( !property      ) { return StatusCode::FAILURE ; }
01287       return setProperty ( property , name , value , doc ) ;
01288     }
01289     // ========================================================================
01302     StatusCode setProperty
01303     ( IInterface*        component ,
01304       const std::string& name      ,
01305       const std::string& value     ,
01306       const std::string& doc  = "" ) ;
01307     // ========================================================================
01320     StatusCode setProperty
01321     ( IInterface*        component ,
01322       const std::string& name      ,
01323       const char*        value     ,
01324       const std::string& doc  = "" ) ;
01325     // ========================================================================
01339     template <unsigned N>
01340     StatusCode setProperty
01341     ( IInterface*          component ,
01342       const std::string&   name      ,
01343       const char         (&value)[N] ,
01344       const std::string& doc  = ""   )
01345     {
01346       if ( 0 == component ) { return StatusCode::FAILURE ; }
01347       const std::string val = std::string ( value , value + N ) ;
01348       return setProperty ( component , name , val , doc ) ;
01349     }
01350     // ========================================================================
01372     StatusCode
01373     setProperty
01374     ( IInterface*        component ,
01375       const std::string& name      ,
01376       const Property*    property  ,
01377       const std::string& doc = ""  ) ;
01378     // ========================================================================
01400     StatusCode
01401     setProperty
01402     ( IInterface*        component ,
01403       const std::string& name      ,
01404       const Property&    property  ,
01405       const std::string& doc = ""  ) ;
01406     // ========================================================================
01429     template <class TYPE>
01430     StatusCode
01431     setProperty
01432     ( IInterface*                 component ,
01433       const std::string&          name      ,
01434       const SimpleProperty<TYPE>& value     ,
01435       const std::string&          doc = ""  )
01436     {
01437       const Property* property = &value ;
01438       return setProperty ( component , name , property , doc ) ;
01439     }
01440     // ========================================================================
01441   } // end of namespace Gaudi::Utils
01442 } // end of namespace Gaudi
01443 
01444 
01445 // ============================================================================
01446 // The END
01447 // ============================================================================
01448 #endif // GAUDIKERNEL_PROPERTY_H
01449 // ============================================================================
| Classes | Job Modules | Data Objects | Services | Algorithms | Tools | Packages | Directories | Tracs |

Generated on Mon Apr 11 19:56:58 2011 for GaudiKernel by doxygen 1.4.7