| 1 | /*
|
|---|
| 2 | * ObservedValuesContainer_impl.hpp
|
|---|
| 3 | *
|
|---|
| 4 | * Created on: Oct 29, 2015
|
|---|
| 5 | * Author: heber
|
|---|
| 6 | */
|
|---|
| 7 |
|
|---|
| 8 |
|
|---|
| 9 | #ifndef OBSERVEDVALUESCONTAINER_IMPL_HPP_
|
|---|
| 10 | #define OBSERVEDVALUESCONTAINER_IMPL_HPP_
|
|---|
| 11 |
|
|---|
| 12 | // include config.h
|
|---|
| 13 | #ifdef HAVE_CONFIG_H
|
|---|
| 14 | #include <config.h>
|
|---|
| 15 | #endif
|
|---|
| 16 |
|
|---|
| 17 | #include "ObservedValuesContainer.hpp"
|
|---|
| 18 |
|
|---|
| 19 | #include "CodePatterns/Assert.hpp"
|
|---|
| 20 |
|
|---|
| 21 | template <class T, typename id>
|
|---|
| 22 | ObservedValuesContainer<T,id>::ObservedValuesContainer(
|
|---|
| 23 | const std::string _name,
|
|---|
| 24 | QtObservedInstanceBoard &_board) :
|
|---|
| 25 | NameOfType(_name),
|
|---|
| 26 | board(_board)
|
|---|
| 27 | {}
|
|---|
| 28 |
|
|---|
| 29 | template <class T, typename id>
|
|---|
| 30 | typename T::ptr ObservedValuesContainer<T,id>::get(const id _id)
|
|---|
| 31 | {
|
|---|
| 32 | typename CountedObservedValues_t::iterator iter = ObservedValues.find(_id);
|
|---|
| 33 | ASSERT( iter != ObservedValues.end(),
|
|---|
| 34 | "ObservedValuesContainer::getObservedValues() - no observed values present for "
|
|---|
| 35 | +NameOfType+" "+toString(_id));
|
|---|
| 36 | const ObservedValues_t &obsvalues = iter->second.first;
|
|---|
| 37 | // increase refcount
|
|---|
| 38 | ++(iter->second.second);
|
|---|
| 39 | typename T::ptr _molecule(new T(obsvalues, board));
|
|---|
| 40 |
|
|---|
| 41 | return _molecule;
|
|---|
| 42 | }
|
|---|
| 43 |
|
|---|
| 44 | template <>
|
|---|
| 45 | typename QtObservedMolecule::ptr
|
|---|
| 46 | ObservedValuesContainer<QtObservedMolecule,moleculeId_t>::get(const moleculeId_t _id)
|
|---|
| 47 | {
|
|---|
| 48 | typename CountedObservedValues_t::iterator iter = ObservedValues.find(_id);
|
|---|
| 49 | ASSERT( iter != ObservedValues.end(),
|
|---|
| 50 | "ObservedValuesContainer::getObservedValues() - no observed values present for "
|
|---|
| 51 | +NameOfType+" "+toString(_id));
|
|---|
| 52 | const ObservedValues_t &obsvalues = iter->second.first;
|
|---|
| 53 | // increase refcount
|
|---|
| 54 | ++(iter->second.second);
|
|---|
| 55 | typename QtObservedMolecule::ptr _molecule(new QtObservedMolecule(obsvalues));
|
|---|
| 56 |
|
|---|
| 57 | return _molecule;
|
|---|
| 58 | }
|
|---|
| 59 |
|
|---|
| 60 | template <class T, typename id>
|
|---|
| 61 | void ObservedValuesContainer<T,id>::yield(const id _id)
|
|---|
| 62 | {
|
|---|
| 63 | typename CountedObservedValues_t::iterator iter = ObservedValues.find(_id);
|
|---|
| 64 | ASSERT( iter != ObservedValues.end(),
|
|---|
| 65 | "ObservedValuesContainer::returnObservedAtom() - no observed values present for "
|
|---|
| 66 | +NameOfType+" "+toString(_id));
|
|---|
| 67 | ASSERT( iter->second.second != 0,
|
|---|
| 68 | "ObservedValuesContainer::returnObservedAtom() - all instances for "
|
|---|
| 69 | +NameOfType+" "+toString(_id)+" have already been returned.");
|
|---|
| 70 | // decrease refcount
|
|---|
| 71 | --(iter->second.second);
|
|---|
| 72 | if (iter->second.second == 0) {
|
|---|
| 73 | // free instance
|
|---|
| 74 | }
|
|---|
| 75 | }
|
|---|
| 76 |
|
|---|
| 77 | template <class T, typename id>
|
|---|
| 78 | ObservedValues_t ObservedValuesContainer<T,id>::getObservedValues(const id _id)
|
|---|
| 79 | {
|
|---|
| 80 | ObservedValues_t returnvalues;
|
|---|
| 81 | typename CountedObservedValues_t::iterator iter = ObservedValues.find(_id);
|
|---|
| 82 | ASSERT(iter != ObservedValues.end(),
|
|---|
| 83 | "ObservedValuesContainer::getObservedValues() - "+NameOfType
|
|---|
| 84 | +" values not present for id "+toString(_id));
|
|---|
| 85 | if (iter->first == _id) {
|
|---|
| 86 | returnvalues = iter->second.first;
|
|---|
| 87 | ObservedValues.erase(iter);
|
|---|
| 88 | }
|
|---|
| 89 | return returnvalues;
|
|---|
| 90 | }
|
|---|
| 91 |
|
|---|
| 92 | template <class T, typename id>
|
|---|
| 93 | void ObservedValuesContainer<T,id>::returnObservedValues(
|
|---|
| 94 | const id _id,
|
|---|
| 95 | ObservedValues_t &_observedvalues)
|
|---|
| 96 | {
|
|---|
| 97 | #ifndef NDEBUG
|
|---|
| 98 | std::pair<typename CountedObservedValues_t::iterator, bool> inserter =
|
|---|
| 99 | #endif
|
|---|
| 100 | ObservedValues.insert(
|
|---|
| 101 | std::make_pair( _id, std::make_pair(_observedvalues,0) ) );
|
|---|
| 102 | ASSERT( inserter.second,
|
|---|
| 103 | "QtObservedInstanceBoard::returnAtomObservedValues() - could not insert ObservedValues for"
|
|---|
| 104 | +toString(_id)+".");
|
|---|
| 105 | }
|
|---|
| 106 |
|
|---|
| 107 | template <class T, typename id>
|
|---|
| 108 | bool ObservedValuesContainer<T,id>::insert(const id _id, ObservedValues_t &_obsvalues)
|
|---|
| 109 | {
|
|---|
| 110 | std::pair<typename CountedObservedValues_t::iterator, bool> inserter =
|
|---|
| 111 | ObservedValues.insert(
|
|---|
| 112 | std::make_pair( _id, std::make_pair(_obsvalues,0) ) );
|
|---|
| 113 | return inserter.second;
|
|---|
| 114 | }
|
|---|
| 115 |
|
|---|
| 116 | template <class T, typename id>
|
|---|
| 117 | bool ObservedValuesContainer<T,id>::changeIdentifier(const id _oldid, const id _newid)
|
|---|
| 118 | {
|
|---|
| 119 | const typename CountedObservedValues_t::iterator Colditer = ObservedValues.find(_oldid);
|
|---|
| 120 | const typename CountedObservedValues_t::iterator Cnewiter = ObservedValues.find(_newid);
|
|---|
| 121 | bool status = ((Colditer != ObservedValues.end()) && (Cnewiter == ObservedValues.end()));
|
|---|
| 122 | // change id here only if still present
|
|---|
| 123 | if (status) {
|
|---|
| 124 | {
|
|---|
| 125 | RefCountedObservedValues_t obsvalues = Colditer->second;
|
|---|
| 126 | ObservedValues.erase(Colditer);
|
|---|
| 127 | ObservedValues.insert( std::make_pair(_newid, obsvalues) );
|
|---|
| 128 | }
|
|---|
| 129 | return true;
|
|---|
| 130 | } else
|
|---|
| 131 | return false;
|
|---|
| 132 | }
|
|---|
| 133 |
|
|---|
| 134 | template <class T, typename id>
|
|---|
| 135 | size_t ObservedValuesContainer<T,id>::getRefCount(const id _id) const
|
|---|
| 136 | {
|
|---|
| 137 | typename CountedObservedValues_t::const_iterator iter = ObservedValues.find(_id);
|
|---|
| 138 | return iter->second.second;
|
|---|
| 139 | }
|
|---|
| 140 |
|
|---|
| 141 | template <class T, typename id>
|
|---|
| 142 | bool ObservedValuesContainer<T,id>::erase(const id _id)
|
|---|
| 143 | {
|
|---|
| 144 | typename CountedObservedValues_t::iterator iter = ObservedValues.find(_id);
|
|---|
| 145 | if (iter != ObservedValues.end()) {
|
|---|
| 146 | ObservedValues.erase(iter);
|
|---|
| 147 | return true;
|
|---|
| 148 | } else
|
|---|
| 149 | return false;
|
|---|
| 150 | }
|
|---|
| 151 |
|
|---|
| 152 | template <class T, typename id>
|
|---|
| 153 | bool ObservedValuesContainer<T,id>::isPresent(const id _id) const
|
|---|
| 154 | {
|
|---|
| 155 | typename CountedObservedValues_t::const_iterator iter = ObservedValues.find(_id);
|
|---|
| 156 | return (iter != ObservedValues.end());
|
|---|
| 157 | }
|
|---|
| 158 |
|
|---|
| 159 | #endif /* OBSERVEDVALUESCONTAINER_IMPL_HPP_ */
|
|---|