Control Surface
main
MIDI Control Surface library for Arduino
Toggle main menu visibility
Loading...
Searching...
No Matches
src
AH
Math
IncreaseBitDepth.hpp
Go to the documentation of this file.
1
#pragma once
2
3
#include <AH/STL/type_traits>
// enable_if
4
#include <limits.h>
// CHAR_BIT
5
#include <stddef.h>
// size_t
6
7
BEGIN_AH_NAMESPACE
8
9
namespace
detail
{
10
11
template
<
size_t
Bits_out,
size_t
Bits_in,
class
T_out,
class
T_in>
12
std::enable_if_t<(Bits_out <= 2 * Bits_in) && (Bits_out > Bits_in), T_out>
13
increaseBitDepthImpl
(T_in in) {
14
constexpr
size_t
leftShift = Bits_out - Bits_in;
15
constexpr
size_t
rightShift = Bits_in - leftShift;
16
return
(
static_cast<
T_out
>
(in) << leftShift) | (in >> rightShift);
17
}
18
19
template
<
size_t
Bits_out,
size_t
Bits_in,
class
T_out,
class
T_in>
20
std::enable_if_t<(Bits_out <= Bits_in), T_out>
increaseBitDepthImpl
(T_in in) {
21
constexpr
size_t
rightShift = Bits_in - Bits_out;
22
return
static_cast<
T_out
>
(in >> rightShift);
23
}
24
25
template
<
size_t
Bits_out,
size_t
Bits_in,
class
T_out,
class
T_in>
26
std::enable_if_t<(Bits_out > 2 * Bits_in), T_out>
27
increaseBitDepthImpl
(T_in in) {
28
constexpr
size_t
leftShift = Bits_out - Bits_in;
29
return
(
static_cast<
T_out
>
(in) << leftShift) |
30
increaseBitDepthImpl<leftShift, Bits_in, T_out>
(in);
31
}
32
33
}
// namespace detail
34
37
76
template
<
size_t
Bits_out,
size_t
Bits_in,
class
T_out,
class
T_in>
77
T_out
increaseBitDepth
(T_in in) {
78
static_assert
(Bits_in <=
sizeof
(T_in) * CHAR_BIT,
79
"Error: Bits_in > bits(T_in)"
);
80
static_assert
(Bits_out <=
sizeof
(T_out) * CHAR_BIT,
81
"Error: Bits_out > bits(T_out)"
);
82
return
detail::increaseBitDepthImpl<Bits_out, Bits_in, T_out>(in);
83
}
84
124
template
<
size_t
Bits_out,
size_t
Bits_in,
class
T_out,
class
T_in>
125
T_out
increaseBitDepthMiddle
(T_in in) {
126
static_assert
(Bits_in <=
sizeof
(T_in) * CHAR_BIT,
127
"Error: Bits_in > bits(T_in)"
);
128
static_assert
(Bits_out <=
sizeof
(T_out) * CHAR_BIT,
129
"Error: Bits_out > bits(T_out)"
);
130
constexpr
size_t
leftShift = Bits_out - Bits_in;
131
T_in half = T_in {1} << (Bits_in - 1);
132
T_out out =
static_cast<
T_out
>
(in) << leftShift;
133
if
(in > half) {
134
T_in repeat = in & (half - 1);
135
out |=
increaseBitDepth
<leftShift, Bits_in - 1, T_out>(repeat);
136
}
137
return
out;
138
}
139
141
142
END_AH_NAMESPACE
END_AH_NAMESPACE
#define END_AH_NAMESPACE
Definition
AH/Settings/NamespaceSettings.hpp:14
BEGIN_AH_NAMESPACE
#define BEGIN_AH_NAMESPACE
Definition
AH/Settings/NamespaceSettings.hpp:11
AH::increaseBitDepthMiddle
T_out increaseBitDepthMiddle(T_in in)
Increase the bit depth of the given value from Bits_in bits wide to Bits_out bits wide,...
Definition
IncreaseBitDepth.hpp:125
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:77
::detail
Definition
ArrayHelpers.hpp:16
AH::detail::increaseBitDepthImpl
std::enable_if_t<(Bits_out<=2 *Bits_in) &&(Bits_out > Bits_in), T_out > increaseBitDepthImpl(T_in in)
Definition
IncreaseBitDepth.hpp:13
Generated by
1.17.0