pianod2
multisource multiuser scriptable networked music player
enumeratedarray.h
Go to the documentation of this file.
1 
11 #pragma once
12 
13 #include <config.h>
14 
15 #include <cassert>
16 
17 #include <type_traits>
18 
30 template <typename Enumeration, typename ValueType,
31  Enumeration size_element = Enumeration::Count,
32  int enum_size = static_cast <int> (size_element)>
35  ValueType underlying [enum_size];
36 public:
37  using value_type = ValueType;
38  using enumeration_type = Enumeration;
41  /* If the value type is a class, it will initialize itself. Use template
42  magic to avoid reinitializing it, but do initialize other data types. */
44  for (int i = 0; i < enum_size; i++) {
45  underlying [i] = ValueType {};
46  }
47  }
48  }
50  explicit EnumeratedArray (ValueType initial) {
51  for (int i = 0; i < enum_size; i++) {
52  underlying [i] = initial;
53  }
54  }
56  inline ValueType &operator[] (const Enumeration index) noexcept {
57  assert (static_cast <int> (index) >= 0 && static_cast <int> (index) < enum_size);
58  return underlying [static_cast <const int> (index)];
59  }
61  inline const ValueType &operator[] (const Enumeration index) const noexcept {
62  assert (static_cast <int> (index) >= 0 && static_cast <int> (index) < enum_size);
63  return underlying [static_cast <const int> (index)];
64  }
65 
66  template <class IteratedType>
67  class eaiterator {
68  friend class EnumeratedArray;
69  IteratedType *start = nullptr;
70  IteratedType *item = nullptr;
71  public:
72  inline eaiterator (IteratedType *s, IteratedType *i) noexcept: start (s), item (i) {};
73  public:
74  eaiterator() noexcept = default;
75  eaiterator (const eaiterator<IteratedType> &) noexcept = default;
76  eaiterator &operator=(const eaiterator<IteratedType> &) noexcept = default;
77  inline IteratedType &operator*() const noexcept {
78  assert (item);
79  return *item;
80  }
81  inline IteratedType *operator->() const noexcept {
82  assert (item);
83  return item;
84  }
86  assert (item);
87  item++;
88  return *this;
89  }
90  inline eaiterator<IteratedType> operator++ (int) noexcept {
91  assert (item);
92  eaiterator<IteratedType> prior = *this;
93  item++;
94  return prior;
95  }
96  inline bool operator!=(const eaiterator<IteratedType> &compare) const noexcept {
97  assert (item);
98  return item != compare.item;
99  }
100  inline bool operator==(const eaiterator<IteratedType> &compare) const noexcept {
101  assert (item);
102  return item == compare.item;
103  }
105  inline Enumeration key() const noexcept {
106  return static_cast <Enumeration> (item - start);
107  }
108  };
111 
112  inline iterator begin () noexcept {
113  return iterator (underlying, &underlying [0]);
114  }
115  inline iterator end () noexcept {
116  return iterator (underlying, &underlying [enum_size]);
117  }
118 
119  inline const_iterator begin () const noexcept {
120  return const_iterator (&underlying [0], &underlying [0]);
121  }
122  inline const_iterator end () const noexcept {
123  return const_iterator (&underlying [0], &underlying [enum_size]);
124  }
125 };
126 
Definition: enumeratedarray.h:67
IteratedType * operator->() const noexcept
Definition: enumeratedarray.h:81
IteratedType * item
Definition: enumeratedarray.h:70
bool operator==(const eaiterator< IteratedType > &compare) const noexcept
Definition: enumeratedarray.h:100
bool operator!=(const eaiterator< IteratedType > &compare) const noexcept
Definition: enumeratedarray.h:96
IteratedType * start
Definition: enumeratedarray.h:69
Enumeration key() const noexcept
Return the enumeration value for the current element.
Definition: enumeratedarray.h:105
eaiterator(IteratedType *s, IteratedType *i) noexcept
Definition: enumeratedarray.h:72
eaiterator() noexcept=default
An array indexed by an enumeration rather than an integer of some sort.
Definition: enumeratedarray.h:33
const_iterator end() const noexcept
Definition: enumeratedarray.h:122
EnumeratedArray()
Initialize an enumerated array. Set values to value type's default.
Definition: enumeratedarray.h:40
eaiterator< ValueType > iterator
Definition: enumeratedarray.h:109
eaiterator< const ValueType > const_iterator
Definition: enumeratedarray.h:110
iterator begin() noexcept
Definition: enumeratedarray.h:112
std::conditional< std::is_pod< ValueType >::value, std::true_type, std::false_type > needs_initialization
Definition: enumeratedarray.h:34
iterator end() noexcept
Definition: enumeratedarray.h:115
EnumeratedArray(ValueType initial)
Initialize an enumerated array. Set values to a specific initial value.
Definition: enumeratedarray.h:50
Enumeration enumeration_type
Definition: enumeratedarray.h:38
ValueType value_type
Definition: enumeratedarray.h:37
ValueType underlying[enum_size]
Definition: enumeratedarray.h:35
const_iterator begin() const noexcept
Definition: enumeratedarray.h:119
uint32_t value
Definition: audiooutput.cpp:68
static Privilege operator++(Privilege &p, int)
Postfix increment operator to allow Privilege iteration.
Definition: user.h:43