/* * Copyright 2006 Sony Computer Entertainment Inc. * * Licensed under the MIT Open Source License, for details please see license.txt or the website * http://www.opensource.org/licenses/mit-license.php * */ #ifndef __DAE_META_ATTRIBUTE_H__ #define __DAE_META_ATTRIBUTE_H__ #include #include #include #include #include #include #include class daeElement; class daeMetaElement; class daeMetaAttribute; class daeMetaElementAttribute; /** * The @c daeMetaAttribute class describes one attribute in a C++ COLLADA dom element. * * In the case of the C++ object model a conceptual attribute can be * either a dom attribute, a dom element, or a dom value. * Essentially, the meta attribute describes fields on the C++ class. * However these attributes are stored separately in the containing meta * @c daeMetaElement. * @c daeMetaAttributes always exist inside of @c daeMetaElements. * Each @c daeMetaAttribute has certain semantic operations it is capable of * including @c set(), @c get(), and @c print(). * @c daeMetaAttributes use the @c daeAtomicType system as their underlying semantic * implementation, but contain additional information about the packaging * of the atomic types into the C++ dom classes such as offset, and * array information. */ class DLLSPEC daeMetaAttribute : public daeRefCountedObj { protected: daeStringRef _name; daeInt _offset; daeAtomicType* _type; daeMetaElement* _container; std::string _defaultString; daeMemoryRef _defaultValue; daeBool _isRequired; public: /** * Constructor */ daeMetaAttribute(); /** * Destructor */ virtual ~daeMetaAttribute(); public: /** * Determines if the schema indicates that this is a required attribute. * @return Returns true if this is a required attribute, false if not. */ daeBool getIsRequired() {return _isRequired; } /** * Sets the value that indicates that this attribute is required by the schema. If set, the attribute * will always be exported by the API regardless of its value. * @param isRequired Indicates if the schema says this attribute is required, true if it is, false if not. */ void setIsRequired(daeBool isRequired) {_isRequired = isRequired;} /** * Sets the byte offset (from @c this) where this attribute's storage is * found in its container element class. * @param offset Integer byte offset from @c this pointer. */ void setOffset(daeInt offset) { _offset = offset; } /** * Gets the byte offset (from @ this) where this attribute's storage is * found in its container element class. * @return Returns the integer byte offset from @c this pointer for this attribute. */ daeInt getOffset() { return _offset; } /** * Sets the name of the attribute. * @param name @c daeString that is directly stored as a pointer * without being copied. */ void setName(daeString name) { _name = name; } /** * Gets the name of this attribute. * @return Returnsthe name of this attribute. */ daeStringRef getName() { return _name; } /** * Sets the type of the attribute. * @param type @c daeAtomicType to use for interacting with this * attribute in a containing @c daeElement. */ void setType(daeAtomicType* type) { _type = type; } /** * Gets the @c daeAtomicType used by this attribute. * @return Returns the @c daeAtomicType that this attribute uses for its * implementation. */ daeAtomicType* getType() { return _type; } /** * Sets the default for this attribute via a string. * @param defaultVal @c daeString representing the default value. */ virtual void setDefaultString(daeString defaultVal); /** * Sets the default for this attribute via a memory pointer. * @param defaultVal @c daeMemoryRef representing the default value. */ virtual void setDefaultValue(daeMemoryRef defaultVal); /** * Gets the default for this attribute as a string. * @return Returns a @c daeString representing the default value. */ daeString getDefaultString(); /** * Gets the default for this attribute as a memory value. * @return Returns a @c daeMemoryRef representing the default value. */ daeMemoryRef getDefaultValue(); /** * Sets the containing @c daeMetaElement for this attribute. * @param container Element on which this @c daeMetaAttribute belongs. */ void setContainer(daeMetaElement* container) { _container = container; } /** * Gets the containing @c daeMetaElement for this attribute. * @return Returns the @c daeMetaElement to which this @c daeAttribute belongs. */ daeMetaElement* getContainer() { return _container; } /** * Notifies an attribute when the containing document changes. */ virtual void setDocument(daeElement* e, daeDocument* doc); /** * Converts an element's attribute value to a string. */ virtual void memoryToString(daeElement* e, std::ostringstream& buffer); /** * Converts a string to a memory value in the specified element. */ virtual void stringToMemory(daeElement* e, daeString s); /** * Gets the attribute's memory pointer from containing element e. * @param e Containing element from which to get the value. * @return Returns the memory pointer corresponding to this attribute out of parent element e. */ virtual daeMemoryRef get(daeElement* e); /** * Gets if this attribute is an array attribute. * @return Returns true if this attribute is an array type. */ virtual daeBool isArrayAttribute() { return false; } public: /** * Gets the number of bytes for this attribute. * @return Returns the number of bytes in the C++ COLLADA dom element for this * attribute. */ virtual daeInt getSize(); /** * Gets the alignment in bytes on the class of this meta attribute type. * @return Returns the alignment in bytes. */ virtual daeInt getAlignment(); /** * Copies the value of this attribute from fromElement into toElement. * @param toElement Pointer to a @c daeElement to copy this attribute to. * @param fromElement Pointer to a @c daeElement to copy this attribute from. */ virtual void copy(daeElement* toElement, daeElement* fromElement); /** * Copies the default value of this attribute to the element * @param element Pointer to a @c daeElement to copy the default value to. */ virtual void copyDefault(daeElement* element); /** * Compares the value of this attribute in the given elements. * @param elt1 The first element whose attribute value should be compared. * @param elt2 The second element whose attribute value should be compared. * @return Returns a positive integer if value1 > value2, a negative integer if * value1 < value2, and 0 if value1 == value2. */ virtual daeInt compare(daeElement* elt1, daeElement* elt2); /** * Compares the value of this attribute from the given element to the default value * of this attribute (if one exists). * @param e The element whose value should be compared to the default value. * @return Returns a positive integer if value > default, a negative integer if * value < default, and 0 if value == default. */ virtual daeInt compareToDefault(daeElement* e); public: // These methods are deprecated. virtual daeChar* getWritableMemory(daeElement* e); // Use get instead. virtual void set(daeElement* element, daeString s); // Use stringToMemory instead. }; /** * The @c daeMetaArrayAttribute class is simple a wrapper that implements * an array of atomic types rather than a singleton. * The corresponding storage is an array * and the corresponding operations are implemented on the array * data structure rather than on inlined storage in elements. */ class DLLSPEC daeMetaArrayAttribute : public daeMetaAttribute { public: virtual ~daeMetaArrayAttribute(); /** * Defines the override version of this method from @c daeMetaAttribute. * @param toElement Pointer to a @c daeElement to copy this attribute to. * @param fromElement Pointer to a @c daeElement to copy this attribute from. */ virtual void copy(daeElement* toElement, daeElement* fromElement); /** * Copies the default value of this attribute to the element * @param element Pointer to a @c daeElement to copy the default value to. */ virtual void copyDefault(daeElement* element); /** * Compares the value of this attribute in the given elements. * @param elt1 The first element whose attribute value should be compared. * @param elt2 The second element whose attribute value should be compared. * @return Returns a positive integer if value1 > value2, a negative integer if * value1 < value2, and 0 if value1 == value2. */ virtual daeInt compare(daeElement* elt1, daeElement* elt2); /** * Compares the value of this attribute from the given element to the default value * of this attribute (if one exists). * @param e The element whose value should be compared to the default value. * @return Returns a positive integer if value > default, a negative integer if * value < default, and 0 if value == default. */ virtual daeInt compareToDefault(daeElement* e); /** * Converts an element's attribute value to a string. */ virtual void memoryToString(daeElement* e, std::ostringstream& buffer); /** * Converts a string to a memory value in the specified element. */ virtual void stringToMemory(daeElement* e, daeString s); /** * Sets the default for this attribute via a string. * @param defaultVal @c daeString representing the default value. */ virtual void setDefaultString(daeString defaultVal); /** * Sets the default for this attribute via a memory pointer. * @param defaultVal @c daeMemoryRef representing the default value. */ virtual void setDefaultValue(daeMemoryRef defaultVal); /** * Gets if this attribute is an array attribute. * @return Returns true if this attribute is an array type. */ virtual daeBool isArrayAttribute() { return true; } /** * Notifies an attribute when the containing document changes. */ virtual void setDocument(daeElement* e, daeDocument* doc); }; typedef daeSmartRef daeMetaAttributeRef; typedef daeTArray daeMetaAttributeRefArray; typedef daeTArray daeMetaAttributePtrArray; #endif //__DAE_META_ATTRIBUTE_H__