Browse Source

Using fixed-size 32bit integer instead of size_t for log/pow.

I want something like "use 32bit on x86, but 64bit on x86_64 and
x86_32", but <cstdint> header has nothing like that.
vectorfields
Vladimír Vondruš 14 years ago
parent
commit
cdc2e5302c
  1. 6
      src/Math/Math.cpp
  2. 6
      src/Math/Math.h
  3. 18
      src/SizeTraits.h

6
src/Math/Math.cpp

@ -15,10 +15,12 @@
#include "Math.h"
using namespace std;
namespace Magnum { namespace Math {
size_t log(size_t base, size_t number) {
size_t log = 0;
uint32_t log(uint32_t base, uint32_t number) {
uint32_t log = 0;
while(number /= base)
++log;
return log;

6
src/Math/Math.h

@ -37,7 +37,7 @@ namespace Magnum { namespace Math {
#ifndef DOXYGEN_GENERATING_OUTPUT
namespace Implementation {
template<size_t exponent> struct Pow {
template<std::uint32_t exponent> struct Pow {
template<class T> inline constexpr T operator()(T base) const {
return base*Pow<exponent-1>()(base);
}
@ -53,7 +53,7 @@ namespace Implementation {
*
* Returns integral power of base to the exponent.
*/
template<size_t exponent, class T> inline constexpr T pow(T base) {
template<std::uint32_t exponent, class T> inline constexpr T pow(T base) {
return Implementation::Pow<exponent>()(base);
}
@ -62,7 +62,7 @@ template<size_t exponent, class T> inline constexpr T pow(T base) {
*
* Returns integral logarithm of given number with given base.
*/
size_t MAGNUM_EXPORT log(size_t base, size_t number);
std::uint32_t MAGNUM_EXPORT log(std::uint32_t base, std::uint32_t number);
/**
@brief Normalize floating-point value

18
src/SizeTraits.h

@ -143,14 +143,14 @@ template<class Base> struct SizeBasedCall: public Base {
Useful mainly for computing template parameter value, e.g. in conjunction with
SizeTraits class.
*/
template<size_t base, size_t exponent> struct Pow {
template<std::uint32_t base, std::uint32_t exponent> struct Pow {
/** @brief Value of the power */
enum { value = base*Pow<base, exponent-1>::value };
enum: std::uint32_t { value = base*Pow<base, exponent-1>::value };
};
#ifndef DOXYGEN_GENERATING_OUTPUT
template<size_t base> struct Pow<base, 0> {
enum { value = 1 };
template<std::uint32_t base> struct Pow<base, 0> {
enum: std::uint32_t { value = 1 };
};
#endif
@ -162,15 +162,15 @@ template<size_t base> struct Pow<base, 0> {
Useful mainly for computing template parameter value, e.g. in conjunction with
SizeTraits class.
*/
template<size_t base, size_t number> struct Log {
template<std::uint32_t base, std::uint32_t number> struct Log {
/** @brief Value of the logarithm */
enum { value = 1+Log<base, number/base>::value };
enum: std::uint32_t { value = 1+Log<base, number/base>::value };
};
#ifndef DOXYGEN_GENERATING_OUTPUT
template<size_t base> struct Log<base, 1>: public Log<base, 0> {};
template<size_t base> struct Log<base, 0> {
enum { value = 0 };
template<std::uint32_t base> struct Log<base, 1>: public Log<base, 0> {};
template<std::uint32_t base> struct Log<base, 0> {
enum: std::uint32_t { value = 0 };
};
#endif

Loading…
Cancel
Save