Cleaning up and simplifying code a bit
This commit is contained in:
parent
7f8f092372
commit
e62da38cf9
1 changed files with 16 additions and 14 deletions
|
@ -70,6 +70,9 @@ namespace dhandy {
|
|||
static const constexpr std::size_t max_len = max_digit_count<typename std::conditional<always_unsigned, std::make_unsigned_t<I>, I>::type, Base> + is_signed;
|
||||
};
|
||||
|
||||
template <typename I, unsigned int Base, typename Tr>
|
||||
using RevArray = ReversedSizedArray<typename Tr::char_type, int_info<I, Base>::max_len + 1>;
|
||||
|
||||
template <typename I, unsigned int Base, bool Signed=int_info<I, Base>::is_signed>
|
||||
struct IsNegative { static constexpr bool check (I) { return false; } };
|
||||
template <typename I, unsigned int Base>
|
||||
|
@ -99,14 +102,13 @@ namespace dhandy {
|
|||
|
||||
template <typename I, unsigned int Base, typename Tr, typename=void>
|
||||
struct IntConversion {
|
||||
static constexpr ReversedSizedArray<std::decay_t<decltype(std::declval<Tr>().to_digit(1))>, implem::int_info<I, Base>::max_len + 1> to_ary (I in) {
|
||||
using RetType = ReversedSizedArray<std::decay_t<decltype(std::declval<Tr>().to_digit(1))>, implem::int_info<I, Base>::max_len + 1>;
|
||||
static constexpr RevArray<I, Base, Tr> to_ary (I in) {
|
||||
using Num = implem::NumberAdaptation<I, Base>;
|
||||
|
||||
const bool was_negative = implem::is_negative<I, Base>(in);
|
||||
|
||||
RetType arr;
|
||||
arr.push_front('\0');
|
||||
RevArray<I, Base, Tr> arr;
|
||||
arr.push_front(Tr::NullChar);
|
||||
do {
|
||||
arr.push_front(Tr::to_digit(static_cast<int>(Num::abs(Num::cast(in)) % Base)));
|
||||
in = static_cast<I>(Num::cast(in) / static_cast<I>(Base));
|
||||
|
@ -119,11 +121,9 @@ namespace dhandy {
|
|||
|
||||
template <unsigned int Base, typename Tr>
|
||||
struct IntConversion<bool, Base, Tr, void> {
|
||||
static constexpr ReversedSizedArray<std::decay_t<decltype(std::declval<Tr>().to_digit(1))>, 2> to_ary (bool in) {
|
||||
using RetType = ReversedSizedArray<std::decay_t<decltype(std::declval<Tr>().to_digit(1))>, 2>;
|
||||
|
||||
RetType arr;
|
||||
arr.push_front('\0');
|
||||
static constexpr ReversedSizedArray<typename Tr::char_type, 2> to_ary (bool in) {
|
||||
ReversedSizedArray<typename Tr::char_type, 2> arr;
|
||||
arr.push_front(Tr::NullChar);
|
||||
arr.push_front(in ? Tr::to_digit(1) : Tr::to_digit(0));
|
||||
return arr;
|
||||
}
|
||||
|
@ -131,8 +131,8 @@ namespace dhandy {
|
|||
|
||||
template <typename I, typename Tr>
|
||||
struct IntConversion<I, 10, Tr, typename std::enable_if<std::is_integral<I>::value and not std::is_same<I, bool>::value>::type> {
|
||||
static constexpr ReversedSizedArray<std::decay_t<decltype(std::declval<Tr>().to_digit(1))>, implem::int_info<I, 10>::max_len + 1> to_ary (I in) {
|
||||
using RetType = ReversedSizedArray<std::decay_t<decltype(std::declval<Tr>().to_digit(1))>, implem::int_info<I, 10>::max_len + 1>;
|
||||
static constexpr RevArray<I, 10, Tr> to_ary (I in) {
|
||||
using RetType = RevArray<I, 10, Tr>;
|
||||
using Num = implem::NumberAdaptation<I, 10>;
|
||||
|
||||
const constexpr char lookup[200] = {
|
||||
|
@ -147,7 +147,7 @@ namespace dhandy {
|
|||
const bool was_negative = implem::is_negative<I, 10>(in);
|
||||
|
||||
RetType arr;
|
||||
arr.push_front('\0');
|
||||
arr.push_front(Tr::NullChar);
|
||||
while (Num::abs(in) >= static_cast<I>(100)) {
|
||||
const auto index = (Num::abs(in) % 100) * 2;
|
||||
arr.push_front(Tr::to_digit(static_cast<int>(lookup[index + 1])));
|
||||
|
@ -266,13 +266,15 @@ namespace dhandy {
|
|||
}
|
||||
} //namespace implem
|
||||
|
||||
template <typename C, C FDigit='0', C FLetter='a', C CPlus='+', C CMinus='-'>
|
||||
template <typename C, C FDigit='0', C FLetter='a', C CPlus='+', C CMinus='-', C CNull='\0'>
|
||||
struct ASCIITranslator {
|
||||
typedef C char_type;
|
||||
static const constexpr bool BehavesLikeASCII = true;
|
||||
static const constexpr C FirstDigit = FDigit;
|
||||
static const constexpr C FirstLetter = FLetter;
|
||||
static const constexpr C Plus = CPlus;
|
||||
static const constexpr C Minus = CMinus;
|
||||
static const constexpr C NullChar = CNull;
|
||||
|
||||
static constexpr C to_digit (unsigned int num) {
|
||||
return (num <= 9 ?
|
||||
|
@ -293,7 +295,7 @@ namespace dhandy {
|
|||
|
||||
template <typename I, unsigned int Base=10, typename Tr=ASCIITranslator<char>>
|
||||
constexpr inline auto int_to_ary (I in) {
|
||||
return implem::IntConversion<std::decay_t<I>, Base, Tr>::to_ary(in);
|
||||
return implem::IntConversion<std::remove_cvref_t<I>, Base, Tr>::to_ary(in);
|
||||
}
|
||||
|
||||
template <typename R, typename C, unsigned int Base=10, typename Tr=ASCIITranslator<C>>
|
||||
|
|
Loading…
Reference in a new issue