47 lines
1.1 KiB
C++
47 lines
1.1 KiB
C++
#pragma once
|
|
#include "types.hpp"
|
|
#include <stddef.hpp>
|
|
|
|
namespace JabyEngine {
|
|
template<typename T>
|
|
static constexpr T pow(T base, T power) {
|
|
T result = base;
|
|
while(power > 1) {
|
|
result = result*base;
|
|
power--;
|
|
}
|
|
return result;
|
|
}
|
|
|
|
template<typename T>
|
|
static constexpr pair<T, T> div_and_mod(T value, T div) {
|
|
const auto result = value/div;
|
|
return {static_cast<T>(result), static_cast<T>(value - (result*div))};
|
|
}
|
|
|
|
static constexpr uint8_t to_bcd(uint8_t value) {
|
|
const auto [tenth, rest] = div_and_mod(value, static_cast<uint8_t>(10));
|
|
return (tenth << 4 | rest);
|
|
}
|
|
|
|
template<typename T>
|
|
static constexpr T from_bcd(T value) {
|
|
T result = 0;
|
|
|
|
for(size_t n = 1; n < pow(10u, sizeof(T)*2); n *= 10) {
|
|
result += (value & 0b1111)*n;
|
|
value = value >> 4;
|
|
}
|
|
return result;
|
|
}
|
|
|
|
template<typename T>
|
|
static constexpr T min_of(T a, T b) {
|
|
return (a < b) ? a : b;
|
|
}
|
|
|
|
template<typename T>
|
|
static constexpr T max_of(T a, T b) {
|
|
return (a > b) ? a : b;
|
|
}
|
|
} |