10#include "MantidKernel/DllConfig.h"
23#include <unordered_set>
39class IPropertySettings;
43class SplittingInterval;
44template <
typename T>
class TimeSeriesProperty;
45template <
typename T>
class Matrix;
63 virtual void declareProperty(std::unique_ptr<Property> p,
const std::string &doc =
"") = 0;
81 const std::string &doc =
"",
const unsigned int direction = Direction::Input) {
82 std::unique_ptr<PropertyWithValue<T>> p = std::make_unique<PropertyWithValue<T>>(name,
value, validator, direction);
83 declareProperty(std::move(p), doc);
98 const unsigned int direction = Direction::Input) {
99 std::unique_ptr<PropertyWithValue<T>> p =
100 std::make_unique<PropertyWithValue<T>>(name,
value, std::make_shared<NullValidator>(), direction);
101 declareProperty(std::move(p), doc);
113 std::unique_ptr<PropertyWithValue<T>> p =
114 std::make_unique<PropertyWithValue<T>>(name,
value, std::make_shared<NullValidator>(), direction);
115 declareProperty(std::move(p));
138 const std::string &doc = std::string(),
const unsigned int direction = Direction::Input) {
139 if (
value ==
nullptr)
140 throw std::invalid_argument(
"Attempted to set " + name +
" to nullptr");
142 declareProperty(name, std::string(
value), std::move(validator), doc, direction);
167 const unsigned int direction = Direction::Input) {
168 if (
value ==
nullptr)
169 throw std::invalid_argument(
"Attempted to set " + name +
" to nullptr");
171 declareProperty(name, std::string(
value), std::move(validator), doc, direction);
183 declareProperty(name, std::string(
value), std::make_shared<NullValidator>(),
"", direction);
187 virtual void removeProperty(
const std::string &name,
const bool delproperty =
true) = 0;
201 const std::string &propertiesString,
202 const std::unordered_set<std::string> &ignoreProperties = std::unordered_set<std::string>()) = 0;
213 const std::unordered_set<std::string> &ignoreProperties = std::unordered_set<std::string>(),
214 bool createMissing =
false) = 0;
224 const std::unordered_set<std::string> &ignoreProperties = std::unordered_set<std::string>(),
225 bool createMissing =
false) = 0;
267 return doSetProperty(name,
value);
279 setTypedProperty(name, std::move(
value), std::is_convertible<std::unique_ptr<T>, std::shared_ptr<DataItem>>());
280 this->afterPropertySet(name);
293 if (
value ==
nullptr)
294 throw std::invalid_argument(
"Attempted to set " + name +
" to nullptr");
295 return setProperty(name, std::string(
value));
306 this->setPropertyValue(name,
value);
314 virtual std::string
asString(
bool withDefaultValues =
false)
const = 0;
317 virtual ::Json::Value
asJson(
bool withDefaultValues =
false)
const = 0;
325 Property *prop = getPointerToProperty(name);
333 virtual void filterByTime(
const Types::Core::DateAndTime & ,
const Types::Core::DateAndTime & ) = 0;
335 std::vector<PropertyManager *> )
const = 0;
354 template <
typename T> T
getValue(
const std::string &name)
const;
392 operator unsigned long();
399 operator std::string();
404 template <
typename T>
operator std::vector<T>() {
return pm.
getValue<std::vector<T>>(prop); }
406 template <
typename T>
operator std::vector<std::vector<T>>() {
407 return pm.
getValue<std::vector<std::vector<T>>>(prop);
410 template <
typename T>
operator std::shared_ptr<T>() {
return pm.
getValue<std::shared_ptr<T>>(prop); }
412 template <
typename T>
operator std::shared_ptr<const T>() {
return pm.
getValue<std::shared_ptr<T>>(prop); }
432 setTypedProperty(name,
value, std::is_convertible<T, std::shared_ptr<DataItem>>());
433 this->afterPropertySet(name);
453 static_cast<void>(
sizeof(T));
454 setTypedProperty(name,
value, std::is_convertible<T *, DataItem *>());
455 this->afterPropertySet(name);
467 template <
typename T>
473 throw std::invalid_argument(
"Attempt to assign to property (" + name +
") of incorrect type");
485 template <
typename T>
488 std::shared_ptr<DataItem> data = std::static_pointer_cast<DataItem>(
value);
489 std::string
error = getPointerToProperty(name)->setDataItem(data);
490 if (!
error.empty()) {
491 throw std::invalid_argument(
error);
505 template <
typename T>
508 std::shared_ptr<DataItem> data(std::move(
value));
509 std::string
error = getPointerToProperty(name)->setDataItem(data);
510 if (!
error.empty()) {
511 throw std::invalid_argument(
error);
523#define DEFINE_IPROPERTYMANAGER_GETVALUE(type) \
526 template <> DLLExport type IPropertyManager::getValue<type>(const std::string &name) const { \
527 PropertyWithValue<type> *prop = dynamic_cast<PropertyWithValue<type> *>(getPointerToProperty(name)); \
531 std::string message = "Attempt to assign property " + name + " to incorrect type. Expected type " #type; \
532 throw std::runtime_error(message); \
double value
The value of the point.
std::map< DeltaEMode::Type, std::string > index
Interface to PropertyManager.
void declareProperty(const std::string &name, const char *value, IValidator_sptr validator=std::make_shared< NullValidator >(), const std::string &doc=std::string(), const unsigned int direction=Direction::Input)
Specialised version of declareProperty template method to prevent the creation of a PropertyWithValue...
virtual void clear()=0
Clears all properties under management.
virtual void resetProperties()=0
virtual Property * getPointerToPropertyOrdinal(const int &index) const =0
Get a property by an index.
IPropertyManager * doSetProperty(const std::string &name, const T &value)
Helper method to set the value of a PropertyWithValue.
IPropertyManager * setProperty(const std::string &name, const char *value)
Specialised version of setProperty template method to handle const char *.
virtual void setPropertyValue(const std::string &name, const std::string &value)=0
Sets property value from a string.
virtual bool validateProperties() const =0
Validates all the properties in the collection.
void declareProperty(const std::string &name, T value, const unsigned int direction)
Add a property of the template type to the list of managed properties.
IPropertyManager * setProperty(const std::string &name, const std::string &value)
Specialised version of setProperty template method to handle std::string.
virtual ::Json::Value asJson(bool withDefaultValues=false) const =0
Return the property manager serialized as a json object.
virtual void setProperties(const ::Json::Value &jsonValue, const std::unordered_set< std::string > &ignoreProperties=std::unordered_set< std::string >(), bool createMissing=false)=0
Sets all the properties from a json object.
std::vector< Property * > getPropertiesInGroup(const std::string &group) const
Get the list of managed properties in a given group.
IPropertyManager * setTypedProperty(const std::string &name, std::unique_ptr< T > value, const std::true_type &)
Set a property value from std::unique_ptr that is convertible to a DataItem_sptr.
void setPropertySettings(const std::string &name, std::unique_ptr< IPropertySettings > settings)
virtual bool existsProperty(const std::string &name) const =0
Checks whether the named property is already in the list of managed property.
virtual void setPropertyOrdinal(const int &index, const std::string &value)=0
Set the value of a property by an index.
virtual void setPropertiesWithString(const std::string &propertiesString, const std::unordered_set< std::string > &ignoreProperties=std::unordered_set< std::string >())=0
Sets all the declared properties from a string.
void declareProperty(const std::string &name, T value, const std::string &doc, const unsigned int direction=Direction::Input)
Add a property to the list of managed properties with no validator.
virtual void removeProperty(const std::string &name, const bool delproperty=true)=0
Removes the property from management.
virtual ~IPropertyManager()=default
IPropertyManager * doSetProperty(const std::string &name, const std::shared_ptr< T > &value)
Helper method to set the value of a PropertyWithValue, variant for shared_ptr types.
virtual std::string asString(bool withDefaultValues=false) const =0
Return the property manager serialized as a string.
void declareProperty(const std::string &name, const char *value, const unsigned int direction)
Add a property of string type to the list of managed properties.
virtual void filterByTime(const Types::Core::DateAndTime &, const Types::Core::DateAndTime &)=0
virtual void declareProperty(std::unique_ptr< Property > p, const std::string &doc="")=0
Function to declare properties (i.e. store them)
IPropertyManager * setTypedProperty(const std::string &name, const T &value, const std::false_type &)
Set a property value that is not convertible to a DataItem_sptr.
virtual void declareOrReplaceProperty(std::unique_ptr< Property > p, const std::string &doc="")=0
Function to declare properties (i.e. store them)
virtual Property * getPointerToProperty(const std::string &name) const =0
Get a pointer to property by name.
virtual std::vector< std::string > getDeclaredPropertyNames() const noexcept=0
Get the list of managed property names.
virtual TypedValue getProperty(const std::string &name) const =0
Get the value of a property.
virtual void setProperties(const std::string &propertiesJson, const std::unordered_set< std::string > &ignoreProperties=std::unordered_set< std::string >(), bool createMissing=false)=0
Sets all properties from a string.
virtual void filterByProperty(const TimeSeriesProperty< bool > &, const std::vector< std::string > &)=0
virtual std::string getPropertyValue(const std::string &name) const =0
Get the value of a property as a string.
void declareProperty(const std::string &name, const char *value, const std::string &doc, IValidator_sptr validator=std::make_shared< NullValidator >(), const unsigned int direction=Direction::Input)
Specialised version of declareProperty template method to prevent the creation of a PropertyWithValue...
virtual size_t propertyCount() const =0
Returns the number of properties under management.
virtual std::unique_ptr< Property > takeProperty(const size_t index)=0
Removes the property from management and returns a pointer to it.
virtual void afterPropertySet(const std::string &)
Override this method to perform a custom action right after a property was set.
virtual void splitByTime(std::vector< SplittingInterval > &, std::vector< PropertyManager * >) const =0
void declareProperty(const std::string &name, T value, IValidator_sptr validator=std::make_shared< NullValidator >(), const std::string &doc="", const unsigned int direction=Direction::Input)
Add a property of the template type to the list of managed properties.
void updatePropertyValues(const IPropertyManager &other)
Update values of the existing properties.
void setPropertyGroup(const std::string &name, const std::string &group)
Set the group for a given property.
virtual const std::vector< Property * > & getProperties() const =0
Get the list of managed properties.
IPropertyManager * setProperty(const std::string &name, std::unique_ptr< T > value)
Templated method to set the value of a PropertyWithValue from a std::unique_ptr.
IPropertyManager * setTypedProperty(const std::string &name, const T &value, const std::true_type &)
Set a property value that is convertible to a DataItem_sptr.
T getValue(const std::string &name) const
Templated method to get the value of a property.
virtual void setPropertyValueFromJson(const std::string &name, const Json::Value &value)=0
Sets property value from a Json::Value.
OptionalBool : Tri-state bool.
The concrete, templated class for properties.
Base class for properties.
void setGroup(const std::string &group)
Set the group this property belongs to.
A specialised Property class for holding a series of time-value pairs.
std::shared_ptr< IValidator > IValidator_sptr
A shared_ptr to an IValidator.
Helper class which provides the Collimation Length for SANS instruments.
Utility class that enables the getProperty() method to effectively be templated on the return type.
const IPropertyManager & pm
Reference to the containing PropertyManager.
TypedValue(const IPropertyManager &p, const std::string &name)
Constructor.
const std::string prop
The name of the property desired.