#pragma once #include "defines.h" #include #include class DataPack { public: std::string Id; std::vector Value; std::vector Child = std::vector(); DataPack& operator[](int index); DataPack& operator[](std::string id); __declspec(property (put = SetCount, get = GetCount)) int Count; int GetCount(); void SetCount(int value); void operator=(const std::initializer_list data); void operator=(const std::initializer_list* data); template void operator=(T data) { this->Value.resize(sizeof(T)); memcpy(this->Value.data(), &data, sizeof(T)); } template void operator=(std::vector data) { this->Value.resize(data.size() * sizeof(T)); memcpy(this->Value.data(), data.data(), data.size() * sizeof(T)); } template void operator=(std::initializer_list data) { this->Value.resize(data.size()); memcpy(this->Value.data(), data.begin(), data.size() * sizeof(T)); } template T operator=(DataPack data) { T result = T(); memcpy(&result, data.Value.data(), sizeof(T)); return result; } void operator=(const char* data); void operator=(const wchar_t* data); void operator=(char* data); void operator=(wchar_t* data); void operator=(std::string data); void operator=(std::wstring data); template DataPack(T data) { this->Id = ""; this->Value.resize(sizeof(T)); memcpy(this->Value.data(), &data, sizeof(T)); } template DataPack(std::string id, T data) { this->Id = id; this->Value.resize(sizeof(T)); memcpy(this->Value.data(), &data, sizeof(T)); } DataPack(); DataPack(const char* key); DataPack(const uint8_t* data, int data_len); DataPack(std::string id, uint8_t* data, int len); DataPack(std::vector data); DataPack(std::initializer_list data); DataPack(std::string id, std::string data); DataPack(std::string id, std::wstring data); DataPack(std::string id, char* data); DataPack(std::string id, const char* data); DataPack(std::string id, wchar_t* data); DataPack(std::string id, const wchar_t* data); void Add(DataPack val); template DataPack& Add(std::string key, T val) { this->Child.push_back(DataPack(key, val)); return this->Child[this->Child.size() - 1]; } template DataPack& Add(T val) { this->Child.push_back(DataPack("", val)); return this->Child[this->Child.size() - 1]; } template T convert() { return *(T*)this->Value.data(); } template void convert(T& output) { output = *(T*)this->Value.data(); } template void convert(T* output) { *output = *(T*)this->Value.data(); } bool ContainsKsy(std::string key) { for (auto child : this->Child) { if (child.Id == key) return true; } return false; } void RemoveAt(int index); std::vector GetBytes(); void clear(); int size(); };