#pragma once #include #include #include #include namespace NFA { class NFATree { public: class Vertex { public: Vertex(NFATree* 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(NFATree* owner); void SetFinal(bool status); void SetStart(bool status); private: NFATree* owner_; std::map> transitions_; std::map> back_transitions_; size_t number_; bool is_final_ = false; bool is_start_ = false; friend class NFATree; }; NFATree() = default; NFATree(const NFATree&) = delete; NFATree(NFATree&&); NFATree& operator=(const NFATree&) = delete; NFATree& operator=(NFATree&&); 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_; }; }