Back to Mathematical functions
// Description: Integer scaling
// Documentation: math_functions.txt
#ifndef PASTELSYS_SCALE_INTEGER_H
#define PASTELSYS_SCALE_INTEGER_H
#include "pastel/sys/mytypes.h"
namespace Pastel
{
    //! Scales an integer from [0, 2^FromBits - 1] to [0, 2^ToBits - 1].
    /*!
   Preconditions:
   FromBits > 0
   ToBits > 0
   ToBits <= 4 * FromBits
   The last requirement can be extended by implementing
   new functions for the larger ranges.
   The computation is effectively:
   round[(number * (2^ToBits - 1)) / (2^(FromBits) - 1)]
   It turns out this can be computed efficiently by using 
   integer shifts and additions alone.
   */
    template <
        int FromBits, 
        int ToBits, 
        typename Integer>
    requires (ToBits < FromBits)
    Integer scaleInteger(const Integer& number);
    template <
        int FromBits, 
        int ToBits, 
        typename Integer>
    requires (ToBits == FromBits)
    Integer scaleInteger(const Integer& number);
    template <
        int FromBits, 
        int ToBits, 
        typename Integer>
    requires (ToBits > FromBits && ToBits <= 2 * FromBits)
    Integer scaleInteger(const Integer& number);
    template <
        int FromBits, 
        int ToBits, 
        typename Integer>
    requires (ToBits > 2 * FromBits && ToBits <= 3 * FromBits)
    Integer scaleInteger(const Integer& number);
    template <
        int FromBits, 
        int ToBits, 
        typename Integer>
    requires (ToBits > 3 * FromBits && ToBits <= 4 * FromBits)
    Integer scaleInteger(const Integer& number);
}
#include "pastel/sys/integer/scale_integer.hpp"
#endif