| //===- 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()); |
| } |
| |