//===-- SBTypeCategory.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_SBTypeCategory_h_
#define LLDB_SBTypeCategory_h_

#include "lldb/API/SBDefines.h"

namespace lldb {
    
    class LLDB_API SBTypeCategory
    {
    public:
        
        SBTypeCategory();
        
        SBTypeCategory (const lldb::SBTypeCategory &rhs);
        
        ~SBTypeCategory ();
        
        bool
        IsValid() const;
        
        bool
        GetEnabled ();
        
        void
        SetEnabled (bool);
        
        const char*
        GetName();
        
        lldb::LanguageType
        GetLanguageAtIndex (uint32_t idx);
        
        uint32_t
        GetNumLanguages ();
        
        void
        AddLanguage (lldb::LanguageType language);
        
        bool
        GetDescription (lldb::SBStream &description, 
                        lldb::DescriptionLevel description_level);
        
        uint32_t
        GetNumFormats ();
        
        uint32_t
        GetNumSummaries ();
        
        uint32_t
        GetNumFilters ();
        
#ifndef LLDB_DISABLE_PYTHON
        uint32_t
        GetNumSynthetics ();
#endif
        
        SBTypeNameSpecifier
        GetTypeNameSpecifierForFilterAtIndex (uint32_t);
        
        SBTypeNameSpecifier
        GetTypeNameSpecifierForFormatAtIndex (uint32_t);
        
        SBTypeNameSpecifier
        GetTypeNameSpecifierForSummaryAtIndex (uint32_t);

#ifndef LLDB_DISABLE_PYTHON
        SBTypeNameSpecifier
        GetTypeNameSpecifierForSyntheticAtIndex (uint32_t);
#endif
        
        SBTypeFilter
        GetFilterForType (SBTypeNameSpecifier);

        SBTypeFormat
        GetFormatForType (SBTypeNameSpecifier);
        
#ifndef LLDB_DISABLE_PYTHON
        SBTypeSummary
        GetSummaryForType (SBTypeNameSpecifier);
#endif

#ifndef LLDB_DISABLE_PYTHON
        SBTypeSynthetic
        GetSyntheticForType (SBTypeNameSpecifier);
#endif
        
#ifndef LLDB_DISABLE_PYTHON
        SBTypeFilter
        GetFilterAtIndex (uint32_t);
#endif
        
        SBTypeFormat
        GetFormatAtIndex (uint32_t);
        
#ifndef LLDB_DISABLE_PYTHON
        SBTypeSummary
        GetSummaryAtIndex (uint32_t);
#endif
        
#ifndef LLDB_DISABLE_PYTHON
        SBTypeSynthetic
        GetSyntheticAtIndex (uint32_t);
#endif
        
        bool
        AddTypeFormat (SBTypeNameSpecifier,
                       SBTypeFormat);
        
        bool
        DeleteTypeFormat (SBTypeNameSpecifier);
        
#ifndef LLDB_DISABLE_PYTHON
        bool
        AddTypeSummary (SBTypeNameSpecifier,
                        SBTypeSummary);
#endif
        
        bool
        DeleteTypeSummary (SBTypeNameSpecifier);
        
        bool
        AddTypeFilter (SBTypeNameSpecifier,
                       SBTypeFilter);
        
        bool
        DeleteTypeFilter (SBTypeNameSpecifier);
        
#ifndef LLDB_DISABLE_PYTHON
        bool
        AddTypeSynthetic (SBTypeNameSpecifier,
                          SBTypeSynthetic);
        
        bool
        DeleteTypeSynthetic (SBTypeNameSpecifier);
#endif
        
        lldb::SBTypeCategory &
        operator = (const lldb::SBTypeCategory &rhs);
        
        bool
        operator == (lldb::SBTypeCategory &rhs);
        
        bool
        operator != (lldb::SBTypeCategory &rhs);
        
    protected:
        friend class SBDebugger;
        
        lldb::TypeCategoryImplSP
        GetSP ();
        
        void
        SetSP (const lldb::TypeCategoryImplSP &typecategory_impl_sp);    
        
        TypeCategoryImplSP m_opaque_sp;
        
        SBTypeCategory (const lldb::TypeCategoryImplSP &);
        
        SBTypeCategory (const char*);
        
        bool
        IsDefaultCategory();
        
    };
    
} // namespace lldb

#endif // LLDB_SBTypeCategory_h_
