41 #ifndef MULTIPLEOCCUPANCY_H_
42 #define MULTIPLEOCCUPANCY_H_
44 #include <boost/unordered_map.hpp>
45 #include <boost/shared_ptr.hpp>
57 typename boost::unordered_map<AgentId, boost::shared_ptr<T> >::value_type, T*> {
58 T* operator()(
typename boost::unordered_map<
AgentId, boost::shared_ptr<T> >::value_type& val) {
59 return val.second.get();
71 template<
typename T,
typename GPType>
75 typedef typename boost::unordered_map<AgentId, boost::shared_ptr<T>,
HashId> ValueType;
76 typedef typename ValueType::iterator ValueTypeIter;
77 typedef typename boost::unordered_map<Point<GPType> , ValueType*,
HashGridPoint<GPType> > LocationMap;
79 typedef typename LocationMap::iterator LocationMapIter;
80 typedef typename LocationMap::const_iterator LocationMapConstIter;
82 LocationMap locations;
125 template<
typename T,
typename GPType>
127 for (LocationMapIter iter = locations.begin(); iter != locations.end(); ++iter) {
132 template<
typename T,
typename GPType>
133 typename MultipleOccupancy<T, GPType>::ValueType* MultipleOccupancy<T, GPType>::doGet(
const Point<GPType>& location)
const {
134 LocationMapConstIter iter = locations.find(location);
135 if (iter == locations.end())
140 template<
typename T,
typename GPType>
142 ValueType* ptrs = doGet(location);
145 return ptrs->begin()->second.get();
148 template<
typename T,
typename GPType>
150 ValueType* ptrs = doGet(location);
152 int index = out.size();
153 out.resize(out.size() + ptrs->size(), 0);
155 std::transform(ptrs->begin(), ptrs->end(), out.begin() + index, func);
159 template<
typename T,
typename GPType>
161 LocationMapIter iter = locations.find(location);
163 if (iter == locations.end()) {
164 vec =
new ValueType();
165 locations[location] = vec;
169 vec->insert(std::make_pair(agent->getId(), agent));
174 template<
typename T,
typename GPType>
176 LocationMapIter iter = locations.find(location);
177 if (iter != locations.end()) {
178 ValueType* vec = iter->second;
179 ValueTypeIter agentIter = vec->find(agent->getId());
181 if (agentIter != vec->end()) {
182 vec->erase(agentIter);
183 if (vec->size() == 0) {
185 locations.erase(iter);