Control Surface  1.1.1
MIDI Control Surface library for Arduino
IncreaseBitDepth.hpp
Go to the documentation of this file.
1 #pragma once
2 
4 AH_DIAGNOSTIC_WERROR() // Enable errors on warnings
5 
6 #include <AH/STL/type_traits> // enable_if
7 #include <limits.h> // CHAR_BIT
8 #include <stddef.h> // size_t
9 
11 
12 template <size_t Bits_out, size_t Bits_in, class T_out, class T_in>
13 std::enable_if_t<(Bits_out <= 2 * Bits_in), T_out>
15 
16 template <size_t Bits_out, size_t Bits_in, class T_out, class T_in>
17 std::enable_if_t<(Bits_out > 2 * Bits_in), T_out>
19  constexpr size_t leftShift = Bits_out - Bits_in;
20  return (T_out(in) << leftShift) |
21  increaseBitDepthImpl<leftShift, Bits_in, T_out>(in);
22 }
23 
24 template <size_t Bits_out, size_t Bits_in, class T_out, class T_in>
25 std::enable_if_t<(Bits_out <= 2 * Bits_in), T_out>
27  constexpr size_t leftShift = Bits_out - Bits_in;
28  constexpr size_t rightShift = Bits_in - leftShift;
29  return (T_out(in) << leftShift) | (in >> rightShift);
30 }
31 
34 
67 template <size_t Bits_out, size_t Bits_in, class T_out, class T_in>
68 T_out increaseBitDepth(T_in in) {
69  static_assert(Bits_in <= sizeof(T_in) * CHAR_BIT,
70  "Error: Bits_in > bits(T_in)");
71  static_assert(Bits_out <= sizeof(T_out) * CHAR_BIT,
72  "Error: Bits_out > bits(T_out)");
73  return increaseBitDepthImpl<Bits_out, Bits_in, T_out>(in);
74 }
75 
77 
79 
AH::increaseBitDepthImpl
std::enable_if_t<(Bits_out<=2 *Bits_in), T_out > increaseBitDepthImpl(T_in in)
Definition: IncreaseBitDepth.hpp:26
Warnings.hpp
AH::increaseBitDepth
T_out increaseBitDepth(T_in in)
Increase the bit depth of the given value from Bits_in bits wide to Bits_out bits wide,...
Definition: IncreaseBitDepth.hpp:68
AH_DIAGNOSTIC_POP
#define AH_DIAGNOSTIC_POP()
Definition: Warnings.hpp:17
AH_DIAGNOSTIC_WERROR
#define AH_DIAGNOSTIC_WERROR()
Definition: Warnings.hpp:16
BEGIN_AH_NAMESPACE
#define BEGIN_AH_NAMESPACE
Definition: AH/Settings/NamespaceSettings.hpp:9
END_AH_NAMESPACE
#define END_AH_NAMESPACE
Definition: AH/Settings/NamespaceSettings.hpp:10