//===-- DataVisualization.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_DataVisualization_h_
#define lldb_DataVisualization_h_

// C Includes
// C++ Includes

// Other libraries and framework includes
// Project includes
#include "lldb/Core/ConstString.h"
#include "lldb/DataFormatters/FormatClasses.h"
#include "lldb/DataFormatters/FormatManager.h"

namespace lldb_private {

// this class is the high-level front-end of LLDB Data Visualization
// code in FormatManager.h/cpp is the low-level implementation of this feature
// clients should refer to this class as the entry-point into the data formatters
// unless they have a good reason to bypass this and go to the backend
class DataVisualization
{
public:
    // use this call to force the FM to consider itself updated even when there is no apparent reason for that
    static void
    ForceUpdate();
    
    static uint32_t
    GetCurrentRevision ();
    
    static bool
    ShouldPrintAsOneLiner (ValueObject& valobj);
    
    static lldb::TypeFormatImplSP
    GetFormat (ValueObject& valobj,
               lldb::DynamicValueType use_dynamic);
    
    static lldb::TypeFormatImplSP
    GetFormatForType (lldb::TypeNameSpecifierImplSP type_sp);
    
    static lldb::TypeSummaryImplSP
    GetSummaryFormat (ValueObject& valobj,
                      lldb::DynamicValueType use_dynamic);

    static lldb::TypeSummaryImplSP
    GetSummaryForType (lldb::TypeNameSpecifierImplSP type_sp);
    
#ifndef LLDB_DISABLE_PYTHON
    static lldb::SyntheticChildrenSP
    GetSyntheticChildrenForType (lldb::TypeNameSpecifierImplSP type_sp);
#endif
    
    static lldb::TypeFilterImplSP
    GetFilterForType (lldb::TypeNameSpecifierImplSP type_sp);

#ifndef LLDB_DISABLE_PYTHON
    static lldb::ScriptedSyntheticChildrenSP
    GetSyntheticForType (lldb::TypeNameSpecifierImplSP type_sp);
#endif
    
#ifndef LLDB_DISABLE_PYTHON
    static lldb::SyntheticChildrenSP
    GetSyntheticChildren(ValueObject& valobj,
                         lldb::DynamicValueType use_dynamic);
#endif
    
    static lldb::TypeValidatorImplSP
    GetValidator (ValueObject& valobj,
                  lldb::DynamicValueType use_dynamic);
    
    static lldb::TypeValidatorImplSP
    GetValidatorForType (lldb::TypeNameSpecifierImplSP type_sp);
    
    static bool
    AnyMatches(ConstString type_name,
               TypeCategoryImpl::FormatCategoryItems items = TypeCategoryImpl::ALL_ITEM_TYPES,
               bool only_enabled = true,
               const char** matching_category = nullptr,
               TypeCategoryImpl::FormatCategoryItems* matching_type = nullptr);
    
    class NamedSummaryFormats
    {
    public:
        static bool
        GetSummaryFormat (const ConstString &type, lldb::TypeSummaryImplSP &entry);
        
        static void
        Add (const ConstString &type, const lldb::TypeSummaryImplSP &entry);
        
        static bool
        Delete (const ConstString &type);
        
        static void
        Clear ();
        
        static void
        ForEach (std::function<bool(ConstString, const lldb::TypeSummaryImplSP&)> callback);
        
        static uint32_t
        GetCount ();
    };
    
    class Categories
    {
    public:
        static bool
        GetCategory (const ConstString &category,
                     lldb::TypeCategoryImplSP &entry,
                     bool allow_create = true);

        static bool
        GetCategory (lldb::LanguageType language,
                     lldb::TypeCategoryImplSP &entry);
        
        static void
        Add (const ConstString &category);
        
        static bool
        Delete (const ConstString &category);
        
        static void
        Clear ();
        
        static void
        Clear (const ConstString &category);
        
        static void
        Enable (const ConstString& category,
                TypeCategoryMap::Position = TypeCategoryMap::Default);
        
        static void
        Enable (lldb::LanguageType lang_type);
        
        static void
        Disable (const ConstString& category);
        
        static void
        Disable (lldb::LanguageType lang_type);

        static void
        Enable (const lldb::TypeCategoryImplSP& category,
                TypeCategoryMap::Position = TypeCategoryMap::Default);
        
        static void
        Disable (const lldb::TypeCategoryImplSP& category);
        
        static void
        EnableStar ();
        
        static void
        DisableStar ();
        
        static void
        ForEach (TypeCategoryMap::ForEachCallback callback);
        
        static uint32_t
        GetCount ();
        
        static lldb::TypeCategoryImplSP
        GetCategoryAtIndex (size_t);
    };
};

} // namespace lldb_private

#endif// lldb_DataVisualization_h_
