#pragma once #include #include #include #include namespace DFA { class DFAGraph { public: class Vertex { public: Vertex(DFAGraph* 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); void SetOwner(DFAGraph* owner); void SetFinal(bool status); void SetStart(bool status); private: DFAGraph* owner_; std::map transitions_; std::map back_transitions_; size_t number_; bool is_final_ = false; bool is_start_ = false; friend class DFAGraph; }; DFAGraph() = default; DFAGraph(const DFAGraph&) = delete; DFAGraph(DFAGraph&&); DFAGraph& operator=(const DFAGraph&) = delete; DFAGraph& operator=(DFAGraph&&); size_t AddNewVertex(); void AddFinalVertex(size_t number); void SetStartVertex(size_t number); void RemoveVertex(size_t number); void RemoveFinalVertex(size_t number); void RemoveStartVertex(size_t number); Vertex& GetVertex(size_t number); bool NotExistVertex(size_t number); size_t GetCountVertexes() const; size_t GetReallyCountVertexes() const; const std::vector& GetFinalVertexes() const; size_t GetStartVertex() const; void Print() const; bool Accepted(const std::string&) const; void CreateDotFile(const std::string& filename) const; private: size_t count_vertexes_ = 0; std::map vertexes_; std::vector final_vertexes_; size_t start_vertex_ = -1; }; }