//===-- SWIG Interface for SBQueue.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
//
//===----------------------------------------------------------------------===//

namespace lldb {

class SBQueue
{
public:
    SBQueue ();

    SBQueue (const lldb::QueueSP& queue_sp);
    
   ~SBQueue();

    bool
    IsValid() const;

    explicit operator bool() const;

    void
    Clear ();

    lldb::SBProcess
    GetProcess ();

    %feature("autodoc", "
    Returns an lldb::queue_id_t type unique identifier number for this
    queue that will not be used by any other queue during this process'
    execution.  These ID numbers often start at 1 with the first
    system-created queues and increment from there.
    ")
    GetQueueID;

    lldb::queue_id_t
    GetQueueID () const;

    const char *
    GetName () const;

    %feature("autodoc", "
    Returns an lldb::QueueKind enumerated value (e.g. eQueueKindUnknown, 
    eQueueKindSerial, eQueueKindConcurrent) describing the type of this
    queue.
    ")
    GetKind();

    lldb::QueueKind
    GetKind();

    uint32_t
    GetIndexID () const;

    uint32_t
    GetNumThreads ();

    lldb::SBThread
    GetThreadAtIndex (uint32_t);

    uint32_t
    GetNumPendingItems ();

    lldb::SBQueueItem
    GetPendingItemAtIndex (uint32_t);

    uint32_t
    GetNumRunningItems ();

};

} // namespace lldb

