//===-- 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 "DWARFAttribute.h"
#include "SymbolFileDWARF.h"

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_
