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 );
174 template <
class TYPE>
186 virtual TYPE fromString(
const TYPE& ref_value,
const std::string&
s ) = 0;
192 if ( !
parse( buffer, s ).isSuccess() ) {
211 template <
typename TYPE,
typename Enable =
void>
215 TYPE buffer = ref_value;
216 this->fromStringImpl( buffer,
s );
221 template <
class TYPE>
227 this->fromStringImpl( buffer,
s );
233 template <
typename TYPE>
238 template <
class TYPE>
243 template <
class TYPE>
249 if ( ( m_hasLowerBound && ( value < m_lowerBound ) ) || ( m_hasUpperBound && ( m_upperBound < value ) ) )
258 const TYPE&
lower()
const {
return m_lowerBound; }
260 const TYPE&
upper()
const {
return m_upperBound; }
265 m_hasLowerBound =
true;
266 m_lowerBound = value;
271 m_hasUpperBound =
true;
272 m_upperBound = value;
277 m_hasLowerBound =
false;
278 m_lowerBound = TYPE();
283 m_hasUpperBound =
false;
284 m_upperBound = TYPE();
303 bool m_hasLowerBound{
false};
304 bool m_hasUpperBound{
false};
328 throw std::logic_error(
"setUpdateHandler not implemented for this class" );
336 if ( m_readCallBack ) {
347 if ( m_updateCallBack ) {
359 using ReadHandler::useReadHandler;
360 using ReadHandler::setReadHandler;
361 using ReadHandler::getReadHandler;
362 using UpdateHandler::useUpdateHandler;
363 using UpdateHandler::setUpdateHandler;
364 using UpdateHandler::getUpdateHandler;
379 template <
class TYPE,
class VERIFIER = Details::Property::NullVerifier,
380 class HANDLERS = Details::Property::UpdateHandler>
406 template <
class T = StorageType>
408 : Details::PropertyBase( typeid(
ValueType ),
std::move( name ),
std::move( doc ) )
409 , m_value(
std::forward<T>( value ) )
411 m_verifier( m_value );
415 template <
typename OWNER,
typename T =
ValueType,
416 typename = std::enable_if_t<std::is_base_of<IProperty, OWNER>::value>,
417 typename = std::enable_if_t<std::is_default_constructible<T>::value>>
420 owner->declareProperty( *
this );
421 setOwnerType<OWNER>();
426 template <class OWNER, class T = StorageType, typename = std::enable_if_t<std::is_base_of<IProperty, OWNER>::value>>
430 owner->declareProperty( *
this );
431 setOwnerType<OWNER>();
437 template <
typename T,
typename = not_copying<T>>
444 template <typename T = StorageType, typename = std::enable_if_t<!std::is_reference<T>::value>>
468 return m_handlers.getReadHandler();
473 return m_handlers.getUpdateHandler();
479 m_handlers.useUpdateHandler( *
this );
486 m_handlers.useReadHandler( *
this );
499 return m_value == other;
506 return m_value != other;
513 return m_value < other;
518 decltype(
auto )
operator+(
const T& other )
const 520 return m_value + other;
524 template <
class T = ValueType>
528 m_value = std::forward<T>( v );
529 m_handlers.useUpdateHandler( *
this );
558 template <
class T = const ValueType>
559 inline decltype(
auto )
size()
const 561 return value().
size();
563 template <
class T = const ValueType>
564 inline decltype(
auto ) length()
const 568 template <
class T = const ValueType>
569 inline decltype(
auto ) empty()
const 571 return value().
empty();
573 template <
class T = ValueType>
574 inline decltype(
auto ) clear()
578 template <
class T = const ValueType>
579 inline decltype(
auto )
begin()
const 581 return value().
begin();
583 template <
class T = const ValueType>
584 inline decltype(
auto )
end()
const 586 return value().
end();
588 template <
class T = ValueType>
589 inline decltype(
auto )
begin()
591 return value().
begin();
593 template <
class T = ValueType>
594 inline decltype(
auto )
end()
596 return value().
end();
599 inline decltype(
auto ) operator[](
const ARG& arg )
const 604 inline decltype(
auto ) operator[](
const ARG& arg )
608 template <
class T = const ValueType>
609 inline decltype(
auto ) find(
const typename T::key_type& key )
const 611 return value().
find( key );
613 template <
class T = ValueType>
614 inline decltype(
auto ) find(
const typename T::key_type& key )
616 return value().
find( key );
618 template <
class ARG,
class T = ValueType>
619 inline decltype(
auto ) erase( ARG arg )
621 return value().
erase( arg );
623 template <
class = ValueType>
629 template <
class = ValueType>
634 template <
class = ValueType>
640 template <
class = ValueType>
645 template <
class T = ValueType>
651 template <
class T = ValueType>
658 template <
class T = const ValueType>
659 inline decltype(
auto ) key()
const 661 return value().key();
663 template <
class T = const ValueType>
664 inline decltype(
auto ) objKey()
const 666 return value().objKey();
668 template <
class T = const ValueType>
669 inline decltype(
auto ) fullKey()
const 671 return value().fullKey();
673 template <
class T = ValueType>
674 inline decltype(
auto ) initialize()
676 return value().initialize();
678 template <
class T = ValueType>
679 inline decltype(
auto ) makeHandles()
const 681 return value().makeHandles();
683 template <
class ARG,
class T = ValueType>
684 inline decltype(
auto ) makeHandles(
const ARG& arg )
const 686 return value().makeHandles( arg );
692 template <
class... Args>
693 inline decltype( std::declval<ValueType>()( std::declval<Args&&>()... ) ) operator()( Args&&...
args ) const
694 noexcept( noexcept(
std::declval<
ValueType>()(
std::declval<Args&&>()... ) ) )
696 return value()( std::forward<Args>(
args )... );
709 this->fromString( source.
toString() ).ignore();
717 return dest.
assign( *
this );
722 using Converter = Details::Property::StringConverter<ValueType>;
723 *
this =
Converter().fromString( m_value, source );
729 using Converter = Details::Property::StringConverter<ValueType>;
735 m_handlers.useReadHandler( *
this );
742 template <
class T,
class TP,
class V,
class H>
749 template <
class T,
class TP,
class V,
class H>
756 template <
class T,
class TP,
class V,
class H>
757 decltype(
auto ) operator+( const T& v, const
Property<TP, V, H>& p )
759 return v + p.
value();
762 template <
class TYPE,
class HANDLERS = Details::Property::UpdateHandler>
765 template <
class TYPE>
771 template <
class TYPE>
774 template <
class TYPE>
855 template <
typename Handler =
typename Gaudi::Details::Property::UpdateHandler>
887 m_handlers.useUpdateHandler( *
this );
912 bool load( PropertyBase& destination )
const override {
return destination.assign( *
this ); }
914 bool assign(
const PropertyBase& source )
override {
return fromString( source.toString() ).isSuccess(); }
952 bool load( PropertyBase& destination )
const override {
return destination.assign( *
this ); }
954 bool assign(
const PropertyBase& source )
override {
return fromString( source.toString() ).isSuccess(); }
1129 template <
class TYPE>
1154 template <
class TYPE>
1205 template <
unsigned N>
1242 template <
class TYPE>
1246 return component &&
hasProperty( component, name )
1321 template <
class TYPE>
1325 return setProperty( component, name, &value, doc );
1348 template <
class TYPE>
1402 template <
unsigned N>
1406 if ( 0 == component ) {
1482 template <
class TYPE>
1486 return setProperty( component, name, &value, doc );
1494 #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
constexpr static const auto FAILURE
Property(OWNER *owner, std::string name)
Autodeclaring constructor with property name, value and documentation.
std::function< void(PropertyBase &)> m_readCallBack
Gaudi::Property< unsigned int & > UnsignedIntegerPropertyRef
TYPE fromString(const TYPE &ref_value, const std::string &s) final override
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
TYPE fromString(const TYPE &, const std::string &s) final override
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.
std::string toString(const TYPE &v)
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
constexpr auto size(const C &c) noexcept(noexcept(c.size())) -> decltype(c.size())
Details::PropertyBase & declareUpdateHandler(std::function< void(Details::PropertyBase &)> fun) override
set new callback for update
Property()
Construct an anonymous property with default constructed value.
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
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
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
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)
void fromStringImpl(TYPE &buffer, const std::string &s)
std::ostream & toStream(const DataObjID &d, std::ostream &os)
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
constexpr static const auto SUCCESS
void operator()(const TYPE &) const
Gaudi::Property< std::vector< long long > & > LongLongArrayPropertyRef
std::enable_if_t<!is_this_type< T >::value > not_copying
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
StatusCode parse(DataObjID &dest, const std::string &src)
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
decltype(auto) operator+(const T &v, const Property< TP, V, H > &p)
implemantation of (value + property)
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.
AttribStringParser::Iterator begin(const AttribStringParser &parser)
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)
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)