1//===- AttributeFactory.cpp -----------------------------------------------===//
2//
3//                     The MCLinker Project
4//
5// This file is distributed under the University of Illinois Open Source
6// License. See LICENSE.TXT for details.
7//
8//===----------------------------------------------------------------------===//
9#include "mcld/MC/MCLDAttribute.h"
10#include "mcld/MC/AttributeFactory.h"
11
12using namespace mcld;
13
14//==========================
15// AttributeFactory
16AttributeFactory::AttributeFactory()
17  : m_AttrSet() {
18  m_AttrSet.push_back(new mcld::Attribute());
19  m_pLast = new AttributeProxy(*this, *m_AttrSet.front());
20}
21
22AttributeFactory::AttributeFactory(size_t pNum)
23  : m_AttrSet() {
24  m_AttrSet.reserve(pNum);
25  m_AttrSet.push_back(new mcld::Attribute());
26  m_pLast = new AttributeProxy(*this, *m_AttrSet.front());
27}
28
29AttributeFactory::~AttributeFactory()
30{
31  iterator cur = m_AttrSet.begin();
32  iterator aEnd = m_AttrSet.end();
33  while(cur != aEnd) {
34    delete (*cur);
35    ++cur;
36  }
37  m_AttrSet.clear();
38  delete m_pLast;
39}
40
41void AttributeFactory::reserve(size_t pNum)
42{
43  m_AttrSet.reserve(pNum);
44}
45
46Attribute &AttributeFactory::predefined()
47{
48  return *m_AttrSet.front();
49}
50
51const Attribute &AttributeFactory::predefined() const
52{
53  return *m_AttrSet.front();
54}
55
56AttributeProxy* AttributeFactory::produce()
57{
58  m_pLast->change(m_AttrSet.front());
59  return m_pLast->clone();
60}
61
62AttributeProxy& AttributeFactory::last()
63{
64  return *m_pLast;
65}
66
67const AttributeProxy& AttributeFactory::last() const
68{
69  return *m_pLast;
70}
71
72Attribute* AttributeFactory::exists(const Attribute& pAttr) const
73{
74  const_iterator cur = m_AttrSet.begin();
75  const_iterator aEnd = m_AttrSet.end();
76  while(cur != aEnd) {
77    if (*(*cur) == pAttr) {
78      m_pLast->change(*cur);
79      return *cur;
80    }
81    ++cur;
82  }
83  return 0;
84}
85
86void AttributeFactory::record(mcld::Attribute &pAttr)
87{
88  m_AttrSet.push_back(&pAttr);
89  m_pLast->change(m_AttrSet.back());
90}
91
92