//===-- DWARFAbbreviationDeclaration.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_DWARFAbbreviationDeclaration_h_
#define liblldb_DWARFAbbreviationDeclaration_h_

#include "SymbolFileDWARF.h"
#include "DWARFAttribute.h"

class DWARFCompileUnit;

class DWARFAbbreviationDeclaration
{
public:
    enum { InvalidCode = 0 };
                    DWARFAbbreviationDeclaration();

                    // For hand crafting an abbreviation declaration
                    DWARFAbbreviationDeclaration(dw_tag_t tag, uint8_t has_children);
    void            AddAttribute(const DWARFAttribute& attr)
                    {
                        m_attributes.push_back(attr);
                    }

    dw_uleb128_t    Code() const { return m_code; }
    void            SetCode(dw_uleb128_t code) { m_code = code; }
    dw_tag_t        Tag() const { return m_tag; }
    bool            HasChildren() const { return m_has_children; }
    size_t          NumAttributes() const { return m_attributes.size(); }
    dw_attr_t       GetAttrByIndex(uint32_t idx) const { return m_attributes.size() > idx ? m_attributes[idx].get_attr() : 0; }
    dw_form_t       GetFormByIndex(uint32_t idx) const { return m_attributes.size() > idx ? m_attributes[idx].get_form() : 0; }
    bool            GetAttrAndFormByIndex(uint32_t idx, dw_attr_t& attr, dw_form_t& form) const
                    {
                        if (m_attributes.size() > idx)
                        {
                            m_attributes[idx].get(attr, form);
                            return true;
                        }
                        attr = form = 0;
                        return false;
                    }

                    // idx is assumed to be valid when calling GetAttrAndFormByIndexUnchecked()
    void            GetAttrAndFormByIndexUnchecked(uint32_t idx, dw_attr_t& attr, dw_form_t& form) const
                    {
                        m_attributes[idx].get(attr, form);
                    }
    dw_form_t       GetFormByIndexUnchecked (uint32_t idx) const
                    {
                        return m_attributes[idx].get_form();
                    }
    uint32_t        FindAttributeIndex(dw_attr_t attr) const;
    bool            Extract(const lldb_private::DWARFDataExtractor& data, lldb::offset_t *offset_ptr);
    bool            Extract(const lldb_private::DWARFDataExtractor& data, lldb::offset_t *offset_ptr, dw_uleb128_t code);
    bool            IsValid();
    void            Dump(lldb_private::Stream *s) const;
    bool            operator == (const DWARFAbbreviationDeclaration& rhs) const;
    const DWARFAttribute::collection& Attributes() const { return m_attributes; }
protected:
    dw_uleb128_t        m_code;
    dw_tag_t            m_tag;
    uint8_t             m_has_children;
    DWARFAttribute::collection m_attributes;
};

#endif  // liblldb_DWARFAbbreviationDeclaration_h_
