70 lines
		
	
	
		
			1.4 KiB
		
	
	
	
		
			C++
		
	
	
	
	
	
			
		
		
	
	
			70 lines
		
	
	
		
			1.4 KiB
		
	
	
	
		
			C++
		
	
	
	
	
	
#include "refl/refl.h"
 | 
						|
namespace refl {
 | 
						|
	template<typename T>
 | 
						|
	void malloc_list(T*& ptr, int count) {
 | 
						|
		ptr = (T*)malloc(count * sizeof(T));
 | 
						|
		for (size_t i = 0; i < count; i++)
 | 
						|
		{
 | 
						|
			std::construct_at(ptr + i);
 | 
						|
		}
 | 
						|
	}
 | 
						|
	template<typename T>
 | 
						|
	class parray {
 | 
						|
	protected:
 | 
						|
		const UClass* m_cls;
 | 
						|
		T* m_ptr;
 | 
						|
		int m_count;
 | 
						|
	public:
 | 
						|
		template<typename C>
 | 
						|
		requires std::is_base_of_v<T, C>
 | 
						|
		parray(std::vector<C>& vec) : m_cls(&TypeInfo<C>::StaticClass){
 | 
						|
			m_count = vec.size();
 | 
						|
			if (m_count > 0) {
 | 
						|
				malloc_list(m_ptr, m_count);
 | 
						|
				std::move(vec.begin(), vec.end(), m_ptr);
 | 
						|
			}
 | 
						|
		}
 | 
						|
		parray(parray<T>& parr) : m_cls(parr.m_cls)
 | 
						|
			, m_ptr(parr.data()), m_count(parr.size()) {
 | 
						|
			parr.reset();
 | 
						|
		}
 | 
						|
		~parray() {
 | 
						|
			if (!m_count || !m_cls)
 | 
						|
				return;
 | 
						|
			auto dest = m_cls->vtable.DestObject;
 | 
						|
			if (dest) {
 | 
						|
				for (int i = 0; i < m_count; i++) {
 | 
						|
					dest((char*)m_ptr + (i * m_cls->size));
 | 
						|
				}
 | 
						|
			}
 | 
						|
			m_count = 0;
 | 
						|
			m_ptr = nullptr;
 | 
						|
		}
 | 
						|
		T* at(int i)noexcept {
 | 
						|
			if(i < m_count)
 | 
						|
				return (T*)((char*)m_ptr + (i * m_cls->size));
 | 
						|
			return nullptr;
 | 
						|
		}
 | 
						|
		T* data() noexcept{
 | 
						|
			return m_ptr;
 | 
						|
		}
 | 
						|
		void reset() noexcept {
 | 
						|
			m_ptr = nullptr;
 | 
						|
			m_count = 0;
 | 
						|
		}
 | 
						|
		int size() const noexcept {
 | 
						|
			return m_count;
 | 
						|
		}
 | 
						|
		int capicty() const noexcept {
 | 
						|
			return m_count * m_cls->size;
 | 
						|
		}
 | 
						|
		const UClass* uclass()const noexcept {
 | 
						|
			return m_cls;
 | 
						|
		}
 | 
						|
	};
 | 
						|
	template<typename T, typename C>
 | 
						|
	parray<T> ToParray(std::vector<C>& vec){
 | 
						|
		return parray<T>{vec};
 | 
						|
	}
 | 
						|
}
 |