C++ API Reference RNBO: common/RNBO_Array.h Source File

RNBO: common/RNBO_Array.h Source File

1 #ifndef _RNBO_TUPLE_H_
2 #define _RNBO_TUPLE_H_
3 
4 #include "RNBO_List.h"
5 
6 namespace RNBO {
7 
11  template<class T, size_t N> class array {
12  public:
13 
14  array() {}
15 
16  template<typename... Ts> array(Ts ... args)
17  {
18  // since allocating an array of 0 length is invalid, we always allocate at least length 1
19  T values[sizeof...(args) + 1] = {static_cast<T>(args)...};
20  for (size_t i = 0; i < sizeof...(args) && i < N; i++) {
21  _values[i] = values[i];
22  }
23  }
24 
25  array(const listbase<T>& l) {
26  for (size_t i = 0; i < N && i < l.length; i++) {
27  _values[i] = l[i];
28  }
29  }
30 
31  // copy constructor
32  array(const array<T, N>& a)
33  {
34  for (size_t i = 0; i < N; i++) {
35  _values[i] = a._values[i];
36  }
37  }
38 
39  array<T, N>& operator=(const array<T, N>& a)
40  {
41  if (&a != this) {
42  for (size_t i = 0; i < N; i++) {
43  _values[i] = a._values[i];
44  }
45  }
46  return *this;
47  }
48 
49  constexpr size_t size() const { return N; }
50  constexpr bool empty() const { return size() == 0; }
51 
52  T& operator[](size_t n) {
53  if (n >= N) {
54  Platform::errorOrDefault(RuntimeError::OutOfRange, "array index out of range", false /*unused*/);
55  _dummy = {};
56  return _dummy;
57  }
58  return _values[n];
59  }
60  const T& operator[](size_t n) const {
61  if (n >= N) {
62  Platform::errorOrDefault(RuntimeError::OutOfRange, "array index out of range", false /*unused*/);
63  return _dummy;
64  }
65  return _values[n];
66  }
67 
68  operator listbase<T>() const {
69  listbase<T> tmp;
70  tmp.reserve(N);
71  for (size_t i = 0; i < N; i++) {
72  tmp.push(_values[i]);
73  }
74 
75  return tmp;
76  }
77 
78  private:
79  T _values[N ? N : 1] = {};
80  T _dummy = {};
81  };
82 
83 
84  template<typename T, size_t FIXED>
85  template<typename TA, size_t NA>
87  : length(NA, *this)
88  , _values(nullptr)
89  , _allocatedLength(FIXED)
90  {
91  allocate(length, false);
92  for (size_t i = 0; i < NA; i++) {
93  push(arr[i]);
94  }
95  }
96 
97 
98 } // namespace RNBO
99 
100 #endif // #ifndef _RNBO_TUPLE_H_