//===-- NativeThreadWindows.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_NativeThreadWindows_h_
#define liblldb_NativeThreadWindows_h_

#include "lldb/Host/HostThread.h"
#include "lldb/Host/common/NativeThreadProtocol.h"
#include "lldb/lldb-private-forward.h"

#include "NativeRegisterContextWindows.h"

namespace lldb_private {

class NativeProcessWindows;

class NativeThreadWindows : public NativeThreadProtocol {
public:
  NativeThreadWindows(NativeProcessWindows &process, const HostThread &thread);

  ~NativeThreadWindows() override = default;

  Status DoStop();
  Status DoResume(lldb::StateType resume_state);

  std::string GetName() override;

  lldb::StateType GetState() override { return m_state; }

  NativeRegisterContextWindows &GetRegisterContext() override {
    return *m_reg_context_up;
  }

  bool GetStopReason(ThreadStopInfo &stop_info,
                     std::string &description) override;

  Status SetWatchpoint(lldb::addr_t addr, size_t size, uint32_t watch_flags,
                       bool hardware) override;

  Status RemoveWatchpoint(lldb::addr_t addr) override;

  Status SetHardwareBreakpoint(lldb::addr_t addr, size_t size) override;

  Status RemoveHardwareBreakpoint(lldb::addr_t addr) override;

  void SetStopReason(ThreadStopInfo stop_info, std::string description);

  const HostThread &GetHostThread() { return m_host_thread; }

protected:
  lldb::StateType m_state = lldb::StateType::eStateInvalid;
  std::string m_name;
  std::unique_ptr<NativeRegisterContextWindows> m_reg_context_up;
  // Cache address and index of the watchpoints and hardware breakpoints since
  // the register context does not.
  using IndexMap = std::map<lldb::addr_t, uint32_t>;
  IndexMap m_watchpoint_index_map;
  IndexMap m_hw_breakpoint_index_map;
  HostThread m_host_thread;
};
} // namespace lldb_private

#endif // #ifndef liblldb_NativeThreadWindows_h_
