//===-- 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 liblldb_OptionValueSInt64_h_
#define liblldb_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;

  bool Clear() override {
    m_current_value = m_default_value;
    m_value_was_set = false;
    return true;
  }

  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 // liblldb_OptionValueSInt64_h_
