diff options
author | Binh-Minh Ribler <bmribler@hdfgroup.org> | 2000-12-07 00:04:08 (GMT) |
---|---|---|
committer | Binh-Minh Ribler <bmribler@hdfgroup.org> | 2000-12-07 00:04:08 (GMT) |
commit | f148ff3caf533e9f6029798617f0a8087bcd6c05 (patch) | |
tree | 00bb6ca4d0e50aa0e591eed6a0d739c04c93c5e7 /c++/src/H5IdComponent.cpp | |
parent | 7df8cd5cfe22372f603ea058334647fe4017008e (diff) | |
download | hdf5-f148ff3caf533e9f6029798617f0a8087bcd6c05.zip hdf5-f148ff3caf533e9f6029798617f0a8087bcd6c05.tar.gz hdf5-f148ff3caf533e9f6029798617f0a8087bcd6c05.tar.bz2 |
[svn-r3080]
Purpose:
Support portability
Description:
I forgot that source file extension .C will not work on Windows.
Solution:
Changed all source file from *.C to *.cpp for portability.
Platforms tested:
arabica (sparc-sun-solaris 2.7)
Diffstat (limited to 'c++/src/H5IdComponent.cpp')
-rw-r--r-- | c++/src/H5IdComponent.cpp | 136 |
1 files changed, 136 insertions, 0 deletions
diff --git a/c++/src/H5IdComponent.cpp b/c++/src/H5IdComponent.cpp new file mode 100644 index 0000000..2b7bff8 --- /dev/null +++ b/c++/src/H5IdComponent.cpp @@ -0,0 +1,136 @@ +#include <string> + +#include "H5Include.h" +#include "H5RefCounter.h" +#include "H5Exception.h" +#include "H5Library.h" +#include "H5IdComponent.h" +#include "H5Idtemplates.h" + +#ifndef H5_NO_NAMESPACE +namespace H5 { +#endif + +// Default constructor - private +IdComponent::IdComponent() : id( 0 ) +{ + // starts counting object references + ref_count = new RefCounter; +} + +// Constructor that takes an HDF5 object id. It creates an instance +// of IdComponent to hold the HDF5 id +IdComponent::IdComponent( hid_t h5_id ) : id( h5_id ) +{ + // starts counting object references + ref_count = new RefCounter; +} + +// Copy constructor: makes a copy of the original object +IdComponent::IdComponent( const IdComponent& original ) +{ + id = original.id; + ref_count = original.ref_count; // points to the same ref counter + ref_count->increment(); // increment number of references to this id +} + +// Increment reference counter +void IdComponent::incRefCount() { ref_count->increment(); } + +// Decrement reference counter +void IdComponent::decRefCount() { ref_count->decrement(); } + +// Get the reference counter to this identifier +int IdComponent::getCounter() { return( ref_count->getCounter()); } + +// Decrements the reference counter then determines if there are no more +// reference to this object +bool IdComponent::noReference() +{ + if( ref_count->getCounter() > 0 ) + ref_count->decrement(); + return( ref_count->getCounter() == 0 ? true:false ); +} + +/* Assignment operator. + Description: + Reset the identifier of this object so that the HDF5 id can be properly + closed. Copy the new identifier to this object, then increment the + reference counter of the identifier to indicate that another object + is referencing the identifier. +*/ +IdComponent& IdComponent::operator=( const IdComponent& rhs ) +{ + // reset the identifier of this object - resetIdComponent will call the + // appropriate H5xclose to close the id + resetIdComponent( this ); + + // copy the data members from the rhs object + id = rhs.id; + ref_count = rhs.ref_count; // points to the same ref counter + + // increment the reference counter + ref_count->increment(); + + return( *this ); +} + +/* Sets the identifier of this object to a new value + Description: + Reset the current identifier of this object so that the HDF5 + id can be appropriately closed. If only this object references + its identifier, its reference counter will be deleted. A new + reference counter is created for the new HDF5 object id. +*/ +void IdComponent::setId( hid_t new_id ) +{ + // reset the identifier of this object, call appropriate H5Xclose + resetIdComponent( this ); + + id = new_id; + + // starts counting object references + ref_count = new RefCounter; +} + +// Gets the id of this object +hid_t IdComponent::getId () const +{ + return( id ); +} + +// Reset this object by deleting its RefCounter +void IdComponent::reset () +{ + delete ref_count; +} + +// Default destructor +IdComponent::~IdComponent() { + +/* uncomment this block when decide to use dontAtExit or fix the atexit/ + global destructor problem - BMR 11/14/00 + + if( id == NOTATEXIT ) + { + // Call H5Library::close to clean up - temporary solution to avoid the + // trouble of atexit/global destructors + try { + if( H5Library::need_cleanup == true ) + { + H5Library::close(); + H5Library::need_cleanup = false; // reset the boolean just in case + } + } + // catch failure caused by the H5Library operations + catch( LibraryIException error ) + { + error.printError(); + } + } +*/ +} + +#ifndef H5_NO_NAMESPACE +} +#endif |