#ifndef ComponentWrapper_h__ #define ComponentWrapper_h__ #include "../Common.h" #include "EntityWrapper.h" #include "ComponentInfo.h" struct ComponentWrapper { ComponentWrapper(const ComponentInfo& componentInfo, char* data) : Info(componentInfo) , EntityID(*reinterpret_cast<::EntityID*>(data)) , Data(data + sizeof(EntityID)) { } const ComponentInfo& Info; const ::EntityID EntityID; char* Data; template T& Property(std::string name) { unsigned int offset = Info.FieldOffsets.at(name); return *reinterpret_cast(&Data[offset]); } template void SetProperty(std::string name, const T value) { Property(name) = value; } //template //void SetProperty(std::string name, T& value) { Property(name) = value; } // Specialization for string literals template void SetProperty(std::string name, const char(&value)[N]) { Property(name) = std::string(value); } struct SubscriptProxy { friend struct ComponentWrapper; private: SubscriptProxy(ComponentWrapper* component, std::string propertyName) : m_Component(component) , m_PropertyName(propertyName) { } ComponentWrapper* m_Component; std::string m_PropertyName; public: template operator T&() { return m_Component->Property(m_PropertyName); } template void operator=(const T val) { m_Component->SetProperty(m_PropertyName, val); } // TODO: Pass by reference and rvalue (universal reference?) //template //void operator=(T& val) { m_Component->SetProperty(m_PropertyName, val); } // Specialization for string literals template void operator=(const char(&val)[N]) { m_Component->SetProperty(m_PropertyName, val); } }; SubscriptProxy operator[](std::string propertyName) { return SubscriptProxy(this, propertyName); } }; #endif