zengine-old/engine/3rdparty/zlib/include/refl/std/sarray.h

71 lines
2.0 KiB
C
Raw Normal View History

2024-04-14 22:45:08 +08:00
#pragma once
2024-04-15 19:53:39 +08:00
#include <vector>
2024-04-14 22:45:08 +08:00
#include <concepts>
namespace refl {
template<typename T>
class sarray {
protected:
const T* m_ptr;
int m_size;
public:
2024-04-15 19:53:39 +08:00
constexpr sarray(const std::vector<T>& list) : m_ptr(&list.front()), m_size(list.size()) {}
2024-04-14 22:45:08 +08:00
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()){}
2024-04-15 19:53:39 +08:00
const T* get() const noexcept {
2024-04-14 22:45:08 +08:00
return m_ptr;
}
2024-04-15 19:53:39 +08:00
const T* last()const noexcept {
if (m_size > 0)
return m_ptr + m_size - 1;
return m_ptr;
}
const T* at(int i) const noexcept {
2024-04-14 22:45:08 +08:00
if (i < m_size) {
return m_ptr + i;
}
return nullptr;
}
2024-04-15 19:53:39 +08:00
constexpr int size() const noexcept {
2024-04-14 22:45:08 +08:00
return m_size;
}
2024-04-15 19:53:39 +08:00
constexpr auto begin()const noexcept {
2024-04-14 22:45:08 +08:00
return iterator{ m_ptr };
}
2024-04-15 19:53:39 +08:00
constexpr auto end() const noexcept {
2024-04-14 22:45:08 +08:00
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
2024-04-15 19:53:39 +08:00
constexpr iterator& operator++() noexcept{
2024-04-14 22:45:08 +08:00
++ptr;
return *this;
}
2024-04-15 19:53:39 +08:00
//这里其实是--it,而不是it--
constexpr iterator& operator--(int) noexcept {
--ptr;
return *this;
}
constexpr const T* operator->() const noexcept {
return ptr;
}
2024-04-14 22:45:08 +08:00
// Overload * to dereference iterator
2024-04-15 19:53:39 +08:00
constexpr const T& operator*() const noexcept {
2024-04-14 22:45:08 +08:00
return *ptr;
}
// Overload != to compare iterators
2024-04-15 19:53:39 +08:00
constexpr bool operator!=(const iterator& other) const noexcept {
2024-04-14 22:45:08 +08:00
return ptr != other.ptr;
}
};
};
}