Boost logo

Boost :

From: Robert Kawulak (kawulak_at_[hidden])
Date: 2008-05-20 15:19:59


> 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. ;-)

Best regards,
Robert


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