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 | typename T::ptr ObservedValuesContainer<T,id>::get(const id _id)
|
---|
23 | {
|
---|
24 | typename CountedObservedValues_t::iterator iter = ObservedValues.find(_id);
|
---|
25 | ASSERT( iter != ObservedValues.end(),
|
---|
26 | "ObservedValuesContainer::getObservedValues() - no observed values present for "
|
---|
27 | +NameOfType+" "+toString(_id));
|
---|
28 | const ObservedValues_t &obsvalues = iter->second.first;
|
---|
29 | // increase refcount
|
---|
30 | ++(iter->second.second);
|
---|
31 | typename T::ptr _molecule(new T(obsvalues));
|
---|
32 |
|
---|
33 | return _molecule;
|
---|
34 | }
|
---|
35 |
|
---|
36 | template <class T, typename id>
|
---|
37 | void ObservedValuesContainer<T,id>::yield(const id _id)
|
---|
38 | {
|
---|
39 | typename CountedObservedValues_t::iterator iter = ObservedValues.find(_id);
|
---|
40 | ASSERT( iter != ObservedValues.end(),
|
---|
41 | "ObservedValuesContainer::returnObservedAtom() - no observed values present for "
|
---|
42 | +NameOfType+" "+toString(_id));
|
---|
43 | ASSERT( iter->second.second != 0,
|
---|
44 | "ObservedValuesContainer::returnObservedAtom() - all instances for "
|
---|
45 | +NameOfType+" "+toString(_id)+" have already been returned.");
|
---|
46 | // decrease refcount
|
---|
47 | --(iter->second.second);
|
---|
48 | if (iter->second.second == 0) {
|
---|
49 | // free instance
|
---|
50 | }
|
---|
51 | }
|
---|
52 |
|
---|
53 | template <class T, typename id>
|
---|
54 | ObservedValues_t ObservedValuesContainer<T,id>::getObservedValues(const id _id)
|
---|
55 | {
|
---|
56 | ObservedValues_t returnvalues;
|
---|
57 | typename CountedObservedValues_t::iterator iter = ObservedValues.find(_id);
|
---|
58 | ASSERT(iter != ObservedValues.end(),
|
---|
59 | "ObservedValuesContainer::getObservedValues() - "+NameOfType
|
---|
60 | +" values not present for id "+toString(_id));
|
---|
61 | if (iter->first == _id) {
|
---|
62 | returnvalues = iter->second.first;
|
---|
63 | ObservedValues.erase(iter);
|
---|
64 | }
|
---|
65 | return returnvalues;
|
---|
66 | }
|
---|
67 |
|
---|
68 | template <class T, typename id>
|
---|
69 | void ObservedValuesContainer<T,id>::returnObservedValues(
|
---|
70 | const id _id,
|
---|
71 | ObservedValues_t &_observedvalues)
|
---|
72 | {
|
---|
73 | #ifndef NDEBUG
|
---|
74 | std::pair<typename CountedObservedValues_t::iterator, bool> inserter =
|
---|
75 | #endif
|
---|
76 | ObservedValues.insert(
|
---|
77 | std::make_pair( _id, std::make_pair(_observedvalues,0) ) );
|
---|
78 | ASSERT( inserter.second,
|
---|
79 | "QtObservedInstanceBoard::returnAtomObservedValues() - could not insert ObservedValues for"
|
---|
80 | +toString(_id)+".");
|
---|
81 | }
|
---|
82 |
|
---|
83 | template <class T, typename id>
|
---|
84 | bool ObservedValuesContainer<T,id>::insert(const id _id, ObservedValues_t &_obsvalues)
|
---|
85 | {
|
---|
86 | std::pair<typename CountedObservedValues_t::iterator, bool> inserter =
|
---|
87 | ObservedValues.insert(
|
---|
88 | std::make_pair( _id, std::make_pair(_obsvalues,0) ) );
|
---|
89 | return inserter.second;
|
---|
90 | }
|
---|
91 |
|
---|
92 | template <class T, typename id>
|
---|
93 | bool ObservedValuesContainer<T,id>::changeIdentifier(const id _oldid, const id _newid)
|
---|
94 | {
|
---|
95 | const typename CountedObservedValues_t::iterator Colditer = ObservedValues.find(_oldid);
|
---|
96 | const typename CountedObservedValues_t::iterator Cnewiter = ObservedValues.find(_newid);
|
---|
97 | bool status = ((Colditer != ObservedValues.end()) && (Cnewiter == ObservedValues.end()));
|
---|
98 | // change id here only if still present
|
---|
99 | if (status) {
|
---|
100 | {
|
---|
101 | RefCountedObservedValues_t obsvalues = Colditer->second;
|
---|
102 | ObservedValues.erase(Colditer);
|
---|
103 | ObservedValues.insert( std::make_pair(_newid, obsvalues) );
|
---|
104 | }
|
---|
105 | return true;
|
---|
106 | } else
|
---|
107 | return false;
|
---|
108 | }
|
---|
109 |
|
---|
110 | template <class T, typename id>
|
---|
111 | size_t ObservedValuesContainer<T,id>::getRefCount(const id _id) const
|
---|
112 | {
|
---|
113 | typename CountedObservedValues_t::const_iterator iter = ObservedValues.find(_id);
|
---|
114 | return iter->second.second;
|
---|
115 | }
|
---|
116 |
|
---|
117 | template <class T, typename id>
|
---|
118 | bool ObservedValuesContainer<T,id>::erase(const id _id)
|
---|
119 | {
|
---|
120 | typename CountedObservedValues_t::iterator iter = ObservedValues.find(_id);
|
---|
121 | if (iter != ObservedValues.end()) {
|
---|
122 | ObservedValues.erase(iter);
|
---|
123 | return true;
|
---|
124 | } else
|
---|
125 | return false;
|
---|
126 | }
|
---|
127 |
|
---|
128 | template <class T, typename id>
|
---|
129 | bool ObservedValuesContainer<T,id>::isPresent(const id _id) const
|
---|
130 | {
|
---|
131 | typename CountedObservedValues_t::const_iterator iter = ObservedValues.find(_id);
|
---|
132 | return (iter != ObservedValues.end());
|
---|
133 | }
|
---|
134 |
|
---|
135 | #endif /* OBSERVEDVALUESCONTAINER_IMPL_HPP_ */
|
---|