/* 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/EmptyPredictionContext.h" #include "atn/SingletonPredictionContext.h" using namespace antlr4::atn; SingletonPredictionContext::SingletonPredictionContext(Ref const& parent, size_t returnState) : PredictionContext(parent ? calculateHashCode(parent, returnState) : calculateEmptyHashCode()), parent(parent), returnState(returnState) { assert(returnState != ATNState::INVALID_STATE_NUMBER); } SingletonPredictionContext::~SingletonPredictionContext() { } Ref SingletonPredictionContext::create(Ref const& parent, size_t returnState) { if (returnState == EMPTY_RETURN_STATE && parent) { // someone can pass in the bits of an array ctx that mean $ return std::dynamic_pointer_cast(EMPTY); } return std::make_shared(parent, returnState); } size_t SingletonPredictionContext::size() const { return 1; } Ref SingletonPredictionContext::getParent(size_t index) const { assert(index == 0); ((void)(index)); // Make Release build happy. return parent; } size_t SingletonPredictionContext::getReturnState(size_t index) const { assert(index == 0); ((void)(index)); // Make Release build happy. return returnState; } bool SingletonPredictionContext::operator == (const PredictionContext &o) const { if (this == &o) { return true; } const SingletonPredictionContext *other = dynamic_cast(&o); if (other == nullptr) { return false; } if (this->hashCode() != other->hashCode()) { return false; // can't be same if hash is different } if (returnState != other->returnState) return false; if (!parent && !other->parent) return true; if (!parent || !other->parent) return false; return *parent == *other->parent; } std::string SingletonPredictionContext::toString() const { //std::string up = !parent.expired() ? parent.lock()->toString() : ""; std::string up = parent != nullptr ? parent->toString() : ""; if (up.length() == 0) { if (returnState == EMPTY_RETURN_STATE) { return "$"; } return std::to_string(returnState); } return std::to_string(returnState) + " " + up; }