Boost logo

Boost :

From: Neal Becker (ndbecker2_at_[hidden])
Date: 2008-05-21 09:05:41


Robert Kawulak wrote:

>> From: Neal Becker
>> One thing might be useful is to have the option to record minimum and
>> maximum values that are used during a given computation.
>
> You can write error policy:
>
> struct stretchy_policy {
> template <typename V, typename C>
> void operator () (const V &, const V & new_val, C & constraint)
> {
> if( constraint.is_below(new_val) )
> constraint.lower_bound() = new_val;
> else
> constraint.upper_bound() = new_val;
> }
> };
>
> And then use it like this:
>
> // int wrapper that remembers extreme values assigned to it:
> typedef bounded<
> int, int, int,
> value_generator<bool, true>, // bounds have to be included if we
> value_generator<bool, true>, // want them to indicate valid values
> stretchy_policy
>>::type cool_int;
>
> cool_int i(4, cool_int::constraint_type(4, 4)); // note: should initialise
> bounds too
> i = -1;
> i = 10;
> assert( i.constraint().lower_bound() == -1 && i.constraint().upper_bound()
> == 10 );
>
> Of course this will not allow you to do bounds-checking, but you can nest
> cool_int in another bounded type:
>
> typedef bounded<
> cool_int,
> value_generator<int, 0>,
> value_generator<int, 100>,
> value_generator<bool, true>,
> value_generator<bool, true>,
> throw_exception<>,
> std::less<int> // needed to avoid problems with conversions
>>::type splendid_int;
>
> Now you have int that must be in the range [0, 100] and remembers its
> extreme values.
>
> I haven't compiled the code and can't tell it works for sure, but in
> general the idea seems to be valid. ;-)
>
It wouldn't be part of the error_policy, since the extrema might be within
bounds and error_handler wouldn't then be invoked.

I was thinking maybe to extend within_bounds, either by inheritance or
aggregation?


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