//===-- OptionValueSInt64.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
//
//===----------------------------------------------------------------------===//

#ifndef LLDB_INTERPRETER_OPTIONVALUESINT64_H
#define LLDB_INTERPRETER_OPTIONVALUESINT64_H

#include "lldb/Interpreter/OptionValue.h"

namespace lldb_private {

class OptionValueSInt64 : public OptionValue {
public:
  OptionValueSInt64()
      : OptionValue(), m_current_value(0), m_default_value(0),
        m_min_value(INT64_MIN), m_max_value(INT64_MAX) {}

  OptionValueSInt64(int64_t value)
      : OptionValue(), m_current_value(value), m_default_value(value),
        m_min_value(INT64_MIN), m_max_value(INT64_MAX) {}

  OptionValueSInt64(int64_t current_value, int64_t default_value)
      : OptionValue(), m_current_value(current_value),
        m_default_value(default_value), m_min_value(INT64_MIN),
        m_max_value(INT64_MAX) {}

  OptionValueSInt64(const OptionValueSInt64 &rhs)
      : OptionValue(rhs), m_current_value(rhs.m_current_value),
        m_default_value(rhs.m_default_value), m_min_value(rhs.m_min_value),
        m_max_value(rhs.m_max_value) {}

  ~OptionValueSInt64() override {}

  // Virtual subclass pure virtual overrides

  OptionValue::Type GetType() const override { return eTypeSInt64; }

  void DumpValue(const ExecutionContext *exe_ctx, Stream &strm,
                 uint32_t dump_mask) override;

  Status
  SetValueFromString(llvm::StringRef value,
                     VarSetOperationType op = eVarSetOperationAssign) override;

  void Clear() override {
    m_current_value = m_default_value;
    m_value_was_set = false;
  }

  lldb::OptionValueSP DeepCopy() const override;

  // Subclass specific functions

  const int64_t &operator=(int64_t value) {
    m_current_value = value;
    return m_current_value;
  }

  int64_t GetCurrentValue() const { return m_current_value; }

  int64_t GetDefaultValue() const { return m_default_value; }

  bool SetCurrentValue(int64_t value) {
    if (value >= m_min_value && value <= m_max_value) {
      m_current_value = value;
      return true;
    }
    return false;
  }

  bool SetDefaultValue(int64_t value) {
    if (value >= m_min_value && value <= m_max_value) {
      m_default_value = value;
      return true;
    }
    return false;
  }

  void SetMinimumValue(int64_t v) { m_min_value = v; }

  int64_t GetMinimumValue() const { return m_min_value; }

  void SetMaximumValue(int64_t v) { m_max_value = v; }

  int64_t GetMaximumValue() const { return m_max_value; }

protected:
  int64_t m_current_value;
  int64_t m_default_value;
  int64_t m_min_value;
  int64_t m_max_value;
};

} // namespace lldb_private

#endif // LLDB_INTERPRETER_OPTIONVALUESINT64_H
