//===- LoweringOptions.h ----------------------------------------*- C++ -*-===//
//
// Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.
// See https://llvm.org/LICENSE.txt for license information.
// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception
//
//===----------------------------------------------------------------------===//
///
/// \file
/// Options controlling lowering of front-end fragments to the FIR dialect
/// of MLIR
///
//===----------------------------------------------------------------------===//

#ifndef FLANG_LOWER_LOWERINGOPTIONS_H
#define FLANG_LOWER_LOWERINGOPTIONS_H

#include "flang/Support/MathOptionsBase.h"

namespace Fortran::lower {

class LoweringOptionsBase {
public:
#define LOWERINGOPT(Name, Bits, Default) unsigned Name : Bits;
#define ENUM_LOWERINGOPT(Name, Type, Bits, Default)
#include "flang/Lower/LoweringOptions.def"

protected:
#define LOWERINGOPT(Name, Bits, Default)
#define ENUM_LOWERINGOPT(Name, Type, Bits, Default) unsigned Name : Bits;
#include "flang/Lower/LoweringOptions.def"
};

class LoweringOptions : public LoweringOptionsBase {

public:
#define LOWERINGOPT(Name, Bits, Default)
#define ENUM_LOWERINGOPT(Name, Type, Bits, Default)                            \
  Type get##Name() const { return static_cast<Type>(Name); }                   \
  LoweringOptions &set##Name(Type Value) {                                     \
    Name = static_cast<unsigned>(Value);                                       \
    return *this;                                                              \
  }
#include "flang/Lower/LoweringOptions.def"

  LoweringOptions();

  const Fortran::common::MathOptionsBase &getMathOptions() const {
    return MathOptions;
  }

  Fortran::common::MathOptionsBase &getMathOptions() { return MathOptions; }

private:
  /// Options for handling/optimizing mathematical computations.
  Fortran::common::MathOptionsBase MathOptions;
};

} // namespace Fortran::lower

#endif // FLANG_LOWER_LOWERINGOPTIONS_H
