//===- ELFAttributeValue.h ------------------------------------------------===// // // The MCLinker Project // // This file is distributed under the University of Illinois Open Source // License. See LICENSE.TXT for details. // //===----------------------------------------------------------------------===// #ifndef MCLD_TARGET_ELFATTRIBUTEVALUE_H_ #define MCLD_TARGET_ELFATTRIBUTEVALUE_H_ #include namespace mcld { /** \class ELFAttributeValue * \brief ELFAttributeValue stroes the value of an attribute tag. The attribtue * tag itself is not stored in this object. */ class ELFAttributeValue { public: // Type of value that an attribute tag holds. enum Type { // The value contains no data and has unknown type. Uninitialized = 0, // The value contains integer data. Int = 1L << 0, // The value contains string data. String = 1L << 1, // This is for attribute in which "default value" (0 for int type and empty // string for string type) has special meaning for them. That is, the // default value is "disabled" and meaningful for those attribute. NoDefault = 1L << 2, }; public: ELFAttributeValue() : m_Type(Uninitialized), m_IntValue(0), m_StringValue() {} ~ELFAttributeValue() {} public: unsigned int type() const { return m_Type; } void setType(unsigned int pType) { m_Type = pType; } unsigned int getIntValue() const { return m_IntValue; } void setIntValue(unsigned int pIntValue) { m_IntValue = pIntValue; } const std::string& getStringValue() const { return m_StringValue; } void setStringValue(const std::string& pStringValue) { m_StringValue = pStringValue; } void setStringValue(const char* pStringValue, size_t pSize) { m_StringValue.assign(pStringValue, pSize); } void setStringValue(const char* pStringValue) { m_StringValue.assign(pStringValue); } size_t getSize() const; inline bool isUninitialized() const { return (m_Type == Uninitialized); } inline bool isInitialized() const { return !isUninitialized(); } inline bool isIntValue() const { return (m_Type & Int); } inline bool isStringValue() const { return (m_Type & String); } inline bool hasNoDefault() const { return (m_Type & NoDefault); } bool isDefaultValue() const; // Returns true if this attribute value should be emitted to the output. inline bool shouldEmit() const { // Attribute with non-default value should be emitted. return !isDefaultValue(); } bool equals(const ELFAttributeValue& pValue) const; bool operator==(const ELFAttributeValue& pValue) const { return equals(pValue); } bool operator!=(const ELFAttributeValue& pValue) const { return !equals(pValue); } /// reset - reset this value to the uninitialized state void reset() { m_Type = Uninitialized; m_IntValue = 0; m_StringValue.clear(); return; } private: unsigned int m_Type; unsigned int m_IntValue; std::string m_StringValue; }; } // namespace mcld #endif // MCLD_TARGET_ELFATTRIBUTEVALUE_H_