| # Gaudi Framework, version v23r0 |

Home |  | Generated: Mon Jan 30 2012

# Property.h

Go to the documentation of this file.

    00001 // $Id: Property.h,v 1.26 2008/10/27 16:41:34 marcocle Exp $
    00002 // ============================================================================
    00003 // CVS tag $Name:  $
    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 GAUDI_API std::ostream& operator<<(std::ostream& stream, const Property& prop);
    00034 // ============================================================================
    00043 class GAUDI_API Property
    00044 {
    00045 public:
    00047   const std::string&    name      () const { return m_name             ; }
    00049   const   std::string&    documentation() const { return m_documentation; }
    00051   const std::type_info* type_info () const { return m_typeinfo         ; }
    00053   std::string           type      () const { return m_typeinfo->name() ; }
    00055   virtual bool load   (       Property& dest   ) const = 0 ;
    00057   virtual bool assign ( const Property& source )       = 0 ;
    00058 public:
    00060   virtual std::string  toString   ()  const = 0 ;
    00062   virtual void toStream(std::ostream& out) const = 0;
    00064   virtual StatusCode   fromString ( const std::string& value ) = 0 ;
    00065 public:
    00067   const PropertyCallbackFunctor* readCallBack   () const ;
    00069   const PropertyCallbackFunctor* updateCallBack () const ;
    00071   virtual void  declareReadHandler   ( PropertyCallbackFunctor* pf ) ;
    00073   virtual void  declareUpdateHandler ( PropertyCallbackFunctor* pf ) ;
    00074   template< class HT >
    00075   void declareReadHandler
    00076   ( void ( HT::* MF ) ( Property& ) , HT* instance ) ;
    00077   template< class HT >
    00078   void declareUpdateHandler
    00079   ( void ( HT::* MF ) ( Property& ) , HT* instance ) ;
    00081   virtual void useReadHandler   () const ;
    00083   virtual bool useUpdateHandler ()       ;
    00084 public:
    00086   virtual ~Property() ;
    00088   virtual Property*          clone     () const = 0 ;
    00090   void setName ( const std::string& value ) { m_name = value ; }
    00092   void setDocumentation( const std::string& documentation ) {
    00093     m_documentation = documentation; }
    00095   virtual std::ostream& fillStream ( std::ostream& ) const ;
    00096 protected:
    00098   Property
    00099   ( const std::type_info& type      ,
    00100     const std::string&    name = "" ) ;
    00102   Property
    00103   ( const std::string&    name      ,
    00104     const std::type_info& type      ) ;
    00106   Property           ( const Property& right ) ;
    00108   Property& operator=( const Property& right ) ;
    00109 private:
    00110   // the default constructor is disabled
    00111   Property() ;
    00112 private:
    00113   // property name
    00114   std::string              m_name           ;
    00115   // property doc string
    00116   std::string              m_documentation;
    00117   // property type
    00118   const std::type_info*    m_typeinfo       ;
    00119 protected:
    00120   // call back functor for reading
    00121   mutable PropertyCallbackFunctor* m_readCallBack   ;
    00122   // call back functor for update
    00123   PropertyCallbackFunctor* m_updateCallBack ;
    00124 };
    00125 // ============================================================================
    00126 #include "GaudiKernel/PropertyCallbackFunctor.h"
    00127 // ============================================================================
    00128 template< class HT >
    00129 inline void Property::declareReadHandler
    00130 ( void ( HT::* MF ) ( Property& ) , HT* obj )
    00131 { declareReadHandler ( new PropertyCallbackMemberFunctor< HT >( MF , obj ) ) ; }
    00132 // ============================================================================
    00133 template< class HT >
    00134 inline void Property::declareUpdateHandler
    00135 ( void ( HT::* MF ) ( Property& ) , HT* obj )
    00136 { declareUpdateHandler ( new PropertyCallbackMemberFunctor< HT >( MF , obj ) ) ; }
    00137 // ============================================================================
    00145 // ============================================================================
    00146 template <class TYPE>
    00147 class PropertyWithValue : public Property
    00148 {
    00149 public:
    00150   // ==========================================================================
    00152   typedef Gaudi::Utils::PropertyTypeTraits<TYPE>         Traits ;
    00154   typedef typename Traits::PVal                          PVal   ;
    00155   // ==========================================================================
    00156 protected:
    00157   // ==========================================================================
    00159   inline PropertyWithValue
    00160   ( const std::string& name  ,
    00161     PVal               value ,
    00162     const bool         owner ) ;
    00164   inline PropertyWithValue ( const PropertyWithValue& rhs ) ;
    00166   template <class OTHER>
    00167   inline PropertyWithValue ( const PropertyWithValue<OTHER>& right ) ;
    00169   virtual inline ~PropertyWithValue() ;
    00171   PropertyWithValue& operator=( const TYPE& value ) ;
    00172   // assignment operator (don't let the compiler generate a buggy one)
    00173   PropertyWithValue& operator=( const PropertyWithValue& rhs ) ;
    00174   // assignment operator
    00175   template <class OTHER>
    00176   PropertyWithValue& operator=( const PropertyWithValue<OTHER>& right ) ;
    00177   // ==========================================================================
    00178 public:
    00179   // ==========================================================================
    00181   operator const TYPE&      () const { return value() ;}
    00183   inline const TYPE& value() const ;
    00184   // ==========================================================================
    00185 public:
    00186   // ==========================================================================
    00188   virtual bool setValue ( const TYPE&     value  )  = 0  ;
    00190   virtual bool assign   ( const Property& source )       ;
    00192   virtual bool load     (       Property& dest   ) const ;
    00194   virtual StatusCode fromString ( const std::string& s )  ;
    00196   virtual std::string  toString   () const  ;
    00198   virtual void  toStream (std::ostream& out) const  ;
    00199   // ==========================================================================
    00200 protected:
    00201   // ==========================================================================
    00203   inline void  i_set ( const TYPE& value ) {
    00204     Traits::assign(*m_value, value);
    00205   }
    00207   inline PVal  i_get () const {
    00208     return m_value;
    00209   }
    00210   // ==========================================================================
    00211 private:
    00212   // ==========================================================================
    00214   PVal m_value ;                                   // the actual property value
    00216   bool  m_own  ;                                   //      owner of the storage
    00217   // ==========================================================================
    00218 };
    00219 // ============================================================================
    00221 // ============================================================================
    00222 template <class TYPE>
    00223 inline
    00224 PropertyWithValue<TYPE>::PropertyWithValue
    00225 ( const std::string& name  ,
    00226   PVal               value ,
    00227   const bool         own   )
    00228   : Property ( typeid( TYPE ) , name )
    00229   , m_value  ( value )
    00230   , m_own    ( own   )
    00231 {}
    00232 // ============================================================================
    00233 // copy constructor
    00234 // ============================================================================
    00235 template <class TYPE>
    00236 inline PropertyWithValue<TYPE>::PropertyWithValue
    00237 ( const PropertyWithValue& right )
    00238   : Property( right         )
    00239   , m_value ( right.m_value )
    00240   , m_own   ( right.m_own   )
    00241 {
    00242   m_value = Traits::copy ( right.value() , m_own ) ;
    00243 }
    00244 // ============================================================================
    00245 // "copy" constructor form any other type
    00246 // ============================================================================
    00247 template <class TYPE>
    00248 template <class OTHER>
    00249 inline PropertyWithValue<TYPE>::PropertyWithValue
    00250 ( const PropertyWithValue<OTHER>& right )
    00251   : Property( right         )
    00252   , m_value ( right.m_value )
    00253   , m_own   ( right.m_own   )
    00254 {
    00255   m_value = Traits::copy ( right.value() , m_own ) ;
    00256 }
    00257 // ============================================================================
    00259 // ============================================================================
    00260 template <class TYPE>
    00261 inline PropertyWithValue<TYPE>::~PropertyWithValue()
    00262 {
    00263   Traits::dele ( m_value , m_own ) ;
    00264   m_value = 0 ;
    00265 }
    00266 // ============================================================================
    00268 // ============================================================================
    00269 template <class TYPE>
    00270 inline PropertyWithValue<TYPE>&
    00271 PropertyWithValue<TYPE>::operator=( const TYPE& value )
    00272 {
    00273   if ( !setValue ( value ) )
    00274   { throw std::out_of_range( "Value not verified" ) ; }
    00275   return *this ;
    00276 }
    00277 // ============================================================================
    00279 // ============================================================================
    00280 template <class TYPE>
    00281 inline bool
    00282 PropertyWithValue<TYPE>::assign ( const Property& source )
    00283 {
    00284   // 1) Is the property of "the same" type?
    00285   const PropertyWithValue<TYPE>* p =
    00286     dynamic_cast<const PropertyWithValue<TYPE>*>       ( &source ) ;
    00287   if ( 0 != p ) { return setValue ( p->value() ) ; }       // RETURN
    00288   // 2) Else use the string representation
    00289   return this->fromString( source.toString() ).isSuccess() ;
    00290 }
    00291 // ============================================================================
    00293 // ============================================================================
    00294 template <class TYPE>
    00295 inline bool
    00296 PropertyWithValue<TYPE>::load( Property& dest ) const
    00297 {
    00298   // delegate to the 'opposite' method ;
    00299   return dest.assign( *this ) ;
    00300 }
    00301 // ============================================================================
    00303 // ============================================================================
    00304 template <class TYPE>
    00305 inline std::string
    00306 PropertyWithValue<TYPE>::toString () const
    00307 {
    00308   useReadHandler();
    00309   return Gaudi::Utils::toString( *m_value ) ;
    00310 }
    00311 // ============================================================================
    00313 // ============================================================================
    00314 template <class TYPE>
    00315 inline void
    00316 PropertyWithValue<TYPE>::toStream (std::ostream& out) const
    00317 {
    00318   useReadHandler();
    00319   Gaudi::Utils::toStream( *m_value, out ) ;
    00320 }
    00321 // ============================================================================
    00323 // ============================================================================
    00324 template <class TYPE>
    00325 inline StatusCode
    00326 PropertyWithValue<TYPE>::fromString ( const std::string& source )
    00327 {
    00328   TYPE tmp ;
    00329   StatusCode sc = Gaudi::Parsers::parse ( tmp , source ) ;
    00330   if ( sc.isFailure() ) { return sc ; }
    00331   return setValue ( tmp ) ? StatusCode::SUCCESS : StatusCode::FAILURE ;
    00332 }
    00333 // ============================================================================
    00335 // ============================================================================
    00336 template <>
    00337 inline std::string
    00338 PropertyWithValue<std::string>::toString () const
    00339 {
    00340   useReadHandler();
    00341   return this->value() ;
    00342 }
    00343 // ============================================================================
    00344 template <>
    00345 inline bool PropertyWithValue<std::string>::assign ( const Property& source )
    00346 { return this->fromString( source.toString() ).isSuccess() ; }
    00347 // ============================================================================
    00348
    00349 // ============================================================================
    00351 // ============================================================================
    00352 template <class TYPE>
    00353 inline const TYPE&
    00354 PropertyWithValue<TYPE>::value() const
    00355 { useReadHandler() ; return *m_value ; }
    00356 // ============================================================================
    00357 // assignment operator
    00358 // ============================================================================
    00359 template <class TYPE>
    00360 PropertyWithValue<TYPE>& PropertyWithValue<TYPE>::operator=
    00361 ( const PropertyWithValue& right )
    00362 {
    00363   // assign the base class
    00364   Property::operator=( right ) ;
    00365   // assign the value
    00366   PropertyWithValue<TYPE>::operator=( right.value() ) ;
    00367   return *this ;
    00368 }
    00369 // ============================================================================
    00370 // templated assignment operator
    00371 // ============================================================================
    00372 template <class TYPE>
    00373 template <class OTHER>
    00374 PropertyWithValue<TYPE>& PropertyWithValue<TYPE>::operator=
    00375 ( const PropertyWithValue<OTHER>& right )
    00376 {
    00377   // assign the base class
    00378   Property::operator=( right ) ;
    00379   // assign the value
    00380   PropertyWithValue<TYPE>::operator=( right.value() ) ;
    00381   return *this ;
    00382 }
    00383 // ============================================================================
    00384
    00385 // ============================================================================
    00393 // ============================================================================
    00394 template<class TYPE,class VERIFIER>
    00395 class PropertyWithVerifier
    00396   : public PropertyWithValue<TYPE>
    00397 {
    00398 protected:
    00399   // ==========================================================================
    00401   PropertyWithVerifier
    00402   ( const std::string&                                    name     ,
    00403     typename Gaudi::Utils::PropertyTypeTraits<TYPE>::PVal value    ,
    00404     const bool                                            owner    ,
    00405     const VERIFIER&                                       verifier )
    00406     : PropertyWithValue<TYPE> ( name , value , owner )
    00407     , m_verifier ( verifier )
    00408   {}
    00410   virtual ~PropertyWithVerifier() {}
    00411   // ==========================================================================
    00412 public:
    00413   // ==========================================================================
    00414   inline       VERIFIER& verifier()       { return m_verifier ; }
    00415   inline const VERIFIER& verifier() const { return m_verifier ; }
    00417   bool set( const TYPE& value ) ;
    00419   virtual bool setValue( const TYPE& value ) { return set( value ) ; }
    00421   template <class OTHER,class OTHERVERIFIER>
    00422   PropertyWithVerifier& operator=
    00423   ( const PropertyWithVerifier<OTHER,OTHERVERIFIER>& right ) ;
    00425   template <class OTHER>
    00426   PropertyWithVerifier& operator=( const PropertyWithValue<OTHER>& right ) ;
    00428   PropertyWithVerifier& operator=( const TYPE& right ) ;
    00429   // ==========================================================================
    00430 private:
    00431   // ==========================================================================
    00433   PropertyWithVerifier() ;
    00435   PropertyWithVerifier( const  PropertyWithVerifier& right );
    00436   // ==========================================================================
    00437 private:
    00438   // ==========================================================================
    00440   VERIFIER m_verifier ;                                  // the verifier itself
    00441   // ==========================================================================
    00442 } ;
    00443 // ============================================================================
    00445 // ============================================================================
    00446 template <class TYPE,class VERIFIER>
    00447 inline bool
    00448 PropertyWithVerifier<TYPE,VERIFIER>::set( const TYPE& value )
    00449 {
    00451   if ( !m_verifier.isValid( &value ) ) { return false ; }
    00453   this->i_set( value ) ;
    00455   return this->useUpdateHandler() ;
    00456 }
    00457 // ============================================================================
    00459 // ============================================================================
    00460 template <class TYPE,class VERIFIER>
    00461 inline PropertyWithVerifier<TYPE,VERIFIER>&
    00462 PropertyWithVerifier<TYPE,VERIFIER>::operator=( const TYPE& right )
    00463 {
    00464   PropertyWithValue<TYPE>::operator=( right ) ;
    00465   return *this ;
    00466 }
    00467 // ============================================================================
    00469 // ============================================================================
    00470 template <class TYPE,class VERIFIER>
    00471 template <class OTHER>
    00472 inline PropertyWithVerifier<TYPE,VERIFIER>&
    00473 PropertyWithVerifier<TYPE,VERIFIER>::operator=( const PropertyWithValue<OTHER>& right )
    00474 {
    00475   PropertyWithValue<TYPE>::operator=(right) ;
    00476   return *this ;
    00477 }
    00478 // ============================================================================
    00480 // ============================================================================
    00481 template <class TYPE,class VERIFIER>
    00482 template <class OTHER,class OTHERVERIFIER>
    00483 inline PropertyWithVerifier<TYPE,VERIFIER>&
    00484 PropertyWithVerifier<TYPE,VERIFIER>::operator=
    00485 ( const PropertyWithVerifier<OTHER,OTHERVERIFIER>& right )
    00486 {
    00487   PropertyWithValue<TYPE>::operator=(right) ;
    00488   return *this ;
    00489 }
    00490 // ============================================================================
    00491
    00492 // ============================================================================
    00502 // ============================================================================
    00503 template <class TYPE,class VERIFIER = BoundedVerifier<TYPE> >
    00504 class SimpleProperty
    00505   : public PropertyWithVerifier<TYPE,VERIFIER>
    00506 {
    00507 protected:
    00508   // ==========================================================================
    00509   typedef Gaudi::Utils::PropertyTypeTraits<TYPE>  Traits ;
    00510   // ==========================================================================
    00511 public:
    00512   // ==========================================================================
    00514   SimpleProperty
    00515   ( VERIFIER           verifier = VERIFIER() ) ;
    00517   SimpleProperty
    00518   ( const TYPE&        value                 ,
    00519     VERIFIER           verifier = VERIFIER() ) ;
    00521   SimpleProperty
    00522   ( const std::string& name                  ,
    00523     const TYPE&        value                 ,
    00524     VERIFIER           verifier = VERIFIER() ) ;
    00526   template <class OTHER>
    00527   SimpleProperty ( const PropertyWithValue<OTHER>& right ) ;
    00529   SimpleProperty ( const SimpleProperty& right ) ;
    00531   virtual ~SimpleProperty() ;
    00533   virtual SimpleProperty* clone() const ;
    00535   SimpleProperty& operator=( const TYPE& value ) ;
    00537   template <class OTHER>
    00538   SimpleProperty& operator=( const PropertyWithValue<OTHER>& right ) ;
    00539   // ==========================================================================
    00540 };
    00541 // ============================================================================
    00543 // ============================================================================
    00544 template <class TYPE,class VERIFIER>
    00545 SimpleProperty<TYPE,VERIFIER>::SimpleProperty
    00546 ( VERIFIER           verifier )
    00547   : PropertyWithVerifier<TYPE,VERIFIER>
    00548 ( "" , Traits::new_() , true , verifier )
    00549 {}
    00550 // ============================================================================
    00552 // ============================================================================
    00553 template <class TYPE,class VERIFIER>
    00554 SimpleProperty<TYPE,VERIFIER>::SimpleProperty
    00555 ( const TYPE&        value    ,
    00556   VERIFIER           verifier )
    00557   : PropertyWithVerifier<TYPE,VERIFIER>
    00558 ( "" , Traits::new_(value) , true , verifier )
    00559 {}
    00560 // ============================================================================
    00562 // ============================================================================
    00563 template <class TYPE,class VERIFIER>
    00564 SimpleProperty<TYPE,VERIFIER>::SimpleProperty
    00565 ( const std::string& name     ,
    00566   const TYPE&        value    ,
    00567   VERIFIER           verifier )
    00568   : PropertyWithVerifier<TYPE,VERIFIER>
    00569 ( name , Traits::new_(value) , true , verifier )
    00570 {}
    00571 // ============================================================================
    00573 // ============================================================================
    00574 template <class TYPE,class VERIFIER>
    00575 template <class OTHER>
    00576 SimpleProperty<TYPE,VERIFIER>::SimpleProperty
    00577 ( const PropertyWithValue<OTHER>& right )
    00578   : PropertyWithVerifier<TYPE,VERIFIER>
    00579 ( right.name() , Traits::new_( right.value() ) , true , VERIFIER() )
    00580 {}
    00581 // ============================================================================
    00583 // ============================================================================
    00584 template <class TYPE,class VERIFIER>
    00585 SimpleProperty<TYPE,VERIFIER>::SimpleProperty
    00586 ( const SimpleProperty& right )
    00587   : PropertyWithVerifier<TYPE,VERIFIER>
    00588 ( right.name() , Traits::new_( right.value() ) , true , right.verifier() )
    00589 {}
    00590 // ============================================================================
    00592 // ============================================================================
    00593 template <class TYPE,class VERIFIER>
    00594 SimpleProperty<TYPE,VERIFIER>::~SimpleProperty(){}
    00595 // ============================================================================
    00597 // ============================================================================
    00598 template <class TYPE,class VERIFIER>
    00599 inline
    00600 SimpleProperty<TYPE,VERIFIER>*
    00601 SimpleProperty<TYPE,VERIFIER>::clone() const
    00602 { return new SimpleProperty(*this) ; }
    00603 // ============================================================================
    00605 // ============================================================================
    00606 template <class TYPE,class VERIFIER>
    00607 inline
    00608 SimpleProperty<TYPE,VERIFIER>&
    00609 SimpleProperty<TYPE,VERIFIER>::operator=( const TYPE& value )
    00610 {
    00611   PropertyWithVerifier<TYPE,VERIFIER>::operator=( value );
    00612   return *this ;
    00613 }
    00614 // ============================================================================
    00616 // ============================================================================
    00617 template <class TYPE,class VERIFIER>
    00618 template <class OTHER>
    00619 inline
    00620 SimpleProperty<TYPE,VERIFIER>&
    00621 SimpleProperty<TYPE,VERIFIER>::operator=
    00622 ( const PropertyWithValue<OTHER>& right )
    00623 {
    00624   PropertyWithVerifier<TYPE,VERIFIER>::operator=( right );
    00625   return *this ;
    00626 }
    00627 // ============================================================================
    00628
    00629 // ============================================================================
    00638 // ============================================================================
    00639 template< class TYPE, class VERIFIER = NullVerifier<TYPE> >
    00640 class SimplePropertyRef :
    00641   public PropertyWithVerifier<TYPE,VERIFIER>
    00642 {
    00643 public:
    00645   SimplePropertyRef
    00646   ( const std::string& name                  ,
    00647     TYPE&              value                 ,
    00648     VERIFIER           verifier = VERIFIER() ) ;
    00650   SimplePropertyRef ( const SimplePropertyRef& right ) ;
    00652   virtual ~SimplePropertyRef() ;
    00654   virtual SimplePropertyRef* clone() const ;
    00656   SimplePropertyRef& operator=( const TYPE& value ) ;
    00658   template <class OTHER>
    00659   SimplePropertyRef& operator=( const PropertyWithValue<OTHER>& right ) ;
    00660 private:
    00661   // the default constructor is disabled
    00662   SimplePropertyRef() ;
    00663 };
    00664 // ============================================================================
    00666 // ============================================================================
    00667 template <class TYPE,class VERIFIER>
    00668 SimplePropertyRef<TYPE,VERIFIER>::SimplePropertyRef
    00669 ( const std::string& name     ,
    00670   TYPE&              value    ,
    00671   VERIFIER           verifier )
    00672   : PropertyWithVerifier<TYPE,VERIFIER> ( name , &value , false , verifier )
    00673 {}
    00674 // ============================================================================
    00676 // ============================================================================
    00677 template <class TYPE,class VERIFIER>
    00678 SimplePropertyRef<TYPE,VERIFIER>::SimplePropertyRef
    00679 ( const SimplePropertyRef& right )
    00680   : PropertyWithVerifier<TYPE,VERIFIER>
    00681 ( right.name() , right.i_get() , false , right.verifier() )
    00682 {}
    00683 // ============================================================================
    00685 // ============================================================================
    00686 template <class TYPE,class VERIFIER>
    00687 SimplePropertyRef<TYPE,VERIFIER>::~SimplePropertyRef(){}
    00688 // ============================================================================
    00690 // ============================================================================
    00691 template <class TYPE,class VERIFIER>
    00692 inline
    00693 SimplePropertyRef<TYPE,VERIFIER>*
    00694 SimplePropertyRef<TYPE,VERIFIER>::clone() const
    00695 { return new SimplePropertyRef(*this) ; }
    00696 // ============================================================================
    00698 // ============================================================================
    00699 template <class TYPE,class VERIFIER>
    00700 inline
    00701 SimplePropertyRef<TYPE,VERIFIER>&
    00702 SimplePropertyRef<TYPE,VERIFIER>::operator=( const TYPE& value )
    00703 {
    00704   PropertyWithVerifier<TYPE,VERIFIER>::operator=( value ) ;
    00705   return *this ;
    00706 }
    00707 // ============================================================================
    00709 // ============================================================================
    00710 template <class TYPE,class VERIFIER>
    00711 template <class OTHER>
    00712 inline
    00713 SimplePropertyRef<TYPE,VERIFIER>&
    00714 SimplePropertyRef<TYPE,VERIFIER>::operator=
    00715 ( const PropertyWithValue<OTHER>& right )
    00716 {
    00717   PropertyWithVerifier<TYPE,VERIFIER>::operator=( right );
    00718   return *this ;
    00719 }
    00720 // ============================================================================
    00721
    00722
    00723
    00724
    00725 // Typedef Properties for built-in types
    00726 typedef SimpleProperty< bool >              BooleanProperty;
    00727 typedef SimpleProperty< char >              CharProperty;
    00728 typedef SimpleProperty< signed char >       SignedCharProperty;
    00729 typedef SimpleProperty< unsigned char >     UnsignedCharProperty;
    00730 typedef SimpleProperty< short >             ShortProperty;
    00731 typedef SimpleProperty< unsigned short >    UnsignedShortProperty;
    00732 typedef SimpleProperty< int >               IntegerProperty;
    00733 typedef SimpleProperty< unsigned int >      UnsignedIntegerProperty;
    00734 typedef SimpleProperty< long >              LongProperty;
    00735 typedef SimpleProperty< unsigned long >     UnsignedLongProperty;
    00736 typedef SimpleProperty< long long>          LongLongProperty;
    00737 typedef SimpleProperty< unsigned long long> UnsignedLongLongProperty;
    00738 typedef SimpleProperty< float >             FloatProperty;
    00739 typedef SimpleProperty< double >            DoubleProperty;
    00740 typedef SimpleProperty< long double >       LongDoubleProperty;
    00741
    00742 typedef SimpleProperty< std::string >       StringProperty;
    00743
    00744
    00745 // Typedef PropertyRefs for built-in types
    00746 typedef SimplePropertyRef< bool >                BooleanPropertyRef;
    00747 typedef SimplePropertyRef< char >                CharPropertyRef;
    00748 typedef SimplePropertyRef< signed char >         SignedCharPropertyRef;
    00749 typedef SimplePropertyRef< unsigned char >       UnsignedCharPropertyRef;
    00750 typedef SimplePropertyRef< short >               ShortPropertyRef;
    00751 typedef SimplePropertyRef< unsigned short >      UnsignedShortPropertyRef;
    00752 typedef SimplePropertyRef< int >                 IntegerPropertyRef;
    00753 typedef SimplePropertyRef< unsigned int >        UnsignedIntegerPropertyRef;
    00754 typedef SimplePropertyRef< long >                LongPropertyRef;
    00755 typedef SimplePropertyRef< unsigned long >       UnsignedLongPropertyRef;
    00756 typedef SimplePropertyRef< long long >           LongLongPropertyRef;
    00757 typedef SimplePropertyRef< unsigned long long >  UnsignedLongLongPropertyRef;
    00758 typedef SimplePropertyRef< float >               FloatPropertyRef;
    00759 typedef SimplePropertyRef< double >              DoublePropertyRef;
    00760 typedef SimplePropertyRef< long double >         LongDoublePropertyRef;
    00761
    00762 typedef SimplePropertyRef< std::string >         StringPropertyRef;
    00763
    00764
    00765 // Typedef "Arrays" of Properties for built-in types
    00766 typedef SimpleProperty< std::vector< bool > >                BooleanArrayProperty;
    00767 typedef SimpleProperty< std::vector< char > >                CharArrayProperty;
    00768 typedef SimpleProperty< std::vector< signed char > >         SignedCharArrayProperty;
    00769 typedef SimpleProperty< std::vector< unsigned char > >       UnsignedCharArrayProperty;
    00770 typedef SimpleProperty< std::vector< short > >               ShortArrayProperty;
    00771 typedef SimpleProperty< std::vector< unsigned short > >      UnsignedShortArrayProperty;
    00772 typedef SimpleProperty< std::vector< int > >                 IntegerArrayProperty;
    00773 typedef SimpleProperty< std::vector< unsigned int > >        UnsignedIntegerArrayProperty;
    00774 typedef SimpleProperty< std::vector< long > >                LongArrayProperty;
    00775 typedef SimpleProperty< std::vector< unsigned long > >       UnsignedLongArrayProperty;
    00776 typedef SimpleProperty< std::vector< long long > >           LongLongArrayProperty;
    00777 typedef SimpleProperty< std::vector< unsigned long long > >  UnsignedLongLongArrayProperty;
    00778 typedef SimpleProperty< std::vector< float > >               FloatArrayProperty;
    00779 typedef SimpleProperty< std::vector< double > >              DoubleArrayProperty;
    00780 typedef SimpleProperty< std::vector< long double > >         LongDoubleArrayProperty;
    00781
    00782 typedef SimpleProperty< std::vector< std::string > >         StringArrayProperty;
    00783
    00784
    00785 // Typedef "Arrays" of PropertyRefs for built-in types
    00786 typedef SimplePropertyRef< std::vector< bool > >                 BooleanArrayPropertyRef;
    00787 typedef SimplePropertyRef< std::vector< char > >                 CharArrayPropertyRef;
    00788 typedef SimplePropertyRef< std::vector< signed char > >          SignedCharArrayPropertyRef;
    00789 typedef SimplePropertyRef< std::vector< unsigned char > >        UnsignedCharArrayPropertyRef;
    00790 typedef SimplePropertyRef< std::vector< short > >                ShortArrayPropertyRef;
    00791 typedef SimplePropertyRef< std::vector< unsigned short > >       UnsignedShortArrayPropertyRef;
    00792 typedef SimplePropertyRef< std::vector< int > >                  IntegerArrayPropertyRef;
    00793 typedef SimplePropertyRef< std::vector< unsigned int > >         UnsignedIntegerArrayPropertyRef;
    00794 typedef SimplePropertyRef< std::vector< long > >                 LongArrayPropertyRef;
    00795 typedef SimplePropertyRef< std::vector< unsigned long > >        UnsignedLongArrayPropertyRef;
    00796 typedef SimplePropertyRef< std::vector< long long > >            LongLongArrayPropertyRef;
    00797 typedef SimplePropertyRef< std::vector< unsigned long long > >   UnsignedLongLongArrayPropertyRef;
    00798 typedef SimplePropertyRef< std::vector< float > >                FloatArrayPropertyRef;
    00799 typedef SimplePropertyRef< std::vector< double > >               DoubleArrayPropertyRef;
    00800 typedef SimplePropertyRef< std::vector< long double > >          LongDoubleArrayPropertyRef;
    00801
    00802 typedef SimplePropertyRef< std::vector< std::string > >          StringArrayPropertyRef;
    00803
    00804 // pre-declaration is sufficient here
    00805 class GaudiHandleBase;
    00806
    00807 class GAUDI_API GaudiHandleProperty : public Property {
    00808 public:
    00809    GaudiHandleProperty( const std::string& name, GaudiHandleBase& ref );
    00810
    00811   GaudiHandleProperty& operator=( const GaudiHandleBase& value );
    00812
    00813   virtual GaudiHandleProperty* clone() const;
    00814
    00815   virtual bool load( Property& destination ) const;
    00816
    00817   virtual bool assign( const Property& source );
    00818
    00819   virtual std::string toString() const;
    00820
    00821   virtual void toStream(std::ostream& out) const;
    00822
    00823   virtual StatusCode fromString(const std::string& s);
    00824
    00825   const GaudiHandleBase& value() const;
    00826
    00827   bool setValue( const GaudiHandleBase& value );
    00828
    00829 private:
    00832    GaudiHandleBase* m_pValue;
    00833 };
    00834
    00835 // implementation in header file only where the GaudiHandleBase class
    00836 // definition is not needed. The rest goes into the .cpp file.
    00837 // The goal is to decouple the header files, to avoid that the whole
    00838 // world depends on GaudiHandle.h
    00839 inline GaudiHandleProperty& GaudiHandleProperty::operator=( const GaudiHandleBase& value ) {
    00840       setValue( value );
    00841       return *this;
    00842 }
    00843
    00844 inline GaudiHandleProperty* GaudiHandleProperty::clone() const {
    00845   return new GaudiHandleProperty( *this );
    00846 }
    00847
    00848 inline bool GaudiHandleProperty::load( Property& destination ) const {
    00849   return destination.assign( *this );
    00850 }
    00851
    00852 inline bool GaudiHandleProperty::assign( const Property& source ) {
    00853   return fromString( source.toString() ).isSuccess();
    00854 }
    00855
    00856 inline const GaudiHandleBase& GaudiHandleProperty::value() const {
    00857   useReadHandler();
    00858   return *m_pValue;
    00859 }
    00860
    00861
    00862 // pre-declaration is sufficient here
    00863 class GaudiHandleArrayBase;
    00864
    00865 class GAUDI_API GaudiHandleArrayProperty : public Property {
    00866 public:
    00867
    00868   GaudiHandleArrayProperty( const std::string& name, GaudiHandleArrayBase& ref );
    00869
    00870   GaudiHandleArrayProperty& operator=( const GaudiHandleArrayBase& value );
    00871
    00872   virtual GaudiHandleArrayProperty* clone() const;
    00873
    00874   virtual bool load( Property& destination ) const;
    00875
    00876   virtual bool assign( const Property& source );
    00877
    00878   virtual std::string toString() const;
    00879
    00880   virtual void toStream(std::ostream& out) const;
    00881
    00882   virtual StatusCode fromString(const std::string& s);
    00883
    00884   const GaudiHandleArrayBase& value() const;
    00885
    00886   bool setValue( const GaudiHandleArrayBase& value );
    00887
    00888 private:
    00891    GaudiHandleArrayBase* m_pValue;
    00892
    00893 };
    00894
    00895 // implementation in header file only where the GaudiHandleBase class
    00896 // definition is not needed. The rest goes into the .cpp file.
    00897 // The goal is to decouple the header files, to avoid that the whole
    00898 // world depends on GaudiHandle.h
    00899 inline GaudiHandleArrayProperty& GaudiHandleArrayProperty::operator=( const GaudiHandleArrayBase& value ) {
    00900   setValue( value );
    00901   return *this;
    00902 }
    00903
    00904 inline GaudiHandleArrayProperty* GaudiHandleArrayProperty::clone() const {
    00905   return new GaudiHandleArrayProperty( *this );
    00906 }
    00907
    00908 inline bool GaudiHandleArrayProperty::load( Property& destination ) const {
    00909   return destination.assign( *this );
    00910 }
    00911
    00912 inline bool GaudiHandleArrayProperty::assign( const Property& source ) {
    00913   return fromString( source.toString() ) != 0;
    00914 }
    00915
    00916 inline const GaudiHandleArrayBase& GaudiHandleArrayProperty::value() const {
    00917   useReadHandler();
    00918   return *m_pValue;
    00919 }
    00920
    00921
    00922 namespace Gaudi
    00923 {
    00924   namespace Utils
    00925   {
    00926     // ========================================================================
    00944     GAUDI_API bool hasProperty ( const IProperty*   p , const std::string& name ) ;
    00945     // ========================================================================
    00963     GAUDI_API bool hasProperty ( const IInterface*   p , const std::string& name ) ;
    00964     // ========================================================================
    00982     GAUDI_API Property* getProperty
    00983     ( const IProperty*   p , const std::string& name ) ;
    00984     // ========================================================================
    01002     GAUDI_API Property* getProperty
    01003     ( const IInterface*   p , const std::string& name ) ;
    01004     // ========================================================================
    01027     GAUDI_API bool hasProperty
    01028     ( const std::vector<const Property*>* p    ,
    01029       const std::string&                  name ) ;
    01030     // ========================================================================
    01053     GAUDI_API const Property* getProperty
    01054     ( const std::vector<const Property*>* p    ,
    01055       const std::string&                  name ) ;
    01056     // ========================================================================
    01080     template <class TYPE>
    01081     StatusCode setProperty
    01082     ( IProperty*         component  ,
    01083       const std::string& name       ,
    01084       const TYPE&        value      ,
    01085       const std::string& doc        ) ;
    01086     // ========================================================================
    01109     template <class TYPE>
    01110     StatusCode setProperty
    01111     ( IProperty*         component  ,
    01112       const std::string& name       ,
    01113       const TYPE&        value      )
    01114     { return setProperty ( component , name , value , std::string() ) ; }
    01115     // ========================================================================
    01129     GAUDI_API StatusCode setProperty
    01130     ( IProperty*         component  ,
    01131       const std::string& name       ,
    01132       const std::string& value      ,
    01133       const std::string& doc   = "" ) ;
    01134     // ========================================================================
    01148     GAUDI_API StatusCode setProperty
    01149     ( IProperty*         component  ,
    01150       const std::string& name       ,
    01151       const char*        value      ,
    01152       const std::string& doc   = "" ) ;
    01153     // ========================================================================
    01167     template <unsigned N>
    01168     StatusCode setProperty
    01169     ( IProperty*           component ,
    01170       const std::string&   name      ,
    01171       const char         (&value)[N] ,
    01172       const std::string& doc   = ""  )
    01173     {
    01174       if ( 0 == component                    ) { return StatusCode::FAILURE ; }
    01175       const std::string val = std::string ( value , value + N ) ;
    01176       return setProperty ( component , name , val , doc ) ;
    01177     }
    01178     // ========================================================================
    01209     template <class TYPE>
    01210     StatusCode setProperty
    01211     ( IProperty*         component  ,
    01212       const std::string& name       ,
    01213       const TYPE&        value      ,
    01214       const std::string& doc        )
    01215     {
    01216       if ( 0 == component ) { return StatusCode::FAILURE ; }   // RETURN
    01217       if ( !hasProperty ( component , name ) ) { return StatusCode::FAILURE ; }
    01218       const std::string val = Gaudi::Utils::toString ( value ) ;
    01219       return Gaudi::Utils::setProperty ( component , name , val , doc ) ;
    01220     }
    01221     // ========================================================================
    01243     GAUDI_API StatusCode setProperty
    01244     ( IProperty*         component ,
    01245       const std::string& name      ,
    01246       const Property*    property  ,
    01247       const std::string& doc = ""  ) ;
    01248     // ========================================================================
    01270     GAUDI_API StatusCode setProperty
    01271     ( IProperty*         component ,
    01272       const std::string& name      ,
    01273       const Property&    property  ,
    01274       const std::string& doc = ""  ) ;
    01275     // ========================================================================
    01298     template <class TYPE>
    01299     StatusCode setProperty
    01300     ( IProperty*                  component ,
    01301       const std::string&          name      ,
    01302       const SimpleProperty<TYPE>& value     ,
    01303       const std::string&          doc = ""  )
    01304     {
    01305       const Property* property = &value ;
    01306       return setProperty ( component , name , property , doc ) ;
    01307     }
    01308     // ========================================================================
    01329     template <class TYPE>
    01330     StatusCode setProperty
    01331     ( IInterface*        component ,
    01332       const std::string& name      ,
    01333       const TYPE&        value     ,
    01334       const std::string& doc = ""  )
    01335     {
    01336       if ( 0 == component ) { return StatusCode::FAILURE ; }
    01337       SmartIF<IProperty> property ( component ) ;
    01338       if ( !property      ) { return StatusCode::FAILURE ; }
    01339       return setProperty ( property , name , value , doc ) ;
    01340     }
    01341     // ========================================================================
    01354     GAUDI_API StatusCode setProperty
    01355     ( IInterface*        component ,
    01356       const std::string& name      ,
    01357       const std::string& value     ,
    01358       const std::string& doc  = "" ) ;
    01359     // ========================================================================
    01372     GAUDI_API StatusCode setProperty
    01373     ( IInterface*        component ,
    01374       const std::string& name      ,
    01375       const char*        value     ,
    01376       const std::string& doc  = "" ) ;
    01377     // ========================================================================
    01391     template <unsigned N>
    01392     StatusCode setProperty
    01393     ( IInterface*          component ,
    01394       const std::string&   name      ,
    01395       const char         (&value)[N] ,
    01396       const std::string& doc  = ""   )
    01397     {
    01398       if ( 0 == component ) { return StatusCode::FAILURE ; }
    01399       const std::string val = std::string ( value , value + N ) ;
    01400       return setProperty ( component , name , val , doc ) ;
    01401     }
    01402     // ========================================================================
    01424     GAUDI_API StatusCode setProperty
    01425     ( IInterface*        component ,
    01426       const std::string& name      ,
    01427       const Property*    property  ,
    01428       const std::string& doc = ""  ) ;
    01429     // ========================================================================
    01451     GAUDI_API StatusCode setProperty
    01452     ( IInterface*        component ,
    01453       const std::string& name      ,
    01454       const Property&    property  ,
    01455       const std::string& doc = ""  ) ;
    01456     // ========================================================================
    01479     template <class TYPE>
    01480     StatusCode
    01481     setProperty
    01482     ( IInterface*                 component ,
    01483       const std::string&          name      ,
    01484       const SimpleProperty<TYPE>& value     ,
    01485       const std::string&          doc = ""  )
    01486     {
    01487       const Property* property = &value ;
    01488       return setProperty ( component , name , property , doc ) ;
    01489     }
    01490     // ========================================================================
    01491   } // end of namespace Gaudi::Utils
    01492 } // end of namespace Gaudi
    01493
    01494
    01495 // ============================================================================
    01496 // The END
    01497 // ============================================================================
    01498 #endif // GAUDIKERNEL_PROPERTY_H
    01499 // ============================================================================

All Classes Namespaces Files Functions Variables Typedefs Enumerations Enumerator Properties Friends Defines