Compile-Time Extrema
TemplatesThe class templates in <boost/integer/static_min_max.hpp> provide a compile-time evaluation of the minimum or maximum of two integers. These facilities are useful for generic programming problems.
namespace boost
{
template < long Value1, long Value2 >
struct static_signed_min;
template < long Value1, long Value2 >
struct static_signed_max;
template < unsigned long Value1, unsigned long Value2 >
struct static_unsigned_min;
template < unsigned long Value1, unsigned long Value2 >
struct static_unsigned_max;
}
The four class templates provide the combinations for finding the
minimum or maximum of two signed or unsigned
(long) parameters, Value1 and Value2,
at compile-time. Each template has a single static data member,
value, which is set to the respective minimum or maximum
of the template's parameters.
#include <boost/integer/static_min_max.hpp>
template < unsigned long AddendSize1, unsigned long AddendSize2 >
class adder
{
public:
static unsigned long const addend1_size = AddendSize1;
static unsigned long const addend2_size = AddendSize2;
static unsigned long const sum_size = boost::static_unsigned_max<AddendSize1, AddendSize2>::value + 1;
typedef int addend1_type[ addend1_size ];
typedef int addend2_type[ addend2_size ];
typedef int sum_type[ sum_size ];
void operator ()( addend1_type const &a1, addend2_type const &a2, sum_type &s ) const;
};
//...
int main()
{
int const a1[] = { 0, 4, 3 }; // 340
int const a2[] = { 9, 8 }; // 89
int s[ 4 ];
adder<3,2> obj;
obj( a1, a2, s ); // 's' should be 429 or { 9, 2, 4, 0 }
//...
}
The program static_min_max_test.cpp is a simplistic demonstration of various comparisons using the compile-time extrema class templates.
Sometimes the minimum or maximum of several values needs to be found for later compile-time processing, e.g. for a bound for another class template.
The author of the Boost compile-time extrema class templates is Daryle Walker.
Revised October 12, 2001
© Copyright Daryle Walker 2001. Use, modification, and distribution are subject to the Boost Software License, Version 1.0. (See accompanying file LICENSE_1_0.txt or a copy at <http://www.boost.org/LICENSE_1_0.txt>.)