/* * ObservedValuesContainer_impl.hpp * * Created on: Oct 29, 2015 * Author: heber */ #ifndef OBSERVEDVALUESCONTAINER_IMPL_HPP_ #define OBSERVEDVALUESCONTAINER_IMPL_HPP_ // include config.h #ifdef HAVE_CONFIG_H #include #endif #include "ObservedValuesContainer.hpp" #include "CodePatterns/Assert.hpp" template ObservedValuesContainer::ObservedValuesContainer( const std::string _name, QtObservedInstanceBoard &_board, const onDestroy_t _onDestroy) : NameOfType(_name), board(_board), onDestroy(_onDestroy) {} template typename T::ptr ObservedValuesContainer::get(const id _id) { typename CountedObservedValues_t::iterator iter = ObservedValues.find(_id); ASSERT( iter != ObservedValues.end(), "ObservedValuesContainer::getObservedValues() - no observed values present for " +NameOfType+" "+toString(_id)); const typename T::ptr &obsvalues = iter->second.first; return obsvalues; } template void ObservedValuesContainer::markObservedValuesAsConnected( const id _id) { typename CountedObservedValues_t::iterator iter = ObservedValues.find(_id); ASSERT (iter != ObservedValues.end(), "ObservedValuesContainer::markObservedValuesAsConnected() - Observed value of " +NameOfType+" "+toString(_id)+" is not present yet."); ++(iter->second.second); } template bool ObservedValuesContainer::checkRefCount( const id _id) const { typename CountedObservedValues_t::const_iterator iter = ObservedValues.find(_id); return ((iter != ObservedValues.end()) && (iter->second.second == 0)); } template void ObservedValuesContainer::markObservedValuesAsDisconnected( const id _id) { typename CountedObservedValues_t::iterator iter = ObservedValues.find(_id); ASSERT (iter != ObservedValues.end(), "ObservedValuesContainer::markObservedValuesAsDisconnected() - Observed value of " +NameOfType+" "+toString(_id)+" is not present yet."); ASSERT (iter->second.second != 0, "ObservedValuesContainer::markObservedValuesAsDisconnected() - Observed value of " +NameOfType+" "+toString(_id)+" is already signOff() from all."); --(iter->second.second); if (checkRefCount(_id) && checksubjectKilled(_id)) removeObservedValues(_id); } template bool ObservedValuesContainer::checksubjectKilled( const id _id) const { typename subjectKilledCount_t::const_iterator iter = subjectKilledCount.find(_id); return ((iter != subjectKilledCount.end()) && (iter->second == T::MAX_ObservedTypes)); } template void ObservedValuesContainer::countsubjectKilled(const id _id) { LOG(3, "DEBUG: ObservedValuesContainer got subjectKilled() for an observed value of " << NameOfType << " " << _id); typename subjectKilledCount_t::iterator iter = subjectKilledCount.find(_id); if (iter == subjectKilledCount.end()) { std::pair inserter = subjectKilledCount.insert( std::make_pair(_id, 0) ); iter = inserter.first; } ASSERT (iter->second < T::MAX_ObservedTypes, "ObservedValuesContainer::countsubjectKilled() - all subjectKilled() for " +NameOfType+" "+toString(_id)+" for each observed channel came in already."); ++(iter->second); if (checkRefCount(_id) && checksubjectKilled(_id)) removeObservedValues(_id); } template void ObservedValuesContainer::removeObservedValues(const id _id) { LOG(3, "DEBUG: ObservedValuesContainer removes " << NameOfType << " " << _id); // call callback function onDestroy(_id); subjectKilledCount.erase(_id); ObservedValues.erase(_id); } template bool ObservedValuesContainer::insert(const id _id, const typename T::ptr &_obsvalues) { std::pair inserter = ObservedValues.insert( std::make_pair( _id, std::make_pair(_obsvalues,0) ) ); _obsvalues->activateObserver(); return inserter.second; } template bool ObservedValuesContainer::changeIdentifier(const id _oldid, const id _newid) { const typename CountedObservedValues_t::iterator Colditer = ObservedValues.find(_oldid); const typename CountedObservedValues_t::iterator Cnewiter = ObservedValues.find(_newid); const typename subjectKilledCount_t::iterator Solditer = subjectKilledCount.find(_oldid); const typename subjectKilledCount_t::iterator Snewiter = subjectKilledCount.find(_newid); bool status = ((Colditer != ObservedValues.end()) && (Cnewiter == ObservedValues.end())); status &= ((Solditer != subjectKilledCount.end()) && (Snewiter == subjectKilledCount.end())); // change id here only if still present if (status) { { RefCountedObservedValues_t obsvalues = Colditer->second; ObservedValues.erase(Colditer); ObservedValues.insert( std::make_pair(_newid, obsvalues) ); } { const size_t countvalue = Solditer->second; subjectKilledCount.erase(Solditer); subjectKilledCount.insert( std::make_pair(_newid, countvalue) ); } return true; } else return false; } template size_t ObservedValuesContainer::getRefCount(const id _id) const { typename CountedObservedValues_t::const_iterator iter = ObservedValues.find(_id); return iter->second.second; } template bool ObservedValuesContainer::isPresent(const id _id) const { typename CountedObservedValues_t::const_iterator iter = ObservedValues.find(_id); return (iter != ObservedValues.end()); } #endif /* OBSERVEDVALUESCONTAINER_IMPL_HPP_ */