Ardour  9.5-101-ge478644d3a
helperlist.h
Go to the documentation of this file.
1 /* helperlist.h
2  *
3  * Copyright 2002 The gtkmm Development Team
4  *
5  * This library is free software; you can redistribute it and/or
6  * modify it under the terms of the GNU Lesser General Public
7  * License as published by the Free Software Foundation; either
8  * version 2.1 of the License, or (at your option) any later version.
9  *
10  * This library is distributed in the hope that it will be useful,
11  * but WITHOUT ANY WARRANTY; without even the implied warranty of
12  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
13  * Lesser General Public License for more details.
14  *
15  * You should have received a copy of the GNU Lesser General Public
16  * License along with this library. If not, see <http://www.gnu.org/licenses/>.
17  */
18 
19 #pragma once
20 #include <glibmm/containers.h>
21 
22 namespace Ytkmm
23 {
24 
25 // This class has some pure virtual methods which need to be implemented by derived classes.
26 
27 template <typename T_Child, typename T_CppElement, typename T_Iterator>
29 {
30 public:
31  HelperList() : gparent_(nullptr) {}
32 
33  HelperList(GObject*
34  gp) // We use gp instead of gparent because that can cause warnings about a shadowed member.
35  : gparent_(gp)
36  {
37  }
38 
39  virtual ~HelperList() noexcept {}
40 
41  using value_type = T_Child;
43  using const_reference = const value_type&;
44 
45  using iterator = T_Iterator;
46  using const_iterator = Glib::List_ConstIterator<iterator>;
47  using reverse_iterator = Glib::List_ReverseIterator<iterator>;
48  using const_reverse_iterator = Glib::List_ConstIterator<reverse_iterator>;
49 
50  using element_type = T_CppElement;
51 
52  using difference_type = std::ptrdiff_t;
53  using size_type = std::size_t;
54 
55  // These are implemented differently for each Helper List.
56  virtual iterator erase(iterator) = 0;
57 
58  virtual void erase(iterator start, iterator stop)
59  {
60  while (start != stop)
61  start = erase(start); // Implemented in derived class.
62  }
63 
64  virtual void remove(const_reference) = 0;
65 
66  size_type size() const { return g_list_length(glist()); }
67 
68  inline size_type max_size() { return size_type(-1); }
69  inline bool empty() { return glist() == nullptr; }
70 
71  inline iterator begin() { return begin_(); }
72  inline iterator end() { return end_(); }
73 
74  inline const_iterator begin() const { return const_iterator(begin_()); }
75  inline const_iterator end() const { return const_iterator(end_()); }
76 
77  inline reverse_iterator rbegin() { return reverse_iterator(end_()); }
78  inline reverse_iterator rend() { return reverse_iterator(begin_()); }
79 
81  {
83  }
85  {
87  }
88 
89  reference front() const { return *begin(); }
90 
91  reference back() const { return *(--end()); }
92 
94  {
95  size_type j = 0;
96  iterator i;
97  for (i = begin(), j = 0; i != end() && j < l; ++i, ++j)
98  ;
99  return (*i);
100  }
101 
102  // Derived classes might choose to reimplement these as public:
103  inline void pop_front() { erase(begin()); }
104  inline void pop_back() { erase(--end()); }
105 
106  void clear() { erase(begin(), end()); }
107 
108  GObject* gparent() { return gparent_; };
109  const GObject* gparent() const { return gparent_; };
110 
111 protected:
112  virtual GList*& glist() const = 0; // front of list
113 
114  iterator begin_() const { return iterator(glist(), glist()); }
115 
116  iterator end_() const { return iterator(glist(), (GList*)nullptr); }
117 
118  GObject* gparent_;
119 };
120 
121 } /* namespace Ytkmm */
const_reverse_iterator rbegin() const
Definition: helperlist.h:80
reference operator[](size_type l) const
Definition: helperlist.h:93
T_Child value_type
Definition: helperlist.h:41
iterator begin()
Definition: helperlist.h:71
std::ptrdiff_t difference_type
Definition: helperlist.h:52
iterator end()
Definition: helperlist.h:72
virtual GList *& glist() const =0
reverse_iterator rbegin()
Definition: helperlist.h:77
value_type & reference
Definition: helperlist.h:42
iterator begin_() const
Definition: helperlist.h:114
T_Iterator iterator
Definition: helperlist.h:45
const value_type & const_reference
Definition: helperlist.h:43
const_iterator begin() const
Definition: helperlist.h:74
const GObject * gparent() const
Definition: helperlist.h:109
T_CppElement element_type
Definition: helperlist.h:50
Glib::List_ReverseIterator< iterator > reverse_iterator
Definition: helperlist.h:47
iterator end_() const
Definition: helperlist.h:116
const_iterator end() const
Definition: helperlist.h:75
virtual void erase(iterator start, iterator stop)
Definition: helperlist.h:58
GObject * gparent_
Definition: helperlist.h:118
size_type size() const
Definition: helperlist.h:66
reference front() const
Definition: helperlist.h:89
virtual void remove(const_reference)=0
const_reverse_iterator rend() const
Definition: helperlist.h:84
reference back() const
Definition: helperlist.h:91
reverse_iterator rend()
Definition: helperlist.h:78
HelperList(GObject *gp)
Definition: helperlist.h:33
Glib::List_ConstIterator< reverse_iterator > const_reverse_iterator
Definition: helperlist.h:48
virtual iterator erase(iterator)=0
size_type max_size()
Definition: helperlist.h:68
Glib::List_ConstIterator< iterator > const_iterator
Definition: helperlist.h:46
virtual ~HelperList() noexcept
Definition: helperlist.h:39
std::size_t size_type
Definition: helperlist.h:53
GObject * gparent()
Definition: helperlist.h:108
PBD::PropertyDescriptor< timepos_t > start