//===-- SBLineEntry.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_SBLineEntry_h_
#define LLDB_SBLineEntry_h_

#include <LLDB/SBDefines.h>
#include <LLDB/SBAddress.h>
#include <LLDB/SBFileSpec.h>

namespace lldb {

class SBLineEntry
{
public:

    SBLineEntry ();

    SBLineEntry (const lldb::SBLineEntry &rhs);

    ~SBLineEntry ();

#ifndef SWIG
    const lldb::SBLineEntry &
    operator = (const lldb::SBLineEntry &rhs);
#endif

    lldb::SBAddress
    GetStartAddress () const;

    lldb::SBAddress
    GetEndAddress () const;

    bool
    IsValid () const;

    lldb::SBFileSpec
    GetFileSpec () const;

    uint32_t
    GetLine () const;

    uint32_t
    GetColumn () const;

#ifndef SWIG
    bool
    operator == (const lldb::SBLineEntry &rhs) const;

    bool
    operator != (const lldb::SBLineEntry &rhs) const;

#endif

private:
    friend class SBCompileUnit;
    friend class SBFrame;
    friend class SBSymbolContext;

#ifndef SWIG

    const lldb_private::LineEntry *
    operator->() const;

    const lldb_private::LineEntry &
    operator*() const;

#endif


    SBLineEntry (const lldb_private::LineEntry *lldb_object_ptr);

    void
    SetLineEntry (const lldb_private::LineEntry &lldb_object_ref);

    std::auto_ptr<lldb_private::LineEntry> m_lldb_object_ap;
};


} // namespace lldb

#endif // LLDB_SBLineEntry_h_
