//===-- SBBreakpoint.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_API_SBBREAKPOINT_H
#define LLDB_API_SBBREAKPOINT_H

#include "lldb/API/SBDefines.h"

class SBBreakpointListImpl;

namespace lldb {

class LLDB_API SBBreakpoint {
public:

  SBBreakpoint();

  SBBreakpoint(const lldb::SBBreakpoint &rhs);

  SBBreakpoint(const lldb::BreakpointSP &bp_sp);

  ~SBBreakpoint();

  const lldb::SBBreakpoint &operator=(const lldb::SBBreakpoint &rhs);

  // Tests to see if the opaque breakpoint object in this object matches the
  // opaque breakpoint object in "rhs".
  bool operator==(const lldb::SBBreakpoint &rhs);

  bool operator!=(const lldb::SBBreakpoint &rhs);

  break_id_t GetID() const;

  explicit operator bool() const;

  bool IsValid() const;

  void ClearAllBreakpointSites();

  lldb::SBTarget GetTarget() const;

  lldb::SBBreakpointLocation FindLocationByAddress(lldb::addr_t vm_addr);

  lldb::break_id_t FindLocationIDByAddress(lldb::addr_t vm_addr);

  lldb::SBBreakpointLocation FindLocationByID(lldb::break_id_t bp_loc_id);

  lldb::SBBreakpointLocation GetLocationAtIndex(uint32_t index);

  void SetEnabled(bool enable);

  bool IsEnabled();

  void SetOneShot(bool one_shot);

  bool IsOneShot() const;

  bool IsInternal();

  uint32_t GetHitCount() const;

  void SetIgnoreCount(uint32_t count);

  uint32_t GetIgnoreCount() const;

  void SetCondition(const char *condition);

  const char *GetCondition();

  void SetAutoContinue(bool auto_continue);

  bool GetAutoContinue();

  void SetThreadID(lldb::tid_t sb_thread_id);

  lldb::tid_t GetThreadID();

  void SetThreadIndex(uint32_t index);

  uint32_t GetThreadIndex() const;

  void SetThreadName(const char *thread_name);

  const char *GetThreadName() const;

  void SetQueueName(const char *queue_name);

  const char *GetQueueName() const;

  void SetCallback(SBBreakpointHitCallback callback, void *baton);

  void SetScriptCallbackFunction(const char *callback_function_name);

  SBError SetScriptCallbackFunction(const char *callback_function_name,
                                 SBStructuredData &extra_args);

  void SetCommandLineCommands(SBStringList &commands);

  bool GetCommandLineCommands(SBStringList &commands);

  SBError SetScriptCallbackBody(const char *script_body_text);

  bool AddName(const char *new_name);

  SBError AddNameWithErrorHandling(const char *new_name);

  void RemoveName(const char *name_to_remove);

  bool MatchesName(const char *name);

  void GetNames(SBStringList &names);

  size_t GetNumResolvedLocations() const;

  size_t GetNumLocations() const;

  bool GetDescription(lldb::SBStream &description);

  bool GetDescription(lldb::SBStream &description, bool include_locations);

  static bool EventIsBreakpointEvent(const lldb::SBEvent &event);

  static lldb::BreakpointEventType
  GetBreakpointEventTypeFromEvent(const lldb::SBEvent &event);

  static lldb::SBBreakpoint GetBreakpointFromEvent(const lldb::SBEvent &event);

  static lldb::SBBreakpointLocation
  GetBreakpointLocationAtIndexFromEvent(const lldb::SBEvent &event,
                                        uint32_t loc_idx);

  static uint32_t
  GetNumBreakpointLocationsFromEvent(const lldb::SBEvent &event_sp);

  bool IsHardware() const;

  // Can only be called from a ScriptedBreakpointResolver...
  SBError
  AddLocation(SBAddress &address);

  SBStructuredData SerializeToStructuredData();

private:
  friend class SBBreakpointList;
  friend class SBBreakpointLocation;
  friend class SBBreakpointName;
  friend class SBTarget;

  lldb::BreakpointSP GetSP() const;

  lldb::BreakpointWP m_opaque_wp;
};

class LLDB_API SBBreakpointList {
public:
  SBBreakpointList(SBTarget &target);

  ~SBBreakpointList();

  size_t GetSize() const;

  SBBreakpoint GetBreakpointAtIndex(size_t idx);

  SBBreakpoint FindBreakpointByID(lldb::break_id_t);

  void Append(const SBBreakpoint &sb_bkpt);

  bool AppendIfUnique(const SBBreakpoint &sb_bkpt);

  void AppendByID(lldb::break_id_t id);

  void Clear();

protected:
  friend class SBTarget;

  void CopyToBreakpointIDList(lldb_private::BreakpointIDList &bp_id_list);

private:
  std::shared_ptr<SBBreakpointListImpl> m_opaque_sp;
};

} // namespace lldb

#endif // LLDB_API_SBBREAKPOINT_H
