﻿/* 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/ATNDeserializationOptions.h"

using namespace antlr4::atn;

const ATNDeserializationOptions ATNDeserializationOptions::defaultOptions;

ATNDeserializationOptions::ATNDeserializationOptions() {
  InitializeInstanceFields();
}

ATNDeserializationOptions::ATNDeserializationOptions(ATNDeserializationOptions *options) : ATNDeserializationOptions() {
  this->verifyATN = options->verifyATN;
  this->generateRuleBypassTransitions = options->generateRuleBypassTransitions;
}

ATNDeserializationOptions::~ATNDeserializationOptions() {
}

const ATNDeserializationOptions& ATNDeserializationOptions::getDefaultOptions() {
  return defaultOptions;
}

bool ATNDeserializationOptions::isReadOnly() {
  return readOnly;
}

void ATNDeserializationOptions::makeReadOnly() {
  readOnly = true;
}

bool ATNDeserializationOptions::isVerifyATN() {
  return verifyATN;
}

void ATNDeserializationOptions::setVerifyATN(bool verify) {
  throwIfReadOnly();
  verifyATN = verify;
}

bool ATNDeserializationOptions::isGenerateRuleBypassTransitions() {
  return generateRuleBypassTransitions;
}

void ATNDeserializationOptions::setGenerateRuleBypassTransitions(bool generate) {
  throwIfReadOnly();
  generateRuleBypassTransitions = generate;
}

void ATNDeserializationOptions::throwIfReadOnly() {
  if (isReadOnly()) {
    throw "The object is read only.";
  }
}

void ATNDeserializationOptions::InitializeInstanceFields() {
  readOnly = false;
  verifyATN = true;
  generateRuleBypassTransitions = false;
}
