Skip to content

Instantly share code, notes, and snippets.

@SaitoAtsushi
Last active September 19, 2021 08:23
Show Gist options
  • Save SaitoAtsushi/304a8d7820ad72bfe4d674c4f76d2352 to your computer and use it in GitHub Desktop.
Save SaitoAtsushi/304a8d7820ad72bfe4d674c4f76d2352 to your computer and use it in GitHub Desktop.
整数を各桁に分解するイテレータ。 過剰な抽象化をやってみた余興。 右の記事を見てやってみただけ → https://qiita.com/dsy_i07/items/5de9417ff235d5aa6a42
#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);
}
#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