Medial Code Documentation
Loading...
Searching...
No Matches
transform_iterator.h
1
4#ifndef XGBOOST_COMMON_TRANSFORM_ITERATOR_H_
5#define XGBOOST_COMMON_TRANSFORM_ITERATOR_H_
6
7#include <cstddef> // std::size_t
8#include <iterator> // std::random_access_iterator_tag
9#include <type_traits> // std::result_of_t, std::add_pointer_t, std::add_lvalue_reference_t
10#include <utility> // std::forward
11
12#include "xgboost/span.h" // ptrdiff_t
13
14namespace xgboost {
15namespace common {
22template <typename Fn>
24 std::size_t iter_{0};
25 Fn fn_;
26
27 public:
28 using iterator_category = std::random_access_iterator_tag; // NOLINT
29 using reference = std::result_of_t<Fn(std::size_t)>; // NOLINT
30 using value_type = std::remove_cv_t<std::remove_reference_t<reference>>; // NOLINT
31 using difference_type = detail::ptrdiff_t; // NOLINT
32 using pointer = std::add_pointer_t<value_type>; // NOLINT
33
34 public:
38 explicit IndexTransformIter(Fn &&op) : fn_{op} {}
39 IndexTransformIter(IndexTransformIter const &) = default;
40 IndexTransformIter &operator=(IndexTransformIter &&) = default;
41 IndexTransformIter &operator=(IndexTransformIter const &that) {
42 iter_ = that.iter_;
43 return *this;
44 }
45
46 reference operator*() const { return fn_(iter_); }
47 reference operator[](std::size_t i) const {
48 auto iter = *this + i;
49 return *iter;
50 }
51
52 auto operator-(IndexTransformIter const &that) const { return iter_ - that.iter_; }
53 bool operator==(IndexTransformIter const &that) const { return iter_ == that.iter_; }
54 bool operator!=(IndexTransformIter const &that) const { return !(*this == that); }
55
56 IndexTransformIter &operator++() {
57 iter_++;
58 return *this;
59 }
60 IndexTransformIter operator++(int) {
61 auto ret = *this;
62 ++(*this);
63 return ret;
64 }
65 IndexTransformIter &operator+=(difference_type n) {
66 iter_ += n;
67 return *this;
68 }
69 IndexTransformIter &operator-=(difference_type n) {
70 (*this) += -n;
71 return *this;
72 }
73 IndexTransformIter operator+(difference_type n) const {
74 auto ret = *this;
75 return ret += n;
76 }
77 IndexTransformIter operator-(difference_type n) const {
78 auto ret = *this;
79 return ret -= n;
80 }
81};
82
83template <typename Fn>
84auto MakeIndexTransformIter(Fn &&fn) {
85 return IndexTransformIter<Fn>(std::forward<Fn>(fn));
86}
87} // namespace common
88} // namespace xgboost
89#endif // XGBOOST_COMMON_TRANSFORM_ITERATOR_H_
Transform iterator that takes an index and calls transform operator.
Definition transform_iterator.h:23
IndexTransformIter(Fn &&op)
Definition transform_iterator.h:38
namespace of xgboost
Definition base.h:90