Mantid
Loading...
Searching...
No Matches
Property.cpp
Go to the documentation of this file.
1// Mantid Repository : https://github.com/mantidproject/mantid
2//
3// Copyright © 2018 ISIS Rutherford Appleton Laboratory UKRI,
4// NScD Oak Ridge National Laboratory, European Spallation Source,
5// Institut Laue - Langevin & CSNS, Institute of High Energy Physics, CAS
6// SPDX - License - Identifier: GPL - 3.0 +
8
16
17#include <unordered_map>
18
19namespace Mantid {
20namespace Kernel {
21
29Property::Property(std::string name, const std::type_info &type, const unsigned int &direction)
30 : m_name(std::move(name)), m_documentation(""), m_typeinfo(&type), m_direction(direction), m_units(""), m_group(""),
31 m_remember(true), m_autotrim(true), m_disableReplaceWSButton(false), m_isDynamicDefault(false) {
32 if (m_name.empty()) {
33 throw std::invalid_argument("An empty property name is not permitted");
34 }
35
36 // Make sure a random int hasn't been passed in for the direction
37 // Property & PropertyWithValue destructors will be called in this case
38 if (m_direction > 2)
39 throw std::out_of_range("direction should be a member of the Direction enum");
40}
41
44 : m_name(right.m_name), m_documentation(right.m_documentation), m_typeinfo(right.m_typeinfo),
45 m_direction(right.m_direction), m_units(right.m_units), m_group(right.m_group), m_remember(right.m_remember),
46 m_autotrim(right.m_autotrim), m_disableReplaceWSButton(right.m_disableReplaceWSButton),
47 m_isDynamicDefault(right.m_isDynamicDefault) {
48 if (m_name.empty()) {
49 throw std::invalid_argument("An empty property name is not permitted");
50 }
51 if (right.m_settings)
52 m_settings.reset(right.m_settings->clone());
53}
54
56Property::~Property() = default;
57
61const std::string &Property::name() const { return m_name; }
62
66void Property::setName(const std::string &name) {
67 if (name.empty()) {
68 throw std::invalid_argument("An empty property name is not permitted");
69 }
70 m_name = name;
71}
72
76const std::string &Property::documentation() const { return m_documentation; }
77
81const std::type_info *Property::type_info() const { return m_typeinfo; }
82
87const std::string Property::type() const { return Mantid::Kernel::getUnmangledTypeName(*m_typeinfo); }
88
93std::string Property::isValid() const {
94 // the no error condition
95 return "";
96}
97
103void Property::setSettings(std::unique_ptr<IPropertySettings> settings) { m_settings = std::move(settings); }
104
109const IPropertySettings *Property::getSettings() const { return m_settings.get(); }
111
115void Property::clearSettings() { m_settings.reset(nullptr); }
116
121bool Property::remember() const { return m_remember; }
122
127void Property::setRemember(bool remember) { m_remember = remember; }
128
135std::string Property::valueAsPrettyStr(const size_t maxLength, const bool collapseLists) const {
136 UNUSED_ARG(collapseLists);
137 return Strings::shorten(value(), maxLength);
138}
139
146void Property::setDocumentation(const std::string &documentation) { m_documentation = documentation; }
147
152std::vector<std::string> Property::allowedValues() const { return std::vector<std::string>(); }
153
157
162 std::ostringstream os;
163 os << "__TMP" << this;
164 this->setValue(os.str());
165}
166
172 std::ostringstream os;
173 os << "__TMP" << this;
174 return (os.str() == this->value());
175}
176
177//-------------------------------------------------------------------------------------------------
183int Property::size() const { return 1; }
184
185//-------------------------------------------------------------------------------------------------
191const std::string &Property::units() const { return m_units; }
192
193//-------------------------------------------------------------------------------------------------
198void Property::setUnits(const std::string &unit) { m_units = unit; }
199
200} // namespace Kernel
201
202//-------------------------- Utility function for class name lookup
203//-----------------------------
204
205// MG 16/07/09: Some forward declarations.I need this so
206// that the typeid function in getUnmangledTypeName knows about them
207// This way I don't need to actually include the headers and I don't
208// introduce unwanted dependencies
209namespace API {
210class Workspace;
211class WorkspaceGroup;
212class MatrixWorkspace;
213class ITableWorkspace;
215class IMDWorkspace;
216class IEventWorkspace;
217class IPeaksWorkspace;
219class IFunction;
220class IAlgorithm;
221} // namespace API
222namespace DataObjects {
223class EventWorkspace;
224class PeaksWorkspace;
225class LeanElasticPeaksWorkspace;
226class GroupingWorkspace;
227class OffsetsWorkspace;
228class MaskWorkspace;
229class SpecialWorkspace2D;
230class Workspace2D;
231class TableWorkspace;
232class SpecialWorkspace2D;
233class SplittersWorkspace;
234} // namespace DataObjects
235
236namespace Kernel {
237class PropertyManager;
238
244bool operator==(const Property &lhs, const Property &rhs) {
245 if (lhs.name() != rhs.name())
246 return false;
247 if (lhs.type() != rhs.type())
248 return false;
249
250 // check for TimeSeriesProperty specializations
251 auto lhs_tsp_float = dynamic_cast<const TimeSeriesProperty<float> *>(&lhs);
252 if (lhs_tsp_float)
253 return lhs_tsp_float->operator==(rhs);
254
255 auto lhs_tsp_double = dynamic_cast<const TimeSeriesProperty<double> *>(&lhs);
256 if (lhs_tsp_double)
257 return lhs_tsp_double->operator==(rhs);
258
259 auto lhs_tsp_string = dynamic_cast<const TimeSeriesProperty<std::string> *>(&lhs);
260 if (lhs_tsp_string)
261 return lhs_tsp_string->operator==(rhs);
262
263 auto lhs_tsp_bool = dynamic_cast<const TimeSeriesProperty<bool> *>(&lhs);
264 if (lhs_tsp_bool)
265 return lhs_tsp_bool->operator==(rhs);
266
267 // use fallthrough behavior
268 return (lhs.value() == rhs.value());
269}
270
276bool operator!=(const Property &lhs, const Property &rhs) { return (!(lhs == rhs)); }
277
285std::string getUnmangledTypeName(const std::type_info &type) {
286 using std::make_pair;
287 using std::string;
288 using namespace Mantid::API;
289 using namespace Mantid::DataObjects;
290 // Compile a lookup table. This is a static local variable that
291 // will get initialized when the function is first used
292 static std::unordered_map<string, string> typestrings;
293 if (typestrings.empty()) {
294 typestrings.emplace(typeid(char).name(), string("letter"));
295 typestrings.emplace(typeid(int).name(), string("number"));
296 typestrings.emplace(typeid(long long).name(), string("number"));
297 typestrings.emplace(typeid(int64_t).name(), string("number"));
298 typestrings.emplace(typeid(double).name(), string("number"));
299 typestrings.emplace(typeid(bool).name(), string("boolean"));
300 typestrings.emplace(typeid(string).name(), string("string"));
301 typestrings.emplace(typeid(std::vector<string>).name(), string("str list"));
302 typestrings.emplace(typeid(std::vector<int>).name(), string("int list"));
303 typestrings.emplace(typeid(std::vector<long>).name(), string("long list"));
304 typestrings.emplace(typeid(std::vector<int64_t>).name(), string("int list"));
305 typestrings.emplace(typeid(std::vector<size_t>).name(), string("unsigned int list"));
306 typestrings.emplace(typeid(std::vector<double>).name(), string("dbl list"));
307 typestrings.emplace(typeid(std::vector<std::vector<string>>).name(), string("list of str lists"));
308 typestrings.emplace(typeid(OptionalBool).name(), string("optional boolean"));
309
310 // Workspaces
311 typestrings.emplace(typeid(std::shared_ptr<Workspace>).name(), string("Workspace"));
312 typestrings.emplace(typeid(std::shared_ptr<MatrixWorkspace>).name(), string("MatrixWorkspace"));
313 typestrings.emplace(typeid(std::shared_ptr<ITableWorkspace>).name(), string("TableWorkspace"));
314 typestrings.emplace(typeid(std::shared_ptr<IMDWorkspace>).name(), string("IMDWorkspace"));
315 typestrings.emplace(typeid(std::shared_ptr<IMDEventWorkspace>).name(), string("MDEventWorkspace"));
316 typestrings.emplace(typeid(std::shared_ptr<IEventWorkspace>).name(), string("IEventWorkspace"));
317 typestrings.emplace(typeid(std::shared_ptr<Workspace2D>).name(), string("Workspace2D"));
318 typestrings.emplace(typeid(std::shared_ptr<EventWorkspace>).name(), string("EventWorkspace"));
319 typestrings.emplace(typeid(std::shared_ptr<PeaksWorkspace>).name(), string("PeaksWorkspace"));
320 typestrings.emplace(typeid(std::shared_ptr<LeanElasticPeaksWorkspace>).name(), string("LeanElasticPeaksWorkspace"));
321 typestrings.emplace(typeid(std::shared_ptr<IPeaksWorkspace>).name(), string("IPeaksWorkspace"));
322 typestrings.emplace(typeid(std::shared_ptr<GroupingWorkspace>).name(), string("GroupingWorkspace"));
323 typestrings.emplace(typeid(std::shared_ptr<WorkspaceGroup>).name(), string("WorkspaceGroup"));
324 typestrings.emplace(typeid(std::shared_ptr<OffsetsWorkspace>).name(), string("OffsetsWorkspace"));
325 typestrings.emplace(typeid(std::shared_ptr<MaskWorkspace>).name(), string("MaskWorkspace"));
326 typestrings.emplace(typeid(std::shared_ptr<SpecialWorkspace2D>).name(), string("SpecialWorkspace2D"));
327 typestrings.emplace(typeid(std::shared_ptr<IMDHistoWorkspace>).name(), string("IMDHistoWorkspace"));
328 typestrings.emplace(typeid(std::shared_ptr<SplittersWorkspace>).name(), string("SplittersWorkspace"));
329 typestrings.emplace(typeid(std::shared_ptr<SpecialWorkspace2D>).name(), string("SpecialWorkspace2D"));
330 typestrings.emplace(typeid(std::shared_ptr<TableWorkspace>).name(), string("TableWorkspace"));
331 // FunctionProperty
332 typestrings.emplace(typeid(std::shared_ptr<IFunction>).name(), string("Function"));
333 typestrings.emplace(typeid(std::shared_ptr<IAlgorithm>).name(), string("IAlgorithm"));
334 typestrings.emplace(typeid(std::shared_ptr<PropertyManager>).name(), string("Dictionary"));
335 }
336 auto mitr = typestrings.find(type.name());
337 if (mitr != typestrings.end()) {
338 return mitr->second;
339 }
340 /* if a type name looks like
341 N6Mantid6Kernel16EnumeratedStringINS_12_GLOBAL__N_111BinningModeEXadL_ZNS2_L16binningModeNamesEEEXadL_ZNS0_12_GLOBAL__N_114compareStringsEEEEE
342 we assume it is a EnumeratedStringProperty and return a "string" for it */
343 string type_name = type.name();
344 if (type_name.find("Mantid") != std::string::npos && type_name.find("EnumeratedString") != std::string::npos) {
345 return "string";
346 }
347 return type.name();
348}
349
355bool Property::autoTrim() const { return m_autotrim; }
356
362void Property::setAutoTrim(const bool &setting) { m_autotrim = setting; }
363
369
374void Property::setDisableReplaceWSButton(const bool &disable) { m_disableReplaceWSButton = disable; }
375
381
385void Property::setIsDynamicDefault(const bool &flag) { m_isDynamicDefault = flag; }
386
387} // namespace Kernel
388
389} // namespace Mantid
std::string name
Definition Run.cpp:60
const std::vector< double > & rhs
double right
#define UNUSED_ARG(x)
Function arguments are sometimes unused in certain implmentations but are required for documentation ...
Definition System.h:48
IAlgorithm is the interface implemented by the Algorithm base class.
Definition IAlgorithm.h:45
This class provides an interface to an EventWorkspace.
This is an interface to a fitting function - a semi-abstarct class.
Definition IFunction.h:166
Abstract base class for multi-dimension event workspaces (MDEventWorkspace).
Abstract interface to MDHistoWorkspace, for use in exposing to Python.
Basic MD Workspace Abstract Class.
Interface to the class Mantid::DataObjects::PeaksWorkspace.
ITableWorkspace is an implementation of Workspace in which the data are organised in columns of same ...
Base MatrixWorkspace Abstract Class.
Class to hold a set of workspaces.
Base Workspace Abstract Class.
Definition Workspace.h:29
Interface for modifiers to Property's that specify if they should be enabled or visible in a GUI.
OptionalBool : Tri-state bool.
This class stores information about the parameters used by an algorithm.
Base class for properties.
Definition Property.h:94
bool isDynamicDefault() const
Returns a flag indicating that the property's value has been set programmatically,...
Definition Property.cpp:380
virtual const std::string & units() const
Returns the units of the property, if any, as a string.
Definition Property.cpp:191
const IPropertySettings * getSettings() const
Definition Property.cpp:109
void setSettings(std::unique_ptr< IPropertySettings > settings)
Set the PropertySettings object.
Definition Property.cpp:103
void setDocumentation(const std::string &documentation)
Sets the user level description of the property.
Definition Property.cpp:146
void setIsDynamicDefault(const bool &flag)
Set or clear the flag indicating whether or not the property's value has been set programmatically.
Definition Property.cpp:385
virtual std::string valueAsPrettyStr(const size_t maxLength=0, const bool collapseLists=true) const
Returns the value of the property as a pretty printed string.
Definition Property.cpp:135
bool hasTemporaryValue() const
Property is using a temporary value for this property.
Definition Property.cpp:171
const std::type_info * m_typeinfo
The type of the property.
Definition Property.h:225
virtual int size() const
Return the size of this property.
Definition Property.cpp:183
Property()
Private default constructor.
void setDisableReplaceWSButton(const bool &disable)
Sets the property to disable the creation of the "Replace Workspace" button.
Definition Property.cpp:374
virtual const PropertyHistory createHistory() const
Create a PropertyHistory object representing the current state of the Property.
Definition Property.cpp:156
bool autoTrim() const
Returns if the property is set to automatically trim string unput values of whitespace.
Definition Property.cpp:355
void setRemember(bool)
Set wheter to remeber this property input.
Definition Property.cpp:127
void createTemporaryValue()
Create a temporary value for this property.
Definition Property.cpp:161
std::string m_name
The name of the property.
Definition Property.h:216
const std::string & documentation() const
Get the property's documentation string.
Definition Property.cpp:76
bool remember() const
Whether to save input values.
Definition Property.cpp:121
virtual std::string setValue(const std::string &)=0
Set the value of the property via a string.
const unsigned int m_direction
Whether the property is used as input, output or both to an algorithm.
Definition Property.h:227
virtual void setUnits(const std::string &unit)
Sets the units of the property, as a string.
Definition Property.cpp:198
void setName(const std::string &name)
Set the property's name.
Definition Property.cpp:66
virtual std::string isValid() const
Overridden function that checks whether the property, if not overriden returns "".
Definition Property.cpp:93
bool m_remember
Flag whether to save input values.
Definition Property.h:241
void clearSettings()
Deletes the PropertySettings object contained.
Definition Property.cpp:115
const std::string & name() const
Get the property's name.
Definition Property.cpp:61
void setAutoTrim(const bool &setting)
Sets if the property is set to automatically trim string unput values of whitespace.
Definition Property.cpp:362
std::unique_ptr< IPropertySettings > m_settings
Property settings (enabled/visible)
Definition Property.h:232
bool m_disableReplaceWSButton
Flag to disable the generation of the "Replace Workspace" button on the OutputWorkspace property.
Definition Property.h:248
virtual std::vector< std::string > allowedValues() const
Returns the set of valid values for this property, if such a set exists.
Definition Property.cpp:152
virtual ~Property()
Virtual destructor.
const std::string type() const
Returns the type of the property as a string.
Definition Property.cpp:87
std::string m_documentation
Longer, optional description of property.
Definition Property.h:223
const std::type_info * type_info() const
Get the property type_info.
Definition Property.cpp:81
bool m_autotrim
Flag to determine if string inputs to the property should be automatically trimmed of whitespace.
Definition Property.h:245
bool disableReplaceWSButton() const
Returns if the property is set to disable the creation of the "Replace Workspace" button.
Definition Property.cpp:368
std::string m_units
Units of the property (optional)
Definition Property.h:229
bool m_isDynamicDefault
Flag to indicate that the property's value has been set programmatically, for example,...
Definition Property.h:252
virtual std::string value() const =0
Returns the value of the property as a string.
A specialised Property class for holding a series of time-value pairs.
MANTID_KERNEL_DLL std::string shorten(const std::string &input, const size_t max_length)
Converts long strings into "start ... end".
Definition Strings.cpp:52
MANTID_KERNEL_DLL bool operator!=(const Mantid::Kernel::Property &lhs, const Mantid::Kernel::Property &rhs)
Compares this to another property for inequality.
Definition Property.cpp:276
MANTID_KERNEL_DLL bool operator==(const Mantid::Kernel::Property &lhs, const Mantid::Kernel::Property &rhs)
Compares this to another property for equality.
Definition Property.cpp:244
MANTID_KERNEL_DLL std::string getUnmangledTypeName(const std::type_info &type)
Return the name corresponding to the mangled string given by typeid.
Definition Property.cpp:285
Helper class which provides the Collimation Length for SANS instruments.
STL namespace.