#pragma once
#include <config.h>
#include <string>
#include <functional>
#include <vector>
#include <set>
#include <limits>
#include <algorithm>
#include <iterator>
#include <utils/common/SysUtils.h>
#include <utils/common/MsgHandler.h>
#include <utils/common/StdDefs.h>
#include <utils/router/SUMOAbstractRouter.h>
#include <utils/common/SUMOVehicleClass.h>
#include "CHRouter.h"
#ifdef HAVE_FOX
#include <utils/foxtools/MFXWorkerThread.h>
#endif
template<class E, class V>
class CHRouterWrapper: public SUMOAbstractRouter<E, V> {
public:
CHRouterWrapper(const std::vector<E*>& edges, const bool ignoreErrors, typename SUMOAbstractRouter<E, V>::Operation operation,
const SUMOTime begin, const SUMOTime end, const SUMOTime weightPeriod, bool havePermissions, const int numThreads) :
SUMOAbstractRouter<E, V>("CHRouterWrapper", ignoreErrors, operation, nullptr, havePermissions, false),
myEdges(edges),
myIgnoreErrors(ignoreErrors),
myBegin(begin),
myEnd(end),
myWeightPeriod(weightPeriod),
myMaxNumInstances(numThreads) {
}
~CHRouterWrapper() {
for (typename RouterMap::iterator i = myRouters.begin(); i != myRouters.end(); ++i) {
delete i->second;
}
}
virtual void prohibit(const std::map<const E*, double>& toProhibit) {
if (toProhibit.size() > 0) {
WRITE_WARNINGF(TL("Routing algorithm CHWrapper does not support dynamic closing of edges%"), "");
}
}
virtual SUMOAbstractRouter<E, V>* clone() {
CHRouterWrapper<E, V>* clone = new CHRouterWrapper<E, V>(myEdges, myIgnoreErrors, this->myOperation, myBegin, myEnd, myWeightPeriod, this->myHavePermissions, myMaxNumInstances);
for (const auto& item : myRouters) {
clone->myRouters[item.first] = static_cast<CHRouterType*>(item.second->clone());
}
return clone;
}
bool compute(const E* from, const E* to, const V* const vehicle,
SUMOTime msTime, std::vector<const E*>& into, bool silent = false) {
const std::pair<const SUMOVehicleClass, const double> svc = std::make_pair(vehicle->getVClass(), vehicle->getMaxSpeed());
if (myRouters.count(svc) == 0) {
myRouters[svc] = new CHRouterType(myEdges, myIgnoreErrors, this->myOperation, svc.first, myWeightPeriod, false, false);
}
return myRouters[svc]->compute(from, to, vehicle, msTime, into, silent);
}
private:
typedef CHRouter<E, V> CHRouterType;
private:
typedef std::map<std::pair<const SUMOVehicleClass, const double>, CHRouterType*> RouterMap;
RouterMap myRouters;
const std::vector<E*>& myEdges;
const bool myIgnoreErrors;
const SUMOTime myBegin;
const SUMOTime myEnd;
const SUMOTime myWeightPeriod;
const int myMaxNumInstances;
};