//===-- SBTypeCategory.h --------------------------------------------*- C++
//-*-===//
//
// Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.
// See https://llvm.org/LICENSE.txt for license information.
// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception
//
//===----------------------------------------------------------------------===//

#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();

  explicit operator bool() const;

  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();

  uint32_t GetNumSynthetics();

  SBTypeNameSpecifier GetTypeNameSpecifierForFilterAtIndex(uint32_t);

  SBTypeNameSpecifier GetTypeNameSpecifierForFormatAtIndex(uint32_t);

  SBTypeNameSpecifier GetTypeNameSpecifierForSummaryAtIndex(uint32_t);

  SBTypeNameSpecifier GetTypeNameSpecifierForSyntheticAtIndex(uint32_t);

  SBTypeFilter GetFilterForType(SBTypeNameSpecifier);

  SBTypeFormat GetFormatForType(SBTypeNameSpecifier);

  SBTypeSummary GetSummaryForType(SBTypeNameSpecifier);

  SBTypeSynthetic GetSyntheticForType(SBTypeNameSpecifier);

  SBTypeFilter GetFilterAtIndex(uint32_t);

  SBTypeFormat GetFormatAtIndex(uint32_t);

  SBTypeSummary GetSummaryAtIndex(uint32_t);

  SBTypeSynthetic GetSyntheticAtIndex(uint32_t);

  bool AddTypeFormat(SBTypeNameSpecifier, SBTypeFormat);

  bool DeleteTypeFormat(SBTypeNameSpecifier);

  bool AddTypeSummary(SBTypeNameSpecifier, SBTypeSummary);

  bool DeleteTypeSummary(SBTypeNameSpecifier);

  bool AddTypeFilter(SBTypeNameSpecifier, SBTypeFilter);

  bool DeleteTypeFilter(SBTypeNameSpecifier);

  bool AddTypeSynthetic(SBTypeNameSpecifier, SBTypeSynthetic);

  bool DeleteTypeSynthetic(SBTypeNameSpecifier);

  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_
