Last active
September 19, 2021 08:23
-
-
Save SaitoAtsushi/304a8d7820ad72bfe4d674c4f76d2352 to your computer and use it in GitHub Desktop.
整数を各桁に分解するイテレータ。 過剰な抽象化をやってみた余興。 右の記事を見てやってみただけ → https://qiita.com/dsy_i07/items/5de9417ff235d5aa6a42
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
#include <cassert> | |
#include <iterator> | |
#include <type_traits> | |
template <class T, int base, typename std::enable_if<std::is_unsigned<T>::value, void*>::type = nullptr> | |
class column_splitted_iterator { | |
private: | |
T data; | |
bool endflag; | |
public: | |
using difference_type = int; | |
using value_type = T; | |
using pointer = T*; | |
using reference = T&; | |
using iterator_category = std::input_iterator_tag; | |
column_splitted_iterator(const T data) : data(data), endflag(false) {} | |
column_splitted_iterator(void) : endflag(true) {} | |
bool operator!=(column_splitted_iterator y) { | |
if (this->endflag && y.endflag) return false; | |
if (this->endflag) return y.data != 0; | |
if (y.endflag) return this->data != 0; | |
return this->data != y.data; | |
} | |
T operator*(void) { return data % base; } | |
column_splitted_iterator& operator++(void) { | |
assert(data); | |
data /= 10; | |
return *this; | |
} | |
}; | |
template <class T, int base = 10, typename std::enable_if<std::is_unsigned<T>::value, void*>::type = nullptr> | |
class column_splitted_adapter { | |
private: | |
const T data; | |
public: | |
column_splitted_adapter(const T data) : data(data) {} | |
column_splitted_iterator<T, base> begin(void) { return column_splitted_iterator<T, base>(data); } | |
column_splitted_iterator<T, base> end(void) { return column_splitted_iterator<T, base>(); } | |
}; | |
template <class T, int base = 10, typename std::enable_if<std::is_unsigned<T>::value, void*>::type = nullptr> | |
column_splitted_adapter<T, base> make_column_splitted_adapter(const T obj) { | |
return column_splitted_adapter<T, base>(obj); | |
} |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
#include <iostream> | |
#include <numeric> | |
#include "column_split.hpp" | |
int main(void) { | |
auto adapted_number = make_column_splitted_adapter(123u); | |
std::cout << std::accumulate(std::begin(adapted_number), std::end(adapted_number), 0u) << std::endl; | |
} |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment