//===- AttributeFactory.cpp -----------------------------------------------===// // // The MCLinker Project // // This file is distributed under the University of Illinois Open Source // License. See LICENSE.TXT for details. // //===----------------------------------------------------------------------===// #include "mcld/MC/MCLDAttribute.h" #include "mcld/MC/AttributeFactory.h" using namespace mcld; //========================== // AttributeFactory AttributeFactory::AttributeFactory() : m_AttrSet() { m_AttrSet.push_back(new mcld::Attribute()); m_pLast = new AttributeProxy(*this, *m_AttrSet.front()); } AttributeFactory::AttributeFactory(size_t pNum) : m_AttrSet() { m_AttrSet.reserve(pNum); m_AttrSet.push_back(new mcld::Attribute()); m_pLast = new AttributeProxy(*this, *m_AttrSet.front()); } AttributeFactory::~AttributeFactory() { iterator cur = m_AttrSet.begin(); iterator aEnd = m_AttrSet.end(); while(cur != aEnd) { delete (*cur); ++cur; } m_AttrSet.clear(); delete m_pLast; } void AttributeFactory::reserve(size_t pNum) { m_AttrSet.reserve(pNum); } Attribute &AttributeFactory::predefined() { return *m_AttrSet.front(); } const Attribute &AttributeFactory::predefined() const { return *m_AttrSet.front(); } AttributeProxy* AttributeFactory::produce() { m_pLast->change(m_AttrSet.front()); return m_pLast->clone(); } AttributeProxy& AttributeFactory::last() { return *m_pLast; } const AttributeProxy& AttributeFactory::last() const { return *m_pLast; } Attribute* AttributeFactory::exists(const Attribute& pAttr) const { const_iterator cur = m_AttrSet.begin(); const_iterator aEnd = m_AttrSet.end(); while(cur != aEnd) { if (*(*cur) == pAttr) { m_pLast->change(*cur); return *cur; } ++cur; } return 0; } void AttributeFactory::record(mcld::Attribute &pAttr) { m_AttrSet.push_back(&pAttr); m_pLast->change(m_AttrSet.back()); }