mirror of https://github.com/AxioDL/metaforce.git
73 lines
2.3 KiB
C++
73 lines
2.3 KiB
C++
#pragma once
|
|
|
|
#include <array>
|
|
#include <vector>
|
|
#include <type_traits>
|
|
|
|
#include "RetroTypes.hpp"
|
|
|
|
namespace aurora {
|
|
template <typename T>
|
|
class ArrayRef {
|
|
public:
|
|
using value_type = std::remove_cvref_t<T>;
|
|
using pointer = value_type*;
|
|
using const_pointer = const value_type*;
|
|
using reference = value_type&;
|
|
using const_reference = const value_type&;
|
|
using iterator = const_pointer;
|
|
using const_iterator = const_pointer;
|
|
using reverse_iterator = std::reverse_iterator<iterator>;
|
|
using const_reverse_iterator = std::reverse_iterator<const_iterator>;
|
|
using size_type = std::size_t;
|
|
using difference_type = std::ptrdiff_t;
|
|
|
|
ArrayRef() = default;
|
|
explicit ArrayRef(const T& one) : ptr(&one), length(1) {}
|
|
ArrayRef(const T* data, size_t length) : ptr(data), length(length) {}
|
|
ArrayRef(const T* begin, const T* end) : ptr(begin), length(end - begin) {}
|
|
template <size_t N>
|
|
constexpr ArrayRef(const T (&arr)[N]) : ptr(arr), length(N) {}
|
|
template <size_t N>
|
|
constexpr ArrayRef(const std::array<T, N>& arr) : ptr(arr.data()), length(arr.size()) {}
|
|
ArrayRef(const std::vector<T>& vec) : ptr(vec.data()), length(vec.size()) {}
|
|
template <size_t N>
|
|
ArrayRef(const rstl::reserved_vector<T, N>& vec) : ptr(vec.data()), length(vec.size()) {}
|
|
|
|
const T* data() const { return ptr; }
|
|
size_t size() const { return length; }
|
|
bool empty() const { return length == 0; }
|
|
|
|
const T& front() const {
|
|
assert(!empty());
|
|
return ptr[0];
|
|
}
|
|
const T& back() const {
|
|
assert(!empty());
|
|
return ptr[length - 1];
|
|
}
|
|
const T& operator[](size_t i) const {
|
|
assert(i < length && "Invalid index!");
|
|
return ptr[i];
|
|
}
|
|
|
|
iterator begin() const { return ptr; }
|
|
iterator end() const { return ptr + length; }
|
|
|
|
reverse_iterator rbegin() const { return reverse_iterator(end()); }
|
|
reverse_iterator rend() const { return reverse_iterator(begin()); }
|
|
|
|
/// Disallow accidental assignment from a temporary.
|
|
template <typename U>
|
|
std::enable_if_t<std::is_same<U, T>::value, ArrayRef<T>>& operator=(U&& Temporary) = delete;
|
|
|
|
/// Disallow accidental assignment from a temporary.
|
|
template <typename U>
|
|
std::enable_if_t<std::is_same<U, T>::value, ArrayRef<T>>& operator=(std::initializer_list<U>) = delete;
|
|
|
|
private:
|
|
const T* ptr = nullptr;
|
|
size_t length = 0;
|
|
};
|
|
} // namespace aurora
|