#ifndef TOKEN_H #define TOKEN_H #include #include #include #include "TokenComponent.h" #include "types.h" class Token { public: explicit Token(Id id); virtual ~Token(); Id getId() const; virtual bool isNode() const = 0; virtual bool isEdge() const = 0; const std::vector& getLocationIds() const; void addLocationId(Id locationId); void removeLocationId(Id locationId); void addComponent(std::shared_ptr component); template ComponentType* getComponent() const; template std::shared_ptr removeComponent(); // Logging. virtual std::wstring getReadableTypeString() const = 0; protected: Token(const Token& other); void copyComponentsFrom(const Token& other); private: void operator=(const Token&); const Id m_id; // own id std::vector m_locationIds; std::vector> m_components; }; template ComponentType* Token::getComponent() const { for (const std::shared_ptr& component: m_components) { TokenComponent* componentPtr = component.get(); if (typeid(ComponentType) == typeid(*componentPtr)) { return dynamic_cast(component.get()); } } return nullptr; } template std::shared_ptr Token::removeComponent() { for (size_t i = 0; i < m_components.size(); i++) { std::shared_ptr component = m_components[i]; TokenComponent* componentPtr = component.get(); if (typeid(ComponentType) == typeid(*componentPtr)) { m_components.erase(m_components.begin() + i); return std::dynamic_pointer_cast(component); } } return nullptr; } #endif // TOKEN_H