source: NonGTP/Boost/boost/date_time/constrained_value.hpp @ 857

Revision 857, 3.0 KB checked in by igarcia, 18 years ago (diff)
Line 
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
14namespace boost {
15
16//! Namespace containing constrained_value template and types
17namespace 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
Note: See TracBrowser for help on using the repository browser.