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:
@@ -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);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
};
|
};
|
||||||
};
|
};
|
||||||
|
|
||||||
|
Reference in New Issue
Block a user