formalang/include/DFA/DFAGraph.hpp
2021-10-11 01:13:50 +03:00

72 lines
1.7 KiB
C++

#pragma once
#include <map>
#include <vector>
#include <set>
#include <memory>
namespace DFA {
class DFAGraph {
public:
class Vertex {
public:
Vertex(DFAGraph* owner);
bool IsFinal() const;
bool IsStart() const;
size_t GetNumber() const;
const std::map<char, size_t>& GetTransitions() const;
const std::map<char, size_t>& 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<char, size_t> transitions_;
std::map<char, size_t> 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<size_t>& 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<size_t, Vertex> vertexes_;
std::vector<size_t> final_vertexes_;
size_t start_vertex_ = -1;
};
}