Boost logo

Boost :

From: Jeff Garland (jeff_at_[hidden])
Date: 2004-05-10 09:46:10


On Mon, 10 May 2004 14:00:41 +0100, Reece Dunn wrote
> Is there a boost library that allows...

No, but there is a template in date_time that does something close. It's
called constrained_value.

http://www.crystalclearsoftware.com/libraries/gdtl/gdtl_ref_guide/classboost_1_1CV_1_1constrained__value.html

When an out of range value is found during construction or assignment the
config class on_error function is called. From there you can throw an
exception or do whatever error handling you like: So in the case of date_time
there are 2 steps:
1) define a unique exception type
2) use the simple_exception_policy helper to configure the constrained_value

  struct bad_month : public std::out_of_range
  {
    bad_month() : std::out_of_range(std::string("Month number is out of range
1..12")) {}
  };
  //! Build a policy class for the greg_month_rep
  typedef CV::simple_exception_policy<unsigned short, 1, 12, bad_month>
greg_month_policies;
  //! A constrained range that implements the gregorian_month rules
  typedef CV::constrained_value<greg_month_policies> greg_month_rep;

Now the following code will throw bad_month exception:
  greg_month_rep m(13); //throws bad_month
  greg_month_rep m(0); //throws bad_month
  greg_month_rep m(12); //ok

> you to specify the range that a
> number can take, e.g.
>
> boost::range< int, 1, 12 > month;
>
> generating an error on an invalid range, e.g.
>
> month = 20; // [1] oops!
>
> Also, is it possible to distinguish between a number literal like
> the above and a variable assignment, like:
>
> month = m; // [2]

Not sure. constrained_value doesn't.
 
> The logic behind this is to provide compile-time checks where
> possible, so [1] would produce a compile-time error and [2] would be
> a run-time error. You could also do something like:
>
> inline char & string::operator[]( boost::range< int, 5, 10 > i ){
> ... } // ... string s; s[ 1 ] = 'a'; // oops!
>
> and
>
> class date
> {
> boost::range< int, 1, 12 > month;
> public:
> inline date( boost::range< int, 1, 12 > m ): month( m ){}
> };

Exactly -- and your code isn't littered with all sorts of range checking logic...

Jeff


Boost list run by bdawes at acm.org, gregod at cs.rpi.edu, cpdaniel at pacbell.net, john at johnmaddock.co.uk