diff --git a/utilspp/singleton/LifetimeLibrary.cpp b/utilspp/singleton/LifetimeLibrary.cpp new file mode 100644 index 0000000000000000000000000000000000000000..e58932ebde4692b55b67fdce9b569bea80b5b5bc --- /dev/null +++ b/utilspp/singleton/LifetimeLibrary.cpp @@ -0,0 +1,72 @@ +#include "SingletonHolder.hpp" +#include "LifetimeLibrary.hpp" + +utilspp::LifetimeLibraryImpl::LifetimeLibraryImpl() + : + mTrackerArray( NULL ), + mNbElements( 0 ) +{} + +utilspp::LifetimeLibraryImpl::~LifetimeLibraryImpl() +{ + terminate(); +} + +void +utilspp::LifetimeLibraryImpl::add( utilspp::PrivateMembers::LifetimeTracker *tracker ) +{ + utilspp::PrivateMembers::TrackerArray newArray = static_cast< + utilspp::PrivateMembers::TrackerArray >(std::realloc(mTrackerArray, + mNbElements + 1)); + if( newArray == NULL ) + { + throw std::bad_alloc(); + } + + mTrackerArray = newArray; + + utilspp::PrivateMembers::TrackerArray pos = + std::upper_bound(mTrackerArray, + mTrackerArray + mNbElements, + tracker, + &utilspp::PrivateMembers::LifetimeTracker::compare); + std::copy_backward(pos, + mTrackerArray + mNbElements, + mTrackerArray + mNbElements + 1); + + *pos = tracker; + mNbElements++; +}; + +void +utilspp::LifetimeLibraryImpl::terminate() +{ + //The number of elements MUST always be equal or over zero. + assert( mNbElements >= 0 ); + + while( mNbElements > 0 ) + { + //At this point the mTrackerArray MUST not be NULL. + assert( mTrackerArray != NULL ); + + //Pick the element at the top of the stack. + utilspp::PrivateMembers::LifetimeTracker* top = + mTrackerArray[mNbElements - 1]; + + //Remove that object off the stack. + //Don't check errors-realloc with less memory, cause that can't fail. + mTrackerArray = + static_cast< utilspp::PrivateMembers::TrackerArray > + (std::realloc(mTrackerArray, --mNbElements)); + + //Destroy the element. + delete top; + } +} + +unsigned int +utilspp::getLongevity( utilspp::LifetimeLibraryImpl * ) +{ + return 0; +} + diff --git a/utilspp/singleton/PrivateMembers.cpp b/utilspp/singleton/PrivateMembers.cpp new file mode 100644 index 0000000000000000000000000000000000000000..901c9bcc1de5cca25b5d5d2d7b3c2ee93df7c04b --- /dev/null +++ b/utilspp/singleton/PrivateMembers.cpp @@ -0,0 +1,46 @@ +#include <cstdlib> + +#include "PrivateMembers.hpp" + +utilspp::PrivateMembers::TrackerArray + utilspp::PrivateMembers::mTrackerArray = NULL; + +int utilspp::PrivateMembers::mNbElements = 0; + +utilspp::PrivateMembers::LifetimeTracker::LifetimeTracker( unsigned int + longevity ) +: +mLongevity( longevity ) +{} + +utilspp::PrivateMembers::LifetimeTracker::~LifetimeTracker() +{} + +bool +utilspp::PrivateMembers::LifetimeTracker::compare( + const LifetimeTracker *l, + const LifetimeTracker *r + ) +{ + return l->mLongevity < r->mLongevity; +} + +void +utilspp::PrivateMembers::atExitFunc() +{ + assert((mTrackerArray != NULL) && + (mNbElements > 0)); + + //Pick the element at the top of the stack. + LifetimeTracker* top = mTrackerArray[mNbElements - 1]; + + //Remove that object off the stack. + //Don't check errors-realloc with less memory, cause that can't fail. + mTrackerArray = static_cast< + utilspp::PrivateMembers::TrackerArray >(std::realloc(mTrackerArray, + --mNbElements)); + + //Destroy the element. + delete top; +} +