--- /dev/null
+/* Copyright (c) 2012-2017 The ANTLR Project. All rights reserved.
+ * Use of this file is governed by the BSD 3-clause license that
+ * can be found in the LICENSE.txt file in the project root.
+ */
+
+#include "atn/ATNConfigSet.h"
+#include "atn/SemanticContext.h"
+#include "atn/ATNConfig.h"
+#include "misc/MurmurHash.h"
+
+#include "dfa/DFAState.h"
+
+using namespace antlr4::dfa;
+using namespace antlr4::atn;
+
+DFAState::PredPrediction::PredPrediction(const Ref<SemanticContext> &pred, int alt) : pred(pred) {
+ InitializeInstanceFields();
+ this->alt = alt;
+}
+
+DFAState::PredPrediction::~PredPrediction() {
+}
+
+std::string DFAState::PredPrediction::toString() {
+ return std::string("(") + pred->toString() + ", " + std::to_string(alt) + ")";
+}
+
+void DFAState::PredPrediction::InitializeInstanceFields() {
+ alt = 0;
+}
+
+DFAState::DFAState() {
+ InitializeInstanceFields();
+}
+
+DFAState::DFAState(int state) : DFAState() {
+ stateNumber = state;
+}
+
+DFAState::DFAState(std::unique_ptr<ATNConfigSet> configs_) : DFAState() {
+ configs = std::move(configs_);
+}
+
+DFAState::~DFAState() {
+ for (auto *predicate : predicates) {
+ delete predicate;
+ }
+}
+
+std::set<size_t> DFAState::getAltSet() {
+ std::set<size_t> alts;
+ if (configs != nullptr) {
+ for (size_t i = 0; i < configs->size(); i++) {
+ alts.insert(configs->get(i)->alt);
+ }
+ }
+ return alts;
+}
+
+size_t DFAState::hashCode() const {
+ size_t hash = misc::MurmurHash::initialize(7);
+ hash = misc::MurmurHash::update(hash, configs->hashCode());
+ hash = misc::MurmurHash::finish(hash, 1);
+ return hash;
+}
+
+bool DFAState::operator == (const DFAState &o) const {
+ // compare set of ATN configurations in this set with other
+ if (this == &o) {
+ return true;
+ }
+
+ return *configs == *o.configs;
+}
+
+std::string DFAState::toString() {
+ std::stringstream ss;
+ ss << stateNumber;
+ if (configs) {
+ ss << ":" << configs->toString();
+ }
+ if (isAcceptState) {
+ ss << " => ";
+ if (!predicates.empty()) {
+ for (size_t i = 0; i < predicates.size(); i++) {
+ ss << predicates[i]->toString();
+ }
+ } else {
+ ss << prediction;
+ }
+ }
+ return ss.str();
+}
+
+void DFAState::InitializeInstanceFields() {
+ stateNumber = -1;
+ isAcceptState = false;
+ prediction = 0;
+ requiresFullContext = false;
+}