1 #ifndef GAUDIKERNEL_PROPERTY_H 2 #define GAUDIKERNEL_PROPERTY_H 6 #include <boost/utility/string_ref.hpp> 71 virtual bool useUpdateHandler() = 0;
76 return declareReadHandler( [=](
PropertyBase& p ) { ( instance->*MF )( p ); } );
82 return declareUpdateHandler( [=](
PropertyBase& p ) { ( instance->*MF )( p ); } );
101 template <
class OWNER>
104 setOwnerType(
typeid( OWNER ) );
119 : m_name( to_view(
std::move(
name ) ) ), m_documentation( to_view(
std::move( doc ) ) ), m_typeinfo( &type )
124 : m_name( to_view(
std::move( name ) ) ), m_documentation( m_name ), m_typeinfo( &type )
134 static boost::string_ref to_view(
std::string str );
176 template <
class TYPE>
188 virtual TYPE fromString(
const TYPE& ref_value,
const std::string&
s ) = 0;
194 if ( !
parse( buffer, InputData{s} ).isSuccess() ) {
213 template <
typename TYPE,
typename Enable =
void>
217 TYPE buffer = ref_value;
218 this->fromStringImpl( buffer,
s );
223 template <
class TYPE>
229 this->fromStringImpl( buffer,
s );
235 template <
typename TYPE>
240 template <
class TYPE>
245 template <
class TYPE>
251 if ( ( m_hasLowerBound && ( value < m_lowerBound ) ) || ( m_hasUpperBound && ( m_upperBound < value ) ) )
260 const TYPE&
lower()
const {
return m_lowerBound; }
262 const TYPE&
upper()
const {
return m_upperBound; }
267 m_hasLowerBound =
true;
268 m_lowerBound = value;
273 m_hasUpperBound =
true;
274 m_upperBound = value;
279 m_hasLowerBound =
false;
280 m_lowerBound = TYPE();
285 m_hasUpperBound =
false;
286 m_upperBound = TYPE();
305 bool m_hasLowerBound{
false};
306 bool m_hasUpperBound{
false};
330 throw std::logic_error(
"setUpdateHandler not implemented for this class" );
338 if ( m_readCallBack ) {
349 if ( m_updateCallBack ) {
361 using ReadHandler::useReadHandler;
362 using ReadHandler::setReadHandler;
363 using ReadHandler::getReadHandler;
364 using UpdateHandler::useUpdateHandler;
365 using UpdateHandler::setUpdateHandler;
366 using UpdateHandler::getUpdateHandler;
381 template <
class TYPE,
class VERIFIER = Details::Property::NullVerifier,
382 class HANDLERS = Details::Property::UpdateHandler>
409 template <
class T = StorageType>
411 : Details::PropertyBase( typeid(
ValueType ),
std::move( name ),
std::move( doc ) )
412 , m_value(
std::forward<T>( value ) )
414 m_verifier( m_value );
418 template <
typename OWNER,
typename T =
ValueType,
419 typename = std::enable_if_t<std::is_base_of<IProperty, OWNER>::value>,
420 typename = std::enable_if_t<std::is_default_constructible<T>::value>>
428 template <class OWNER, class T = StorageType, typename = std::enable_if_t<std::is_base_of<IProperty, OWNER>::value>>
437 template <class OWNER, class T = StorageType, typename = std::enable_if_t<std::is_base_of<IProperty, OWNER>::value>>
440 :
Property( owner,
std::move( name ),
std::forward<T>( value ),
std::move( doc ) )
442 declareUpdateHandler(
std::move( handler ) );
447 template <class OWNER, class T = StorageType, typename = std::enable_if_t<std::is_base_of<IProperty, OWNER>::value>>
451 [owner, handler]( PropertyBase& p ) { ( owner->*handler )( p ); },
std::move( doc ) )
456 template <class OWNER, class T = StorageType, typename = std::enable_if_t<std::is_base_of<IProperty, OWNER>::value>>
459 [owner, handler]( PropertyBase& ) { ( owner->*handler )(); },
std::move( doc ) )
465 template <class OWNER, class T = StorageType, typename = std::enable_if_t<std::is_base_of<IProperty, OWNER>::value>>
468 :
Property( owner,
std::move( name ),
std::forward<T>( value ),
std::move( handler ),
std::move( doc ) )
470 if ( invoke ) useUpdateHandler();
476 template <
typename T,
typename = not_copying<T>>
483 template <typename T = StorageType, typename = std::enable_if_t<!std::is_reference<T>::value>>
492 template <class OWNER, typename = std::enable_if_t<std::is_base_of<IProperty, OWNER>::value>>
495 owner->declareProperty( *
this );
496 setOwnerType<OWNER>();
515 return m_handlers.getReadHandler();
520 return m_handlers.getUpdateHandler();
526 m_handlers.useUpdateHandler( *
this );
533 m_handlers.useReadHandler( *
this );
546 return m_value == other;
553 return m_value != other;
560 return m_value < other;
565 decltype(
auto )
operator+(
const T& other )
const 567 return m_value + other;
571 template <
class T = ValueType>
575 m_value = std::forward<T>( v );
576 m_handlers.useUpdateHandler( *
this );
605 template <
class T = const ValueType>
606 decltype(
auto )
size()
const 608 return value().
size();
610 template <
class T = const ValueType>
611 decltype(
auto ) length()
const 615 template <
class T = const ValueType>
616 decltype(
auto ) empty()
const 618 return value().
empty();
620 template <
class T = ValueType>
621 decltype(
auto ) clear()
625 template <
class T = const ValueType>
626 decltype(
auto )
begin()
const 628 return value().
begin();
630 template <
class T = const ValueType>
631 decltype(
auto )
end()
const 633 return value().
end();
635 template <
class T = ValueType>
636 decltype(
auto )
begin()
638 return value().
begin();
640 template <
class T = ValueType>
641 decltype(
auto )
end()
643 return value().
end();
646 decltype(
auto ) operator[](
const ARG& arg )
const 651 decltype(
auto ) operator[](
const ARG& arg )
655 template <
class T = const ValueType>
656 decltype(
auto ) find(
const typename T::key_type& key )
const 658 return value().
find( key );
660 template <
class T = ValueType>
661 decltype(
auto ) find(
const typename T::key_type& key )
663 return value().
find( key );
665 template <
class ARG,
class T = ValueType>
666 decltype(
auto ) erase( ARG arg )
668 return value().
erase( arg );
670 template <
class = ValueType>
676 template <
class = ValueType>
681 template <
class = ValueType>
687 template <
class = ValueType>
692 template <
class T = ValueType>
698 template <
class T = ValueType>
705 template <
class T = const ValueType>
706 decltype(
auto ) targetKey()
const 708 return value().targetKey();
710 template <
class ARG,
class T = ValueType>
711 decltype(
auto ) setTargetKey(
const ARG& arg )
713 return value().setTargetKey( arg );
715 template <
class T = const ValueType>
716 decltype(
auto ) metadata()
const 718 return value().metadata();
720 template <
class T = const ValueType>
721 decltype(
auto ) key()
const 723 return value().key();
725 template <
class T = const ValueType>
726 decltype(
auto ) objKey()
const 728 return value().objKey();
730 template <
class T = const ValueType>
731 decltype(
auto ) fullKey()
const 733 return value().fullKey();
735 template <
class T = ValueType>
736 decltype(
auto ) initialize()
738 return value().initialize();
740 template <
class T = ValueType>
741 decltype(
auto ) makeHandles()
const 743 return value().makeHandles();
745 template <
class ARG,
class T = ValueType>
746 decltype(
auto ) makeHandles(
const ARG& arg )
const 748 return value().makeHandles( arg );
754 template <
class... Args>
755 decltype( std::declval<ValueType>()( std::declval<Args&&>()... ) ) operator()( Args&&...
args ) const
756 noexcept( noexcept(
std::declval<
ValueType>()(
std::declval<Args&&>()... ) ) )
758 return value()( std::forward<Args>(
args )... );
771 this->fromString( source.
toString() ).ignore();
779 return dest.
assign( *
this );
784 using Converter = Details::Property::StringConverter<ValueType>;
785 *
this =
Converter().fromString( m_value, source );
791 using Converter = Details::Property::StringConverter<ValueType>;
797 m_handlers.useReadHandler( *
this );
804 template <
class T,
class TP,
class V,
class H>
811 template <
class T,
class TP,
class V,
class H>
818 template <
class T,
class TP,
class V,
class H>
819 decltype(
auto ) operator+( const T& v, const
Property<TP, V, H>& p )
821 return v + p.
value();
824 template <
class TYPE,
class HANDLERS = Details::Property::UpdateHandler>
827 template <
class TYPE>
833 template <
class TYPE>
836 template <
class TYPE>
917 template <
typename Handler =
typename Gaudi::Details::Property::UpdateHandler>
949 m_handlers.useUpdateHandler( *
this );
974 bool load( PropertyBase& destination )
const override {
return destination.assign( *
this ); }
976 bool assign(
const PropertyBase& source )
override {
return fromString( source.toString() ).isSuccess(); }
1014 bool load( PropertyBase& destination )
const override {
return destination.assign( *
this ); }
1016 bool assign(
const PropertyBase& source )
override {
return fromString( source.toString() ).isSuccess(); }
1191 template <
class TYPE>
1216 template <
class TYPE>
1267 template <
unsigned N>
1304 template <
class TYPE>
1308 return component &&
hasProperty( component, name )
1383 template <
class TYPE>
1387 return setProperty( component, name, &value, doc );
1410 template <
class TYPE>
1464 template <
unsigned N>
1468 if ( 0 == component ) {
1544 template <
class TYPE>
1548 return setProperty( component, name, &value, doc );
1556 #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
Property(OWNER *owner, std::string name, T &&value, std::function< void(PropertyBase &)> handler, Details::Property::ImmediatelyInvokeHandler invoke, std::string doc="")
Autodeclaring constructor with property name, value, updateHandler and documentation.
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.
void setOwner(OWNER *owner)
Set the owner of this property.
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
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::tagged_bool< class ImmediatelyInvokeHandler_tag > ImmediatelyInvokeHandler
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
std::string toString(const TYPE &v)
Property(OWNER *owner, std::string name, T &&value, void(OWNER::*handler)(), std::string doc="")
Autodeclaring constructor with property name, value, pointer to member function updateHandler and doc...
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
The declaration of major parsing functions used e.g for (re)implementation of new extended properties...
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
Property(OWNER *owner, std::string name, T &&value, void(OWNER::*handler)(PropertyBase &), std::string doc="")
Autodeclaring constructor with property name, value, pointer to member function updateHandler and doc...
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 (.
Property(OWNER *owner, std::string name, T &&value, std::function< void(PropertyBase &)> handler, std::string doc="")
Autodeclaring constructor with property name, value, updateHandler and documentation.
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)
auto invoke(F &&f, ArgTypes &&...args) noexcept(noexcept(detail2::INVOKE(std::forward< F >(f), std::forward< ArgTypes >(args)...))) -> decltype(detail2::INVOKE(std::forward< F >(f), std::forward< ArgTypes >(args)...))
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)