#pragma once #include "types.hpp" #include namespace JabyEngine { template static constexpr T pow(T base, T power) { T result = base; while(power > 1) { result = result*base; power--; } return result; } template static constexpr pair div_and_mod(T value, T div) { const auto result = value/div; return {static_cast(result), static_cast(value - (result*div))}; } static constexpr uint8_t to_bcd(uint8_t value) { const auto [tenth, rest] = div_and_mod(value, static_cast(10)); return (tenth << 4 | rest); } template 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; } }