00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011 #if !defined(_XRB_VALIDATOR_HPP_)
00012 #define _XRB_VALIDATOR_HPP_
00013
00014 #include "xrb.hpp"
00015
00016 namespace Xrb
00017 {
00018
00019
00020
00021
00022
00023 template <typename ValueType>
00024 struct Validator
00025 {
00026 virtual ~Validator () { }
00027
00028 virtual bool IsValid (ValueType value) const = 0;
00029 virtual ValueType Validate (ValueType value) const = 0;
00030 };
00031
00032
00033
00034
00035
00036 template <typename ValueType>
00037 struct GreaterThanValidator : public Validator<ValueType>
00038 {
00039 ValueType const m_lower_bound;
00040 ValueType const m_lowest_valid_value;
00041
00042 GreaterThanValidator (
00043 ValueType const lower_bound,
00044 ValueType const lowest_valid_value)
00045 :
00046 m_lower_bound(lower_bound),
00047 m_lowest_valid_value(lowest_valid_value)
00048 { }
00049
00050 virtual bool IsValid (ValueType value) const
00051 {
00052 return value > m_lower_bound;
00053 }
00054 virtual ValueType Validate (ValueType value) const
00055 {
00056 return value > m_lower_bound ?
00057 value :
00058 m_lowest_valid_value;
00059 }
00060 };
00061
00062
00063
00064
00065
00066 template <typename ValueType>
00067 struct GreaterOrEqualValidator : public Validator<ValueType>
00068 {
00069 ValueType const m_lower_bound;
00070
00071 GreaterOrEqualValidator (
00072 ValueType const lower_bound)
00073 :
00074 m_lower_bound(lower_bound)
00075 { }
00076
00077 virtual bool IsValid (ValueType value) const
00078 {
00079 return value >= m_lower_bound;
00080 }
00081 virtual ValueType Validate (ValueType value) const
00082 {
00083 return value >= m_lower_bound ?
00084 value :
00085 m_lower_bound;
00086 }
00087 };
00088
00089
00090
00091
00092
00093 template <typename ValueType>
00094 struct LessThanValidator : public Validator<ValueType>
00095 {
00096 ValueType const m_upper_bound;
00097 ValueType const m_highest_valid_value;
00098
00099 LessThanValidator (
00100 ValueType const upper_bound,
00101 ValueType const highest_valid_value)
00102 :
00103 m_upper_bound(upper_bound),
00104 m_highest_valid_value(highest_valid_value)
00105 { }
00106
00107 virtual bool IsValid (ValueType value) const
00108 {
00109 return value < m_upper_bound;
00110 }
00111 virtual ValueType Validate (ValueType value) const
00112 {
00113 return value < m_upper_bound ?
00114 value :
00115 m_highest_valid_value;
00116 }
00117 };
00118
00119
00120
00121
00122
00123 template <typename ValueType>
00124 struct LessOrEqualValidator : public Validator<ValueType>
00125 {
00126 ValueType const m_upper_bound;
00127
00128 LessOrEqualValidator (
00129 ValueType const upper_bound)
00130 :
00131 m_upper_bound(upper_bound)
00132 { }
00133
00134 virtual bool IsValid (ValueType value) const
00135 {
00136 return value <= m_upper_bound;
00137 }
00138 virtual ValueType Validate (ValueType value) const
00139 {
00140 return value <= m_upper_bound ?
00141 value :
00142 m_upper_bound;
00143 }
00144 };
00145
00146
00147
00148
00149
00150 template <typename ValueType>
00151 struct RangeInclusiveValidator : public Validator<ValueType>
00152 {
00153 ValueType const m_lower_bound;
00154 ValueType const m_upper_bound;
00155
00156 RangeInclusiveValidator (
00157 ValueType const lower_bound,
00158 ValueType const upper_bound)
00159 :
00160 m_lower_bound(lower_bound),
00161 m_upper_bound(upper_bound)
00162 {
00163 ASSERT1(lower_bound <= upper_bound);
00164 }
00165
00166 virtual bool IsValid (ValueType value) const
00167 {
00168 return m_lower_bound <= value &&
00169 value <= m_upper_bound;
00170 }
00171 virtual ValueType Validate (ValueType value) const
00172 {
00173 if (value < m_lower_bound)
00174 return m_lower_bound;
00175 else if (value > m_upper_bound)
00176 return m_upper_bound;
00177 else
00178 return value;
00179 }
00180 };
00181
00182
00183
00184
00185
00186 template <typename ValueType>
00187 struct RangeExclusiveValidator : public Validator<ValueType>
00188 {
00189 ValueType const m_lower_bound;
00190 ValueType const m_lowest_valid_value;
00191 ValueType const m_highest_valid_value;
00192 ValueType const m_upper_bound;
00193
00194 RangeExclusiveValidator (
00195 ValueType const lower_bound,
00196 ValueType const lowest_valid_value,
00197 ValueType const highest_valid_value,
00198 ValueType const upper_bound)
00199 :
00200 m_lower_bound(lower_bound),
00201 m_lowest_valid_value(lowest_valid_value),
00202 m_highest_valid_value(highest_valid_value),
00203 m_upper_bound(upper_bound)
00204 {
00205 ASSERT1(lower_bound < lowest_valid_value);
00206 ASSERT1(lowest_valid_value < highest_valid_value);
00207 ASSERT1(highest_valid_value < upper_bound);
00208 }
00209
00210 virtual bool IsValid (ValueType value) const
00211 {
00212 return m_lower_bound <= value &&
00213 value <= m_upper_bound;
00214 }
00215 virtual ValueType Validate (ValueType value) const
00216 {
00217 if (value < m_lower_bound)
00218 return m_lowest_valid_value;
00219 else if (value > m_upper_bound)
00220 return m_highest_valid_value;
00221 else
00222 return value;
00223 }
00224 };
00225
00226 }
00227
00228 #endif // !defined(_XRB_VALIDATOR_HPP_)
00229