59 lines
		
	
	
		
			1.2 KiB
		
	
	
	
		
			C
		
	
	
	
	
	
		
		
			
		
	
	
			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++;
							 | 
						||
| 
								 | 
							
									};
							 | 
						||
| 
								 | 
							
								};
							 |