41 #ifndef AGENT_SET_FUNCTIONS_H_
42 #define AGENT_SET_FUNCTIONS_H_
44 #include <boost/iterator/filter_iterator.hpp>
47 #include "RelogoAgent.h"
56 template<
typename TargetType>
57 struct Caster2:
public std::unary_function<RelogoAgent, TargetType*> {
59 TargetType* operator()(
const RelogoAgent* agent)
const {
61 return static_cast<TargetType*
> (agentRef);
72 boost::unordered_set<AgentId, HashId > set;
78 bool operator()(
const T* agent) {
79 int count = set.count(agent->getId());
81 set.insert(agent->getId());
82 return isAgentType(agent);
90 typedef boost::filter_iterator<IsAgentType<RelogoAgent> , std::vector<RelogoAgent*>::const_iterator>
91 const_bytype_iterator;
92 typedef boost::filter_iterator<IsAgentTypeNoDup<RelogoAgent> , std::vector<RelogoAgent*>::const_iterator>
93 const_bytype_nodup_iterator;
94 typedef boost::filter_iterator<IsAgentType<RelogoAgent> , std::vector<RelogoAgent*>::iterator> bytype_iterator;
104 template<
typename AgentType>
110 for (
int i = 0, n = in.size(); i < n; ++i) {
113 out.
add(
static_cast<AgentType*
> (
const_cast<RelogoAgent*
>(agent)));
129 template<
typename AgentType>
130 void filterVecToSetNoDuplicates(std::vector<RelogoAgent*>& in, AgentSet<AgentType>& out,
int typeId) {
131 const_bytype_nodup_iterator typeFilterBegin(IsAgentTypeNoDup<RelogoAgent> (typeId), in.begin(), in.end());
132 const_bytype_nodup_iterator typeFilterEnd(IsAgentTypeNoDup<RelogoAgent> (typeId), in.end(), in.end());
133 boost::transform_iterator<Caster2<AgentType> , const_bytype_nodup_iterator> begin(typeFilterBegin);
134 boost::transform_iterator<Caster2<AgentType> , const_bytype_nodup_iterator> end(typeFilterEnd);
135 out.addAll(begin, end);