| //===- AttributeFactory.h -------------------------------------------------===// |
| // |
| // The MCLinker Project |
| // |
| // This file is distributed under the University of Illinois Open Source |
| // License. See LICENSE.TXT for details. |
| // |
| //===----------------------------------------------------------------------===// |
| #ifndef MCLD_ATTRIBUTE_FACTORY_H |
| #define MCLD_ATTRIBUTE_FACTORY_H |
| #ifdef ENABLE_UNITTEST |
| #include <gtest.h> |
| #endif |
| #include <mcld/ADT/Uncopyable.h> |
| #include <mcld/MC/MCLDAttribute.h> |
| |
| namespace mcld |
| { |
| |
| /** \class AttributeFactory |
| * \brief AttributeFactory contructs the AttributeProxys. |
| * |
| * Since the number of AttributeProxys is usually small, sequential search |
| * on a small vector is enough. |
| */ |
| class AttributeFactory : private Uncopyable |
| { |
| private: |
| typedef std::vector<Attribute*> AttrSet; |
| |
| public: |
| typedef AttrSet::iterator iterator; |
| typedef AttrSet::const_iterator const_iterator; |
| |
| public: |
| AttributeFactory(); |
| explicit AttributeFactory(size_t pNum); |
| ~AttributeFactory(); |
| |
| // reserve - reserve the memory space for attributes |
| // @param pNum the number of reserved attributes |
| void reserve(size_t pNum); |
| |
| // predefined - return the predefined attribute |
| Attribute& predefined(); |
| const Attribute& predefined() const; |
| |
| // constraint - return the constraint of attributes |
| AttrConstraint& constraint() |
| { return m_Constraint; } |
| |
| const AttrConstraint& constraint() const |
| { return m_Constraint; } |
| |
| // produce - produce a attribute, but do not record it yet. |
| // the produced attribute is identical to the pre-defined attribute. |
| AttributeProxy* produce(); |
| |
| // last - the last touched attribute. |
| AttributeProxy& last(); |
| const AttributeProxy& last() const; |
| |
| // exists- return the recorded attribute whose content is identical to the |
| // input attribute. |
| Attribute *exists(const Attribute& pAttr) const; |
| |
| // record - record the attribute no mater if it has been recorded. |
| void record(Attribute& pAttr); |
| |
| // ----- observers ----- // |
| size_t size() const |
| { return m_AttrSet.size(); } |
| |
| bool empty() const |
| { return m_AttrSet.empty(); } |
| |
| // ----- iterators ----- // |
| iterator begin() |
| { return m_AttrSet.begin(); } |
| |
| iterator end() |
| { return m_AttrSet.end(); } |
| |
| const_iterator begin() const |
| { return m_AttrSet.begin(); } |
| |
| const_iterator end() const |
| { return m_AttrSet.end(); } |
| |
| private: |
| AttrSet m_AttrSet; |
| AttrConstraint m_Constraint; |
| AttributeProxy *m_pLast; |
| }; |
| |
| } // namespace of mcld |
| |
| #endif |
| |