/** * @file * * @copyright * @verbatim Copyright @ 2017 Audi Electronics Venture GmbH. All rights reserved. This Source Code Form is subject to the terms of the Mozilla Public License, v. 2.0. If a copy of the MPL was not distributed with this file, You can obtain one at https://mozilla.org/MPL/2.0/. If it is not possible or desirable to put the notice in a particular file, then You may include the notice in a location (such as a LICENSE file in a relevant directory) where a recipient would be likely to look for such a notice. You may add additional accurate notices of copyright ownership. @endverbatim */ #ifndef DDL_DESCRIPTION_H_INCLUDED #define DDL_DESCRIPTION_H_INCLUDED #include "ddl_common.h" #include "ddl_type.h" #include "ddlvisitor_intf.h" #include "ddlcontainer.h" #include "ddlversion.h" namespace ddl { /** * Main class representing a whole DDL description */ class DDLDescription : public DDL { public: /** * CTOR * @param[in] header - Pointer to Header object * @param[in] units - Vector of units (optional) * @param[in] baseunits - Vector of baseunits (optional) * @param[in] prefixes - Vector of prefixes (optional) * @param[in] dts - Vector of datatypes (optional) * @param[in] structs - Vector of complex datatypes (optional) * @param[in] streams - Vector of streams (optional) * @param[in] enums - Vector of enums (optional) * @param[in] merge_defaults Whether or not to merge DDL default elements (datatypes etc.). */ DDLDescription(DDLHeader* header, const DDLUnitVec& units = DDLUnitVec(), const DDLBaseunitVec& baseunits = DDLBaseunitVec(), const DDLPrefixVec& prefixes = DDLPrefixVec(), const DDLDTVec& dts = DDLDTVec(), const DDLComplexVec& structs = DDLComplexVec(), const DDLStreamVec& streams = DDLStreamVec(), const DDLEnumVec& enums = DDLEnumVec(), bool merge_defaults = true); /** * Do not allow copying * @param[in] other - Reference to description object to copy */ DDLDescription(const DDLDescription&) = delete; /** * Assignment operator (moves) * @param[in] other Description type to copy from * @return @c *this */ DDLDescription& operator=(DDLDescription other); /** * Move CTOR * @param[in,out] other Complex DDL type to move from - empty but valid when finished */ DDLDescription(DDLDescription&& other); /** * DTOR */ virtual ~DDLDescription(); a_util::result::Result accept(IDDLVisitor *visitor) const; a_util::result::Result accept(IDDLChangeVisitor *visitor); bool isInitialized() const; const std::string& getName() const; /** * Creation method to fill the object with data. * @param[in] header - Pointer to Header object * @param[in] units - Vector of units (optional) * @param[in] baseunits - Vector of baseunits (optional) * @param[in] prefixes - Vector of prefixes (optional) * @param[in] dts - Vector of datatypes (optional) * @param[in] structs - Vector of complex datatypes (optional) * @param[in] streams - Vector of streams (optional) * @param[in] enums - Vector of enums (optional) * @retval ERR_POINTER Null-pointer committed */ a_util::result::Result create(DDLHeader* header, DDLUnitVec units = DDLUnitVec(), DDLBaseunitVec baseunits = DDLBaseunitVec(), DDLPrefixVec prefixes = DDLPrefixVec(), DDLDTVec dts = DDLDTVec(), DDLComplexVec structs = DDLComplexVec(), DDLStreamVec streams = DDLStreamVec(), DDLEnumVec enums = DDLEnumVec()); /** * Getter for the DDL header. * @return the header */ DDLHeader * getHeader() const; /** * Setter for the units. * @param[in] units - Vector of unit objects * * @return void */ void cloneUnits(const DDLUnitVec& units); /** * Setter for the units. * @param[in] units - Vector of unit objects * * @return void */ void refUnits(DDLUnitVec& units); /** * Merger for the units. * @param[in] units - Vector of unit objects * @param[in] join_flags - Additional flags for join/merge process (optional) * @param[in] delete_data - deletion vector for optimezed deletion * * @return void */ void mergeUnits(DDLUnitVec units, uint32_t join_flags = 0, DDLVec* delete_data = NULL); /** * Adder for an unit object. * @param[in] unit - Pointer to the unit object to add * @param[in] pos - Position to add the unit object * * @return void */ void addUnit(DDLUnit* unit, int pos = -1); /** * Getter for the units. * @return vector of units */ DDLUnitVec& getUnits(); /** * Getter for the units. * @return vector of units */ const DDLUnitVec& getUnits() const; /** * Getter for a specific unit object. * @param[in] name - Name of the unit to look for * @return pointer to the unit object or \c NULL if not found */ const DDLUnit* getUnitByName(const std::string& name) const; /** * Getter for a specific unit object. * @param[in] name - Name of the unit to look for * @return pointer to the unit object or \c NULL if not found */ DDLUnit* getUnitByName(const std::string& name); /** * Setter for the baseunits. * @param[in] baseunits - Vector of baseunit objects * * @return void */ void cloneBaseunits(const DDLBaseunitVec& baseunits); /** * Setter for the baseunits. * @param[in] baseunits - Vector of baseunit objects * * @return void */ void refBaseunits(DDLBaseunitVec& baseunits); /** * Merger for the baseunits. * @param[in] baseunits - Vector of baseunit objects * @param[in] join_flags - Additional flags for join/merge process (optional) * @param[in, out] delete_data - temporary vector for data that can be deleted afterwards. * * @return void */ void mergeBaseunits(DDLBaseunitVec baseunits, uint32_t join_flags = 0, DDLVec* delete_data = NULL); /** * Adder for a baseunit object. * @param[in] baseunit - Pointer to the baseunit object to add * @param[in] pos - Position to add the baseunit object * * @return void */ void addBaseunit(DDLBaseunit* baseunit, int pos = -1); /** * Getter for the baseunits. * @return vector of baseunits */ DDLBaseunitVec getBaseunits() const; /** * Getter for a specific baseunit object. * @param[in] name - Name of the baseunit to look for * @return pointer to the baseunit object or \c NULL if not found */ const DDLBaseunit* getBaseunitByName(const std::string& name) const; /** * Getter for a specific baseunit object. * @param[in] name - Name of the baseunit to look for * @return pointer to the baseunit object or \c NULL if not found */ DDLBaseunit* getBaseunitByName(const std::string& name); /** * Setter for the prefixes. * @param[in] prefixes - Vector of prefix objects * * @return void */ void clonePrefixes(const DDLPrefixVec& prefixes); /** * Setter for the prefixes. * @param[in] prefixes - Vector of prefix objects * * @return void */ void refPrefixes(DDLPrefixVec& prefixes); /** * Merger for the prefixes. * @param[in] prefixes - Vector of prefix objects * @param[in] join_flags - Additional flags for join/merge process (optional) * @param[in, out] delete_data - temporary vector for data that can be deleted afterwards. * * @return void */ void mergePrefixes(DDLPrefixVec prefixes, uint32_t join_flags = 0, DDLVec* delete_data = NULL); /** * Adder for a prefix object * @param[in] prefix - Pointer to the prefix object to add * @param[in] pos - Position to add the prefix object * * @return void */ void addPrefix(DDLPrefix* prefix, int pos = -1); /** * Getter for the prefixes * @return vector of prefixes */ DDLPrefixVec getPrefixes() const; /** * Getter for a specific prefix object. * @param[in] name - Name of the prefix to look for * @return pointer to the prefix object or \c NULL if not found */ DDLPrefix* getPrefixByName(const std::string& name); /** * Getter for a specific prefix object. * @param[in] name - Name of the prefix to look for * @return pointer to the prefix object or \c NULL if not found */ const DDLPrefix* getPrefixByName(const std::string& name) const; /** * Setter for the data types. * @param[in] data_types - Vector of datatypes * * @return void */ void cloneDatatypes(const DDLDTVec& data_types); /** * Setter for the data types. * @param[in] data_types - Vector of datatypes * * @return void */ void refDatatypes(DDLDTVec& data_types); /** * Setter for the constants. * @param[in] enums - Vector of enums * * @return void */ void refEnums(DDLEnumVec& enums); /** * Merger for the constants. * @param[in] enums - Vector of constants * @param[in] join_flags - Additional flags for join/merge process (optional) * @param[in, out] delete_data - temporary vector for data that can be deleted afterwards. * * @return void */ void mergeEnums(DDLEnumVec enums, uint32_t join_flags = 0, DDLVec* delete_data = NULL); /** * Setter for the enums. * @param[in] enumss - Vector of enums * * @return void */ void cloneEnums(const DDLEnumVec& enums); /** * Adder for a enum object. * @param[in] ddl_enum - Pointer to the enum object to add * @param[in] pos - Position to add the enum object * * @return void */ void addEnum(DDLEnum* ddl_enum, int pos = -1); /** * Getter for a specific enum object. * @param[in] name - Name of the enum to look for * @return pointer to the enum object or \c NULL if not found */ DDLEnum* getEnumByName(const std::string& name); /** * Getter for a specific enum object. * @param[in] name - Name of the enum to look for * @return pointer to the enum object or \c NULL if not found */ const DDLEnum* getEnumByName(const std::string& name) const; /** * Merger for the data types. * @param[in] data_types - Vector of datatypes * @param[in] join_flags - Additional flags for join/merge process (optional) * @param[in, out] delete_data - temporary vector for data that can be deleted afterwards. * * @return void */ void mergeDatatypes(DDLDTVec data_types, uint32_t join_flags = 0, DDLVec* delete_data = NULL); /** * Adder for a datatype object. * @param[in] datatype - Pointer to the datatype object to add * @param[in] pos - Position to add the datatype object * * @return void */ void addDatatype(DDLDataType* datatype, int pos = -1); /** * Getter for the datatypes. * @return vector of datatypes */ DDLDTVec& getDatatypes(); /** * Getter for the datatypes. * @return vector of datatypes */ const DDLDTVec& getDatatypes() const; /** * Getter for the enums. * @return vector of enums */ DDLEnumVec& getEnums(); /** * Getter for the enums. * @return vector of enums */ const DDLEnumVec& getEnums() const; /** * Getter for a specific data-type object. * @param[in] name - Name of the data type to look for * @return pointer to the data-type object or \c NULL if not found */ DDLDataType* getDataTypeByName(const std::string& name); /** * Getter for a specific data-type object. * @param[in] name - Name of the data type to look for * @return pointer to the data-type object or \c NULL if not found */ const DDLDataType* getDataTypeByName(const std::string& name) const; /** * Setter for the complex datatypes. * @param[in] structs - Vector of complex datatypes * * @return void */ void cloneStructs(const DDLComplexVec& structs); /** * Setter for the complex datatypes. * @param[in] structs - Vector of complex datatypes * * @return void */ void refStructs(DDLComplexVec& structs); /** * Merger for the complex datatypes. * @param[in] structs - Vector of complex datatypes * @param[in] join_flags - Additional flags for join/merge process (optional) * @param[in, out] delete_data - temporary vector for data that can be deleted afterwards. * * @return void */ void mergeStructs(DDLComplexVec structs, uint32_t join_flags = 0, DDLVec* delete_data = NULL); /** * Adder for a complex datatype object. * @param[in] ddl_struct - Pointer to the complex datatype object to add * @param[in] pos - Position to add the complex datatype object * * @return void */ void addStruct(DDLComplex *ddl_struct, int pos = -1); /** * Getter for the boolean identifying dynamic elements in structures. * @return true if dynamic elements were found in at least one structure */ bool hasDynamicStructs(); /** * Getter for the complex datatypes. * @return vector of complex datatypes */ DDLComplexVec& getStructs(); /** * Getter for the complex datatypes. * @return vector of complex datatypes */ const DDLComplexVec& getStructs() const; /** * Getter for a specific struct object. * @param[in] name - Name of the struct to look for * @return pointer to the struct object or \c NULL if not found */ const DDLComplex * getStructByName(const std::string& name) const; /** * Getter for a specific struct object. * @param[in] name - Name of the struct to look for * @return pointer to the struct object or \c NULL if not found */ DDLComplex* getStructByName(const std::string& name); /** * Removes the specified primitive or complex data-type. * @param[in] name - Name of the type to remove * @retval ERR_NOT_FOUND The specified data type was not found * @attention Be careful with the removal of data types! There could * be some streams which depend on the removed type! This possible * dependency is not checked! */ a_util::result::Result removeType(const std::string& name); /** * Removes the specified primitive data-type. * @param[in] name - Name of the type to remove * @retval ERR_NOT_FOUND The specified data type was not found * @attention Be careful with the removal of data types! There could * be some streams which depend on the removed type! This possible * dependency is not checked! */ a_util::result::Result removeDataType(const std::string& name); /** * Removes the specified complex data-type. * @param[in] name - Name of the type to remove * @retval ERR_NOT_FOUND The specified data type was not found * @attention Be careful with the removal of data types! There could * be some streams which depend on the removed type! This possible * dependency is not checked! */ a_util::result::Result removeComplexDataType(const std::string& name); /** * Method moves the specified external header declaration. * @param[in] from - Current element position in the list * @param[in] to - New element position in the list * @retval ERR_OUT_OF_RANGE Input parameters are out of range. */ a_util::result::Result moveHeaderExcDec(const int from, const int to); /** * Method moves the specified base unit. * @param[in] from - Current element position in the list * @param[in] to - New element position in the list * @retval ERR_OUT_OF_RANGE Input parameters are out of range. */ a_util::result::Result moveBaseunit(const int from, const int to); /** * Method moves the specified prefix. * @param[in] from - Current element position in the list * @param[in] to - New element position in the list * @retval ERR_OUT_OF_RANGE Input parameters are out of range. */ a_util::result::Result movePrefix(const int from, const int to); /** * Method moves the specified unit. * @param[in] from - Current element position in the list * @param[in] to - New element position in the list * @retval ERR_OUT_OF_RANGE Input parameters are out of range. */ a_util::result::Result moveUnit(const int from, const int to); /** * Method moves the specified element within a unit. * @param[in] from - Current element position in the list * @param[in] to - New element position in the list * @param[in] parent - Unit name * @retval ERR_OUT_OF_RANGE Input parameters are out of range. */ a_util::result::Result moveRefUnit(const int from, const int to, const std::string& parent); /** * Method moves the specified enum-type. * @param[in] from - Current element position in the list * @param[in] to - New element position in the list * @retval ERR_OUT_OF_RANGE Input parameters are out of range. */ a_util::result::Result moveEnum(const int from, const int to); /** * Method moves the specified enum element. * @param[in] from - Current element position in the list * @param[in] to - New element position in the list * @param[in] parent - Name of parent element * @retval ERR_OUT_OF_RANGE Input parameters are out of range. */ a_util::result::Result moveEnumElement(const int from, const int to, const std::string& parent); /** * Method moves the specified data-type. * @param[in] from - Current element position in the list * @param[in] to - New element position in the list * @retval ERR_OUT_OF_RANGE Input parameters are out of range. */ a_util::result::Result moveDatatype(const int from, const int to); /** * Method moves the specified complex data-type. * @param[in] from - Current element position in the list * @param[in] to - New element position in the list * @retval ERR_OUT_OF_RANGE Input parameters are out of range. */ a_util::result::Result moveComplexDataType(const int from, const int to); /** * Method moves the specified element within complex data-type. * @param[in] from - Current element position in the list * @param[in] to - New element position in the list * @param[in] parent - Name of parent element * @retval ERR_OUT_OF_RANGE Input parameters are out of range. */ a_util::result::Result moveComplexDataTypeElement(const int from, const int to, const std::string& parent); /** * Method moves the specified stream. * @param[in] from - Current element position in the list * @param[in] to - New element position in the list * @retval ERR_OUT_OF_RANGE Input parameters are out of range. */ a_util::result::Result moveStream(const int from, const int to); /** * Removes the specified BaseUnit type. * @param[in] name - Name of the baseunit to remove * @retval ERR_NOT_FOUND The specified base was not found * @attention Be careful with the removal of data types! There could * be some streams which depend on the removed unit! This possible * dependency is not checked! */ a_util::result::Result removeBaseunit(const std::string& name); /** * Removes the specified Unit type. * @param[in] name - Name of the prefix to remove * @retval ERR_NOT_FOUND The specified base was not found * @attention Be careful with the removal of data types! There could * be some streams which depend on the removed unit! This possible * dependency is not checked! */ a_util::result::Result removePrefix(const std::string& name); /** * Removes the specified Unit type. * @param[in] name - Name of the unit to remove * @retval ERR_NOT_FOUND The specified base was not found * @attention Be careful with the removal of data types! There could * be some streams which depend on the removed unit! This possible * dependency is not checked! */ a_util::result::Result removeUnit(const std::string& name); /** * Removes the specified enum. * @param[in] name - Name of the enum to remove * @retval ERR_NOT_FOUND The specified enum was not found * @attention Be careful with the removal of enums! There could * be some streams which depend on the removed type! This possible * dependency is not checked! */ a_util::result::Result removeEnum(const std::string& name); /** * Setter for the streams. * @param[in] streams - Vector of streams * * @return void */ void cloneStreams(const DDLStreamVec& streams); /** * Setter for the streams. * @param[in] streams - Vector of streams * * @return void */ void refStreams(DDLStreamVec& streams); /** * Merger for the streams. * @param[in] streams - Vector of stream objects * @param[in] join_flags - Additional flags for join/merge process (optional) * @param[in, out] delete_data - temporary vector for data that can be deleted afterwards. * * @return void */ void mergeStreams(DDLStreamVec streams, uint32_t join_flags = 0, DDLVec* delete_data = NULL); /** * Adder for a stream object. * @param[in] stream - Pointer to the stream object to add * @param[in] pos - Position to add the stream object * * @return void */ void addStream(DDLStream* stream, int pos = -1); /** * Getter for the streams. * @return vector of streams */ DDLStreamVec& getStreams(); /** * Getter for the streams. * @return vector of streams */ const DDLStreamVec& getStreams() const; /** * Getter for a specific stream object. * @param[in] name - Name of the stream to look for * @return pointer to the stream object or \c NULL if not found * @remarks As the name attribute is optional only streams with * originally defined name can be found. */ DDLStream * getStreamByName(const std::string& name); /** * Getter for a specific stream object. * @param[in] name - Name of the stream to look for * @return pointer to the stream object or \c NULL if not found * @remarks As the name attribute is optional only streams with * originally defined name can be found. */ const DDLStream * getStreamByName(const std::string& name) const; /** * Renames the specified stream. * @param[in] old_name - Current name of the stream to rename * @param[in] new_name - New name of the stream * @retval ERR_NOT_FOUND The specified stream was not found * @remarks As the name attribute is optional only streams with * originally defined name can be found. */ a_util::result::Result renameStream(const std::string& old_name, const std::string& new_name); /** * Removes the specified stream from the description. * @param[in] name - Name of the stream to remove * @retval ERR_NOT_FOUND The specified stream was not found * @remarks As the name attribute is optional only streams with * originally defined name can be found. */ a_util::result::Result removeStream(const std::string& name); /** * Setter for the streams. * @param[in] streams - Vector of streams * * @return void */ void cloneStreamMetaTypes(const DDLStreamMetaTypeVec& streams); /** * Setter for the streams. * @param[in] streams - Vector of streams * * @return void */ void refStreamMetaTypes(DDLStreamMetaTypeVec& streams); /** * Merger for the streams. * @param[in] streams - Vector of stream objects * @param[in] join_flags - Additional flags for join/merge process (optional) * @param[in, out] delete_data - temporary vector for data that can be deleted afterwards. * * @return void */ void mergeStreamMetaTypes(DDLStreamMetaTypeVec streams, uint32_t join_flags = 0, DDLVec* delete_data = NULL); /** * Adder for a stream object. * @param[in] stream - Pointer to the stream object to add * @param[in] pos - Position to add the stream object * * @return void */ void addStreamMetaType(DDLStreamMetaType* stream, int pos = -1); /** * Getter for the streams. * @return vector of streams */ DDLStreamMetaTypeVec& getStreamMetaTypes(); /** * Getter for the streams. * @return vector of streams */ const DDLStreamMetaTypeVec& getStreamMetaTypes() const; /** * Getter for a specific stream object. * @param[in] name - Name of the stream to look for * @return pointer to the stream object or \c NULL if not found * @remarks As the name attribute is optional only streams with * originally defined name can be found. */ DDLStreamMetaType * getStreamMetaTypeByName(const std::string& name); /** * Getter for a specific stream object. * @param[in] name - Name of the stream to look for * @return pointer to the stream object or \c NULL if not found * @remarks As the name attribute is optional only streams with * originally defined name can be found. */ const DDLStreamMetaType * getStreamMetaTypeByName(const std::string& name) const; /** * Renames the specified stream. * @param[in] old_name - Current name of the stream to rename * @param[in] new_name - New name of the stream * @retval ERR_NOT_FOUND The specified stream was not found * @remarks As the name attribute is optional only streams with * originally defined name can be found. */ a_util::result::Result renameStreamMetaType(const std::string& old_name, const std::string& new_name); /** * Removes the specified stream from the description. * @param[in] name - Name of the stream to remove * @retval ERR_NOT_FOUND The specified stream was not found * @remarks As the name attribute is optional only streams with * originally defined name can be found. */ a_util::result::Result removeStreamMetaType(const std::string& name); /** * Merges another DDL ito this one. * @param[in] ddl - Reference to DDL object to merge ito this object * @param[in] join_flags - Additional flags for join/merge process (optional) * @retval ERR_INVALID_VERSION Incompatible DDL descriptions detected (not the same DDL version) */ a_util::result::Result merge(DDLDescription &ddl, uint32_t join_flags = 0); /** * Deprecated, see IMediaDescriptionStack for the mechanism provided by the Media * Description Service that superseeds this functionality. * * Method to remove all representation objects of the specified level * and above. * @param[in] level - Creation level from which all representation * objects should be removed * @retval ERR_INVALID_HANDLE Validation of remaining DDL failed */ a_util::result::Result restoreLevel (int const level); /** * Method to create a default DDL description. * @param [in] creation_level Creation level to use (optional) * @param [in] sorted Sorts all DDL items by name for better performance. (optional) * @return pointer to the created description * @attention The caller/user has the responsibility for the created * DDL object! Especially take this aspect ito consideration in * matters of the deallocation of memory! */ static DDLDescription * createDefault(int const creation_level = 1, bool sorted = true); /** * Overloaded method. * @copydoc DDLDescription::createDefault * @param [in] version The version of the description. Pass 0 to get the newest version. * @return pointer to the created description */ static DDLDescription * createDefault(const DDLVersion& version, int const creation_level = 1, bool sorted = true); /** * Add swap functionality, also enabling the copy-swap-idiom * @param[in,out] lhs Left-hand side ddl description * @param[in,out] rhs Right-hand side ddl description */ friend void swap(DDLDescription& lhs, DDLDescription& rhs) noexcept; private: // methods /** * Hidden default CTOR */ DDLDescription() = default; /** * Helper method to merge a vector of representation objects ito the * according vector inside another DDL description. * @tparam T - Representation object type (e.g. DDLUnit) * @param[in] member_data - Vector of objects to merge ito * @param[in] other_data - Vector of objects to merge * @param[in] join_flags - Additional flags for join/merge process (optional) * @param[in] delete_data_mem - pointer to Vector of Object that can be deleted * @param[in] desc * @param[in] refs - Add references or clone * @param[in] delete_non_overwritten - default value is false * @retval true if member_data was updated * @retval false otherwise */ template static bool mergePart(DDLContainer &member_data, DDLContainer &other_data, uint32_t join_flags, DDLVec* delete_data_mem, DDLDescription* desc, const bool& refs, const bool& delete_non_overwritten = false); static void copyMinMaxValues(DDLDataType* dest_container, DDLDataType* src_container); private: // members DDLHeader * _header; DDLUnitVec _units; DDLBaseunitVec _baseunits; DDLPrefixVec _prefixes; DDLDTVec _data_types; DDLEnumVec _enums; DDLComplexVec _structs; DDLStreamVec _streams; DDLStreamMetaTypeVec _stream_meta_types; bool _init_flag; bool _merge_defaults; }; /** * This class template provides a auto deletion for DDL vector content like DDLEnumVec, DDLUnitVec etc. * @param [in] VECTOR_TYPE The Vector Type class name the auto deletion of the vector content is performed. */ template < class VECTOR_TYPE > class DDLAutoVec { private: std::vector < VECTOR_TYPE* >* _sync_vec; public: /** * CTOR. * @param [in] sync_vec pointer to the vector is auto delete. */ DDLAutoVec(std::vector< VECTOR_TYPE* >* sync_vec) { set(sync_vec); }; /** * Copy CTOR * @param[in] other DDL datatype object to copy from */ DDLAutoVec(const DDLAutoVec& other) = default; /** * Assignment operator (either copies or moves) * @param[in] other DDL datatype object to copy from * @return @c *this */ DDLAutoVec& operator= (DDLAutoVec other) { swap(*this, other); return *this; } /** * Move CTOR * @param[in,out] other DDL datatype object to move from - empty but valid when finished */ DDLAutoVec(DDLAutoVec&& other) { swap(*this, other); } /** * DTOR. */ ~DDLAutoVec() { autoDelete(); }; /** * Reset the DDL vector pointer. * @remark no deletion will be made at this time * * @return void */ void reset() { _sync_vec = NULL; } /** * Reset the DDL vector pointer and set the given one. * @remark no deletion will be made at this time. * @param [in] sync_vec pointer to the vector is auto delete. * * @return void */ void set(std::vector< VECTOR_TYPE* >* sync_vec) { reset(); _sync_vec = sync_vec; } /** * Add swap functionality, also enabling the copy-swap-idiom * @param[in,out] lhs Left-hand side ddl type * @param[in,out] rhs Right-hand side ddl type */ friend void swap(DDLAutoVec& lhs, DDLAutoVec& rhs) { using std::swap; swap(lhs._sync_vec, rhs._sync_vec); } private: /** * Deletes the current set sync pointer to an DDL Vector */ void autoDelete() { if (_sync_vec) { std::transform(_sync_vec->begin(), _sync_vec->end(), _sync_vec->begin(), ddl::DDLDescription::deleteChild< VECTOR_TYPE > ); } } }; } // namespace ddl #endif // DDL_DESCRIPTION_H_INCLUDED