Health-GPS  1.2.2.0
Global Health Policy Simulation model (Health-GPS)
column_iterator.h
Go to the documentation of this file.
1 #pragma once
2 
3 #include <iterator>
4 
5 namespace hgps::core {
6 
7 namespace detail {
8 
11 template <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 
28 template <typename ColumnType, typename ValueAccessor = detail::DefaultValueAccessor<ColumnType>>
30  public:
31  using value_type = typename ValueAccessor::ValueType;
32  using difference_type = std::size_t;
33  using reference = value_type &;
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 
99  const DataTableColumnIterator &other) {
100  return DataTableColumnIterator(*other.column_, diff + other.index_);
101  }
102 
104  const DataTableColumnIterator &other) {
105  return DataTableColumnIterator(*other.array_, 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 
123 namespace std {
124 
127 template <typename ColumnType>
128 struct iterator_traits<::hgps::core::DataTableColumnIterator<ColumnType>> {
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--(int)
Definition: column_iterator.h:72
value_type & reference
Definition: column_iterator.h:33
DataTableColumnIterator & operator-=(difference_type n)
Definition: column_iterator.h:93
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)
Definition: column_iterator.h:89
DataTableColumnIterator operator+(difference_type n) const
Definition: column_iterator.h:83
typename ValueAccessor::ValueType value_type
Definition: column_iterator.h:31
DataTableColumnIterator & operator--()
Definition: column_iterator.h:59
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
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: jsonparser.h:88
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
typename IteratorType::reference reference
Definition: column_iterator.h:132
typename IteratorType::iterator_category iterator_category
Definition: column_iterator.h:133
typename IteratorType::value_type value_type
Definition: column_iterator.h:131
typename IteratorType::difference_type difference_type
Definition: column_iterator.h:130