//===- AttributeSet.h -----------------------------------------------------===//
//
//                     The MCLinker Project
//
// This file is distributed under the University of Illinois Open Source
// License. See LICENSE.TXT for details.
//
//===----------------------------------------------------------------------===//
#ifndef MCLD_ATTRIBUTE_SET_H
#define MCLD_ATTRIBUTE_SET_H
#ifdef ENABLE_UNITTEST
#include <gtest.h>
#endif
#include <mcld/ADT/Uncopyable.h>
#include <vector>

namespace mcld {

class Attribute;

/** \class AttributeSet
 *  \brief AttributeSet is a set of Attribute.
 *
 *  Clients delegates Attributes to AttributeSet. AttributeSet deletes delegated
 *  Attributes during destruction.
 */
class AttributeSet : private Uncopyable
{
private:
  typedef std::vector<Attribute*> AttrSet;

public:
  typedef AttrSet::iterator iterator;
  typedef AttrSet::const_iterator const_iterator;

public:
  AttributeSet(unsigned int pNum, const Attribute& pPredefined);

  ~AttributeSet();

  // -----  iterators  ----- //
  const_iterator begin() const { return m_AttrSet.begin(); }
  iterator       begin()       { return m_AttrSet.begin(); }
  const_iterator end  () const { return m_AttrSet.end(); }
  iterator       end  ()       { return m_AttrSet.end(); }

  // 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);

private:
  AttrSet m_AttrSet;
  const Attribute& m_Predefined;
};

} // namespace of mcld

#endif