Blob Blame Raw


#ifndef TPROPERTYTYPE_H
#define TPROPERTYTYPE_H

#include <vector>
using namespace std;

template <typename T>
class TEnumerationT
{
public:
	typedef T value_type;

	TEnumerationT() {}

	void addItem(const string &id, T item)
	{
		m_items.push_back(std::make_pair(id, item));
	}

	int getItemCount() const
	{
		return m_items.size();
	}
	void getItem(unsigned int i, string &idstring, T &value) const
	{
		assert(i < m_items.size());
		ItemData vp = m_items[i];
		idstring = vp.first;
		value = vp.second;
	}

	T getItem(unsigned int i) const
	{
		assert(i < m_items.size());
		ItemData vp = m_items[i];
		return vp.second;
	}

	bool isValid(T item) const
	{
		typename vector<ItemData>::const_iterator it =
			find_if(m_items.begin(), m_items.end(), MatchesItem(item));
		return it != m_items.end();
	}

private:
	typedef pair<string, T> ItemData;
	vector<ItemData> m_items;

	class MatchesItem
	{
	public:
		MatchesItem(const T &item) : m_item(item) {}

		bool operator()(const ItemData &itemData)
		{
			return itemData.second == m_item;
		}

	private:
		T m_item;
	};
};

typedef TEnumerationT<int> TIntEnumeration;

template <typename T>
class TValueRangeT
{
public:
	typedef T value_type;
	TValueRangeT() : m_min(-1), m_max(1) {}
	TValueRangeT(T min, T max) : m_min(min), m_max(max) {}

	void getRange(T &min, T &max) const;

	bool isValid(T value) const
	{
		return m_min <= value && value <= m_max;
	}

private:
	T m_min, m_max;
};

typedef TValueRangeT<int> IntValueRange;
typedef TValueRangeT<double> DoubleValueRange;

#endif