Newer
Older
#include "MantidKernel/Exception.h"
Janik Zikovsky
committed
#include <string>
#include <sstream>
Gigg, Martyn Anthony
committed
#include <utility>
namespace Mantid
{
namespace Kernel
{
/** Constructor
Janik Zikovsky
committed
* @param name :: The name of the property
* @param type :: The type of the property
* @param direction :: Whether this is a Direction::Input, Direction::Output or Direction::InOut (Input & Output) property
Roman Tolchenov
committed
Property::Property( const std::string &name, const std::type_info &type, const unsigned int direction ) :
m_name( name ),
m_documentation( "" ),
Roman Tolchenov
committed
m_typeinfo( &type ),
Janik Zikovsky
committed
m_direction( direction ),
Janik Zikovsky
committed
m_units(""),
m_settings(NULL),
m_group("")
Roman Tolchenov
committed
// Make sure a random int hasn't been passed in for the direction
// Property & PropertyWithValue destructors will be called in this case
if (m_direction > 2) throw std::out_of_range("direction should be a member of the Direction enum");
}
/// Copy constructor
Property::Property( const Property& right ) :
m_name( right.m_name ),
m_documentation( right.m_documentation ),
Roman Tolchenov
committed
m_typeinfo( right.m_typeinfo ),
Janik Zikovsky
committed
m_direction( right.m_direction ),
Janik Zikovsky
committed
m_units( right.m_units),
m_settings(NULL),
m_group( right.m_group)
Janik Zikovsky
committed
if (right.m_settings)
m_settings = right.m_settings->clone();
}
/// Virtual destructor
Property::~Property()
{
Janik Zikovsky
committed
if (m_settings)
delete m_settings;
Janik Zikovsky
committed
* @param right :: The right hand side value
//Property& Property::operator=( const Property& right )
//{
// UNUSED_ARG(right);
// return *this;
//}
/** Get the property's name
* @return The name of the property
*/
const std::string& Property::name() const
{
return m_name;
}
/** Get the property's documentation string
* @return The documentation string
*/
const std::string& Property::documentation() const
{
return m_documentation;
}
/** Get the property type_info
* @return The type of the property
*/
const std::type_info* Property::type_info() const
{
return m_typeinfo;
}
/** Returns the type of the property as a string.
* Note that this is implementation dependent.
* @return The property type
*/
const std::string Property::type() const
{
Gigg, Martyn Anthony
committed
return Mantid::Kernel::getUnmangledTypeName(*m_typeinfo);
/** Overridden functions checks whether the property has a valid value.
*
* @return empty string ""
*/
std::string Property::isValid() const
{
// the no error condition
return "";
}
Michael Whitty
committed
/**
* Whether to remember this property input
* @return whether to remember this property's input
*/
bool Property::remember() const
{
return true;
}
/** Sets the property's (optional) documentation string
Janik Zikovsky
committed
* @param documentation :: The string containing the descriptive comment
*/
void Property::setDocumentation( const std::string& documentation )
{
m_documentation = documentation;
}
Russell Taylor
committed
/** Returns the set of valid values for this property, if such a set exists.
* If not, it returns an empty set.
* @return the set of valid values for this property or an empty set
Russell Taylor
committed
*/
std::set<std::string> Property::allowedValues() const
Russell Taylor
committed
{
return std::set<std::string>();
Russell Taylor
committed
}
Russell Taylor
committed
/// Create a PropertyHistory object representing the current state of the Property.
Russell Taylor
committed
const PropertyHistory Property::createHistory() const
{
Roman Tolchenov
committed
return PropertyHistory(this->name(),this->value(),this->type(),this->isDefault(),this->direction());
Russell Taylor
committed
}
Janik Zikovsky
committed
//-------------------------------------------------------------------------------------------------
Janik Zikovsky
committed
/** Return the size of this property.
* Single-Value properties return 1.
* TimeSeriesProperties return the # of entries.
* @return the size of the property
Janik Zikovsky
committed
*/
int Property::size() const
{
return 1;
}
Janik Zikovsky
committed
//-------------------------------------------------------------------------------------------------
/** Returns the units of the property, if any, as a string.
Janik Zikovsky
committed
* Units are optional, and will return empty string if they have
* not been set before.
Janik Zikovsky
committed
*/
std::string Property::units() const
{
return m_units;
}
//-------------------------------------------------------------------------------------------------
/** Sets the units of the property, as a string. This is optional.
Janik Zikovsky
committed
*
Janik Zikovsky
committed
* @param unit :: string to set for the units.
Janik Zikovsky
committed
*/
void Property::setUnits(std::string unit)
{
m_units = std::string(unit); //force the copy constructor
}
Janik Zikovsky
committed
//-------------------------------------------------------------------------------------------------
/** Filter out a property by time. Will be overridden by TimeSeriesProperty (only)
Janik Zikovsky
committed
* @param start :: the beginning time to filter from
* @param stop :: the ending time to filter to
Janik Zikovsky
committed
void Property::filterByTime(const Kernel::DateAndTime start, const Kernel::DateAndTime stop)
{
Gigg, Martyn Anthony
committed
UNUSED_ARG(start);
UNUSED_ARG(stop);
//Do nothing in general
return;
}
Janik Zikovsky
committed
Janik Zikovsky
committed
//-----------------------------------------------------------------------------------------------
/** Split a property by time. Will be overridden by TimeSeriesProperty (only)
* For any other property type, this does nothing.
Janik Zikovsky
committed
* @param splitter :: time splitter
* @param outputs :: holder for splitter output
Janik Zikovsky
committed
void Property::splitByTime(TimeSplitterType& splitter, std::vector< Property * > outputs) const
{
Gigg, Martyn Anthony
committed
UNUSED_ARG(splitter);
UNUSED_ARG(outputs);
Janik Zikovsky
committed
return;
}
Gigg, Martyn Anthony
committed
} // End Kernel namespace
Janik Zikovsky
committed
Gigg, Martyn Anthony
committed
//-------------------------- Utility function for class name lookup -----------------------------
// MG 16/07/09: Some forward declarations.I need this so
// that the typeid function in getUnmangledTypeName knows about them
// This way I don't need to actually include the headers and I don't
// introduce unwanted dependencies
namespace API
{
class Workspace;
class MatrixWorkspace;
class ITableWorkspace;
class IMDEventWorkspace;
class IMDWorkspace;
class IEventWorkspace;
Gigg, Martyn Anthony
committed
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
}
namespace DataObjects
{
class EventWorkspace;
class PeaksWorkspace;
class GroupingWorkspace;
class OffsetsWorkspace;
class SpecialWorkspace2D;
class Workspace2D;
}
namespace Kernel
{
/**
* Get the unmangled name of the given typestring for some common types that we use. Note that
* this is just a lookup and NOT an unmangling algorithm
* @param type :: A pointer to the type_info object for this type
* @returns An unmangled version of the name
*/
std::string getUnmangledTypeName(const std::type_info& type)
{
using std::string;
using std::make_pair;
using namespace Mantid::API;
using namespace Mantid::DataObjects;
// Compile a lookup table. This is a static local variable that
// will get initialized when the function is first used
static std::map<string, string> typestrings;
if( typestrings.empty() )
{
typestrings.insert(make_pair(typeid(char).name(), string("letter")));
typestrings.insert(make_pair(typeid(int).name(), string("number")));
typestrings.insert(make_pair(typeid(long long).name(), string("number")));
typestrings.insert(make_pair(typeid(double).name(), string("number")));
typestrings.insert(make_pair(typeid(bool).name(), string("boolean")));
typestrings.insert(make_pair(typeid(string).name(), string("string")));
typestrings.insert(make_pair(typeid(std::vector<string>).name(), string("str list")));
typestrings.insert(make_pair(typeid(std::vector<int>).name(), string("int list")));
typestrings.insert(make_pair(typeid(std::vector<double>).name(), string("dbl list")));
//Workspaces
typestrings.insert(make_pair(typeid(boost::shared_ptr<Workspace>).name(),
string("Workspace")));
typestrings.insert(make_pair(typeid(boost::shared_ptr<MatrixWorkspace>).name(),
string("MatrixWorkspace")));
typestrings.insert(make_pair(typeid(boost::shared_ptr<ITableWorkspace>).name(),
string("TableWorkspace")));
typestrings.insert(make_pair(typeid(boost::shared_ptr<IMDWorkspace>).name(),
string("IMDWorkspace")));
typestrings.insert(make_pair(typeid(boost::shared_ptr<IMDEventWorkspace>).name(),
string("MDEventWorkspace")));
typestrings.insert(make_pair(typeid(boost::shared_ptr<IEventWorkspace>).name(),
string("IEventWorkspace")));
typestrings.insert(make_pair(typeid(boost::shared_ptr<Workspace2D>).name(),
string("Workspace2D")));
typestrings.insert(make_pair(typeid(boost::shared_ptr<EventWorkspace>).name(),
string("EventWorkspace")));
typestrings.insert(make_pair(typeid(boost::shared_ptr<PeaksWorkspace>).name(),
string("PeaksWorkspace")));
typestrings.insert(make_pair(typeid(boost::shared_ptr<GroupingWorkspace>).name(),
string("GroupingWorkspace")));
typestrings.insert(make_pair(typeid(boost::shared_ptr<OffsetsWorkspace>).name(),
string("OffsetsWorkspace")));
typestrings.insert(make_pair(typeid(boost::shared_ptr<SpecialWorkspace2D>).name(),
string("SpecialWorkspace2D")));
typestrings.insert(make_pair(typeid(boost::shared_ptr<IMDHistoWorkspace>).name(),
string("IMDHistoWorkspace")));
Gigg, Martyn Anthony
committed
}
std::map<std::string, std::string>::const_iterator mitr = typestrings.find(type.name());
if( mitr != typestrings.end() )
{
return mitr->second;
}
return type.name();
}
Janik Zikovsky
committed
} // namespace Kernel
Gigg, Martyn Anthony
committed
} // namespace Mantid