//===-- 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;
  Status
  SetValueFromString(const char *,
                     VarSetOperationType = eVarSetOperationAssign) = delete;

  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
