//===-- SBEvent.h -----------------------------------------------*- C++ -*-===//
//
//                     The LLVM Compiler Infrastructure
//
// This file is distributed under the University of Illinois Open Source
// License. See LICENSE.TXT for details.
//
//===----------------------------------------------------------------------===//

#ifndef LLDB_SBEvent_h_
#define LLDB_SBEvent_h_

#include "lldb/API/SBDefines.h"

#include <stdio.h>
#include <vector>


namespace lldb {

class SBBroadcaster;

class SBEvent
{
public:
    SBEvent();

    SBEvent (const lldb::SBEvent &rhs);
    
    // Make an event that contains a C string.
    SBEvent (uint32_t event, const char *cstr, uint32_t cstr_len);

    ~SBEvent();

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

    bool
    IsValid() const;

    const char *
    GetDataFlavor ();

    uint32_t
    GetType () const;

    lldb::SBBroadcaster
    GetBroadcaster () const;

    const char *
    GetBroadcasterClass () const;

    bool
    BroadcasterMatchesPtr (const lldb::SBBroadcaster *broadcaster);

    bool
    BroadcasterMatchesRef (const lldb::SBBroadcaster &broadcaster);

    void
    Clear();

    static const char *
    GetCStringFromEvent (const lldb::SBEvent &event);

    bool
    GetDescription (lldb::SBStream &description);

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

protected:
    friend class SBListener;
    friend class SBBroadcaster;
    friend class SBBreakpoint;
    friend class SBDebugger;
    friend class SBProcess;
    friend class SBThread;
    friend class SBWatchpoint;

    SBEvent (lldb::EventSP &event_sp);

    lldb::EventSP &
    GetSP () const;

    void
    reset (lldb::EventSP &event_sp);

    void
    reset (lldb_private::Event* event);

    lldb_private::Event *
    get () const;

private:

    mutable lldb::EventSP m_event_sp;
    mutable lldb_private::Event *m_opaque_ptr;
};

} // namespace lldb

#endif  // LLDB_SBEvent_h_
