//===-- ThreadPlanBase.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_ThreadPlanFundamental_h_
#define liblldb_ThreadPlanFundamental_h_

#include "lldb/Target/Process.h"
#include "lldb/Target/Thread.h"
#include "lldb/Target/ThreadPlan.h"

namespace lldb_private {

//  Base thread plans:
//  This is the generic version of the bottom most plan on the plan stack.  It
//  should
//  be able to handle generic breakpoint hitting, and signals and exceptions.

class ThreadPlanBase : public ThreadPlan {
  friend class Process; // RunThreadPlan manages "stopper" base plans.
public:
  ~ThreadPlanBase() override;

  void GetDescription(Stream *s, lldb::DescriptionLevel level) override;
  bool ValidatePlan(Stream *error) override;
  bool ShouldStop(Event *event_ptr) override;
  Vote ShouldReportStop(Event *event_ptr) override;
  bool StopOthers() override;
  lldb::StateType GetPlanRunState() override;
  bool WillStop() override;
  bool MischiefManaged() override;

  bool OkayToDiscard() override { return false; }

  bool IsBasePlan() override { return true; }

protected:
  bool DoWillResume(lldb::StateType resume_state, bool current_plan) override;
  bool DoPlanExplainsStop(Event *event_ptr) override;
  ThreadPlanBase(Thread &thread);

private:
  friend lldb::ThreadPlanSP
  Thread::QueueFundamentalPlan(bool abort_other_plans);

  DISALLOW_COPY_AND_ASSIGN(ThreadPlanBase);
};

} // namespace lldb_private

#endif // liblldb_ThreadPlanFundamental_h_
