//===-- FormatCache.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_FormatCache_h_
#define lldb_FormatCache_h_

// C Includes
// C++ Includes
#include <map>

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

namespace lldb_private {
class FormatCache
{
private:
    struct Entry
    {
    private:
        bool m_summary_cached : 1;
        bool m_synthetic_cached : 1;
        
        lldb::TypeSummaryImplSP m_summary_sp;
        lldb::SyntheticChildrenSP m_synthetic_sp;
    public:
        Entry ();
        Entry (const Entry& rhs);
        Entry (lldb::TypeSummaryImplSP);
        Entry (lldb::SyntheticChildrenSP);
        Entry (lldb::TypeSummaryImplSP,lldb::SyntheticChildrenSP);

        Entry& operator= (const Entry& rhs);

        bool
        IsSummaryCached ();
        
        bool
        IsSyntheticCached ();
        
        lldb::TypeSummaryImplSP
        GetSummary ();
        
        lldb::SyntheticChildrenSP
        GetSynthetic ();
        
        void
        SetSummary (lldb::TypeSummaryImplSP);
        
        void
        SetSynthetic (lldb::SyntheticChildrenSP);
    };
    typedef std::map<ConstString,Entry> CacheMap;
    CacheMap m_map;
    Mutex m_mutex;
    
    uint64_t m_cache_hits;
    uint64_t m_cache_misses;
    
    Entry&
    GetEntry (const ConstString& type);
    
public:
    FormatCache ();
    
    bool
    GetSummary (const ConstString& type,lldb::TypeSummaryImplSP& summary_sp);

    bool
    GetSynthetic (const ConstString& type,lldb::SyntheticChildrenSP& synthetic_sp);
    
    void
    SetSummary (const ConstString& type,lldb::TypeSummaryImplSP& summary_sp);
    
    void
    SetSynthetic (const ConstString& type,lldb::SyntheticChildrenSP& synthetic_sp);
    
    void
    Clear ();
    
    uint64_t
    GetCacheHits ()
    {
        return m_cache_hits;
    }
    
    uint64_t
    GetCacheMisses ()
    {
        return m_cache_misses;
    }
};
} // namespace lldb_private

#endif	// lldb_FormatCache_h_
