//===-- 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 SBThread and SBFrame."
) SBThread;

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();

    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_
