//===-- SBType.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_SBType_h_
#define LLDB_SBType_h_

#include "lldb/API/SBDefines.h"

namespace lldb {

class SBTypeMember;

class SBType
{
public:

    SBType (void *ast = NULL, void *clang_type = NULL);
    
    SBType (const SBType &rhs);

    ~SBType ();

#ifndef SWIG
    const SBType &
    operator =(const SBType &rhs);
#endif

    bool
    IsValid();

    const char *
    GetName();

    uint64_t
    GetByteSize();

	lldb::Encoding
    GetEncoding (uint32_t &count);

    uint64_t
    GetNumberChildren (bool omit_empty_base_classes);

    bool
    GetChildAtIndex (bool omit_empty_base_classes, uint32_t idx, SBTypeMember &member);

    uint32_t
    GetChildIndexForName (bool omit_empty_base_classes, const char *name);

    bool
    IsPointerType ();

    SBType
    GetPointeeType ();

    static bool
    IsPointerType (void *opaque_type);

    bool
    GetDescription (lldb::SBStream &description);

protected:
    void *m_ast;
    void *m_type;
};

class SBTypeMember
{
public:

    SBTypeMember ();
    
    SBTypeMember (const SBTypeMember &rhs);

#ifndef SWIG
    const SBTypeMember&
    operator =(const SBTypeMember &rhs);
#endif

    ~SBTypeMember ();

    bool
    IsBaseClass ();

    bool
    IsValid ();

    void
    Clear();

    bool
    IsBitfield ();
    
    size_t
    GetBitfieldWidth ();
    
    size_t
    GetBitfieldOffset ();

    size_t
    GetOffset ();

    const char *
    GetName ();

    SBType
    GetType();

    SBType
    GetParentType();

    void
    SetName (const char *name);

protected:
    friend class SBType;
        
    void *m_ast;
    void *m_parent_type;
    void *m_member_type;
    char *m_member_name;
    int32_t m_offset;
    uint32_t m_bit_size;
    uint32_t m_bit_offset;
    bool m_is_base_class;
    bool m_is_deref_of_paremt;
};


} // namespace lldb

#endif // LLDB_SBType_h_
