#pragma once #include #include #include #include namespace NFA { class NFATree { public: class Vertex { public: Vertex(); bool IsFinal() const; bool IsStart() const; size_t GetNumber() const; std::multimap transitions; private: Vertex(bool is_final, bool is_start); size_t number_; bool is_final_ = false; bool is_start_ = false; friend class NFATree; }; NFATree() = default; NFATree(const NFATree&) = delete; NFATree(NFATree&&) = default; NFATree& operator=(const NFATree&) = delete; NFATree& operator=(NFATree&&) = default; size_t AddNewVertex(); void AddFinalVertex(size_t number); void AddStartVertex(size_t number); void RemoveVertex(size_t number); void RemoveFinalVertex(size_t number); void RemoveStartVertex(size_t number); void Composition(NFATree&&, std::vector start_vertexes, std::vector final_vertexes); std::shared_ptr GetVertex(size_t number); size_t GetCountVertexes() const; const std::vector& GetFinalVertexes() const; const std::vector& GetStartVertexes() const; void Print() const; private: size_t count_vertexes_ = 0; std::map> vertexes_; std::vector final_vertexes_; std::vector start_vertexes_; }; }