1
0
mirror of https://github.com/TomHarte/CLK.git synced 2025-08-07 23:25:00 +00:00

Split encode and decode for clearer naming.

This commit is contained in:
Thomas Harte
2023-01-17 17:33:52 -05:00
parent f6e601daff
commit 83cf4497dd

View File

@@ -23,18 +23,18 @@ template <int... Sizes> class NumericCoder {
/// Modifies @c target to hold @c value at @c index. /// Modifies @c target to hold @c value at @c index.
template <int index> static void encode(int &target, int value) { template <int index> static void encode(int &target, int value) {
static_assert(index < sizeof...(Sizes), "Index must be within range"); static_assert(index < sizeof...(Sizes), "Index must be within range");
NumericEncoderImp<Sizes...>::template encode<index, 0, 1>(target, value); NumericEncoder<Sizes...>::template encode<index, 0, 1>(target, value);
} }
/// @returns The value from @c source at @c index. /// @returns The value from @c source at @c index.
template <int index> static int decode(int source) { template <int index> static int decode(int source) {
static_assert(index < sizeof...(Sizes), "Index must be within range"); static_assert(index < sizeof...(Sizes), "Index must be within range");
return NumericEncoderImp<Sizes...>::template decode<index, 0, 1>(source); return NumericDecoder<Sizes...>::template decode<index, 0, 1>(source);
} }
private: private:
template <int size, int... Tail> template <int size, int... Tail>
struct NumericEncoderImp { struct NumericEncoder {
template <int index, int i, int divider> static void encode(int &target, int value) { template <int index, int i, int divider> static void encode(int &target, int value) {
if constexpr (i == index) { if constexpr (i == index) {
const int suffix = target % divider; const int suffix = target % divider;
@@ -44,18 +44,20 @@ template <int... Sizes> class NumericCoder {
target *= divider; target *= divider;
target += suffix; target += suffix;
} else { } else {
NumericEncoderImp<Tail...>::template encode<index, i+1, divider*size>(target, value); NumericEncoder<Tail...>::template encode<index, i+1, divider*size>(target, value);
} }
} }
};
template <int size, int... Tail>
struct NumericDecoder {
template <int index, int i, int divider> static int decode(int source) { template <int index, int i, int divider> static int decode(int source) {
if constexpr (i == index) { if constexpr (i == index) {
return (source / divider) % size; return (source / divider) % size;
} else { } else {
return NumericEncoderImp<Tail...>::template decode<index, i+1, divider*size>(source); return NumericDecoder<Tail...>::template decode<index, i+1, divider*size>(source);
} }
} }
}; };
}; };