/* -*- coding: utf-8 -*-
 *
 * Copyright 2022 IBM RESEARCH. All Rights Reserved.
 *
 * Licensed under the Apache License, Version 2.0 (the "License");
 * you may not use this file except in compliance with the License.
 * You may obtain a copy of the License at
 *
 *     http://www.apache.org/licenses/LICENSE-2.0
 *
 * Unless required by applicable law or agreed to in writing, software
 * distributed under the License is distributed on an "AS IS" BASIS,
 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
 * See the License for the specific language governing permissions and
 * limitations under the License.
 * =============================================================================
 */

#ifndef __QASM_FEATURE_TESTER_H
#define __QASM_FEATURE_TESTER_H

#include <qasm/Frontend/QasmDiagnosticEmitter.h>

#include <set>
#include <string>

namespace QASM {

class ASTBase;

class QasmFeatureTester {
private:
  using DiagLevel = QasmDiagnosticEmitter::DiagLevel;

private:
  static QasmFeatureTester QFT;
  static const std::set<std::string> FS2;
  static const std::set<std::string> FS3;

private:
  QasmFeatureTester() = default;

public:
  ~QasmFeatureTester() = default;

  static QasmFeatureTester &Instance() { return QFT; }

  void ValidateFeature(const std::string &Exp);
  void ValidateFeature(int Token);
  void EmitDiagnostic(ASTLocation Loc, const std::string &Msg,
                      DiagLevel DL = DiagLevel::Status);
};

} // namespace QASM

#endif // __QASM_FEATURE_TESTS_H
