//===-- SBThread.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_SBThreadPlan_h_
#define LLDB_SBThreadPlan_h_

#include "lldb/API/SBDefines.h"

#include <stdio.h>

namespace lldb {

%feature("docstring",
"Represents a plan for the execution control of a given thread.

See also :py:class:`SBThread` and :py:class:`SBFrame`."
) SBThreadPlan;

class SBThreadPlan
{

friend class lldb_private::ThreadPlan;

public:
    SBThreadPlan ();

    SBThreadPlan (const lldb::SBThreadPlan &threadPlan);

    SBThreadPlan (const lldb::ThreadPlanSP& lldb_object_sp);

    SBThreadPlan (lldb::SBThread &thread, const char *class_name);

   ~SBThreadPlan ();

    bool
    IsValid();

    bool
    IsValid() const;

    explicit operator bool() const;

    void
    Clear ();

    lldb::StopReason
    GetStopReason();

    %feature("docstring", "
    Get the number of words associated with the stop reason.
    See also GetStopReasonDataAtIndex().") GetStopReasonDataCount;
    size_t
    GetStopReasonDataCount();

    %feature("docstring", "
    Get information associated with a stop reason.

    Breakpoint stop reasons will have data that consists of pairs of
    breakpoint IDs followed by the breakpoint location IDs (they always come
    in pairs).

    Stop Reason              Count Data Type
    ======================== ===== =========================================
    eStopReasonNone          0
    eStopReasonTrace         0
    eStopReasonBreakpoint    N     duple: {breakpoint id, location id}
    eStopReasonWatchpoint    1     watchpoint id
    eStopReasonSignal        1     unix signal number
    eStopReasonException     N     exception data
    eStopReasonExec          0
    eStopReasonPlanComplete  0") GetStopReasonDataAtIndex;
    uint64_t
    GetStopReasonDataAtIndex(uint32_t idx);

    SBThread
    GetThread () const;

    bool
    GetDescription (lldb::SBStream &description) const;

    void
    SetPlanComplete (bool success);

    bool
    IsPlanComplete();

    bool
    IsPlanStale();

    %feature("docstring", "Return whether this plan will ask to stop other threads when it runs.") GetStopOthers;
    bool
    GetStopOthers();

    %feature("docstring", "Set whether this plan will ask to stop other threads when it runs.")	GetStopOthers;
    void
    SetStopOthers(bool stop_others);

    SBThreadPlan
    QueueThreadPlanForStepOverRange (SBAddress &start_address,
                                     lldb::addr_t range_size);

    SBThreadPlan
    QueueThreadPlanForStepInRange (SBAddress &start_address,
                                   lldb::addr_t range_size);

    SBThreadPlan
    QueueThreadPlanForStepOut (uint32_t frame_idx_to_step_to, bool first_insn = false);

    SBThreadPlan
    QueueThreadPlanForRunToAddress (SBAddress address);

    SBThreadPlan
    QueueThreadPlanForStepScripted(const char *script_class_name);

    SBThreadPlan
    QueueThreadPlanForStepScripted(const char *script_class_name,
                                   SBError &error);
    SBThreadPlan
    QueueThreadPlanForStepScripted(const char *script_class_name,
                                   SBStructuredData &args_data,
                                   SBError &error);


protected:
    friend class SBBreakpoint;
    friend class SBBreakpointLocation;
    friend class SBFrame;
    friend class SBProcess;
    friend class SBDebugger;
    friend class SBValue;
    friend class lldb_private::QueueImpl;
    friend class SBQueueItem;

private:
    lldb::ThreadPlanSP m_opaque_sp;
};

} // namespace lldb

#endif  // LLDB_SBThreadPlan_h_
