55 lines
1.5 KiB
C++
55 lines
1.5 KiB
C++
#ifndef __ARRAY_INCLUDE_H
|
|
#define __ARRAY_INCLUDE_H
|
|
|
|
#include "user/lib/Iterator.h"
|
|
#include <cstddef>
|
|
#include <utility>
|
|
|
|
namespace bse {
|
|
|
|
template<typename T, const std::size_t N>
|
|
class array {
|
|
public:
|
|
using iterator = ContinuousIterator<T>;
|
|
|
|
private:
|
|
T buf[N];
|
|
|
|
public:
|
|
array() {}; // If i write default something like bse::array<int, 10> arr; is not initialized...
|
|
|
|
iterator begin() { return iterator(&buf[0]); }
|
|
iterator begin() const { return iterator(&buf[0]); }
|
|
iterator end() { return iterator(&buf[N]); }
|
|
iterator end() const { return iterator(&buf[N]); }
|
|
|
|
T& operator[](std::size_t i) { return this->buf[i]; }
|
|
constexpr const T& operator[](std::size_t i) const { return this->buf[i]; }
|
|
|
|
T* operator&() { return &buf[0]; } // Not standard, I don't know yet if this will turn out to be a bad idea
|
|
const T* operator&() const { return &buf[0]; }
|
|
|
|
void swap(array<T, N>& other) {
|
|
for (std::size_t i = 0; i < N; ++i) {
|
|
std::swap(this->buf[i], other[i]);
|
|
}
|
|
}
|
|
|
|
// Array& other has to have size n:
|
|
// arr1.swap_n<5>(arr2) => arr2 has size 5, arr1 has size >= 5
|
|
template<std::size_t n>
|
|
void swap_n(array<T, n>& other) {
|
|
for (std::size_t i = 0; i < n; ++i) {
|
|
std::swap(this->buf[i], other[i]);
|
|
}
|
|
}
|
|
|
|
constexpr std::size_t size() const {
|
|
return N;
|
|
}
|
|
};
|
|
|
|
} // namespace bse
|
|
|
|
#endif
|