Ugly, not-to-be-pushed sucking in of all of Boost to get windows to work.
[dyninst.git] / external / boost / date_time / constrained_value.hpp
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