1 #pragma once
2 
3 #ifndef TPROPERTYTYPE_H
4 #define TPROPERTYTYPE_H
5 
6 #include <vector>
7 using namespace std;
8 
9 template <typename T>
10 class TEnumerationT {
11 public:
12   typedef T value_type;
13 
TEnumerationT()14   TEnumerationT() {}
15 
addItem(const string & id,T item)16   void addItem(const string &id, T item) {
17     m_items.push_back(std::make_pair(id, item));
18   }
19 
getItemCount()20   int getItemCount() const { return m_items.size(); }
getItem(unsigned int i,string & idstring,T & value)21   void getItem(unsigned int i, string &idstring, T &value) const {
22     assert(i < m_items.size());
23     ItemData vp = m_items[i];
24     idstring    = vp.first;
25     value       = vp.second;
26   }
27 
getItem(unsigned int i)28   T getItem(unsigned int i) const {
29     assert(i < m_items.size());
30     ItemData vp = m_items[i];
31     return vp.second;
32   }
33 
isValid(T item)34   bool isValid(T item) const {
35     typename vector<ItemData>::const_iterator it =
36         find_if(m_items.begin(), m_items.end(), MatchesItem(item));
37     return it != m_items.end();
38   }
39 
40 private:
41   typedef pair<string, T> ItemData;
42   vector<ItemData> m_items;
43 
44   class MatchesItem {
45   public:
MatchesItem(const T & item)46     MatchesItem(const T &item) : m_item(item) {}
47 
operator()48     bool operator()(const ItemData &itemData) {
49       return itemData.second == m_item;
50     }
51 
52   private:
53     T m_item;
54   };
55 };
56 
57 typedef TEnumerationT<int> TIntEnumeration;
58 
59 template <typename T>
60 class TValueRangeT {
61 public:
62   typedef T value_type;
TValueRangeT()63   TValueRangeT() : m_min(-1), m_max(1) {}
TValueRangeT(T min,T max)64   TValueRangeT(T min, T max) : m_min(min), m_max(max) {}
65 
66   void getRange(T &min, T &max) const;
67 
isValid(T value)68   bool isValid(T value) const { return m_min <= value && value <= m_max; }
69 
70 private:
71   T m_min, m_max;
72 };
73 
74 typedef TValueRangeT<int> IntValueRange;
75 typedef TValueRangeT<double> DoubleValueRange;
76 
77 #endif
78