Health-GPS 3.0.0.0
Global Health Policy Simulation model (Health-GPS)
Loading...
Searching...
No Matches
column_iterator.h
Go to the documentation of this file.
1#pragma once
2
3#include <iterator>
4
5namespace hgps::core {
6
7namespace detail {
8
11template <typename ColumnType> struct DefaultValueAccessor {
13 using ValueType = decltype(std::declval<ColumnType>().value_safe(0));
14
19 ValueType operator()(const ColumnType &column, std::size_t index) {
20 return column.value_safe(index);
21 }
22};
23} // namespace detail
24
28template <typename ColumnType, typename ValueAccessor = detail::DefaultValueAccessor<ColumnType>>
30 public:
31 using value_type = typename ValueAccessor::ValueType;
32 using difference_type = std::size_t;
34 using iterator_category = std::random_access_iterator_tag;
35
39 DataTableColumnIterator() : column_(nullptr), index_(0) {}
40
45 explicit DataTableColumnIterator(const ColumnType &column, std::size_t index = 0)
46 : column_(&column), index_(index) {}
47
50 std::size_t index() const { return index_; }
51
55 return column_->is_null(index_) ? value_type{} : column_->value_safe(index_).value();
56 }
57
58 // Forward / backward
60 --index_;
61 return *this;
62 }
64 ++index_;
65 return *this;
66 }
68 DataTableColumnIterator tmp(*this);
69 ++index_;
70 return tmp;
71 }
73 DataTableColumnIterator tmp(*this);
74 --index_;
75 return tmp;
76 }
77
78 // Arithmetic
80 return index_ - other.index_;
81 }
82
84 return DataTableColumnIterator(*column_, index_ + n);
85 }
87 return DataTableColumnIterator(*column_, index_ - n);
88 }
90 index_ += n;
91 return *this;
92 }
94 index_ -= n;
95 return *this;
96 }
97
100 return DataTableColumnIterator(*other.column_, diff + other.index_);
101 }
102
105 return DataTableColumnIterator(*other.column_, diff - other.index_);
106 }
107
108 // Comparisons
109 bool operator==(const DataTableColumnIterator &other) const { return index_ == other.index_; }
110 bool operator!=(const DataTableColumnIterator &other) const { return index_ != other.index_; }
111 bool operator<(const DataTableColumnIterator &other) const { return index_ < other.index_; }
112 bool operator>(const DataTableColumnIterator &other) const { return index_ > other.index_; }
113 bool operator<=(const DataTableColumnIterator &other) const { return index_ <= other.index_; }
114 bool operator>=(const DataTableColumnIterator &other) const { return index_ >= other.index_; }
115
116 private:
117 const ColumnType *column_;
118 std::size_t index_;
119};
120} // namespace hgps::core
121
123namespace std {
124
127template <typename ColumnType>
128struct iterator_traits<::hgps::core::DataTableColumnIterator<ColumnType>> {
130 using difference_type = typename IteratorType::difference_type;
131 using value_type = typename IteratorType::value_type;
132 using reference = typename IteratorType::reference;
133 using iterator_category = typename IteratorType::iterator_category;
134};
135} // namespace std
DataTable column iterator data type class.
Definition column_iterator.h:29
DataTableColumnIterator operator++(int)
Definition column_iterator.h:67
DataTableColumnIterator & operator-=(difference_type n)
Definition column_iterator.h:93
DataTableColumnIterator operator--(int)
Definition column_iterator.h:72
value_type & reference
Definition column_iterator.h:33
std::size_t difference_type
Definition column_iterator.h:32
DataTableColumnIterator()
Initialise a new instance of the DataTableColumnIterator{ColumnType, ValueAccessor} class.
Definition column_iterator.h:39
DataTableColumnIterator & operator++()
Definition column_iterator.h:63
friend DataTableColumnIterator operator-(difference_type diff, const DataTableColumnIterator &other)
Definition column_iterator.h:103
DataTableColumnIterator operator-(difference_type n) const
Definition column_iterator.h:86
bool operator>=(const DataTableColumnIterator &other) const
Definition column_iterator.h:114
std::size_t index() const
Gets the current iterator index.
Definition column_iterator.h:50
bool operator<(const DataTableColumnIterator &other) const
Definition column_iterator.h:111
DataTableColumnIterator operator+(difference_type n) const
Definition column_iterator.h:83
typename ValueAccessor::ValueType value_type
Definition column_iterator.h:31
DataTableColumnIterator & operator+=(difference_type n)
Definition column_iterator.h:89
bool operator==(const DataTableColumnIterator &other) const
Definition column_iterator.h:109
value_type operator*() const
Gets the current iterator value.
Definition column_iterator.h:54
DataTableColumnIterator & operator--()
Definition column_iterator.h:59
std::random_access_iterator_tag iterator_category
Definition column_iterator.h:34
bool operator<=(const DataTableColumnIterator &other) const
Definition column_iterator.h:113
bool operator>(const DataTableColumnIterator &other) const
Definition column_iterator.h:112
friend DataTableColumnIterator operator+(difference_type diff, const DataTableColumnIterator &other)
Definition column_iterator.h:98
bool operator!=(const DataTableColumnIterator &other) const
Definition column_iterator.h:110
DataTableColumnIterator(const ColumnType &column, std::size_t index=0)
Initialise a new instance of the DataTableColumnIterator{ColumnType, ValueAccessor} class.
Definition column_iterator.h:45
difference_type operator-(const DataTableColumnIterator &other) const
Definition column_iterator.h:79
Top-level namespace for Health-GPS Core C++ API.
Definition analysis.h:7
@ other
Common diseases excluding cancers.
Global namespace.
Definition column_iterator.h:123
Defines the default column value accessor type.
Definition column_iterator.h:11
ValueType operator()(const ColumnType &column, std::size_t index)
Gets a value from the target column.
Definition column_iterator.h:19
decltype(std::declval< ColumnType >().value_safe(0)) ValueType
The column value type.
Definition column_iterator.h:13