#ifndef Component_h__ #define Component_h__ #include "../Common.h" #include "ComponentInfo.h" struct Component { Component(const unsigned int entityID, const ComponentInfo* componentInfo, char* data) : EntityID(entityID) , Info(componentInfo) , Data(data) { } const unsigned int EntityID; const ComponentInfo* Info; 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, T& value) { Property(name)=value; } template void SetProperty(std::string name, const 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 Component; private: SubscriptProxy(Component* component, std::string& propertyName) : m_Component(component) , m_PropertyName(propertyName) { } Component* 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); } 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