57 lines
1.4 KiB
C++
57 lines
1.4 KiB
C++
#pragma once
|
|
#include <concepts>
|
|
namespace refl {
|
|
template<typename T>
|
|
class sarray {
|
|
protected:
|
|
const T* m_ptr;
|
|
int m_size;
|
|
public:
|
|
constexpr sarray() :m_ptr(nullptr), m_size(0) {}
|
|
constexpr sarray(std::initializer_list<T> list) : m_ptr(list.begin()), m_size(list.size()) {}
|
|
template<int N>
|
|
constexpr sarray(const std::array<T, N>& arr):m_ptr(&arr[0]), m_size(arr.size()){}
|
|
const T* get() const{
|
|
return m_ptr;
|
|
}
|
|
const T* at(int i) const {
|
|
if (i < m_size) {
|
|
return m_ptr + i;
|
|
}
|
|
return nullptr;
|
|
}
|
|
constexpr int size() const {
|
|
return m_size;
|
|
}
|
|
constexpr const auto begin()const {
|
|
return iterator{ m_ptr };
|
|
}
|
|
constexpr const auto end() const {
|
|
return iterator{ m_ptr + m_size};
|
|
}
|
|
// Iterator class
|
|
class iterator {
|
|
private:
|
|
const T* ptr;
|
|
|
|
public:
|
|
constexpr iterator(const T* p) : ptr(p) {}
|
|
|
|
// Overload ++ to move to next element
|
|
constexpr iterator& operator++() {
|
|
++ptr;
|
|
return *this;
|
|
}
|
|
|
|
// Overload * to dereference iterator
|
|
constexpr const T& operator*() const {
|
|
return *ptr;
|
|
}
|
|
|
|
// Overload != to compare iterators
|
|
constexpr bool operator!=(const iterator& other) const {
|
|
return ptr != other.ptr;
|
|
}
|
|
};
|
|
};
|
|
} |