#ifndef TOKEN_H #define TOKEN_H #include #include #include "data/graph/token_component/TokenComponent.h" #include "utility/types.h" class Token { public: static void resetNextId(); Token(); 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); template ComponentType* getComponent() const; template std::shared_ptr removeComponent(); protected: Token(const Token& other); void addComponent(std::shared_ptr component); void copyComponentsFrom(const Token& other); private: static Id s_nextId; void operator=(const Token&); const Id m_id; // own id std::vector m_locationIds; std::vector> m_components; }; template ComponentType* Token::getComponent() const { for (std::shared_ptr component: m_components) { if (typeid(ComponentType) == typeid(*(component.get()))) { 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]; if (typeid(ComponentType) == typeid(*(component.get()))) { m_components.erase(m_components.begin() + i); return std::dynamic_pointer_cast(component); } } return nullptr; } #endif // TOKEN_H