33 #ifndef __INCLUDE_MIST_LIMITS__
34 #define __INCLUDE_MIST_LIMITS__
41 #ifndef __INCLUDE_MIST_CONF_H__
45 #ifndef __INCLUDE_MIST_COLOR_H__
49 #ifndef __INCLUDE_MIST_TYPE_TRAIT_H__
67 #define _DEFINE_TYPE_LIMITS( _type_, _integer_, _signed_, _tiny_, _min_, _max_, _zero_ ) \
69 struct type_limits< _type_ >\
71 typedef _type_ value_type;\
73 enum{ is_integer = _integer_ };\
74 enum{ is_signed = _signed_ };\
76 static value_type tiny( ) { return( _tiny_ ); }\
77 static value_type minimum( ) { return( _min_ ); }\
78 static value_type maximum( ) { return( _max_ ); }\
79 static value_type zero( ){ return( _zero_ ); }\
111 _MIST_CONST(
bool,
is_integer, std::numeric_limits< T >::is_integer );
117 _MIST_CONST(
bool,
is_signed, std::numeric_limits< T >::is_signed );
133 _DEFINE_TYPE_LIMITS(
float,
false,
true, FLT_MIN, -FLT_MAX, FLT_MAX, 0.0f )
134 _DEFINE_TYPE_LIMITS(
double, false, true, DBL_MIN, -DBL_MAX, DBL_MAX, 0 )
135 _DEFINE_TYPE_LIMITS(
long double, false, true, LDBL_MIN, -LDBL_MAX, LDBL_MAX, 0 )
142 #if defined(__MIST_MSVC__) && __MIST_MSVC__ < 7
144 #define _DEFINE_COLOR_TYPE_LIMITS( type ) \
146 struct type_limits< rgb< type > >\
148 typedef rgb< type > value_type;\
149 typedef rgb< type >::value_type rgb_value_type;\
151 enum{ is_integer = type_limits< rgb_value_type >::is_integer };\
152 enum{ is_signed = type_limits< rgb_value_type >::is_signed };\
154 static value_type minimum( ) { return( rgb< type >( type_limits< rgb_value_type >::minimum( ) ) ); }\
155 static value_type maximum( ) { return( rgb< type >( type_limits< rgb_value_type >::maximum( ) ) ); }\
156 static value_type zero( ) { return( rgb< type >( type_limits< rgb_value_type >::zero( ) ) ); }\
159 struct type_limits< rgba< type > >\
161 typedef rgba< type > value_type;\
162 typedef rgba< type >::value_type rgb_value_type;\
164 enum{ is_integer = type_limits< rgb_value_type >::is_integer };\
165 enum{ is_signed = type_limits< rgb_value_type >::is_signed };\
167 static value_type minimum( ) { return( rgba< type >( type_limits< rgb_value_type >::minimum( ) ) ); }\
168 static value_type maximum( ) { return( rgba< type >( type_limits< rgb_value_type >::maximum( ) ) ); }\
169 static value_type zero( ) { return( rgba< type >( type_limits< rgb_value_type >::zero( ) ) ); }\
172 struct type_limits< bgr< type > >\
174 typedef bgr< type > value_type;\
175 typedef bgr< type >::value_type bgr_value_type;\
177 enum{ is_integer = type_limits< bgr_value_type >::is_integer };\
178 enum{ is_signed = type_limits< bgr_value_type >::is_signed };\
180 static value_type minimum( ) { return( bgr< type >( type_limits< bgr_value_type >::minimum( ) ) ); }\
181 static value_type maximum( ) { return( bgr< type >( type_limits< bgr_value_type >::maximum( ) ) ); }\
182 static value_type zero( ) { return( bgr< type >( type_limits< bgr_value_type >::zero( ) ) ); }\
185 struct type_limits< bgra< type > >\
187 typedef bgra< type > value_type;\
188 typedef bgra< type >::value_type bgr_value_type;\
190 enum{ is_integer = type_limits< bgr_value_type >::is_integer };\
191 enum{ is_signed = type_limits< bgr_value_type >::is_signed };\
193 static value_type minimum( ) { return( bgra< type >( type_limits< bgr_value_type >::minimum( ) ) ); }\
194 static value_type maximum( ) { return( bgra< type >( type_limits< bgr_value_type >::maximum( ) ) ); }\
195 static value_type zero( ) { return( bgra< type >( type_limits< bgr_value_type >::zero( ) ) ); }\
199 _DEFINE_COLOR_TYPE_LIMITS(
unsigned char)
200 _DEFINE_COLOR_TYPE_LIMITS(
unsigned short)
201 _DEFINE_COLOR_TYPE_LIMITS(
unsigned int)
202 _DEFINE_COLOR_TYPE_LIMITS(
unsigned long)
203 _DEFINE_COLOR_TYPE_LIMITS(
signed char)
204 _DEFINE_COLOR_TYPE_LIMITS(
signed short)
205 _DEFINE_COLOR_TYPE_LIMITS(
signed int)
206 _DEFINE_COLOR_TYPE_LIMITS(
signed long)
207 _DEFINE_COLOR_TYPE_LIMITS(
bool)
208 _DEFINE_COLOR_TYPE_LIMITS(
char)
209 _DEFINE_COLOR_TYPE_LIMITS(
float)
210 _DEFINE_COLOR_TYPE_LIMITS(
double)
211 _DEFINE_COLOR_TYPE_LIMITS(
long double)
213 #undef _DEFINE_COLOR_TYPE_LIMITS
218 struct type_limits< rgb< T > >
220 typedef rgb< T > value_type;
221 typedef typename rgb< T >::value_type rgb_value_type;
223 enum{ is_integer = type_limits< rgb_value_type >::is_integer };
224 enum{ is_signed = type_limits< rgb_value_type >::is_signed };
226 static value_type minimum( ) {
return( rgb< T >( type_limits< rgb_value_type >::minimum( ) ) ); }
227 static value_type maximum( ) {
return( rgb< T >( type_limits< rgb_value_type >::maximum( ) ) ); }
228 static value_type zero( ) {
return( rgb< T >( type_limits< rgb_value_type >::zero( ) ) ); }
232 struct type_limits< rgba< T > >
234 typedef rgba< T > value_type;
235 typedef typename rgba< T >::value_type rgb_value_type;
237 enum{ is_integer = type_limits< rgb_value_type >::is_integer };
238 enum{ is_signed = type_limits< rgb_value_type >::is_signed };
240 static value_type minimum( ) {
return( rgba< T >( type_limits< rgb_value_type >::minimum( ) ) ); }
241 static value_type maximum( ) {
return( rgba< T >( type_limits< rgb_value_type >::maximum( ) ) ); }
242 static value_type zero( ) {
return( rgba< T >( type_limits< rgb_value_type >::zero( ) ) ); }
246 struct type_limits< bgr< T > >
248 typedef bgr< T > value_type;
249 typedef typename bgr< T >::value_type bgr_value_type;
251 enum{ is_integer = type_limits< bgr_value_type >::is_integer };
252 enum{ is_signed = type_limits< bgr_value_type >::is_signed };
254 static value_type minimum( ) {
return( bgr< T >( type_limits< bgr_value_type >::minimum( ) ) ); }
255 static value_type maximum( ) {
return( bgr< T >( type_limits< bgr_value_type >::maximum( ) ) ); }
256 static value_type zero( ) {
return( bgr< T >( type_limits< bgr_value_type >::zero( ) ) ); }
260 struct type_limits< bgra< T > >
262 typedef bgra< T > value_type;
263 typedef typename bgra< T >::value_type bgr_value_type;
265 enum{ is_integer = type_limits< bgr_value_type >::is_integer };
266 enum{ is_signed = type_limits< bgr_value_type >::is_signed };
268 static value_type minimum( ) {
return( bgra< T >( type_limits< bgr_value_type >::minimum( ) ) ); }
269 static value_type maximum( ) {
return( bgra< T >( type_limits< bgr_value_type >::maximum( ) ) ); }
270 static value_type zero( ) {
return( bgra< T >( type_limits< bgr_value_type >::zero( ) ) ); }
276 #undef _DEFINE_TYPE_LIMITS
279 namespace __limits_min_max__
282 inline const T limits_min_max__(
const T &v,
const T &min,
const T &max )
284 return( v < min ? min : ( v > max ? max : v ) );
287 template <
bool _ISCOLOR_ >
291 static const T limits(
const T &v,
const T &min,
const T &max )
293 return( limits_min_max__( v, min, max ) );
301 static const rgb< T > limits(
const rgb< T > &v,
const rgb< T > &min,
const rgb< T > &max )
303 return( rgb< T >( limits_min_max__( v.r, min.r, max.r ), limits_min_max__( v.g, min.g, max.g ), limits_min_max__( v.b, min.b, max.b ) ) );
307 static const rgba< T > limits(
const rgba< T > &v,
const rgba< T > &min,
const rgba< T > &max )
309 return( rgba< T >( limits_min_max__( v.r, min.r, max.r ), limits_min_max__( v.g, min.g, max.g ), limits_min_max__( v.b, min.b, max.b ), limits_min_max__( v.a, min.a, max.a ) ) );
313 static const bgr< T > limits(
const bgr< T > &v,
const bgr< T > &min,
const bgr< T > &max )
315 return( bgr< T >( limits_min_max__( v.r, min.r, max.r ), limits_min_max__( v.g, min.g, max.g ), limits_min_max__( v.b, min.b, max.b ) ) );
319 static const bgra< T > limits(
const bgra< T > &v,
const bgra< T > &min,
const bgra< T > &max )
321 return( bgra< T >( limits_min_max__( v.r, min.r, max.r ), limits_min_max__( v.g, min.g, max.g ), limits_min_max__( v.b, min.b, max.b ), limits_min_max__( v.a, min.a, max.a ) ) );
327 namespace __limits_0_255__
329 template <
bool _ISSIGNED_ >
330 struct __limits_0_255__
333 static const T limits(
const T &v )
335 return( v < 0 ? 0 : ( v > 255 ? 255 : v ) );
340 struct __limits_0_255__< false >
343 static const T limits(
const T &v )
345 return( v > 255 ? 255 : v );
349 template <
bool _ISCHAR_ >
350 struct limits_0_255__
353 static const T limits(
const T &v )
360 struct limits_0_255__< false >
363 static const T limits(
const T &v )
365 return( __limits_0_255__< is_signed< T >::value >::limits( v ) );
369 template <
bool _ISCOLOR_ >
373 static const T limits(
const T &v )
375 return( limits_0_255__< is_char< T >::value >::limits( v ) );
383 static const rgb< T > limits(
const rgb< T > &v )
385 return( rgb< T >( limits_0_255__< is_char< T >::value >::limits( v.r ), limits_0_255__< is_char< T >::value >::limits( v.g ), limits_0_255__< is_char< T >::value >::limits( v.b ) ) );
389 static const rgba< T > limits(
const rgba< T > &v )
391 return( rgba< T >( limits_0_255__< is_char< T >::value >::limits( v.r ), limits_0_255__< is_char< T >::value >::limits( v.g ), limits_0_255__< is_char< T >::value >::limits( v.b ), limits_0_255__< is_char< T >::value >::limits( v.a ) ) );
395 static const bgr< T > limits(
const bgr< T > &v )
397 return( bgr< T >( limits_0_255__< is_char< T >::value >::limits( v.r ), limits_0_255__< is_char< T >::value >::limits( v.g ), limits_0_255__< is_char< T >::value >::limits( v.b ) ) );
401 static const bgra< T > limits(
const bgra< T > &v )
403 return( bgra< T >( limits_0_255__< is_char< T >::value >::limits( v.r ), limits_0_255__< is_char< T >::value >::limits( v.g ), limits_0_255__< is_char< T >::value >::limits( v.b ), limits_0_255__< is_char< T >::value >::limits( v.a ) ) );
455 #endif // __INCLUDE_MIST_LIMITS__