1 #ifndef GAUDIKERNEL_PROPERTY_H 2 #define GAUDIKERNEL_PROPERTY_H 6 #include <boost/utility/string_ref.hpp> 72 virtual bool useUpdateHandler() = 0;
77 return declareReadHandler( [=](
PropertyBase& p ) { ( instance->*MF )( p ); } );
83 return declareUpdateHandler( [=](
PropertyBase& p ) { ( instance->*MF )( p ); } );
102 template <
class OWNER>
105 setOwnerType(
typeid( OWNER ) );
120 : m_name( to_view(
std::move(
name ) ) ), m_documentation( to_view(
std::move( doc ) ) ), m_typeinfo( &type )
125 : m_name( to_view(
std::move( name ) ) ), m_documentation( m_name ), m_typeinfo( &type )
135 static boost::string_ref to_view(
std::string str );
153 template <
class TYPE>
164 if ( !
parse( tmp, s ).isSuccess() ) {
176 template <
class TYPE>
181 template <
class TYPE>
187 if ( ( m_hasLowerBound && ( value < m_lowerBound ) ) || ( m_hasUpperBound && ( m_upperBound < value ) ) )
196 const TYPE&
lower()
const {
return m_lowerBound; }
198 const TYPE&
upper()
const {
return m_upperBound; }
203 m_hasLowerBound =
true;
204 m_lowerBound = value;
209 m_hasUpperBound =
true;
210 m_upperBound = value;
215 m_hasLowerBound =
false;
216 m_lowerBound = TYPE();
221 m_hasUpperBound =
false;
222 m_upperBound = TYPE();
241 bool m_hasLowerBound{
false};
242 bool m_hasUpperBound{
false};
266 throw std::logic_error(
"setUpdateHandler not implemented for this class" );
274 if ( m_readCallBack ) {
285 if ( m_updateCallBack ) {
297 using ReadHandler::useReadHandler;
298 using ReadHandler::setReadHandler;
299 using ReadHandler::getReadHandler;
300 using UpdateHandler::useUpdateHandler;
301 using UpdateHandler::setUpdateHandler;
302 using UpdateHandler::getUpdateHandler;
317 template <
class TYPE,
class VERIFIER = Details::Property::NullVerifier,
318 class HANDLERS = Details::Property::UpdateHandler>
344 template <
class T = StorageType>
346 : Details::PropertyBase( typeid(
ValueType ),
std::move( name ),
std::move( doc ) )
347 , m_value(
std::forward<T>( value ) )
349 m_verifier( m_value );
353 template <
class OWNER,
class T =
ValueType,
358 owner->declareProperty( *
this );
359 setOwnerType<OWNER>();
369 owner->declareProperty( *
this );
370 setOwnerType<OWNER>();
383 template <typename T = StorageType, typename = typename std::enable_if<!std::is_reference<T>::value>::type>
407 return m_handlers.getReadHandler();
412 return m_handlers.getUpdateHandler();
418 m_handlers.useUpdateHandler( *
this );
425 m_handlers.useReadHandler( *
this );
438 return m_value == other;
445 return m_value != other;
452 return m_value < other;
457 decltype( std::declval<ValueType>() + std::declval<T>() )
operator+(
const T& other )
const 459 return m_value + other;
463 template <
class T = ValueType>
467 m_value = std::forward<T>( v );
468 m_handlers.useUpdateHandler( *
this );
497 template <
class T = const ValueType>
498 inline decltype( std::declval<T>().size() ) size()
const 500 return value().
size();
502 template <
class T = const ValueType>
503 inline decltype( std::declval<T>().length() ) length()
const 507 template <
class T = const ValueType>
508 inline decltype( std::declval<T>().empty() ) empty()
const 510 return value().
empty();
512 template <
class T = ValueType>
513 inline decltype( std::declval<T>().clear() ) clear()
517 template <
class T = const ValueType>
518 inline decltype( std::declval<T>().
begin() )
begin()
const 520 return value().
begin();
522 template <
class T = const ValueType>
523 inline decltype( std::declval<T>().
end() )
end()
const 525 return value().
end();
527 template <
class T = ValueType>
528 inline decltype( std::declval<T>().
begin() )
begin()
530 return value().
begin();
532 template <
class T = ValueType>
533 inline decltype( std::declval<T>().
end() )
end()
535 return value().
end();
537 template <
class ARG,
class T = const ValueType>
538 inline decltype( std::declval<T>()[ARG{}] )
operator[](
const ARG& arg )
const 542 template <
class ARG,
class T = ValueType>
543 inline decltype( std::declval<T>()[ARG{}] )
operator[](
const ARG& arg )
547 template <
class T = const ValueType>
548 inline decltype( std::declval<T>().find(
typename T::key_type{} ) ) find(
const typename T::key_type& key )
const 550 return value().
find( key );
552 template <
class T = ValueType>
553 inline decltype( std::declval<T>().find(
typename T::key_type{} ) ) find(
const typename T::key_type& key )
555 return value().
find( key );
557 template <
class ARG,
class T = ValueType>
558 inline decltype( std::declval<T>().erase( ARG{} ) ) erase( ARG arg )
560 return value().
erase( arg );
562 template <
class = ValueType>
568 template <
class = ValueType>
573 template <
class = ValueType>
579 template <
class = ValueType>
584 template <
class T = ValueType>
590 template <
class T = ValueType>
597 template <
class T = const ValueType>
598 inline decltype( std::declval<T>().key() ) key()
const 600 return value().key();
602 template <
class T = const ValueType>
603 inline decltype( std::declval<T>().objKey() ) objKey()
const 605 return value().objKey();
607 template <
class T = const ValueType>
608 inline decltype( std::declval<T>().fullKey() ) fullKey()
const 610 return value().fullKey();
612 template <
class T = ValueType>
613 inline decltype( std::declval<T>().initialize() ) initialize()
615 return value().initialize();
617 template <
class T = ValueType>
618 inline decltype( std::declval<T>().makeHandles() ) makeHandles()
const 620 return value().makeHandles();
622 template <
class ARG,
class T = ValueType>
623 inline decltype( std::declval<T>().makeHandles( std::declval<ARG>() ) ) makeHandles(
const ARG& arg )
const 625 return value().makeHandles( arg );
639 this->fromString( source.
toString() ).ignore();
647 return dest.
assign( *
this );
652 using Converter = Details::Property::StringConverter<ValueType>;
653 *
this =
Converter().fromString( source );
659 using Converter = Details::Property::StringConverter<ValueType>;
665 m_handlers.useReadHandler( *
this );
672 template <
class T,
class TP,
class V,
class H>
679 template <
class T,
class TP,
class V,
class H>
686 template <
class T,
class TP,
class V,
class H>
687 decltype( std::declval<TP>() + std::declval<T>() ) operator+( const T& v, const
Property<TP, V, H>& p )
689 return v + p.
value();
692 template <
class TYPE,
class HANDLERS = Details::Property::UpdateHandler>
695 template <
class TYPE>
701 template <
class TYPE>
704 template <
class TYPE>
785 template <
typename Handler =
typename Gaudi::Details::Property::UpdateHandler>
817 m_handlers.useUpdateHandler( *
this );
842 bool load( PropertyBase& destination )
const override {
return destination.assign( *
this ); }
844 bool assign(
const PropertyBase& source )
override {
return fromString( source.toString() ); }
882 bool load( PropertyBase& destination )
const override {
return destination.assign( *
this ); }
884 bool assign(
const PropertyBase& source )
override {
return fromString( source.toString() ); }
1059 template <
class TYPE>
1084 template <
class TYPE>
1135 template <
unsigned N>
1172 template <
class TYPE>
1176 return component &&
hasProperty( component, name )
1251 template <
class TYPE>
1255 return setProperty( component, name, &value, doc );
1278 template <
class TYPE>
1332 template <
unsigned N>
1336 if ( 0 == component ) {
1412 template <
class TYPE>
1416 return setProperty( component, name, &value, doc );
1424 #endif // GAUDIKERNEL_PROPERTY_H Gaudi::Property< std::vector< float > & > FloatArrayPropertyRef
StatusCode setProperty(IProperty *component, const std::string &name, const TYPE &value, const std::string &doc)
simple function to set the property of the given object from the value
Gaudi::Property< signed char & > SignedCharPropertyRef
Details::Property::NullVerifier VerifierType
Gaudi::Property< std::vector< signed char > & > SignedCharArrayPropertyRef
Property(OWNER *owner, std::string name)
Autodeclaring constructor with property name, value and documentation.
std::function< void(PropertyBase &)> m_readCallBack
std::string toString(const TYPE &v)
Gaudi::Property< unsigned int & > UnsignedIntegerPropertyRef
bool operator!=(const T &v, const Property< TP, V, H > &p)
delegate (value != property) to property operator!=
GaudiHandleProperty * clone() const override
clones the current property
bool setValue(const ValueType &v)
std::ostream & toStream(ITERATOR first, ITERATOR last, std::ostream &s, const std::string &open, const std::string &close, const std::string &delim)
the helper function to print the sequence
std::function< void(PropertyBase &)> getReadHandler() const
void useUpdateHandler(const PropertyBase &) const
Gaudi::Property< std::vector< unsigned short > > UnsignedShortArrayProperty
Gaudi::Property< TYPE > SimpleProperty
Gaudi::Property< long long & > LongLongPropertyRef
PropertyBase & declareReadHandler(void(HT::*MF)(PropertyBase &), HT *instance)
Gaudi::Property< std::vector< int > > IntegerArrayProperty
std::ostream & operator<<(std::ostream &stream, const PropertyBase &prop)
bool operator==(const T &v, const Property< TP, V, H > &p)
delegate (value == property) to property operator==
bool useUpdateHandler() override
manual trigger for callback for update
void setDocumentation(std::string value)
set the documentation string
Gaudi::Property< long long > LongLongProperty
const std::function< void(PropertyBase &)> readCallBack() const override
get a reference to the readCallBack
Implementation of property with value of concrete type.
Gaudi::Property< long & > LongPropertyRef
std::function< void(PropertyBase &)> m_updateCallBack
virtual PropertyBase & declareUpdateHandler(std::function< void(PropertyBase &)> fun)=0
set new callback for update
GAUDI_API const std::string typeinfoName(const std::type_info &)
Get platform independent information about the class type.
Gaudi::Property< std::vector< double > & > DoubleArrayPropertyRef
virtual bool assign(const PropertyBase &source)=0
import the property value form the source
The declaration of major parsing functions used e.g for (re)implementation of new extended properties...
bool load(PropertyBase &destination) const override
const std::string name() const
property name
Property & operator=(T &&v)
Assignment from value.
Gaudi::Property< float > FloatProperty
Gaudi::Property< int > IntegerProperty
Gaudi::Property< std::vector< unsigned long long > & > UnsignedLongLongArrayPropertyRef
void setOwnerType()
set the type of the owner class (used for documentation)
void clearUpper()
Clear upper bound value.
const TYPE & upper() const
Return the upper bound value.
GaudiHandleArrayProperty * clone() const override
clones the current property
std::string toString(const TYPE &obj)
the generic implementation of the type conversion to the string
Gaudi::Property< unsigned long long > UnsignedLongLongProperty
Gaudi::Property< float & > FloatPropertyRef
vector< std::string > StorageType
Hosted type.
Gaudi::Details::PropertyBase * property(const std::string &name) const
std::string ownerTypeName() const
get the string for the type of the owner class (used for documentation)
std::string toString() const override
value -> string
Gaudi::Property< std::vector< std::string > > StringArrayProperty
Gaudi::Property< std::vector< unsigned short > & > UnsignedShortArrayPropertyRef
StatusCode parse(GaudiUtils::HashMap< K, V > &result, const std::string &input)
Basic parser for the types of HashMap used in DODBasicMapper.
Gaudi::Property< std::vector< unsigned char > > UnsignedCharArrayProperty
void setLower(const TYPE &value)
Set lower bound value.
Gaudi::Property< unsigned short > UnsignedShortProperty
const std::function< void(Details::PropertyBase &)> updateCallBack() const override
get a reference to the updateCallBack
Gaudi::Property< unsigned long > UnsignedLongProperty
Gaudi::Property< std::string & > StringPropertyRef
StorageType m_value
Storage.
Gaudi::Property< char & > CharPropertyRef
Gaudi::Property< std::vector< bool > & > BooleanArrayPropertyRef
Gaudi::Property< std::vector< long double > > LongDoubleArrayProperty
Gaudi::Property< std::vector< long long > > LongLongArrayProperty
Gaudi::Property< std::vector< double > > DoubleArrayProperty
bool operator<(const T &other) const
"less" comparison
void setOwnerType(const std::type_info &ownerType)
set the type of the owner class (used for documentation)
virtual std::string toString() const =0
value -> string
Gaudi::Property< std::vector< short > > ShortArrayProperty
Gaudi::Details::PropertyBase Property
backward compatibility hack for old Property base class
Gaudi::Property< std::vector< unsigned long > & > UnsignedLongArrayPropertyRef
Gaudi::Property< std::vector< unsigned int > > UnsignedIntegerArrayProperty
PropertyBase(const std::type_info &type, std::string name="", std::string doc="")
constructor from the property name and the type
Details::PropertyBase & declareUpdateHandler(std::function< void(Details::PropertyBase &)> fun) override
set new callback for update
Property()
Construct an anonymous property with default constructed value.
auto begin(reverse_wrapper< T > &w)
Helper class to simplify the migration old properties deriving directly from PropertyBase.
PropertyMgr & operator=(const PropertyMgr &)=delete
Property & operator+=(const T &other)
Gaudi::Property< std::vector< long > > LongArrayProperty
typename std::remove_reference< StorageType >::type ValueType
Gaudi::Property< std::vector< long > & > LongArrayPropertyRef
void operator()(PropertyBase &p) const
void operator()(const TYPE &value) const
Gaudi::Property< signed char > SignedCharProperty
std::ostream & toStream(const Type &, std::ostream &)
Gaudi::Property< char > CharProperty
Property & operator-=(const T &other)
const VerifierType & verifier() const
Accessor to verifier.
Gaudi::Property< int & > IntegerPropertyRef
GaudiHandleBase * m_pValue
Pointer to the real property.
Gaudi::Property< unsigned long & > UnsignedLongPropertyRef
const std::type_info * ownerType() const
get the type of the owner class (used for documentation)
boost::string_ref m_name
property name
PropertyBase(std::string name, const std::type_info &type)
constructor from the property name and the type
bool hasProperty(const std::string &name) const override
Return true if we have a property with the given name.
void setBounds(const TYPE &lower, const TYPE &upper)
Set both bounds (lower and upper) at the same time.
Gaudi::Property< std::vector< long double > & > LongDoubleArrayPropertyRef
This class is used for returning status codes from appropriate routines.
Property(std::string name, T &&value, std::string doc="")
the constructor with property name, value and documentation.
Definition of the basic interface.
const std::type_info * m_typeinfo
property type
Gaudi::Property< unsigned int > UnsignedIntegerProperty
TYPE fromString(const std::string &s)
const TYPE & lower() const
Return the lower bound value.
Gaudi::Property< std::vector< char > > CharArrayProperty
virtual PropertyBase & declareReadHandler(std::function< void(PropertyBase &)> fun)=0
set new callback for reading
const GaudiHandleBase & value() const
Gaudi::Property< bool > BooleanProperty
PropertyBase & declareUpdateHandler(std::function< void(PropertyBase &)> fun) override
set new callback for update
Gaudi::Property< std::vector< unsigned long long > > UnsignedLongLongArrayProperty
VerifierType & verifier()
Accessor to verifier.
PropertyBase & declareReadHandler(std::function< void(PropertyBase &)> fun) override
set new callback for reading
const GaudiHandleArrayBase & value() const
auto end(reverse_wrapper< T > &w)
PropertyBase base class allowing PropertyBase* collections to be "homogeneous".
virtual std::ostream & fillStream(std::ostream &) const
the printout of the property value
PropertyBase & declareUpdateHandler(void(HT::*MF)(PropertyBase &), HT *instance)
bool hasLower() const
Return if it has a lower bound.
Gaudi::Property< double > DoubleProperty
void setName(std::string value)
set the new value for the property name
Gaudi::Property< std::vector< int > & > IntegerArrayPropertyRef
bool assign(const PropertyBase &source) override
void operator()(const TYPE &) const
Gaudi::Property< std::vector< long long > & > LongLongArrayPropertyRef
Gaudi::Property< double & > DoublePropertyRef
std::function< void(PropertyBase &)> getUpdateHandler() const
bool operator==(const T &other) const
equality comparison
Gaudi::Property< std::vector< unsigned char > & > UnsignedCharArrayPropertyRef
void useReadHandler(const PropertyBase &p) const
bool hasUpper() const
Return if it has a lower bound.
bool load(Details::PropertyBase &dest) const override
set value to another property
Base class of array's of various gaudihandles.
std::function< void(PropertyBase &)> getUpdateHandler() const
Gaudi::Property< long double & > LongDoublePropertyRef
void useReadHandler() const
use the call-back function at reading, if available
Gaudi::Property< std::vector< signed char > > SignedCharArrayProperty
bool useUpdateHandler() override
use the call-back function at update, if available
Gaudi::Property< std::string > StringProperty
void setUpdateHandler(std::function< void(PropertyBase &)> fun)
Gaudi::Property< long double > LongDoubleProperty
GaudiHandleArrayProperty & operator=(const GaudiHandleArrayBase &value)
SwapCall(callback_t &input)
GaudiHandleArrayBase * m_pValue
Pointer to the real property.
double fun(const std::vector< double > &x)
Gaudi::Property< short > ShortProperty
std::string type() const
property type
std::string documentation() const
property documentation
Gaudi::Property< std::vector< unsigned long > > UnsignedLongArrayProperty
Details::PropertyBase * clone() const override
clones the current property
Gaudi::Property< TYPE & > SimplePropertyRef
Gaudi::Property< unsigned long long & > UnsignedLongLongPropertyRef
void clearBounds()
Clear both bounds (lower and upper) at the same time.
void setReadHandler(std::function< void(PropertyBase &)> fun)
GAUDI_API const Gaudi::Details::PropertyBase * getProperty(const std::vector< const Gaudi::Details::PropertyBase * > *p, const std::string &name)
get the property by name from the list of the properties
StatusCode setProperty(IInterface *component, const std::string &name, const Gaudi::Property< TYPE > &value, const std::string &doc="")
simple function to set the property of the given object from another property
std::function< void(PropertyBase &)> getReadHandler() const
Gaudi::Property< std::vector< std::string > & > StringArrayPropertyRef
bool assign(const Details::PropertyBase &source) override
get the value from another property
bool assign(const PropertyBase &source) override
bool operator!=(const T &other) const
inequality comparison
Gaudi::Property< long > LongProperty
void setUpdateHandler(std::function< void(PropertyBase &)>)
Gaudi::Property< std::vector< char > & > CharArrayPropertyRef
const ValueType & value() const
Backward compatibility (.
void clearLower()
Clear lower bound value.
Base class to handles to be used in lieu of naked pointers to various Gaudi components.
implementation of various functions for streaming.
Property(T &&v)
Construct an anonymous property from a value.
Gaudi::Property< unsigned short & > UnsignedShortPropertyRef
Gaudi::Property< std::vector< float > > FloatArrayProperty
ValueType operator++(int)
The IProperty is the basic interface for all components which have properties that can be set or get...
helper to disable a while triggering it, to avoid infinite recursion
boost::string_ref m_documentation
property doc string
bool load(PropertyBase &destination) const override
GaudiHandleProperty & operator=(const GaudiHandleBase &value)
Gaudi::Property< std::vector< short > & > ShortArrayPropertyRef
Property(OWNER *owner, std::string name, T &&value, std::string doc="")
Autodeclaring constructor with property name, value and documentation.
const std::function< void(PropertyBase &)> updateCallBack() const override
get a reference to the updateCallBack
Details::PropertyBase & declareReadHandler(std::function< void(Details::PropertyBase &)> fun) override
set new callback for reading
Helper functions to set/get the application return code.
Gaudi::Property< unsigned char > UnsignedCharProperty
const std::function< void(Details::PropertyBase &)> readCallBack() const override
get a reference to the readCallBack
Gaudi::Property< short & > ShortPropertyRef
std::string toString(const Type &)
void setUpper(const TYPE &value)
Set upper bound value.
void setReadHandler(std::function< void(PropertyBase &)>)
Details::Property::UpdateHandler HandlersType
Gaudi::Property< unsigned char & > UnsignedCharPropertyRef
ValueType operator--(int)
decltype(std::declval< TP >()+std::declval< T >()) operator+(const T &v, const Property< TP, V, H > &p)
implemantation of (value + property)
void useReadHandler(const PropertyBase &) const
Gaudi::Property< std::vector< bool > > BooleanArrayProperty
const std::type_info * type_info() const
property type-info
Gaudi::Property< std::vector< unsigned int > & > UnsignedIntegerArrayPropertyRef
StatusCode fromString(const std::string &source) override
string -> value
void toStream(std::ostream &out) const override
value -> stream
Gaudi::Property< bool & > BooleanPropertyRef
void useUpdateHandler(PropertyBase &p)