+
+ /*!
+ * \brief Auto pointer
+ */
+ template <typename TOBJ>
+ struct Deleter
+ {
+ TOBJ* _obj;
+ explicit Deleter( TOBJ* obj = (TOBJ*)NULL ): _obj( obj ) {}
+ ~Deleter() { delete _obj; _obj = 0; }
+ TOBJ& operator*() const { return *_obj; }
+ TOBJ* operator->() const { return _obj; }
+ operator bool() const { return _obj; }
+ private:
+ Deleter( const Deleter& );
+ };
+
+ /*!
+ * \brief Auto pointer to array
+ */
+ template <typename TOBJ>
+ struct ArrayDeleter
+ {
+ TOBJ* _obj;
+ ArrayDeleter( TOBJ* obj ): _obj( obj ) {}
+ ~ArrayDeleter() { delete [] _obj; _obj = 0; }
+ private:
+ ArrayDeleter( const ArrayDeleter& );
+ };
+
+ /*!
+ * \return SMDS_ElemIteratorPtr on an std container of SMDS_MeshElement's
+ */
+ template < class ELEM_SET >
+ SMDS_ElemIteratorPtr elemSetIterator( const ELEM_SET& elements )
+ {
+ typedef SMDS_SetIterator
+ < SMDS_pElement, typename ELEM_SET::const_iterator> TSetIterator;
+ return boost::make_shared< TSetIterator >( elements.begin(), elements.end() );
+ }
+
+ /*!
+ * \brief Increment enum value
+ */
+ template < typename ENUM >
+ void Increment( ENUM& v, int delta=1 )
+ {
+ v = ENUM( int(v)+delta );
+ }
+
+ /*!
+ * \brief Return incremented enum value
+ */
+ template < typename ENUM >
+ ENUM Add( ENUM v, int delta )
+ {
+ return ENUM( int(v)+delta );
+ }