extern const char* compile11_bin_invoked_at_runtime;
template lt;typename T = std::uint32_t>
constexpr T compile11_bin(
constexpr_txt t,
std::size_t i = 0, // index
std::size_t b = 0, // bit count
T x = 0) // accumulator
{
return
i >= t.size() ? x : // end recursion
b >= std::numeric_limitslt;T>::digits ?
throw std::overflow_error("Too many bits!") :
t[i] == ',' ? compile11_binlt;T>(t, i+1, b, x) :
t[i] == '0' ? compile11_binlt;T>(t, i+1, b+1, (x*2)+0) :
t[i] == '1' ? compile11_binlt;T>(t, i+1, b+1, (x*2)+1) :
throw std::domain_error( // Only '0', '1', and ','
compile11_bin_invoked_at_runtime);
}
int main()
{
auto mask = // lt;- Not constexpr!
compile11_binlt;std::uint8_t>("1110 0000");
assert(mask == 0xE0);
return 0;
}
Compile-Time Floating Point
No comments:
Post a Comment
Note: Only a member of this blog may post a comment.