//===-- SBError.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_SBError_h_
#define LLDB_SBError_h_

#include "lldb/API/SBDefines.h"

namespace lldb {

class SBError {
public:
    SBError ();

    SBError (const lldb::SBError &rhs);

    ~SBError();

#ifndef SWIG

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

#endif

    const char *
    GetCString () const;

    void
    Clear ();

    bool
    Fail () const;

    bool
    Success () const;

    uint32_t
    GetError () const;

    lldb::ErrorType
    GetType () const;

    void
    SetError (uint32_t err, lldb::ErrorType type);

    void
    SetErrorToErrno ();

    void
    SetErrorToGenericError ();

    void
    SetErrorString (const char *err_str);

    int
    SetErrorStringWithFormat (const char *format, ...);

    bool
    IsValid () const;

    bool
    GetDescription (lldb::SBStream &description);

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

protected:

#ifndef SWIG
    friend class SBArguments;
    friend class SBDebugger;
    friend class SBCommunication;
    friend class SBHostOS;
    friend class SBInputReader;
    friend class SBProcess;
    friend class SBThread;
    friend class SBTarget;
    friend class SBValue;

    lldb_private::Error *
    get();

    lldb_private::Error *
    operator->();

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

    lldb_private::Error &
    ref();

#endif


    void
    SetError (const lldb_private::Error &lldb_error);

private:
    std::auto_ptr<lldb_private::Error> m_opaque_ap;

    void
    CreateIfNeeded ();
};


} // namespace lldb

#endif // LLDB_SBError_h_
