Back to Mathematical functions
// Description: Remainder
// Documentation: math_functions.txt
#ifndef PASTELSYS_MOD_H
#define PASTELSYS_MOD_H
#include "pastel/sys/mytypes.h"
#include "pastel/sys/real/real_concept.h"
#include "pastel/sys/integer/integer_concept.h"
#include <type_traits>
namespace Pastel
{
    //! Returns x mod 2^n for signed integers.
    /*!
   Preconditions:
   n >= 0
   Here's what mod 2^2 computes:
   -6 -5 -4 -3 -2 -1 0 1 2 3 4 5 6
    2  3  0  1  2  3 0 1 2 3 0 1 2
   */
    template <typename Integer, Requires<std::is_signed<Integer>> = 0>
    Integer modPowerOfTwo(const Integer& x, integer n);
    //! Returns x mod 2^n for unsigned integers.
    /*!
   Preconditions:
   n >= 0
   See the documentation for the signed version.
   */
    template <typename Integer, Requires<std::is_unsigned<Integer>> = 0>
    Integer modPowerOfTwo(const Integer& x, integer n);
    //! Returns x mod n.
    /*!
   Preconditions:
   n > 0
   Here's what mod 3 computes:
   -6 -5 -4 -3 -2 -1 0 1 2 3 4 5 6
    0  1  2  0  1  2 0 1 2 0 1 2 0
   */
    template <
        typename Integer,
        typename N_Integer,
        Requires<
            Models<Integer, Integer_Concept>,
            Models<N_Integer, Integer_Concept>
        > = 0
    >
    Integer mod(const Integer& x, const N_Integer& n);
    //! Returns x mod 1.
    /*!
   Postconditions:
   0 <= x < 1
   Returns:
   x - floor(x)
   */
    template <typename Real>
    Real realMod(const Real& x);
    //! Returns x mod n.
    /*!
   Preconditions:
   n > 0
   This is a convenience function that returns
   mod(x / n) * n
   */
    template <typename Real>
    Real realMod(const Real& x, const Real& n);
}
#include "pastel/sys/math/mod.hpp"
#endif