zengine-old/engine/3rdparty/ylt/include/parray.h
2024-03-30 17:55:00 +08:00

59 lines
1.2 KiB
C++

#pragma once
#include <concepts>
template<typename P>
requires requires {typename P::UClass;}
class parray {
using UClass = P::UClass;
protected:
uint32_t t_size;
uint32_t m_size;
uint32_t m_head{ 0 };
char* m_buf;
UClass* u_class;
public:
~parray() {
if (m_buf) {
free(m_buf);
}
}
parray(uint32_t tsize, uint32_t size, UClass* uclass)
: t_size(tsize), m_buf((char*)malloc(tsize* size)), m_size(size),u_class(uclass) {}
parray(parray& other) noexcept {
m_size = other.m_size;
m_head = other.m_head;
m_buf = other.m_buf;
other.m_buf = nullptr;
}
void* data() {
return m_buf;
}
uint32_t size() {
return m_head;
}
uint32_t data_size() {
return t_size * m_head;
};
P* at(int i){
if (i >= m_head) {
return nullptr;
}
return (P*)(m_buf + i * t_size);
};
};
template<typename P, typename T>
requires std::is_base_of<P, T>::value && requires {typename P::UClass; }
class ptarray : public parray<P>{
using parray<P>::m_head;
using parray<P>::m_size;
using parray<P>::m_buf;
using parray<P>::t_size;
public:
ptarray(uint32_t size = 1) : parray<P>(sizeof(T), size, new T::UClass()) {}
void push_back(T& t) {
if (m_head >= m_size) {
return;
}
*(T*)(m_buf + m_head * t_size) = t;
m_head++;
};
};