| 1 | #ifndef CONSTRAINED_VALUE_HPP___ |
|---|
| 2 | #define CONSTRAINED_VALUE_HPP___ |
|---|
| 3 | |
|---|
| 4 | /* Copyright (c) 2002,2003 CrystalClear Software, Inc. |
|---|
| 5 | * Use, modification and distribution is subject to the |
|---|
| 6 | * Boost Software License, Version 1.0. (See accompanying |
|---|
| 7 | * file LICENSE-1.0 or http://www.boost.org/LICENSE-1.0) |
|---|
| 8 | * Author: Jeff Garland |
|---|
| 9 | * $Date: 2004/02/26 18:26:47 $ |
|---|
| 10 | */ |
|---|
| 11 | |
|---|
| 12 | #include <boost/config.hpp> |
|---|
| 13 | |
|---|
| 14 | namespace boost { |
|---|
| 15 | |
|---|
| 16 | //! Namespace containing constrained_value template and types |
|---|
| 17 | namespace CV { |
|---|
| 18 | //! Represent a min or max violation type |
|---|
| 19 | enum violation_enum {min_violation, max_violation}; |
|---|
| 20 | |
|---|
| 21 | //! A template to specify a constrained basic value type |
|---|
| 22 | /*! This template provides a quick way to generate |
|---|
| 23 | * an integer type with a constrained range. The type |
|---|
| 24 | * provides for the ability to specify the min, max, and |
|---|
| 25 | * and error handling policy. |
|---|
| 26 | * |
|---|
| 27 | * <b>value policies</b> |
|---|
| 28 | * A class that provides the range limits via the min and |
|---|
| 29 | * max functions as well as a function on_error that |
|---|
| 30 | * determines how errors are handled. A common strategy |
|---|
| 31 | * would be to assert or throw and exception. The on_error |
|---|
| 32 | * is passed both the current value and the new value that |
|---|
| 33 | * is in error. |
|---|
| 34 | * |
|---|
| 35 | */ |
|---|
| 36 | template<class value_policies> |
|---|
| 37 | class constrained_value { |
|---|
| 38 | public: |
|---|
| 39 | typedef typename value_policies::value_type value_type; |
|---|
| 40 | // typedef except_type exception_type; |
|---|
| 41 | constrained_value(value_type value) |
|---|
| 42 | { |
|---|
| 43 | assign(value); |
|---|
| 44 | }; |
|---|
| 45 | constrained_value& operator=(value_type v) |
|---|
| 46 | { |
|---|
| 47 | assign(v); |
|---|
| 48 | return *this; |
|---|
| 49 | } |
|---|
| 50 | //! Return the max allowed value (traits method) |
|---|
| 51 | static value_type max BOOST_PREVENT_MACRO_SUBSTITUTION () {return (value_policies::max)();}; |
|---|
| 52 | //! Return the min allowed value (traits method) |
|---|
| 53 | static value_type min BOOST_PREVENT_MACRO_SUBSTITUTION () {return (value_policies::min)();}; |
|---|
| 54 | //! Coerce into the representation type |
|---|
| 55 | operator value_type() const {return value_;}; |
|---|
| 56 | protected: |
|---|
| 57 | value_type value_; |
|---|
| 58 | private: |
|---|
| 59 | void assign(value_type value) |
|---|
| 60 | { |
|---|
| 61 | //adding 1 below gets rid of a compiler warning which occurs when the |
|---|
| 62 | //min_value is 0 and the type is unsigned.... |
|---|
| 63 | if (value+1 < (min)()+1) { |
|---|
| 64 | value_policies::on_error(value_, value, min_violation); |
|---|
| 65 | return; |
|---|
| 66 | } |
|---|
| 67 | if (value > (max)()) { |
|---|
| 68 | value_policies::on_error(value_, value, max_violation); |
|---|
| 69 | return; |
|---|
| 70 | } |
|---|
| 71 | value_ = value; |
|---|
| 72 | |
|---|
| 73 | } |
|---|
| 74 | }; |
|---|
| 75 | |
|---|
| 76 | //! Template to shortcut the constrained_value policy creation process |
|---|
| 77 | template<typename rep_type, rep_type min_value, |
|---|
| 78 | rep_type max_value, class exception_type> |
|---|
| 79 | class simple_exception_policy |
|---|
| 80 | { |
|---|
| 81 | public: |
|---|
| 82 | typedef rep_type value_type; |
|---|
| 83 | static rep_type min BOOST_PREVENT_MACRO_SUBSTITUTION () { return min_value; }; |
|---|
| 84 | static rep_type max BOOST_PREVENT_MACRO_SUBSTITUTION () { return max_value;}; |
|---|
| 85 | static void on_error(rep_type, rep_type, violation_enum) |
|---|
| 86 | { |
|---|
| 87 | throw exception_type(); |
|---|
| 88 | } |
|---|
| 89 | }; |
|---|
| 90 | |
|---|
| 91 | |
|---|
| 92 | |
|---|
| 93 | } } //namespace CV |
|---|
| 94 | |
|---|
| 95 | |
|---|
| 96 | |
|---|
| 97 | |
|---|
| 98 | #endif |
|---|