#pragma once #include #include #include #include namespace NFA { class NFAGraph { public: class Vertex { public: Vertex(NFAGraph* owner); bool IsFinal() const; bool IsStart() const; size_t GetNumber() const; const std::map>& GetTransitions() const; const std::map>& GetBackTransitions() const; void AddEdge(char, size_t); void RemoveEdge(char, size_t); void SetOwner(NFAGraph* owner); void SetFinal(bool status); void SetStart(bool status); private: NFAGraph* owner_; std::map> transitions_; std::map> back_transitions_; size_t number_; bool is_final_ = false; bool is_start_ = false; friend class NFAGraph; }; NFAGraph() = default; NFAGraph(const NFAGraph&) = delete; NFAGraph(NFAGraph&&); NFAGraph& operator=(const NFAGraph&) = delete; NFAGraph& operator=(NFAGraph&&); 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(NFAGraph&&, 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; void CreateDotFile(const std::string& filename) const; private: size_t count_vertexes_ = 0; std::map> vertexes_; std::vector final_vertexes_; std::vector start_vertexes_; }; }