//===-- DWARFDebugAbbrev.h --------------------------------------*- C++ -*-===//
//
//                     The LLVM Compiler Infrastructure
//
// This file is distributed under the University of Illinois Open Source
// License. See LICENSE.TXT for details.
//
//===----------------------------------------------------------------------===//

#ifndef liblldb_DWARFDebugAbbrev_h_
#define SymbolFileDWARF_DWARFDebugAbbrev_h_

#include <list>
#include <map>

#include "lldb/lldb-private.h"

#include "DWARFDefines.h"
#include "DWARFAbbreviationDeclaration.h"

typedef std::vector<DWARFAbbreviationDeclaration>               DWARFAbbreviationDeclarationColl;
typedef DWARFAbbreviationDeclarationColl::iterator              DWARFAbbreviationDeclarationCollIter;
typedef DWARFAbbreviationDeclarationColl::const_iterator        DWARFAbbreviationDeclarationCollConstIter;


class DWARFAbbreviationDeclarationSet
{
public:
    DWARFAbbreviationDeclarationSet() :
        m_offset(DW_INVALID_OFFSET),
        m_idx_offset(0),
        m_decls()
        {
        }

    DWARFAbbreviationDeclarationSet(dw_offset_t offset, uint32_t idx_offset) :
        m_offset(offset),
        m_idx_offset(idx_offset),
        m_decls()
        {
        }

    void Clear();
    dw_offset_t GetOffset() const { return m_offset; }
    void Dump(lldb_private::Stream *s) const;
    bool Extract(const lldb_private::DataExtractor& data, uint32_t* offset_ptr);
    //void Encode(BinaryStreamBuf& debug_abbrev_buf) const;
    dw_uleb128_t AppendAbbrevDeclSequential(const DWARFAbbreviationDeclaration& abbrevDecl);

    const DWARFAbbreviationDeclaration* GetAbbreviationDeclaration(dw_uleb128_t abbrCode) const;
private:
    dw_offset_t m_offset;
    uint32_t m_idx_offset;
    std::vector<DWARFAbbreviationDeclaration> m_decls;
};

typedef std::map<dw_offset_t, DWARFAbbreviationDeclarationSet> DWARFAbbreviationDeclarationCollMap;
typedef DWARFAbbreviationDeclarationCollMap::iterator DWARFAbbreviationDeclarationCollMapIter;
typedef DWARFAbbreviationDeclarationCollMap::const_iterator DWARFAbbreviationDeclarationCollMapConstIter;


class DWARFDebugAbbrev
{
public:
    DWARFDebugAbbrev();
    const DWARFAbbreviationDeclarationSet*  GetAbbreviationDeclarationSet(dw_offset_t cu_abbr_offset) const;
    void Dump(lldb_private::Stream *s) const;
    void Parse(const lldb_private::DataExtractor& data);
protected:
    DWARFAbbreviationDeclarationCollMap m_abbrevCollMap;
    mutable DWARFAbbreviationDeclarationCollMapConstIter m_prev_abbr_offset_pos;
};

#endif  // SymbolFileDWARF_DWARFDebugAbbrev_h_
