/* 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 "support/Arrays.h" #include "atn/SingletonPredictionContext.h" #include "atn/ArrayPredictionContext.h" using namespace antlr4::atn; ArrayPredictionContext::ArrayPredictionContext(Ref const& a) : ArrayPredictionContext({ a->parent }, { a->returnState }) { } ArrayPredictionContext::ArrayPredictionContext(std::vector> const& parents_, std::vector const& returnStates) : PredictionContext(calculateHashCode(parents_, returnStates)), parents(parents_), returnStates(returnStates) { assert(parents.size() > 0); assert(returnStates.size() > 0); } ArrayPredictionContext::~ArrayPredictionContext() { } bool ArrayPredictionContext::isEmpty() const { // Since EMPTY_RETURN_STATE can only appear in the last position, we don't need to verify that size == 1. return returnStates[0] == EMPTY_RETURN_STATE; } size_t ArrayPredictionContext::size() const { return returnStates.size(); } Ref ArrayPredictionContext::getParent(size_t index) const { return parents[index]; } size_t ArrayPredictionContext::getReturnState(size_t index) const { return returnStates[index]; } bool ArrayPredictionContext::operator == (PredictionContext const& o) const { if (this == &o) { return true; } const ArrayPredictionContext *other = dynamic_cast(&o); if (other == nullptr || hashCode() != other->hashCode()) { return false; // can't be same if hash is different } return antlrcpp::Arrays::equals(returnStates, other->returnStates) && antlrcpp::Arrays::equals(parents, other->parents); } std::string ArrayPredictionContext::toString() const { if (isEmpty()) { return "[]"; } std::stringstream ss; ss << "["; for (size_t i = 0; i < returnStates.size(); i++) { if (i > 0) { ss << ", "; } if (returnStates[i] == EMPTY_RETURN_STATE) { ss << "$"; continue; } ss << returnStates[i]; if (parents[i] != nullptr) { ss << " " << parents[i]->toString(); } else { ss << "nul"; } } ss << "]"; return ss.str(); }