lxgui
All Classes Namespaces Functions Variables Typedefs Enumerations Enumerator Friends Pages
utils_view.hpp
1 #ifndef LXGUI_UTILS_VIEW_HPP
2 #define LXGUI_UTILS_VIEW_HPP
3 
4 #include "lxgui/lxgui.hpp"
5 
6 #include <utility>
7 
8 namespace lxgui::utils::view {
9 
11 template<typename BaseIterator>
13  using data_type = decltype(*std::declval<BaseIterator>());
14  static data_type dereference(const BaseIterator& iter) {
15  return *iter;
16  }
17 };
18 
20 template<typename BaseIterator>
22  using data_type = decltype(*std::declval<BaseIterator>()->get());
23  static data_type dereference(const BaseIterator& iter) {
24  return *iter->get();
25  }
26 };
27 
29 template<typename BaseIterator>
31  using data_type = decltype(**std::declval<BaseIterator>());
32  static data_type dereference(const BaseIterator& iter) {
33  return **iter;
34  }
35 };
36 
38 template<typename BaseIterator>
39 struct no_filter {
40  static bool is_included(const BaseIterator&) {
41  return true;
42  }
43 };
44 
46 template<typename BaseIterator>
48  static bool is_included(const BaseIterator& iter) {
49  return *iter != nullptr;
50  }
51 };
52 
54 template<
55  typename ContainerType,
56  template<typename>
57  class Dereferencer,
58  template<typename>
59  class Filter>
60 class adaptor {
61 public:
62  using base_iterator = std::conditional_t<
63  std::is_const_v<ContainerType>,
64  typename ContainerType::const_iterator,
65  typename ContainerType::iterator>;
66  using dereferencer = Dereferencer<base_iterator>;
67  using filter = Filter<base_iterator>;
68  using data_type = typename dereferencer::data_type;
69 
70  explicit adaptor(ContainerType& collection) : collection_(collection) {}
71  explicit adaptor(ContainerType& collection, dereferencer&& deref, filter&& filt) :
72  collection_(collection), deref_(std::move(deref)), filter_(std::move(filt)) {}
73 
74  adaptor(const adaptor& other) : collection_(other.collection_) {}
75  adaptor(adaptor&& other) : collection_(other.collection_) {}
76  adaptor& operator=(const adaptor& other) {
77  collection_ = other.collection_;
78  return *this;
79  }
81  collection_ = other.collection_;
82  return *this;
83  }
84 
85  class iterator {
86  public:
87  explicit iterator(const adaptor& adaptor, base_iterator iter) :
88  adaptor_(adaptor), iter_(iter) {}
89 
91  do {
92  ++iter_;
93  } while (iter_ != adaptor_.collection_.end() && !adaptor_.filter_.is_included(iter_));
94 
95  return *this;
96  }
97 
99  iterator old = *this;
100  this-> operator++();
101  return old;
102  }
103 
104  bool operator==(const iterator& other) const {
105  return iter_ == other.iter_;
106  }
107  bool operator!=(const iterator& other) const {
108  return iter_ != other.iter_;
109  }
110 
112  return adaptor_.deref_.dereference(iter_);
113  }
115  return adaptor_.deref_.dereference(iter_);
116  }
117 
118  private:
119  const adaptor& adaptor_;
120  base_iterator iter_;
121  };
122 
123  iterator begin() const {
124  iterator iter(*this, collection_.begin());
125  if (collection_.begin() != collection_.end() && !filter_.is_included(collection_.begin())) {
126  ++iter;
127  }
128  return iter;
129  }
130 
131  iterator end() const {
132  return iterator(*this, collection_.end());
133  }
134 
135 private:
136  ContainerType& collection_;
137  dereferencer deref_;
138  filter filter_;
139 };
140 
141 } // namespace lxgui::utils::view
142 
143 #endif
bool operator==(const iterator &other) const
Definition: utils_view.hpp:104
iterator(const adaptor &adaptor, base_iterator iter)
Definition: utils_view.hpp:87
bool operator!=(const iterator &other) const
Definition: utils_view.hpp:107
Allow iterating over a container without access to the container itself.
Definition: utils_view.hpp:60
adaptor(const adaptor &other)
Definition: utils_view.hpp:74
adaptor & operator=(const adaptor &other)
Definition: utils_view.hpp:76
adaptor & operator=(adaptor &&other)
Definition: utils_view.hpp:80
adaptor(adaptor &&other)
Definition: utils_view.hpp:75
adaptor(ContainerType &collection, dereferencer &&deref, filter &&filt)
Definition: utils_view.hpp:71
Dereferencer< base_iterator > dereferencer
Definition: utils_view.hpp:66
std::conditional_t< std::is_const_v< ContainerType >, typename ContainerType::const_iterator, typename ContainerType::iterator > base_iterator
Definition: utils_view.hpp:65
typename dereferencer::data_type data_type
Definition: utils_view.hpp:68
Filter< base_iterator > filter
Definition: utils_view.hpp:67
adaptor(ContainerType &collection)
Definition: utils_view.hpp:70
T & get(variant &value)
Retrieve the value stored in an utils::variant.
static bool is_included(const BaseIterator &)
Definition: utils_view.hpp:40
static bool is_included(const BaseIterator &iter)
Definition: utils_view.hpp:48
De-reference an iterator twice.
Definition: utils_view.hpp:30
decltype(**std::declval< BaseIterator >()) data_type
Definition: utils_view.hpp:31
static data_type dereference(const BaseIterator &iter)
Definition: utils_view.hpp:32
Convert unique_ptr or shared_ptr to standard pointer.
Definition: utils_view.hpp:21
static data_type dereference(const BaseIterator &iter)
Definition: utils_view.hpp:23
decltype(*std::declval< BaseIterator >() ->get()) data_type
Definition: utils_view.hpp:22
De-reference an iterator normally.
Definition: utils_view.hpp:12
decltype(*std::declval< BaseIterator >()) data_type
Definition: utils_view.hpp:13
static data_type dereference(const BaseIterator &iter)
Definition: utils_view.hpp:14