Merging changes from develop branch to prepare for v.0.3.6 branch
Conflicts: README.TXT
This commit is contained in:
		
						commit
						d3dee115ab
					
				
							
								
								
									
										5
									
								
								.gitignore
									
									
									
									
										vendored
									
									
								
							
							
						
						
									
										5
									
								
								.gitignore
									
									
									
									
										vendored
									
									
								
							@ -37,6 +37,7 @@ Thumbs.db
 | 
			
		||||
#######################
 | 
			
		||||
/build/
 | 
			
		||||
/Util/UUID.cpp
 | 
			
		||||
/Util/GitDescription.cpp
 | 
			
		||||
 | 
			
		||||
# Eclipse related files #
 | 
			
		||||
#########################
 | 
			
		||||
@ -81,3 +82,7 @@ stxxl.errlog
 | 
			
		||||
/sandbox/
 | 
			
		||||
 | 
			
		||||
/test/profile.lua
 | 
			
		||||
 | 
			
		||||
# Deprecated config file #
 | 
			
		||||
##########################
 | 
			
		||||
/server.ini
 | 
			
		||||
 | 
			
		||||
@ -4,7 +4,7 @@ compiler:
 | 
			
		||||
#  - clang
 | 
			
		||||
install:
 | 
			
		||||
 - sudo apt-get update >/dev/null
 | 
			
		||||
 - sudo apt-get -q install build-essential git cmake pkg-config libprotoc-dev libprotobuf7 protobuf-compiler libprotobuf-dev libosmpbf-dev libpng12-dev libbz2-dev libstxxl-dev libstxxl-doc libstxxl1 libxml2-dev libzip-dev libboost-thread-dev libboost-system-dev libboost-regex-dev libboost-filesystem-dev lua5.1 liblua5.1-0-dev libluabind-dev rubygems osmosis
 | 
			
		||||
 - sudo apt-get -q install libprotoc-dev libprotobuf7 protobuf-compiler libprotobuf-dev libosmpbf-dev libpng12-dev libbz2-dev libstxxl-dev libstxxl-doc libstxxl1 libxml2-dev libzip-dev libboost1.46-all-dev lua5.1 liblua5.1-0-dev libluabind-dev rubygems osmosis
 | 
			
		||||
before_script:
 | 
			
		||||
 - sudo gem install bundler
 | 
			
		||||
 - bundle install
 | 
			
		||||
 | 
			
		||||
							
								
								
									
										11
									
								
								AUTHORS.TXT
									
									
									
									
									
								
							
							
						
						
									
										11
									
								
								AUTHORS.TXT
									
									
									
									
									
								
							@ -1,11 +0,0 @@
 | 
			
		||||
The following people contributed code to the Open Source Routing Machine:
 | 
			
		||||
 | 
			
		||||
Christian Vetter 
 | 
			
		||||
Dennis Luxen
 | 
			
		||||
Ruslan Krenzler
 | 
			
		||||
Frederik Ramm
 | 
			
		||||
Bharath Vissapragada
 | 
			
		||||
Pascal Neis
 | 
			
		||||
Sasa Ivetic
 | 
			
		||||
Emil Tin
 | 
			
		||||
Henning Moll
 | 
			
		||||
@ -1,22 +1,29 @@
 | 
			
		||||
/*
 | 
			
		||||
    open source routing machine
 | 
			
		||||
    Copyright (C) Dennis Luxen, others 2010
 | 
			
		||||
 | 
			
		||||
This program is free software; you can redistribute it and/or modify
 | 
			
		||||
it under the terms of the GNU AFFERO General Public License as published by
 | 
			
		||||
the Free Software Foundation; either version 3 of the License, or
 | 
			
		||||
any later version.
 | 
			
		||||
Copyright (c) 2013, Project OSRM, Dennis Luxen, others
 | 
			
		||||
All rights reserved.
 | 
			
		||||
 | 
			
		||||
This program is distributed in the hope that it will be useful,
 | 
			
		||||
but WITHOUT ANY WARRANTY; without even the implied warranty of
 | 
			
		||||
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
 | 
			
		||||
GNU General Public License for more details.
 | 
			
		||||
Redistribution and use in source and binary forms, with or without modification,
 | 
			
		||||
are permitted provided that the following conditions are met:
 | 
			
		||||
 | 
			
		||||
You should have received a copy of the GNU Affero General Public License
 | 
			
		||||
along with this program; if not, write to the Free Software
 | 
			
		||||
Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA
 | 
			
		||||
or see http://www.gnu.org/licenses/agpl.txt.
 | 
			
		||||
 */
 | 
			
		||||
Redistributions of source code must retain the above copyright notice, this list
 | 
			
		||||
of conditions and the following disclaimer.
 | 
			
		||||
Redistributions in binary form must reproduce the above copyright notice, this
 | 
			
		||||
list of conditions and the following disclaimer in the documentation and/or
 | 
			
		||||
other materials provided with the distribution.
 | 
			
		||||
 | 
			
		||||
THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND
 | 
			
		||||
ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
 | 
			
		||||
WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
 | 
			
		||||
DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR
 | 
			
		||||
ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
 | 
			
		||||
(INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
 | 
			
		||||
LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON
 | 
			
		||||
ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
 | 
			
		||||
(INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
 | 
			
		||||
SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
 | 
			
		||||
 | 
			
		||||
*/
 | 
			
		||||
 | 
			
		||||
#ifndef BRESENHAM_H_
 | 
			
		||||
#define BRESENHAM_H_
 | 
			
		||||
 | 
			
		||||
@ -1,22 +1,29 @@
 | 
			
		||||
/*
 | 
			
		||||
 open source routing machine
 | 
			
		||||
 Copyright (C) Dennis Luxen, others 2010
 | 
			
		||||
 | 
			
		||||
 This program is free software; you can redistribute it and/or modify
 | 
			
		||||
 it under the terms of the GNU AFFERO General Public License as published by
 | 
			
		||||
 the Free Software Foundation; either version 3 of the License, or
 | 
			
		||||
 any later version.
 | 
			
		||||
Copyright (c) 2013, Project OSRM, Dennis Luxen, others
 | 
			
		||||
All rights reserved.
 | 
			
		||||
 | 
			
		||||
 This program is distributed in the hope that it will be useful,
 | 
			
		||||
 but WITHOUT ANY WARRANTY; without even the implied warranty of
 | 
			
		||||
 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
 | 
			
		||||
 GNU General Public License for more details.
 | 
			
		||||
Redistribution and use in source and binary forms, with or without modification,
 | 
			
		||||
are permitted provided that the following conditions are met:
 | 
			
		||||
 | 
			
		||||
 You should have received a copy of the GNU Affero General Public License
 | 
			
		||||
 along with this program; if not, write to the Free Software
 | 
			
		||||
 Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA
 | 
			
		||||
 or see http://www.gnu.org/licenses/agpl.txt.
 | 
			
		||||
 */
 | 
			
		||||
Redistributions of source code must retain the above copyright notice, this list
 | 
			
		||||
of conditions and the following disclaimer.
 | 
			
		||||
Redistributions in binary form must reproduce the above copyright notice, this
 | 
			
		||||
list of conditions and the following disclaimer in the documentation and/or
 | 
			
		||||
other materials provided with the distribution.
 | 
			
		||||
 | 
			
		||||
THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND
 | 
			
		||||
ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
 | 
			
		||||
WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
 | 
			
		||||
DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR
 | 
			
		||||
ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
 | 
			
		||||
(INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
 | 
			
		||||
LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON
 | 
			
		||||
ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
 | 
			
		||||
(INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
 | 
			
		||||
SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
 | 
			
		||||
 | 
			
		||||
*/
 | 
			
		||||
 | 
			
		||||
#include "CRC32.h"
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
@ -1,22 +1,29 @@
 | 
			
		||||
/*
 | 
			
		||||
 open source routing machine
 | 
			
		||||
 Copyright (C) Dennis Luxen, others 2010
 | 
			
		||||
 | 
			
		||||
 This program is free software; you can redistribute it and/or modify
 | 
			
		||||
 it under the terms of the GNU AFFERO General Public License as published by
 | 
			
		||||
 the Free Software Foundation; either version 3 of the License, or
 | 
			
		||||
 any later version.
 | 
			
		||||
Copyright (c) 2013, Project OSRM, Dennis Luxen, others
 | 
			
		||||
All rights reserved.
 | 
			
		||||
 | 
			
		||||
 This program is distributed in the hope that it will be useful,
 | 
			
		||||
 but WITHOUT ANY WARRANTY; without even the implied warranty of
 | 
			
		||||
 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
 | 
			
		||||
 GNU General Public License for more details.
 | 
			
		||||
Redistribution and use in source and binary forms, with or without modification,
 | 
			
		||||
are permitted provided that the following conditions are met:
 | 
			
		||||
 | 
			
		||||
 You should have received a copy of the GNU Affero General Public License
 | 
			
		||||
 along with this program; if not, write to the Free Software
 | 
			
		||||
 Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA
 | 
			
		||||
 or see http://www.gnu.org/licenses/agpl.txt.
 | 
			
		||||
 */
 | 
			
		||||
Redistributions of source code must retain the above copyright notice, this list
 | 
			
		||||
of conditions and the following disclaimer.
 | 
			
		||||
Redistributions in binary form must reproduce the above copyright notice, this
 | 
			
		||||
list of conditions and the following disclaimer in the documentation and/or
 | 
			
		||||
other materials provided with the distribution.
 | 
			
		||||
 | 
			
		||||
THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND
 | 
			
		||||
ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
 | 
			
		||||
WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
 | 
			
		||||
DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR
 | 
			
		||||
ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
 | 
			
		||||
(INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
 | 
			
		||||
LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON
 | 
			
		||||
ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
 | 
			
		||||
(INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
 | 
			
		||||
SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
 | 
			
		||||
 | 
			
		||||
*/
 | 
			
		||||
 | 
			
		||||
#ifndef CRC32_H_
 | 
			
		||||
#define CRC32_H_
 | 
			
		||||
 | 
			
		||||
@ -1,31 +1,40 @@
 | 
			
		||||
/*
 | 
			
		||||
    open source routing machine
 | 
			
		||||
    Copyright (C) Dennis Luxen, others 2010
 | 
			
		||||
 | 
			
		||||
This program is free software; you can redistribute it and/or modify
 | 
			
		||||
it under the terms of the GNU AFFERO General Public License as published by
 | 
			
		||||
the Free Software Foundation; either version 3 of the License, or
 | 
			
		||||
any later version.
 | 
			
		||||
Copyright (c) 2013, Project OSRM, Dennis Luxen, others
 | 
			
		||||
All rights reserved.
 | 
			
		||||
 | 
			
		||||
This program is distributed in the hope that it will be useful,
 | 
			
		||||
but WITHOUT ANY WARRANTY; without even the implied warranty of
 | 
			
		||||
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
 | 
			
		||||
GNU General Public License for more details.
 | 
			
		||||
Redistribution and use in source and binary forms, with or without modification,
 | 
			
		||||
are permitted provided that the following conditions are met:
 | 
			
		||||
 | 
			
		||||
You should have received a copy of the GNU Affero General Public License
 | 
			
		||||
along with this program; if not, write to the Free Software
 | 
			
		||||
Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA
 | 
			
		||||
or see http://www.gnu.org/licenses/agpl.txt.
 | 
			
		||||
 */
 | 
			
		||||
Redistributions of source code must retain the above copyright notice, this list
 | 
			
		||||
of conditions and the following disclaimer.
 | 
			
		||||
Redistributions in binary form must reproduce the above copyright notice, this
 | 
			
		||||
list of conditions and the following disclaimer in the documentation and/or
 | 
			
		||||
other materials provided with the distribution.
 | 
			
		||||
 | 
			
		||||
THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND
 | 
			
		||||
ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
 | 
			
		||||
WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
 | 
			
		||||
DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR
 | 
			
		||||
ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
 | 
			
		||||
(INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
 | 
			
		||||
LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON
 | 
			
		||||
ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
 | 
			
		||||
(INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
 | 
			
		||||
SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
 | 
			
		||||
 | 
			
		||||
*/
 | 
			
		||||
 | 
			
		||||
#ifndef DOUGLASPEUCKER_H_
 | 
			
		||||
#define DOUGLASPEUCKER_H_
 | 
			
		||||
 | 
			
		||||
#include "../DataStructures/Coordinate.h"
 | 
			
		||||
 | 
			
		||||
#include <cassert>
 | 
			
		||||
#include <boost/assert.hpp>
 | 
			
		||||
 | 
			
		||||
#include <cmath>
 | 
			
		||||
#include <cfloat>
 | 
			
		||||
 | 
			
		||||
#include <limits>
 | 
			
		||||
#include <stack>
 | 
			
		||||
#include <vector>
 | 
			
		||||
 | 
			
		||||
@ -45,7 +54,7 @@ class DouglasPeucker {
 | 
			
		||||
private:
 | 
			
		||||
    typedef std::pair<std::size_t, std::size_t> PairOfPoints;
 | 
			
		||||
    //Stack to simulate the recursion
 | 
			
		||||
    std::stack<PairOfPoints > recursionStack;
 | 
			
		||||
    std::stack<PairOfPoints > recursion_stack;
 | 
			
		||||
 | 
			
		||||
    /**
 | 
			
		||||
     * This distance computation does integer arithmetic only and is about twice as fast as
 | 
			
		||||
@ -56,12 +65,13 @@ private:
 | 
			
		||||
        const int p2x = (segB.lon - segA.lat);
 | 
			
		||||
        const int p2y = (segB.lon - segA.lat);
 | 
			
		||||
        const int something = p2x*p2x + p2y*p2y;
 | 
			
		||||
        int u = (something < FLT_EPSILON ? 0 : ((point.lon - segA.lon) * p2x + (point.lat - segA.lat) * p2y) / something);
 | 
			
		||||
        int u = ( 0 == something  ? 0 : ((point.lon - segA.lon) * p2x + (point.lat - segA.lat) * p2y) / something);
 | 
			
		||||
 | 
			
		||||
        if (u > 1)
 | 
			
		||||
        if (u > 1) {
 | 
			
		||||
            u = 1;
 | 
			
		||||
        else if (u < 0)
 | 
			
		||||
        } else if (u < 0) {
 | 
			
		||||
            u = 0;
 | 
			
		||||
        }
 | 
			
		||||
 | 
			
		||||
        const int x = segA.lon + u * p2x;
 | 
			
		||||
        const int y = segA.lat + u * p2y;
 | 
			
		||||
@ -76,52 +86,82 @@ private:
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
public:
 | 
			
		||||
    void Run(std::vector<PointT> & inputVector, const unsigned zoomLevel) {
 | 
			
		||||
    void Run(std::vector<PointT> & input_geometry, const unsigned zoom_level) {
 | 
			
		||||
        {
 | 
			
		||||
            assert(zoomLevel < 19);
 | 
			
		||||
            assert(1 < inputVector.size());
 | 
			
		||||
            std::size_t leftBorderOfRange = 0;
 | 
			
		||||
            std::size_t rightBorderOfRange = 1;
 | 
			
		||||
            BOOST_ASSERT_MSG(zoom_level < 19, "unsupported zoom level");
 | 
			
		||||
            BOOST_ASSERT_MSG(1 < input_geometry.size(), "geometry invalid");
 | 
			
		||||
            std::size_t left_border = 0;
 | 
			
		||||
            std::size_t right_border = 1;
 | 
			
		||||
            //Sweep linerarily over array and identify those ranges that need to be checked
 | 
			
		||||
//            recursionStack.hint(inputVector.size());
 | 
			
		||||
            do {
 | 
			
		||||
                assert(inputVector[leftBorderOfRange].necessary);
 | 
			
		||||
                assert(inputVector.back().necessary);
 | 
			
		||||
                BOOST_ASSERT_MSG(
 | 
			
		||||
                    input_geometry[left_border].necessary,
 | 
			
		||||
                    "left border must be necessary"
 | 
			
		||||
                );
 | 
			
		||||
                BOOST_ASSERT_MSG(
 | 
			
		||||
                    input_geometry.back().necessary,
 | 
			
		||||
                    "right border must be necessary"
 | 
			
		||||
                );
 | 
			
		||||
 | 
			
		||||
                if(inputVector[rightBorderOfRange].necessary) {
 | 
			
		||||
                    recursionStack.push(std::make_pair(leftBorderOfRange, rightBorderOfRange));
 | 
			
		||||
                    leftBorderOfRange = rightBorderOfRange;
 | 
			
		||||
                if(input_geometry[right_border].necessary) {
 | 
			
		||||
                    recursion_stack.push(std::make_pair(left_border, right_border));
 | 
			
		||||
                    left_border = right_border;
 | 
			
		||||
                }
 | 
			
		||||
                ++rightBorderOfRange;
 | 
			
		||||
            } while( rightBorderOfRange < inputVector.size());
 | 
			
		||||
                ++right_border;
 | 
			
		||||
            } while( right_border < input_geometry.size());
 | 
			
		||||
        }
 | 
			
		||||
        while(!recursionStack.empty()) {
 | 
			
		||||
        while(!recursion_stack.empty()) {
 | 
			
		||||
            //pop next element
 | 
			
		||||
            const PairOfPoints pair = recursionStack.top();
 | 
			
		||||
            recursionStack.pop();
 | 
			
		||||
            assert(inputVector[pair.first].necessary);
 | 
			
		||||
            assert(inputVector[pair.second].necessary);
 | 
			
		||||
            assert(pair.second < inputVector.size());
 | 
			
		||||
            assert(pair.first < pair.second);
 | 
			
		||||
            int maxDistance = INT_MIN;
 | 
			
		||||
            const PairOfPoints pair = recursion_stack.top();
 | 
			
		||||
            recursion_stack.pop();
 | 
			
		||||
            BOOST_ASSERT_MSG(
 | 
			
		||||
                input_geometry[pair.first].necessary,
 | 
			
		||||
                "left border mus be necessary"
 | 
			
		||||
            );
 | 
			
		||||
            BOOST_ASSERT_MSG(
 | 
			
		||||
                input_geometry[pair.second].necessary,
 | 
			
		||||
                "right border must be necessary"
 | 
			
		||||
            );
 | 
			
		||||
            BOOST_ASSERT_MSG(
 | 
			
		||||
                pair.second < input_geometry.size(),
 | 
			
		||||
                "right border outside of geometry"
 | 
			
		||||
            );
 | 
			
		||||
            BOOST_ASSERT_MSG(
 | 
			
		||||
                pair.first < pair.second,
 | 
			
		||||
                "left border on the wrong side"
 | 
			
		||||
            );
 | 
			
		||||
            int max_distance = INT_MIN;
 | 
			
		||||
 | 
			
		||||
            std::size_t indexOfFarthestElement = pair.second;
 | 
			
		||||
            //find index idx of element with maxDistance
 | 
			
		||||
            std::size_t farthest_element_index = pair.second;
 | 
			
		||||
            //find index idx of element with max_distance
 | 
			
		||||
            for(std::size_t i = pair.first+1; i < pair.second; ++i){
 | 
			
		||||
                const double distance = std::fabs(fastDistance(inputVector[i].location, inputVector[pair.first].location, inputVector[pair.second].location));
 | 
			
		||||
                if(distance > DouglasPeuckerThresholds[zoomLevel] && distance > maxDistance) {
 | 
			
		||||
                    indexOfFarthestElement = i;
 | 
			
		||||
                    maxDistance = distance;
 | 
			
		||||
                const int temp_dist = fastDistance(
 | 
			
		||||
                                        input_geometry[i].location,
 | 
			
		||||
                                        input_geometry[pair.first].location,
 | 
			
		||||
                                        input_geometry[pair.second].location
 | 
			
		||||
                                    );
 | 
			
		||||
                const double distance = std::fabs(temp_dist);
 | 
			
		||||
                if(
 | 
			
		||||
                    distance > DouglasPeuckerThresholds[zoom_level] &&
 | 
			
		||||
                    distance > max_distance
 | 
			
		||||
                ) {
 | 
			
		||||
                    farthest_element_index = i;
 | 
			
		||||
                    max_distance = distance;
 | 
			
		||||
                }
 | 
			
		||||
            }
 | 
			
		||||
            if (maxDistance > DouglasPeuckerThresholds[zoomLevel]) {
 | 
			
		||||
            if (max_distance > DouglasPeuckerThresholds[zoom_level]) {
 | 
			
		||||
                //  mark idx as necessary
 | 
			
		||||
                inputVector[indexOfFarthestElement].necessary = true;
 | 
			
		||||
                if (1 < indexOfFarthestElement - pair.first) {
 | 
			
		||||
                    recursionStack.push(std::make_pair(pair.first, indexOfFarthestElement) );
 | 
			
		||||
                input_geometry[farthest_element_index].necessary = true;
 | 
			
		||||
                if (1 < (farthest_element_index - pair.first) ) {
 | 
			
		||||
                    recursion_stack.push(
 | 
			
		||||
                        std::make_pair(pair.first, farthest_element_index)
 | 
			
		||||
                    );
 | 
			
		||||
                }
 | 
			
		||||
                if (1 < (pair.second - farthest_element_index) ) {
 | 
			
		||||
                    recursion_stack.push(
 | 
			
		||||
                        std::make_pair(farthest_element_index, pair.second)
 | 
			
		||||
                    );
 | 
			
		||||
                }
 | 
			
		||||
                if (1 < pair.second - indexOfFarthestElement)
 | 
			
		||||
                    recursionStack.push(std::make_pair(indexOfFarthestElement, pair.second) );
 | 
			
		||||
            }
 | 
			
		||||
        }
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
@ -1,23 +1,29 @@
 | 
			
		||||
/*
 | 
			
		||||
    open source routing machine
 | 
			
		||||
    Copyright (C) Dennis Luxen, others 2010
 | 
			
		||||
 | 
			
		||||
This program is free software; you can redistribute it and/or modify
 | 
			
		||||
it under the terms of the GNU AFFERO General Public License as published by
 | 
			
		||||
the Free Software Foundation; either version 3 of the License, or
 | 
			
		||||
any later version.
 | 
			
		||||
Copyright (c) 2013, Project OSRM, Dennis Luxen, others
 | 
			
		||||
All rights reserved.
 | 
			
		||||
 | 
			
		||||
This program is distributed in the hope that it will be useful,
 | 
			
		||||
but WITHOUT ANY WARRANTY; without even the implied warranty of
 | 
			
		||||
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
 | 
			
		||||
GNU General Public License for more details.
 | 
			
		||||
Redistribution and use in source and binary forms, with or without modification,
 | 
			
		||||
are permitted provided that the following conditions are met:
 | 
			
		||||
 | 
			
		||||
You should have received a copy of the GNU Affero General Public License
 | 
			
		||||
along with this program; if not, write to the Free Software
 | 
			
		||||
Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA
 | 
			
		||||
or see http://www.gnu.org/licenses/agpl.txt.
 | 
			
		||||
 */
 | 
			
		||||
Redistributions of source code must retain the above copyright notice, this list
 | 
			
		||||
of conditions and the following disclaimer.
 | 
			
		||||
Redistributions in binary form must reproduce the above copyright notice, this
 | 
			
		||||
list of conditions and the following disclaimer in the documentation and/or
 | 
			
		||||
other materials provided with the distribution.
 | 
			
		||||
 | 
			
		||||
THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND
 | 
			
		||||
ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
 | 
			
		||||
WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
 | 
			
		||||
DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR
 | 
			
		||||
ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
 | 
			
		||||
(INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
 | 
			
		||||
LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON
 | 
			
		||||
ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
 | 
			
		||||
(INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
 | 
			
		||||
SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
 | 
			
		||||
 | 
			
		||||
*/
 | 
			
		||||
 | 
			
		||||
#ifndef ITERATORBASEDCRC32_H_
 | 
			
		||||
#define ITERATORBASEDCRC32_H_
 | 
			
		||||
 | 
			
		||||
@ -1,22 +1,29 @@
 | 
			
		||||
/*
 | 
			
		||||
    open source routing machine
 | 
			
		||||
    Copyright (C) Dennis Luxen, others 2010
 | 
			
		||||
 | 
			
		||||
This program is free software; you can redistribute it and/or modify
 | 
			
		||||
it under the terms of the GNU AFFERO General Public License as published by
 | 
			
		||||
the Free Software Foundation; either version 3 of the License, or
 | 
			
		||||
any later version.
 | 
			
		||||
Copyright (c) 2013, Project OSRM, Dennis Luxen, others
 | 
			
		||||
All rights reserved.
 | 
			
		||||
 | 
			
		||||
This program is distributed in the hope that it will be useful,
 | 
			
		||||
but WITHOUT ANY WARRANTY; without even the implied warranty of
 | 
			
		||||
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
 | 
			
		||||
GNU General Public License for more details.
 | 
			
		||||
Redistribution and use in source and binary forms, with or without modification,
 | 
			
		||||
are permitted provided that the following conditions are met:
 | 
			
		||||
 | 
			
		||||
You should have received a copy of the GNU Affero General Public License
 | 
			
		||||
along with this program; if not, write to the Free Software
 | 
			
		||||
Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA
 | 
			
		||||
or see http://www.gnu.org/licenses/agpl.txt.
 | 
			
		||||
 */
 | 
			
		||||
Redistributions of source code must retain the above copyright notice, this list
 | 
			
		||||
of conditions and the following disclaimer.
 | 
			
		||||
Redistributions in binary form must reproduce the above copyright notice, this
 | 
			
		||||
list of conditions and the following disclaimer in the documentation and/or
 | 
			
		||||
other materials provided with the distribution.
 | 
			
		||||
 | 
			
		||||
THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND
 | 
			
		||||
ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
 | 
			
		||||
WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
 | 
			
		||||
DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR
 | 
			
		||||
ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
 | 
			
		||||
(INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
 | 
			
		||||
LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON
 | 
			
		||||
ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
 | 
			
		||||
(INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
 | 
			
		||||
SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
 | 
			
		||||
 | 
			
		||||
*/
 | 
			
		||||
 | 
			
		||||
#ifndef OBJECTTOBASE64_H_
 | 
			
		||||
#define OBJECTTOBASE64_H_
 | 
			
		||||
 | 
			
		||||
@ -1,22 +1,29 @@
 | 
			
		||||
/*
 | 
			
		||||
    open source routing machine
 | 
			
		||||
    Copyright (C) Dennis Luxen, others 2010
 | 
			
		||||
 | 
			
		||||
This program is free software; you can redistribute it and/or modify
 | 
			
		||||
it under the terms of the GNU AFFERO General Public License as published by
 | 
			
		||||
the Free Software Foundation; either version 3 of the License, or
 | 
			
		||||
any later version.
 | 
			
		||||
Copyright (c) 2013, Project OSRM, Dennis Luxen, others
 | 
			
		||||
All rights reserved.
 | 
			
		||||
 | 
			
		||||
This program is distributed in the hope that it will be useful,
 | 
			
		||||
but WITHOUT ANY WARRANTY; without even the implied warranty of
 | 
			
		||||
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
 | 
			
		||||
GNU General Public License for more details.
 | 
			
		||||
Redistribution and use in source and binary forms, with or without modification,
 | 
			
		||||
are permitted provided that the following conditions are met:
 | 
			
		||||
 | 
			
		||||
You should have received a copy of the GNU Affero General Public License
 | 
			
		||||
along with this program; if not, write to the Free Software
 | 
			
		||||
Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA
 | 
			
		||||
or see http://www.gnu.org/licenses/agpl.txt.
 | 
			
		||||
 */
 | 
			
		||||
Redistributions of source code must retain the above copyright notice, this list
 | 
			
		||||
of conditions and the following disclaimer.
 | 
			
		||||
Redistributions in binary form must reproduce the above copyright notice, this
 | 
			
		||||
list of conditions and the following disclaimer in the documentation and/or
 | 
			
		||||
other materials provided with the distribution.
 | 
			
		||||
 | 
			
		||||
THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND
 | 
			
		||||
ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
 | 
			
		||||
WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
 | 
			
		||||
DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR
 | 
			
		||||
ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
 | 
			
		||||
(INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
 | 
			
		||||
LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON
 | 
			
		||||
ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
 | 
			
		||||
(INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
 | 
			
		||||
SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
 | 
			
		||||
 | 
			
		||||
*/
 | 
			
		||||
 | 
			
		||||
#ifndef POLYLINECOMPRESSOR_H_
 | 
			
		||||
#define POLYLINECOMPRESSOR_H_
 | 
			
		||||
 | 
			
		||||
@ -1,25 +1,29 @@
 | 
			
		||||
/*
 | 
			
		||||
    open source routing machine
 | 
			
		||||
    Copyright (C) Dennis Luxen, others 2010
 | 
			
		||||
 | 
			
		||||
This program is free software; you can redistribute it and/or modify
 | 
			
		||||
it under the terms of the GNU AFFERO General Public License as published by
 | 
			
		||||
the Free Software Foundation; either version 3 of the License, or
 | 
			
		||||
any later version.
 | 
			
		||||
Copyright (c) 2013, Project OSRM, Dennis Luxen, others
 | 
			
		||||
All rights reserved.
 | 
			
		||||
 | 
			
		||||
This program is distributed in the hope that it will be useful,
 | 
			
		||||
but WITHOUT ANY WARRANTY; without even the implied warranty of
 | 
			
		||||
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
 | 
			
		||||
GNU General Public License for more details.
 | 
			
		||||
Redistribution and use in source and binary forms, with or without modification,
 | 
			
		||||
are permitted provided that the following conditions are met:
 | 
			
		||||
 | 
			
		||||
You should have received a copy of the GNU Affero General Public License
 | 
			
		||||
along with this program; if not, write to the Free Software
 | 
			
		||||
Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA
 | 
			
		||||
or see http://www.gnu.org/licenses/agpl.txt.
 | 
			
		||||
Redistributions of source code must retain the above copyright notice, this list
 | 
			
		||||
of conditions and the following disclaimer.
 | 
			
		||||
Redistributions in binary form must reproduce the above copyright notice, this
 | 
			
		||||
list of conditions and the following disclaimer in the documentation and/or
 | 
			
		||||
other materials provided with the distribution.
 | 
			
		||||
 | 
			
		||||
Strongly connected components using Tarjan's Algorithm
 | 
			
		||||
THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND
 | 
			
		||||
ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
 | 
			
		||||
WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
 | 
			
		||||
DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR
 | 
			
		||||
ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
 | 
			
		||||
(INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
 | 
			
		||||
LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON
 | 
			
		||||
ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
 | 
			
		||||
(INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
 | 
			
		||||
SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
 | 
			
		||||
 | 
			
		||||
 */
 | 
			
		||||
*/
 | 
			
		||||
 | 
			
		||||
#ifndef STRONGLYCONNECTEDCOMPONENTS_H_
 | 
			
		||||
#define STRONGLYCONNECTEDCOMPONENTS_H_
 | 
			
		||||
@ -35,11 +39,13 @@ Strongly connected components using Tarjan's Algorithm
 | 
			
		||||
 | 
			
		||||
#include "../Util/SimpleLogger.h"
 | 
			
		||||
 | 
			
		||||
#include <boost/assert.hpp>
 | 
			
		||||
#include <boost/filesystem.hpp>
 | 
			
		||||
#include <boost/foreach.hpp>
 | 
			
		||||
#include <boost/integer.hpp>
 | 
			
		||||
#include <boost/make_shared.hpp>
 | 
			
		||||
#include <boost/unordered_map.hpp>
 | 
			
		||||
#include <boost/unordered_set.hpp>
 | 
			
		||||
 | 
			
		||||
#ifdef __APPLE__
 | 
			
		||||
    #include <gdal.h>
 | 
			
		||||
@ -48,7 +54,7 @@ Strongly connected components using Tarjan's Algorithm
 | 
			
		||||
    #include <gdal/gdal.h>
 | 
			
		||||
    #include <gdal/ogrsf_frmts.h>
 | 
			
		||||
#endif
 | 
			
		||||
#include <cassert>
 | 
			
		||||
 | 
			
		||||
#include <stack>
 | 
			
		||||
#include <vector>
 | 
			
		||||
 | 
			
		||||
@ -64,7 +70,6 @@ private:
 | 
			
		||||
 | 
			
		||||
    struct TarjanEdgeData {
 | 
			
		||||
        int distance;
 | 
			
		||||
        unsigned edgeBasedNodeID;
 | 
			
		||||
        unsigned nameID:31;
 | 
			
		||||
        bool shortcut:1;
 | 
			
		||||
        short type;
 | 
			
		||||
@ -77,7 +82,10 @@ private:
 | 
			
		||||
    };
 | 
			
		||||
 | 
			
		||||
    struct TarjanStackFrame {
 | 
			
		||||
        explicit TarjanStackFrame(NodeID _v, NodeID p) : v(_v), parent(p) {}
 | 
			
		||||
        explicit TarjanStackFrame(
 | 
			
		||||
            NodeID v,
 | 
			
		||||
            NodeID parent
 | 
			
		||||
        ) : v(v), parent(parent) { }
 | 
			
		||||
        NodeID v;
 | 
			
		||||
        NodeID parent;
 | 
			
		||||
    };
 | 
			
		||||
@ -85,18 +93,17 @@ private:
 | 
			
		||||
    typedef DynamicGraph<TarjanEdgeData>        TarjanDynamicGraph;
 | 
			
		||||
    typedef TarjanDynamicGraph::InputEdge       TarjanEdge;
 | 
			
		||||
    typedef std::pair<NodeID, NodeID>           RestrictionSource;
 | 
			
		||||
    typedef std::pair<NodeID, bool>   RestrictionTarget;
 | 
			
		||||
    typedef std::vector<RestrictionTarget> EmanatingRestrictionsVector;
 | 
			
		||||
    typedef std::pair<NodeID, bool>             restriction_target;
 | 
			
		||||
    typedef std::vector<restriction_target>      EmanatingRestrictionsVector;
 | 
			
		||||
    typedef boost::unordered_map<RestrictionSource, unsigned > RestrictionMap;
 | 
			
		||||
 | 
			
		||||
    std::vector<NodeInfo>               inputNodeInfoList;
 | 
			
		||||
    unsigned numberOfTurnRestrictions;
 | 
			
		||||
    boost::shared_ptr<TarjanDynamicGraph>   _nodeBasedGraph;
 | 
			
		||||
    boost::unordered_map<NodeID, bool>          _barrierNodes;
 | 
			
		||||
    boost::unordered_map<NodeID, bool>          _trafficLights;
 | 
			
		||||
 | 
			
		||||
    std::vector<EmanatingRestrictionsVector> _restrictionBucketVector;
 | 
			
		||||
    RestrictionMap _restrictionMap;
 | 
			
		||||
    std::vector<NodeInfo>                       m_coordinate_list;
 | 
			
		||||
    std::vector<EmanatingRestrictionsVector>    m_restriction_bucket_list;
 | 
			
		||||
    boost::shared_ptr<TarjanDynamicGraph>       m_node_based_graph;
 | 
			
		||||
    boost::unordered_set<NodeID>                m_barrier_node_list;
 | 
			
		||||
    boost::unordered_set<NodeID>                m_traffic_light_list;
 | 
			
		||||
    unsigned                                    m_restriction_counter;
 | 
			
		||||
    RestrictionMap                              m_restriction_map;
 | 
			
		||||
 | 
			
		||||
    struct EdgeBasedNode {
 | 
			
		||||
        bool operator<(const EdgeBasedNode & other) const {
 | 
			
		||||
@ -116,93 +123,99 @@ private:
 | 
			
		||||
        bool ignoreInGrid:1;
 | 
			
		||||
    };
 | 
			
		||||
 | 
			
		||||
    DeallocatingVector<EdgeBasedNode>   edgeBasedNodes;
 | 
			
		||||
public:
 | 
			
		||||
    TarjanSCC(
 | 
			
		||||
        int nodes,
 | 
			
		||||
        std::vector<NodeBasedEdge> & inputEdges,
 | 
			
		||||
        int number_of_nodes,
 | 
			
		||||
        std::vector<NodeBasedEdge> & input_edges,
 | 
			
		||||
        std::vector<NodeID> & bn,
 | 
			
		||||
        std::vector<NodeID> & tl,
 | 
			
		||||
        std::vector<TurnRestriction> & irs,
 | 
			
		||||
        std::vector<NodeInfo> & nI
 | 
			
		||||
    ) :
 | 
			
		||||
        inputNodeInfoList(nI),
 | 
			
		||||
        numberOfTurnRestrictions(irs.size())
 | 
			
		||||
        m_coordinate_list(nI),
 | 
			
		||||
        m_restriction_counter(irs.size())
 | 
			
		||||
    {
 | 
			
		||||
        BOOST_FOREACH(const TurnRestriction & restriction, irs) {
 | 
			
		||||
            std::pair<NodeID, NodeID> restrictionSource = std::make_pair(
 | 
			
		||||
                restriction.fromNode, restriction.viaNode
 | 
			
		||||
            );
 | 
			
		||||
            unsigned index;
 | 
			
		||||
            RestrictionMap::iterator restrIter = _restrictionMap.find(restrictionSource);
 | 
			
		||||
            if(restrIter == _restrictionMap.end()) {
 | 
			
		||||
                index = _restrictionBucketVector.size();
 | 
			
		||||
                _restrictionBucketVector.resize(index+1);
 | 
			
		||||
                _restrictionMap[restrictionSource] = index;
 | 
			
		||||
            RestrictionMap::iterator restriction_iterator = m_restriction_map.find(restrictionSource);
 | 
			
		||||
            if(restriction_iterator == m_restriction_map.end()) {
 | 
			
		||||
                index = m_restriction_bucket_list.size();
 | 
			
		||||
                m_restriction_bucket_list.resize(index+1);
 | 
			
		||||
                m_restriction_map[restrictionSource] = index;
 | 
			
		||||
            } else {
 | 
			
		||||
                index = restrIter->second;
 | 
			
		||||
                index = restriction_iterator->second;
 | 
			
		||||
                //Map already contains an is_only_*-restriction
 | 
			
		||||
                if(_restrictionBucketVector.at(index).begin()->second)
 | 
			
		||||
                if(m_restriction_bucket_list.at(index).begin()->second) {
 | 
			
		||||
                    continue;
 | 
			
		||||
                else if(restriction.flags.isOnly){
 | 
			
		||||
                } else if(restriction.flags.isOnly) {
 | 
			
		||||
                    //We are going to insert an is_only_*-restriction. There can be only one.
 | 
			
		||||
                    _restrictionBucketVector.at(index).clear();
 | 
			
		||||
                    m_restriction_bucket_list.at(index).clear();
 | 
			
		||||
                }
 | 
			
		||||
            }
 | 
			
		||||
 | 
			
		||||
            _restrictionBucketVector.at(index).push_back(
 | 
			
		||||
            m_restriction_bucket_list.at(index).push_back(
 | 
			
		||||
                std::make_pair(restriction.toNode, restriction.flags.isOnly)
 | 
			
		||||
            );
 | 
			
		||||
        }
 | 
			
		||||
 | 
			
		||||
        BOOST_FOREACH(NodeID id, bn) {
 | 
			
		||||
            _barrierNodes[id] = true;
 | 
			
		||||
        }
 | 
			
		||||
        BOOST_FOREACH(NodeID id, tl) {
 | 
			
		||||
            _trafficLights[id] = true;
 | 
			
		||||
        }
 | 
			
		||||
 | 
			
		||||
        DeallocatingVector< TarjanEdge > edges;
 | 
			
		||||
        for ( std::vector< NodeBasedEdge >::const_iterator i = inputEdges.begin(); i != inputEdges.end(); ++i ) {
 | 
			
		||||
        m_barrier_node_list.insert(bn.begin(), bn.end());
 | 
			
		||||
        m_traffic_light_list.insert(tl.begin(), tl.end());
 | 
			
		||||
 | 
			
		||||
        DeallocatingVector< TarjanEdge > edge_list;
 | 
			
		||||
        BOOST_FOREACH(const NodeBasedEdge & input_edge, input_edges) {
 | 
			
		||||
            TarjanEdge edge;
 | 
			
		||||
            if(!i->isForward()) {
 | 
			
		||||
                edge.source = i->target();
 | 
			
		||||
                edge.target = i->source();
 | 
			
		||||
                edge.data.backward = i->isForward();
 | 
			
		||||
                edge.data.forward = i->isBackward();
 | 
			
		||||
            if(!input_edge.isForward()) {
 | 
			
		||||
                edge.source = input_edge.target();
 | 
			
		||||
                edge.target = input_edge.source();
 | 
			
		||||
                edge.data.backward = input_edge.isForward();
 | 
			
		||||
                edge.data.forward = input_edge.isBackward();
 | 
			
		||||
            } else {
 | 
			
		||||
                edge.source = i->source();
 | 
			
		||||
                edge.target = i->target();
 | 
			
		||||
                edge.data.forward = i->isForward();
 | 
			
		||||
                edge.data.backward = i->isBackward();
 | 
			
		||||
                edge.source = input_edge.source();
 | 
			
		||||
                edge.target = input_edge.target();
 | 
			
		||||
                edge.data.forward = input_edge.isForward();
 | 
			
		||||
                edge.data.backward = input_edge.isBackward();
 | 
			
		||||
            }
 | 
			
		||||
            if(edge.source == edge.target)
 | 
			
		||||
            if(edge.source == edge.target) {
 | 
			
		||||
                continue;
 | 
			
		||||
            }
 | 
			
		||||
 | 
			
		||||
            edge.data.distance = (std::max)((int)i->weight(), 1 );
 | 
			
		||||
            assert( edge.data.distance > 0 );
 | 
			
		||||
            edge.data.distance = (std::max)((int)input_edge.weight(), 1 );
 | 
			
		||||
            BOOST_ASSERT( edge.data.distance > 0 );
 | 
			
		||||
            edge.data.shortcut = false;
 | 
			
		||||
            edge.data.roundabout = i->isRoundabout();
 | 
			
		||||
            edge.data.ignoreInGrid = i->ignoreInGrid();
 | 
			
		||||
            edge.data.nameID = i->name();
 | 
			
		||||
            edge.data.type = i->type();
 | 
			
		||||
            edge.data.isAccessRestricted = i->isAccessRestricted();
 | 
			
		||||
            edge.data.edgeBasedNodeID = edges.size();
 | 
			
		||||
            edge.data.roundabout = input_edge.isRoundabout();
 | 
			
		||||
            edge.data.ignoreInGrid = input_edge.ignoreInGrid();
 | 
			
		||||
            edge.data.nameID = input_edge.name();
 | 
			
		||||
            edge.data.type = input_edge.type();
 | 
			
		||||
            edge.data.isAccessRestricted = input_edge.isAccessRestricted();
 | 
			
		||||
            edge.data.reversedEdge = false;
 | 
			
		||||
            edges.push_back( edge );
 | 
			
		||||
            edge_list.push_back( edge );
 | 
			
		||||
            if( edge.data.backward ) {
 | 
			
		||||
                std::swap( edge.source, edge.target );
 | 
			
		||||
                edge.data.forward = i->isBackward();
 | 
			
		||||
                edge.data.backward = i->isForward();
 | 
			
		||||
                edge.data.edgeBasedNodeID = edges.size();
 | 
			
		||||
                edge.data.forward = input_edge.isBackward();
 | 
			
		||||
                edge.data.backward = input_edge.isForward();
 | 
			
		||||
                edge.data.reversedEdge = true;
 | 
			
		||||
                edges.push_back( edge );
 | 
			
		||||
                edge_list.push_back( edge );
 | 
			
		||||
            }
 | 
			
		||||
        }
 | 
			
		||||
        std::vector<NodeBasedEdge>().swap(inputEdges);
 | 
			
		||||
        std::sort( edges.begin(), edges.end() );
 | 
			
		||||
        _nodeBasedGraph = boost::make_shared<TarjanDynamicGraph>( nodes, edges );
 | 
			
		||||
        std::vector<NodeBasedEdge>().swap(input_edges);
 | 
			
		||||
        BOOST_ASSERT_MSG(
 | 
			
		||||
            0 == input_edges.size() && 0 == input_edges.capacity(),
 | 
			
		||||
            "input edge vector not properly deallocated"
 | 
			
		||||
        );
 | 
			
		||||
 | 
			
		||||
        std::sort( edge_list.begin(), edge_list.end() );
 | 
			
		||||
 | 
			
		||||
        m_node_based_graph = boost::make_shared<TarjanDynamicGraph>(
 | 
			
		||||
            number_of_nodes,
 | 
			
		||||
            edge_list
 | 
			
		||||
        );
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    ~TarjanSCC() {
 | 
			
		||||
        m_node_based_graph.reset();
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    void Run() {
 | 
			
		||||
@ -211,162 +224,203 @@ public:
 | 
			
		||||
        DeleteFileIfExists("component.shx");
 | 
			
		||||
        DeleteFileIfExists("component.shp");
 | 
			
		||||
 | 
			
		||||
        Percent p(_nodeBasedGraph->GetNumberOfNodes());
 | 
			
		||||
 | 
			
		||||
        const char *pszDriverName = "ESRI Shapefile";
 | 
			
		||||
        OGRSFDriver *poDriver;
 | 
			
		||||
        Percent p(m_node_based_graph->GetNumberOfNodes());
 | 
			
		||||
 | 
			
		||||
        OGRRegisterAll();
 | 
			
		||||
 | 
			
		||||
        poDriver = OGRSFDriverRegistrar::GetRegistrar()->GetDriverByName(
 | 
			
		||||
                pszDriverName );
 | 
			
		||||
        if( poDriver == NULL )
 | 
			
		||||
        {
 | 
			
		||||
            printf( "%s driver not available.\n", pszDriverName );
 | 
			
		||||
            exit( 1 );
 | 
			
		||||
        const char *pszDriverName = "ESRI Shapefile";
 | 
			
		||||
        OGRSFDriver * poDriver = OGRSFDriverRegistrar::GetRegistrar()->
 | 
			
		||||
            GetDriverByName( pszDriverName );
 | 
			
		||||
        if( NULL == poDriver ) {
 | 
			
		||||
            throw OSRMException("ESRI Shapefile driver not available");
 | 
			
		||||
        }
 | 
			
		||||
        OGRDataSource *poDS;
 | 
			
		||||
 | 
			
		||||
        poDS = poDriver->CreateDataSource( "component.shp", NULL );
 | 
			
		||||
        if( poDS == NULL ) {
 | 
			
		||||
            printf( "Creation of output file failed.\n" );
 | 
			
		||||
            exit( 1 );
 | 
			
		||||
        }
 | 
			
		||||
 | 
			
		||||
        OGRLayer *poLayer;
 | 
			
		||||
 | 
			
		||||
        poLayer = poDS->CreateLayer( "component", NULL, wkbLineString, NULL );
 | 
			
		||||
        if( poLayer == NULL ) {
 | 
			
		||||
            printf( "Layer creation failed.\n" );
 | 
			
		||||
            exit( 1 );
 | 
			
		||||
        }
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
        //The following is a hack to distinguish between stuff that happens before the recursive call and stuff that happens after
 | 
			
		||||
        std::stack<std::pair<bool, TarjanStackFrame> > recursionStack; //true = stuff before, false = stuff after call
 | 
			
		||||
        std::stack<NodeID> tarjanStack;
 | 
			
		||||
        std::vector<unsigned> componentsIndex(_nodeBasedGraph->GetNumberOfNodes(), UINT_MAX);
 | 
			
		||||
        std::vector<NodeID> vectorOfComponentSizes;
 | 
			
		||||
        std::vector<TarjanNode> tarjanNodes(_nodeBasedGraph->GetNumberOfNodes());
 | 
			
		||||
        unsigned currentComponent = 0, sizeOfCurrentComponent = 0;
 | 
			
		||||
        int index = 0;
 | 
			
		||||
        for(NodeID node = 0, endNodes = _nodeBasedGraph->GetNumberOfNodes(); node < endNodes; ++node) {
 | 
			
		||||
            if(UINT_MAX == componentsIndex[node]) {
 | 
			
		||||
                recursionStack.push(std::make_pair(true, TarjanStackFrame(node,node)) );
 | 
			
		||||
            }
 | 
			
		||||
 | 
			
		||||
            while(!recursionStack.empty()) {
 | 
			
		||||
                bool beforeRecursion = recursionStack.top().first;
 | 
			
		||||
                TarjanStackFrame currentFrame = recursionStack.top().second;
 | 
			
		||||
                NodeID v = currentFrame.v;
 | 
			
		||||
//                SimpleLogger().Write() << "popping node " << v << (beforeRecursion ? " before " : " after ") << "recursion";
 | 
			
		||||
                recursionStack.pop();
 | 
			
		||||
 | 
			
		||||
                if(beforeRecursion) {
 | 
			
		||||
                    //Mark frame to handle tail of recursion
 | 
			
		||||
                    recursionStack.push(std::make_pair(false, currentFrame));
 | 
			
		||||
 | 
			
		||||
                    //Mark essential information for SCC
 | 
			
		||||
                    tarjanNodes[v].index = index;
 | 
			
		||||
                    tarjanNodes[v].lowlink = index;
 | 
			
		||||
                    tarjanStack.push(v);
 | 
			
		||||
                    tarjanNodes[v].onStack = true;
 | 
			
		||||
                    ++index;
 | 
			
		||||
//                    SimpleLogger().Write() << "pushing " << v << " onto tarjan stack, idx[" << v << "]=" << tarjanNodes[v].index << ", lowlink["<< v << "]=" << tarjanNodes[v].lowlink;
 | 
			
		||||
 | 
			
		||||
                    //Traverse outgoing edges
 | 
			
		||||
                    for(TarjanDynamicGraph::EdgeIterator e2 = _nodeBasedGraph->BeginEdges(v); e2 < _nodeBasedGraph->EndEdges(v); ++e2) {
 | 
			
		||||
                        TarjanDynamicGraph::NodeIterator vprime = _nodeBasedGraph->GetTarget(e2);
 | 
			
		||||
//                        SimpleLogger().Write() << "traversing edge (" << v << "," << vprime << ")";
 | 
			
		||||
                        if(UINT_MAX == tarjanNodes[vprime].index) {
 | 
			
		||||
 | 
			
		||||
                            recursionStack.push(std::make_pair(true,TarjanStackFrame(vprime, v)));
 | 
			
		||||
                        } else {
 | 
			
		||||
//                            SimpleLogger().Write() << "Node " << vprime << " is already explored";
 | 
			
		||||
                            if(tarjanNodes[vprime].onStack) {
 | 
			
		||||
                                unsigned newLowlink = std::min(tarjanNodes[v].lowlink, tarjanNodes[vprime].index);
 | 
			
		||||
//                                SimpleLogger().Write() << "Setting lowlink[" << v << "] from " << tarjanNodes[v].lowlink << " to " << newLowlink;
 | 
			
		||||
                                tarjanNodes[v].lowlink = newLowlink;
 | 
			
		||||
//                            } else {
 | 
			
		||||
//                                SimpleLogger().Write() << "But node " << vprime << " is not on stack";
 | 
			
		||||
                            }
 | 
			
		||||
                        }
 | 
			
		||||
                    }
 | 
			
		||||
                } else {
 | 
			
		||||
 | 
			
		||||
//                    SimpleLogger().Write() << "we are at the end of recursion and checking node " << v;
 | 
			
		||||
                    { // setting lowlink in its own scope so it does not pollute namespace
 | 
			
		||||
                        //                        NodeID parent = (UINT_MAX == tarjanNodes[v].parent ? v : tarjanNodes[v].parent );
 | 
			
		||||
//                        SimpleLogger().Write() << "parent=" << currentFrame.parent;
 | 
			
		||||
//                        SimpleLogger().Write() << "tarjanNodes[" << v  << "].lowlink=" << tarjanNodes[v].lowlink << ", tarjanNodes[" << currentFrame.parent << "].lowlink=" << tarjanNodes[currentFrame.parent].lowlink;
 | 
			
		||||
                        //Note the index shift by 1 compared to the recursive version
 | 
			
		||||
                        tarjanNodes[currentFrame.parent].lowlink = std::min(tarjanNodes[currentFrame.parent].lowlink, tarjanNodes[v].lowlink);
 | 
			
		||||
//                        SimpleLogger().Write() << "Setting tarjanNodes[" << currentFrame.parent  <<"].lowlink=" << tarjanNodes[currentFrame.parent].lowlink;
 | 
			
		||||
                    }
 | 
			
		||||
//                    SimpleLogger().Write() << "tarjanNodes[" << v  << "].lowlink=" << tarjanNodes[v].lowlink << ", tarjanNodes[" << v  << "].index=" << tarjanNodes[v].index;
 | 
			
		||||
 | 
			
		||||
                    //after recursion, lets do cycle checking
 | 
			
		||||
                    //Check if we found a cycle. This is the bottom part of the recursion
 | 
			
		||||
                    if(tarjanNodes[v].lowlink == tarjanNodes[v].index) {
 | 
			
		||||
                        NodeID vprime;
 | 
			
		||||
                        do {
 | 
			
		||||
//                            SimpleLogger().Write() << "identified component " << currentComponent << ": " << tarjanStack.top();
 | 
			
		||||
                            vprime = tarjanStack.top(); tarjanStack.pop();
 | 
			
		||||
                            tarjanNodes[vprime].onStack = false;
 | 
			
		||||
                            componentsIndex[vprime] = currentComponent;
 | 
			
		||||
                            ++sizeOfCurrentComponent;
 | 
			
		||||
                        } while( v != vprime);
 | 
			
		||||
                        vectorOfComponentSizes.push_back(sizeOfCurrentComponent);
 | 
			
		||||
                        if(sizeOfCurrentComponent > 1000)
 | 
			
		||||
                            SimpleLogger().Write() << "large component [" << currentComponent << "]=" << sizeOfCurrentComponent;
 | 
			
		||||
                        ++currentComponent;
 | 
			
		||||
                        sizeOfCurrentComponent = 0;
 | 
			
		||||
                    }
 | 
			
		||||
                }
 | 
			
		||||
            }
 | 
			
		||||
        }
 | 
			
		||||
 | 
			
		||||
        SimpleLogger().Write() << "identified: " << vectorOfComponentSizes.size() << " many components, marking small components";
 | 
			
		||||
 | 
			
		||||
        int singleCounter = 0;
 | 
			
		||||
        for(unsigned i = 0; i < vectorOfComponentSizes.size(); ++i){
 | 
			
		||||
            if(1 == vectorOfComponentSizes[i])
 | 
			
		||||
                ++singleCounter;
 | 
			
		||||
        }
 | 
			
		||||
        SimpleLogger().Write() << "identified " << singleCounter << " SCCs of size 1";
 | 
			
		||||
        uint64_t total_network_distance = 0;
 | 
			
		||||
        p.reinit(_nodeBasedGraph->GetNumberOfNodes());
 | 
			
		||||
        for(TarjanDynamicGraph::NodeIterator u = 0; u < _nodeBasedGraph->GetNumberOfNodes(); ++u ) {
 | 
			
		||||
            p.printIncrement();
 | 
			
		||||
            for(TarjanDynamicGraph::EdgeIterator e1 = _nodeBasedGraph->BeginEdges(u); e1 < _nodeBasedGraph->EndEdges(u); ++e1) {
 | 
			
		||||
                if(_nodeBasedGraph->GetEdgeData(e1).reversedEdge) {
 | 
			
		||||
                    continue;
 | 
			
		||||
                }
 | 
			
		||||
                TarjanDynamicGraph::NodeIterator v = _nodeBasedGraph->GetTarget(e1);
 | 
			
		||||
 | 
			
		||||
                total_network_distance += 100*ApproximateDistance(
 | 
			
		||||
                        inputNodeInfoList[u].lat,
 | 
			
		||||
                        inputNodeInfoList[u].lon,
 | 
			
		||||
                        inputNodeInfoList[v].lat,
 | 
			
		||||
                        inputNodeInfoList[v].lon
 | 
			
		||||
        OGRDataSource * poDS = poDriver->CreateDataSource(
 | 
			
		||||
            "component.shp",
 | 
			
		||||
            NULL
 | 
			
		||||
        );
 | 
			
		||||
 | 
			
		||||
                if(_nodeBasedGraph->GetEdgeData(e1).type != SHRT_MAX) {
 | 
			
		||||
                    assert(e1 != UINT_MAX);
 | 
			
		||||
                    assert(u != UINT_MAX);
 | 
			
		||||
                    assert(v != UINT_MAX);
 | 
			
		||||
        if( NULL == poDS ) {
 | 
			
		||||
            throw OSRMException("Creation of output file failed");
 | 
			
		||||
        }
 | 
			
		||||
 | 
			
		||||
        OGRLayer * poLayer = poDS->CreateLayer(
 | 
			
		||||
            "component",
 | 
			
		||||
            NULL,
 | 
			
		||||
            wkbLineString,
 | 
			
		||||
            NULL
 | 
			
		||||
        );
 | 
			
		||||
 | 
			
		||||
        if( NULL == poLayer ) {
 | 
			
		||||
            throw OSRMException("Layer creation failed.");
 | 
			
		||||
        }
 | 
			
		||||
 | 
			
		||||
        //The following is a hack to distinguish between stuff that happens
 | 
			
		||||
        //before the recursive call and stuff that happens after
 | 
			
		||||
        std::stack<std::pair<bool, TarjanStackFrame> > recursion_stack;
 | 
			
		||||
        //true = stuff before, false = stuff after call
 | 
			
		||||
        std::stack<NodeID> tarjan_stack;
 | 
			
		||||
        std::vector<unsigned> components_index(
 | 
			
		||||
            m_node_based_graph->GetNumberOfNodes(),
 | 
			
		||||
            UINT_MAX
 | 
			
		||||
        );
 | 
			
		||||
        std::vector<NodeID> component_size_vector;
 | 
			
		||||
        std::vector<TarjanNode> tarjan_node_list(
 | 
			
		||||
            m_node_based_graph->GetNumberOfNodes()
 | 
			
		||||
        );
 | 
			
		||||
        unsigned component_index = 0, size_of_current_component = 0;
 | 
			
		||||
        int index = 0;
 | 
			
		||||
        for(
 | 
			
		||||
            NodeID node = 0, last_node = m_node_based_graph->GetNumberOfNodes();
 | 
			
		||||
            node < last_node;
 | 
			
		||||
            ++node
 | 
			
		||||
        ) {
 | 
			
		||||
            if(UINT_MAX == components_index[node]) {
 | 
			
		||||
                recursion_stack.push(
 | 
			
		||||
                    std::make_pair(true, TarjanStackFrame(node,node))
 | 
			
		||||
                );
 | 
			
		||||
            }
 | 
			
		||||
 | 
			
		||||
            while(!recursion_stack.empty()) {
 | 
			
		||||
                bool before_recursion = recursion_stack.top().first;
 | 
			
		||||
                TarjanStackFrame currentFrame = recursion_stack.top().second;
 | 
			
		||||
                NodeID v = currentFrame.v;
 | 
			
		||||
                recursion_stack.pop();
 | 
			
		||||
 | 
			
		||||
                if(before_recursion) {
 | 
			
		||||
                    //Mark frame to handle tail of recursion
 | 
			
		||||
                    recursion_stack.push(std::make_pair(false, currentFrame));
 | 
			
		||||
 | 
			
		||||
                    //Mark essential information for SCC
 | 
			
		||||
                    tarjan_node_list[v].index = index;
 | 
			
		||||
                    tarjan_node_list[v].lowlink = index;
 | 
			
		||||
                    tarjan_stack.push(v);
 | 
			
		||||
                    tarjan_node_list[v].onStack = true;
 | 
			
		||||
                    ++index;
 | 
			
		||||
 | 
			
		||||
                    //Traverse outgoing edges
 | 
			
		||||
                    for(
 | 
			
		||||
                        TarjanDynamicGraph::EdgeIterator e2 = m_node_based_graph->BeginEdges(v);
 | 
			
		||||
                        e2 < m_node_based_graph->EndEdges(v);
 | 
			
		||||
                        ++e2
 | 
			
		||||
                    ) {
 | 
			
		||||
                        const TarjanDynamicGraph::NodeIterator vprime =
 | 
			
		||||
                            m_node_based_graph->GetTarget(e2);
 | 
			
		||||
                        if(UINT_MAX == tarjan_node_list[vprime].index) {
 | 
			
		||||
                            recursion_stack.push(
 | 
			
		||||
                                std::make_pair(
 | 
			
		||||
                                    true,
 | 
			
		||||
                                    TarjanStackFrame(vprime, v)
 | 
			
		||||
                                )
 | 
			
		||||
                            );
 | 
			
		||||
                        } else {
 | 
			
		||||
                            if(
 | 
			
		||||
                                tarjan_node_list[vprime].onStack &&
 | 
			
		||||
                                tarjan_node_list[vprime].index < tarjan_node_list[v].lowlink
 | 
			
		||||
                            ) {
 | 
			
		||||
                                tarjan_node_list[v].lowlink = tarjan_node_list[vprime].index;
 | 
			
		||||
                            }
 | 
			
		||||
                        }
 | 
			
		||||
                    }
 | 
			
		||||
                } else {
 | 
			
		||||
                    tarjan_node_list[currentFrame.parent].lowlink =
 | 
			
		||||
                        std::min(
 | 
			
		||||
                            tarjan_node_list[currentFrame.parent].lowlink,
 | 
			
		||||
                            tarjan_node_list[v].lowlink
 | 
			
		||||
                        );
 | 
			
		||||
                    //after recursion, lets do cycle checking
 | 
			
		||||
                    //Check if we found a cycle. This is the bottom part of the recursion
 | 
			
		||||
                    if(tarjan_node_list[v].lowlink == tarjan_node_list[v].index) {
 | 
			
		||||
                        NodeID vprime;
 | 
			
		||||
                        do {
 | 
			
		||||
                            vprime = tarjan_stack.top(); tarjan_stack.pop();
 | 
			
		||||
                            tarjan_node_list[vprime].onStack = false;
 | 
			
		||||
                            components_index[vprime] = component_index;
 | 
			
		||||
                            ++size_of_current_component;
 | 
			
		||||
                        } while( v != vprime);
 | 
			
		||||
 | 
			
		||||
                        component_size_vector.push_back(size_of_current_component);
 | 
			
		||||
 | 
			
		||||
                        if(size_of_current_component > 1000) {
 | 
			
		||||
                            SimpleLogger().Write() <<
 | 
			
		||||
                            "large component [" << component_index << "]=" <<
 | 
			
		||||
                            size_of_current_component;
 | 
			
		||||
                        }
 | 
			
		||||
 | 
			
		||||
                        ++component_index;
 | 
			
		||||
                        size_of_current_component = 0;
 | 
			
		||||
                    }
 | 
			
		||||
                }
 | 
			
		||||
            }
 | 
			
		||||
        }
 | 
			
		||||
 | 
			
		||||
        SimpleLogger().Write() <<
 | 
			
		||||
            "identified: " << component_size_vector.size() <<
 | 
			
		||||
            " many components, marking small components";
 | 
			
		||||
 | 
			
		||||
        unsigned size_one_counter = 0;
 | 
			
		||||
        for(unsigned i = 0, end = component_size_vector.size(); i < end; ++i){
 | 
			
		||||
            if(1 == component_size_vector[i]) {
 | 
			
		||||
                ++size_one_counter;
 | 
			
		||||
            }
 | 
			
		||||
        }
 | 
			
		||||
 | 
			
		||||
        SimpleLogger().Write() <<
 | 
			
		||||
            "identified " << size_one_counter << " SCCs of size 1";
 | 
			
		||||
 | 
			
		||||
        uint64_t total_network_distance = 0;
 | 
			
		||||
        p.reinit(m_node_based_graph->GetNumberOfNodes());
 | 
			
		||||
        for(
 | 
			
		||||
            TarjanDynamicGraph::NodeIterator u = 0, last_u_node = m_node_based_graph->GetNumberOfNodes();
 | 
			
		||||
            u < last_u_node;
 | 
			
		||||
            ++u
 | 
			
		||||
         ) {
 | 
			
		||||
            p.printIncrement();
 | 
			
		||||
            for(
 | 
			
		||||
                TarjanDynamicGraph::EdgeIterator e1 = m_node_based_graph->BeginEdges(u), last_edge = m_node_based_graph->EndEdges(u);
 | 
			
		||||
                e1 < last_edge;
 | 
			
		||||
                ++e1
 | 
			
		||||
            ) {
 | 
			
		||||
                if(!m_node_based_graph->GetEdgeData(e1).reversedEdge) {
 | 
			
		||||
                    continue;
 | 
			
		||||
                }
 | 
			
		||||
                const TarjanDynamicGraph::NodeIterator v = m_node_based_graph->GetTarget(e1);
 | 
			
		||||
 | 
			
		||||
                total_network_distance += 100*ApproximateDistance(
 | 
			
		||||
                        m_coordinate_list[u].lat,
 | 
			
		||||
                        m_coordinate_list[u].lon,
 | 
			
		||||
                        m_coordinate_list[v].lat,
 | 
			
		||||
                        m_coordinate_list[v].lon
 | 
			
		||||
                );
 | 
			
		||||
 | 
			
		||||
                if( SHRT_MAX != m_node_based_graph->GetEdgeData(e1).type ) {
 | 
			
		||||
                    BOOST_ASSERT(e1 != UINT_MAX);
 | 
			
		||||
                    BOOST_ASSERT(u != UINT_MAX);
 | 
			
		||||
                    BOOST_ASSERT(v != UINT_MAX);
 | 
			
		||||
 | 
			
		||||
                    const unsigned size_of_containing_component =
 | 
			
		||||
                        std::min(
 | 
			
		||||
                            component_size_vector[components_index[u]],
 | 
			
		||||
                            component_size_vector[components_index[v]]
 | 
			
		||||
                        );
 | 
			
		||||
 | 
			
		||||
                    //edges that end on bollard nodes may actually be in two distinct components
 | 
			
		||||
                    if(std::min(vectorOfComponentSizes[componentsIndex[u]], vectorOfComponentSizes[componentsIndex[v]]) < 10) {
 | 
			
		||||
 | 
			
		||||
                        //INFO("(" << inputNodeInfoList[u].lat/COORDINATE_PRECISION << ";" << inputNodeInfoList[u].lon/COORDINATE_PRECISION << ") -> (" << inputNodeInfoList[v].lat/COORDINATE_PRECISION << ";" << inputNodeInfoList[v].lon/COORDINATE_PRECISION << ")");
 | 
			
		||||
                    if(size_of_containing_component < 10) {
 | 
			
		||||
                        OGRLineString lineString;
 | 
			
		||||
                        lineString.addPoint(inputNodeInfoList[u].lon/COORDINATE_PRECISION, inputNodeInfoList[u].lat/COORDINATE_PRECISION);
 | 
			
		||||
                        lineString.addPoint(inputNodeInfoList[v].lon/COORDINATE_PRECISION, inputNodeInfoList[v].lat/COORDINATE_PRECISION);
 | 
			
		||||
                        OGRFeature *poFeature;
 | 
			
		||||
                        poFeature = OGRFeature::CreateFeature( poLayer->GetLayerDefn() );
 | 
			
		||||
                        lineString.addPoint(
 | 
			
		||||
                            m_coordinate_list[u].lon/COORDINATE_PRECISION,
 | 
			
		||||
                            m_coordinate_list[u].lat/COORDINATE_PRECISION
 | 
			
		||||
                        );
 | 
			
		||||
                        lineString.addPoint(
 | 
			
		||||
                            m_coordinate_list[v].lon/COORDINATE_PRECISION,
 | 
			
		||||
                            m_coordinate_list[v].lat/COORDINATE_PRECISION
 | 
			
		||||
                        );
 | 
			
		||||
 | 
			
		||||
                        OGRFeature * poFeature = OGRFeature::CreateFeature(
 | 
			
		||||
                            poLayer->GetLayerDefn()
 | 
			
		||||
                        );
 | 
			
		||||
 | 
			
		||||
                        poFeature->SetGeometry( &lineString );
 | 
			
		||||
                        if( poLayer->CreateFeature( poFeature ) != OGRERR_NONE ) {
 | 
			
		||||
                        if( OGRERR_NONE != poLayer->CreateFeature(poFeature) ) {
 | 
			
		||||
                            throw OSRMException(
 | 
			
		||||
                                "Failed to create feature in shapefile."
 | 
			
		||||
                            );
 | 
			
		||||
@ -377,39 +431,66 @@ public:
 | 
			
		||||
            }
 | 
			
		||||
        }
 | 
			
		||||
        OGRDataSource::DestroyDataSource( poDS );
 | 
			
		||||
        std::vector<NodeID>().swap(vectorOfComponentSizes);
 | 
			
		||||
        std::vector<NodeID>().swap(componentsIndex);
 | 
			
		||||
        SimpleLogger().Write() << "total network distance: " << (uint64_t)total_network_distance/100/1000. << " km";
 | 
			
		||||
        std::vector<NodeID>().swap(component_size_vector);
 | 
			
		||||
        BOOST_ASSERT_MSG(
 | 
			
		||||
            0 == component_size_vector.size() &&
 | 
			
		||||
            0 == component_size_vector.capacity(),
 | 
			
		||||
            "component_size_vector not properly deallocated"
 | 
			
		||||
        );
 | 
			
		||||
 | 
			
		||||
        std::vector<NodeID>().swap(components_index);
 | 
			
		||||
        BOOST_ASSERT_MSG(
 | 
			
		||||
            0 == components_index.size() && 0 == components_index.capacity(),
 | 
			
		||||
            "icomponents_index not properly deallocated"
 | 
			
		||||
        );
 | 
			
		||||
 | 
			
		||||
        SimpleLogger().Write()
 | 
			
		||||
            << "total network distance: " <<
 | 
			
		||||
             (uint64_t)total_network_distance/100/1000. <<
 | 
			
		||||
            " km";
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
private:
 | 
			
		||||
    unsigned CheckForEmanatingIsOnlyTurn(const NodeID u, const NodeID v) const {
 | 
			
		||||
        std::pair < NodeID, NodeID > restrictionSource = std::make_pair(u, v);
 | 
			
		||||
        RestrictionMap::const_iterator restrIter = _restrictionMap.find(restrictionSource);
 | 
			
		||||
        if (restrIter != _restrictionMap.end()) {
 | 
			
		||||
            unsigned index = restrIter->second;
 | 
			
		||||
            BOOST_FOREACH(RestrictionSource restrictionTarget, _restrictionBucketVector.at(index)) {
 | 
			
		||||
                if(restrictionTarget.second) {
 | 
			
		||||
                    return restrictionTarget.first;
 | 
			
		||||
        std::pair < NodeID, NodeID > restriction_source = std::make_pair(u, v);
 | 
			
		||||
        RestrictionMap::const_iterator restriction_iterator = m_restriction_map.find(restriction_source);
 | 
			
		||||
        if (restriction_iterator != m_restriction_map.end()) {
 | 
			
		||||
            const unsigned index = restriction_iterator->second;
 | 
			
		||||
            BOOST_FOREACH(
 | 
			
		||||
                const RestrictionSource & restriction_target,
 | 
			
		||||
                m_restriction_bucket_list.at(index)
 | 
			
		||||
            ) {
 | 
			
		||||
                if(restriction_target.second) {
 | 
			
		||||
                    return restriction_target.first;
 | 
			
		||||
                }
 | 
			
		||||
            }
 | 
			
		||||
        }
 | 
			
		||||
        return UINT_MAX;
 | 
			
		||||
    }
 | 
			
		||||
    bool CheckIfTurnIsRestricted(const NodeID u, const NodeID v, const NodeID w) const {
 | 
			
		||||
 | 
			
		||||
    bool CheckIfTurnIsRestricted(
 | 
			
		||||
        const NodeID u,
 | 
			
		||||
        const NodeID v,
 | 
			
		||||
        const NodeID w
 | 
			
		||||
    ) const {
 | 
			
		||||
        //only add an edge if turn is not a U-turn except it is the end of dead-end street.
 | 
			
		||||
        std::pair < NodeID, NodeID > restrictionSource = std::make_pair(u, v);
 | 
			
		||||
        RestrictionMap::const_iterator restrIter = _restrictionMap.find(restrictionSource);
 | 
			
		||||
        if (restrIter != _restrictionMap.end()) {
 | 
			
		||||
            unsigned index = restrIter->second;
 | 
			
		||||
            BOOST_FOREACH(RestrictionTarget restrictionTarget, _restrictionBucketVector.at(index)) {
 | 
			
		||||
                if(w == restrictionTarget.first)
 | 
			
		||||
        std::pair < NodeID, NodeID > restriction_source = std::make_pair(u, v);
 | 
			
		||||
        RestrictionMap::const_iterator restriction_iterator = m_restriction_map.find(restriction_source);
 | 
			
		||||
        if (restriction_iterator != m_restriction_map.end()) {
 | 
			
		||||
            const unsigned index = restriction_iterator->second;
 | 
			
		||||
            BOOST_FOREACH(
 | 
			
		||||
                const restriction_target & restriction_target,
 | 
			
		||||
                m_restriction_bucket_list.at(index)
 | 
			
		||||
            ) {
 | 
			
		||||
                if(w == restriction_target.first) {
 | 
			
		||||
                    return true;
 | 
			
		||||
                }
 | 
			
		||||
            }
 | 
			
		||||
        }
 | 
			
		||||
        return false;
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    void DeleteFileIfExists(const std::string file_name) const {
 | 
			
		||||
    void DeleteFileIfExists(const std::string & file_name) const {
 | 
			
		||||
        if (boost::filesystem::exists(file_name) ) {
 | 
			
		||||
            boost::filesystem::remove(file_name);
 | 
			
		||||
        }
 | 
			
		||||
 | 
			
		||||
@ -2,6 +2,11 @@ cmake_minimum_required(VERSION 2.6)
 | 
			
		||||
set(CMAKE_EXPORT_COMPILE_COMMANDS ON)
 | 
			
		||||
project(OSRM)
 | 
			
		||||
include(FindPackageHandleStandardArgs)
 | 
			
		||||
set(HUGO "${CMAKE_CURRENT_SOURCE_DIR}")
 | 
			
		||||
 | 
			
		||||
list(APPEND CMAKE_MODULE_PATH "${CMAKE_SOURCE_DIR}/cmake")
 | 
			
		||||
include(GetGitRevisionDescription)
 | 
			
		||||
git_describe(GIT_DESCRIPTION)
 | 
			
		||||
 | 
			
		||||
TRY_RUN(SHARED_LIBRARY_PATH_TYPE SHARED_LIBRARY_PATH_INFO_COMPILED ${PROJECT_BINARY_DIR}/CMakeTmp ${PROJECT_SOURCE_DIR}/cmake/size.cpp OUTPUT_VARIABLE IS_64_SYSTEM)
 | 
			
		||||
if(IS_64_SYSTEM)
 | 
			
		||||
@ -15,8 +20,8 @@ endif(IS_64_SYSTEM)
 | 
			
		||||
set(CMAKE_MODULE_PATH ${CMAKE_MODULE_PATH} ${CMAKE_CURRENT_SOURCE_DIR}/cmake)
 | 
			
		||||
 | 
			
		||||
add_custom_command(OUTPUT ${CMAKE_SOURCE_DIR}/Util/UUID.cpp UUID.cpp.alwaysbuild
 | 
			
		||||
  COMMAND ${CMAKE_COMMAND} -P
 | 
			
		||||
    ${CMAKE_SOURCE_DIR}/cmake/UUID-Config.cmake
 | 
			
		||||
  COMMAND ${CMAKE_COMMAND} -DSOURCE_DIR=${CMAKE_SOURCE_DIR}
 | 
			
		||||
    -P ${CMAKE_CURRENT_SOURCE_DIR}/cmake/UUID-Config.cmake
 | 
			
		||||
  DEPENDS
 | 
			
		||||
    ${CMAKE_SOURCE_DIR}/Util/UUID.cpp.in
 | 
			
		||||
  	${CMAKE_SOURCE_DIR}/cmake/UUID-Config.cmake
 | 
			
		||||
@ -25,17 +30,18 @@ add_custom_command(OUTPUT ${CMAKE_SOURCE_DIR}/Util/UUID.cpp UUID.cpp.alwaysbuild
 | 
			
		||||
 | 
			
		||||
add_custom_target(UUIDConfigure DEPENDS ${CMAKE_SOURCE_DIR}/Util/UUID.cpp )
 | 
			
		||||
 | 
			
		||||
set(BOOST_COMPONENTS filesystem regex system thread)
 | 
			
		||||
set(BOOST_COMPONENTS filesystem program_options regex system thread)
 | 
			
		||||
 | 
			
		||||
configure_file(Util/GitDescription.cpp.in ${CMAKE_SOURCE_DIR}/Util/GitDescription.cpp)
 | 
			
		||||
file(GLOB ExtractorGlob Extractor/*.cpp)
 | 
			
		||||
set(ExtractorSources extractor.cpp ${ExtractorGlob})
 | 
			
		||||
set(ExtractorSources extractor.cpp ${ExtractorGlob} Util/GitDescription.cpp)
 | 
			
		||||
add_executable(osrm-extract ${ExtractorSources} )
 | 
			
		||||
 | 
			
		||||
file(GLOB PrepareGlob Contractor/*.cpp)
 | 
			
		||||
set(PrepareSources createHierarchy.cpp ${PrepareGlob})
 | 
			
		||||
set(PrepareSources createHierarchy.cpp ${PrepareGlob} Util/GitDescription.cpp)
 | 
			
		||||
add_executable(osrm-prepare ${PrepareSources} )
 | 
			
		||||
 | 
			
		||||
add_executable(osrm-routed routed.cpp )
 | 
			
		||||
add_executable(osrm-routed routed.cpp Util/GitDescription.cpp)
 | 
			
		||||
set_target_properties(osrm-routed PROPERTIES COMPILE_FLAGS -DROUTED)
 | 
			
		||||
 | 
			
		||||
file(GLOB DescriptorGlob Descriptors/*.cpp)
 | 
			
		||||
@ -155,6 +161,8 @@ if(WITH_TOOLS)
 | 
			
		||||
			osrm-components ${GDAL_LIBRARIES} ${Boost_LIBRARIES} UUID
 | 
			
		||||
		)
 | 
			
		||||
	endif(GDAL_FOUND)
 | 
			
		||||
	add_executable ( osrm-cli Tools/simpleclient.cpp )
 | 
			
		||||
	add_executable ( osrm-cli Tools/simpleclient.cpp Util/GitDescription.cpp)
 | 
			
		||||
	target_link_libraries( osrm-cli ${Boost_LIBRARIES} OSRM UUID )
 | 
			
		||||
    add_executable ( osrm-io-benchmark Tools/io-benchmark.cpp )
 | 
			
		||||
    target_link_libraries( osrm-io-benchmark ${Boost_LIBRARIES} )
 | 
			
		||||
endif(WITH_TOOLS)
 | 
			
		||||
 | 
			
		||||
@ -1,22 +1,29 @@
 | 
			
		||||
/*
 | 
			
		||||
    open source routing machine
 | 
			
		||||
    Copyright (C) Dennis Luxen, others 2010
 | 
			
		||||
 | 
			
		||||
This program is free software; you can redistribute it and/or modify
 | 
			
		||||
it under the terms of the GNU AFFERO General Public License as published by
 | 
			
		||||
the Free Software Foundation; either version 3 of the License, or
 | 
			
		||||
any later version.
 | 
			
		||||
Copyright (c) 2013, Project OSRM, Dennis Luxen, others
 | 
			
		||||
All rights reserved.
 | 
			
		||||
 | 
			
		||||
This program is distributed in the hope that it will be useful,
 | 
			
		||||
but WITHOUT ANY WARRANTY; without even the implied warranty of
 | 
			
		||||
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
 | 
			
		||||
GNU General Public License for more details.
 | 
			
		||||
Redistribution and use in source and binary forms, with or without modification,
 | 
			
		||||
are permitted provided that the following conditions are met:
 | 
			
		||||
 | 
			
		||||
You should have received a copy of the GNU Affero General Public License
 | 
			
		||||
along with this program; if not, write to the Free Software
 | 
			
		||||
Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA
 | 
			
		||||
or see http://www.gnu.org/licenses/agpl.txt.
 | 
			
		||||
 */
 | 
			
		||||
Redistributions of source code must retain the above copyright notice, this list
 | 
			
		||||
of conditions and the following disclaimer.
 | 
			
		||||
Redistributions in binary form must reproduce the above copyright notice, this
 | 
			
		||||
list of conditions and the following disclaimer in the documentation and/or
 | 
			
		||||
other materials provided with the distribution.
 | 
			
		||||
 | 
			
		||||
THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND
 | 
			
		||||
ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
 | 
			
		||||
WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
 | 
			
		||||
DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR
 | 
			
		||||
ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
 | 
			
		||||
(INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
 | 
			
		||||
LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON
 | 
			
		||||
ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
 | 
			
		||||
(INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
 | 
			
		||||
SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
 | 
			
		||||
 | 
			
		||||
*/
 | 
			
		||||
 | 
			
		||||
#ifndef CONTRACTOR_H_INCLUDED
 | 
			
		||||
#define CONTRACTOR_H_INCLUDED
 | 
			
		||||
@ -38,7 +45,6 @@ or see http://www.gnu.org/licenses/agpl.txt.
 | 
			
		||||
#include <boost/make_shared.hpp>
 | 
			
		||||
#include <boost/shared_ptr.hpp>
 | 
			
		||||
 | 
			
		||||
#include <cfloat>
 | 
			
		||||
#include <ctime>
 | 
			
		||||
 | 
			
		||||
#include <algorithm>
 | 
			
		||||
@ -732,7 +738,7 @@ private:
 | 
			
		||||
            if ( priority > targetPriority )
 | 
			
		||||
                return false;
 | 
			
		||||
            //tie breaking
 | 
			
		||||
            if ( fabs(priority - targetPriority) < FLT_EPSILON && bias(node, target) ) {
 | 
			
		||||
            if ( fabs(priority - targetPriority) < std::numeric_limits<double>::epsilon() && bias(node, target) ) {
 | 
			
		||||
                return false;
 | 
			
		||||
            }
 | 
			
		||||
            neighbours.push_back( target );
 | 
			
		||||
@ -754,7 +760,7 @@ private:
 | 
			
		||||
                if ( priority > targetPriority)
 | 
			
		||||
                    return false;
 | 
			
		||||
                //tie breaking
 | 
			
		||||
                if ( fabs(priority - targetPriority) < FLT_EPSILON && bias(node, target) ) {
 | 
			
		||||
                if ( fabs(priority - targetPriority) < std::numeric_limits<double>::epsilon() && bias(node, target) ) {
 | 
			
		||||
                    return false;
 | 
			
		||||
                }
 | 
			
		||||
            }
 | 
			
		||||
 | 
			
		||||
@ -1,22 +1,29 @@
 | 
			
		||||
/*
 | 
			
		||||
 open source routing machine
 | 
			
		||||
 Copyright (C) Dennis Luxen, others 2010
 | 
			
		||||
 | 
			
		||||
 This program is free software; you can redistribute it and/or modify
 | 
			
		||||
 it under the terms of the GNU AFFERO General Public License as published by
 | 
			
		||||
 the Free Software Foundation; either version 3 of the License, or
 | 
			
		||||
 any later version.
 | 
			
		||||
Copyright (c) 2013, Project OSRM, Dennis Luxen, others
 | 
			
		||||
All rights reserved.
 | 
			
		||||
 | 
			
		||||
 This program is distributed in the hope that it will be useful,
 | 
			
		||||
 but WITHOUT ANY WARRANTY; without even the implied warranty of
 | 
			
		||||
 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
 | 
			
		||||
 GNU General Public License for more details.
 | 
			
		||||
Redistribution and use in source and binary forms, with or without modification,
 | 
			
		||||
are permitted provided that the following conditions are met:
 | 
			
		||||
 | 
			
		||||
 You should have received a copy of the GNU Affero General Public License
 | 
			
		||||
 along with this program; if not, write to the Free Software
 | 
			
		||||
 Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA
 | 
			
		||||
 or see http://www.gnu.org/licenses/agpl.txt.
 | 
			
		||||
 */
 | 
			
		||||
Redistributions of source code must retain the above copyright notice, this list
 | 
			
		||||
of conditions and the following disclaimer.
 | 
			
		||||
Redistributions in binary form must reproduce the above copyright notice, this
 | 
			
		||||
list of conditions and the following disclaimer in the documentation and/or
 | 
			
		||||
other materials provided with the distribution.
 | 
			
		||||
 | 
			
		||||
THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND
 | 
			
		||||
ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
 | 
			
		||||
WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
 | 
			
		||||
DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR
 | 
			
		||||
ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
 | 
			
		||||
(INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
 | 
			
		||||
LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON
 | 
			
		||||
ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
 | 
			
		||||
(INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
 | 
			
		||||
SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
 | 
			
		||||
 | 
			
		||||
*/
 | 
			
		||||
 | 
			
		||||
#include "EdgeBasedGraphFactory.h"
 | 
			
		||||
 | 
			
		||||
@ -40,7 +47,7 @@ EdgeBasedGraphFactory::EdgeBasedGraphFactory(
 | 
			
		||||
        if(restriction_iter == m_restriction_map.end()) {
 | 
			
		||||
            index = m_restriction_bucket_list.size();
 | 
			
		||||
            m_restriction_bucket_list.resize(index+1);
 | 
			
		||||
            m_restriction_map[restriction_source] = index;
 | 
			
		||||
            m_restriction_map.emplace(restriction_source, index);
 | 
			
		||||
        } else {
 | 
			
		||||
            index = restriction_iter->second;
 | 
			
		||||
            //Map already contains an is_only_*-restriction
 | 
			
		||||
@ -292,6 +299,8 @@ void EdgeBasedGraphFactory::Run(
 | 
			
		||||
    }
 | 
			
		||||
    SimpleLogger().Write() <<
 | 
			
		||||
        "identified: " << component_size_list.size() << " many components";
 | 
			
		||||
    SimpleLogger().Write() <<
 | 
			
		||||
        "generating edge-expanded nodes";
 | 
			
		||||
 | 
			
		||||
    p.reinit(m_node_based_graph->GetNumberOfNodes());
 | 
			
		||||
    //loop over all edges and generate new set of nodes.
 | 
			
		||||
@ -301,6 +310,7 @@ void EdgeBasedGraphFactory::Run(
 | 
			
		||||
        u < number_of_nodes;
 | 
			
		||||
        ++u
 | 
			
		||||
     ) {
 | 
			
		||||
        p.printIncrement();
 | 
			
		||||
        for(
 | 
			
		||||
            EdgeIterator e1 = m_node_based_graph->BeginEdges(u),
 | 
			
		||||
                last_edge = m_node_based_graph->EndEdges(u);
 | 
			
		||||
@ -325,6 +335,12 @@ void EdgeBasedGraphFactory::Run(
 | 
			
		||||
        }
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    SimpleLogger().Write()
 | 
			
		||||
        << "Generated " << m_edge_based_node_list.size() << " nodes in " <<
 | 
			
		||||
        "edge-expanded graph";
 | 
			
		||||
    SimpleLogger().Write() <<
 | 
			
		||||
        "generating edge-expanded edges";
 | 
			
		||||
 | 
			
		||||
    std::vector<NodeID>().swap(component_size_list);
 | 
			
		||||
    BOOST_ASSERT_MSG(
 | 
			
		||||
        0 == component_size_list.capacity(),
 | 
			
		||||
@ -341,6 +357,7 @@ void EdgeBasedGraphFactory::Run(
 | 
			
		||||
    //Loop over all turns and generate new set of edges.
 | 
			
		||||
    //Three nested loop look super-linear, but we are dealing with a (kind of)
 | 
			
		||||
    //linear number of turns only.
 | 
			
		||||
    p.reinit(m_node_based_graph->GetNumberOfNodes());
 | 
			
		||||
    for(
 | 
			
		||||
        NodeIterator u = 0,
 | 
			
		||||
            last_node = m_node_based_graph->GetNumberOfNodes();
 | 
			
		||||
 | 
			
		||||
@ -1,22 +1,29 @@
 | 
			
		||||
/*
 | 
			
		||||
 open source routing machine
 | 
			
		||||
 Copyright (C) Dennis Luxen, others 2010
 | 
			
		||||
 | 
			
		||||
 This program is free software; you can redistribute it and/or modify
 | 
			
		||||
 it under the terms of the GNU AFFERO General Public License as published by
 | 
			
		||||
 the Free Software Foundation; either version 3 of the License, or
 | 
			
		||||
 any later version.
 | 
			
		||||
Copyright (c) 2013, Project OSRM, Dennis Luxen, others
 | 
			
		||||
All rights reserved.
 | 
			
		||||
 | 
			
		||||
 This program is distributed in the hope that it will be useful,
 | 
			
		||||
 but WITHOUT ANY WARRANTY; without even the implied warranty of
 | 
			
		||||
 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
 | 
			
		||||
 GNU General Public License for more details.
 | 
			
		||||
Redistribution and use in source and binary forms, with or without modification,
 | 
			
		||||
are permitted provided that the following conditions are met:
 | 
			
		||||
 | 
			
		||||
 You should have received a copy of the GNU Affero General Public License
 | 
			
		||||
 along with this program; if not, write to the Free Software
 | 
			
		||||
 Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA
 | 
			
		||||
 or see http://www.gnu.org/licenses/agpl.txt.
 | 
			
		||||
 */
 | 
			
		||||
Redistributions of source code must retain the above copyright notice, this list
 | 
			
		||||
of conditions and the following disclaimer.
 | 
			
		||||
Redistributions in binary form must reproduce the above copyright notice, this
 | 
			
		||||
list of conditions and the following disclaimer in the documentation and/or
 | 
			
		||||
other materials provided with the distribution.
 | 
			
		||||
 | 
			
		||||
THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND
 | 
			
		||||
ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
 | 
			
		||||
WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
 | 
			
		||||
DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR
 | 
			
		||||
ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
 | 
			
		||||
(INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
 | 
			
		||||
LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON
 | 
			
		||||
ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
 | 
			
		||||
(INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
 | 
			
		||||
SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
 | 
			
		||||
 | 
			
		||||
*/
 | 
			
		||||
 | 
			
		||||
//  This class constructs the edge-expanded routing graph
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
@ -1,22 +1,29 @@
 | 
			
		||||
/*
 | 
			
		||||
 open source routing machine
 | 
			
		||||
 Copyright (C) Dennis Luxen, others 2010
 | 
			
		||||
 | 
			
		||||
 This program is free software; you can redistribute it and/or modify
 | 
			
		||||
 it under the terms of the GNU AFFERO General Public License as published by
 | 
			
		||||
 the Free Software Foundation; either version 3 of the License, or
 | 
			
		||||
 any later version.
 | 
			
		||||
Copyright (c) 2013, Project OSRM, Dennis Luxen, others
 | 
			
		||||
All rights reserved.
 | 
			
		||||
 | 
			
		||||
 This program is distributed in the hope that it will be useful,
 | 
			
		||||
 but WITHOUT ANY WARRANTY; without even the implied warranty of
 | 
			
		||||
 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
 | 
			
		||||
 GNU General Public License for more details.
 | 
			
		||||
Redistribution and use in source and binary forms, with or without modification,
 | 
			
		||||
are permitted provided that the following conditions are met:
 | 
			
		||||
 | 
			
		||||
 You should have received a copy of the GNU Affero General Public License
 | 
			
		||||
 along with this program; if not, write to the Free Software
 | 
			
		||||
 Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA
 | 
			
		||||
 or see http://www.gnu.org/licenses/agpl.txt.
 | 
			
		||||
 */
 | 
			
		||||
Redistributions of source code must retain the above copyright notice, this list
 | 
			
		||||
of conditions and the following disclaimer.
 | 
			
		||||
Redistributions in binary form must reproduce the above copyright notice, this
 | 
			
		||||
list of conditions and the following disclaimer in the documentation and/or
 | 
			
		||||
other materials provided with the distribution.
 | 
			
		||||
 | 
			
		||||
THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND
 | 
			
		||||
ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
 | 
			
		||||
WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
 | 
			
		||||
DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR
 | 
			
		||||
ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
 | 
			
		||||
(INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
 | 
			
		||||
LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON
 | 
			
		||||
ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
 | 
			
		||||
(INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
 | 
			
		||||
SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
 | 
			
		||||
 | 
			
		||||
*/
 | 
			
		||||
 | 
			
		||||
#include "TemporaryStorage.h"
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
@ -1,22 +1,29 @@
 | 
			
		||||
/*
 | 
			
		||||
 open source routing machine
 | 
			
		||||
 Copyright (C) Dennis Luxen, others 2010
 | 
			
		||||
 | 
			
		||||
 This program is free software; you can redistribute it and/or modify
 | 
			
		||||
 it under the terms of the GNU AFFERO General Public License as published by
 | 
			
		||||
 the Free Software Foundation; either version 3 of the License, or
 | 
			
		||||
 any later version.
 | 
			
		||||
Copyright (c) 2013, Project OSRM, Dennis Luxen, others
 | 
			
		||||
All rights reserved.
 | 
			
		||||
 | 
			
		||||
 This program is distributed in the hope that it will be useful,
 | 
			
		||||
 but WITHOUT ANY WARRANTY; without even the implied warranty of
 | 
			
		||||
 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
 | 
			
		||||
 GNU General Public License for more details.
 | 
			
		||||
Redistribution and use in source and binary forms, with or without modification,
 | 
			
		||||
are permitted provided that the following conditions are met:
 | 
			
		||||
 | 
			
		||||
 You should have received a copy of the GNU Affero General Public License
 | 
			
		||||
 along with this program; if not, write to the Free Software
 | 
			
		||||
 Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA
 | 
			
		||||
 or see http://www.gnu.org/licenses/agpl.txt.
 | 
			
		||||
 */
 | 
			
		||||
Redistributions of source code must retain the above copyright notice, this list
 | 
			
		||||
of conditions and the following disclaimer.
 | 
			
		||||
Redistributions in binary form must reproduce the above copyright notice, this
 | 
			
		||||
list of conditions and the following disclaimer in the documentation and/or
 | 
			
		||||
other materials provided with the distribution.
 | 
			
		||||
 | 
			
		||||
THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND
 | 
			
		||||
ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
 | 
			
		||||
WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
 | 
			
		||||
DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR
 | 
			
		||||
ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
 | 
			
		||||
(INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
 | 
			
		||||
LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON
 | 
			
		||||
ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
 | 
			
		||||
(INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
 | 
			
		||||
SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
 | 
			
		||||
 | 
			
		||||
*/
 | 
			
		||||
 | 
			
		||||
#ifndef TEMPORARYSTORAGE_H_
 | 
			
		||||
#define TEMPORARYSTORAGE_H_
 | 
			
		||||
 | 
			
		||||
@ -1,22 +1,29 @@
 | 
			
		||||
/*
 | 
			
		||||
    open source routing machine
 | 
			
		||||
    Copyright (C) Dennis Luxen, others 2010
 | 
			
		||||
 | 
			
		||||
This program is free software; you can redistribute it and/or modify
 | 
			
		||||
it under the terms of the GNU AFFERO General Public License as published by
 | 
			
		||||
the Free Software Foundation; either version 3 of the License, or
 | 
			
		||||
any later version.
 | 
			
		||||
Copyright (c) 2013, Project OSRM, Dennis Luxen, others
 | 
			
		||||
All rights reserved.
 | 
			
		||||
 | 
			
		||||
This program is distributed in the hope that it will be useful,
 | 
			
		||||
but WITHOUT ANY WARRANTY; without even the implied warranty of
 | 
			
		||||
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
 | 
			
		||||
GNU General Public License for more details.
 | 
			
		||||
Redistribution and use in source and binary forms, with or without modification,
 | 
			
		||||
are permitted provided that the following conditions are met:
 | 
			
		||||
 | 
			
		||||
You should have received a copy of the GNU Affero General Public License
 | 
			
		||||
along with this program; if not, write to the Free Software
 | 
			
		||||
Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA
 | 
			
		||||
or see http://www.gnu.org/licenses/agpl.txt.
 | 
			
		||||
 */
 | 
			
		||||
Redistributions of source code must retain the above copyright notice, this list
 | 
			
		||||
of conditions and the following disclaimer.
 | 
			
		||||
Redistributions in binary form must reproduce the above copyright notice, this
 | 
			
		||||
list of conditions and the following disclaimer in the documentation and/or
 | 
			
		||||
other materials provided with the distribution.
 | 
			
		||||
 | 
			
		||||
THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND
 | 
			
		||||
ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
 | 
			
		||||
WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
 | 
			
		||||
DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR
 | 
			
		||||
ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
 | 
			
		||||
(INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
 | 
			
		||||
LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON
 | 
			
		||||
ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
 | 
			
		||||
(INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
 | 
			
		||||
SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
 | 
			
		||||
 | 
			
		||||
*/
 | 
			
		||||
 | 
			
		||||
#ifndef BINARYHEAP_H_INCLUDED
 | 
			
		||||
#define BINARYHEAP_H_INCLUDED
 | 
			
		||||
 | 
			
		||||
@ -1,25 +1,34 @@
 | 
			
		||||
/*
 | 
			
		||||
    open source routing machine
 | 
			
		||||
    Copyright (C) Dennis Luxen, others 2010
 | 
			
		||||
 | 
			
		||||
This program is free software; you can redistribute it and/or modify
 | 
			
		||||
it under the terms of the GNU AFFERO General Public License as published by
 | 
			
		||||
the Free Software Foundation; either version 3 of the License, or
 | 
			
		||||
any later version.
 | 
			
		||||
Copyright (c) 2013, Project OSRM, Dennis Luxen, others
 | 
			
		||||
All rights reserved.
 | 
			
		||||
 | 
			
		||||
This program is distributed in the hope that it will be useful,
 | 
			
		||||
but WITHOUT ANY WARRANTY; without even the implied warranty of
 | 
			
		||||
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
 | 
			
		||||
GNU General Public License for more details.
 | 
			
		||||
Redistribution and use in source and binary forms, with or without modification,
 | 
			
		||||
are permitted provided that the following conditions are met:
 | 
			
		||||
 | 
			
		||||
You should have received a copy of the GNU Affero General Public License
 | 
			
		||||
along with this program; if not, write to the Free Software
 | 
			
		||||
Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA
 | 
			
		||||
or see http://www.gnu.org/licenses/agpl.txt.
 | 
			
		||||
 */
 | 
			
		||||
Redistributions of source code must retain the above copyright notice, this list
 | 
			
		||||
of conditions and the following disclaimer.
 | 
			
		||||
Redistributions in binary form must reproduce the above copyright notice, this
 | 
			
		||||
list of conditions and the following disclaimer in the documentation and/or
 | 
			
		||||
other materials provided with the distribution.
 | 
			
		||||
 | 
			
		||||
#ifndef CONCURRENTQUEUE_H_INCLUDED
 | 
			
		||||
#define CONCURRENTQUEUE_H_INCLUDED
 | 
			
		||||
THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND
 | 
			
		||||
ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
 | 
			
		||||
WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
 | 
			
		||||
DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR
 | 
			
		||||
ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
 | 
			
		||||
(INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
 | 
			
		||||
LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON
 | 
			
		||||
ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
 | 
			
		||||
(INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
 | 
			
		||||
SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
 | 
			
		||||
 | 
			
		||||
*/
 | 
			
		||||
 | 
			
		||||
#ifndef CONCURRENTQUEUE_H_
 | 
			
		||||
#define CONCURRENTQUEUE_H_
 | 
			
		||||
 | 
			
		||||
#include "../typedefs.h"
 | 
			
		||||
 | 
			
		||||
#include <boost/bind.hpp>
 | 
			
		||||
#include <boost/circular_buffer.hpp>
 | 
			
		||||
@ -27,57 +36,64 @@ or see http://www.gnu.org/licenses/agpl.txt.
 | 
			
		||||
#include <boost/thread/mutex.hpp>
 | 
			
		||||
#include <boost/thread/thread.hpp>
 | 
			
		||||
 | 
			
		||||
#include "../typedefs.h"
 | 
			
		||||
 | 
			
		||||
template<typename Data>
 | 
			
		||||
class ConcurrentQueue {
 | 
			
		||||
 | 
			
		||||
    typedef typename boost::circular_buffer<Data>::size_type size_t;
 | 
			
		||||
 | 
			
		||||
public:
 | 
			
		||||
    ConcurrentQueue(const size_t max_size) : internal_queue(max_size) { }
 | 
			
		||||
    ConcurrentQueue(const size_t max_size) : m_internal_queue(max_size) { }
 | 
			
		||||
 | 
			
		||||
    inline void push(Data const& data) {
 | 
			
		||||
    inline void push(const Data & data) {
 | 
			
		||||
        boost::mutex::scoped_lock lock(m_mutex);
 | 
			
		||||
        m_not_full.wait(lock, boost::bind(&ConcurrentQueue<Data>::is_not_full, this));
 | 
			
		||||
        internal_queue.push_back(data);
 | 
			
		||||
        m_not_full.wait(
 | 
			
		||||
            lock,
 | 
			
		||||
            boost::bind(&ConcurrentQueue<Data>::is_not_full, this)
 | 
			
		||||
        );
 | 
			
		||||
        m_internal_queue.push_back(data);
 | 
			
		||||
        lock.unlock();
 | 
			
		||||
        m_not_empty.notify_one();
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    inline bool empty() const {
 | 
			
		||||
        return internal_queue.empty();
 | 
			
		||||
        return m_internal_queue.empty();
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    inline void wait_and_pop(Data& popped_value) {
 | 
			
		||||
    inline void wait_and_pop(Data & popped_value) {
 | 
			
		||||
        boost::mutex::scoped_lock lock(m_mutex);
 | 
			
		||||
        m_not_empty.wait(lock, boost::bind(&ConcurrentQueue<Data>::is_not_empty, this));
 | 
			
		||||
        popped_value=internal_queue.front();
 | 
			
		||||
        internal_queue.pop_front();
 | 
			
		||||
        m_not_empty.wait(
 | 
			
		||||
            lock,
 | 
			
		||||
            boost::bind(&ConcurrentQueue<Data>::is_not_empty, this)
 | 
			
		||||
        );
 | 
			
		||||
        popped_value = m_internal_queue.front();
 | 
			
		||||
        m_internal_queue.pop_front();
 | 
			
		||||
        lock.unlock();
 | 
			
		||||
        m_not_full.notify_one();
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    inline bool try_pop(Data& popped_value) {
 | 
			
		||||
        boost::mutex::scoped_lock lock(m_mutex);
 | 
			
		||||
        if(internal_queue.empty()) {
 | 
			
		||||
        if(m_internal_queue.empty()) {
 | 
			
		||||
            return false;
 | 
			
		||||
        }
 | 
			
		||||
        popped_value=internal_queue.front();
 | 
			
		||||
        internal_queue.pop_front();
 | 
			
		||||
        popped_value=m_internal_queue.front();
 | 
			
		||||
        m_internal_queue.pop_front();
 | 
			
		||||
        lock.unlock();
 | 
			
		||||
        m_not_full.notify_one();
 | 
			
		||||
        return true;
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
private:
 | 
			
		||||
    boost::circular_buffer<Data> internal_queue;
 | 
			
		||||
    inline bool is_not_empty() const {
 | 
			
		||||
        return !m_internal_queue.empty();
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    inline bool is_not_full() const {
 | 
			
		||||
        return m_internal_queue.size() < m_internal_queue.capacity();
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    boost::circular_buffer<Data>    m_internal_queue;
 | 
			
		||||
    boost::mutex                    m_mutex;
 | 
			
		||||
    boost::condition                m_not_empty;
 | 
			
		||||
    boost::condition                m_not_full;
 | 
			
		||||
 | 
			
		||||
    inline bool is_not_empty() const { return internal_queue.size() > 0; }
 | 
			
		||||
    inline bool is_not_full() const { return internal_queue.size() < internal_queue.capacity(); }
 | 
			
		||||
};
 | 
			
		||||
 | 
			
		||||
#endif //#ifndef CONCURRENTQUEUE_H_INCLUDED
 | 
			
		||||
#endif /* CONCURRENTQUEUE_H_ */
 | 
			
		||||
 | 
			
		||||
@ -1,22 +1,29 @@
 | 
			
		||||
/*
 | 
			
		||||
    open source routing machine
 | 
			
		||||
    Copyright (C) Dennis Luxen, others 2010
 | 
			
		||||
 | 
			
		||||
This program is free software; you can redistribute it and/or modify
 | 
			
		||||
it under the terms of the GNU AFFERO General Public License as published by
 | 
			
		||||
the Free Software Foundation; either version 3 of the License, or
 | 
			
		||||
any later version.
 | 
			
		||||
Copyright (c) 2013, Project OSRM, Dennis Luxen, others
 | 
			
		||||
All rights reserved.
 | 
			
		||||
 | 
			
		||||
This program is distributed in the hope that it will be useful,
 | 
			
		||||
but WITHOUT ANY WARRANTY; without even the implied warranty of
 | 
			
		||||
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
 | 
			
		||||
GNU General Public License for more details.
 | 
			
		||||
Redistribution and use in source and binary forms, with or without modification,
 | 
			
		||||
are permitted provided that the following conditions are met:
 | 
			
		||||
 | 
			
		||||
You should have received a copy of the GNU Affero General Public License
 | 
			
		||||
along with this program; if not, write to the Free Software
 | 
			
		||||
Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA
 | 
			
		||||
or see http://www.gnu.org/licenses/agpl.txt.
 | 
			
		||||
 */
 | 
			
		||||
Redistributions of source code must retain the above copyright notice, this list
 | 
			
		||||
of conditions and the following disclaimer.
 | 
			
		||||
Redistributions in binary form must reproduce the above copyright notice, this
 | 
			
		||||
list of conditions and the following disclaimer in the documentation and/or
 | 
			
		||||
other materials provided with the distribution.
 | 
			
		||||
 | 
			
		||||
THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND
 | 
			
		||||
ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
 | 
			
		||||
WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
 | 
			
		||||
DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR
 | 
			
		||||
ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
 | 
			
		||||
(INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
 | 
			
		||||
LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON
 | 
			
		||||
ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
 | 
			
		||||
(INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
 | 
			
		||||
SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
 | 
			
		||||
 | 
			
		||||
*/
 | 
			
		||||
 | 
			
		||||
#ifndef FIXED_POINT_COORDINATE_H_
 | 
			
		||||
#define FIXED_POINT_COORDINATE_H_
 | 
			
		||||
@ -118,8 +125,8 @@ inline double ApproximateEuclideanDistance(const FixedPointCoordinate &c1, const
 | 
			
		||||
 | 
			
		||||
static inline void convertInternalLatLonToString(const int value, std::string & output) {
 | 
			
		||||
    char buffer[100];
 | 
			
		||||
    buffer[10] = 0; // Nullterminierung
 | 
			
		||||
    char* string = printInt< 10, 6 >( buffer, value );
 | 
			
		||||
    buffer[11] = 0; // zero termination
 | 
			
		||||
    char* string = printInt< 11, 6 >( buffer, value );
 | 
			
		||||
    output = string;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
@ -1,27 +1,35 @@
 | 
			
		||||
/*
 | 
			
		||||
    open source routing machine
 | 
			
		||||
    Copyright (C) Dennis Luxen, others 2010
 | 
			
		||||
 | 
			
		||||
This program is free software; you can redistribute it and/or modify
 | 
			
		||||
it under the terms of the GNU AFFERO General Public License as published by
 | 
			
		||||
the Free Software Foundation; either version 3 of the License, or
 | 
			
		||||
any later version.
 | 
			
		||||
Copyright (c) 2013, Project OSRM, Dennis Luxen, others
 | 
			
		||||
All rights reserved.
 | 
			
		||||
 | 
			
		||||
This program is distributed in the hope that it will be useful,
 | 
			
		||||
but WITHOUT ANY WARRANTY; without even the implied warranty of
 | 
			
		||||
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
 | 
			
		||||
GNU General Public License for more details.
 | 
			
		||||
Redistribution and use in source and binary forms, with or without modification,
 | 
			
		||||
are permitted provided that the following conditions are met:
 | 
			
		||||
 | 
			
		||||
You should have received a copy of the GNU Affero General Public License
 | 
			
		||||
along with this program; if not, write to the Free Software
 | 
			
		||||
Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA
 | 
			
		||||
or see http://www.gnu.org/licenses/agpl.txt.
 | 
			
		||||
 */
 | 
			
		||||
Redistributions of source code must retain the above copyright notice, this list
 | 
			
		||||
of conditions and the following disclaimer.
 | 
			
		||||
Redistributions in binary form must reproduce the above copyright notice, this
 | 
			
		||||
list of conditions and the following disclaimer in the documentation and/or
 | 
			
		||||
other materials provided with the distribution.
 | 
			
		||||
 | 
			
		||||
THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND
 | 
			
		||||
ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
 | 
			
		||||
WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
 | 
			
		||||
DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR
 | 
			
		||||
ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
 | 
			
		||||
(INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
 | 
			
		||||
LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON
 | 
			
		||||
ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
 | 
			
		||||
(INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
 | 
			
		||||
SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
 | 
			
		||||
 | 
			
		||||
*/
 | 
			
		||||
 | 
			
		||||
#ifndef DEALLOCATINGVECTOR_H_
 | 
			
		||||
#define DEALLOCATINGVECTOR_H_
 | 
			
		||||
 | 
			
		||||
#include <cassert>
 | 
			
		||||
#include <cstring>
 | 
			
		||||
#include <vector>
 | 
			
		||||
 | 
			
		||||
#if __cplusplus > 199711L
 | 
			
		||||
 | 
			
		||||
@ -1,22 +1,29 @@
 | 
			
		||||
/*
 | 
			
		||||
    open source routing machine
 | 
			
		||||
    Copyright (C) Dennis Luxen, others 2010
 | 
			
		||||
 | 
			
		||||
This program is free software; you can redistribute it and/or modify
 | 
			
		||||
it under the terms of the GNU AFFERO General Public License as published by
 | 
			
		||||
the Free Software Foundation; either version 3 of the License, or
 | 
			
		||||
any later version.
 | 
			
		||||
Copyright (c) 2013, Project OSRM, Dennis Luxen, others
 | 
			
		||||
All rights reserved.
 | 
			
		||||
 | 
			
		||||
This program is distributed in the hope that it will be useful,
 | 
			
		||||
but WITHOUT ANY WARRANTY; without even the implied warranty of
 | 
			
		||||
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
 | 
			
		||||
GNU General Public License for more details.
 | 
			
		||||
Redistribution and use in source and binary forms, with or without modification,
 | 
			
		||||
are permitted provided that the following conditions are met:
 | 
			
		||||
 | 
			
		||||
You should have received a copy of the GNU Affero General Public License
 | 
			
		||||
along with this program; if not, write to the Free Software
 | 
			
		||||
Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA
 | 
			
		||||
or see http://www.gnu.org/licenses/agpl.txt.
 | 
			
		||||
 */
 | 
			
		||||
Redistributions of source code must retain the above copyright notice, this list
 | 
			
		||||
of conditions and the following disclaimer.
 | 
			
		||||
Redistributions in binary form must reproduce the above copyright notice, this
 | 
			
		||||
list of conditions and the following disclaimer in the documentation and/or
 | 
			
		||||
other materials provided with the distribution.
 | 
			
		||||
 | 
			
		||||
THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND
 | 
			
		||||
ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
 | 
			
		||||
WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
 | 
			
		||||
DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR
 | 
			
		||||
ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
 | 
			
		||||
(INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
 | 
			
		||||
LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON
 | 
			
		||||
ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
 | 
			
		||||
(INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
 | 
			
		||||
SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
 | 
			
		||||
 | 
			
		||||
*/
 | 
			
		||||
 | 
			
		||||
#ifndef DYNAMICGRAPH_H_INCLUDED
 | 
			
		||||
#define DYNAMICGRAPH_H_INCLUDED
 | 
			
		||||
 | 
			
		||||
@ -1,25 +1,29 @@
 | 
			
		||||
/*
 | 
			
		||||
    open source routing machine
 | 
			
		||||
    Copyright (C) Dennis Luxen, others 2010
 | 
			
		||||
 | 
			
		||||
This program is free software; you can redistribute it and/or modify
 | 
			
		||||
it under the terms of the GNU AFFERO General Public License as published by
 | 
			
		||||
the Free Software Foundation; either version 3 of the License, or
 | 
			
		||||
any later version.
 | 
			
		||||
Copyright (c) 2013, Project OSRM, Dennis Luxen, others
 | 
			
		||||
All rights reserved.
 | 
			
		||||
 | 
			
		||||
This program is distributed in the hope that it will be useful,
 | 
			
		||||
but WITHOUT ANY WARRANTY; without even the implied warranty of
 | 
			
		||||
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
 | 
			
		||||
GNU General Public License for more details.
 | 
			
		||||
Redistribution and use in source and binary forms, with or without modification,
 | 
			
		||||
are permitted provided that the following conditions are met:
 | 
			
		||||
 | 
			
		||||
You should have received a copy of the GNU Affero General Public License
 | 
			
		||||
along with this program; if not, write to the Free Software
 | 
			
		||||
Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA
 | 
			
		||||
or see http://www.gnu.org/licenses/agpl.txt.
 | 
			
		||||
Redistributions of source code must retain the above copyright notice, this list
 | 
			
		||||
of conditions and the following disclaimer.
 | 
			
		||||
Redistributions in binary form must reproduce the above copyright notice, this
 | 
			
		||||
list of conditions and the following disclaimer in the documentation and/or
 | 
			
		||||
other materials provided with the distribution.
 | 
			
		||||
 | 
			
		||||
  Created on: 18.11.2010
 | 
			
		||||
  Author: dennis
 | 
			
		||||
 */
 | 
			
		||||
THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND
 | 
			
		||||
ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
 | 
			
		||||
WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
 | 
			
		||||
DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR
 | 
			
		||||
ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
 | 
			
		||||
(INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
 | 
			
		||||
LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON
 | 
			
		||||
ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
 | 
			
		||||
(INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
 | 
			
		||||
SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
 | 
			
		||||
 | 
			
		||||
*/
 | 
			
		||||
 | 
			
		||||
#ifndef HASHTABLE_H_
 | 
			
		||||
#define HASHTABLE_H_
 | 
			
		||||
@ -36,6 +40,11 @@ public:
 | 
			
		||||
 | 
			
		||||
    HashTable(const unsigned size) : super(size) { }
 | 
			
		||||
 | 
			
		||||
    HashTable &operator=(const HashTable &other) {
 | 
			
		||||
        super::operator = (other);
 | 
			
		||||
        return *this;
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    inline void Add(const keyT& key, const valueT& value){
 | 
			
		||||
        super::insert(std::make_pair(key, value));
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
@ -1,22 +1,29 @@
 | 
			
		||||
/*
 | 
			
		||||
    open source routing machine
 | 
			
		||||
    Copyright (C) Dennis Luxen, others 2010
 | 
			
		||||
 | 
			
		||||
This program is free software; you can redistribute it and/or modify
 | 
			
		||||
it under the terms of the GNU AFFERO General Public License as published by
 | 
			
		||||
the Free Software Foundation; either version 3 of the License, or
 | 
			
		||||
any later version.
 | 
			
		||||
Copyright (c) 2013, Project OSRM, Dennis Luxen, others
 | 
			
		||||
All rights reserved.
 | 
			
		||||
 | 
			
		||||
This program is distributed in the hope that it will be useful,
 | 
			
		||||
but WITHOUT ANY WARRANTY; without even the implied warranty of
 | 
			
		||||
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
 | 
			
		||||
GNU General Public License for more details.
 | 
			
		||||
Redistribution and use in source and binary forms, with or without modification,
 | 
			
		||||
are permitted provided that the following conditions are met:
 | 
			
		||||
 | 
			
		||||
You should have received a copy of the GNU Affero General Public License
 | 
			
		||||
along with this program; if not, write to the Free Software
 | 
			
		||||
Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA
 | 
			
		||||
or see http://www.gnu.org/licenses/agpl.txt.
 | 
			
		||||
 */
 | 
			
		||||
Redistributions of source code must retain the above copyright notice, this list
 | 
			
		||||
of conditions and the following disclaimer.
 | 
			
		||||
Redistributions in binary form must reproduce the above copyright notice, this
 | 
			
		||||
list of conditions and the following disclaimer in the documentation and/or
 | 
			
		||||
other materials provided with the distribution.
 | 
			
		||||
 | 
			
		||||
THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND
 | 
			
		||||
ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
 | 
			
		||||
WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
 | 
			
		||||
DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR
 | 
			
		||||
ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
 | 
			
		||||
(INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
 | 
			
		||||
LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON
 | 
			
		||||
ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
 | 
			
		||||
(INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
 | 
			
		||||
SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
 | 
			
		||||
 | 
			
		||||
*/
 | 
			
		||||
 | 
			
		||||
#ifndef HILBERTVALUE_H_
 | 
			
		||||
#define HILBERTVALUE_H_
 | 
			
		||||
 | 
			
		||||
@ -1,33 +1,41 @@
 | 
			
		||||
/*
 | 
			
		||||
    open source routing machine
 | 
			
		||||
    Copyright (C) Dennis Luxen, others 2010
 | 
			
		||||
 | 
			
		||||
This program is free software; you can redistribute it and/or modify
 | 
			
		||||
it under the terms of the GNU AFFERO General Public License as published by
 | 
			
		||||
the Free Software Foundation; either version 3 of the License, or
 | 
			
		||||
any later version.
 | 
			
		||||
Copyright (c) 2013, Project OSRM, Dennis Luxen, others
 | 
			
		||||
All rights reserved.
 | 
			
		||||
 | 
			
		||||
This program is distributed in the hope that it will be useful,
 | 
			
		||||
but WITHOUT ANY WARRANTY; without even the implied warranty of
 | 
			
		||||
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
 | 
			
		||||
GNU General Public License for more details.
 | 
			
		||||
Redistribution and use in source and binary forms, with or without modification,
 | 
			
		||||
are permitted provided that the following conditions are met:
 | 
			
		||||
 | 
			
		||||
You should have received a copy of the GNU Affero General Public License
 | 
			
		||||
along with this program; if not, write to the Free Software
 | 
			
		||||
Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA
 | 
			
		||||
or see http://www.gnu.org/licenses/agpl.txt.
 | 
			
		||||
 */
 | 
			
		||||
Redistributions of source code must retain the above copyright notice, this list
 | 
			
		||||
of conditions and the following disclaimer.
 | 
			
		||||
Redistributions in binary form must reproduce the above copyright notice, this
 | 
			
		||||
list of conditions and the following disclaimer in the documentation and/or
 | 
			
		||||
other materials provided with the distribution.
 | 
			
		||||
 | 
			
		||||
#ifndef EDGE_H
 | 
			
		||||
#define EDGE_H
 | 
			
		||||
THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND
 | 
			
		||||
ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
 | 
			
		||||
WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
 | 
			
		||||
DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR
 | 
			
		||||
ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
 | 
			
		||||
(INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
 | 
			
		||||
LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON
 | 
			
		||||
ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
 | 
			
		||||
(INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
 | 
			
		||||
SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
 | 
			
		||||
 | 
			
		||||
*/
 | 
			
		||||
 | 
			
		||||
#ifndef IMPORT_EDGE_H
 | 
			
		||||
#define IMPORT_EDGE_H
 | 
			
		||||
 | 
			
		||||
#include "../Util/OSRMException.h"
 | 
			
		||||
#include <cassert>
 | 
			
		||||
#include "../typedefs.h"
 | 
			
		||||
 | 
			
		||||
#include <boost/assert.hpp>
 | 
			
		||||
 | 
			
		||||
class NodeBasedEdge {
 | 
			
		||||
public:
 | 
			
		||||
 | 
			
		||||
public:
 | 
			
		||||
    bool operator< (const NodeBasedEdge& e) const {
 | 
			
		||||
        if (source() == e.source()) {
 | 
			
		||||
            if (target() == e.target()) {
 | 
			
		||||
@ -58,9 +66,9 @@ public:
 | 
			
		||||
        _target(t),
 | 
			
		||||
        _name(n),
 | 
			
		||||
        _weight(w),
 | 
			
		||||
        _type(ty),
 | 
			
		||||
        forward(f),
 | 
			
		||||
        backward(b),
 | 
			
		||||
        _type(ty),
 | 
			
		||||
        _roundabout(ra),
 | 
			
		||||
        _ignoreInGrid(ig),
 | 
			
		||||
        _accessRestricted(ar),
 | 
			
		||||
@ -75,8 +83,9 @@ public:
 | 
			
		||||
    NodeID source()             const {return _source; }
 | 
			
		||||
    NodeID name()               const { return _name;  }
 | 
			
		||||
    EdgeWeight weight()         const {return _weight; }
 | 
			
		||||
 | 
			
		||||
    short type() const { assert(_type >= 0); return _type; }
 | 
			
		||||
    short type()                const {
 | 
			
		||||
        BOOST_ASSERT_MSG(_type >= 0, "type of ImportEdge invalid");
 | 
			
		||||
                                        return _type;   }
 | 
			
		||||
    bool isBackward()           const { return backward; }
 | 
			
		||||
    bool isForward()            const { return forward; }
 | 
			
		||||
    bool isLocatable()          const { return _type != 14; }
 | 
			
		||||
@ -85,28 +94,26 @@ public:
 | 
			
		||||
    bool isAccessRestricted()   const { return _accessRestricted; }
 | 
			
		||||
    bool isContraFlow()         const { return _contraFlow; }
 | 
			
		||||
 | 
			
		||||
    //TODO: names need to be fixed.
 | 
			
		||||
    NodeID      _source;
 | 
			
		||||
    NodeID      _target;
 | 
			
		||||
    NodeID      _name;
 | 
			
		||||
    EdgeWeight  _weight;
 | 
			
		||||
    bool forward;
 | 
			
		||||
    bool backward;
 | 
			
		||||
    short       _type;
 | 
			
		||||
    bool _roundabout;
 | 
			
		||||
    bool _ignoreInGrid;
 | 
			
		||||
    bool _accessRestricted;
 | 
			
		||||
    bool _contraFlow;
 | 
			
		||||
    bool        forward:1;
 | 
			
		||||
    bool        backward:1;
 | 
			
		||||
    bool        _roundabout:1;
 | 
			
		||||
    bool        _ignoreInGrid:1;
 | 
			
		||||
    bool        _accessRestricted:1;
 | 
			
		||||
    bool        _contraFlow:1;
 | 
			
		||||
 | 
			
		||||
private:
 | 
			
		||||
    /** Default constructor. target and weight are set to 0.*/
 | 
			
		||||
    NodeBasedEdge() :
 | 
			
		||||
        _source(0), _target(0), _name(0), _weight(0), forward(0), backward(0), _type(0), _roundabout(false), _ignoreInGrid(false), _accessRestricted(false), _contraFlow(false) { assert(false); } //shall not be used.
 | 
			
		||||
 | 
			
		||||
    NodeBasedEdge() { }
 | 
			
		||||
};
 | 
			
		||||
 | 
			
		||||
class EdgeBasedEdge {
 | 
			
		||||
public:
 | 
			
		||||
 | 
			
		||||
public:
 | 
			
		||||
    bool operator< (const EdgeBasedEdge& e) const {
 | 
			
		||||
        if (source() == e.source()) {
 | 
			
		||||
            if (target() == e.target()) {
 | 
			
		||||
@ -141,7 +148,14 @@ public:
 | 
			
		||||
        m_backward(false)
 | 
			
		||||
    { }
 | 
			
		||||
 | 
			
		||||
    explicit EdgeBasedEdge(const NodeID s, const NodeID t, const NodeID v, const EdgeWeight w, const bool f, const bool b) :
 | 
			
		||||
    explicit EdgeBasedEdge(
 | 
			
		||||
        const NodeID s,
 | 
			
		||||
        const NodeID t,
 | 
			
		||||
        const NodeID v,
 | 
			
		||||
        const EdgeWeight w,
 | 
			
		||||
        const bool f,
 | 
			
		||||
        const bool b
 | 
			
		||||
    ) :
 | 
			
		||||
        m_source(s),
 | 
			
		||||
        m_target(t),
 | 
			
		||||
        m_edgeID(v),
 | 
			
		||||
@ -150,12 +164,13 @@ public:
 | 
			
		||||
        m_backward(b)
 | 
			
		||||
    {}
 | 
			
		||||
 | 
			
		||||
    NodeID target() const {return m_target; }
 | 
			
		||||
    NodeID source() const {return m_source; }
 | 
			
		||||
    EdgeWeight weight() const {return m_weight; }
 | 
			
		||||
    NodeID      target()        const { return m_target;   }
 | 
			
		||||
    NodeID      source()        const { return m_source;   }
 | 
			
		||||
    EdgeWeight  weight()        const { return m_weight;   }
 | 
			
		||||
    NodeID      id()            const { return m_edgeID;   }
 | 
			
		||||
    bool        isBackward()    const { return m_backward; }
 | 
			
		||||
    bool        isForward()     const { return m_forward;  }
 | 
			
		||||
 | 
			
		||||
private:
 | 
			
		||||
    NodeID      m_source;
 | 
			
		||||
    NodeID      m_target;
 | 
			
		||||
@ -167,4 +182,4 @@ private:
 | 
			
		||||
 | 
			
		||||
typedef NodeBasedEdge ImportEdge;
 | 
			
		||||
 | 
			
		||||
#endif // EDGE_H
 | 
			
		||||
#endif /* IMPORT_EDGE_H */
 | 
			
		||||
 | 
			
		||||
@ -1,22 +1,29 @@
 | 
			
		||||
/*
 | 
			
		||||
    open source routing machine
 | 
			
		||||
    Copyright (C) Dennis Luxen, others 2010
 | 
			
		||||
 | 
			
		||||
This program is free software; you can redistribute it and/or modify
 | 
			
		||||
it under the terms of the GNU AFFERO General Public License as published by
 | 
			
		||||
the Free Software Foundation; either version 3 of the License, or
 | 
			
		||||
any later version.
 | 
			
		||||
Copyright (c) 2013, Project OSRM, Dennis Luxen, others
 | 
			
		||||
All rights reserved.
 | 
			
		||||
 | 
			
		||||
This program is distributed in the hope that it will be useful,
 | 
			
		||||
but WITHOUT ANY WARRANTY; without even the implied warranty of
 | 
			
		||||
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
 | 
			
		||||
GNU General Public License for more details.
 | 
			
		||||
Redistribution and use in source and binary forms, with or without modification,
 | 
			
		||||
are permitted provided that the following conditions are met:
 | 
			
		||||
 | 
			
		||||
You should have received a copy of the GNU Affero General Public License
 | 
			
		||||
along with this program; if not, write to the Free Software
 | 
			
		||||
Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA
 | 
			
		||||
or see http://www.gnu.org/licenses/agpl.txt.
 | 
			
		||||
 */
 | 
			
		||||
Redistributions of source code must retain the above copyright notice, this list
 | 
			
		||||
of conditions and the following disclaimer.
 | 
			
		||||
Redistributions in binary form must reproduce the above copyright notice, this
 | 
			
		||||
list of conditions and the following disclaimer in the documentation and/or
 | 
			
		||||
other materials provided with the distribution.
 | 
			
		||||
 | 
			
		||||
THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND
 | 
			
		||||
ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
 | 
			
		||||
WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
 | 
			
		||||
DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR
 | 
			
		||||
ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
 | 
			
		||||
(INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
 | 
			
		||||
LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON
 | 
			
		||||
ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
 | 
			
		||||
(INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
 | 
			
		||||
SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
 | 
			
		||||
 | 
			
		||||
*/
 | 
			
		||||
 | 
			
		||||
#ifndef IMPORTNODE_H_
 | 
			
		||||
#define IMPORTNODE_H_
 | 
			
		||||
 | 
			
		||||
@ -1,22 +1,30 @@
 | 
			
		||||
/*
 | 
			
		||||
    open source routing machine
 | 
			
		||||
    Copyright (C) Dennis Luxen, others 2010
 | 
			
		||||
 | 
			
		||||
This program is free software; you can redistribute it and/or modify
 | 
			
		||||
it under the terms of the GNU AFFERO General Public License as published by
 | 
			
		||||
the Free Software Foundation; either version 3 of the License, or
 | 
			
		||||
any later version.
 | 
			
		||||
Copyright (c) 2013, Project OSRM, Dennis Luxen, others
 | 
			
		||||
All rights reserved.
 | 
			
		||||
 | 
			
		||||
This program is distributed in the hope that it will be useful,
 | 
			
		||||
but WITHOUT ANY WARRANTY; without even the implied warranty of
 | 
			
		||||
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
 | 
			
		||||
GNU General Public License for more details.
 | 
			
		||||
Redistribution and use in source and binary forms, with or without modification,
 | 
			
		||||
are permitted provided that the following conditions are met:
 | 
			
		||||
 | 
			
		||||
Redistributions of source code must retain the above copyright notice, this list
 | 
			
		||||
of conditions and the following disclaimer.
 | 
			
		||||
Redistributions in binary form must reproduce the above copyright notice, this
 | 
			
		||||
list of conditions and the following disclaimer in the documentation and/or
 | 
			
		||||
other materials provided with the distribution.
 | 
			
		||||
 | 
			
		||||
THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND
 | 
			
		||||
ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
 | 
			
		||||
WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
 | 
			
		||||
DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR
 | 
			
		||||
ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
 | 
			
		||||
(INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
 | 
			
		||||
LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON
 | 
			
		||||
ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
 | 
			
		||||
(INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
 | 
			
		||||
SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
 | 
			
		||||
 | 
			
		||||
*/
 | 
			
		||||
 | 
			
		||||
You should have received a copy of the GNU Affero General Public License
 | 
			
		||||
along with this program; if not, write to the Free Software
 | 
			
		||||
Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA
 | 
			
		||||
or see http://www.gnu.org/licenses/agpl.txt.
 | 
			
		||||
 */
 | 
			
		||||
 | 
			
		||||
#ifndef INPUTREADERFACTORY_H
 | 
			
		||||
#define INPUTREADERFACTORY_H
 | 
			
		||||
 | 
			
		||||
@ -1,22 +1,29 @@
 | 
			
		||||
/*
 | 
			
		||||
    open source routing machine
 | 
			
		||||
    Copyright (C) Dennis Luxen, others 2010
 | 
			
		||||
 | 
			
		||||
This program is free software; you can redistribute it and/or modify
 | 
			
		||||
it under the terms of the GNU AFFERO General Public License as published by
 | 
			
		||||
the Free Software Foundation; either version 3 of the License, or
 | 
			
		||||
any later version.
 | 
			
		||||
Copyright (c) 2013, Project OSRM, Dennis Luxen, others
 | 
			
		||||
All rights reserved.
 | 
			
		||||
 | 
			
		||||
This program is distributed in the hope that it will be useful,
 | 
			
		||||
but WITHOUT ANY WARRANTY; without even the implied warranty of
 | 
			
		||||
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
 | 
			
		||||
GNU General Public License for more details.
 | 
			
		||||
Redistribution and use in source and binary forms, with or without modification,
 | 
			
		||||
are permitted provided that the following conditions are met:
 | 
			
		||||
 | 
			
		||||
You should have received a copy of the GNU Affero General Public License
 | 
			
		||||
along with this program; if not, write to the Free Software
 | 
			
		||||
Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA
 | 
			
		||||
or see http://www.gnu.org/licenses/agpl.txt.
 | 
			
		||||
 */
 | 
			
		||||
Redistributions of source code must retain the above copyright notice, this list
 | 
			
		||||
of conditions and the following disclaimer.
 | 
			
		||||
Redistributions in binary form must reproduce the above copyright notice, this
 | 
			
		||||
list of conditions and the following disclaimer in the documentation and/or
 | 
			
		||||
other materials provided with the distribution.
 | 
			
		||||
 | 
			
		||||
THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND
 | 
			
		||||
ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
 | 
			
		||||
WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
 | 
			
		||||
DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR
 | 
			
		||||
ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
 | 
			
		||||
(INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
 | 
			
		||||
LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON
 | 
			
		||||
ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
 | 
			
		||||
(INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
 | 
			
		||||
SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
 | 
			
		||||
 | 
			
		||||
*/
 | 
			
		||||
 | 
			
		||||
#ifndef LRUCACHE_H
 | 
			
		||||
#define LRUCACHE_H
 | 
			
		||||
 | 
			
		||||
@ -1,21 +1,28 @@
 | 
			
		||||
/*
 | 
			
		||||
    open source routing machine
 | 
			
		||||
    Copyright (C) Dennis Luxen, others 2010
 | 
			
		||||
 | 
			
		||||
This program is free software; you can redistribute it and/or modify
 | 
			
		||||
it under the terms of the GNU AFFERO General Public License as published by
 | 
			
		||||
the Free Software Foundation; either version 3 of the License, or
 | 
			
		||||
any later version.
 | 
			
		||||
Copyright (c) 2013, Project OSRM, Dennis Luxen, others
 | 
			
		||||
All rights reserved.
 | 
			
		||||
 | 
			
		||||
This program is distributed in the hope that it will be useful,
 | 
			
		||||
but WITHOUT ANY WARRANTY; without even the implied warranty of
 | 
			
		||||
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
 | 
			
		||||
GNU General Public License for more details.
 | 
			
		||||
Redistribution and use in source and binary forms, with or without modification,
 | 
			
		||||
are permitted provided that the following conditions are met:
 | 
			
		||||
 | 
			
		||||
Redistributions of source code must retain the above copyright notice, this list
 | 
			
		||||
of conditions and the following disclaimer.
 | 
			
		||||
Redistributions in binary form must reproduce the above copyright notice, this
 | 
			
		||||
list of conditions and the following disclaimer in the documentation and/or
 | 
			
		||||
other materials provided with the distribution.
 | 
			
		||||
 | 
			
		||||
THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND
 | 
			
		||||
ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
 | 
			
		||||
WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
 | 
			
		||||
DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR
 | 
			
		||||
ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
 | 
			
		||||
(INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
 | 
			
		||||
LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON
 | 
			
		||||
ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
 | 
			
		||||
(INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
 | 
			
		||||
SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
 | 
			
		||||
 | 
			
		||||
You should have received a copy of the GNU Affero General Public License
 | 
			
		||||
along with this program; if not, write to the Free Software
 | 
			
		||||
Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA
 | 
			
		||||
or see http://www.gnu.org/licenses/agpl.txt.
 | 
			
		||||
*/
 | 
			
		||||
 | 
			
		||||
#ifndef MERCATORUTIL_H_
 | 
			
		||||
 | 
			
		||||
@ -1,22 +1,30 @@
 | 
			
		||||
/*
 | 
			
		||||
    open source routing machine
 | 
			
		||||
    Copyright (C) Dennis Luxen, others 2010
 | 
			
		||||
 | 
			
		||||
This program is free software; you can redistribute it and/or modify
 | 
			
		||||
it under the terms of the GNU AFFERO General Public License as published by
 | 
			
		||||
the Free Software Foundation; either version 3 of the License, or
 | 
			
		||||
any later version.
 | 
			
		||||
Copyright (c) 2013, Project OSRM, Dennis Luxen, others
 | 
			
		||||
All rights reserved.
 | 
			
		||||
 | 
			
		||||
This program is distributed in the hope that it will be useful,
 | 
			
		||||
but WITHOUT ANY WARRANTY; without even the implied warranty of
 | 
			
		||||
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
 | 
			
		||||
GNU General Public License for more details.
 | 
			
		||||
Redistribution and use in source and binary forms, with or without modification,
 | 
			
		||||
are permitted provided that the following conditions are met:
 | 
			
		||||
 | 
			
		||||
Redistributions of source code must retain the above copyright notice, this list
 | 
			
		||||
of conditions and the following disclaimer.
 | 
			
		||||
Redistributions in binary form must reproduce the above copyright notice, this
 | 
			
		||||
list of conditions and the following disclaimer in the documentation and/or
 | 
			
		||||
other materials provided with the distribution.
 | 
			
		||||
 | 
			
		||||
THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND
 | 
			
		||||
ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
 | 
			
		||||
WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
 | 
			
		||||
DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR
 | 
			
		||||
ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
 | 
			
		||||
(INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
 | 
			
		||||
LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON
 | 
			
		||||
ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
 | 
			
		||||
(INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
 | 
			
		||||
SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
 | 
			
		||||
 | 
			
		||||
*/
 | 
			
		||||
 | 
			
		||||
You should have received a copy of the GNU Affero General Public License
 | 
			
		||||
along with this program; if not, write to the Free Software
 | 
			
		||||
Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA
 | 
			
		||||
or see http://www.gnu.org/licenses/agpl.txt.
 | 
			
		||||
 */
 | 
			
		||||
 | 
			
		||||
#ifndef NODEINFORMATIONHELPDESK_H_
 | 
			
		||||
#define NODEINFORMATIONHELPDESK_H_
 | 
			
		||||
@ -40,20 +48,23 @@ or see http://www.gnu.org/licenses/agpl.txt.
 | 
			
		||||
typedef EdgeBasedGraphFactory::EdgeBasedNode RTreeLeaf;
 | 
			
		||||
 | 
			
		||||
class NodeInformationHelpDesk : boost::noncopyable {
 | 
			
		||||
 | 
			
		||||
public:
 | 
			
		||||
    NodeInformationHelpDesk(
 | 
			
		||||
        const std::string & ramIndexInput,
 | 
			
		||||
        const std::string & fileIndexInput,
 | 
			
		||||
        const std::string & ram_index_filename,
 | 
			
		||||
        const std::string & mem_index_filename,
 | 
			
		||||
        const std::string & nodes_filename,
 | 
			
		||||
        const std::string & edges_filename,
 | 
			
		||||
        const unsigned number_of_nodes,
 | 
			
		||||
        const unsigned check_sum
 | 
			
		||||
    ) : number_of_nodes(number_of_nodes), check_sum(check_sum)
 | 
			
		||||
        const unsigned m_number_of_nodes,
 | 
			
		||||
        const unsigned m_check_sum
 | 
			
		||||
    ) :
 | 
			
		||||
        m_number_of_nodes(m_number_of_nodes),
 | 
			
		||||
        m_check_sum(m_check_sum)
 | 
			
		||||
    {
 | 
			
		||||
        if ( ramIndexInput.empty() ) {
 | 
			
		||||
        if ( ram_index_filename.empty() ) {
 | 
			
		||||
            throw OSRMException("no ram index file name in server ini");
 | 
			
		||||
        }
 | 
			
		||||
        if ( fileIndexInput.empty() ) {
 | 
			
		||||
        if ( mem_index_filename.empty() ) {
 | 
			
		||||
            throw OSRMException("no mem index file name in server ini");
 | 
			
		||||
        }
 | 
			
		||||
        if ( nodes_filename.empty()     ) {
 | 
			
		||||
@ -63,61 +74,49 @@ public:
 | 
			
		||||
            throw OSRMException("no edges file name in server ini");
 | 
			
		||||
        }
 | 
			
		||||
 | 
			
		||||
        read_only_rtree = new StaticRTree<RTreeLeaf>(
 | 
			
		||||
            ramIndexInput,
 | 
			
		||||
            fileIndexInput
 | 
			
		||||
        m_ro_rtree_ptr = new StaticRTree<RTreeLeaf>(
 | 
			
		||||
            ram_index_filename,
 | 
			
		||||
            mem_index_filename
 | 
			
		||||
        );
 | 
			
		||||
        BOOST_ASSERT_MSG(
 | 
			
		||||
            0 == coordinateVector.size(),
 | 
			
		||||
            0 == m_coordinate_list.size(),
 | 
			
		||||
            "Coordinate vector not empty"
 | 
			
		||||
        );
 | 
			
		||||
 | 
			
		||||
        LoadNodesAndEdges(nodes_filename, edges_filename);
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    //Todo: Shared memory mechanism
 | 
			
		||||
	~NodeInformationHelpDesk() {
 | 
			
		||||
		delete read_only_rtree;
 | 
			
		||||
		delete m_ro_rtree_ptr;
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	inline int getLatitudeOfNode(const unsigned id) const {
 | 
			
		||||
	    const NodeID node = origEdgeData_viaNode.at(id);
 | 
			
		||||
	    return coordinateVector.at(node).lat;
 | 
			
		||||
    inline FixedPointCoordinate GetCoordinateOfNode(const unsigned id) const {
 | 
			
		||||
        const NodeID node = m_via_node_list.at(id);
 | 
			
		||||
        return m_coordinate_list.at(node);
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
	inline int getLongitudeOfNode(const unsigned id) const {
 | 
			
		||||
        const NodeID node = origEdgeData_viaNode.at(id);
 | 
			
		||||
	    return coordinateVector.at(node).lon;
 | 
			
		||||
	inline unsigned GetNameIndexFromEdgeID(const unsigned id) const {
 | 
			
		||||
	    return m_name_ID_list.at(id);
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	inline unsigned getNameIndexFromEdgeID(const unsigned id) const {
 | 
			
		||||
	    return origEdgeData_nameID.at(id);
 | 
			
		||||
    inline TurnInstruction GetTurnInstructionForEdgeID(const unsigned id) const {
 | 
			
		||||
        return m_turn_instruction_list.at(id);
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    inline TurnInstruction getTurnInstructionFromEdgeID(const unsigned id) const {
 | 
			
		||||
        return origEdgeData_turnInstruction.at(id);
 | 
			
		||||
    inline NodeID GetNumberOfNodes() const {
 | 
			
		||||
        return m_number_of_nodes;
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    inline NodeID getNumberOfNodes() const {
 | 
			
		||||
        return number_of_nodes;
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
	inline NodeID getNumberOfNodes2() const {
 | 
			
		||||
        return coordinateVector.size();
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    inline bool FindNearestNodeCoordForLatLon(
 | 
			
		||||
    inline bool LocateClosestEndPointForCoordinate(
 | 
			
		||||
            const FixedPointCoordinate& input_coordinate,
 | 
			
		||||
            FixedPointCoordinate& result,
 | 
			
		||||
            const unsigned zoom_level = 18
 | 
			
		||||
    ) const {
 | 
			
		||||
        PhantomNode resulting_phantom_node;
 | 
			
		||||
        bool foundNode = FindPhantomNodeForCoordinate(
 | 
			
		||||
        bool found_node = m_ro_rtree_ptr->LocateClosestEndPointForCoordinate(
 | 
			
		||||
                            input_coordinate,
 | 
			
		||||
            resulting_phantom_node, zoom_level
 | 
			
		||||
                            result, zoom_level
 | 
			
		||||
                          );
 | 
			
		||||
        result = resulting_phantom_node.location;
 | 
			
		||||
        return foundNode;
 | 
			
		||||
        return found_node;
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    inline bool FindPhantomNodeForCoordinate(
 | 
			
		||||
@ -125,7 +124,7 @@ public:
 | 
			
		||||
            PhantomNode & resulting_phantom_node,
 | 
			
		||||
            const unsigned zoom_level
 | 
			
		||||
    ) const {
 | 
			
		||||
        return read_only_rtree->FindPhantomNodeForCoordinate(
 | 
			
		||||
        return m_ro_rtree_ptr->FindPhantomNodeForCoordinate(
 | 
			
		||||
                input_coordinate,
 | 
			
		||||
                resulting_phantom_node,
 | 
			
		||||
                zoom_level
 | 
			
		||||
@ -133,7 +132,7 @@ public:
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
	inline unsigned GetCheckSum() const {
 | 
			
		||||
	    return check_sum;
 | 
			
		||||
	    return m_check_sum;
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
private:
 | 
			
		||||
@ -157,48 +156,63 @@ private:
 | 
			
		||||
            throw OSRMException("edges file is empty");
 | 
			
		||||
        }
 | 
			
		||||
 | 
			
		||||
        boost::filesystem::ifstream nodes_input_stream(nodes_file, std::ios::binary);
 | 
			
		||||
        boost::filesystem::ifstream edges_input_stream(edges_file, std::ios::binary);
 | 
			
		||||
        boost::filesystem::ifstream nodes_input_stream(
 | 
			
		||||
            nodes_file,
 | 
			
		||||
            std::ios::binary
 | 
			
		||||
        );
 | 
			
		||||
 | 
			
		||||
        SimpleLogger().Write(logDEBUG) << "Loading node data";
 | 
			
		||||
        NodeInfo b;
 | 
			
		||||
        boost::filesystem::ifstream edges_input_stream(
 | 
			
		||||
            edges_file, std::ios::binary
 | 
			
		||||
        );
 | 
			
		||||
 | 
			
		||||
        SimpleLogger().Write(logDEBUG)
 | 
			
		||||
            << "Loading node data";
 | 
			
		||||
        NodeInfo current_node;
 | 
			
		||||
        while(!nodes_input_stream.eof()) {
 | 
			
		||||
            nodes_input_stream.read((char *)&b, sizeof(NodeInfo));
 | 
			
		||||
            coordinateVector.push_back(FixedPointCoordinate(b.lat, b.lon));
 | 
			
		||||
            nodes_input_stream.read((char *)¤t_node, sizeof(NodeInfo));
 | 
			
		||||
            m_coordinate_list.push_back(
 | 
			
		||||
                FixedPointCoordinate(
 | 
			
		||||
                    current_node.lat,
 | 
			
		||||
                    current_node.lon
 | 
			
		||||
                )
 | 
			
		||||
            );
 | 
			
		||||
        }
 | 
			
		||||
        std::vector<FixedPointCoordinate>(coordinateVector).swap(coordinateVector);
 | 
			
		||||
        std::vector<FixedPointCoordinate>(m_coordinate_list).swap(m_coordinate_list);
 | 
			
		||||
        nodes_input_stream.close();
 | 
			
		||||
 | 
			
		||||
        SimpleLogger().Write(logDEBUG) << "Loading edge data";
 | 
			
		||||
        unsigned numberOfOrigEdges(0);
 | 
			
		||||
        edges_input_stream.read((char*)&numberOfOrigEdges, sizeof(unsigned));
 | 
			
		||||
        origEdgeData_viaNode.resize(numberOfOrigEdges);
 | 
			
		||||
        origEdgeData_nameID.resize(numberOfOrigEdges);
 | 
			
		||||
        origEdgeData_turnInstruction.resize(numberOfOrigEdges);
 | 
			
		||||
        SimpleLogger().Write(logDEBUG)
 | 
			
		||||
            << "Loading edge data";
 | 
			
		||||
        unsigned number_of_edges = 0;
 | 
			
		||||
        edges_input_stream.read((char*)&number_of_edges, sizeof(unsigned));
 | 
			
		||||
        m_via_node_list.resize(number_of_edges);
 | 
			
		||||
        m_name_ID_list.resize(number_of_edges);
 | 
			
		||||
        m_turn_instruction_list.resize(number_of_edges);
 | 
			
		||||
 | 
			
		||||
        OriginalEdgeData deserialized_originalEdgeData;
 | 
			
		||||
        for(unsigned i = 0; i < numberOfOrigEdges; ++i) {
 | 
			
		||||
        OriginalEdgeData current_edge_data;
 | 
			
		||||
        for(unsigned i = 0; i < number_of_edges; ++i) {
 | 
			
		||||
            edges_input_stream.read(
 | 
			
		||||
                (char*)&(deserialized_originalEdgeData),
 | 
			
		||||
                (char*)&(current_edge_data),
 | 
			
		||||
                sizeof(OriginalEdgeData)
 | 
			
		||||
            );
 | 
			
		||||
            origEdgeData_viaNode[i] = deserialized_originalEdgeData.viaNode;
 | 
			
		||||
            origEdgeData_nameID[i]  = deserialized_originalEdgeData.nameID;
 | 
			
		||||
            origEdgeData_turnInstruction[i] = deserialized_originalEdgeData.turnInstruction;
 | 
			
		||||
            m_via_node_list[i] = current_edge_data.viaNode;
 | 
			
		||||
            m_name_ID_list[i]  = current_edge_data.nameID;
 | 
			
		||||
            m_turn_instruction_list[i] = current_edge_data.turnInstruction;
 | 
			
		||||
        }
 | 
			
		||||
        edges_input_stream.close();
 | 
			
		||||
        SimpleLogger().Write(logDEBUG) << "Loaded " << numberOfOrigEdges << " orig edges";
 | 
			
		||||
        SimpleLogger().Write(logDEBUG) << "Opening NN indices";
 | 
			
		||||
        SimpleLogger().Write(logDEBUG)
 | 
			
		||||
            << "Loaded " << number_of_edges << " orig edges";
 | 
			
		||||
        SimpleLogger().Write(logDEBUG)
 | 
			
		||||
            << "Opening NN indices";
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
	std::vector<FixedPointCoordinate> coordinateVector;
 | 
			
		||||
	std::vector<NodeID> origEdgeData_viaNode;
 | 
			
		||||
	std::vector<unsigned> origEdgeData_nameID;
 | 
			
		||||
	std::vector<TurnInstruction> origEdgeData_turnInstruction;
 | 
			
		||||
	std::vector<FixedPointCoordinate>  m_coordinate_list;
 | 
			
		||||
	std::vector<NodeID>                m_via_node_list;
 | 
			
		||||
	std::vector<unsigned>              m_name_ID_list;
 | 
			
		||||
	std::vector<TurnInstruction>       m_turn_instruction_list;
 | 
			
		||||
 | 
			
		||||
	StaticRTree<EdgeBasedGraphFactory::EdgeBasedNode> * read_only_rtree;
 | 
			
		||||
	const unsigned number_of_nodes;
 | 
			
		||||
	const unsigned check_sum;
 | 
			
		||||
	StaticRTree<EdgeBasedGraphFactory::EdgeBasedNode> * m_ro_rtree_ptr;
 | 
			
		||||
	const unsigned m_number_of_nodes;
 | 
			
		||||
	const unsigned m_check_sum;
 | 
			
		||||
};
 | 
			
		||||
 | 
			
		||||
#endif /*NODEINFORMATIONHELPDESK_H_*/
 | 
			
		||||
 | 
			
		||||
@ -1,22 +1,29 @@
 | 
			
		||||
/*
 | 
			
		||||
    open source routing machine
 | 
			
		||||
    Copyright (C) Dennis Luxen, others 2010
 | 
			
		||||
 | 
			
		||||
This program is free software; you can redistribute it and/or modify
 | 
			
		||||
it under the terms of the GNU AFFERO General Public License as published by
 | 
			
		||||
the Free Software Foundation; either version 3 of the License, or
 | 
			
		||||
any later version.
 | 
			
		||||
Copyright (c) 2013, Project OSRM, Dennis Luxen, others
 | 
			
		||||
All rights reserved.
 | 
			
		||||
 | 
			
		||||
This program is distributed in the hope that it will be useful,
 | 
			
		||||
but WITHOUT ANY WARRANTY; without even the implied warranty of
 | 
			
		||||
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
 | 
			
		||||
GNU General Public License for more details.
 | 
			
		||||
Redistribution and use in source and binary forms, with or without modification,
 | 
			
		||||
are permitted provided that the following conditions are met:
 | 
			
		||||
 | 
			
		||||
You should have received a copy of the GNU Affero General Public License
 | 
			
		||||
along with this program; if not, write to the Free Software
 | 
			
		||||
Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA
 | 
			
		||||
or see http://www.gnu.org/licenses/agpl.txt.
 | 
			
		||||
 */
 | 
			
		||||
Redistributions of source code must retain the above copyright notice, this list
 | 
			
		||||
of conditions and the following disclaimer.
 | 
			
		||||
Redistributions in binary form must reproduce the above copyright notice, this
 | 
			
		||||
list of conditions and the following disclaimer in the documentation and/or
 | 
			
		||||
other materials provided with the distribution.
 | 
			
		||||
 | 
			
		||||
THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND
 | 
			
		||||
ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
 | 
			
		||||
WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
 | 
			
		||||
DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR
 | 
			
		||||
ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
 | 
			
		||||
(INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
 | 
			
		||||
LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON
 | 
			
		||||
ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
 | 
			
		||||
(INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
 | 
			
		||||
SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
 | 
			
		||||
 | 
			
		||||
*/
 | 
			
		||||
 | 
			
		||||
#ifndef PERCENT_H
 | 
			
		||||
#define PERCENT_H
 | 
			
		||||
@ -24,8 +31,7 @@ or see http://www.gnu.org/licenses/agpl.txt.
 | 
			
		||||
#include "../Util/OpenMPWrapper.h"
 | 
			
		||||
#include <iostream>
 | 
			
		||||
 | 
			
		||||
class Percent
 | 
			
		||||
{
 | 
			
		||||
class Percent {
 | 
			
		||||
public:
 | 
			
		||||
    /**
 | 
			
		||||
     * Constructor.
 | 
			
		||||
@ -56,8 +62,7 @@ public:
 | 
			
		||||
            std::cout << " 100%" << std::endl;
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    void printIncrement()
 | 
			
		||||
    {
 | 
			
		||||
    void printIncrement() {
 | 
			
		||||
#pragma omp atomic
 | 
			
		||||
        ++_current_value;
 | 
			
		||||
        printStatus(_current_value);
 | 
			
		||||
 | 
			
		||||
@ -1,22 +1,29 @@
 | 
			
		||||
/*
 | 
			
		||||
    open source routing machine
 | 
			
		||||
    Copyright (C) Dennis Luxen, 2010
 | 
			
		||||
 | 
			
		||||
This program is free software; you can redistribute it and/or modify
 | 
			
		||||
it under the terms of the GNU AFFERO General Public License as published by
 | 
			
		||||
the Free Software Foundation; either version 3 of the License, or
 | 
			
		||||
any later version.
 | 
			
		||||
Copyright (c) 2013, Project OSRM, Dennis Luxen, others
 | 
			
		||||
All rights reserved.
 | 
			
		||||
 | 
			
		||||
This program is distributed in the hope that it will be useful,
 | 
			
		||||
but WITHOUT ANY WARRANTY; without even the implied warranty of
 | 
			
		||||
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
 | 
			
		||||
GNU General Public License for more details.
 | 
			
		||||
Redistribution and use in source and binary forms, with or without modification,
 | 
			
		||||
are permitted provided that the following conditions are met:
 | 
			
		||||
 | 
			
		||||
You should have received a copy of the GNU Affero General Public License
 | 
			
		||||
along with this program; if not, write to the Free Software
 | 
			
		||||
Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA
 | 
			
		||||
or see http://www.gnu.org/licenses/agpl.txt.
 | 
			
		||||
 */
 | 
			
		||||
Redistributions of source code must retain the above copyright notice, this list
 | 
			
		||||
of conditions and the following disclaimer.
 | 
			
		||||
Redistributions in binary form must reproduce the above copyright notice, this
 | 
			
		||||
list of conditions and the following disclaimer in the documentation and/or
 | 
			
		||||
other materials provided with the distribution.
 | 
			
		||||
 | 
			
		||||
THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND
 | 
			
		||||
ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
 | 
			
		||||
WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
 | 
			
		||||
DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR
 | 
			
		||||
ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
 | 
			
		||||
(INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
 | 
			
		||||
LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON
 | 
			
		||||
ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
 | 
			
		||||
(INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
 | 
			
		||||
SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
 | 
			
		||||
 | 
			
		||||
*/
 | 
			
		||||
 | 
			
		||||
#ifndef PHANTOMNODES_H_
 | 
			
		||||
#define PHANTOMNODES_H_
 | 
			
		||||
 | 
			
		||||
@ -1,22 +1,29 @@
 | 
			
		||||
/*
 | 
			
		||||
    open source routing machine
 | 
			
		||||
    Copyright (C) Dennis Luxen, others 2010
 | 
			
		||||
 | 
			
		||||
This program is free software; you can redistribute it and/or modify
 | 
			
		||||
it under the terms of the GNU AFFERO General Public License as published by
 | 
			
		||||
the Free Software Foundation; either version 3 of the License, or
 | 
			
		||||
any later version.
 | 
			
		||||
Copyright (c) 2013, Project OSRM, Dennis Luxen, others
 | 
			
		||||
All rights reserved.
 | 
			
		||||
 | 
			
		||||
This program is distributed in the hope that it will be useful,
 | 
			
		||||
but WITHOUT ANY WARRANTY; without even the implied warranty of
 | 
			
		||||
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
 | 
			
		||||
GNU General Public License for more details.
 | 
			
		||||
Redistribution and use in source and binary forms, with or without modification,
 | 
			
		||||
are permitted provided that the following conditions are met:
 | 
			
		||||
 | 
			
		||||
You should have received a copy of the GNU Affero General Public License
 | 
			
		||||
along with this program; if not, write to the Free Software
 | 
			
		||||
Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA
 | 
			
		||||
or see http://www.gnu.org/licenses/agpl.txt.
 | 
			
		||||
 */
 | 
			
		||||
Redistributions of source code must retain the above copyright notice, this list
 | 
			
		||||
of conditions and the following disclaimer.
 | 
			
		||||
Redistributions in binary form must reproduce the above copyright notice, this
 | 
			
		||||
list of conditions and the following disclaimer in the documentation and/or
 | 
			
		||||
other materials provided with the distribution.
 | 
			
		||||
 | 
			
		||||
THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND
 | 
			
		||||
ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
 | 
			
		||||
WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
 | 
			
		||||
DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR
 | 
			
		||||
ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
 | 
			
		||||
(INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
 | 
			
		||||
LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON
 | 
			
		||||
ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
 | 
			
		||||
(INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
 | 
			
		||||
SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
 | 
			
		||||
 | 
			
		||||
*/
 | 
			
		||||
 | 
			
		||||
#ifndef QUERYEDGE_H_
 | 
			
		||||
#define QUERYEDGE_H_
 | 
			
		||||
 | 
			
		||||
@ -1,22 +1,29 @@
 | 
			
		||||
/*
 | 
			
		||||
    open source routing machine
 | 
			
		||||
    Copyright (C) Dennis Luxen, others 2010
 | 
			
		||||
 | 
			
		||||
This program is free software; you can redistribute it and/or modify
 | 
			
		||||
it under the terms of the GNU AFFERO General Public License as published by
 | 
			
		||||
the Free Software Foundation; either version 3 of the License, or
 | 
			
		||||
any later version.
 | 
			
		||||
Copyright (c) 2013, Project OSRM, Dennis Luxen, others
 | 
			
		||||
All rights reserved.
 | 
			
		||||
 | 
			
		||||
This program is distributed in the hope that it will be useful,
 | 
			
		||||
but WITHOUT ANY WARRANTY; without even the implied warranty of
 | 
			
		||||
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
 | 
			
		||||
GNU General Public License for more details.
 | 
			
		||||
Redistribution and use in source and binary forms, with or without modification,
 | 
			
		||||
are permitted provided that the following conditions are met:
 | 
			
		||||
 | 
			
		||||
You should have received a copy of the GNU Affero General Public License
 | 
			
		||||
along with this program; if not, write to the Free Software
 | 
			
		||||
Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA
 | 
			
		||||
or see http://www.gnu.org/licenses/agpl.txt.
 | 
			
		||||
 */
 | 
			
		||||
Redistributions of source code must retain the above copyright notice, this list
 | 
			
		||||
of conditions and the following disclaimer.
 | 
			
		||||
Redistributions in binary form must reproduce the above copyright notice, this
 | 
			
		||||
list of conditions and the following disclaimer in the documentation and/or
 | 
			
		||||
other materials provided with the distribution.
 | 
			
		||||
 | 
			
		||||
THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND
 | 
			
		||||
ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
 | 
			
		||||
WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
 | 
			
		||||
DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR
 | 
			
		||||
ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
 | 
			
		||||
(INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
 | 
			
		||||
LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON
 | 
			
		||||
ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
 | 
			
		||||
(INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
 | 
			
		||||
SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
 | 
			
		||||
 | 
			
		||||
*/
 | 
			
		||||
 | 
			
		||||
#ifndef _NODE_COORDS_H
 | 
			
		||||
#define _NODE_COORDS_H
 | 
			
		||||
 | 
			
		||||
@ -1,22 +1,29 @@
 | 
			
		||||
/*
 | 
			
		||||
    open source routing machine
 | 
			
		||||
    Copyright (C) Dennis Luxen, others 2010
 | 
			
		||||
 | 
			
		||||
This program is free software; you can redistribute it and/or modify
 | 
			
		||||
it under the terms of the GNU AFFERO General Public License as published by
 | 
			
		||||
the Free Software Foundation; either version 3 of the License, or
 | 
			
		||||
any later version.
 | 
			
		||||
Copyright (c) 2013, Project OSRM, Dennis Luxen, others
 | 
			
		||||
All rights reserved.
 | 
			
		||||
 | 
			
		||||
This program is distributed in the hope that it will be useful,
 | 
			
		||||
but WITHOUT ANY WARRANTY; without even the implied warranty of
 | 
			
		||||
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
 | 
			
		||||
GNU General Public License for more details.
 | 
			
		||||
Redistribution and use in source and binary forms, with or without modification,
 | 
			
		||||
are permitted provided that the following conditions are met:
 | 
			
		||||
 | 
			
		||||
You should have received a copy of the GNU Affero General Public License
 | 
			
		||||
along with this program; if not, write to the Free Software
 | 
			
		||||
Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA
 | 
			
		||||
or see http://www.gnu.org/licenses/agpl.txt.
 | 
			
		||||
 */
 | 
			
		||||
Redistributions of source code must retain the above copyright notice, this list
 | 
			
		||||
of conditions and the following disclaimer.
 | 
			
		||||
Redistributions in binary form must reproduce the above copyright notice, this
 | 
			
		||||
list of conditions and the following disclaimer in the documentation and/or
 | 
			
		||||
other materials provided with the distribution.
 | 
			
		||||
 | 
			
		||||
THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND
 | 
			
		||||
ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
 | 
			
		||||
WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
 | 
			
		||||
DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR
 | 
			
		||||
ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
 | 
			
		||||
(INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
 | 
			
		||||
LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON
 | 
			
		||||
ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
 | 
			
		||||
(INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
 | 
			
		||||
SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
 | 
			
		||||
 | 
			
		||||
*/
 | 
			
		||||
 | 
			
		||||
#ifndef RAWROUTEDATA_H_
 | 
			
		||||
#define RAWROUTEDATA_H_
 | 
			
		||||
 | 
			
		||||
@ -1,24 +1,29 @@
 | 
			
		||||
/*
 | 
			
		||||
    open source routing machine
 | 
			
		||||
    Copyright (C) Dennis Luxen, others 2010
 | 
			
		||||
 | 
			
		||||
This program is free software; you can redistribute it and/or modify
 | 
			
		||||
it under the terms of the GNU AFFERO General Public License as published by
 | 
			
		||||
the Free Software Foundation; either version 3 of the License, or
 | 
			
		||||
any later version.
 | 
			
		||||
Copyright (c) 2013, Project OSRM, Dennis Luxen, others
 | 
			
		||||
All rights reserved.
 | 
			
		||||
 | 
			
		||||
This program is distributed in the hope that it will be useful,
 | 
			
		||||
but WITHOUT ANY WARRANTY; without even the implied warranty of
 | 
			
		||||
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
 | 
			
		||||
GNU General Public License for more details.
 | 
			
		||||
Redistribution and use in source and binary forms, with or without modification,
 | 
			
		||||
are permitted provided that the following conditions are met:
 | 
			
		||||
 | 
			
		||||
You should have received a copy of the GNU Affero General Public License
 | 
			
		||||
along with this program; if not, write to the Free Software
 | 
			
		||||
Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA
 | 
			
		||||
or see http://www.gnu.org/licenses/agpl.txt.
 | 
			
		||||
 */
 | 
			
		||||
Redistributions of source code must retain the above copyright notice, this list
 | 
			
		||||
of conditions and the following disclaimer.
 | 
			
		||||
Redistributions in binary form must reproduce the above copyright notice, this
 | 
			
		||||
list of conditions and the following disclaimer in the documentation and/or
 | 
			
		||||
other materials provided with the distribution.
 | 
			
		||||
 | 
			
		||||
THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND
 | 
			
		||||
ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
 | 
			
		||||
WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
 | 
			
		||||
DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR
 | 
			
		||||
ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
 | 
			
		||||
(INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
 | 
			
		||||
LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON
 | 
			
		||||
ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
 | 
			
		||||
(INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
 | 
			
		||||
SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
 | 
			
		||||
 | 
			
		||||
*/
 | 
			
		||||
 | 
			
		||||
#ifndef RESTRICTION_H_
 | 
			
		||||
#define RESTRICTION_H_
 | 
			
		||||
 | 
			
		||||
@ -1,49 +1,52 @@
 | 
			
		||||
/*
 | 
			
		||||
    open source routing machine
 | 
			
		||||
    Copyright (C) Dennis Luxen, others 2010
 | 
			
		||||
 | 
			
		||||
This program is free software; you can redistribute it and/or modify
 | 
			
		||||
it under the terms of the GNU AFFERO General Public License as published by
 | 
			
		||||
the Free Software Foundation; either version 3 of the License, or
 | 
			
		||||
any later version.
 | 
			
		||||
Copyright (c) 2013, Project OSRM, Dennis Luxen, others
 | 
			
		||||
All rights reserved.
 | 
			
		||||
 | 
			
		||||
This program is distributed in the hope that it will be useful,
 | 
			
		||||
but WITHOUT ANY WARRANTY; without even the implied warranty of
 | 
			
		||||
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
 | 
			
		||||
GNU General Public License for more details.
 | 
			
		||||
Redistribution and use in source and binary forms, with or without modification,
 | 
			
		||||
are permitted provided that the following conditions are met:
 | 
			
		||||
 | 
			
		||||
You should have received a copy of the GNU Affero General Public License
 | 
			
		||||
along with this program; if not, write to the Free Software
 | 
			
		||||
Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA
 | 
			
		||||
or see http://www.gnu.org/licenses/agpl.txt.
 | 
			
		||||
 */
 | 
			
		||||
Redistributions of source code must retain the above copyright notice, this list
 | 
			
		||||
of conditions and the following disclaimer.
 | 
			
		||||
Redistributions in binary form must reproduce the above copyright notice, this
 | 
			
		||||
list of conditions and the following disclaimer in the documentation and/or
 | 
			
		||||
other materials provided with the distribution.
 | 
			
		||||
 | 
			
		||||
THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND
 | 
			
		||||
ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
 | 
			
		||||
WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
 | 
			
		||||
DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR
 | 
			
		||||
ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
 | 
			
		||||
(INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
 | 
			
		||||
LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON
 | 
			
		||||
ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
 | 
			
		||||
(INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
 | 
			
		||||
SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
 | 
			
		||||
 | 
			
		||||
*/
 | 
			
		||||
 | 
			
		||||
#include "SearchEngine.h"
 | 
			
		||||
 | 
			
		||||
SearchEngine::SearchEngine(
 | 
			
		||||
    QueryGraph * g,
 | 
			
		||||
    NodeInformationHelpDesk * nh,
 | 
			
		||||
    std::vector<std::string> & n
 | 
			
		||||
    ) :
 | 
			
		||||
        _queryData(g, nh, n),
 | 
			
		||||
SearchEngine::SearchEngine( QueryObjectsStorage * query_objects ) :
 | 
			
		||||
    _queryData(query_objects),
 | 
			
		||||
    shortestPath(_queryData),
 | 
			
		||||
    alternativePaths(_queryData)
 | 
			
		||||
    {}
 | 
			
		||||
    SearchEngine::~SearchEngine() {}
 | 
			
		||||
{}
 | 
			
		||||
 | 
			
		||||
SearchEngine::~SearchEngine() {}
 | 
			
		||||
 | 
			
		||||
void SearchEngine::GetCoordinatesForNodeID(
 | 
			
		||||
    NodeID id,
 | 
			
		||||
    FixedPointCoordinate& result
 | 
			
		||||
    ) const {
 | 
			
		||||
    result.lat = _queryData.nodeHelpDesk->getLatitudeOfNode(id);
 | 
			
		||||
    result.lon = _queryData.nodeHelpDesk->getLongitudeOfNode(id);
 | 
			
		||||
) const {
 | 
			
		||||
        result = _queryData.nodeHelpDesk->GetCoordinateOfNode(id);
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
void SearchEngine::FindPhantomNodeForCoordinate(
 | 
			
		||||
    const FixedPointCoordinate & location,
 | 
			
		||||
    PhantomNode & result,
 | 
			
		||||
    const unsigned zoomLevel
 | 
			
		||||
    ) const {
 | 
			
		||||
) const {
 | 
			
		||||
    _queryData.nodeHelpDesk->FindPhantomNodeForCoordinate(
 | 
			
		||||
        location,
 | 
			
		||||
        result, zoomLevel
 | 
			
		||||
@ -53,29 +56,29 @@ void SearchEngine::FindPhantomNodeForCoordinate(
 | 
			
		||||
NodeID SearchEngine::GetNameIDForOriginDestinationNodeID(
 | 
			
		||||
    const NodeID s,
 | 
			
		||||
    const NodeID t
 | 
			
		||||
    ) const {
 | 
			
		||||
    if(s == t){
 | 
			
		||||
) const {
 | 
			
		||||
    if(s == t) {
 | 
			
		||||
        return 0;
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    EdgeID e = _queryData.graph->FindEdge(s, t);
 | 
			
		||||
    if(e == UINT_MAX) {
 | 
			
		||||
        e = _queryData.graph->FindEdge( t, s );
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    if(UINT_MAX == e) {
 | 
			
		||||
        return 0;
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    assert(e != UINT_MAX);
 | 
			
		||||
    const QueryEdge::EdgeData ed = _queryData.graph->GetEdgeData(e);
 | 
			
		||||
    return ed.id;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
std::string SearchEngine::GetEscapedNameForNameID(const unsigned nameID) const {
 | 
			
		||||
    bool is_name_invalid = (nameID >= _queryData.names.size() || nameID == 0);
 | 
			
		||||
    if (is_name_invalid) {
 | 
			
		||||
        return std::string("");
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    return HTMLEntitize(_queryData.names.at(nameID));
 | 
			
		||||
    std::string result;
 | 
			
		||||
    _queryData.query_objects->GetName(nameID, result);
 | 
			
		||||
    return HTMLEntitize(result);
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
SearchEngineHeapPtr SearchEngineData::forwardHeap;
 | 
			
		||||
@ -86,4 +89,3 @@ SearchEngineHeapPtr SearchEngineData::backwardHeap2;
 | 
			
		||||
 | 
			
		||||
SearchEngineHeapPtr SearchEngineData::forwardHeap3;
 | 
			
		||||
SearchEngineHeapPtr SearchEngineData::backwardHeap3;
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
@ -1,22 +1,29 @@
 | 
			
		||||
/*
 | 
			
		||||
    open source routing machine
 | 
			
		||||
    Copyright (C) Dennis Luxen, others 2010
 | 
			
		||||
 | 
			
		||||
This program is free software; you can redistribute it and/or modify
 | 
			
		||||
it under the terms of the GNU AFFERO General Public License as published by
 | 
			
		||||
the Free Software Foundation; either version 3 of the License, or
 | 
			
		||||
any later version.
 | 
			
		||||
Copyright (c) 2013, Project OSRM, Dennis Luxen, others
 | 
			
		||||
All rights reserved.
 | 
			
		||||
 | 
			
		||||
This program is distributed in the hope that it will be useful,
 | 
			
		||||
but WITHOUT ANY WARRANTY; without even the implied warranty of
 | 
			
		||||
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
 | 
			
		||||
GNU General Public License for more details.
 | 
			
		||||
Redistribution and use in source and binary forms, with or without modification,
 | 
			
		||||
are permitted provided that the following conditions are met:
 | 
			
		||||
 | 
			
		||||
You should have received a copy of the GNU Affero General Public License
 | 
			
		||||
along with this program; if not, write to the Free Software
 | 
			
		||||
Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA
 | 
			
		||||
or see http://www.gnu.org/licenses/agpl.txt.
 | 
			
		||||
 */
 | 
			
		||||
Redistributions of source code must retain the above copyright notice, this list
 | 
			
		||||
of conditions and the following disclaimer.
 | 
			
		||||
Redistributions in binary form must reproduce the above copyright notice, this
 | 
			
		||||
list of conditions and the following disclaimer in the documentation and/or
 | 
			
		||||
other materials provided with the distribution.
 | 
			
		||||
 | 
			
		||||
THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND
 | 
			
		||||
ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
 | 
			
		||||
WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
 | 
			
		||||
DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR
 | 
			
		||||
ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
 | 
			
		||||
(INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
 | 
			
		||||
LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON
 | 
			
		||||
ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
 | 
			
		||||
(INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
 | 
			
		||||
SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
 | 
			
		||||
 | 
			
		||||
*/
 | 
			
		||||
 | 
			
		||||
#ifndef SEARCHENGINE_H_
 | 
			
		||||
#define SEARCHENGINE_H_
 | 
			
		||||
@ -28,6 +35,7 @@ or see http://www.gnu.org/licenses/agpl.txt.
 | 
			
		||||
#include "SearchEngineData.h"
 | 
			
		||||
#include "../RoutingAlgorithms/AlternativePathRouting.h"
 | 
			
		||||
#include "../RoutingAlgorithms/ShortestPathRouting.h"
 | 
			
		||||
#include "../Server/DataStructures/QueryObjectsStorage.h"
 | 
			
		||||
 | 
			
		||||
#include "../Util/StringUtil.h"
 | 
			
		||||
#include "../typedefs.h"
 | 
			
		||||
@ -44,11 +52,7 @@ public:
 | 
			
		||||
    ShortestPathRouting<SearchEngineData> shortestPath;
 | 
			
		||||
    AlternativeRouting<SearchEngineData> alternativePaths;
 | 
			
		||||
 | 
			
		||||
    SearchEngine(
 | 
			
		||||
        QueryGraph * g,
 | 
			
		||||
        NodeInformationHelpDesk * nh,
 | 
			
		||||
        std::vector<std::string> & n
 | 
			
		||||
    );
 | 
			
		||||
    SearchEngine( QueryObjectsStorage * query_objects );
 | 
			
		||||
	~SearchEngine();
 | 
			
		||||
 | 
			
		||||
	void GetCoordinatesForNodeID(NodeID id, FixedPointCoordinate& result) const;
 | 
			
		||||
 | 
			
		||||
@ -1,33 +1,40 @@
 | 
			
		||||
/*
 | 
			
		||||
    open source routing machine
 | 
			
		||||
    Copyright (C) Dennis Luxen, others 2010
 | 
			
		||||
 | 
			
		||||
This program is free software; you can redistribute it and/or modify
 | 
			
		||||
it under the terms of the GNU AFFERO General Public License as published by
 | 
			
		||||
the Free Software Foundation; either version 3 of the License, or
 | 
			
		||||
any later version.
 | 
			
		||||
Copyright (c) 2013, Project OSRM, Dennis Luxen, others
 | 
			
		||||
All rights reserved.
 | 
			
		||||
 | 
			
		||||
This program is distributed in the hope that it will be useful,
 | 
			
		||||
but WITHOUT ANY WARRANTY; without even the implied warranty of
 | 
			
		||||
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
 | 
			
		||||
GNU General Public License for more details.
 | 
			
		||||
Redistribution and use in source and binary forms, with or without modification,
 | 
			
		||||
are permitted provided that the following conditions are met:
 | 
			
		||||
 | 
			
		||||
You should have received a copy of the GNU Affero General Public License
 | 
			
		||||
along with this program; if not, write to the Free Software
 | 
			
		||||
Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA
 | 
			
		||||
or see http://www.gnu.org/licenses/agpl.txt.
 | 
			
		||||
 */
 | 
			
		||||
Redistributions of source code must retain the above copyright notice, this list
 | 
			
		||||
of conditions and the following disclaimer.
 | 
			
		||||
Redistributions in binary form must reproduce the above copyright notice, this
 | 
			
		||||
list of conditions and the following disclaimer in the documentation and/or
 | 
			
		||||
other materials provided with the distribution.
 | 
			
		||||
 | 
			
		||||
THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND
 | 
			
		||||
ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
 | 
			
		||||
WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
 | 
			
		||||
DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR
 | 
			
		||||
ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
 | 
			
		||||
(INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
 | 
			
		||||
LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON
 | 
			
		||||
ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
 | 
			
		||||
(INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
 | 
			
		||||
SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
 | 
			
		||||
 | 
			
		||||
*/
 | 
			
		||||
 | 
			
		||||
#include "SearchEngineData.h"
 | 
			
		||||
 | 
			
		||||
void SearchEngineData::InitializeOrClearFirstThreadLocalStorage() {
 | 
			
		||||
    if(!forwardHeap.get()) {
 | 
			
		||||
        forwardHeap.reset(new QueryHeap(nodeHelpDesk->getNumberOfNodes()));
 | 
			
		||||
        forwardHeap.reset(new QueryHeap(nodeHelpDesk->GetNumberOfNodes()));
 | 
			
		||||
    } else {
 | 
			
		||||
        forwardHeap->Clear();
 | 
			
		||||
    }
 | 
			
		||||
    if(!backwardHeap.get()) {
 | 
			
		||||
        backwardHeap.reset(new QueryHeap(nodeHelpDesk->getNumberOfNodes()));
 | 
			
		||||
        backwardHeap.reset(new QueryHeap(nodeHelpDesk->GetNumberOfNodes()));
 | 
			
		||||
    } else {
 | 
			
		||||
        backwardHeap->Clear();
 | 
			
		||||
    }
 | 
			
		||||
@ -35,12 +42,12 @@ void SearchEngineData::InitializeOrClearFirstThreadLocalStorage() {
 | 
			
		||||
 | 
			
		||||
void SearchEngineData::InitializeOrClearSecondThreadLocalStorage() {
 | 
			
		||||
    if(!forwardHeap2.get()) {
 | 
			
		||||
        forwardHeap2.reset(new QueryHeap(nodeHelpDesk->getNumberOfNodes()));
 | 
			
		||||
        forwardHeap2.reset(new QueryHeap(nodeHelpDesk->GetNumberOfNodes()));
 | 
			
		||||
    } else {
 | 
			
		||||
        forwardHeap2->Clear();
 | 
			
		||||
    }
 | 
			
		||||
    if(!backwardHeap2.get()) {
 | 
			
		||||
        backwardHeap2.reset(new QueryHeap(nodeHelpDesk->getNumberOfNodes()));
 | 
			
		||||
        backwardHeap2.reset(new QueryHeap(nodeHelpDesk->GetNumberOfNodes()));
 | 
			
		||||
     } else {
 | 
			
		||||
        backwardHeap2->Clear();
 | 
			
		||||
    }
 | 
			
		||||
@ -48,12 +55,12 @@ void SearchEngineData::InitializeOrClearSecondThreadLocalStorage() {
 | 
			
		||||
 | 
			
		||||
void SearchEngineData::InitializeOrClearThirdThreadLocalStorage() {
 | 
			
		||||
    if(!forwardHeap3.get()) {
 | 
			
		||||
        forwardHeap3.reset(new QueryHeap(nodeHelpDesk->getNumberOfNodes()));
 | 
			
		||||
        forwardHeap3.reset(new QueryHeap(nodeHelpDesk->GetNumberOfNodes()));
 | 
			
		||||
    } else {
 | 
			
		||||
        forwardHeap3->Clear();
 | 
			
		||||
    }
 | 
			
		||||
    if(!backwardHeap3.get()) {
 | 
			
		||||
        backwardHeap3.reset(new QueryHeap(nodeHelpDesk->getNumberOfNodes()));
 | 
			
		||||
        backwardHeap3.reset(new QueryHeap(nodeHelpDesk->GetNumberOfNodes()));
 | 
			
		||||
    } else {
 | 
			
		||||
        backwardHeap3->Clear();
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
@ -1,27 +1,34 @@
 | 
			
		||||
/*
 | 
			
		||||
    open source routing machine
 | 
			
		||||
    Copyright (C) Dennis Luxen, others 2010
 | 
			
		||||
 | 
			
		||||
This program is free software; you can redistribute it and/or modify
 | 
			
		||||
it under the terms of the GNU AFFERO General Public License as published by
 | 
			
		||||
the Free Software Foundation; either version 3 of the License, or
 | 
			
		||||
any later version.
 | 
			
		||||
Copyright (c) 2013, Project OSRM, Dennis Luxen, others
 | 
			
		||||
All rights reserved.
 | 
			
		||||
 | 
			
		||||
This program is distributed in the hope that it will be useful,
 | 
			
		||||
but WITHOUT ANY WARRANTY; without even the implied warranty of
 | 
			
		||||
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
 | 
			
		||||
GNU General Public License for more details.
 | 
			
		||||
Redistribution and use in source and binary forms, with or without modification,
 | 
			
		||||
are permitted provided that the following conditions are met:
 | 
			
		||||
 | 
			
		||||
You should have received a copy of the GNU Affero General Public License
 | 
			
		||||
along with this program; if not, write to the Free Software
 | 
			
		||||
Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA
 | 
			
		||||
or see http://www.gnu.org/licenses/agpl.txt.
 | 
			
		||||
 */
 | 
			
		||||
Redistributions of source code must retain the above copyright notice, this list
 | 
			
		||||
of conditions and the following disclaimer.
 | 
			
		||||
Redistributions in binary form must reproduce the above copyright notice, this
 | 
			
		||||
list of conditions and the following disclaimer in the documentation and/or
 | 
			
		||||
other materials provided with the distribution.
 | 
			
		||||
 | 
			
		||||
THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND
 | 
			
		||||
ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
 | 
			
		||||
WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
 | 
			
		||||
DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR
 | 
			
		||||
ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
 | 
			
		||||
(INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
 | 
			
		||||
LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON
 | 
			
		||||
ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
 | 
			
		||||
(INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
 | 
			
		||||
SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
 | 
			
		||||
 | 
			
		||||
*/
 | 
			
		||||
 | 
			
		||||
#include "BinaryHeap.h"
 | 
			
		||||
#include "QueryEdge.h"
 | 
			
		||||
#include "NodeInformationHelpDesk.h"
 | 
			
		||||
#include "StaticGraph.h"
 | 
			
		||||
#include "../Server/DataStructures/QueryObjectsStorage.h"
 | 
			
		||||
 | 
			
		||||
#include "../typedefs.h"
 | 
			
		||||
 | 
			
		||||
@ -41,10 +48,17 @@ typedef boost::thread_specific_ptr<QueryHeapType> SearchEngineHeapPtr;
 | 
			
		||||
struct SearchEngineData {
 | 
			
		||||
    typedef QueryGraph Graph;
 | 
			
		||||
    typedef QueryHeapType QueryHeap;
 | 
			
		||||
    SearchEngineData(QueryGraph * g, NodeInformationHelpDesk * nh, std::vector<std::string> & n) :graph(g), nodeHelpDesk(nh), names(n) {}
 | 
			
		||||
    SearchEngineData(QueryObjectsStorage * query_objects)
 | 
			
		||||
     :
 | 
			
		||||
        query_objects(query_objects),
 | 
			
		||||
        graph(query_objects->graph),
 | 
			
		||||
        nodeHelpDesk(query_objects->nodeHelpDesk)
 | 
			
		||||
    {}
 | 
			
		||||
 | 
			
		||||
    const QueryObjectsStorage       * query_objects;
 | 
			
		||||
    const QueryGraph                * graph;
 | 
			
		||||
    NodeInformationHelpDesk * nodeHelpDesk;
 | 
			
		||||
    std::vector<std::string> & names;
 | 
			
		||||
    const NodeInformationHelpDesk   * nodeHelpDesk;
 | 
			
		||||
 | 
			
		||||
    static SearchEngineHeapPtr forwardHeap;
 | 
			
		||||
    static SearchEngineHeapPtr backwardHeap;
 | 
			
		||||
    static SearchEngineHeapPtr forwardHeap2;
 | 
			
		||||
 | 
			
		||||
@ -1,26 +1,34 @@
 | 
			
		||||
/*
 | 
			
		||||
    open source routing machine
 | 
			
		||||
    Copyright (C) Dennis Luxen, others 2010
 | 
			
		||||
 | 
			
		||||
This program is free software; you can redistribute it and/or modify
 | 
			
		||||
it under the terms of the GNU AFFERO General Public License as published by
 | 
			
		||||
the Free Software Foundation; either version 3 of the License, or
 | 
			
		||||
any later version.
 | 
			
		||||
Copyright (c) 2013, Project OSRM, Dennis Luxen, others
 | 
			
		||||
All rights reserved.
 | 
			
		||||
 | 
			
		||||
This program is distributed in the hope that it will be useful,
 | 
			
		||||
but WITHOUT ANY WARRANTY; without even the implied warranty of
 | 
			
		||||
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
 | 
			
		||||
GNU General Public License for more details.
 | 
			
		||||
Redistribution and use in source and binary forms, with or without modification,
 | 
			
		||||
are permitted provided that the following conditions are met:
 | 
			
		||||
 | 
			
		||||
You should have received a copy of the GNU Affero General Public License
 | 
			
		||||
along with this program; if not, write to the Free Software
 | 
			
		||||
Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA
 | 
			
		||||
or see http://www.gnu.org/licenses/agpl.txt.
 | 
			
		||||
 */
 | 
			
		||||
Redistributions of source code must retain the above copyright notice, this list
 | 
			
		||||
of conditions and the following disclaimer.
 | 
			
		||||
Redistributions in binary form must reproduce the above copyright notice, this
 | 
			
		||||
list of conditions and the following disclaimer in the documentation and/or
 | 
			
		||||
other materials provided with the distribution.
 | 
			
		||||
 | 
			
		||||
THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND
 | 
			
		||||
ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
 | 
			
		||||
WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
 | 
			
		||||
DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR
 | 
			
		||||
ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
 | 
			
		||||
(INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
 | 
			
		||||
LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON
 | 
			
		||||
ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
 | 
			
		||||
(INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
 | 
			
		||||
SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
 | 
			
		||||
 | 
			
		||||
*/
 | 
			
		||||
 | 
			
		||||
#ifndef SEGMENTINFORMATION_H_
 | 
			
		||||
#define SEGMENTINFORMATION_H_
 | 
			
		||||
 | 
			
		||||
#include "Coordinate.h"
 | 
			
		||||
#include "TurnInstructions.h"
 | 
			
		||||
#include "../typedefs.h"
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
@ -1,22 +1,29 @@
 | 
			
		||||
/*
 | 
			
		||||
    open source routing machine
 | 
			
		||||
    Copyright (C) Dennis Luxen, others 2010
 | 
			
		||||
 | 
			
		||||
This program is free software; you can redistribute it and/or modify
 | 
			
		||||
it under the terms of the GNU AFFERO General Public License as published by
 | 
			
		||||
the Free Software Foundation; either version 3 of the License, or
 | 
			
		||||
any later version.
 | 
			
		||||
Copyright (c) 2013, Project OSRM, Dennis Luxen, others
 | 
			
		||||
All rights reserved.
 | 
			
		||||
 | 
			
		||||
This program is distributed in the hope that it will be useful,
 | 
			
		||||
but WITHOUT ANY WARRANTY; without even the implied warranty of
 | 
			
		||||
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
 | 
			
		||||
GNU General Public License for more details.
 | 
			
		||||
Redistribution and use in source and binary forms, with or without modification,
 | 
			
		||||
are permitted provided that the following conditions are met:
 | 
			
		||||
 | 
			
		||||
You should have received a copy of the GNU Affero General Public License
 | 
			
		||||
along with this program; if not, write to the Free Software
 | 
			
		||||
Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA
 | 
			
		||||
or see http://www.gnu.org/licenses/agpl.txt.
 | 
			
		||||
 */
 | 
			
		||||
Redistributions of source code must retain the above copyright notice, this list
 | 
			
		||||
of conditions and the following disclaimer.
 | 
			
		||||
Redistributions in binary form must reproduce the above copyright notice, this
 | 
			
		||||
list of conditions and the following disclaimer in the documentation and/or
 | 
			
		||||
other materials provided with the distribution.
 | 
			
		||||
 | 
			
		||||
THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND
 | 
			
		||||
ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
 | 
			
		||||
WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
 | 
			
		||||
DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR
 | 
			
		||||
ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
 | 
			
		||||
(INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
 | 
			
		||||
LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON
 | 
			
		||||
ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
 | 
			
		||||
(INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
 | 
			
		||||
SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
 | 
			
		||||
 | 
			
		||||
*/
 | 
			
		||||
 | 
			
		||||
#ifndef SIMPLESTACK_H_
 | 
			
		||||
#define SIMPLESTACK_H_
 | 
			
		||||
 | 
			
		||||
@ -1,26 +1,34 @@
 | 
			
		||||
/*
 | 
			
		||||
    open source routing machine
 | 
			
		||||
    Copyright (C) Dennis Luxen, others 2010
 | 
			
		||||
 | 
			
		||||
This program is free software; you can redistribute it and/or modify
 | 
			
		||||
it under the terms of the GNU AFFERO General Public License as published by
 | 
			
		||||
the Free Software Foundation; either version 3 of the License, or
 | 
			
		||||
any later version.
 | 
			
		||||
Copyright (c) 2013, Project OSRM, Dennis Luxen, others
 | 
			
		||||
All rights reserved.
 | 
			
		||||
 | 
			
		||||
This program is distributed in the hope that it will be useful,
 | 
			
		||||
but WITHOUT ANY WARRANTY; without even the implied warranty of
 | 
			
		||||
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
 | 
			
		||||
GNU General Public License for more details.
 | 
			
		||||
Redistribution and use in source and binary forms, with or without modification,
 | 
			
		||||
are permitted provided that the following conditions are met:
 | 
			
		||||
 | 
			
		||||
You should have received a copy of the GNU Affero General Public License
 | 
			
		||||
along with this program; if not, write to the Free Software
 | 
			
		||||
Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA
 | 
			
		||||
or see http://www.gnu.org/licenses/agpl.txt.
 | 
			
		||||
 */
 | 
			
		||||
Redistributions of source code must retain the above copyright notice, this list
 | 
			
		||||
of conditions and the following disclaimer.
 | 
			
		||||
Redistributions in binary form must reproduce the above copyright notice, this
 | 
			
		||||
list of conditions and the following disclaimer in the documentation and/or
 | 
			
		||||
other materials provided with the distribution.
 | 
			
		||||
 | 
			
		||||
THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND
 | 
			
		||||
ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
 | 
			
		||||
WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
 | 
			
		||||
DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR
 | 
			
		||||
ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
 | 
			
		||||
(INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
 | 
			
		||||
LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON
 | 
			
		||||
ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
 | 
			
		||||
(INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
 | 
			
		||||
SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
 | 
			
		||||
 | 
			
		||||
*/
 | 
			
		||||
 | 
			
		||||
#ifndef STATICGRAPH_H_INCLUDED
 | 
			
		||||
#define STATICGRAPH_H_INCLUDED
 | 
			
		||||
 | 
			
		||||
#include "../DataStructures/Percent.h"
 | 
			
		||||
#include "../Util/SimpleLogger.h"
 | 
			
		||||
#include "../typedefs.h"
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
@ -1,25 +1,32 @@
 | 
			
		||||
/*
 | 
			
		||||
    open source routing machine
 | 
			
		||||
    Copyright (C) Dennis Luxen, others 2010
 | 
			
		||||
 | 
			
		||||
This program is free software; you can redistribute it and/or modify
 | 
			
		||||
it under the terms of the GNU AFFERO General Public License as published by
 | 
			
		||||
the Free Software Foundation; either version 3 of the License, or
 | 
			
		||||
any later version.
 | 
			
		||||
Copyright (c) 2013, Project OSRM, Dennis Luxen, others
 | 
			
		||||
All rights reserved.
 | 
			
		||||
 | 
			
		||||
This program is distributed in the hope that it will be useful,
 | 
			
		||||
but WITHOUT ANY WARRANTY; without even the implied warranty of
 | 
			
		||||
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
 | 
			
		||||
GNU General Public License for more details.
 | 
			
		||||
Redistribution and use in source and binary forms, with or without modification,
 | 
			
		||||
are permitted provided that the following conditions are met:
 | 
			
		||||
 | 
			
		||||
You should have received a copy of the GNU Affero General Public License
 | 
			
		||||
along with this program; if not, write to the Free Software
 | 
			
		||||
Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA
 | 
			
		||||
or see http://www.gnu.org/licenses/agpl.txt.
 | 
			
		||||
Redistributions of source code must retain the above copyright notice, this list
 | 
			
		||||
of conditions and the following disclaimer.
 | 
			
		||||
Redistributions in binary form must reproduce the above copyright notice, this
 | 
			
		||||
list of conditions and the following disclaimer in the documentation and/or
 | 
			
		||||
other materials provided with the distribution.
 | 
			
		||||
 | 
			
		||||
KD Tree coded by Christian Vetter, Monav Project
 | 
			
		||||
THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND
 | 
			
		||||
ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
 | 
			
		||||
WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
 | 
			
		||||
DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR
 | 
			
		||||
ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
 | 
			
		||||
(INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
 | 
			
		||||
LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON
 | 
			
		||||
ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
 | 
			
		||||
(INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
 | 
			
		||||
SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
 | 
			
		||||
 | 
			
		||||
*/
 | 
			
		||||
 | 
			
		||||
// KD Tree coded by Christian Vetter, Monav Project
 | 
			
		||||
 | 
			
		||||
 */
 | 
			
		||||
#ifndef STATICKDTREE_H_INCLUDED
 | 
			
		||||
#define STATICKDTREE_H_INCLUDED
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
@ -1,22 +1,29 @@
 | 
			
		||||
/*
 | 
			
		||||
    open source routing machine
 | 
			
		||||
    Copyright (C) Dennis Luxen, others 2010
 | 
			
		||||
 | 
			
		||||
This program is free software; you can redistribute it and/or modify
 | 
			
		||||
it under the terms of the GNU AFFERO General Public License as published by
 | 
			
		||||
the Free Software Foundation; either version 3 of the License, or
 | 
			
		||||
any later version.
 | 
			
		||||
Copyright (c) 2013, Project OSRM, Dennis Luxen, others
 | 
			
		||||
All rights reserved.
 | 
			
		||||
 | 
			
		||||
This program is distributed in the hope that it will be useful,
 | 
			
		||||
but WITHOUT ANY WARRANTY; without even the implied warranty of
 | 
			
		||||
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
 | 
			
		||||
GNU General Public License for more details.
 | 
			
		||||
Redistribution and use in source and binary forms, with or without modification,
 | 
			
		||||
are permitted provided that the following conditions are met:
 | 
			
		||||
 | 
			
		||||
You should have received a copy of the GNU Affero General Public License
 | 
			
		||||
along with this program; if not, write to the Free Software
 | 
			
		||||
Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA
 | 
			
		||||
or see http://www.gnu.org/licenses/agpl.txt.
 | 
			
		||||
 */
 | 
			
		||||
Redistributions of source code must retain the above copyright notice, this list
 | 
			
		||||
of conditions and the following disclaimer.
 | 
			
		||||
Redistributions in binary form must reproduce the above copyright notice, this
 | 
			
		||||
list of conditions and the following disclaimer in the documentation and/or
 | 
			
		||||
other materials provided with the distribution.
 | 
			
		||||
 | 
			
		||||
THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND
 | 
			
		||||
ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
 | 
			
		||||
WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
 | 
			
		||||
DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR
 | 
			
		||||
ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
 | 
			
		||||
(INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
 | 
			
		||||
LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON
 | 
			
		||||
ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
 | 
			
		||||
(INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
 | 
			
		||||
SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
 | 
			
		||||
 | 
			
		||||
*/
 | 
			
		||||
 | 
			
		||||
#ifndef STATICRTREE_H_
 | 
			
		||||
#define STATICRTREE_H_
 | 
			
		||||
@ -42,11 +49,8 @@ or see http://www.gnu.org/licenses/agpl.txt.
 | 
			
		||||
#include <boost/noncopyable.hpp>
 | 
			
		||||
#include <boost/thread.hpp>
 | 
			
		||||
 | 
			
		||||
#include <cassert>
 | 
			
		||||
#include <cfloat>
 | 
			
		||||
#include <climits>
 | 
			
		||||
 | 
			
		||||
#include <algorithm>
 | 
			
		||||
#include <limits>
 | 
			
		||||
#include <queue>
 | 
			
		||||
#include <string>
 | 
			
		||||
#include <vector>
 | 
			
		||||
@ -129,7 +133,7 @@ private:
 | 
			
		||||
                return 0.0;
 | 
			
		||||
            }
 | 
			
		||||
 | 
			
		||||
            double min_dist = DBL_MAX;
 | 
			
		||||
            double min_dist = std::numeric_limits<double>::max();
 | 
			
		||||
            min_dist = std::min(
 | 
			
		||||
                    min_dist,
 | 
			
		||||
                    ApproximateDistance(
 | 
			
		||||
@ -170,7 +174,7 @@ private:
 | 
			
		||||
        }
 | 
			
		||||
 | 
			
		||||
        inline double GetMinMaxDist(const FixedPointCoordinate & location) const {
 | 
			
		||||
            double min_max_dist = DBL_MAX;
 | 
			
		||||
            double min_max_dist = std::numeric_limits<double>::max();
 | 
			
		||||
            //Get minmax distance to each of the four sides
 | 
			
		||||
            FixedPointCoordinate upper_left (max_lat, min_lon);
 | 
			
		||||
            FixedPointCoordinate upper_right(max_lat, max_lon);
 | 
			
		||||
@ -268,7 +272,7 @@ private:
 | 
			
		||||
            const uint32_t n_id,
 | 
			
		||||
            const double dist
 | 
			
		||||
        ) : node_id(n_id), min_dist(dist) {}
 | 
			
		||||
        QueryCandidate() : node_id(UINT_MAX), min_dist(DBL_MAX) {}
 | 
			
		||||
        QueryCandidate() : node_id(UINT_MAX), min_dist(std::numeric_limits<double>::max()) {}
 | 
			
		||||
        uint32_t node_id;
 | 
			
		||||
        double min_dist;
 | 
			
		||||
        inline bool operator<(const QueryCandidate & other) const {
 | 
			
		||||
@ -461,8 +465,8 @@ public:
 | 
			
		||||
        uint32_t io_count = 0;
 | 
			
		||||
        uint32_t explored_tree_nodes_count = 0;
 | 
			
		||||
        SimpleLogger().Write() << "searching for coordinate " << input_coordinate;
 | 
			
		||||
        double min_dist = DBL_MAX;
 | 
			
		||||
        double min_max_dist = DBL_MAX;
 | 
			
		||||
        double min_dist = std::numeric_limits<double>::max();
 | 
			
		||||
        double min_max_dist = std::numeric_limits<double>::max();
 | 
			
		||||
        bool found_a_nearest_edge = false;
 | 
			
		||||
 | 
			
		||||
        FixedPointCoordinate nearest, current_start_coordinate, current_end_coordinate;
 | 
			
		||||
@ -470,7 +474,7 @@ public:
 | 
			
		||||
        //initialize queue with root element
 | 
			
		||||
        std::priority_queue<QueryCandidate> traversal_queue;
 | 
			
		||||
        traversal_queue.push(QueryCandidate(0, m_search_tree[0].minimum_bounding_rectangle.GetMinDist(input_coordinate)));
 | 
			
		||||
        BOOST_ASSERT_MSG(FLT_EPSILON > (0. - traversal_queue.top().min_dist), "Root element in NN Search has min dist != 0.");
 | 
			
		||||
        BOOST_ASSERT_MSG(std::numberic_limits<double>::epsilon() > (0. - traversal_queue.top().min_dist), "Root element in NN Search has min dist != 0.");
 | 
			
		||||
 | 
			
		||||
        while(!traversal_queue.empty()) {
 | 
			
		||||
            const QueryCandidate current_query_node = traversal_queue.top(); traversal_queue.pop();
 | 
			
		||||
@ -595,6 +599,113 @@ public:
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
  */
 | 
			
		||||
    bool LocateClosestEndPointForCoordinate(
 | 
			
		||||
            const FixedPointCoordinate & input_coordinate,
 | 
			
		||||
            FixedPointCoordinate & result_coordinate,
 | 
			
		||||
            const unsigned zoom_level
 | 
			
		||||
    ) {
 | 
			
		||||
        bool ignore_tiny_components = (zoom_level <= 14);
 | 
			
		||||
        DataT nearest_edge;
 | 
			
		||||
        double min_dist = std::numeric_limits<double>::max();
 | 
			
		||||
        double min_max_dist = std::numeric_limits<double>::max();
 | 
			
		||||
        bool found_a_nearest_edge = false;
 | 
			
		||||
 | 
			
		||||
        //initialize queue with root element
 | 
			
		||||
        std::priority_queue<QueryCandidate> traversal_queue;
 | 
			
		||||
        double current_min_dist = m_search_tree[0].minimum_bounding_rectangle.GetMinDist(input_coordinate);
 | 
			
		||||
        traversal_queue.push(
 | 
			
		||||
            QueryCandidate(0, current_min_dist)
 | 
			
		||||
        );
 | 
			
		||||
 | 
			
		||||
        BOOST_ASSERT_MSG(
 | 
			
		||||
            std::numeric_limits<double>::epsilon() > (0. - traversal_queue.top().min_dist),
 | 
			
		||||
            "Root element in NN Search has min dist != 0."
 | 
			
		||||
        );
 | 
			
		||||
 | 
			
		||||
        while(!traversal_queue.empty()) {
 | 
			
		||||
            const QueryCandidate current_query_node = traversal_queue.top();
 | 
			
		||||
            traversal_queue.pop();
 | 
			
		||||
 | 
			
		||||
            const bool prune_downward = (current_query_node.min_dist >= min_max_dist);
 | 
			
		||||
            const bool prune_upward = (current_query_node.min_dist >= min_dist);
 | 
			
		||||
            if( !prune_downward && !prune_upward ) { //downward pruning
 | 
			
		||||
                TreeNode & current_tree_node = m_search_tree[current_query_node.node_id];
 | 
			
		||||
                if (current_tree_node.child_is_on_disk) {
 | 
			
		||||
                    LeafNode current_leaf_node;
 | 
			
		||||
                    LoadLeafFromDisk(
 | 
			
		||||
                        current_tree_node.children[0],
 | 
			
		||||
                        current_leaf_node
 | 
			
		||||
                    );
 | 
			
		||||
                    for(uint32_t i = 0; i < current_leaf_node.object_count; ++i) {
 | 
			
		||||
                        const DataT & current_edge = current_leaf_node.objects[i];
 | 
			
		||||
                        if(
 | 
			
		||||
                            ignore_tiny_components &&
 | 
			
		||||
                            current_edge.belongsToTinyComponent
 | 
			
		||||
                        ) {
 | 
			
		||||
                            continue;
 | 
			
		||||
                        }
 | 
			
		||||
                        if(current_edge.isIgnored()) {
 | 
			
		||||
                            continue;
 | 
			
		||||
                        }
 | 
			
		||||
 | 
			
		||||
                        double current_minimum_distance = ApproximateDistance(
 | 
			
		||||
                                input_coordinate.lat,
 | 
			
		||||
                                input_coordinate.lon,
 | 
			
		||||
                                current_edge.lat1,
 | 
			
		||||
                                current_edge.lon1
 | 
			
		||||
                            );
 | 
			
		||||
                        if( current_minimum_distance < min_dist ) {
 | 
			
		||||
                            //found a new minimum
 | 
			
		||||
                            min_dist = current_minimum_distance;
 | 
			
		||||
                            result_coordinate.lat = current_edge.lat1;
 | 
			
		||||
                            result_coordinate.lon = current_edge.lon1;
 | 
			
		||||
                            found_a_nearest_edge = true;
 | 
			
		||||
                        }
 | 
			
		||||
 | 
			
		||||
                        current_minimum_distance = ApproximateDistance(
 | 
			
		||||
                                input_coordinate.lat,
 | 
			
		||||
                                input_coordinate.lon,
 | 
			
		||||
                                current_edge.lat2,
 | 
			
		||||
                                current_edge.lon2
 | 
			
		||||
                            );
 | 
			
		||||
 | 
			
		||||
                        if( current_minimum_distance < min_dist ) {
 | 
			
		||||
                            //found a new minimum
 | 
			
		||||
                            min_dist = current_minimum_distance;
 | 
			
		||||
                            result_coordinate.lat = current_edge.lat2;
 | 
			
		||||
                            result_coordinate.lon = current_edge.lon2;
 | 
			
		||||
                            found_a_nearest_edge = true;
 | 
			
		||||
                        }
 | 
			
		||||
                    }
 | 
			
		||||
                } else {
 | 
			
		||||
                    //traverse children, prune if global mindist is smaller than local one
 | 
			
		||||
                    for (uint32_t i = 0; i < current_tree_node.child_count; ++i) {
 | 
			
		||||
                        const int32_t child_id = current_tree_node.children[i];
 | 
			
		||||
                        const TreeNode & child_tree_node = m_search_tree[child_id];
 | 
			
		||||
                        const RectangleT & child_rectangle = child_tree_node.minimum_bounding_rectangle;
 | 
			
		||||
                        const double current_min_dist = child_rectangle.GetMinDist(input_coordinate);
 | 
			
		||||
                        const double current_min_max_dist = child_rectangle.GetMinMaxDist(input_coordinate);
 | 
			
		||||
                        if( current_min_max_dist < min_max_dist ) {
 | 
			
		||||
                            min_max_dist = current_min_max_dist;
 | 
			
		||||
                        }
 | 
			
		||||
                        if (current_min_dist > min_max_dist) {
 | 
			
		||||
                            continue;
 | 
			
		||||
                        }
 | 
			
		||||
                        if (current_min_dist > min_dist) { //upward pruning
 | 
			
		||||
                            continue;
 | 
			
		||||
                        }
 | 
			
		||||
                        traversal_queue.push(
 | 
			
		||||
                            QueryCandidate(child_id, current_min_dist)
 | 
			
		||||
                        );
 | 
			
		||||
                    }
 | 
			
		||||
                }
 | 
			
		||||
            }
 | 
			
		||||
        }
 | 
			
		||||
 | 
			
		||||
        return found_a_nearest_edge;
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
    bool FindPhantomNodeForCoordinate(
 | 
			
		||||
            const FixedPointCoordinate & input_coordinate,
 | 
			
		||||
            PhantomNode & result_phantom_node,
 | 
			
		||||
@ -607,8 +718,8 @@ public:
 | 
			
		||||
        uint32_t io_count = 0;
 | 
			
		||||
        uint32_t explored_tree_nodes_count = 0;
 | 
			
		||||
        //SimpleLogger().Write() << "searching for coordinate " << input_coordinate;
 | 
			
		||||
        double min_dist = DBL_MAX;
 | 
			
		||||
        double min_max_dist = DBL_MAX;
 | 
			
		||||
        double min_dist = std::numeric_limits<double>::max();
 | 
			
		||||
        double min_max_dist = std::numeric_limits<double>::max();
 | 
			
		||||
        bool found_a_nearest_edge = false;
 | 
			
		||||
 | 
			
		||||
        FixedPointCoordinate nearest, current_start_coordinate, current_end_coordinate;
 | 
			
		||||
@ -621,7 +732,7 @@ public:
 | 
			
		||||
        );
 | 
			
		||||
 | 
			
		||||
        BOOST_ASSERT_MSG(
 | 
			
		||||
                         FLT_EPSILON > (0. - traversal_queue.top().min_dist),
 | 
			
		||||
            std::numeric_limits<double>::epsilon() > (0. - traversal_queue.top().min_dist),
 | 
			
		||||
            "Root element in NN Search has min dist != 0."
 | 
			
		||||
        );
 | 
			
		||||
 | 
			
		||||
@ -637,7 +748,6 @@ public:
 | 
			
		||||
                    LeafNode current_leaf_node;
 | 
			
		||||
                    LoadLeafFromDisk(current_tree_node.children[0], current_leaf_node);
 | 
			
		||||
                    ++io_count;
 | 
			
		||||
                    //SimpleLogger().Write() << "checking " << current_leaf_node.object_count << " elements";
 | 
			
		||||
                    for(uint32_t i = 0; i < current_leaf_node.object_count; ++i) {
 | 
			
		||||
                        DataT & current_edge = current_leaf_node.objects[i];
 | 
			
		||||
                        if(ignore_tiny_components && current_edge.belongsToTinyComponent) {
 | 
			
		||||
@ -691,16 +801,14 @@ public:
 | 
			
		||||
                                current_end_coordinate
 | 
			
		||||
                            )
 | 
			
		||||
                        ) {
 | 
			
		||||
 | 
			
		||||
                            BOOST_ASSERT_MSG(current_edge.id != result_phantom_node.edgeBasedNode, "IDs not different");
 | 
			
		||||
                            //SimpleLogger().Write() << "found bidirected edge on nodes " << current_edge.id << " and " << result_phantom_node.edgeBasedNode;
 | 
			
		||||
                            result_phantom_node.weight2 = current_edge.weight;
 | 
			
		||||
                            if(current_edge.id < result_phantom_node.edgeBasedNode) {
 | 
			
		||||
                                result_phantom_node.edgeBasedNode = current_edge.id;
 | 
			
		||||
                                std::swap(result_phantom_node.weight1, result_phantom_node.weight2);
 | 
			
		||||
                                std::swap(current_end_coordinate, current_start_coordinate);
 | 
			
		||||
                            //    SimpleLogger().Write() <<"case 2";
 | 
			
		||||
                            }
 | 
			
		||||
                            //SimpleLogger().Write() << "w1: " << result_phantom_node.weight1 << ", w2: " << result_phantom_node.weight2;
 | 
			
		||||
                        }
 | 
			
		||||
                    }
 | 
			
		||||
                } else {
 | 
			
		||||
@ -748,9 +856,13 @@ public:
 | 
			
		||||
        return found_a_nearest_edge;
 | 
			
		||||
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
private:
 | 
			
		||||
    inline void LoadLeafFromDisk(const uint32_t leaf_id, LeafNode& result_node) {
 | 
			
		||||
        if(!thread_local_rtree_stream.get() || !thread_local_rtree_stream->is_open()) {
 | 
			
		||||
        if(
 | 
			
		||||
            !thread_local_rtree_stream.get() ||
 | 
			
		||||
            !thread_local_rtree_stream->is_open()
 | 
			
		||||
        ) {
 | 
			
		||||
            thread_local_rtree_stream.reset(
 | 
			
		||||
                new boost::filesystem::ifstream(
 | 
			
		||||
                        m_leaf_node_filename,
 | 
			
		||||
@ -772,14 +884,14 @@ private:
 | 
			
		||||
            const FixedPointCoordinate& source,
 | 
			
		||||
            const FixedPointCoordinate& target,
 | 
			
		||||
            FixedPointCoordinate& nearest, double *r) const {
 | 
			
		||||
        const double x = static_cast<double>(inputPoint.lat);
 | 
			
		||||
        const double y = static_cast<double>(inputPoint.lon);
 | 
			
		||||
        const double a = static_cast<double>(source.lat);
 | 
			
		||||
        const double b = static_cast<double>(source.lon);
 | 
			
		||||
        const double c = static_cast<double>(target.lat);
 | 
			
		||||
        const double d = static_cast<double>(target.lon);
 | 
			
		||||
        const double x = inputPoint.lat/COORDINATE_PRECISION;
 | 
			
		||||
        const double y = inputPoint.lon/COORDINATE_PRECISION;
 | 
			
		||||
        const double a = source.lat/COORDINATE_PRECISION;
 | 
			
		||||
        const double b = source.lon/COORDINATE_PRECISION;
 | 
			
		||||
        const double c = target.lat/COORDINATE_PRECISION;
 | 
			
		||||
        const double d = target.lon/COORDINATE_PRECISION;
 | 
			
		||||
        double p,q,mX,nY;
 | 
			
		||||
        if(fabs(a-c) > FLT_EPSILON){
 | 
			
		||||
        if(std::fabs(a-c) > std::numeric_limits<double>::epsilon() ){
 | 
			
		||||
            const double m = (d-b)/(c-a); // slope
 | 
			
		||||
            // Projection of (x,y) on line joining (a,b) and (c,d)
 | 
			
		||||
            p = ((x + (m*y)) + (m*m*a - m*b))/(1. + m*m);
 | 
			
		||||
@ -809,8 +921,8 @@ private:
 | 
			
		||||
//            return std::sqrt(((d - y)*(d - y) + (c - x)*(c - x)));
 | 
			
		||||
        }
 | 
			
		||||
        // point lies in between
 | 
			
		||||
        nearest.lat = p;
 | 
			
		||||
        nearest.lon = q;
 | 
			
		||||
        nearest.lat = p*COORDINATE_PRECISION;
 | 
			
		||||
        nearest.lon = q*COORDINATE_PRECISION;
 | 
			
		||||
//        return std::sqrt((p-x)*(p-x) + (q-y)*(q-y));
 | 
			
		||||
        return (p-x)*(p-x) + (q-y)*(q-y);
 | 
			
		||||
    }
 | 
			
		||||
@ -820,7 +932,7 @@ private:
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    inline bool DoubleEpsilonCompare(const double d1, const double d2) const {
 | 
			
		||||
        return (std::fabs(d1 - d2) < FLT_EPSILON);
 | 
			
		||||
        return (std::fabs(d1 - d2) < std::numeric_limits<double>::epsilon() );
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
};
 | 
			
		||||
 | 
			
		||||
@ -1,22 +1,29 @@
 | 
			
		||||
/*
 | 
			
		||||
 open source routing machine
 | 
			
		||||
 Copyright (C) Dennis Luxen, others 2010
 | 
			
		||||
 | 
			
		||||
 This program is free software; you can redistribute it and/or modify
 | 
			
		||||
 it under the terms of the GNU AFFERO General Public License as published by
 | 
			
		||||
 the Free Software Foundation; either version 3 of the License, or
 | 
			
		||||
 any later version.
 | 
			
		||||
Copyright (c) 2013, Project OSRM, Dennis Luxen, others
 | 
			
		||||
All rights reserved.
 | 
			
		||||
 | 
			
		||||
 This program is distributed in the hope that it will be useful,
 | 
			
		||||
 but WITHOUT ANY WARRANTY; without even the implied warranty of
 | 
			
		||||
 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
 | 
			
		||||
 GNU General Public License for more details.
 | 
			
		||||
Redistribution and use in source and binary forms, with or without modification,
 | 
			
		||||
are permitted provided that the following conditions are met:
 | 
			
		||||
 | 
			
		||||
 You should have received a copy of the GNU Affero General Public License
 | 
			
		||||
 along with this program; if not, write to the Free Software
 | 
			
		||||
 Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA
 | 
			
		||||
 or see http://www.gnu.org/licenses/agpl.txt.
 | 
			
		||||
 */
 | 
			
		||||
Redistributions of source code must retain the above copyright notice, this list
 | 
			
		||||
of conditions and the following disclaimer.
 | 
			
		||||
Redistributions in binary form must reproduce the above copyright notice, this
 | 
			
		||||
list of conditions and the following disclaimer in the documentation and/or
 | 
			
		||||
other materials provided with the distribution.
 | 
			
		||||
 | 
			
		||||
THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND
 | 
			
		||||
ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
 | 
			
		||||
WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
 | 
			
		||||
DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR
 | 
			
		||||
ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
 | 
			
		||||
(INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
 | 
			
		||||
LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON
 | 
			
		||||
ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
 | 
			
		||||
(INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
 | 
			
		||||
SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
 | 
			
		||||
 | 
			
		||||
*/
 | 
			
		||||
 | 
			
		||||
#ifndef TURNINSTRUCTIONS_H_
 | 
			
		||||
#define TURNINSTRUCTIONS_H_
 | 
			
		||||
 | 
			
		||||
@ -1,22 +1,29 @@
 | 
			
		||||
/*
 | 
			
		||||
    open source routing machine
 | 
			
		||||
    Copyright (C) Dennis Luxen, others 2010
 | 
			
		||||
 | 
			
		||||
This program is free software; you can redistribute it and/or modify
 | 
			
		||||
it under the terms of the GNU AFFERO General Public License as published by
 | 
			
		||||
the Free Software Foundation; either version 3 of the License, or
 | 
			
		||||
any later version.
 | 
			
		||||
Copyright (c) 2013, Project OSRM, Dennis Luxen, others
 | 
			
		||||
All rights reserved.
 | 
			
		||||
 | 
			
		||||
This program is distributed in the hope that it will be useful,
 | 
			
		||||
but WITHOUT ANY WARRANTY; without even the implied warranty of
 | 
			
		||||
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
 | 
			
		||||
GNU General Public License for more details.
 | 
			
		||||
Redistribution and use in source and binary forms, with or without modification,
 | 
			
		||||
are permitted provided that the following conditions are met:
 | 
			
		||||
 | 
			
		||||
You should have received a copy of the GNU Affero General Public License
 | 
			
		||||
along with this program; if not, write to the Free Software
 | 
			
		||||
Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA
 | 
			
		||||
or see http://www.gnu.org/licenses/agpl.txt.
 | 
			
		||||
 */
 | 
			
		||||
Redistributions of source code must retain the above copyright notice, this list
 | 
			
		||||
of conditions and the following disclaimer.
 | 
			
		||||
Redistributions in binary form must reproduce the above copyright notice, this
 | 
			
		||||
list of conditions and the following disclaimer in the documentation and/or
 | 
			
		||||
other materials provided with the distribution.
 | 
			
		||||
 | 
			
		||||
THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND
 | 
			
		||||
ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
 | 
			
		||||
WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
 | 
			
		||||
DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR
 | 
			
		||||
ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
 | 
			
		||||
(INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
 | 
			
		||||
LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON
 | 
			
		||||
ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
 | 
			
		||||
(INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
 | 
			
		||||
SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
 | 
			
		||||
 | 
			
		||||
*/
 | 
			
		||||
 | 
			
		||||
#ifndef FASTXORHASH_H_
 | 
			
		||||
#define FASTXORHASH_H_
 | 
			
		||||
 | 
			
		||||
@ -1,22 +1,29 @@
 | 
			
		||||
/*
 | 
			
		||||
    open source routing machine
 | 
			
		||||
    Copyright (C) Dennis Luxen, others 2010
 | 
			
		||||
 | 
			
		||||
This program is free software; you can redistribute it and/or modify
 | 
			
		||||
it under the terms of the GNU AFFERO General Public License as published by
 | 
			
		||||
the Free Software Foundation; either version 3 of the License, or
 | 
			
		||||
any later version.
 | 
			
		||||
Copyright (c) 2013, Project OSRM, Dennis Luxen, others
 | 
			
		||||
All rights reserved.
 | 
			
		||||
 | 
			
		||||
This program is distributed in the hope that it will be useful,
 | 
			
		||||
but WITHOUT ANY WARRANTY; without even the implied warranty of
 | 
			
		||||
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
 | 
			
		||||
GNU General Public License for more details.
 | 
			
		||||
Redistribution and use in source and binary forms, with or without modification,
 | 
			
		||||
are permitted provided that the following conditions are met:
 | 
			
		||||
 | 
			
		||||
You should have received a copy of the GNU Affero General Public License
 | 
			
		||||
along with this program; if not, write to the Free Software
 | 
			
		||||
Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA
 | 
			
		||||
or see http://www.gnu.org/licenses/agpl.txt.
 | 
			
		||||
 */
 | 
			
		||||
Redistributions of source code must retain the above copyright notice, this list
 | 
			
		||||
of conditions and the following disclaimer.
 | 
			
		||||
Redistributions in binary form must reproduce the above copyright notice, this
 | 
			
		||||
list of conditions and the following disclaimer in the documentation and/or
 | 
			
		||||
other materials provided with the distribution.
 | 
			
		||||
 | 
			
		||||
THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND
 | 
			
		||||
ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
 | 
			
		||||
WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
 | 
			
		||||
DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR
 | 
			
		||||
ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
 | 
			
		||||
(INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
 | 
			
		||||
LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON
 | 
			
		||||
ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
 | 
			
		||||
(INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
 | 
			
		||||
SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
 | 
			
		||||
 | 
			
		||||
*/
 | 
			
		||||
 | 
			
		||||
#ifndef XORFASTHASHSTORAGE_H_
 | 
			
		||||
#define XORFASTHASHSTORAGE_H_
 | 
			
		||||
 | 
			
		||||
@ -1,22 +1,29 @@
 | 
			
		||||
/*
 | 
			
		||||
    open source routing machine
 | 
			
		||||
    Copyright (C) Dennis Luxen, 2010
 | 
			
		||||
 | 
			
		||||
This program is free software; you can redistribute it and/or modify
 | 
			
		||||
it under the terms of the GNU AFFERO General Public License as published by
 | 
			
		||||
the Free Software Foundation; either version 3 of the License, or
 | 
			
		||||
any later version.
 | 
			
		||||
Copyright (c) 2013, Project OSRM, Dennis Luxen, others
 | 
			
		||||
All rights reserved.
 | 
			
		||||
 | 
			
		||||
This program is distributed in the hope that it will be useful,
 | 
			
		||||
but WITHOUT ANY WARRANTY; without even the implied warranty of
 | 
			
		||||
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
 | 
			
		||||
GNU General Public License for more details.
 | 
			
		||||
Redistribution and use in source and binary forms, with or without modification,
 | 
			
		||||
are permitted provided that the following conditions are met:
 | 
			
		||||
 | 
			
		||||
You should have received a copy of the GNU Affero General Public License
 | 
			
		||||
along with this program; if not, write to the Free Software
 | 
			
		||||
Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA
 | 
			
		||||
or see http://www.gnu.org/licenses/agpl.txt.
 | 
			
		||||
 */
 | 
			
		||||
Redistributions of source code must retain the above copyright notice, this list
 | 
			
		||||
of conditions and the following disclaimer.
 | 
			
		||||
Redistributions in binary form must reproduce the above copyright notice, this
 | 
			
		||||
list of conditions and the following disclaimer in the documentation and/or
 | 
			
		||||
other materials provided with the distribution.
 | 
			
		||||
 | 
			
		||||
THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND
 | 
			
		||||
ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
 | 
			
		||||
WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
 | 
			
		||||
DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR
 | 
			
		||||
ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
 | 
			
		||||
(INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
 | 
			
		||||
LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON
 | 
			
		||||
ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
 | 
			
		||||
(INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
 | 
			
		||||
SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
 | 
			
		||||
 | 
			
		||||
*/
 | 
			
		||||
 | 
			
		||||
#ifndef BASE_DESCRIPTOR_H_
 | 
			
		||||
#define BASE_DESCRIPTOR_H_
 | 
			
		||||
 | 
			
		||||
@ -1,22 +1,29 @@
 | 
			
		||||
/*
 | 
			
		||||
 open source routing machine
 | 
			
		||||
 Copyright (C) Dennis Luxen, others 2010
 | 
			
		||||
 | 
			
		||||
 This program is free software; you can redistribute it and/or modify
 | 
			
		||||
 it under the terms of the GNU AFFERO General Public License as published by
 | 
			
		||||
 the Free Software Foundation; either version 3 of the License, or
 | 
			
		||||
 any later version.
 | 
			
		||||
Copyright (c) 2013, Project OSRM, Dennis Luxen, others
 | 
			
		||||
All rights reserved.
 | 
			
		||||
 | 
			
		||||
 This program is distributed in the hope that it will be useful,
 | 
			
		||||
 but WITHOUT ANY WARRANTY; without even the implied warranty of
 | 
			
		||||
 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
 | 
			
		||||
 GNU General Public License for more details.
 | 
			
		||||
Redistribution and use in source and binary forms, with or without modification,
 | 
			
		||||
are permitted provided that the following conditions are met:
 | 
			
		||||
 | 
			
		||||
 You should have received a copy of the GNU Affero General Public License
 | 
			
		||||
 along with this program; if not, write to the Free Software
 | 
			
		||||
 Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA
 | 
			
		||||
 or see http://www.gnu.org/licenses/agpl.txt.
 | 
			
		||||
 */
 | 
			
		||||
Redistributions of source code must retain the above copyright notice, this list
 | 
			
		||||
of conditions and the following disclaimer.
 | 
			
		||||
Redistributions in binary form must reproduce the above copyright notice, this
 | 
			
		||||
list of conditions and the following disclaimer in the documentation and/or
 | 
			
		||||
other materials provided with the distribution.
 | 
			
		||||
 | 
			
		||||
THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND
 | 
			
		||||
ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
 | 
			
		||||
WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
 | 
			
		||||
DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR
 | 
			
		||||
ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
 | 
			
		||||
(INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
 | 
			
		||||
LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON
 | 
			
		||||
ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
 | 
			
		||||
(INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
 | 
			
		||||
SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
 | 
			
		||||
 | 
			
		||||
*/
 | 
			
		||||
 | 
			
		||||
#include "DescriptionFactory.h"
 | 
			
		||||
 | 
			
		||||
@ -166,7 +173,7 @@ void DescriptionFactory::Run(const SearchEngine &sEngine, const unsigned zoomLev
 | 
			
		||||
    //    SimpleLogger().Write() << "#segs: " << pathDescription.size();
 | 
			
		||||
 | 
			
		||||
    //Post-processing to remove empty or nearly empty path segments
 | 
			
		||||
    if(FLT_EPSILON > pathDescription.back().length) {
 | 
			
		||||
    if(std::numeric_limits<double>::epsilon() > pathDescription.back().length) {
 | 
			
		||||
        //        SimpleLogger().Write() << "#segs: " << pathDescription.size() << ", last ratio: " << targetPhantom.ratio << ", length: " << pathDescription.back().length;
 | 
			
		||||
        if(pathDescription.size() > 2){
 | 
			
		||||
            pathDescription.pop_back();
 | 
			
		||||
@ -178,7 +185,7 @@ void DescriptionFactory::Run(const SearchEngine &sEngine, const unsigned zoomLev
 | 
			
		||||
    } else {
 | 
			
		||||
        pathDescription[indexOfSegmentBegin].duration *= (1.-targetPhantom.ratio);
 | 
			
		||||
    }
 | 
			
		||||
    if(FLT_EPSILON > pathDescription[0].length) {
 | 
			
		||||
    if(std::numeric_limits<double>::epsilon() > pathDescription[0].length) {
 | 
			
		||||
        //TODO: this is never called actually?
 | 
			
		||||
        if(pathDescription.size() > 2) {
 | 
			
		||||
            pathDescription.erase(pathDescription.begin());
 | 
			
		||||
 | 
			
		||||
@ -1,22 +1,29 @@
 | 
			
		||||
/*
 | 
			
		||||
 open source routing machine
 | 
			
		||||
 Copyright (C) Dennis Luxen, others 2010
 | 
			
		||||
 | 
			
		||||
 This program is free software; you can redistribute it and/or modify
 | 
			
		||||
 it under the terms of the GNU AFFERO General Public License as published by
 | 
			
		||||
 the Free Software Foundation; either version 3 of the License, or
 | 
			
		||||
 any later version.
 | 
			
		||||
Copyright (c) 2013, Project OSRM, Dennis Luxen, others
 | 
			
		||||
All rights reserved.
 | 
			
		||||
 | 
			
		||||
 This program is distributed in the hope that it will be useful,
 | 
			
		||||
 but WITHOUT ANY WARRANTY; without even the implied warranty of
 | 
			
		||||
 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
 | 
			
		||||
 GNU General Public License for more details.
 | 
			
		||||
Redistribution and use in source and binary forms, with or without modification,
 | 
			
		||||
are permitted provided that the following conditions are met:
 | 
			
		||||
 | 
			
		||||
 You should have received a copy of the GNU Affero General Public License
 | 
			
		||||
 along with this program; if not, write to the Free Software
 | 
			
		||||
 Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA
 | 
			
		||||
 or see http://www.gnu.org/licenses/agpl.txt.
 | 
			
		||||
 */
 | 
			
		||||
Redistributions of source code must retain the above copyright notice, this list
 | 
			
		||||
of conditions and the following disclaimer.
 | 
			
		||||
Redistributions in binary form must reproduce the above copyright notice, this
 | 
			
		||||
list of conditions and the following disclaimer in the documentation and/or
 | 
			
		||||
other materials provided with the distribution.
 | 
			
		||||
 | 
			
		||||
THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND
 | 
			
		||||
ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
 | 
			
		||||
WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
 | 
			
		||||
DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR
 | 
			
		||||
ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
 | 
			
		||||
(INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
 | 
			
		||||
LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON
 | 
			
		||||
ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
 | 
			
		||||
(INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
 | 
			
		||||
SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
 | 
			
		||||
 | 
			
		||||
*/
 | 
			
		||||
 | 
			
		||||
#ifndef DESCRIPTIONFACTORY_H_
 | 
			
		||||
#define DESCRIPTIONFACTORY_H_
 | 
			
		||||
@ -30,6 +37,7 @@
 | 
			
		||||
#include "../Util/SimpleLogger.h"
 | 
			
		||||
#include "../typedefs.h"
 | 
			
		||||
 | 
			
		||||
#include <limits>
 | 
			
		||||
#include <vector>
 | 
			
		||||
 | 
			
		||||
/* This class is fed with all way segments in consecutive order
 | 
			
		||||
 | 
			
		||||
@ -1,22 +1,29 @@
 | 
			
		||||
/*
 | 
			
		||||
    open source routing machine
 | 
			
		||||
    Copyright (C) Dennis Luxen, others 2010
 | 
			
		||||
 | 
			
		||||
This program is free software; you can redistribute it and/or modify
 | 
			
		||||
it under the terms of the GNU AFFERO General Public License as published by
 | 
			
		||||
the Free Software Foundation; either version 3 of the License, or
 | 
			
		||||
any later version.
 | 
			
		||||
Copyright (c) 2013, Project OSRM, Dennis Luxen, others
 | 
			
		||||
All rights reserved.
 | 
			
		||||
 | 
			
		||||
This program is distributed in the hope that it will be useful,
 | 
			
		||||
but WITHOUT ANY WARRANTY; without even the implied warranty of
 | 
			
		||||
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
 | 
			
		||||
GNU General Public License for more details.
 | 
			
		||||
Redistribution and use in source and binary forms, with or without modification,
 | 
			
		||||
are permitted provided that the following conditions are met:
 | 
			
		||||
 | 
			
		||||
You should have received a copy of the GNU Affero General Public License
 | 
			
		||||
along with this program; if not, write to the Free Software
 | 
			
		||||
Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA
 | 
			
		||||
or see http://www.gnu.org/licenses/agpl.txt.
 | 
			
		||||
 */
 | 
			
		||||
Redistributions of source code must retain the above copyright notice, this list
 | 
			
		||||
of conditions and the following disclaimer.
 | 
			
		||||
Redistributions in binary form must reproduce the above copyright notice, this
 | 
			
		||||
list of conditions and the following disclaimer in the documentation and/or
 | 
			
		||||
other materials provided with the distribution.
 | 
			
		||||
 | 
			
		||||
THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND
 | 
			
		||||
ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
 | 
			
		||||
WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
 | 
			
		||||
DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR
 | 
			
		||||
ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
 | 
			
		||||
(INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
 | 
			
		||||
LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON
 | 
			
		||||
ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
 | 
			
		||||
(INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
 | 
			
		||||
SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
 | 
			
		||||
 | 
			
		||||
*/
 | 
			
		||||
 | 
			
		||||
#ifndef GPX_DESCRIPTOR_H_
 | 
			
		||||
#define GPX_DESCRIPTOR_H_
 | 
			
		||||
 | 
			
		||||
@ -1,22 +1,29 @@
 | 
			
		||||
/*
 | 
			
		||||
    open source routing machine
 | 
			
		||||
    Copyright (C) Dennis Luxen, others 2010
 | 
			
		||||
 | 
			
		||||
This program is free software; you can redistribute it and/or modify
 | 
			
		||||
it under the terms of the GNU AFFERO General Public License as published by
 | 
			
		||||
the Free Software Foundation; either version 3 of the License, or
 | 
			
		||||
any later version.
 | 
			
		||||
Copyright (c) 2013, Project OSRM, Dennis Luxen, others
 | 
			
		||||
All rights reserved.
 | 
			
		||||
 | 
			
		||||
This program is distributed in the hope that it will be useful,
 | 
			
		||||
but WITHOUT ANY WARRANTY; without even the implied warranty of
 | 
			
		||||
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
 | 
			
		||||
GNU General Public License for more details.
 | 
			
		||||
Redistribution and use in source and binary forms, with or without modification,
 | 
			
		||||
are permitted provided that the following conditions are met:
 | 
			
		||||
 | 
			
		||||
You should have received a copy of the GNU Affero General Public License
 | 
			
		||||
along with this program; if not, write to the Free Software
 | 
			
		||||
Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA
 | 
			
		||||
or see http://www.gnu.org/licenses/agpl.txt.
 | 
			
		||||
 */
 | 
			
		||||
Redistributions of source code must retain the above copyright notice, this list
 | 
			
		||||
of conditions and the following disclaimer.
 | 
			
		||||
Redistributions in binary form must reproduce the above copyright notice, this
 | 
			
		||||
list of conditions and the following disclaimer in the documentation and/or
 | 
			
		||||
other materials provided with the distribution.
 | 
			
		||||
 | 
			
		||||
THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND
 | 
			
		||||
ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
 | 
			
		||||
WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
 | 
			
		||||
DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR
 | 
			
		||||
ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
 | 
			
		||||
(INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
 | 
			
		||||
LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON
 | 
			
		||||
ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
 | 
			
		||||
(INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
 | 
			
		||||
SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
 | 
			
		||||
 | 
			
		||||
*/
 | 
			
		||||
 | 
			
		||||
#ifndef JSON_DESCRIPTOR_H_
 | 
			
		||||
#define JSON_DESCRIPTOR_H_
 | 
			
		||||
 | 
			
		||||
@ -1,21 +1,28 @@
 | 
			
		||||
/*
 | 
			
		||||
open source routing machine
 | 
			
		||||
Copyright (C) Dennis Luxen, others 2010
 | 
			
		||||
 | 
			
		||||
This program is free software; you can redistribute it and/or modify
 | 
			
		||||
it under the terms of the GNU AFFERO General Public License as published by
 | 
			
		||||
the Free Software Foundation; either version 3 of the License, or
 | 
			
		||||
any later version.
 | 
			
		||||
Copyright (c) 2013, Project OSRM, Dennis Luxen, others
 | 
			
		||||
All rights reserved.
 | 
			
		||||
 | 
			
		||||
This program is distributed in the hope that it will be useful,
 | 
			
		||||
but WITHOUT ANY WARRANTY; without even the implied warranty of
 | 
			
		||||
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
 | 
			
		||||
GNU General Public License for more details.
 | 
			
		||||
Redistribution and use in source and binary forms, with or without modification,
 | 
			
		||||
are permitted provided that the following conditions are met:
 | 
			
		||||
 | 
			
		||||
Redistributions of source code must retain the above copyright notice, this list
 | 
			
		||||
of conditions and the following disclaimer.
 | 
			
		||||
Redistributions in binary form must reproduce the above copyright notice, this
 | 
			
		||||
list of conditions and the following disclaimer in the documentation and/or
 | 
			
		||||
other materials provided with the distribution.
 | 
			
		||||
 | 
			
		||||
THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND
 | 
			
		||||
ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
 | 
			
		||||
WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
 | 
			
		||||
DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR
 | 
			
		||||
ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
 | 
			
		||||
(INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
 | 
			
		||||
LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON
 | 
			
		||||
ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
 | 
			
		||||
(INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
 | 
			
		||||
SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
 | 
			
		||||
 | 
			
		||||
You should have received a copy of the GNU Affero General Public License
 | 
			
		||||
along with this program; if not, write to the Free Software
 | 
			
		||||
Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA
 | 
			
		||||
or see http://www.gnu.org/licenses/agpl.txt.
 | 
			
		||||
*/
 | 
			
		||||
 | 
			
		||||
#include "BaseParser.h"
 | 
			
		||||
@ -72,13 +79,10 @@ void BaseParser::ParseNodeInLua(ImportNode& n, lua_State* localLuaState) {
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
void BaseParser::ParseWayInLua(ExtractionWay& w, lua_State* localLuaState) {
 | 
			
		||||
    if(2 > w.path.size()) {
 | 
			
		||||
        return;
 | 
			
		||||
    }
 | 
			
		||||
    luabind::call_function<void>( localLuaState, "way_function", boost::ref(w) );
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
bool BaseParser::ShouldIgnoreRestriction(const std::string& except_tag_string) const {
 | 
			
		||||
bool BaseParser::ShouldIgnoreRestriction(const std::string & except_tag_string) const {
 | 
			
		||||
    //should this restriction be ignored? yes if there's an overlap between:
 | 
			
		||||
    //a) the list of modes in the except tag of the restriction (except_tag_string), ex: except=bus;bicycle
 | 
			
		||||
    //b) the lua profile defines a hierachy of modes, ex: [access, vehicle, bicycle]
 | 
			
		||||
 | 
			
		||||
@ -1,22 +1,29 @@
 | 
			
		||||
/*
 | 
			
		||||
    open source routing machine
 | 
			
		||||
    Copyright (C) Dennis Luxen, others 2010
 | 
			
		||||
 | 
			
		||||
This program is free software; you can redistribute it and/or modify
 | 
			
		||||
it under the terms of the GNU AFFERO General Public License as published by
 | 
			
		||||
the Free Software Foundation; either version 3 of the License, or
 | 
			
		||||
any later version.
 | 
			
		||||
Copyright (c) 2013, Project OSRM, Dennis Luxen, others
 | 
			
		||||
All rights reserved.
 | 
			
		||||
 | 
			
		||||
This program is distributed in the hope that it will be useful,
 | 
			
		||||
but WITHOUT ANY WARRANTY; without even the implied warranty of
 | 
			
		||||
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
 | 
			
		||||
GNU General Public License for more details.
 | 
			
		||||
Redistribution and use in source and binary forms, with or without modification,
 | 
			
		||||
are permitted provided that the following conditions are met:
 | 
			
		||||
 | 
			
		||||
You should have received a copy of the GNU Affero General Public License
 | 
			
		||||
along with this program; if not, write to the Free Software
 | 
			
		||||
Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA
 | 
			
		||||
or see http://www.gnu.org/licenses/agpl.txt.
 | 
			
		||||
 */
 | 
			
		||||
Redistributions of source code must retain the above copyright notice, this list
 | 
			
		||||
of conditions and the following disclaimer.
 | 
			
		||||
Redistributions in binary form must reproduce the above copyright notice, this
 | 
			
		||||
list of conditions and the following disclaimer in the documentation and/or
 | 
			
		||||
other materials provided with the distribution.
 | 
			
		||||
 | 
			
		||||
THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND
 | 
			
		||||
ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
 | 
			
		||||
WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
 | 
			
		||||
DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR
 | 
			
		||||
ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
 | 
			
		||||
(INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
 | 
			
		||||
LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON
 | 
			
		||||
ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
 | 
			
		||||
(INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
 | 
			
		||||
SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
 | 
			
		||||
 | 
			
		||||
*/
 | 
			
		||||
 | 
			
		||||
#ifndef BASEPARSER_H_
 | 
			
		||||
#define BASEPARSER_H_
 | 
			
		||||
 | 
			
		||||
@ -1,22 +1,29 @@
 | 
			
		||||
/*
 | 
			
		||||
 open source routing machine
 | 
			
		||||
 Copyright (C) Dennis Luxen, others 2010
 | 
			
		||||
 | 
			
		||||
 This program is free software; you can redistribute it and/or modify
 | 
			
		||||
 it under the terms of the GNU AFFERO General Public License as published by
 | 
			
		||||
 the Free Software Foundation; either version 3 of the License, or
 | 
			
		||||
 any later version.
 | 
			
		||||
Copyright (c) 2013, Project OSRM, Dennis Luxen, others
 | 
			
		||||
All rights reserved.
 | 
			
		||||
 | 
			
		||||
 This program is distributed in the hope that it will be useful,
 | 
			
		||||
 but WITHOUT ANY WARRANTY; without even the implied warranty of
 | 
			
		||||
 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
 | 
			
		||||
 GNU General Public License for more details.
 | 
			
		||||
Redistribution and use in source and binary forms, with or without modification,
 | 
			
		||||
are permitted provided that the following conditions are met:
 | 
			
		||||
 | 
			
		||||
 You should have received a copy of the GNU Affero General Public License
 | 
			
		||||
 along with this program; if not, write to the Free Software
 | 
			
		||||
 Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA
 | 
			
		||||
 or see http://www.gnu.org/licenses/agpl.txt.
 | 
			
		||||
 */
 | 
			
		||||
Redistributions of source code must retain the above copyright notice, this list
 | 
			
		||||
of conditions and the following disclaimer.
 | 
			
		||||
Redistributions in binary form must reproduce the above copyright notice, this
 | 
			
		||||
list of conditions and the following disclaimer in the documentation and/or
 | 
			
		||||
other materials provided with the distribution.
 | 
			
		||||
 | 
			
		||||
THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND
 | 
			
		||||
ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
 | 
			
		||||
WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
 | 
			
		||||
DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR
 | 
			
		||||
ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
 | 
			
		||||
(INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
 | 
			
		||||
LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON
 | 
			
		||||
ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
 | 
			
		||||
(INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
 | 
			
		||||
SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
 | 
			
		||||
 | 
			
		||||
*/
 | 
			
		||||
 | 
			
		||||
#include "ExtractionContainers.h"
 | 
			
		||||
 | 
			
		||||
@ -111,7 +118,10 @@ void ExtractionContainers::PrepareData(const std::string & output_file_name, con
 | 
			
		||||
                restrictionsIT->restriction.toNode = wayStartAndEndEdgeIT->firstStart;
 | 
			
		||||
            }
 | 
			
		||||
 | 
			
		||||
            if(UINT_MAX != restrictionsIT->restriction.fromNode && UINT_MAX != restrictionsIT->restriction.toNode) {
 | 
			
		||||
            if(
 | 
			
		||||
                UINT_MAX != restrictionsIT->restriction.fromNode &&
 | 
			
		||||
                UINT_MAX != restrictionsIT->restriction.toNode
 | 
			
		||||
            ) {
 | 
			
		||||
                ++usableRestrictionsCounter;
 | 
			
		||||
            }
 | 
			
		||||
            ++restrictionsIT;
 | 
			
		||||
@ -123,8 +133,15 @@ void ExtractionContainers::PrepareData(const std::string & output_file_name, con
 | 
			
		||||
        restrictionsOutstream.open(restrictionsFileName.c_str(), std::ios::binary);
 | 
			
		||||
        restrictionsOutstream.write((char*)&uuid, sizeof(UUID));
 | 
			
		||||
        restrictionsOutstream.write((char*)&usableRestrictionsCounter, sizeof(unsigned));
 | 
			
		||||
        for(restrictionsIT = restrictionsVector.begin(); restrictionsIT != restrictionsVector.end(); ++restrictionsIT) {
 | 
			
		||||
            if(UINT_MAX != restrictionsIT->restriction.fromNode && UINT_MAX != restrictionsIT->restriction.toNode) {
 | 
			
		||||
        for(
 | 
			
		||||
            restrictionsIT = restrictionsVector.begin();
 | 
			
		||||
            restrictionsIT != restrictionsVector.end();
 | 
			
		||||
            ++restrictionsIT
 | 
			
		||||
        ) {
 | 
			
		||||
            if(
 | 
			
		||||
                UINT_MAX != restrictionsIT->restriction.fromNode &&
 | 
			
		||||
                UINT_MAX != restrictionsIT->restriction.toNode
 | 
			
		||||
            ) {
 | 
			
		||||
                restrictionsOutstream.write((char *)&(restrictionsIT->restriction), sizeof(TurnRestriction));
 | 
			
		||||
            }
 | 
			
		||||
        }
 | 
			
		||||
@ -272,33 +289,39 @@ void ExtractionContainers::PrepareData(const std::string & output_file_name, con
 | 
			
		||||
        fout.close();
 | 
			
		||||
        std::cout << "ok" << std::endl;
 | 
			
		||||
        time = get_timestamp();
 | 
			
		||||
        std::cout << "[extractor] writing street name index ... " << std::flush;
 | 
			
		||||
        std::string nameOutFileName = (output_file_name + ".names");
 | 
			
		||||
        std::ofstream nameOutFile(nameOutFileName.c_str(), std::ios::binary);
 | 
			
		||||
        unsigned sizeOfNameIndex = nameVector.size();
 | 
			
		||||
        nameOutFile.write((char *)&(sizeOfNameIndex), sizeof(unsigned));
 | 
			
		||||
 | 
			
		||||
        BOOST_FOREACH(const std::string & str, nameVector) {
 | 
			
		||||
            unsigned lengthOfRawString = strlen(str.c_str());
 | 
			
		||||
            nameOutFile.write((char *)&(lengthOfRawString), sizeof(unsigned));
 | 
			
		||||
            nameOutFile.write(str.c_str(), lengthOfRawString);
 | 
			
		||||
        std::cout << "[extractor] writing street name index ... " << std::flush;
 | 
			
		||||
        std::string name_file_streamName = (output_file_name + ".names");
 | 
			
		||||
        boost::filesystem::ofstream name_file_stream(
 | 
			
		||||
            name_file_streamName,
 | 
			
		||||
            std::ios::binary
 | 
			
		||||
        );
 | 
			
		||||
 | 
			
		||||
        const unsigned number_of_ways = name_list.size()+1;
 | 
			
		||||
        name_file_stream.write((char *)&(number_of_ways), sizeof(unsigned));
 | 
			
		||||
        unsigned name_lengths_prefix_sum = 0;
 | 
			
		||||
        BOOST_FOREACH(const std::string & str, name_list) {
 | 
			
		||||
            name_file_stream.write(
 | 
			
		||||
                (char *)&(name_lengths_prefix_sum),
 | 
			
		||||
                sizeof(unsigned)
 | 
			
		||||
            );
 | 
			
		||||
            name_lengths_prefix_sum += strlen(str.c_str());
 | 
			
		||||
        }
 | 
			
		||||
        name_file_stream.write(
 | 
			
		||||
            (char *)&(name_lengths_prefix_sum),
 | 
			
		||||
            sizeof(unsigned)
 | 
			
		||||
        );
 | 
			
		||||
        //duplicate on purpose!
 | 
			
		||||
        name_file_stream.write((char *)&(name_lengths_prefix_sum), sizeof(unsigned));
 | 
			
		||||
        BOOST_FOREACH(const std::string & str, name_list) {
 | 
			
		||||
            const unsigned lengthOfRawString = strlen(str.c_str());
 | 
			
		||||
            name_file_stream.write(str.c_str(), lengthOfRawString);
 | 
			
		||||
        }
 | 
			
		||||
 | 
			
		||||
        nameOutFile.close();
 | 
			
		||||
        name_file_stream.close();
 | 
			
		||||
        std::cout << "ok, after " << get_timestamp() - time << "s" << std::endl;
 | 
			
		||||
 | 
			
		||||
        //        time = get_timestamp();
 | 
			
		||||
        //        cout << "[extractor] writing address list      ... " << flush;
 | 
			
		||||
        //
 | 
			
		||||
        //        adressFileName.append(".address");
 | 
			
		||||
        //        ofstream addressOutFile(adressFileName.c_str());
 | 
			
		||||
        //        for(STXXLAddressVector::iterator it = adressVector.begin(); it != adressVector.end(); it++) {
 | 
			
		||||
        //            addressOutFile << it->node.id << "|" << it->node.lat << "|" << it->node.lon << "|" << it->city << "|" << it->street << "|" << it->housenumber << "|" << it->state << "|" << it->country << "\n";
 | 
			
		||||
        //        }
 | 
			
		||||
        //        addressOutFile.close();
 | 
			
		||||
        //        cout << "ok, after " << get_timestamp() - time << "s" << endl;
 | 
			
		||||
 | 
			
		||||
        SimpleLogger().Write() << "Processed " << usedNodeCounter << " nodes and " << usedEdgeCounter << " edges";
 | 
			
		||||
        SimpleLogger().Write() <<
 | 
			
		||||
            "Processed " << usedNodeCounter << " nodes and " << usedEdgeCounter << " edges";
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
    } catch ( const std::exception& e ) {
 | 
			
		||||
 | 
			
		||||
@ -1,22 +1,29 @@
 | 
			
		||||
/*
 | 
			
		||||
 open source routing machine
 | 
			
		||||
 Copyright (C) Dennis Luxen, others 2010
 | 
			
		||||
 | 
			
		||||
 This program is free software; you can redistribute it and/or modify
 | 
			
		||||
 it under the terms of the GNU AFFERO General Public License as published by
 | 
			
		||||
 the Free Software Foundation; either version 3 of the License, or
 | 
			
		||||
 any later version.
 | 
			
		||||
Copyright (c) 2013, Project OSRM, Dennis Luxen, others
 | 
			
		||||
All rights reserved.
 | 
			
		||||
 | 
			
		||||
 This program is distributed in the hope that it will be useful,
 | 
			
		||||
 but WITHOUT ANY WARRANTY; without even the implied warranty of
 | 
			
		||||
 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
 | 
			
		||||
 GNU General Public License for more details.
 | 
			
		||||
Redistribution and use in source and binary forms, with or without modification,
 | 
			
		||||
are permitted provided that the following conditions are met:
 | 
			
		||||
 | 
			
		||||
 You should have received a copy of the GNU Affero General Public License
 | 
			
		||||
 along with this program; if not, write to the Free Software
 | 
			
		||||
 Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA
 | 
			
		||||
 or see http://www.gnu.org/licenses/agpl.txt.
 | 
			
		||||
 */
 | 
			
		||||
Redistributions of source code must retain the above copyright notice, this list
 | 
			
		||||
of conditions and the following disclaimer.
 | 
			
		||||
Redistributions in binary form must reproduce the above copyright notice, this
 | 
			
		||||
list of conditions and the following disclaimer in the documentation and/or
 | 
			
		||||
other materials provided with the distribution.
 | 
			
		||||
 | 
			
		||||
THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND
 | 
			
		||||
ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
 | 
			
		||||
WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
 | 
			
		||||
DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR
 | 
			
		||||
ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
 | 
			
		||||
(INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
 | 
			
		||||
LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON
 | 
			
		||||
ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
 | 
			
		||||
(INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
 | 
			
		||||
SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
 | 
			
		||||
 | 
			
		||||
*/
 | 
			
		||||
 | 
			
		||||
#ifndef EXTRACTIONCONTAINERS_H_
 | 
			
		||||
#define EXTRACTIONCONTAINERS_H_
 | 
			
		||||
@ -27,6 +34,8 @@
 | 
			
		||||
#include "../Util/UUID.h"
 | 
			
		||||
 | 
			
		||||
#include <boost/foreach.hpp>
 | 
			
		||||
#include <boost/filesystem.hpp>
 | 
			
		||||
#include <boost/filesystem/fstream.hpp>
 | 
			
		||||
#include <stxxl.h>
 | 
			
		||||
 | 
			
		||||
class ExtractionContainers {
 | 
			
		||||
@ -38,30 +47,35 @@ public:
 | 
			
		||||
    typedef stxxl::vector<_RawRestrictionContainer> STXXLRestrictionsVector;
 | 
			
		||||
    typedef stxxl::vector<_WayIDStartAndEndEdge>    STXXLWayIDStartEndVector;
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
    STXXLNodeIDVector                               usedNodeIDs;
 | 
			
		||||
    STXXLNodeVector                                 allNodes;
 | 
			
		||||
    STXXLEdgeVector                                 allEdges;
 | 
			
		||||
    STXXLStringVector                               name_list;
 | 
			
		||||
    STXXLRestrictionsVector                         restrictionsVector;
 | 
			
		||||
    STXXLWayIDStartEndVector                        wayStartEndVector;
 | 
			
		||||
    const UUID uuid;
 | 
			
		||||
 | 
			
		||||
    ExtractionContainers() {
 | 
			
		||||
        //Check if another instance of stxxl is already running or if there is a general problem
 | 
			
		||||
        stxxl::vector<unsigned> testForRunningInstance;
 | 
			
		||||
        nameVector.push_back("");
 | 
			
		||||
        name_list.push_back("");
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    virtual ~ExtractionContainers() {
 | 
			
		||||
        usedNodeIDs.clear();
 | 
			
		||||
        allNodes.clear();
 | 
			
		||||
        allEdges.clear();
 | 
			
		||||
        nameVector.clear();
 | 
			
		||||
        name_list.clear();
 | 
			
		||||
        restrictionsVector.clear();
 | 
			
		||||
        wayStartEndVector.clear();
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    void PrepareData( const std::string & output_file_name, const std::string restrictionsFileName, const unsigned amountOfRAM);
 | 
			
		||||
 | 
			
		||||
    STXXLNodeIDVector           usedNodeIDs;
 | 
			
		||||
    STXXLNodeVector             allNodes;
 | 
			
		||||
    STXXLEdgeVector             allEdges;
 | 
			
		||||
    STXXLStringVector           nameVector;
 | 
			
		||||
    STXXLRestrictionsVector     restrictionsVector;
 | 
			
		||||
    STXXLWayIDStartEndVector    wayStartEndVector;
 | 
			
		||||
    const UUID uuid;
 | 
			
		||||
    void PrepareData(
 | 
			
		||||
        const std::string & output_file_name,
 | 
			
		||||
        const std::string restrictionsFileName,
 | 
			
		||||
        const unsigned amountOfRAM
 | 
			
		||||
    );
 | 
			
		||||
};
 | 
			
		||||
 | 
			
		||||
#endif /* EXTRACTIONCONTAINERS_H_ */
 | 
			
		||||
 | 
			
		||||
@ -1,22 +1,29 @@
 | 
			
		||||
/*
 | 
			
		||||
    open source routing machine
 | 
			
		||||
    Copyright (C) Dennis Luxen, others 2010
 | 
			
		||||
 | 
			
		||||
This program is free software; you can redistribute it and/or modify
 | 
			
		||||
it under the terms of the GNU AFFERO General Public License as published by
 | 
			
		||||
the Free Software Foundation; either version 3 of the License, or
 | 
			
		||||
any later version.
 | 
			
		||||
Copyright (c) 2013, Project OSRM, Dennis Luxen, others
 | 
			
		||||
All rights reserved.
 | 
			
		||||
 | 
			
		||||
This program is distributed in the hope that it will be useful,
 | 
			
		||||
but WITHOUT ANY WARRANTY; without even the implied warranty of
 | 
			
		||||
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
 | 
			
		||||
GNU General Public License for more details.
 | 
			
		||||
Redistribution and use in source and binary forms, with or without modification,
 | 
			
		||||
are permitted provided that the following conditions are met:
 | 
			
		||||
 | 
			
		||||
You should have received a copy of the GNU Affero General Public License
 | 
			
		||||
along with this program; if not, write to the Free Software
 | 
			
		||||
Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA
 | 
			
		||||
or see http://www.gnu.org/licenses/agpl.txt.
 | 
			
		||||
 */
 | 
			
		||||
Redistributions of source code must retain the above copyright notice, this list
 | 
			
		||||
of conditions and the following disclaimer.
 | 
			
		||||
Redistributions in binary form must reproduce the above copyright notice, this
 | 
			
		||||
list of conditions and the following disclaimer in the documentation and/or
 | 
			
		||||
other materials provided with the distribution.
 | 
			
		||||
 | 
			
		||||
THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND
 | 
			
		||||
ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
 | 
			
		||||
WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
 | 
			
		||||
DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR
 | 
			
		||||
ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
 | 
			
		||||
(INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
 | 
			
		||||
LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON
 | 
			
		||||
ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
 | 
			
		||||
(INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
 | 
			
		||||
SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
 | 
			
		||||
 | 
			
		||||
*/
 | 
			
		||||
 | 
			
		||||
#ifndef EXTRACTIONHELPERFUNCTIONS_H_
 | 
			
		||||
#define EXTRACTIONHELPERFUNCTIONS_H_
 | 
			
		||||
 | 
			
		||||
@ -1,23 +1,29 @@
 | 
			
		||||
/*
 | 
			
		||||
    open source routing machine
 | 
			
		||||
    Copyright (C) Dennis Luxen, others 2010
 | 
			
		||||
 | 
			
		||||
This program is free software; you can redistribute it and/or modify
 | 
			
		||||
it under the terms of the GNU AFFERO General Public License as published by
 | 
			
		||||
the Free Software Foundation; either version 3 of the License, or
 | 
			
		||||
any later version.
 | 
			
		||||
Copyright (c) 2013, Project OSRM, Dennis Luxen, others
 | 
			
		||||
All rights reserved.
 | 
			
		||||
 | 
			
		||||
This program is distributed in the hope that it will be useful,
 | 
			
		||||
but WITHOUT ANY WARRANTY; without even the implied warranty of
 | 
			
		||||
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
 | 
			
		||||
GNU General Public License for more details.
 | 
			
		||||
Redistribution and use in source and binary forms, with or without modification,
 | 
			
		||||
are permitted provided that the following conditions are met:
 | 
			
		||||
 | 
			
		||||
You should have received a copy of the GNU Affero General Public License
 | 
			
		||||
along with this program; if not, write to the Free Software
 | 
			
		||||
Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA
 | 
			
		||||
or see http://www.gnu.org/licenses/agpl.txt.
 | 
			
		||||
 */
 | 
			
		||||
Redistributions of source code must retain the above copyright notice, this list
 | 
			
		||||
of conditions and the following disclaimer.
 | 
			
		||||
Redistributions in binary form must reproduce the above copyright notice, this
 | 
			
		||||
list of conditions and the following disclaimer in the documentation and/or
 | 
			
		||||
other materials provided with the distribution.
 | 
			
		||||
 | 
			
		||||
THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND
 | 
			
		||||
ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
 | 
			
		||||
WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
 | 
			
		||||
DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR
 | 
			
		||||
ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
 | 
			
		||||
(INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
 | 
			
		||||
LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON
 | 
			
		||||
ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
 | 
			
		||||
(INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
 | 
			
		||||
SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
 | 
			
		||||
 | 
			
		||||
*/
 | 
			
		||||
 | 
			
		||||
#include "ExtractorCallbacks.h"
 | 
			
		||||
 | 
			
		||||
@ -56,7 +62,7 @@ void ExtractorCallbacks::wayFunction(ExtractionWay &parsed_way) {
 | 
			
		||||
            parsed_way.speed = parsed_way.duration/(parsed_way.path.size()-1);
 | 
			
		||||
        }
 | 
			
		||||
 | 
			
		||||
        if(FLT_EPSILON >= fabs(-1. - parsed_way.speed)){
 | 
			
		||||
        if(std::numeric_limits<double>::epsilon() >= fabs(-1. - parsed_way.speed)){
 | 
			
		||||
            SimpleLogger().Write(logDEBUG) <<
 | 
			
		||||
                "found way with bogus speed, id: " << parsed_way.id;
 | 
			
		||||
            return;
 | 
			
		||||
@ -65,8 +71,8 @@ void ExtractorCallbacks::wayFunction(ExtractionWay &parsed_way) {
 | 
			
		||||
        //Get the unique identifier for the street name
 | 
			
		||||
        const StringMap::const_iterator string_map_iterator = stringMap->find(parsed_way.name);
 | 
			
		||||
        if(stringMap->end() == string_map_iterator) {
 | 
			
		||||
            parsed_way.nameID = externalMemory->nameVector.size();
 | 
			
		||||
            externalMemory->nameVector.push_back(parsed_way.name);
 | 
			
		||||
            parsed_way.nameID = externalMemory->name_list.size();
 | 
			
		||||
            externalMemory->name_list.push_back(parsed_way.name);
 | 
			
		||||
            stringMap->insert(std::make_pair(parsed_way.name, parsed_way.nameID));
 | 
			
		||||
        } else {
 | 
			
		||||
            parsed_way.nameID = string_map_iterator->second;
 | 
			
		||||
 | 
			
		||||
@ -1,22 +1,29 @@
 | 
			
		||||
/*
 | 
			
		||||
    open source routing machine
 | 
			
		||||
    Copyright (C) Dennis Luxen, others 2010
 | 
			
		||||
 | 
			
		||||
This program is free software; you can redistribute it and/or modify
 | 
			
		||||
it under the terms of the GNU AFFERO General Public License as published by
 | 
			
		||||
the Free Software Foundation; either version 3 of the License, or
 | 
			
		||||
any later version.
 | 
			
		||||
Copyright (c) 2013, Project OSRM, Dennis Luxen, others
 | 
			
		||||
All rights reserved.
 | 
			
		||||
 | 
			
		||||
This program is distributed in the hope that it will be useful,
 | 
			
		||||
but WITHOUT ANY WARRANTY; without even the implied warranty of
 | 
			
		||||
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
 | 
			
		||||
GNU General Public License for more details.
 | 
			
		||||
Redistribution and use in source and binary forms, with or without modification,
 | 
			
		||||
are permitted provided that the following conditions are met:
 | 
			
		||||
 | 
			
		||||
You should have received a copy of the GNU Affero General Public License
 | 
			
		||||
along with this program; if not, write to the Free Software
 | 
			
		||||
Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA
 | 
			
		||||
or see http://www.gnu.org/licenses/agpl.txt.
 | 
			
		||||
 */
 | 
			
		||||
Redistributions of source code must retain the above copyright notice, this list
 | 
			
		||||
of conditions and the following disclaimer.
 | 
			
		||||
Redistributions in binary form must reproduce the above copyright notice, this
 | 
			
		||||
list of conditions and the following disclaimer in the documentation and/or
 | 
			
		||||
other materials provided with the distribution.
 | 
			
		||||
 | 
			
		||||
THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND
 | 
			
		||||
ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
 | 
			
		||||
WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
 | 
			
		||||
DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR
 | 
			
		||||
ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
 | 
			
		||||
(INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
 | 
			
		||||
LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON
 | 
			
		||||
ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
 | 
			
		||||
(INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
 | 
			
		||||
SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
 | 
			
		||||
 | 
			
		||||
*/
 | 
			
		||||
 | 
			
		||||
#ifndef EXTRACTORCALLBACKS_H_
 | 
			
		||||
#define EXTRACTORCALLBACKS_H_
 | 
			
		||||
 | 
			
		||||
@ -1,22 +1,29 @@
 | 
			
		||||
/*
 | 
			
		||||
    open source routing machine
 | 
			
		||||
    Copyright (C) Dennis Luxen, 2010
 | 
			
		||||
 | 
			
		||||
This program is free software; you can redistribute it and/or modify
 | 
			
		||||
it under the terms of the GNU AFFERO General Public License as published by
 | 
			
		||||
the Free Software Foundation; either version 3 of the License, or
 | 
			
		||||
any later version.
 | 
			
		||||
Copyright (c) 2013, Project OSRM, Dennis Luxen, others
 | 
			
		||||
All rights reserved.
 | 
			
		||||
 | 
			
		||||
This program is distributed in the hope that it will be useful,
 | 
			
		||||
but WITHOUT ANY WARRANTY; without even the implied warranty of
 | 
			
		||||
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
 | 
			
		||||
GNU General Public License for more details.
 | 
			
		||||
Redistribution and use in source and binary forms, with or without modification,
 | 
			
		||||
are permitted provided that the following conditions are met:
 | 
			
		||||
 | 
			
		||||
You should have received a copy of the GNU Affero General Public License
 | 
			
		||||
along with this program; if not, write to the Free Software
 | 
			
		||||
Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA
 | 
			
		||||
or see http://www.gnu.org/licenses/agpl.txt.
 | 
			
		||||
 */
 | 
			
		||||
Redistributions of source code must retain the above copyright notice, this list
 | 
			
		||||
of conditions and the following disclaimer.
 | 
			
		||||
Redistributions in binary form must reproduce the above copyright notice, this
 | 
			
		||||
list of conditions and the following disclaimer in the documentation and/or
 | 
			
		||||
other materials provided with the distribution.
 | 
			
		||||
 | 
			
		||||
THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND
 | 
			
		||||
ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
 | 
			
		||||
WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
 | 
			
		||||
DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR
 | 
			
		||||
ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
 | 
			
		||||
(INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
 | 
			
		||||
LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON
 | 
			
		||||
ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
 | 
			
		||||
(INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
 | 
			
		||||
SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
 | 
			
		||||
 | 
			
		||||
*/
 | 
			
		||||
 | 
			
		||||
#ifndef EXTRACTORSTRUCTS_H_
 | 
			
		||||
#define EXTRACTORSTRUCTS_H_
 | 
			
		||||
@ -154,7 +161,7 @@ struct CmpWayByID : public std::binary_function<_WayIDStartAndEndEdge, _WayIDSta
 | 
			
		||||
 | 
			
		||||
struct Cmp : public std::binary_function<NodeID, NodeID, bool> {
 | 
			
		||||
    typedef NodeID value_type;
 | 
			
		||||
    bool operator ()  (const NodeID & a, const NodeID & b) const {
 | 
			
		||||
    bool operator ()  (const NodeID a, const NodeID b) const {
 | 
			
		||||
        return a < b;
 | 
			
		||||
    }
 | 
			
		||||
    value_type max_value() {
 | 
			
		||||
 | 
			
		||||
@ -1,22 +1,29 @@
 | 
			
		||||
/*
 | 
			
		||||
 open source routing machine
 | 
			
		||||
 Copyright (C) Dennis Luxen, others 2010
 | 
			
		||||
 | 
			
		||||
 This program is free software; you can redistribute it and/or modify
 | 
			
		||||
 it under the terms of the GNU AFFERO General Public License as published by
 | 
			
		||||
 the Free Software Foundation; either version 3 of the License, or
 | 
			
		||||
 any later version.
 | 
			
		||||
Copyright (c) 2013, Project OSRM, Dennis Luxen, others
 | 
			
		||||
All rights reserved.
 | 
			
		||||
 | 
			
		||||
 This program is distributed in the hope that it will be useful,
 | 
			
		||||
 but WITHOUT ANY WARRANTY; without even the implied warranty of
 | 
			
		||||
 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
 | 
			
		||||
 GNU General Public License for more details.
 | 
			
		||||
Redistribution and use in source and binary forms, with or without modification,
 | 
			
		||||
are permitted provided that the following conditions are met:
 | 
			
		||||
 | 
			
		||||
 You should have received a copy of the GNU Affero General Public License
 | 
			
		||||
 along with this program; if not, write to the Free Software
 | 
			
		||||
 Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA
 | 
			
		||||
 or see http://www.gnu.org/licenses/agpl.txt.
 | 
			
		||||
 */
 | 
			
		||||
Redistributions of source code must retain the above copyright notice, this list
 | 
			
		||||
of conditions and the following disclaimer.
 | 
			
		||||
Redistributions in binary form must reproduce the above copyright notice, this
 | 
			
		||||
list of conditions and the following disclaimer in the documentation and/or
 | 
			
		||||
other materials provided with the distribution.
 | 
			
		||||
 | 
			
		||||
THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND
 | 
			
		||||
ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
 | 
			
		||||
WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
 | 
			
		||||
DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR
 | 
			
		||||
ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
 | 
			
		||||
(INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
 | 
			
		||||
LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON
 | 
			
		||||
ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
 | 
			
		||||
(INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
 | 
			
		||||
SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
 | 
			
		||||
 | 
			
		||||
*/
 | 
			
		||||
 | 
			
		||||
#include "PBFParser.h"
 | 
			
		||||
 | 
			
		||||
@ -173,14 +180,14 @@ inline void PBFParser::parseDenseNode(_ThreadData * threadData) {
 | 
			
		||||
		extracted_nodes_vector[i].lon = COORDINATE_PRECISION*( ( double ) m_lastDenseLongitude * threadData->PBFprimitiveBlock.granularity() + threadData->PBFprimitiveBlock.lon_offset() ) / NANO;
 | 
			
		||||
		while (denseTagIndex < dense.keys_vals_size()) {
 | 
			
		||||
			const int tagValue = dense.keys_vals( denseTagIndex );
 | 
			
		||||
			if( 0==tagValue ) {
 | 
			
		||||
			if( 0 == tagValue ) {
 | 
			
		||||
				++denseTagIndex;
 | 
			
		||||
				break;
 | 
			
		||||
			}
 | 
			
		||||
			const int keyValue = dense.keys_vals ( denseTagIndex+1 );
 | 
			
		||||
			const std::string & key = threadData->PBFprimitiveBlock.stringtable().s(tagValue).data();
 | 
			
		||||
			const std::string & value = threadData->PBFprimitiveBlock.stringtable().s(keyValue).data();
 | 
			
		||||
			extracted_nodes_vector[i].keyVals.insert(std::make_pair(key, value));
 | 
			
		||||
			const std::string & key = threadData->PBFprimitiveBlock.stringtable().s(tagValue);
 | 
			
		||||
			const std::string & value = threadData->PBFprimitiveBlock.stringtable().s(keyValue);
 | 
			
		||||
			extracted_nodes_vector[i].keyVals.emplace(key, value);
 | 
			
		||||
			denseTagIndex += 2;
 | 
			
		||||
		}
 | 
			
		||||
	}
 | 
			
		||||
@ -191,7 +198,7 @@ inline void PBFParser::parseDenseNode(_ThreadData * threadData) {
 | 
			
		||||
	    ParseNodeInLua( n, scriptingEnvironment.getLuaStateForThreadID(omp_get_thread_num()) );
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	BOOST_FOREACH(ImportNode &n, extracted_nodes_vector) {
 | 
			
		||||
	BOOST_FOREACH(const ImportNode &n, extracted_nodes_vector) {
 | 
			
		||||
	    extractor_callbacks->nodeFunction(n);
 | 
			
		||||
	}
 | 
			
		||||
}
 | 
			
		||||
@ -209,7 +216,8 @@ inline void PBFParser::parseRelation(_ThreadData * threadData) {
 | 
			
		||||
		return;
 | 
			
		||||
	}
 | 
			
		||||
	const OSMPBF::PrimitiveGroup& group = threadData->PBFprimitiveBlock.primitivegroup( threadData->currentGroupID );
 | 
			
		||||
	for(int i = 0; i < group.relations_size(); ++i ) {
 | 
			
		||||
 | 
			
		||||
	for(int i = 0, relation_size = group.relations_size(); i < relation_size; ++i ) {
 | 
			
		||||
		std::string except_tag_string;
 | 
			
		||||
		const OSMPBF::Relation& inputRelation = threadData->PBFprimitiveBlock.primitivegroup( threadData->currentGroupID ).relations(i);
 | 
			
		||||
		bool isRestriction = false;
 | 
			
		||||
@ -241,8 +249,12 @@ inline void PBFParser::parseRelation(_ThreadData * threadData) {
 | 
			
		||||
		if(isRestriction) {
 | 
			
		||||
			int64_t lastRef = 0;
 | 
			
		||||
			_RawRestrictionContainer currentRestrictionContainer(isOnlyRestriction);
 | 
			
		||||
			for(int rolesIndex = 0; rolesIndex < inputRelation.roles_sid_size(); ++rolesIndex) {
 | 
			
		||||
				std::string role(threadData->PBFprimitiveBlock.stringtable().s( inputRelation.roles_sid( rolesIndex ) ).data());
 | 
			
		||||
			for(
 | 
			
		||||
				int rolesIndex = 0, last_role =  inputRelation.roles_sid_size();
 | 
			
		||||
				rolesIndex < last_role;
 | 
			
		||||
				++rolesIndex
 | 
			
		||||
			) {
 | 
			
		||||
				const std::string & role = threadData->PBFprimitiveBlock.stringtable().s( inputRelation.roles_sid( rolesIndex ) );
 | 
			
		||||
				lastRef += inputRelation.memids(rolesIndex);
 | 
			
		||||
 | 
			
		||||
				if(!("from" == role || "to" == role || "via" == role)) {
 | 
			
		||||
@ -280,7 +292,6 @@ inline void PBFParser::parseRelation(_ThreadData * threadData) {
 | 
			
		||||
					break;
 | 
			
		||||
 | 
			
		||||
				default: //should not happen
 | 
			
		||||
					//cout << "unknown";
 | 
			
		||||
					assert(false);
 | 
			
		||||
					break;
 | 
			
		||||
				}
 | 
			
		||||
@ -309,17 +320,23 @@ inline void PBFParser::parseWay(_ThreadData * threadData) {
 | 
			
		||||
		for(int j = 0; j < number_of_keys; ++j) {
 | 
			
		||||
			const std::string & key = threadData->PBFprimitiveBlock.stringtable().s(inputWay.keys(j));
 | 
			
		||||
			const std::string & val = threadData->PBFprimitiveBlock.stringtable().s(inputWay.vals(j));
 | 
			
		||||
			parsed_way_vector[i].keyVals.insert(std::make_pair(key, val));
 | 
			
		||||
			parsed_way_vector[i].keyVals.emplace(key, val);
 | 
			
		||||
		}
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
#pragma omp parallel for schedule ( guided )
 | 
			
		||||
	for(int i = 0; i < number_of_ways; ++i) {
 | 
			
		||||
	    ExtractionWay & w = parsed_way_vector[i];
 | 
			
		||||
	    ParseWayInLua( w, scriptingEnvironment.getLuaStateForThreadID(omp_get_thread_num()) );
 | 
			
		||||
		if(2 > w.path.size()) {
 | 
			
		||||
        	continue;
 | 
			
		||||
    	}
 | 
			
		||||
	    ParseWayInLua( w, scriptingEnvironment.getLuaStateForThreadID( omp_get_thread_num()) );
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	BOOST_FOREACH(ExtractionWay & w, parsed_way_vector) {
 | 
			
		||||
		if(2 > w.path.size()) {
 | 
			
		||||
        	continue;
 | 
			
		||||
    	}
 | 
			
		||||
	    extractor_callbacks->wayFunction(w);
 | 
			
		||||
	}
 | 
			
		||||
}
 | 
			
		||||
@ -330,21 +347,21 @@ inline void PBFParser::loadGroup(_ThreadData * threadData) {
 | 
			
		||||
#endif
 | 
			
		||||
 | 
			
		||||
	const OSMPBF::PrimitiveGroup& group = threadData->PBFprimitiveBlock.primitivegroup( threadData->currentGroupID );
 | 
			
		||||
	threadData->entityTypeIndicator = 0;
 | 
			
		||||
	if ( group.nodes_size() != 0 ) {
 | 
			
		||||
	threadData->entityTypeIndicator = TypeDummy;
 | 
			
		||||
	if ( 0 != group.nodes_size() ) {
 | 
			
		||||
		threadData->entityTypeIndicator = TypeNode;
 | 
			
		||||
	}
 | 
			
		||||
	if ( group.ways_size() != 0 ) {
 | 
			
		||||
	if ( 0 != group.ways_size() ) {
 | 
			
		||||
		threadData->entityTypeIndicator = TypeWay;
 | 
			
		||||
	}
 | 
			
		||||
	if ( group.relations_size() != 0 ) {
 | 
			
		||||
	if ( 0 != group.relations_size() ) {
 | 
			
		||||
		threadData->entityTypeIndicator = TypeRelation;
 | 
			
		||||
	}
 | 
			
		||||
	if ( group.has_dense() )  {
 | 
			
		||||
		threadData->entityTypeIndicator = TypeDenseNode;
 | 
			
		||||
		assert( group.dense().id_size() != 0 );
 | 
			
		||||
		assert( 0 != group.dense().id_size() );
 | 
			
		||||
	}
 | 
			
		||||
	assert( threadData->entityTypeIndicator != 0 );
 | 
			
		||||
	assert( threadData->entityTypeIndicator != TypeDummy );
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
inline void PBFParser::loadBlock(_ThreadData * threadData) {
 | 
			
		||||
 | 
			
		||||
@ -1,22 +1,29 @@
 | 
			
		||||
/*
 | 
			
		||||
 open source routing machine
 | 
			
		||||
 Copyright (C) Dennis Luxen, others 2010
 | 
			
		||||
 | 
			
		||||
 This program is free software; you can redistribute it and/or modify
 | 
			
		||||
 it under the terms of the GNU AFFERO General Public License as published by
 | 
			
		||||
 the Free Software Foundation; either version 3 of the License, or
 | 
			
		||||
 any later version.
 | 
			
		||||
Copyright (c) 2013, Project OSRM, Dennis Luxen, others
 | 
			
		||||
All rights reserved.
 | 
			
		||||
 | 
			
		||||
 This program is distributed in the hope that it will be useful,
 | 
			
		||||
 but WITHOUT ANY WARRANTY; without even the implied warranty of
 | 
			
		||||
 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
 | 
			
		||||
 GNU General Public License for more details.
 | 
			
		||||
Redistribution and use in source and binary forms, with or without modification,
 | 
			
		||||
are permitted provided that the following conditions are met:
 | 
			
		||||
 | 
			
		||||
 You should have received a copy of the GNU Affero General Public License
 | 
			
		||||
 along with this program; if not, write to the Free Software
 | 
			
		||||
 Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA
 | 
			
		||||
 or see http://www.gnu.org/licenses/agpl.txt.
 | 
			
		||||
 */
 | 
			
		||||
Redistributions of source code must retain the above copyright notice, this list
 | 
			
		||||
of conditions and the following disclaimer.
 | 
			
		||||
Redistributions in binary form must reproduce the above copyright notice, this
 | 
			
		||||
list of conditions and the following disclaimer in the documentation and/or
 | 
			
		||||
other materials provided with the distribution.
 | 
			
		||||
 | 
			
		||||
THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND
 | 
			
		||||
ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
 | 
			
		||||
WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
 | 
			
		||||
DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR
 | 
			
		||||
ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
 | 
			
		||||
(INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
 | 
			
		||||
LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON
 | 
			
		||||
ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
 | 
			
		||||
(INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
 | 
			
		||||
SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
 | 
			
		||||
 | 
			
		||||
*/
 | 
			
		||||
 | 
			
		||||
#ifndef PBFPARSER_H_
 | 
			
		||||
#define PBFPARSER_H_
 | 
			
		||||
@ -44,16 +51,17 @@
 | 
			
		||||
class PBFParser : public BaseParser {
 | 
			
		||||
 | 
			
		||||
    enum EntityType {
 | 
			
		||||
        TypeDummy     = 0,
 | 
			
		||||
        TypeNode      = 1,
 | 
			
		||||
        TypeWay       = 2,
 | 
			
		||||
        TypeRelation  = 4,
 | 
			
		||||
        TypeDenseNode = 8
 | 
			
		||||
    } ;
 | 
			
		||||
    };
 | 
			
		||||
 | 
			
		||||
    struct _ThreadData {
 | 
			
		||||
        int currentGroupID;
 | 
			
		||||
        int currentEntityID;
 | 
			
		||||
        short entityTypeIndicator;
 | 
			
		||||
        EntityType entityTypeIndicator;
 | 
			
		||||
 | 
			
		||||
        OSMPBF::BlobHeader PBFBlobHeader;
 | 
			
		||||
        OSMPBF::Blob PBFBlob;
 | 
			
		||||
@ -74,18 +82,18 @@ public:
 | 
			
		||||
private:
 | 
			
		||||
    inline void ReadData();
 | 
			
		||||
    inline void ParseData();
 | 
			
		||||
    inline void parseDenseNode(_ThreadData * threadData);
 | 
			
		||||
    inline void parseNode(_ThreadData * );
 | 
			
		||||
    inline void parseRelation(_ThreadData * threadData);
 | 
			
		||||
    inline void parseWay(_ThreadData * threadData);
 | 
			
		||||
    inline void parseDenseNode  (_ThreadData * threadData);
 | 
			
		||||
    inline void parseNode       (_ThreadData * threadData);
 | 
			
		||||
    inline void parseRelation   (_ThreadData * threadData);
 | 
			
		||||
    inline void parseWay        (_ThreadData * threadData);
 | 
			
		||||
 | 
			
		||||
    inline void loadGroup(_ThreadData * threadData);
 | 
			
		||||
    inline void loadBlock(_ThreadData * threadData);
 | 
			
		||||
    inline bool readPBFBlobHeader(std::fstream& stream, _ThreadData * threadData);
 | 
			
		||||
    inline bool unpackZLIB(std::fstream &, _ThreadData * threadData);
 | 
			
		||||
    inline bool unpackLZMA(std::fstream &, _ThreadData * );
 | 
			
		||||
    inline bool readBlob(std::fstream& stream, _ThreadData * threadData) ;
 | 
			
		||||
    inline bool readNextBlock(std::fstream& stream, _ThreadData * threadData);
 | 
			
		||||
    inline void loadGroup       (_ThreadData * threadData);
 | 
			
		||||
    inline void loadBlock       (_ThreadData * threadData);
 | 
			
		||||
    inline bool readPBFBlobHeader(std::fstream & stream, _ThreadData * threadData);
 | 
			
		||||
    inline bool unpackZLIB       (std::fstream & stream, _ThreadData * threadData);
 | 
			
		||||
    inline bool unpackLZMA       (std::fstream & stream, _ThreadData * threadData);
 | 
			
		||||
    inline bool readBlob         (std::fstream & stream, _ThreadData * threadData);
 | 
			
		||||
    inline bool readNextBlock    (std::fstream & stream, _ThreadData * threadData);
 | 
			
		||||
 | 
			
		||||
    static const int NANO = 1000 * 1000 * 1000;
 | 
			
		||||
    static const int MAX_BLOB_HEADER_SIZE = 64 * 1024;
 | 
			
		||||
 | 
			
		||||
@ -1,22 +1,29 @@
 | 
			
		||||
/*
 | 
			
		||||
 open source routing machine
 | 
			
		||||
 Copyright (C) Dennis Luxen, others 2010
 | 
			
		||||
 | 
			
		||||
 This program is free software; you can redistribute it and/or modify
 | 
			
		||||
 it under the terms of the GNU AFFERO General Public License as published by
 | 
			
		||||
 the Free Software Foundation; either version 3 of the License, or
 | 
			
		||||
 any later version.
 | 
			
		||||
Copyright (c) 2013, Project OSRM, Dennis Luxen, others
 | 
			
		||||
All rights reserved.
 | 
			
		||||
 | 
			
		||||
 This program is distributed in the hope that it will be useful,
 | 
			
		||||
 but WITHOUT ANY WARRANTY; without even the implied warranty of
 | 
			
		||||
 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
 | 
			
		||||
 GNU General Public License for more details.
 | 
			
		||||
Redistribution and use in source and binary forms, with or without modification,
 | 
			
		||||
are permitted provided that the following conditions are met:
 | 
			
		||||
 | 
			
		||||
 You should have received a copy of the GNU Affero General Public License
 | 
			
		||||
 along with this program; if not, write to the Free Software
 | 
			
		||||
 Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA
 | 
			
		||||
 or see http://www.gnu.org/licenses/agpl.txt.
 | 
			
		||||
 */
 | 
			
		||||
Redistributions of source code must retain the above copyright notice, this list
 | 
			
		||||
of conditions and the following disclaimer.
 | 
			
		||||
Redistributions in binary form must reproduce the above copyright notice, this
 | 
			
		||||
list of conditions and the following disclaimer in the documentation and/or
 | 
			
		||||
other materials provided with the distribution.
 | 
			
		||||
 | 
			
		||||
THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND
 | 
			
		||||
ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
 | 
			
		||||
WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
 | 
			
		||||
DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR
 | 
			
		||||
ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
 | 
			
		||||
(INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
 | 
			
		||||
LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON
 | 
			
		||||
ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
 | 
			
		||||
(INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
 | 
			
		||||
SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
 | 
			
		||||
 | 
			
		||||
*/
 | 
			
		||||
 | 
			
		||||
#include "ScriptingEnvironment.h"
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
@ -1,22 +1,29 @@
 | 
			
		||||
/*
 | 
			
		||||
 open source routing machine
 | 
			
		||||
 Copyright (C) Dennis Luxen, others 2010
 | 
			
		||||
 | 
			
		||||
 This program is free software; you can redistribute it and/or modify
 | 
			
		||||
 it under the terms of the GNU AFFERO General Public License as published by
 | 
			
		||||
 the Free Software Foundation; either version 3 of the License, or
 | 
			
		||||
 any later version.
 | 
			
		||||
Copyright (c) 2013, Project OSRM, Dennis Luxen, others
 | 
			
		||||
All rights reserved.
 | 
			
		||||
 | 
			
		||||
 This program is distributed in the hope that it will be useful,
 | 
			
		||||
 but WITHOUT ANY WARRANTY; without even the implied warranty of
 | 
			
		||||
 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
 | 
			
		||||
 GNU General Public License for more details.
 | 
			
		||||
Redistribution and use in source and binary forms, with or without modification,
 | 
			
		||||
are permitted provided that the following conditions are met:
 | 
			
		||||
 | 
			
		||||
 You should have received a copy of the GNU Affero General Public License
 | 
			
		||||
 along with this program; if not, write to the Free Software
 | 
			
		||||
 Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA
 | 
			
		||||
 or see http://www.gnu.org/licenses/agpl.txt.
 | 
			
		||||
 */
 | 
			
		||||
Redistributions of source code must retain the above copyright notice, this list
 | 
			
		||||
of conditions and the following disclaimer.
 | 
			
		||||
Redistributions in binary form must reproduce the above copyright notice, this
 | 
			
		||||
list of conditions and the following disclaimer in the documentation and/or
 | 
			
		||||
other materials provided with the distribution.
 | 
			
		||||
 | 
			
		||||
THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND
 | 
			
		||||
ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
 | 
			
		||||
WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
 | 
			
		||||
DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR
 | 
			
		||||
ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
 | 
			
		||||
(INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
 | 
			
		||||
LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON
 | 
			
		||||
ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
 | 
			
		||||
(INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
 | 
			
		||||
SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
 | 
			
		||||
 | 
			
		||||
*/
 | 
			
		||||
 | 
			
		||||
#ifndef SCRIPTINGENVIRONMENT_H_
 | 
			
		||||
#define SCRIPTINGENVIRONMENT_H_
 | 
			
		||||
 | 
			
		||||
@ -1,22 +1,29 @@
 | 
			
		||||
/*
 | 
			
		||||
 open source routing machine
 | 
			
		||||
 Copyright (C) Dennis Luxen, others 2010
 | 
			
		||||
 | 
			
		||||
 This program is free software; you can redistribute it and/or modify
 | 
			
		||||
 it under the terms of the GNU AFFERO General Public License as published by
 | 
			
		||||
 the Free Software Foundation; either version 3 of the License, or
 | 
			
		||||
 any later version.
 | 
			
		||||
Copyright (c) 2013, Project OSRM, Dennis Luxen, others
 | 
			
		||||
All rights reserved.
 | 
			
		||||
 | 
			
		||||
 This program is distributed in the hope that it will be useful,
 | 
			
		||||
 but WITHOUT ANY WARRANTY; without even the implied warranty of
 | 
			
		||||
 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
 | 
			
		||||
 GNU General Public License for more details.
 | 
			
		||||
Redistribution and use in source and binary forms, with or without modification,
 | 
			
		||||
are permitted provided that the following conditions are met:
 | 
			
		||||
 | 
			
		||||
 You should have received a copy of the GNU Affero General Public License
 | 
			
		||||
 along with this program; if not, write to the Free Software
 | 
			
		||||
 Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA
 | 
			
		||||
 or see http://www.gnu.org/licenses/agpl.txt.
 | 
			
		||||
 */
 | 
			
		||||
Redistributions of source code must retain the above copyright notice, this list
 | 
			
		||||
of conditions and the following disclaimer.
 | 
			
		||||
Redistributions in binary form must reproduce the above copyright notice, this
 | 
			
		||||
list of conditions and the following disclaimer in the documentation and/or
 | 
			
		||||
other materials provided with the distribution.
 | 
			
		||||
 | 
			
		||||
THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND
 | 
			
		||||
ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
 | 
			
		||||
WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
 | 
			
		||||
DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR
 | 
			
		||||
ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
 | 
			
		||||
(INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
 | 
			
		||||
LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON
 | 
			
		||||
ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
 | 
			
		||||
(INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
 | 
			
		||||
SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
 | 
			
		||||
 | 
			
		||||
*/
 | 
			
		||||
 | 
			
		||||
#include "XMLParser.h"
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
@ -1,22 +1,29 @@
 | 
			
		||||
/*
 | 
			
		||||
 open source routing machine
 | 
			
		||||
 Copyright (C) Dennis Luxen, others 2010
 | 
			
		||||
 | 
			
		||||
 This program is free software; you can redistribute it and/or modify
 | 
			
		||||
 it under the terms of the GNU AFFERO General Public License as published by
 | 
			
		||||
 the Free Software Foundation; either version 3 of the License, or
 | 
			
		||||
 any later version.
 | 
			
		||||
Copyright (c) 2013, Project OSRM, Dennis Luxen, others
 | 
			
		||||
All rights reserved.
 | 
			
		||||
 | 
			
		||||
 This program is distributed in the hope that it will be useful,
 | 
			
		||||
 but WITHOUT ANY WARRANTY; without even the implied warranty of
 | 
			
		||||
 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
 | 
			
		||||
 GNU General Public License for more details.
 | 
			
		||||
Redistribution and use in source and binary forms, with or without modification,
 | 
			
		||||
are permitted provided that the following conditions are met:
 | 
			
		||||
 | 
			
		||||
 You should have received a copy of the GNU Affero General Public License
 | 
			
		||||
 along with this program; if not, write to the Free Software
 | 
			
		||||
 Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA
 | 
			
		||||
 or see http://www.gnu.org/licenses/agpl.txt.
 | 
			
		||||
 */
 | 
			
		||||
Redistributions of source code must retain the above copyright notice, this list
 | 
			
		||||
of conditions and the following disclaimer.
 | 
			
		||||
Redistributions in binary form must reproduce the above copyright notice, this
 | 
			
		||||
list of conditions and the following disclaimer in the documentation and/or
 | 
			
		||||
other materials provided with the distribution.
 | 
			
		||||
 | 
			
		||||
THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND
 | 
			
		||||
ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
 | 
			
		||||
WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
 | 
			
		||||
DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR
 | 
			
		||||
ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
 | 
			
		||||
(INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
 | 
			
		||||
LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON
 | 
			
		||||
ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
 | 
			
		||||
(INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
 | 
			
		||||
SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
 | 
			
		||||
 | 
			
		||||
*/
 | 
			
		||||
 | 
			
		||||
#ifndef XMLPARSER_H_
 | 
			
		||||
#define XMLPARSER_H_
 | 
			
		||||
 | 
			
		||||
							
								
								
									
										30
									
								
								Gemfile.lock
									
									
									
									
									
								
							
							
						
						
									
										30
									
								
								Gemfile.lock
									
									
									
									
									
								
							@ -1,23 +1,23 @@
 | 
			
		||||
GEM
 | 
			
		||||
  remote: http://rubygems.org/
 | 
			
		||||
  specs:
 | 
			
		||||
    builder (3.0.0)
 | 
			
		||||
    cucumber (1.1.4)
 | 
			
		||||
    builder (3.2.2)
 | 
			
		||||
    cucumber (1.3.8)
 | 
			
		||||
      builder (>= 2.1.2)
 | 
			
		||||
      diff-lcs (>= 1.1.2)
 | 
			
		||||
      gherkin (~> 2.7.1)
 | 
			
		||||
      json (>= 1.4.6)
 | 
			
		||||
      term-ansicolor (>= 1.0.6)
 | 
			
		||||
    diff-lcs (1.1.3)
 | 
			
		||||
    gherkin (2.7.6)
 | 
			
		||||
      json (>= 1.4.6)
 | 
			
		||||
    json (1.6.5)
 | 
			
		||||
      diff-lcs (>= 1.1.3)
 | 
			
		||||
      gherkin (~> 2.12.1)
 | 
			
		||||
      multi_json (>= 1.7.5, < 2.0)
 | 
			
		||||
      multi_test (>= 0.0.2)
 | 
			
		||||
    diff-lcs (1.2.4)
 | 
			
		||||
    gherkin (2.12.1)
 | 
			
		||||
      multi_json (~> 1.3)
 | 
			
		||||
    multi_json (1.8.0)
 | 
			
		||||
    multi_test (0.0.2)
 | 
			
		||||
    osmlib-base (0.1.4)
 | 
			
		||||
    rake (0.9.2.2)
 | 
			
		||||
    rspec-expectations (2.11.3)
 | 
			
		||||
      diff-lcs (~> 1.1.3)
 | 
			
		||||
    sys-proctable (0.9.1)
 | 
			
		||||
    term-ansicolor (1.0.7)
 | 
			
		||||
    rake (10.1.0)
 | 
			
		||||
    rspec-expectations (2.14.3)
 | 
			
		||||
      diff-lcs (>= 1.1.3, < 2.0)
 | 
			
		||||
    sys-proctable (0.9.3)
 | 
			
		||||
 | 
			
		||||
PLATFORMS
 | 
			
		||||
  ruby
 | 
			
		||||
 | 
			
		||||
							
								
								
									
										683
									
								
								LICENCE.TXT
									
									
									
									
									
								
							
							
						
						
									
										683
									
								
								LICENCE.TXT
									
									
									
									
									
								
							@ -1,661 +1,22 @@
 | 
			
		||||
                    GNU AFFERO GENERAL PUBLIC LICENSE
 | 
			
		||||
                       Version 3, 19 November 2007
 | 
			
		||||
 | 
			
		||||
 Copyright (C) 2007 Free Software Foundation, Inc. <http://fsf.org/>
 | 
			
		||||
 Everyone is permitted to copy and distribute verbatim copies
 | 
			
		||||
 of this license document, but changing it is not allowed.
 | 
			
		||||
 | 
			
		||||
                            Preamble
 | 
			
		||||
 | 
			
		||||
  The GNU Affero General Public License is a free, copyleft license for
 | 
			
		||||
software and other kinds of works, specifically designed to ensure
 | 
			
		||||
cooperation with the community in the case of network server software.
 | 
			
		||||
 | 
			
		||||
  The licenses for most software and other practical works are designed
 | 
			
		||||
to take away your freedom to share and change the works.  By contrast,
 | 
			
		||||
our General Public Licenses are intended to guarantee your freedom to
 | 
			
		||||
share and change all versions of a program--to make sure it remains free
 | 
			
		||||
software for all its users.
 | 
			
		||||
 | 
			
		||||
  When we speak of free software, we are referring to freedom, not
 | 
			
		||||
price.  Our General Public Licenses are designed to make sure that you
 | 
			
		||||
have the freedom to distribute copies of free software (and charge for
 | 
			
		||||
them if you wish), that you receive source code or can get it if you
 | 
			
		||||
want it, that you can change the software or use pieces of it in new
 | 
			
		||||
free programs, and that you know you can do these things.
 | 
			
		||||
 | 
			
		||||
  Developers that use our General Public Licenses protect your rights
 | 
			
		||||
with two steps: (1) assert copyright on the software, and (2) offer
 | 
			
		||||
you this License which gives you legal permission to copy, distribute
 | 
			
		||||
and/or modify the software.
 | 
			
		||||
 | 
			
		||||
  A secondary benefit of defending all users' freedom is that
 | 
			
		||||
improvements made in alternate versions of the program, if they
 | 
			
		||||
receive widespread use, become available for other developers to
 | 
			
		||||
incorporate.  Many developers of free software are heartened and
 | 
			
		||||
encouraged by the resulting cooperation.  However, in the case of
 | 
			
		||||
software used on network servers, this result may fail to come about.
 | 
			
		||||
The GNU General Public License permits making a modified version and
 | 
			
		||||
letting the public access it on a server without ever releasing its
 | 
			
		||||
source code to the public.
 | 
			
		||||
 | 
			
		||||
  The GNU Affero General Public License is designed specifically to
 | 
			
		||||
ensure that, in such cases, the modified source code becomes available
 | 
			
		||||
to the community.  It requires the operator of a network server to
 | 
			
		||||
provide the source code of the modified version running there to the
 | 
			
		||||
users of that server.  Therefore, public use of a modified version, on
 | 
			
		||||
a publicly accessible server, gives the public access to the source
 | 
			
		||||
code of the modified version.
 | 
			
		||||
 | 
			
		||||
  An older license, called the Affero General Public License and
 | 
			
		||||
published by Affero, was designed to accomplish similar goals.  This is
 | 
			
		||||
a different license, not a version of the Affero GPL, but Affero has
 | 
			
		||||
released a new version of the Affero GPL which permits relicensing under
 | 
			
		||||
this license.
 | 
			
		||||
 | 
			
		||||
  The precise terms and conditions for copying, distribution and
 | 
			
		||||
modification follow.
 | 
			
		||||
 | 
			
		||||
                       TERMS AND CONDITIONS
 | 
			
		||||
 | 
			
		||||
  0. Definitions.
 | 
			
		||||
 | 
			
		||||
  "This License" refers to version 3 of the GNU Affero General Public License.
 | 
			
		||||
 | 
			
		||||
  "Copyright" also means copyright-like laws that apply to other kinds of
 | 
			
		||||
works, such as semiconductor masks.
 | 
			
		||||
 | 
			
		||||
  "The Program" refers to any copyrightable work licensed under this
 | 
			
		||||
License.  Each licensee is addressed as "you".  "Licensees" and
 | 
			
		||||
"recipients" may be individuals or organizations.
 | 
			
		||||
 | 
			
		||||
  To "modify" a work means to copy from or adapt all or part of the work
 | 
			
		||||
in a fashion requiring copyright permission, other than the making of an
 | 
			
		||||
exact copy.  The resulting work is called a "modified version" of the
 | 
			
		||||
earlier work or a work "based on" the earlier work.
 | 
			
		||||
 | 
			
		||||
  A "covered work" means either the unmodified Program or a work based
 | 
			
		||||
on the Program.
 | 
			
		||||
 | 
			
		||||
  To "propagate" a work means to do anything with it that, without
 | 
			
		||||
permission, would make you directly or secondarily liable for
 | 
			
		||||
infringement under applicable copyright law, except executing it on a
 | 
			
		||||
computer or modifying a private copy.  Propagation includes copying,
 | 
			
		||||
distribution (with or without modification), making available to the
 | 
			
		||||
public, and in some countries other activities as well.
 | 
			
		||||
 | 
			
		||||
  To "convey" a work means any kind of propagation that enables other
 | 
			
		||||
parties to make or receive copies.  Mere interaction with a user through
 | 
			
		||||
a computer network, with no transfer of a copy, is not conveying.
 | 
			
		||||
 | 
			
		||||
  An interactive user interface displays "Appropriate Legal Notices"
 | 
			
		||||
to the extent that it includes a convenient and prominently visible
 | 
			
		||||
feature that (1) displays an appropriate copyright notice, and (2)
 | 
			
		||||
tells the user that there is no warranty for the work (except to the
 | 
			
		||||
extent that warranties are provided), that licensees may convey the
 | 
			
		||||
work under this License, and how to view a copy of this License.  If
 | 
			
		||||
the interface presents a list of user commands or options, such as a
 | 
			
		||||
menu, a prominent item in the list meets this criterion.
 | 
			
		||||
 | 
			
		||||
  1. Source Code.
 | 
			
		||||
 | 
			
		||||
  The "source code" for a work means the preferred form of the work
 | 
			
		||||
for making modifications to it.  "Object code" means any non-source
 | 
			
		||||
form of a work.
 | 
			
		||||
 | 
			
		||||
  A "Standard Interface" means an interface that either is an official
 | 
			
		||||
standard defined by a recognized standards body, or, in the case of
 | 
			
		||||
interfaces specified for a particular programming language, one that
 | 
			
		||||
is widely used among developers working in that language.
 | 
			
		||||
 | 
			
		||||
  The "System Libraries" of an executable work include anything, other
 | 
			
		||||
than the work as a whole, that (a) is included in the normal form of
 | 
			
		||||
packaging a Major Component, but which is not part of that Major
 | 
			
		||||
Component, and (b) serves only to enable use of the work with that
 | 
			
		||||
Major Component, or to implement a Standard Interface for which an
 | 
			
		||||
implementation is available to the public in source code form.  A
 | 
			
		||||
"Major Component", in this context, means a major essential component
 | 
			
		||||
(kernel, window system, and so on) of the specific operating system
 | 
			
		||||
(if any) on which the executable work runs, or a compiler used to
 | 
			
		||||
produce the work, or an object code interpreter used to run it.
 | 
			
		||||
 | 
			
		||||
  The "Corresponding Source" for a work in object code form means all
 | 
			
		||||
the source code needed to generate, install, and (for an executable
 | 
			
		||||
work) run the object code and to modify the work, including scripts to
 | 
			
		||||
control those activities.  However, it does not include the work's
 | 
			
		||||
System Libraries, or general-purpose tools or generally available free
 | 
			
		||||
programs which are used unmodified in performing those activities but
 | 
			
		||||
which are not part of the work.  For example, Corresponding Source
 | 
			
		||||
includes interface definition files associated with source files for
 | 
			
		||||
the work, and the source code for shared libraries and dynamically
 | 
			
		||||
linked subprograms that the work is specifically designed to require,
 | 
			
		||||
such as by intimate data communication or control flow between those
 | 
			
		||||
subprograms and other parts of the work.
 | 
			
		||||
 | 
			
		||||
  The Corresponding Source need not include anything that users
 | 
			
		||||
can regenerate automatically from other parts of the Corresponding
 | 
			
		||||
Source.
 | 
			
		||||
 | 
			
		||||
  The Corresponding Source for a work in source code form is that
 | 
			
		||||
same work.
 | 
			
		||||
 | 
			
		||||
  2. Basic Permissions.
 | 
			
		||||
 | 
			
		||||
  All rights granted under this License are granted for the term of
 | 
			
		||||
copyright on the Program, and are irrevocable provided the stated
 | 
			
		||||
conditions are met.  This License explicitly affirms your unlimited
 | 
			
		||||
permission to run the unmodified Program.  The output from running a
 | 
			
		||||
covered work is covered by this License only if the output, given its
 | 
			
		||||
content, constitutes a covered work.  This License acknowledges your
 | 
			
		||||
rights of fair use or other equivalent, as provided by copyright law.
 | 
			
		||||
 | 
			
		||||
  You may make, run and propagate covered works that you do not
 | 
			
		||||
convey, without conditions so long as your license otherwise remains
 | 
			
		||||
in force.  You may convey covered works to others for the sole purpose
 | 
			
		||||
of having them make modifications exclusively for you, or provide you
 | 
			
		||||
with facilities for running those works, provided that you comply with
 | 
			
		||||
the terms of this License in conveying all material for which you do
 | 
			
		||||
not control copyright.  Those thus making or running the covered works
 | 
			
		||||
for you must do so exclusively on your behalf, under your direction
 | 
			
		||||
and control, on terms that prohibit them from making any copies of
 | 
			
		||||
your copyrighted material outside their relationship with you.
 | 
			
		||||
 | 
			
		||||
  Conveying under any other circumstances is permitted solely under
 | 
			
		||||
the conditions stated below.  Sublicensing is not allowed; section 10
 | 
			
		||||
makes it unnecessary.
 | 
			
		||||
 | 
			
		||||
  3. Protecting Users' Legal Rights From Anti-Circumvention Law.
 | 
			
		||||
 | 
			
		||||
  No covered work shall be deemed part of an effective technological
 | 
			
		||||
measure under any applicable law fulfilling obligations under article
 | 
			
		||||
11 of the WIPO copyright treaty adopted on 20 December 1996, or
 | 
			
		||||
similar laws prohibiting or restricting circumvention of such
 | 
			
		||||
measures.
 | 
			
		||||
 | 
			
		||||
  When you convey a covered work, you waive any legal power to forbid
 | 
			
		||||
circumvention of technological measures to the extent such circumvention
 | 
			
		||||
is effected by exercising rights under this License with respect to
 | 
			
		||||
the covered work, and you disclaim any intention to limit operation or
 | 
			
		||||
modification of the work as a means of enforcing, against the work's
 | 
			
		||||
users, your or third parties' legal rights to forbid circumvention of
 | 
			
		||||
technological measures.
 | 
			
		||||
 | 
			
		||||
  4. Conveying Verbatim Copies.
 | 
			
		||||
 | 
			
		||||
  You may convey verbatim copies of the Program's source code as you
 | 
			
		||||
receive it, in any medium, provided that you conspicuously and
 | 
			
		||||
appropriately publish on each copy an appropriate copyright notice;
 | 
			
		||||
keep intact all notices stating that this License and any
 | 
			
		||||
non-permissive terms added in accord with section 7 apply to the code;
 | 
			
		||||
keep intact all notices of the absence of any warranty; and give all
 | 
			
		||||
recipients a copy of this License along with the Program.
 | 
			
		||||
 | 
			
		||||
  You may charge any price or no price for each copy that you convey,
 | 
			
		||||
and you may offer support or warranty protection for a fee.
 | 
			
		||||
 | 
			
		||||
  5. Conveying Modified Source Versions.
 | 
			
		||||
 | 
			
		||||
  You may convey a work based on the Program, or the modifications to
 | 
			
		||||
produce it from the Program, in the form of source code under the
 | 
			
		||||
terms of section 4, provided that you also meet all of these conditions:
 | 
			
		||||
 | 
			
		||||
    a) The work must carry prominent notices stating that you modified
 | 
			
		||||
    it, and giving a relevant date.
 | 
			
		||||
 | 
			
		||||
    b) The work must carry prominent notices stating that it is
 | 
			
		||||
    released under this License and any conditions added under section
 | 
			
		||||
    7.  This requirement modifies the requirement in section 4 to
 | 
			
		||||
    "keep intact all notices".
 | 
			
		||||
 | 
			
		||||
    c) You must license the entire work, as a whole, under this
 | 
			
		||||
    License to anyone who comes into possession of a copy.  This
 | 
			
		||||
    License will therefore apply, along with any applicable section 7
 | 
			
		||||
    additional terms, to the whole of the work, and all its parts,
 | 
			
		||||
    regardless of how they are packaged.  This License gives no
 | 
			
		||||
    permission to license the work in any other way, but it does not
 | 
			
		||||
    invalidate such permission if you have separately received it.
 | 
			
		||||
 | 
			
		||||
    d) If the work has interactive user interfaces, each must display
 | 
			
		||||
    Appropriate Legal Notices; however, if the Program has interactive
 | 
			
		||||
    interfaces that do not display Appropriate Legal Notices, your
 | 
			
		||||
    work need not make them do so.
 | 
			
		||||
 | 
			
		||||
  A compilation of a covered work with other separate and independent
 | 
			
		||||
works, which are not by their nature extensions of the covered work,
 | 
			
		||||
and which are not combined with it such as to form a larger program,
 | 
			
		||||
in or on a volume of a storage or distribution medium, is called an
 | 
			
		||||
"aggregate" if the compilation and its resulting copyright are not
 | 
			
		||||
used to limit the access or legal rights of the compilation's users
 | 
			
		||||
beyond what the individual works permit.  Inclusion of a covered work
 | 
			
		||||
in an aggregate does not cause this License to apply to the other
 | 
			
		||||
parts of the aggregate.
 | 
			
		||||
 | 
			
		||||
  6. Conveying Non-Source Forms.
 | 
			
		||||
 | 
			
		||||
  You may convey a covered work in object code form under the terms
 | 
			
		||||
of sections 4 and 5, provided that you also convey the
 | 
			
		||||
machine-readable Corresponding Source under the terms of this License,
 | 
			
		||||
in one of these ways:
 | 
			
		||||
 | 
			
		||||
    a) Convey the object code in, or embodied in, a physical product
 | 
			
		||||
    (including a physical distribution medium), accompanied by the
 | 
			
		||||
    Corresponding Source fixed on a durable physical medium
 | 
			
		||||
    customarily used for software interchange.
 | 
			
		||||
 | 
			
		||||
    b) Convey the object code in, or embodied in, a physical product
 | 
			
		||||
    (including a physical distribution medium), accompanied by a
 | 
			
		||||
    written offer, valid for at least three years and valid for as
 | 
			
		||||
    long as you offer spare parts or customer support for that product
 | 
			
		||||
    model, to give anyone who possesses the object code either (1) a
 | 
			
		||||
    copy of the Corresponding Source for all the software in the
 | 
			
		||||
    product that is covered by this License, on a durable physical
 | 
			
		||||
    medium customarily used for software interchange, for a price no
 | 
			
		||||
    more than your reasonable cost of physically performing this
 | 
			
		||||
    conveying of source, or (2) access to copy the
 | 
			
		||||
    Corresponding Source from a network server at no charge.
 | 
			
		||||
 | 
			
		||||
    c) Convey individual copies of the object code with a copy of the
 | 
			
		||||
    written offer to provide the Corresponding Source.  This
 | 
			
		||||
    alternative is allowed only occasionally and noncommercially, and
 | 
			
		||||
    only if you received the object code with such an offer, in accord
 | 
			
		||||
    with subsection 6b.
 | 
			
		||||
 | 
			
		||||
    d) Convey the object code by offering access from a designated
 | 
			
		||||
    place (gratis or for a charge), and offer equivalent access to the
 | 
			
		||||
    Corresponding Source in the same way through the same place at no
 | 
			
		||||
    further charge.  You need not require recipients to copy the
 | 
			
		||||
    Corresponding Source along with the object code.  If the place to
 | 
			
		||||
    copy the object code is a network server, the Corresponding Source
 | 
			
		||||
    may be on a different server (operated by you or a third party)
 | 
			
		||||
    that supports equivalent copying facilities, provided you maintain
 | 
			
		||||
    clear directions next to the object code saying where to find the
 | 
			
		||||
    Corresponding Source.  Regardless of what server hosts the
 | 
			
		||||
    Corresponding Source, you remain obligated to ensure that it is
 | 
			
		||||
    available for as long as needed to satisfy these requirements.
 | 
			
		||||
 | 
			
		||||
    e) Convey the object code using peer-to-peer transmission, provided
 | 
			
		||||
    you inform other peers where the object code and Corresponding
 | 
			
		||||
    Source of the work are being offered to the general public at no
 | 
			
		||||
    charge under subsection 6d.
 | 
			
		||||
 | 
			
		||||
  A separable portion of the object code, whose source code is excluded
 | 
			
		||||
from the Corresponding Source as a System Library, need not be
 | 
			
		||||
included in conveying the object code work.
 | 
			
		||||
 | 
			
		||||
  A "User Product" is either (1) a "consumer product", which means any
 | 
			
		||||
tangible personal property which is normally used for personal, family,
 | 
			
		||||
or household purposes, or (2) anything designed or sold for incorporation
 | 
			
		||||
into a dwelling.  In determining whether a product is a consumer product,
 | 
			
		||||
doubtful cases shall be resolved in favor of coverage.  For a particular
 | 
			
		||||
product received by a particular user, "normally used" refers to a
 | 
			
		||||
typical or common use of that class of product, regardless of the status
 | 
			
		||||
of the particular user or of the way in which the particular user
 | 
			
		||||
actually uses, or expects or is expected to use, the product.  A product
 | 
			
		||||
is a consumer product regardless of whether the product has substantial
 | 
			
		||||
commercial, industrial or non-consumer uses, unless such uses represent
 | 
			
		||||
the only significant mode of use of the product.
 | 
			
		||||
 | 
			
		||||
  "Installation Information" for a User Product means any methods,
 | 
			
		||||
procedures, authorization keys, or other information required to install
 | 
			
		||||
and execute modified versions of a covered work in that User Product from
 | 
			
		||||
a modified version of its Corresponding Source.  The information must
 | 
			
		||||
suffice to ensure that the continued functioning of the modified object
 | 
			
		||||
code is in no case prevented or interfered with solely because
 | 
			
		||||
modification has been made.
 | 
			
		||||
 | 
			
		||||
  If you convey an object code work under this section in, or with, or
 | 
			
		||||
specifically for use in, a User Product, and the conveying occurs as
 | 
			
		||||
part of a transaction in which the right of possession and use of the
 | 
			
		||||
User Product is transferred to the recipient in perpetuity or for a
 | 
			
		||||
fixed term (regardless of how the transaction is characterized), the
 | 
			
		||||
Corresponding Source conveyed under this section must be accompanied
 | 
			
		||||
by the Installation Information.  But this requirement does not apply
 | 
			
		||||
if neither you nor any third party retains the ability to install
 | 
			
		||||
modified object code on the User Product (for example, the work has
 | 
			
		||||
been installed in ROM).
 | 
			
		||||
 | 
			
		||||
  The requirement to provide Installation Information does not include a
 | 
			
		||||
requirement to continue to provide support service, warranty, or updates
 | 
			
		||||
for a work that has been modified or installed by the recipient, or for
 | 
			
		||||
the User Product in which it has been modified or installed.  Access to a
 | 
			
		||||
network may be denied when the modification itself materially and
 | 
			
		||||
adversely affects the operation of the network or violates the rules and
 | 
			
		||||
protocols for communication across the network.
 | 
			
		||||
 | 
			
		||||
  Corresponding Source conveyed, and Installation Information provided,
 | 
			
		||||
in accord with this section must be in a format that is publicly
 | 
			
		||||
documented (and with an implementation available to the public in
 | 
			
		||||
source code form), and must require no special password or key for
 | 
			
		||||
unpacking, reading or copying.
 | 
			
		||||
 | 
			
		||||
  7. Additional Terms.
 | 
			
		||||
 | 
			
		||||
  "Additional permissions" are terms that supplement the terms of this
 | 
			
		||||
License by making exceptions from one or more of its conditions.
 | 
			
		||||
Additional permissions that are applicable to the entire Program shall
 | 
			
		||||
be treated as though they were included in this License, to the extent
 | 
			
		||||
that they are valid under applicable law.  If additional permissions
 | 
			
		||||
apply only to part of the Program, that part may be used separately
 | 
			
		||||
under those permissions, but the entire Program remains governed by
 | 
			
		||||
this License without regard to the additional permissions.
 | 
			
		||||
 | 
			
		||||
  When you convey a copy of a covered work, you may at your option
 | 
			
		||||
remove any additional permissions from that copy, or from any part of
 | 
			
		||||
it.  (Additional permissions may be written to require their own
 | 
			
		||||
removal in certain cases when you modify the work.)  You may place
 | 
			
		||||
additional permissions on material, added by you to a covered work,
 | 
			
		||||
for which you have or can give appropriate copyright permission.
 | 
			
		||||
 | 
			
		||||
  Notwithstanding any other provision of this License, for material you
 | 
			
		||||
add to a covered work, you may (if authorized by the copyright holders of
 | 
			
		||||
that material) supplement the terms of this License with terms:
 | 
			
		||||
 | 
			
		||||
    a) Disclaiming warranty or limiting liability differently from the
 | 
			
		||||
    terms of sections 15 and 16 of this License; or
 | 
			
		||||
 | 
			
		||||
    b) Requiring preservation of specified reasonable legal notices or
 | 
			
		||||
    author attributions in that material or in the Appropriate Legal
 | 
			
		||||
    Notices displayed by works containing it; or
 | 
			
		||||
 | 
			
		||||
    c) Prohibiting misrepresentation of the origin of that material, or
 | 
			
		||||
    requiring that modified versions of such material be marked in
 | 
			
		||||
    reasonable ways as different from the original version; or
 | 
			
		||||
 | 
			
		||||
    d) Limiting the use for publicity purposes of names of licensors or
 | 
			
		||||
    authors of the material; or
 | 
			
		||||
 | 
			
		||||
    e) Declining to grant rights under trademark law for use of some
 | 
			
		||||
    trade names, trademarks, or service marks; or
 | 
			
		||||
 | 
			
		||||
    f) Requiring indemnification of licensors and authors of that
 | 
			
		||||
    material by anyone who conveys the material (or modified versions of
 | 
			
		||||
    it) with contractual assumptions of liability to the recipient, for
 | 
			
		||||
    any liability that these contractual assumptions directly impose on
 | 
			
		||||
    those licensors and authors.
 | 
			
		||||
 | 
			
		||||
  All other non-permissive additional terms are considered "further
 | 
			
		||||
restrictions" within the meaning of section 10.  If the Program as you
 | 
			
		||||
received it, or any part of it, contains a notice stating that it is
 | 
			
		||||
governed by this License along with a term that is a further
 | 
			
		||||
restriction, you may remove that term.  If a license document contains
 | 
			
		||||
a further restriction but permits relicensing or conveying under this
 | 
			
		||||
License, you may add to a covered work material governed by the terms
 | 
			
		||||
of that license document, provided that the further restriction does
 | 
			
		||||
not survive such relicensing or conveying.
 | 
			
		||||
 | 
			
		||||
  If you add terms to a covered work in accord with this section, you
 | 
			
		||||
must place, in the relevant source files, a statement of the
 | 
			
		||||
additional terms that apply to those files, or a notice indicating
 | 
			
		||||
where to find the applicable terms.
 | 
			
		||||
 | 
			
		||||
  Additional terms, permissive or non-permissive, may be stated in the
 | 
			
		||||
form of a separately written license, or stated as exceptions;
 | 
			
		||||
the above requirements apply either way.
 | 
			
		||||
 | 
			
		||||
  8. Termination.
 | 
			
		||||
 | 
			
		||||
  You may not propagate or modify a covered work except as expressly
 | 
			
		||||
provided under this License.  Any attempt otherwise to propagate or
 | 
			
		||||
modify it is void, and will automatically terminate your rights under
 | 
			
		||||
this License (including any patent licenses granted under the third
 | 
			
		||||
paragraph of section 11).
 | 
			
		||||
 | 
			
		||||
  However, if you cease all violation of this License, then your
 | 
			
		||||
license from a particular copyright holder is reinstated (a)
 | 
			
		||||
provisionally, unless and until the copyright holder explicitly and
 | 
			
		||||
finally terminates your license, and (b) permanently, if the copyright
 | 
			
		||||
holder fails to notify you of the violation by some reasonable means
 | 
			
		||||
prior to 60 days after the cessation.
 | 
			
		||||
 | 
			
		||||
  Moreover, your license from a particular copyright holder is
 | 
			
		||||
reinstated permanently if the copyright holder notifies you of the
 | 
			
		||||
violation by some reasonable means, this is the first time you have
 | 
			
		||||
received notice of violation of this License (for any work) from that
 | 
			
		||||
copyright holder, and you cure the violation prior to 30 days after
 | 
			
		||||
your receipt of the notice.
 | 
			
		||||
 | 
			
		||||
  Termination of your rights under this section does not terminate the
 | 
			
		||||
licenses of parties who have received copies or rights from you under
 | 
			
		||||
this License.  If your rights have been terminated and not permanently
 | 
			
		||||
reinstated, you do not qualify to receive new licenses for the same
 | 
			
		||||
material under section 10.
 | 
			
		||||
 | 
			
		||||
  9. Acceptance Not Required for Having Copies.
 | 
			
		||||
 | 
			
		||||
  You are not required to accept this License in order to receive or
 | 
			
		||||
run a copy of the Program.  Ancillary propagation of a covered work
 | 
			
		||||
occurring solely as a consequence of using peer-to-peer transmission
 | 
			
		||||
to receive a copy likewise does not require acceptance.  However,
 | 
			
		||||
nothing other than this License grants you permission to propagate or
 | 
			
		||||
modify any covered work.  These actions infringe copyright if you do
 | 
			
		||||
not accept this License.  Therefore, by modifying or propagating a
 | 
			
		||||
covered work, you indicate your acceptance of this License to do so.
 | 
			
		||||
 | 
			
		||||
  10. Automatic Licensing of Downstream Recipients.
 | 
			
		||||
 | 
			
		||||
  Each time you convey a covered work, the recipient automatically
 | 
			
		||||
receives a license from the original licensors, to run, modify and
 | 
			
		||||
propagate that work, subject to this License.  You are not responsible
 | 
			
		||||
for enforcing compliance by third parties with this License.
 | 
			
		||||
 | 
			
		||||
  An "entity transaction" is a transaction transferring control of an
 | 
			
		||||
organization, or substantially all assets of one, or subdividing an
 | 
			
		||||
organization, or merging organizations.  If propagation of a covered
 | 
			
		||||
work results from an entity transaction, each party to that
 | 
			
		||||
transaction who receives a copy of the work also receives whatever
 | 
			
		||||
licenses to the work the party's predecessor in interest had or could
 | 
			
		||||
give under the previous paragraph, plus a right to possession of the
 | 
			
		||||
Corresponding Source of the work from the predecessor in interest, if
 | 
			
		||||
the predecessor has it or can get it with reasonable efforts.
 | 
			
		||||
 | 
			
		||||
  You may not impose any further restrictions on the exercise of the
 | 
			
		||||
rights granted or affirmed under this License.  For example, you may
 | 
			
		||||
not impose a license fee, royalty, or other charge for exercise of
 | 
			
		||||
rights granted under this License, and you may not initiate litigation
 | 
			
		||||
(including a cross-claim or counterclaim in a lawsuit) alleging that
 | 
			
		||||
any patent claim is infringed by making, using, selling, offering for
 | 
			
		||||
sale, or importing the Program or any portion of it.
 | 
			
		||||
 | 
			
		||||
  11. Patents.
 | 
			
		||||
 | 
			
		||||
  A "contributor" is a copyright holder who authorizes use under this
 | 
			
		||||
License of the Program or a work on which the Program is based.  The
 | 
			
		||||
work thus licensed is called the contributor's "contributor version".
 | 
			
		||||
 | 
			
		||||
  A contributor's "essential patent claims" are all patent claims
 | 
			
		||||
owned or controlled by the contributor, whether already acquired or
 | 
			
		||||
hereafter acquired, that would be infringed by some manner, permitted
 | 
			
		||||
by this License, of making, using, or selling its contributor version,
 | 
			
		||||
but do not include claims that would be infringed only as a
 | 
			
		||||
consequence of further modification of the contributor version.  For
 | 
			
		||||
purposes of this definition, "control" includes the right to grant
 | 
			
		||||
patent sublicenses in a manner consistent with the requirements of
 | 
			
		||||
this License.
 | 
			
		||||
 | 
			
		||||
  Each contributor grants you a non-exclusive, worldwide, royalty-free
 | 
			
		||||
patent license under the contributor's essential patent claims, to
 | 
			
		||||
make, use, sell, offer for sale, import and otherwise run, modify and
 | 
			
		||||
propagate the contents of its contributor version.
 | 
			
		||||
 | 
			
		||||
  In the following three paragraphs, a "patent license" is any express
 | 
			
		||||
agreement or commitment, however denominated, not to enforce a patent
 | 
			
		||||
(such as an express permission to practice a patent or covenant not to
 | 
			
		||||
sue for patent infringement).  To "grant" such a patent license to a
 | 
			
		||||
party means to make such an agreement or commitment not to enforce a
 | 
			
		||||
patent against the party.
 | 
			
		||||
 | 
			
		||||
  If you convey a covered work, knowingly relying on a patent license,
 | 
			
		||||
and the Corresponding Source of the work is not available for anyone
 | 
			
		||||
to copy, free of charge and under the terms of this License, through a
 | 
			
		||||
publicly available network server or other readily accessible means,
 | 
			
		||||
then you must either (1) cause the Corresponding Source to be so
 | 
			
		||||
available, or (2) arrange to deprive yourself of the benefit of the
 | 
			
		||||
patent license for this particular work, or (3) arrange, in a manner
 | 
			
		||||
consistent with the requirements of this License, to extend the patent
 | 
			
		||||
license to downstream recipients.  "Knowingly relying" means you have
 | 
			
		||||
actual knowledge that, but for the patent license, your conveying the
 | 
			
		||||
covered work in a country, or your recipient's use of the covered work
 | 
			
		||||
in a country, would infringe one or more identifiable patents in that
 | 
			
		||||
country that you have reason to believe are valid.
 | 
			
		||||
 | 
			
		||||
  If, pursuant to or in connection with a single transaction or
 | 
			
		||||
arrangement, you convey, or propagate by procuring conveyance of, a
 | 
			
		||||
covered work, and grant a patent license to some of the parties
 | 
			
		||||
receiving the covered work authorizing them to use, propagate, modify
 | 
			
		||||
or convey a specific copy of the covered work, then the patent license
 | 
			
		||||
you grant is automatically extended to all recipients of the covered
 | 
			
		||||
work and works based on it.
 | 
			
		||||
 | 
			
		||||
  A patent license is "discriminatory" if it does not include within
 | 
			
		||||
the scope of its coverage, prohibits the exercise of, or is
 | 
			
		||||
conditioned on the non-exercise of one or more of the rights that are
 | 
			
		||||
specifically granted under this License.  You may not convey a covered
 | 
			
		||||
work if you are a party to an arrangement with a third party that is
 | 
			
		||||
in the business of distributing software, under which you make payment
 | 
			
		||||
to the third party based on the extent of your activity of conveying
 | 
			
		||||
the work, and under which the third party grants, to any of the
 | 
			
		||||
parties who would receive the covered work from you, a discriminatory
 | 
			
		||||
patent license (a) in connection with copies of the covered work
 | 
			
		||||
conveyed by you (or copies made from those copies), or (b) primarily
 | 
			
		||||
for and in connection with specific products or compilations that
 | 
			
		||||
contain the covered work, unless you entered into that arrangement,
 | 
			
		||||
or that patent license was granted, prior to 28 March 2007.
 | 
			
		||||
 | 
			
		||||
  Nothing in this License shall be construed as excluding or limiting
 | 
			
		||||
any implied license or other defenses to infringement that may
 | 
			
		||||
otherwise be available to you under applicable patent law.
 | 
			
		||||
 | 
			
		||||
  12. No Surrender of Others' Freedom.
 | 
			
		||||
 | 
			
		||||
  If conditions are imposed on you (whether by court order, agreement or
 | 
			
		||||
otherwise) that contradict the conditions of this License, they do not
 | 
			
		||||
excuse you from the conditions of this License.  If you cannot convey a
 | 
			
		||||
covered work so as to satisfy simultaneously your obligations under this
 | 
			
		||||
License and any other pertinent obligations, then as a consequence you may
 | 
			
		||||
not convey it at all.  For example, if you agree to terms that obligate you
 | 
			
		||||
to collect a royalty for further conveying from those to whom you convey
 | 
			
		||||
the Program, the only way you could satisfy both those terms and this
 | 
			
		||||
License would be to refrain entirely from conveying the Program.
 | 
			
		||||
 | 
			
		||||
  13. Remote Network Interaction; Use with the GNU General Public License.
 | 
			
		||||
 | 
			
		||||
  Notwithstanding any other provision of this License, if you modify the
 | 
			
		||||
Program, your modified version must prominently offer all users
 | 
			
		||||
interacting with it remotely through a computer network (if your version
 | 
			
		||||
supports such interaction) an opportunity to receive the Corresponding
 | 
			
		||||
Source of your version by providing access to the Corresponding Source
 | 
			
		||||
from a network server at no charge, through some standard or customary
 | 
			
		||||
means of facilitating copying of software.  This Corresponding Source
 | 
			
		||||
shall include the Corresponding Source for any work covered by version 3
 | 
			
		||||
of the GNU General Public License that is incorporated pursuant to the
 | 
			
		||||
following paragraph.
 | 
			
		||||
 | 
			
		||||
  Notwithstanding any other provision of this License, you have
 | 
			
		||||
permission to link or combine any covered work with a work licensed
 | 
			
		||||
under version 3 of the GNU General Public License into a single
 | 
			
		||||
combined work, and to convey the resulting work.  The terms of this
 | 
			
		||||
License will continue to apply to the part which is the covered work,
 | 
			
		||||
but the work with which it is combined will remain governed by version
 | 
			
		||||
3 of the GNU General Public License.
 | 
			
		||||
 | 
			
		||||
  14. Revised Versions of this License.
 | 
			
		||||
 | 
			
		||||
  The Free Software Foundation may publish revised and/or new versions of
 | 
			
		||||
the GNU Affero General Public License from time to time.  Such new versions
 | 
			
		||||
will be similar in spirit to the present version, but may differ in detail to
 | 
			
		||||
address new problems or concerns.
 | 
			
		||||
 | 
			
		||||
  Each version is given a distinguishing version number.  If the
 | 
			
		||||
Program specifies that a certain numbered version of the GNU Affero General
 | 
			
		||||
Public License "or any later version" applies to it, you have the
 | 
			
		||||
option of following the terms and conditions either of that numbered
 | 
			
		||||
version or of any later version published by the Free Software
 | 
			
		||||
Foundation.  If the Program does not specify a version number of the
 | 
			
		||||
GNU Affero General Public License, you may choose any version ever published
 | 
			
		||||
by the Free Software Foundation.
 | 
			
		||||
 | 
			
		||||
  If the Program specifies that a proxy can decide which future
 | 
			
		||||
versions of the GNU Affero General Public License can be used, that proxy's
 | 
			
		||||
public statement of acceptance of a version permanently authorizes you
 | 
			
		||||
to choose that version for the Program.
 | 
			
		||||
 | 
			
		||||
  Later license versions may give you additional or different
 | 
			
		||||
permissions.  However, no additional obligations are imposed on any
 | 
			
		||||
author or copyright holder as a result of your choosing to follow a
 | 
			
		||||
later version.
 | 
			
		||||
 | 
			
		||||
  15. Disclaimer of Warranty.
 | 
			
		||||
 | 
			
		||||
  THERE IS NO WARRANTY FOR THE PROGRAM, TO THE EXTENT PERMITTED BY
 | 
			
		||||
APPLICABLE LAW.  EXCEPT WHEN OTHERWISE STATED IN WRITING THE COPYRIGHT
 | 
			
		||||
HOLDERS AND/OR OTHER PARTIES PROVIDE THE PROGRAM "AS IS" WITHOUT WARRANTY
 | 
			
		||||
OF ANY KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING, BUT NOT LIMITED TO,
 | 
			
		||||
THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
 | 
			
		||||
PURPOSE.  THE ENTIRE RISK AS TO THE QUALITY AND PERFORMANCE OF THE PROGRAM
 | 
			
		||||
IS WITH YOU.  SHOULD THE PROGRAM PROVE DEFECTIVE, YOU ASSUME THE COST OF
 | 
			
		||||
ALL NECESSARY SERVICING, REPAIR OR CORRECTION.
 | 
			
		||||
 | 
			
		||||
  16. Limitation of Liability.
 | 
			
		||||
 | 
			
		||||
  IN NO EVENT UNLESS REQUIRED BY APPLICABLE LAW OR AGREED TO IN WRITING
 | 
			
		||||
WILL ANY COPYRIGHT HOLDER, OR ANY OTHER PARTY WHO MODIFIES AND/OR CONVEYS
 | 
			
		||||
THE PROGRAM AS PERMITTED ABOVE, BE LIABLE TO YOU FOR DAMAGES, INCLUDING ANY
 | 
			
		||||
GENERAL, SPECIAL, INCIDENTAL OR CONSEQUENTIAL DAMAGES ARISING OUT OF THE
 | 
			
		||||
USE OR INABILITY TO USE THE PROGRAM (INCLUDING BUT NOT LIMITED TO LOSS OF
 | 
			
		||||
DATA OR DATA BEING RENDERED INACCURATE OR LOSSES SUSTAINED BY YOU OR THIRD
 | 
			
		||||
PARTIES OR A FAILURE OF THE PROGRAM TO OPERATE WITH ANY OTHER PROGRAMS),
 | 
			
		||||
EVEN IF SUCH HOLDER OR OTHER PARTY HAS BEEN ADVISED OF THE POSSIBILITY OF
 | 
			
		||||
SUCH DAMAGES.
 | 
			
		||||
 | 
			
		||||
  17. Interpretation of Sections 15 and 16.
 | 
			
		||||
 | 
			
		||||
  If the disclaimer of warranty and limitation of liability provided
 | 
			
		||||
above cannot be given local legal effect according to their terms,
 | 
			
		||||
reviewing courts shall apply local law that most closely approximates
 | 
			
		||||
an absolute waiver of all civil liability in connection with the
 | 
			
		||||
Program, unless a warranty or assumption of liability accompanies a
 | 
			
		||||
copy of the Program in return for a fee.
 | 
			
		||||
 | 
			
		||||
                     END OF TERMS AND CONDITIONS
 | 
			
		||||
 | 
			
		||||
            How to Apply These Terms to Your New Programs
 | 
			
		||||
 | 
			
		||||
  If you develop a new program, and you want it to be of the greatest
 | 
			
		||||
possible use to the public, the best way to achieve this is to make it
 | 
			
		||||
free software which everyone can redistribute and change under these terms.
 | 
			
		||||
 | 
			
		||||
  To do so, attach the following notices to the program.  It is safest
 | 
			
		||||
to attach them to the start of each source file to most effectively
 | 
			
		||||
state the exclusion of warranty; and each file should have at least
 | 
			
		||||
the "copyright" line and a pointer to where the full notice is found.
 | 
			
		||||
 | 
			
		||||
    <one line to give the program's name and a brief idea of what it does.>
 | 
			
		||||
    Copyright (C) <year>  <name of author>
 | 
			
		||||
 | 
			
		||||
    This program is free software: you can redistribute it and/or modify
 | 
			
		||||
    it under the terms of the GNU Affero General Public License as published by
 | 
			
		||||
    the Free Software Foundation, either version 3 of the License, or
 | 
			
		||||
    (at your option) any later version.
 | 
			
		||||
 | 
			
		||||
    This program is distributed in the hope that it will be useful,
 | 
			
		||||
    but WITHOUT ANY WARRANTY; without even the implied warranty of
 | 
			
		||||
    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
 | 
			
		||||
    GNU Affero General Public License for more details.
 | 
			
		||||
 | 
			
		||||
    You should have received a copy of the GNU Affero General Public License
 | 
			
		||||
    along with this program.  If not, see <http://www.gnu.org/licenses/>.
 | 
			
		||||
 | 
			
		||||
Also add information on how to contact you by electronic and paper mail.
 | 
			
		||||
 | 
			
		||||
  If your software can interact with users remotely through a computer
 | 
			
		||||
network, you should also make sure that it provides a way for users to
 | 
			
		||||
get its source.  For example, if your program is a web application, its
 | 
			
		||||
interface could display a "Source" link that leads users to an archive
 | 
			
		||||
of the code.  There are many ways you could offer source, and different
 | 
			
		||||
solutions will be better for different programs; see section 13 for the
 | 
			
		||||
specific requirements.
 | 
			
		||||
 | 
			
		||||
  You should also get your employer (if you work as a programmer) or school,
 | 
			
		||||
if any, to sign a "copyright disclaimer" for the program, if necessary.
 | 
			
		||||
For more information on this, and how to apply and follow the GNU AGPL, see
 | 
			
		||||
<http://www.gnu.org/licenses/>.
 | 
			
		||||
Copyright (c) 2013, Project OSRM, Dennis Luxen, others
 | 
			
		||||
All rights reserved.
 | 
			
		||||
 | 
			
		||||
Redistribution and use in source and binary forms, with or without modification,
 | 
			
		||||
are permitted provided that the following conditions are met:
 | 
			
		||||
 | 
			
		||||
Redistributions of source code must retain the above copyright notice, this list
 | 
			
		||||
of conditions and the following disclaimer.
 | 
			
		||||
Redistributions in binary form must reproduce the above copyright notice, this
 | 
			
		||||
list of conditions and the following disclaimer in the documentation and/or
 | 
			
		||||
other materials provided with the distribution.
 | 
			
		||||
 | 
			
		||||
THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND
 | 
			
		||||
ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
 | 
			
		||||
WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
 | 
			
		||||
DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR
 | 
			
		||||
ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
 | 
			
		||||
(INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
 | 
			
		||||
LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON
 | 
			
		||||
ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
 | 
			
		||||
(INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
 | 
			
		||||
SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
 | 
			
		||||
 | 
			
		||||
							
								
								
									
										112
									
								
								Library/OSRM.cpp
									
									
									
									
									
								
							
							
						
						
									
										112
									
								
								Library/OSRM.cpp
									
									
									
									
									
								
							@ -1,94 +1,36 @@
 | 
			
		||||
/*
 | 
			
		||||
    open source routing machine
 | 
			
		||||
    Copyright (C) Dennis Luxen, 2010
 | 
			
		||||
 | 
			
		||||
This program is free software; you can redistribute it and/or modify
 | 
			
		||||
it under the terms of the GNU AFFERO General Public License as published by
 | 
			
		||||
the Free Software Foundation; either version 3 of the License, or
 | 
			
		||||
any later version.
 | 
			
		||||
Copyright (c) 2013, Project OSRM, Dennis Luxen, others
 | 
			
		||||
All rights reserved.
 | 
			
		||||
 | 
			
		||||
This program is distributed in the hope that it will be useful,
 | 
			
		||||
but WITHOUT ANY WARRANTY; without even the implied warranty of
 | 
			
		||||
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
 | 
			
		||||
GNU General Public License for more details.
 | 
			
		||||
Redistribution and use in source and binary forms, with or without modification,
 | 
			
		||||
are permitted provided that the following conditions are met:
 | 
			
		||||
 | 
			
		||||
You should have received a copy of the GNU Affero General Public License
 | 
			
		||||
along with this program; if not, write to the Free Software
 | 
			
		||||
Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA
 | 
			
		||||
or see http://www.gnu.org/licenses/agpl.txt.
 | 
			
		||||
 */
 | 
			
		||||
Redistributions of source code must retain the above copyright notice, this list
 | 
			
		||||
of conditions and the following disclaimer.
 | 
			
		||||
Redistributions in binary form must reproduce the above copyright notice, this
 | 
			
		||||
list of conditions and the following disclaimer in the documentation and/or
 | 
			
		||||
other materials provided with the distribution.
 | 
			
		||||
 | 
			
		||||
THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND
 | 
			
		||||
ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
 | 
			
		||||
WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
 | 
			
		||||
DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR
 | 
			
		||||
ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
 | 
			
		||||
(INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
 | 
			
		||||
LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON
 | 
			
		||||
ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
 | 
			
		||||
(INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
 | 
			
		||||
SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
 | 
			
		||||
 | 
			
		||||
*/
 | 
			
		||||
 | 
			
		||||
#include "OSRM.h"
 | 
			
		||||
#include <boost/foreach.hpp>
 | 
			
		||||
 | 
			
		||||
OSRM::OSRM(const char * server_ini_path) {
 | 
			
		||||
    if( !testDataFile(server_ini_path) ){
 | 
			
		||||
        std::string error_message = std::string(server_ini_path) + " not found";
 | 
			
		||||
        throw OSRMException(error_message.c_str());
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    IniFile serverConfig(server_ini_path);
 | 
			
		||||
 | 
			
		||||
    boost::filesystem::path base_path =
 | 
			
		||||
               boost::filesystem::absolute(server_ini_path).parent_path();
 | 
			
		||||
 | 
			
		||||
    if ( !serverConfig.Holds("hsgrData")) {
 | 
			
		||||
        throw OSRMException("no ram index file name in server ini");
 | 
			
		||||
    }
 | 
			
		||||
    if ( !serverConfig.Holds("ramIndex") ) {
 | 
			
		||||
        throw OSRMException("no mem index file name in server ini");
 | 
			
		||||
    }
 | 
			
		||||
    if ( !serverConfig.Holds("fileIndex") ) {
 | 
			
		||||
        throw OSRMException("no nodes file name in server ini");
 | 
			
		||||
    }
 | 
			
		||||
    if ( !serverConfig.Holds("nodesData") ) {
 | 
			
		||||
        throw OSRMException("no nodes file name in server ini");
 | 
			
		||||
    }
 | 
			
		||||
    if ( !serverConfig.Holds("edgesData") ) {
 | 
			
		||||
        throw OSRMException("no edges file name in server ini");
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    boost::filesystem::path hsgr_path = boost::filesystem::absolute(
 | 
			
		||||
            serverConfig.GetParameter("hsgrData"),
 | 
			
		||||
            base_path
 | 
			
		||||
    );
 | 
			
		||||
 | 
			
		||||
    boost::filesystem::path ram_index_path = boost::filesystem::absolute(
 | 
			
		||||
            serverConfig.GetParameter("ramIndex"),
 | 
			
		||||
            base_path
 | 
			
		||||
    );
 | 
			
		||||
 | 
			
		||||
    boost::filesystem::path file_index_path = boost::filesystem::absolute(
 | 
			
		||||
            serverConfig.GetParameter("fileIndex"),
 | 
			
		||||
            base_path
 | 
			
		||||
    );
 | 
			
		||||
 | 
			
		||||
    boost::filesystem::path node_data_path = boost::filesystem::absolute(
 | 
			
		||||
            serverConfig.GetParameter("nodesData"),
 | 
			
		||||
            base_path
 | 
			
		||||
    );
 | 
			
		||||
    boost::filesystem::path edge_data_path = boost::filesystem::absolute(
 | 
			
		||||
            serverConfig.GetParameter("edgesData"),
 | 
			
		||||
            base_path
 | 
			
		||||
    );
 | 
			
		||||
    boost::filesystem::path name_data_path = boost::filesystem::absolute(
 | 
			
		||||
            serverConfig.GetParameter("namesData"),
 | 
			
		||||
            base_path
 | 
			
		||||
    );
 | 
			
		||||
    boost::filesystem::path timestamp_path = boost::filesystem::absolute(
 | 
			
		||||
            serverConfig.GetParameter("timestamp"),
 | 
			
		||||
            base_path
 | 
			
		||||
    );
 | 
			
		||||
 | 
			
		||||
    objects = new QueryObjectsStorage(
 | 
			
		||||
        hsgr_path.string(),
 | 
			
		||||
        ram_index_path.string(),
 | 
			
		||||
        file_index_path.string(),
 | 
			
		||||
        node_data_path.string(),
 | 
			
		||||
        edge_data_path.string(),
 | 
			
		||||
        name_data_path.string(),
 | 
			
		||||
        timestamp_path.string()
 | 
			
		||||
    );
 | 
			
		||||
 | 
			
		||||
OSRM::OSRM(boost::unordered_map<const std::string,boost::filesystem::path>& paths) {
 | 
			
		||||
    objects = new QueryObjectsStorage( paths );
 | 
			
		||||
    RegisterPlugin(new HelloWorldPlugin());
 | 
			
		||||
    RegisterPlugin(new LocatePlugin(objects));
 | 
			
		||||
    RegisterPlugin(new NearestPlugin(objects));
 | 
			
		||||
@ -106,9 +48,9 @@ OSRM::~OSRM() {
 | 
			
		||||
void OSRM::RegisterPlugin(BasePlugin * plugin) {
 | 
			
		||||
    SimpleLogger().Write()  << "loaded plugin: " << plugin->GetDescriptor();
 | 
			
		||||
    if( pluginMap.find(plugin->GetDescriptor()) != pluginMap.end() ) {
 | 
			
		||||
        delete pluginMap[plugin->GetDescriptor()];
 | 
			
		||||
        delete pluginMap.find(plugin->GetDescriptor())->second;
 | 
			
		||||
    }
 | 
			
		||||
    pluginMap.insert(std::make_pair(plugin->GetDescriptor(), plugin));
 | 
			
		||||
    pluginMap.emplace(plugin->GetDescriptor(), plugin);
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
void OSRM::RunQuery(RouteParameters & route_parameters, http::Reply & reply) {
 | 
			
		||||
 | 
			
		||||
@ -1,22 +1,29 @@
 | 
			
		||||
/*
 | 
			
		||||
    open source routing machine
 | 
			
		||||
    Copyright (C) Dennis Luxen, 2010
 | 
			
		||||
 | 
			
		||||
This program is free software; you can redistribute it and/or modify
 | 
			
		||||
it under the terms of the GNU AFFERO General Public License as published by
 | 
			
		||||
the Free Software Foundation; either version 3 of the License, or
 | 
			
		||||
any later version.
 | 
			
		||||
Copyright (c) 2013, Project OSRM, Dennis Luxen, others
 | 
			
		||||
All rights reserved.
 | 
			
		||||
 | 
			
		||||
This program is distributed in the hope that it will be useful,
 | 
			
		||||
but WITHOUT ANY WARRANTY; without even the implied warranty of
 | 
			
		||||
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
 | 
			
		||||
GNU General Public License for more details.
 | 
			
		||||
Redistribution and use in source and binary forms, with or without modification,
 | 
			
		||||
are permitted provided that the following conditions are met:
 | 
			
		||||
 | 
			
		||||
You should have received a copy of the GNU Affero General Public License
 | 
			
		||||
along with this program; if not, write to the Free Software
 | 
			
		||||
Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA
 | 
			
		||||
or see http://www.gnu.org/licenses/agpl.txt.
 | 
			
		||||
 */
 | 
			
		||||
Redistributions of source code must retain the above copyright notice, this list
 | 
			
		||||
of conditions and the following disclaimer.
 | 
			
		||||
Redistributions in binary form must reproduce the above copyright notice, this
 | 
			
		||||
list of conditions and the following disclaimer in the documentation and/or
 | 
			
		||||
other materials provided with the distribution.
 | 
			
		||||
 | 
			
		||||
THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND
 | 
			
		||||
ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
 | 
			
		||||
WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
 | 
			
		||||
DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR
 | 
			
		||||
ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
 | 
			
		||||
(INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
 | 
			
		||||
LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON
 | 
			
		||||
ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
 | 
			
		||||
(INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
 | 
			
		||||
SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
 | 
			
		||||
 | 
			
		||||
*/
 | 
			
		||||
 | 
			
		||||
#ifndef OSRM_H
 | 
			
		||||
#define OSRM_H
 | 
			
		||||
@ -30,9 +37,9 @@ or see http://www.gnu.org/licenses/agpl.txt.
 | 
			
		||||
#include "../Plugins/TimestampPlugin.h"
 | 
			
		||||
#include "../Plugins/ViaRoutePlugin.h"
 | 
			
		||||
#include "../Server/DataStructures/RouteParameters.h"
 | 
			
		||||
#include "../Util/IniFile.h"
 | 
			
		||||
#include "../Util/InputFileUtil.h"
 | 
			
		||||
#include "../Util/OSRMException.h"
 | 
			
		||||
#include "../Util/ProgramOptions.h"
 | 
			
		||||
#include "../Util/SimpleLogger.h"
 | 
			
		||||
#include "../Server/BasicDatastructures.h"
 | 
			
		||||
 | 
			
		||||
@ -47,7 +54,7 @@ class OSRM : boost::noncopyable {
 | 
			
		||||
    typedef boost::unordered_map<std::string, BasePlugin *> PluginMap;
 | 
			
		||||
    QueryObjectsStorage * objects;
 | 
			
		||||
public:
 | 
			
		||||
    OSRM(const char * server_ini_path);
 | 
			
		||||
    OSRM(boost::unordered_map<const std::string,boost::filesystem::path>& paths);
 | 
			
		||||
    ~OSRM();
 | 
			
		||||
    void RunQuery(RouteParameters & route_parameters, http::Reply & reply);
 | 
			
		||||
private:
 | 
			
		||||
 | 
			
		||||
@ -1,22 +1,29 @@
 | 
			
		||||
/*
 | 
			
		||||
    open source routing machine
 | 
			
		||||
    Copyright (C) Dennis Luxen, 2010
 | 
			
		||||
 | 
			
		||||
This program is free software; you can redistribute it and/or modify
 | 
			
		||||
it under the terms of the GNU AFFERO General Public License as published by
 | 
			
		||||
the Free Software Foundation; either version 3 of the License, or
 | 
			
		||||
any later version.
 | 
			
		||||
Copyright (c) 2013, Project OSRM, Dennis Luxen, others
 | 
			
		||||
All rights reserved.
 | 
			
		||||
 | 
			
		||||
This program is distributed in the hope that it will be useful,
 | 
			
		||||
but WITHOUT ANY WARRANTY; without even the implied warranty of
 | 
			
		||||
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
 | 
			
		||||
GNU General Public License for more details.
 | 
			
		||||
Redistribution and use in source and binary forms, with or without modification,
 | 
			
		||||
are permitted provided that the following conditions are met:
 | 
			
		||||
 | 
			
		||||
You should have received a copy of the GNU Affero General Public License
 | 
			
		||||
along with this program; if not, write to the Free Software
 | 
			
		||||
Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA
 | 
			
		||||
or see http://www.gnu.org/licenses/agpl.txt.
 | 
			
		||||
 */
 | 
			
		||||
Redistributions of source code must retain the above copyright notice, this list
 | 
			
		||||
of conditions and the following disclaimer.
 | 
			
		||||
Redistributions in binary form must reproduce the above copyright notice, this
 | 
			
		||||
list of conditions and the following disclaimer in the documentation and/or
 | 
			
		||||
other materials provided with the distribution.
 | 
			
		||||
 | 
			
		||||
THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND
 | 
			
		||||
ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
 | 
			
		||||
WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
 | 
			
		||||
DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR
 | 
			
		||||
ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
 | 
			
		||||
(INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
 | 
			
		||||
LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON
 | 
			
		||||
ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
 | 
			
		||||
(INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
 | 
			
		||||
SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
 | 
			
		||||
 | 
			
		||||
*/
 | 
			
		||||
 | 
			
		||||
#ifndef BASEPLUGIN_H_
 | 
			
		||||
#define BASEPLUGIN_H_
 | 
			
		||||
 | 
			
		||||
@ -1,22 +1,29 @@
 | 
			
		||||
/*
 | 
			
		||||
    open source routing machine
 | 
			
		||||
    Copyright (C) Dennis Luxen, 2010
 | 
			
		||||
 | 
			
		||||
This program is free software; you can redistribute it and/or modify
 | 
			
		||||
it under the terms of the GNU AFFERO General Public License as published by
 | 
			
		||||
the Free Software Foundation; either version 3 of the License, or
 | 
			
		||||
any later version.
 | 
			
		||||
Copyright (c) 2013, Project OSRM, Dennis Luxen, others
 | 
			
		||||
All rights reserved.
 | 
			
		||||
 | 
			
		||||
This program is distributed in the hope that it will be useful,
 | 
			
		||||
but WITHOUT ANY WARRANTY; without even the implied warranty of
 | 
			
		||||
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
 | 
			
		||||
GNU General Public License for more details.
 | 
			
		||||
Redistribution and use in source and binary forms, with or without modification,
 | 
			
		||||
are permitted provided that the following conditions are met:
 | 
			
		||||
 | 
			
		||||
You should have received a copy of the GNU Affero General Public License
 | 
			
		||||
along with this program; if not, write to the Free Software
 | 
			
		||||
Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA
 | 
			
		||||
or see http://www.gnu.org/licenses/agpl.txt.
 | 
			
		||||
 */
 | 
			
		||||
Redistributions of source code must retain the above copyright notice, this list
 | 
			
		||||
of conditions and the following disclaimer.
 | 
			
		||||
Redistributions in binary form must reproduce the above copyright notice, this
 | 
			
		||||
list of conditions and the following disclaimer in the documentation and/or
 | 
			
		||||
other materials provided with the distribution.
 | 
			
		||||
 | 
			
		||||
THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND
 | 
			
		||||
ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
 | 
			
		||||
WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
 | 
			
		||||
DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR
 | 
			
		||||
ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
 | 
			
		||||
(INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
 | 
			
		||||
LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON
 | 
			
		||||
ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
 | 
			
		||||
(INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
 | 
			
		||||
SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
 | 
			
		||||
 | 
			
		||||
*/
 | 
			
		||||
 | 
			
		||||
#ifndef HELLOWORLDPLUGIN_H_
 | 
			
		||||
#define HELLOWORLDPLUGIN_H_
 | 
			
		||||
 | 
			
		||||
@ -1,22 +1,29 @@
 | 
			
		||||
/*
 | 
			
		||||
    open source routing machine
 | 
			
		||||
    Copyright (C) Dennis Luxen, 2010
 | 
			
		||||
 | 
			
		||||
This program is free software; you can redistribute it and/or modify
 | 
			
		||||
it under the terms of the GNU AFFERO General Public License as published by
 | 
			
		||||
the Free Software Foundation; either version 3 of the License, or
 | 
			
		||||
any later version.
 | 
			
		||||
Copyright (c) 2013, Project OSRM, Dennis Luxen, others
 | 
			
		||||
All rights reserved.
 | 
			
		||||
 | 
			
		||||
This program is distributed in the hope that it will be useful,
 | 
			
		||||
but WITHOUT ANY WARRANTY; without even the implied warranty of
 | 
			
		||||
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
 | 
			
		||||
GNU General Public License for more details.
 | 
			
		||||
Redistribution and use in source and binary forms, with or without modification,
 | 
			
		||||
are permitted provided that the following conditions are met:
 | 
			
		||||
 | 
			
		||||
You should have received a copy of the GNU Affero General Public License
 | 
			
		||||
along with this program; if not, write to the Free Software
 | 
			
		||||
Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA
 | 
			
		||||
or see http://www.gnu.org/licenses/agpl.txt.
 | 
			
		||||
 */
 | 
			
		||||
Redistributions of source code must retain the above copyright notice, this list
 | 
			
		||||
of conditions and the following disclaimer.
 | 
			
		||||
Redistributions in binary form must reproduce the above copyright notice, this
 | 
			
		||||
list of conditions and the following disclaimer in the documentation and/or
 | 
			
		||||
other materials provided with the distribution.
 | 
			
		||||
 | 
			
		||||
THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND
 | 
			
		||||
ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
 | 
			
		||||
WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
 | 
			
		||||
DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR
 | 
			
		||||
ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
 | 
			
		||||
(INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
 | 
			
		||||
LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON
 | 
			
		||||
ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
 | 
			
		||||
(INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
 | 
			
		||||
SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
 | 
			
		||||
 | 
			
		||||
*/
 | 
			
		||||
 | 
			
		||||
#ifndef LOCATEPLUGIN_H_
 | 
			
		||||
#define LOCATEPLUGIN_H_
 | 
			
		||||
@ -59,7 +66,7 @@ public:
 | 
			
		||||
        reply.status = http::Reply::ok;
 | 
			
		||||
        reply.content += ("{");
 | 
			
		||||
        reply.content += ("\"version\":0.3,");
 | 
			
		||||
        if(!nodeHelpDesk->FindNearestNodeCoordForLatLon(routeParameters.coordinates[0], result)) {
 | 
			
		||||
        if(!nodeHelpDesk->LocateClosestEndPointForCoordinate(routeParameters.coordinates[0], result)) {
 | 
			
		||||
            reply.content += ("\"status\":207,");
 | 
			
		||||
            reply.content += ("\"mapped_coordinate\":[]");
 | 
			
		||||
        } else {
 | 
			
		||||
 | 
			
		||||
@ -1,22 +1,29 @@
 | 
			
		||||
/*
 | 
			
		||||
    open source routing machine
 | 
			
		||||
    Copyright (C) Dennis Luxen, 2010
 | 
			
		||||
 | 
			
		||||
This program is free software; you can redistribute it and/or modify
 | 
			
		||||
it under the terms of the GNU AFFERO General Public License as published by
 | 
			
		||||
the Free Software Foundation; either version 3 of the License, or
 | 
			
		||||
any later version.
 | 
			
		||||
Copyright (c) 2013, Project OSRM, Dennis Luxen, others
 | 
			
		||||
All rights reserved.
 | 
			
		||||
 | 
			
		||||
This program is distributed in the hope that it will be useful,
 | 
			
		||||
but WITHOUT ANY WARRANTY; without even the implied warranty of
 | 
			
		||||
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
 | 
			
		||||
GNU General Public License for more details.
 | 
			
		||||
Redistribution and use in source and binary forms, with or without modification,
 | 
			
		||||
are permitted provided that the following conditions are met:
 | 
			
		||||
 | 
			
		||||
You should have received a copy of the GNU Affero General Public License
 | 
			
		||||
along with this program; if not, write to the Free Software
 | 
			
		||||
Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA
 | 
			
		||||
or see http://www.gnu.org/licenses/agpl.txt.
 | 
			
		||||
 */
 | 
			
		||||
Redistributions of source code must retain the above copyright notice, this list
 | 
			
		||||
of conditions and the following disclaimer.
 | 
			
		||||
Redistributions in binary form must reproduce the above copyright notice, this
 | 
			
		||||
list of conditions and the following disclaimer in the documentation and/or
 | 
			
		||||
other materials provided with the distribution.
 | 
			
		||||
 | 
			
		||||
THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND
 | 
			
		||||
ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
 | 
			
		||||
WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
 | 
			
		||||
DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR
 | 
			
		||||
ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
 | 
			
		||||
(INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
 | 
			
		||||
LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON
 | 
			
		||||
ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
 | 
			
		||||
(INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
 | 
			
		||||
SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
 | 
			
		||||
 | 
			
		||||
*/
 | 
			
		||||
 | 
			
		||||
#ifndef NearestPlugin_H_
 | 
			
		||||
#define NearestPlugin_H_
 | 
			
		||||
@ -34,11 +41,9 @@ class NearestPlugin : public BasePlugin {
 | 
			
		||||
public:
 | 
			
		||||
    NearestPlugin(QueryObjectsStorage * objects )
 | 
			
		||||
     :
 | 
			
		||||
        names(objects->names),
 | 
			
		||||
        m_query_objects(objects),
 | 
			
		||||
        descriptor_string("nearest")
 | 
			
		||||
    {
 | 
			
		||||
        nodeHelpDesk = objects->nodeHelpDesk;
 | 
			
		||||
 | 
			
		||||
        descriptorTable.insert(std::make_pair(""    , 0)); //default descriptor
 | 
			
		||||
        descriptorTable.insert(std::make_pair("json", 1));
 | 
			
		||||
    }
 | 
			
		||||
@ -53,12 +58,16 @@ public:
 | 
			
		||||
            reply = http::Reply::stockReply(http::Reply::badRequest);
 | 
			
		||||
            return;
 | 
			
		||||
        }
 | 
			
		||||
 | 
			
		||||
        NodeInformationHelpDesk * nodeHelpDesk = m_query_objects->nodeHelpDesk;
 | 
			
		||||
        //query to helpdesk
 | 
			
		||||
        PhantomNode result;
 | 
			
		||||
        nodeHelpDesk->FindPhantomNodeForCoordinate(routeParameters.coordinates[0], result, routeParameters.zoomLevel);
 | 
			
		||||
        nodeHelpDesk->FindPhantomNodeForCoordinate(
 | 
			
		||||
            routeParameters.coordinates[0],
 | 
			
		||||
            result,
 | 
			
		||||
            routeParameters.zoomLevel
 | 
			
		||||
        );
 | 
			
		||||
 | 
			
		||||
        std::string tmp;
 | 
			
		||||
        std::string temp_string;
 | 
			
		||||
        //json
 | 
			
		||||
 | 
			
		||||
        if("" != routeParameters.jsonpParameter) {
 | 
			
		||||
@ -70,23 +79,26 @@ public:
 | 
			
		||||
        reply.content += ("{");
 | 
			
		||||
        reply.content += ("\"version\":0.3,");
 | 
			
		||||
        reply.content += ("\"status\":");
 | 
			
		||||
        if(UINT_MAX != result.edgeBasedNode)
 | 
			
		||||
        if(UINT_MAX != result.edgeBasedNode) {
 | 
			
		||||
            reply.content += "0,";
 | 
			
		||||
        else
 | 
			
		||||
        } else {
 | 
			
		||||
            reply.content += "207,";
 | 
			
		||||
        }
 | 
			
		||||
        reply.content += ("\"mapped_coordinate\":");
 | 
			
		||||
        reply.content += "[";
 | 
			
		||||
        if(UINT_MAX != result.edgeBasedNode) {
 | 
			
		||||
            convertInternalLatLonToString(result.location.lat, tmp);
 | 
			
		||||
            reply.content += tmp;
 | 
			
		||||
            convertInternalLatLonToString(result.location.lon, tmp);
 | 
			
		||||
            convertInternalLatLonToString(result.location.lat, temp_string);
 | 
			
		||||
            reply.content += temp_string;
 | 
			
		||||
            convertInternalLatLonToString(result.location.lon, temp_string);
 | 
			
		||||
            reply.content += ",";
 | 
			
		||||
            reply.content += tmp;
 | 
			
		||||
            reply.content += temp_string;
 | 
			
		||||
        }
 | 
			
		||||
        reply.content += "],";
 | 
			
		||||
        reply.content += "\"name\":\"";
 | 
			
		||||
        if(UINT_MAX != result.edgeBasedNode)
 | 
			
		||||
            reply.content += names[result.nodeBasedEdgeNameID];
 | 
			
		||||
        if(UINT_MAX != result.edgeBasedNode) {
 | 
			
		||||
            m_query_objects->GetName(result.nodeBasedEdgeNameID, temp_string);
 | 
			
		||||
            reply.content += temp_string;
 | 
			
		||||
        }
 | 
			
		||||
        reply.content += "\"";
 | 
			
		||||
        reply.content += ",\"transactionId\":\"OSRM Routing Engine JSON Nearest (v0.3)\"";
 | 
			
		||||
        reply.content += ("}");
 | 
			
		||||
@ -104,14 +116,13 @@ public:
 | 
			
		||||
            reply.headers[2].value = "attachment; filename=\"location.json\"";
 | 
			
		||||
        }
 | 
			
		||||
        reply.headers[0].name = "Content-Length";
 | 
			
		||||
        intToString(reply.content.size(), tmp);
 | 
			
		||||
        reply.headers[0].value = tmp;
 | 
			
		||||
        intToString(reply.content.size(), temp_string);
 | 
			
		||||
        reply.headers[0].value = temp_string;
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
private:
 | 
			
		||||
    NodeInformationHelpDesk * nodeHelpDesk;
 | 
			
		||||
    QueryObjectsStorage * m_query_objects;
 | 
			
		||||
    HashTable<std::string, unsigned> descriptorTable;
 | 
			
		||||
    std::vector<std::string> & names;
 | 
			
		||||
    std::string descriptor_string;
 | 
			
		||||
};
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
@ -1,22 +1,29 @@
 | 
			
		||||
/*
 | 
			
		||||
    open source routing machine
 | 
			
		||||
    Copyright (C) Dennis Luxen, 2010
 | 
			
		||||
 | 
			
		||||
This program is free software; you can redistribute it and/or modify
 | 
			
		||||
it under the terms of the GNU AFFERO General Public License as published by
 | 
			
		||||
the Free Software Foundation; either version 3 of the License, or
 | 
			
		||||
any later version.
 | 
			
		||||
Copyright (c) 2013, Project OSRM, Dennis Luxen, others
 | 
			
		||||
All rights reserved.
 | 
			
		||||
 | 
			
		||||
This program is distributed in the hope that it will be useful,
 | 
			
		||||
but WITHOUT ANY WARRANTY; without even the implied warranty of
 | 
			
		||||
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
 | 
			
		||||
GNU General Public License for more details.
 | 
			
		||||
Redistribution and use in source and binary forms, with or without modification,
 | 
			
		||||
are permitted provided that the following conditions are met:
 | 
			
		||||
 | 
			
		||||
You should have received a copy of the GNU Affero General Public License
 | 
			
		||||
along with this program; if not, write to the Free Software
 | 
			
		||||
Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA
 | 
			
		||||
or see http://www.gnu.org/licenses/agpl.txt.
 | 
			
		||||
 */
 | 
			
		||||
Redistributions of source code must retain the above copyright notice, this list
 | 
			
		||||
of conditions and the following disclaimer.
 | 
			
		||||
Redistributions in binary form must reproduce the above copyright notice, this
 | 
			
		||||
list of conditions and the following disclaimer in the documentation and/or
 | 
			
		||||
other materials provided with the distribution.
 | 
			
		||||
 | 
			
		||||
THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND
 | 
			
		||||
ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
 | 
			
		||||
WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
 | 
			
		||||
DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR
 | 
			
		||||
ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
 | 
			
		||||
(INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
 | 
			
		||||
LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON
 | 
			
		||||
ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
 | 
			
		||||
(INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
 | 
			
		||||
SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
 | 
			
		||||
 | 
			
		||||
*/
 | 
			
		||||
 | 
			
		||||
#ifndef TIMESTAMPPLUGIN_H_
 | 
			
		||||
#define TIMESTAMPPLUGIN_H_
 | 
			
		||||
 | 
			
		||||
@ -1,22 +1,29 @@
 | 
			
		||||
/*
 | 
			
		||||
    open source routing machine
 | 
			
		||||
    Copyright (C) Dennis Luxen, others 2010
 | 
			
		||||
 | 
			
		||||
This program is free software; you can redistribute it and/or modify
 | 
			
		||||
it under the terms of the GNU AFFERO General Public License as published by
 | 
			
		||||
the Free Software Foundation; either version 3 of the License, or
 | 
			
		||||
any later version.
 | 
			
		||||
Copyright (c) 2013, Project OSRM, Dennis Luxen, others
 | 
			
		||||
All rights reserved.
 | 
			
		||||
 | 
			
		||||
This program is distributed in the hope that it will be useful,
 | 
			
		||||
but WITHOUT ANY WARRANTY; without even the implied warranty of
 | 
			
		||||
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
 | 
			
		||||
GNU General Public License for more details.
 | 
			
		||||
Redistribution and use in source and binary forms, with or without modification,
 | 
			
		||||
are permitted provided that the following conditions are met:
 | 
			
		||||
 | 
			
		||||
You should have received a copy of the GNU Affero General Public License
 | 
			
		||||
along with this program; if not, write to the Free Software
 | 
			
		||||
Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA
 | 
			
		||||
or see http://www.gnu.org/licenses/agpl.txt.
 | 
			
		||||
 */
 | 
			
		||||
Redistributions of source code must retain the above copyright notice, this list
 | 
			
		||||
of conditions and the following disclaimer.
 | 
			
		||||
Redistributions in binary form must reproduce the above copyright notice, this
 | 
			
		||||
list of conditions and the following disclaimer in the documentation and/or
 | 
			
		||||
other materials provided with the distribution.
 | 
			
		||||
 | 
			
		||||
THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND
 | 
			
		||||
ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
 | 
			
		||||
WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
 | 
			
		||||
DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR
 | 
			
		||||
ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
 | 
			
		||||
(INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
 | 
			
		||||
LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON
 | 
			
		||||
ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
 | 
			
		||||
(INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
 | 
			
		||||
SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
 | 
			
		||||
 | 
			
		||||
*/
 | 
			
		||||
 | 
			
		||||
#ifndef VIAROUTEPLUGIN_H_
 | 
			
		||||
#define VIAROUTEPLUGIN_H_
 | 
			
		||||
@ -24,7 +31,6 @@ or see http://www.gnu.org/licenses/agpl.txt.
 | 
			
		||||
#include "BasePlugin.h"
 | 
			
		||||
 | 
			
		||||
#include "../Algorithms/ObjectToBase64.h"
 | 
			
		||||
#include "../DataStructures/HashTable.h"
 | 
			
		||||
#include "../DataStructures/QueryEdge.h"
 | 
			
		||||
#include "../DataStructures/StaticGraph.h"
 | 
			
		||||
#include "../DataStructures/SearchEngine.h"
 | 
			
		||||
@ -35,6 +41,8 @@ or see http://www.gnu.org/licenses/agpl.txt.
 | 
			
		||||
#include "../Util/SimpleLogger.h"
 | 
			
		||||
#include "../Util/StringUtil.h"
 | 
			
		||||
 | 
			
		||||
#include <boost/unordered_map.hpp>
 | 
			
		||||
 | 
			
		||||
#include <cstdlib>
 | 
			
		||||
 | 
			
		||||
#include <string>
 | 
			
		||||
@ -43,7 +51,6 @@ or see http://www.gnu.org/licenses/agpl.txt.
 | 
			
		||||
class ViaRoutePlugin : public BasePlugin {
 | 
			
		||||
private:
 | 
			
		||||
    NodeInformationHelpDesk * nodeHelpDesk;
 | 
			
		||||
    std::vector<std::string> & names;
 | 
			
		||||
    StaticGraph<QueryEdge::EdgeData> * graph;
 | 
			
		||||
    HashTable<std::string, unsigned> descriptorTable;
 | 
			
		||||
    SearchEngine * searchEnginePtr;
 | 
			
		||||
@ -51,17 +58,17 @@ public:
 | 
			
		||||
 | 
			
		||||
    ViaRoutePlugin(QueryObjectsStorage * objects)
 | 
			
		||||
     :
 | 
			
		||||
        names(objects->names),
 | 
			
		||||
        // objects(objects),
 | 
			
		||||
        descriptor_string("viaroute")
 | 
			
		||||
    {
 | 
			
		||||
        nodeHelpDesk = objects->nodeHelpDesk;
 | 
			
		||||
        graph = objects->graph;
 | 
			
		||||
 | 
			
		||||
        searchEnginePtr = new SearchEngine(graph, nodeHelpDesk, names);
 | 
			
		||||
        searchEnginePtr = new SearchEngine(objects);
 | 
			
		||||
 | 
			
		||||
        descriptorTable.insert(std::make_pair(""    , 0));
 | 
			
		||||
        descriptorTable.insert(std::make_pair("json", 0));
 | 
			
		||||
        descriptorTable.insert(std::make_pair("gpx" , 1));
 | 
			
		||||
        // descriptorTable.emplace(""    , 0);
 | 
			
		||||
        descriptorTable.emplace("json", 0);
 | 
			
		||||
        descriptorTable.emplace("gpx" , 1);
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    virtual ~ViaRoutePlugin() {
 | 
			
		||||
@ -93,7 +100,7 @@ public:
 | 
			
		||||
            if(checksumOK && i < routeParameters.hints.size() && "" != routeParameters.hints[i]) {
 | 
			
		||||
//                SimpleLogger().Write() <<"Decoding hint: " << routeParameters.hints[i] << " for location index " << i;
 | 
			
		||||
                DecodeObjectFromBase64(routeParameters.hints[i], phantomNodeVector[i]);
 | 
			
		||||
                if(phantomNodeVector[i].isValid(nodeHelpDesk->getNumberOfNodes())) {
 | 
			
		||||
                if(phantomNodeVector[i].isValid(nodeHelpDesk->GetNumberOfNodes())) {
 | 
			
		||||
//                    SimpleLogger().Write() << "Decoded hint " << i << " successfully";
 | 
			
		||||
                    continue;
 | 
			
		||||
                }
 | 
			
		||||
@ -130,7 +137,11 @@ public:
 | 
			
		||||
        }
 | 
			
		||||
 | 
			
		||||
        _DescriptorConfig descriptorConfig;
 | 
			
		||||
        unsigned descriptorType = descriptorTable[routeParameters.outputFormat];
 | 
			
		||||
 | 
			
		||||
        unsigned descriptorType = 0;
 | 
			
		||||
        if(descriptorTable.find(routeParameters.outputFormat) != descriptorTable.end() ) {
 | 
			
		||||
            descriptorType = descriptorTable.find(routeParameters.outputFormat)->second;
 | 
			
		||||
        }
 | 
			
		||||
        descriptorConfig.z = routeParameters.zoomLevel;
 | 
			
		||||
        descriptorConfig.instructions = routeParameters.printInstructions;
 | 
			
		||||
        descriptorConfig.geometry = routeParameters.geometry;
 | 
			
		||||
 | 
			
		||||
							
								
								
									
										27
									
								
								README.TXT
									
									
									
									
									
								
							
							
						
						
									
										27
									
								
								README.TXT
									
									
									
									
									
								
							@ -1,27 +0,0 @@
 | 
			
		||||
For instructions on how to compile and run OSRM, please consult the Wiki at
 | 
			
		||||
 | 
			
		||||
https://github.com/DennisOSRM/Project-OSRM/wiki
 | 
			
		||||
 | 
			
		||||
or use our free and daily updated online service at
 | 
			
		||||
 | 
			
		||||
http://map.project-osrm.org
 | 
			
		||||
 | 
			
		||||
When using the code in a scientific publication, please cite
 | 
			
		||||
 | 
			
		||||
@inproceedings{luxen-vetter-2011,
 | 
			
		||||
 author = {Luxen, Dennis and Vetter, Christian},
 | 
			
		||||
 title = {Real-time routing with OpenStreetMap data},
 | 
			
		||||
 booktitle = {Proceedings of the 19th ACM SIGSPATIAL International Conference on Advances in Geographic Information Systems},
 | 
			
		||||
 series = {GIS '11},
 | 
			
		||||
 year = {2011},
 | 
			
		||||
 isbn = {978-1-4503-1031-4},
 | 
			
		||||
 location = {Chicago, Illinois},
 | 
			
		||||
 pages = {513--516},
 | 
			
		||||
 numpages = {4},
 | 
			
		||||
 url = {http://doi.acm.org/10.1145/2093973.2094062},
 | 
			
		||||
 doi = {10.1145/2093973.2094062},
 | 
			
		||||
 acmid = {2094062},
 | 
			
		||||
 publisher = {ACM},
 | 
			
		||||
 address = {New York, NY, USA},
 | 
			
		||||
} 
 | 
			
		||||
 | 
			
		||||
							
								
								
									
										52
									
								
								Rakefile
									
									
									
									
									
								
							
							
						
						
									
										52
									
								
								Rakefile
									
									
									
									
									
								
							@ -59,23 +59,6 @@ def wait_for_shutdown name
 | 
			
		||||
  raise "*** Could not terminate #{name}."
 | 
			
		||||
end
 | 
			
		||||
 | 
			
		||||
def write_server_ini osm_file
 | 
			
		||||
  s=<<-EOF
 | 
			
		||||
  Threads = 1
 | 
			
		||||
  IP = 0.0.0.0
 | 
			
		||||
  Port = #{OSRM_PORT}
 | 
			
		||||
 | 
			
		||||
  hsgrData=#{osm_file}.osrm.hsgr
 | 
			
		||||
  nodesData=#{osm_file}.osrm.nodes
 | 
			
		||||
  edgesData=#{osm_file}.osrm.edges
 | 
			
		||||
  ramIndex=#{osm_file}.osrm.ramIndex
 | 
			
		||||
  fileIndex=#{osm_file}.osrm.fileIndex
 | 
			
		||||
  namesData=#{osm_file}.osrm.names
 | 
			
		||||
  timestamp=#{osm_file}.osrm.timestamp
 | 
			
		||||
  EOF
 | 
			
		||||
  File.open( 'server.ini', 'w') {|f| f.write( s ) }
 | 
			
		||||
end
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
desc "Rebuild and run tests."
 | 
			
		||||
task :default => [:build]
 | 
			
		||||
@ -93,17 +76,10 @@ end
 | 
			
		||||
 | 
			
		||||
desc "Setup config files."
 | 
			
		||||
task :setup do
 | 
			
		||||
  Dir.mkdir "#{DATA_FOLDER}" unless File.exist? "#{DATA_FOLDER}"
 | 
			
		||||
  ['server.ini','extractor.ini','contractor.ini'].each do |file|
 | 
			
		||||
    unless File.exist? "#{DATA_FOLDER}/#{file}"
 | 
			
		||||
      puts "Copying #{file} template to #{DATA_FOLDER}/#{file}" 
 | 
			
		||||
      FileUtils.cp file, "#{DATA_FOLDER}/#{file}"
 | 
			
		||||
    end
 | 
			
		||||
  end
 | 
			
		||||
end
 | 
			
		||||
 | 
			
		||||
desc "Download OSM data."
 | 
			
		||||
task :download => :setup do
 | 
			
		||||
task :download do
 | 
			
		||||
  Dir.mkdir "#{DATA_FOLDER}" unless File.exist? "#{DATA_FOLDER}"
 | 
			
		||||
  puts "Downloading..."
 | 
			
		||||
  puts "curl http://download.geofabrik.de/europe/#{osm_data_country}-latest.osm.pbf -o #{DATA_FOLDER}/#{osm_data_country}.osm.pbf"
 | 
			
		||||
@ -122,26 +98,20 @@ task :crop do
 | 
			
		||||
end
 | 
			
		||||
 | 
			
		||||
desc "Reprocess OSM data."
 | 
			
		||||
task :process => :setup do
 | 
			
		||||
  Dir.chdir DATA_FOLDER do
 | 
			
		||||
    raise "Error while extracting data." unless system "../#{BUILD_FOLDER}/osrm-extract #{osm_data_area_name}.osm.pbf #{PROFILES_FOLDER}/#{PROFILE}.lua"
 | 
			
		||||
    puts
 | 
			
		||||
    raise "Error while preparing data." unless system "../#{BUILD_FOLDER}/osrm-prepare #{osm_data_area_name}.osrm #{osm_data_area_name}.osrm.restrictions #{PROFILES_FOLDER}/#{PROFILE}.lua"
 | 
			
		||||
    puts
 | 
			
		||||
  end
 | 
			
		||||
task :process => [:extract,:prepare] do
 | 
			
		||||
end
 | 
			
		||||
 | 
			
		||||
desc "Extract OSM data."
 | 
			
		||||
task :extract => :setup do
 | 
			
		||||
task :extract do
 | 
			
		||||
  Dir.chdir DATA_FOLDER do
 | 
			
		||||
    raise "Error while extracting data." unless system "../#{BUILD_FOLDER}/osrm-extract #{osm_data_area_name}.osm.pbf ../profiles/#{PROFILE}.lua"
 | 
			
		||||
    raise "Error while extracting data." unless system "../#{BUILD_FOLDER}/osrm-extract #{osm_data_area_name}.osm.pbf --profile ../profiles/#{PROFILE}.lua"
 | 
			
		||||
  end
 | 
			
		||||
end
 | 
			
		||||
 | 
			
		||||
desc "Prepare OSM data."
 | 
			
		||||
task :prepare => :setup do
 | 
			
		||||
task :prepare do
 | 
			
		||||
  Dir.chdir DATA_FOLDER do
 | 
			
		||||
    raise "Error while preparing data." unless system "../#{BUILD_FOLDER}/osrm-prepare #{osm_data_area_name}.osrm #{osm_data_area_name}.osrm.restrictions ../profiles/#{PROFILE}.lua"
 | 
			
		||||
    raise "Error while preparing data." unless system "../#{BUILD_FOLDER}/osrm-prepare #{osm_data_area_name}.osrm --profile ../profiles/#{PROFILE}.lua"
 | 
			
		||||
  end
 | 
			
		||||
end
 | 
			
		||||
 | 
			
		||||
@ -158,19 +128,17 @@ task :test do
 | 
			
		||||
end
 | 
			
		||||
 | 
			
		||||
desc "Run the routing server in the terminal. Press Ctrl-C to stop."
 | 
			
		||||
task :run => :setup do
 | 
			
		||||
task :run do
 | 
			
		||||
  Dir.chdir DATA_FOLDER do
 | 
			
		||||
    write_server_ini osm_data_area_name
 | 
			
		||||
    system "../#{BUILD_FOLDER}/osrm-routed"
 | 
			
		||||
    system "../#{BUILD_FOLDER}/osrm-routed #{osm_data_area_name}.osrm --port #{OSRM_PORT}"
 | 
			
		||||
  end
 | 
			
		||||
end
 | 
			
		||||
 | 
			
		||||
desc "Launch the routing server in the background. Use rake:down to stop it."
 | 
			
		||||
task :up => :setup do
 | 
			
		||||
task :up do
 | 
			
		||||
  Dir.chdir DATA_FOLDER do
 | 
			
		||||
    abort("Already up.") if up?
 | 
			
		||||
    write_server_ini osm_data_area_name
 | 
			
		||||
    pipe = IO.popen("../#{BUILD_FOLDER}/osrm-routed 1>>osrm-routed.log 2>>osrm-routed.log")
 | 
			
		||||
    pipe = IO.popen("../#{BUILD_FOLDER}/osrm-routed #{osm_data_area_name}.osrm --port #{OSRM_PORT} 1>>osrm-routed.log 2>>osrm-routed.log")
 | 
			
		||||
    timeout = 5
 | 
			
		||||
    (timeout*10).times do
 | 
			
		||||
      begin
 | 
			
		||||
 | 
			
		||||
@ -1,22 +1,29 @@
 | 
			
		||||
/*
 | 
			
		||||
    open source routing machine
 | 
			
		||||
    Copyright (C) Dennis Luxen, others 2010
 | 
			
		||||
 | 
			
		||||
This program is free software; you can redistribute it and/or modify
 | 
			
		||||
it under the terms of the GNU AFFERO General Public License as published by
 | 
			
		||||
the Free Software Foundation; either version 3 of the License, or
 | 
			
		||||
any later version.
 | 
			
		||||
Copyright (c) 2013, Project OSRM, Dennis Luxen, others
 | 
			
		||||
All rights reserved.
 | 
			
		||||
 | 
			
		||||
This program is distributed in the hope that it will be useful,
 | 
			
		||||
but WITHOUT ANY WARRANTY; without even the implied warranty of
 | 
			
		||||
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
 | 
			
		||||
GNU General Public License for more details.
 | 
			
		||||
Redistribution and use in source and binary forms, with or without modification,
 | 
			
		||||
are permitted provided that the following conditions are met:
 | 
			
		||||
 | 
			
		||||
You should have received a copy of the GNU Affero General Public License
 | 
			
		||||
along with this program; if not, write to the Free Software
 | 
			
		||||
Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA
 | 
			
		||||
or see http://www.gnu.org/licenses/agpl.txt.
 | 
			
		||||
 */
 | 
			
		||||
Redistributions of source code must retain the above copyright notice, this list
 | 
			
		||||
of conditions and the following disclaimer.
 | 
			
		||||
Redistributions in binary form must reproduce the above copyright notice, this
 | 
			
		||||
list of conditions and the following disclaimer in the documentation and/or
 | 
			
		||||
other materials provided with the distribution.
 | 
			
		||||
 | 
			
		||||
THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND
 | 
			
		||||
ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
 | 
			
		||||
WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
 | 
			
		||||
DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR
 | 
			
		||||
ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
 | 
			
		||||
(INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
 | 
			
		||||
LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON
 | 
			
		||||
ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
 | 
			
		||||
(INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
 | 
			
		||||
SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
 | 
			
		||||
 | 
			
		||||
*/
 | 
			
		||||
 | 
			
		||||
#ifndef ALTERNATIVEROUTES_H_
 | 
			
		||||
#define ALTERNATIVEROUTES_H_
 | 
			
		||||
 | 
			
		||||
@ -1,24 +1,29 @@
 | 
			
		||||
/*
 | 
			
		||||
    open source routing machine
 | 
			
		||||
    Copyright (C) Dennis Luxen, others 2010
 | 
			
		||||
 | 
			
		||||
This program is free software; you can redistribute it and/or modify
 | 
			
		||||
it under the terms of the GNU AFFERO General Public License as published by
 | 
			
		||||
the Free Software Foundation; either version 3 of the License, or
 | 
			
		||||
any later version.
 | 
			
		||||
Copyright (c) 2013, Project OSRM, Dennis Luxen, others
 | 
			
		||||
All rights reserved.
 | 
			
		||||
 | 
			
		||||
This program is distributed in the hope that it will be useful,
 | 
			
		||||
but WITHOUT ANY WARRANTY; without even the implied warranty of
 | 
			
		||||
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
 | 
			
		||||
GNU General Public License for more details.
 | 
			
		||||
Redistribution and use in source and binary forms, with or without modification,
 | 
			
		||||
are permitted provided that the following conditions are met:
 | 
			
		||||
 | 
			
		||||
You should have received a copy of the GNU Affero General Public License
 | 
			
		||||
along with this program; if not, write to the Free Software
 | 
			
		||||
Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA
 | 
			
		||||
or see http://www.gnu.org/licenses/agpl.txt.
 | 
			
		||||
 */
 | 
			
		||||
Redistributions of source code must retain the above copyright notice, this list
 | 
			
		||||
of conditions and the following disclaimer.
 | 
			
		||||
Redistributions in binary form must reproduce the above copyright notice, this
 | 
			
		||||
list of conditions and the following disclaimer in the documentation and/or
 | 
			
		||||
other materials provided with the distribution.
 | 
			
		||||
 | 
			
		||||
THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND
 | 
			
		||||
ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
 | 
			
		||||
WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
 | 
			
		||||
DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR
 | 
			
		||||
ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
 | 
			
		||||
(INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
 | 
			
		||||
LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON
 | 
			
		||||
ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
 | 
			
		||||
(INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
 | 
			
		||||
SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
 | 
			
		||||
 | 
			
		||||
*/
 | 
			
		||||
 | 
			
		||||
#ifndef BASICROUTINGINTERFACE_H_
 | 
			
		||||
#define BASICROUTINGINTERFACE_H_
 | 
			
		||||
@ -148,7 +153,14 @@ public:
 | 
			
		||||
                recursionStack.push(std::make_pair(edge.first, middle));
 | 
			
		||||
            } else {
 | 
			
		||||
                assert(!ed.shortcut);
 | 
			
		||||
                unpackedPath.push_back(_PathData(ed.id, _queryData.nodeHelpDesk->getNameIndexFromEdgeID(ed.id), _queryData.nodeHelpDesk->getTurnInstructionFromEdgeID(ed.id), ed.distance) );
 | 
			
		||||
                unpackedPath.push_back(
 | 
			
		||||
                    _PathData(
 | 
			
		||||
                        ed.id,
 | 
			
		||||
                        _queryData.nodeHelpDesk->GetNameIndexFromEdgeID(ed.id),
 | 
			
		||||
                        _queryData.nodeHelpDesk->GetTurnInstructionForEdgeID(ed.id),
 | 
			
		||||
                        ed.distance
 | 
			
		||||
                    )
 | 
			
		||||
                );
 | 
			
		||||
            }
 | 
			
		||||
        }
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
@ -1,24 +1,29 @@
 | 
			
		||||
/*
 | 
			
		||||
    open source routing machine
 | 
			
		||||
    Copyright (C) Dennis Luxen, others 2010
 | 
			
		||||
 | 
			
		||||
This program is free software; you can redistribute it and/or modify
 | 
			
		||||
it under the terms of the GNU AFFERO General Public License as published by
 | 
			
		||||
the Free Software Foundation; either version 3 of the License, or
 | 
			
		||||
any later version.
 | 
			
		||||
Copyright (c) 2013, Project OSRM, Dennis Luxen, others
 | 
			
		||||
All rights reserved.
 | 
			
		||||
 | 
			
		||||
This program is distributed in the hope that it will be useful,
 | 
			
		||||
but WITHOUT ANY WARRANTY; without even the implied warranty of
 | 
			
		||||
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
 | 
			
		||||
GNU General Public License for more details.
 | 
			
		||||
Redistribution and use in source and binary forms, with or without modification,
 | 
			
		||||
are permitted provided that the following conditions are met:
 | 
			
		||||
 | 
			
		||||
You should have received a copy of the GNU Affero General Public License
 | 
			
		||||
along with this program; if not, write to the Free Software
 | 
			
		||||
Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA
 | 
			
		||||
or see http://www.gnu.org/licenses/agpl.txt.
 | 
			
		||||
 */
 | 
			
		||||
Redistributions of source code must retain the above copyright notice, this list
 | 
			
		||||
of conditions and the following disclaimer.
 | 
			
		||||
Redistributions in binary form must reproduce the above copyright notice, this
 | 
			
		||||
list of conditions and the following disclaimer in the documentation and/or
 | 
			
		||||
other materials provided with the distribution.
 | 
			
		||||
 | 
			
		||||
THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND
 | 
			
		||||
ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
 | 
			
		||||
WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
 | 
			
		||||
DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR
 | 
			
		||||
ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
 | 
			
		||||
(INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
 | 
			
		||||
LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON
 | 
			
		||||
ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
 | 
			
		||||
(INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
 | 
			
		||||
SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
 | 
			
		||||
 | 
			
		||||
*/
 | 
			
		||||
 | 
			
		||||
#ifndef SHORTESTPATHROUTING_H_
 | 
			
		||||
#define SHORTESTPATHROUTING_H_
 | 
			
		||||
@ -72,15 +77,15 @@ public:
 | 
			
		||||
 | 
			
		||||
            //insert new starting nodes into forward heap, adjusted by previous distances.
 | 
			
		||||
            if(searchFrom1stStartNode) {
 | 
			
		||||
                forward_heap1.Insert(phantomNodePair.startPhantom.edgeBasedNode, -phantomNodePair.startPhantom.weight1, phantomNodePair.startPhantom.edgeBasedNode);
 | 
			
		||||
                forward_heap1.Insert(phantomNodePair.startPhantom.edgeBasedNode, distance1-phantomNodePair.startPhantom.weight1, phantomNodePair.startPhantom.edgeBasedNode);
 | 
			
		||||
                // INFO("fw1: " << phantomNodePair.startPhantom.edgeBasedNode << "´, w: " << -phantomNodePair.startPhantom.weight1);
 | 
			
		||||
                forward_heap2.Insert(phantomNodePair.startPhantom.edgeBasedNode, -phantomNodePair.startPhantom.weight1, phantomNodePair.startPhantom.edgeBasedNode);
 | 
			
		||||
                forward_heap2.Insert(phantomNodePair.startPhantom.edgeBasedNode, distance1-phantomNodePair.startPhantom.weight1, phantomNodePair.startPhantom.edgeBasedNode);
 | 
			
		||||
                // INFO("fw2: " << phantomNodePair.startPhantom.edgeBasedNode << "´, w: " << -phantomNodePair.startPhantom.weight1);
 | 
			
		||||
           }
 | 
			
		||||
            if(phantomNodePair.startPhantom.isBidirected() && searchFrom2ndStartNode) {
 | 
			
		||||
                forward_heap1.Insert(phantomNodePair.startPhantom.edgeBasedNode+1, -phantomNodePair.startPhantom.weight2, phantomNodePair.startPhantom.edgeBasedNode+1);
 | 
			
		||||
                forward_heap1.Insert(phantomNodePair.startPhantom.edgeBasedNode+1, distance2-phantomNodePair.startPhantom.weight2, phantomNodePair.startPhantom.edgeBasedNode+1);
 | 
			
		||||
                // INFO("fw1: " << phantomNodePair.startPhantom.edgeBasedNode+1 << "´, w: " << -phantomNodePair.startPhantom.weight2);
 | 
			
		||||
                forward_heap2.Insert(phantomNodePair.startPhantom.edgeBasedNode+1, -phantomNodePair.startPhantom.weight2, phantomNodePair.startPhantom.edgeBasedNode+1);
 | 
			
		||||
                forward_heap2.Insert(phantomNodePair.startPhantom.edgeBasedNode+1, distance2-phantomNodePair.startPhantom.weight2, phantomNodePair.startPhantom.edgeBasedNode+1);
 | 
			
		||||
                // INFO("fw2: " << phantomNodePair.startPhantom.edgeBasedNode+1 << "´, w: " << -phantomNodePair.startPhantom.weight2);
 | 
			
		||||
            }
 | 
			
		||||
 | 
			
		||||
@ -160,11 +165,9 @@ public:
 | 
			
		||||
                    if( *(packedPath1.end()-1) == *(temporaryPackedPath1.begin())) {
 | 
			
		||||
                        packedPath2.clear();
 | 
			
		||||
                        packedPath2.insert(packedPath2.end(), packedPath1.begin(), packedPath1.end());
 | 
			
		||||
                        distance2 = distance1;
 | 
			
		||||
                    } else {
 | 
			
		||||
                        packedPath1.clear();
 | 
			
		||||
                        packedPath1.insert(packedPath1.end(), packedPath2.begin(), packedPath2.end());
 | 
			
		||||
                        distance1 = distance2;
 | 
			
		||||
                    }
 | 
			
		||||
                } else  {
 | 
			
		||||
                    //packed paths 1 and 2 may need to switch.
 | 
			
		||||
@ -184,8 +187,8 @@ public:
 | 
			
		||||
                searchFrom2ndStartNode &= !(lastNodeID == phantomNodePair.targetPhantom.edgeBasedNode);
 | 
			
		||||
            }
 | 
			
		||||
 | 
			
		||||
            distance1 += _localUpperbound1;
 | 
			
		||||
            distance2 += _localUpperbound2;
 | 
			
		||||
            distance1 = _localUpperbound1;
 | 
			
		||||
            distance2 = _localUpperbound2;
 | 
			
		||||
        }
 | 
			
		||||
 | 
			
		||||
        if(distance1 > distance2){
 | 
			
		||||
 | 
			
		||||
@ -1,24 +1,29 @@
 | 
			
		||||
/*
 | 
			
		||||
    open source routing machine
 | 
			
		||||
    Copyright (C) Dennis Luxen, others 2010
 | 
			
		||||
 | 
			
		||||
This program is free software; you can redistribute it and/or modify
 | 
			
		||||
it under the terms of the GNU AFFERO General Public License as published by
 | 
			
		||||
the Free Software Foundation; either version 3 of the License, or
 | 
			
		||||
any later version.
 | 
			
		||||
Copyright (c) 2013, Project OSRM, Dennis Luxen, others
 | 
			
		||||
All rights reserved.
 | 
			
		||||
 | 
			
		||||
This program is distributed in the hope that it will be useful,
 | 
			
		||||
but WITHOUT ANY WARRANTY; without even the implied warranty of
 | 
			
		||||
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
 | 
			
		||||
GNU General Public License for more details.
 | 
			
		||||
Redistribution and use in source and binary forms, with or without modification,
 | 
			
		||||
are permitted provided that the following conditions are met:
 | 
			
		||||
 | 
			
		||||
You should have received a copy of the GNU Affero General Public License
 | 
			
		||||
along with this program; if not, write to the Free Software
 | 
			
		||||
Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA
 | 
			
		||||
or see http://www.gnu.org/licenses/agpl.txt.
 | 
			
		||||
 */
 | 
			
		||||
Redistributions of source code must retain the above copyright notice, this list
 | 
			
		||||
of conditions and the following disclaimer.
 | 
			
		||||
Redistributions in binary form must reproduce the above copyright notice, this
 | 
			
		||||
list of conditions and the following disclaimer in the documentation and/or
 | 
			
		||||
other materials provided with the distribution.
 | 
			
		||||
 | 
			
		||||
THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND
 | 
			
		||||
ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
 | 
			
		||||
WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
 | 
			
		||||
DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR
 | 
			
		||||
ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
 | 
			
		||||
(INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
 | 
			
		||||
LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON
 | 
			
		||||
ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
 | 
			
		||||
(INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
 | 
			
		||||
SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
 | 
			
		||||
 | 
			
		||||
*/
 | 
			
		||||
 | 
			
		||||
#ifndef APIGRAMMAR_H_
 | 
			
		||||
#define APIGRAMMAR_H_
 | 
			
		||||
 | 
			
		||||
@ -1,21 +1,28 @@
 | 
			
		||||
/*
 | 
			
		||||
    open source routing machine
 | 
			
		||||
    Copyright (C) Dennis Luxen, others 2010
 | 
			
		||||
 | 
			
		||||
This program is free software; you can redistribute it and/or modify
 | 
			
		||||
it under the terms of the GNU AFFERO General Public License as published by
 | 
			
		||||
the Free Software Foundation; either version 3 of the License, or
 | 
			
		||||
any later version.
 | 
			
		||||
Copyright (c) 2013, Project OSRM, Dennis Luxen, others
 | 
			
		||||
All rights reserved.
 | 
			
		||||
 | 
			
		||||
This program is distributed in the hope that it will be useful,
 | 
			
		||||
but WITHOUT ANY WARRANTY; without even the implied warranty of
 | 
			
		||||
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
 | 
			
		||||
GNU General Public License for more details.
 | 
			
		||||
Redistribution and use in source and binary forms, with or without modification,
 | 
			
		||||
are permitted provided that the following conditions are met:
 | 
			
		||||
 | 
			
		||||
Redistributions of source code must retain the above copyright notice, this list
 | 
			
		||||
of conditions and the following disclaimer.
 | 
			
		||||
Redistributions in binary form must reproduce the above copyright notice, this
 | 
			
		||||
list of conditions and the following disclaimer in the documentation and/or
 | 
			
		||||
other materials provided with the distribution.
 | 
			
		||||
 | 
			
		||||
THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND
 | 
			
		||||
ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
 | 
			
		||||
WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
 | 
			
		||||
DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR
 | 
			
		||||
ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
 | 
			
		||||
(INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
 | 
			
		||||
LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON
 | 
			
		||||
ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
 | 
			
		||||
(INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
 | 
			
		||||
SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
 | 
			
		||||
 | 
			
		||||
You should have received a copy of the GNU Affero General Public License
 | 
			
		||||
along with this program; if not, write to the Free Software
 | 
			
		||||
Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA
 | 
			
		||||
or see http://www.gnu.org/licenses/agpl.txt.
 | 
			
		||||
*/
 | 
			
		||||
 | 
			
		||||
#ifndef BASIC_DATASTRUCTURES_H
 | 
			
		||||
@ -129,7 +136,6 @@ std::vector<boost::asio::const_buffer> Reply::HeaderstoBuffers(){
 | 
			
		||||
    buffers.push_back(ToBuffer(status));
 | 
			
		||||
    for (std::size_t i = 0; i < headers.size(); ++i) {
 | 
			
		||||
        Header& h = headers[i];
 | 
			
		||||
//        std::cout << h.name << ": " << h.value << std::endl;
 | 
			
		||||
        buffers.push_back(boost::asio::buffer(h.name));
 | 
			
		||||
        buffers.push_back(boost::asio::buffer(seperators));
 | 
			
		||||
        buffers.push_back(boost::asio::buffer(h.value));
 | 
			
		||||
 | 
			
		||||
@ -1,22 +1,29 @@
 | 
			
		||||
/*
 | 
			
		||||
    open source routing machine
 | 
			
		||||
    Copyright (C) Dennis Luxen, others 2010
 | 
			
		||||
 | 
			
		||||
This program is free software; you can redistribute it and/or modify
 | 
			
		||||
it under the terms of the GNU AFFERO General Public License as published by
 | 
			
		||||
the Free Software Foundation; either version 3 of the License, or
 | 
			
		||||
any later version.
 | 
			
		||||
Copyright (c) 2013, Project OSRM, Dennis Luxen, others
 | 
			
		||||
All rights reserved.
 | 
			
		||||
 | 
			
		||||
This program is distributed in the hope that it will be useful,
 | 
			
		||||
but WITHOUT ANY WARRANTY; without even the implied warranty of
 | 
			
		||||
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
 | 
			
		||||
GNU General Public License for more details.
 | 
			
		||||
Redistribution and use in source and binary forms, with or without modification,
 | 
			
		||||
are permitted provided that the following conditions are met:
 | 
			
		||||
 | 
			
		||||
You should have received a copy of the GNU Affero General Public License
 | 
			
		||||
along with this program; if not, write to the Free Software
 | 
			
		||||
Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA
 | 
			
		||||
or see http://www.gnu.org/licenses/agpl.txt.
 | 
			
		||||
 */
 | 
			
		||||
Redistributions of source code must retain the above copyright notice, this list
 | 
			
		||||
of conditions and the following disclaimer.
 | 
			
		||||
Redistributions in binary form must reproduce the above copyright notice, this
 | 
			
		||||
list of conditions and the following disclaimer in the documentation and/or
 | 
			
		||||
other materials provided with the distribution.
 | 
			
		||||
 | 
			
		||||
THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND
 | 
			
		||||
ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
 | 
			
		||||
WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
 | 
			
		||||
DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR
 | 
			
		||||
ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
 | 
			
		||||
(INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
 | 
			
		||||
LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON
 | 
			
		||||
ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
 | 
			
		||||
(INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
 | 
			
		||||
SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
 | 
			
		||||
 | 
			
		||||
*/
 | 
			
		||||
 | 
			
		||||
#ifndef CONNECTION_H
 | 
			
		||||
#define CONNECTION_H
 | 
			
		||||
@ -25,12 +32,13 @@ or see http://www.gnu.org/licenses/agpl.txt.
 | 
			
		||||
#include "RequestHandler.h"
 | 
			
		||||
#include "RequestParser.h"
 | 
			
		||||
 | 
			
		||||
#include <boost/asio.hpp>
 | 
			
		||||
#include <boost/array.hpp>
 | 
			
		||||
#include <boost/asio.hpp>
 | 
			
		||||
#include <boost/assert.hpp>
 | 
			
		||||
#include <boost/bind.hpp>
 | 
			
		||||
#include <boost/enable_shared_from_this.hpp>
 | 
			
		||||
#include <boost/noncopyable.hpp>
 | 
			
		||||
#include <boost/shared_ptr.hpp>
 | 
			
		||||
#include <boost/enable_shared_from_this.hpp>
 | 
			
		||||
 | 
			
		||||
#include <zlib.h>
 | 
			
		||||
 | 
			
		||||
@ -39,88 +47,178 @@ or see http://www.gnu.org/licenses/agpl.txt.
 | 
			
		||||
namespace http {
 | 
			
		||||
 | 
			
		||||
/// Represents a single connection from a client.
 | 
			
		||||
class Connection : public boost::enable_shared_from_this<Connection>, private boost::noncopyable {
 | 
			
		||||
class Connection : 	public boost::enable_shared_from_this<Connection>,
 | 
			
		||||
					private boost::noncopyable {
 | 
			
		||||
public:
 | 
			
		||||
	explicit Connection(boost::asio::io_service& io_service, RequestHandler& handler) : strand(io_service), TCPsocket(io_service), requestHandler(handler) {}
 | 
			
		||||
	explicit Connection(
 | 
			
		||||
		boost::asio::io_service& io_service,
 | 
			
		||||
		RequestHandler& handler
 | 
			
		||||
	) : strand(io_service), TCP_socket(io_service), request_handler(handler) { }
 | 
			
		||||
 | 
			
		||||
	boost::asio::ip::tcp::socket& socket() {
 | 
			
		||||
		return TCPsocket;
 | 
			
		||||
		return TCP_socket;
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	/// Start the first asynchronous operation for the connection.
 | 
			
		||||
	void start() {
 | 
			
		||||
	    TCPsocket.async_read_some(boost::asio::buffer(incomingDataBuffer), strand.wrap( boost::bind(&Connection::handleRead, this->shared_from_this(), boost::asio::placeholders::error, boost::asio::placeholders::bytes_transferred)));
 | 
			
		||||
	    TCP_socket.async_read_some(
 | 
			
		||||
	    	boost::asio::buffer(incoming_data_buffer),
 | 
			
		||||
	    	strand.wrap( boost::bind(
 | 
			
		||||
	    					&Connection::handle_read,
 | 
			
		||||
	    					this->shared_from_this(),
 | 
			
		||||
	    					boost::asio::placeholders::error,
 | 
			
		||||
	    					boost::asio::placeholders::bytes_transferred)
 | 
			
		||||
	    	)
 | 
			
		||||
	    );
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
private:
 | 
			
		||||
	void handleRead(const boost::system::error_code& e, std::size_t bytes_transferred) {
 | 
			
		||||
		if (!e) {
 | 
			
		||||
			CompressionType compressionType(noCompression);
 | 
			
		||||
	void handle_read(
 | 
			
		||||
		const boost::system::error_code& e,
 | 
			
		||||
		std::size_t bytes_transferred
 | 
			
		||||
	) {
 | 
			
		||||
		if( !e ) {
 | 
			
		||||
			CompressionType compression_type(noCompression);
 | 
			
		||||
			boost::tribool result;
 | 
			
		||||
			boost::tie(result, boost::tuples::ignore) = requestParser.Parse( request, incomingDataBuffer.data(), incomingDataBuffer.data() + bytes_transferred, &compressionType);
 | 
			
		||||
			boost::tie(result, boost::tuples::ignore) = request_parser.Parse(
 | 
			
		||||
				request,
 | 
			
		||||
				incoming_data_buffer.data(),
 | 
			
		||||
				incoming_data_buffer.data() + bytes_transferred,
 | 
			
		||||
				&compression_type
 | 
			
		||||
			);
 | 
			
		||||
 | 
			
		||||
			if (result) {
 | 
			
		||||
				//                std::cout << "----" << std::endl;
 | 
			
		||||
				//				if(compressionType == gzipRFC1952)
 | 
			
		||||
				//					std::cout << "[debug] using gzip" << std::endl;
 | 
			
		||||
				//				if(compressionType == deflateRFC1951)
 | 
			
		||||
				//					std::cout << "[debug] using deflate" << std::endl;
 | 
			
		||||
				//				if(compressionType == noCompression)
 | 
			
		||||
				//					std::cout << "[debug] no compression" << std::endl;
 | 
			
		||||
			    request.endpoint = TCPsocket.remote_endpoint().address();
 | 
			
		||||
				requestHandler.handle_request(request, reply);
 | 
			
		||||
			if( result ) {
 | 
			
		||||
				request.endpoint = TCP_socket.remote_endpoint().address();
 | 
			
		||||
				request_handler.handle_request(request, reply);
 | 
			
		||||
 | 
			
		||||
				Header compressionHeader;
 | 
			
		||||
				std::vector<unsigned char> compressed;
 | 
			
		||||
				std::vector<boost::asio::const_buffer> outputBuffer;
 | 
			
		||||
				switch(compressionType) {
 | 
			
		||||
				Header compression_header;
 | 
			
		||||
				std::vector<unsigned char> compressed_output;
 | 
			
		||||
				std::vector<boost::asio::const_buffer> output_buffer;
 | 
			
		||||
				switch(compression_type) {
 | 
			
		||||
				case deflateRFC1951:
 | 
			
		||||
					compressionHeader.name = "Content-Encoding";
 | 
			
		||||
					compressionHeader.value = "deflate";
 | 
			
		||||
					reply.headers.insert(reply.headers.begin(), compressionHeader);   //push_back(compressionHeader);
 | 
			
		||||
					compressCharArray(reply.content.c_str(), reply.content.length(), compressed, compressionType);
 | 
			
		||||
					reply.setSize(compressed.size());
 | 
			
		||||
					outputBuffer = reply.HeaderstoBuffers();
 | 
			
		||||
					outputBuffer.push_back(boost::asio::buffer(compressed));
 | 
			
		||||
					boost::asio::async_write(TCPsocket, outputBuffer, strand.wrap( boost::bind(&Connection::handleWrite, this->shared_from_this(), boost::asio::placeholders::error)));
 | 
			
		||||
					compression_header.name = "Content-Encoding";
 | 
			
		||||
					compression_header.value = "deflate";
 | 
			
		||||
					reply.headers.insert(
 | 
			
		||||
						reply.headers.begin(),
 | 
			
		||||
						compression_header
 | 
			
		||||
					);
 | 
			
		||||
					compressCharArray(
 | 
			
		||||
						reply.content.c_str(),
 | 
			
		||||
						reply.content.length(),
 | 
			
		||||
						compressed_output,
 | 
			
		||||
						compression_type
 | 
			
		||||
					);
 | 
			
		||||
					reply.setSize(compressed_output.size());
 | 
			
		||||
					output_buffer = reply.HeaderstoBuffers();
 | 
			
		||||
					output_buffer.push_back(
 | 
			
		||||
						boost::asio::buffer(compressed_output)
 | 
			
		||||
					);
 | 
			
		||||
					boost::asio::async_write(
 | 
			
		||||
						TCP_socket,
 | 
			
		||||
						output_buffer,
 | 
			
		||||
						strand.wrap(
 | 
			
		||||
							boost::bind(
 | 
			
		||||
								&Connection::handle_write,
 | 
			
		||||
								this->shared_from_this(),
 | 
			
		||||
								boost::asio::placeholders::error
 | 
			
		||||
							)
 | 
			
		||||
						)
 | 
			
		||||
					);
 | 
			
		||||
					break;
 | 
			
		||||
				case gzipRFC1952:
 | 
			
		||||
					compressionHeader.name = "Content-Encoding";
 | 
			
		||||
					compressionHeader.value = "gzip";
 | 
			
		||||
					reply.headers.insert(reply.headers.begin(), compressionHeader);
 | 
			
		||||
					compressCharArray(reply.content.c_str(), reply.content.length(), compressed, compressionType);
 | 
			
		||||
					reply.setSize(compressed.size());
 | 
			
		||||
					outputBuffer = reply.HeaderstoBuffers();
 | 
			
		||||
					outputBuffer.push_back(boost::asio::buffer(compressed));
 | 
			
		||||
					boost::asio::async_write(TCPsocket, outputBuffer, strand.wrap( boost::bind(&Connection::handleWrite, this->shared_from_this(), boost::asio::placeholders::error)));break;
 | 
			
		||||
					compression_header.name = "Content-Encoding";
 | 
			
		||||
					compression_header.value = "gzip";
 | 
			
		||||
					reply.headers.insert(
 | 
			
		||||
						reply.headers.begin(),
 | 
			
		||||
						compression_header
 | 
			
		||||
					);
 | 
			
		||||
					compressCharArray(
 | 
			
		||||
						reply.content.c_str(),
 | 
			
		||||
						reply.content.length(),
 | 
			
		||||
						compressed_output,
 | 
			
		||||
						compression_type
 | 
			
		||||
					);
 | 
			
		||||
					reply.setSize(compressed_output.size());
 | 
			
		||||
					output_buffer = reply.HeaderstoBuffers();
 | 
			
		||||
					output_buffer.push_back(
 | 
			
		||||
						boost::asio::buffer(compressed_output)
 | 
			
		||||
					);
 | 
			
		||||
					boost::asio::async_write(
 | 
			
		||||
						TCP_socket,
 | 
			
		||||
						output_buffer,
 | 
			
		||||
						strand.wrap(
 | 
			
		||||
							boost::bind(
 | 
			
		||||
								&Connection::handle_write,
 | 
			
		||||
								this->shared_from_this(),
 | 
			
		||||
								boost::asio::placeholders::error
 | 
			
		||||
							)
 | 
			
		||||
						)
 | 
			
		||||
					);
 | 
			
		||||
					break;
 | 
			
		||||
				case noCompression:
 | 
			
		||||
					boost::asio::async_write(TCPsocket, reply.toBuffers(), strand.wrap( boost::bind(&Connection::handleWrite, this->shared_from_this(), boost::asio::placeholders::error)));
 | 
			
		||||
					boost::asio::async_write(
 | 
			
		||||
						TCP_socket,
 | 
			
		||||
						reply.toBuffers(),
 | 
			
		||||
						strand.wrap(
 | 
			
		||||
							boost::bind(
 | 
			
		||||
								&Connection::handle_write,
 | 
			
		||||
								this->shared_from_this(),
 | 
			
		||||
								boost::asio::placeholders::error
 | 
			
		||||
								)
 | 
			
		||||
							)
 | 
			
		||||
						);
 | 
			
		||||
					break;
 | 
			
		||||
				}
 | 
			
		||||
 | 
			
		||||
			} else if (!result) {
 | 
			
		||||
				reply = Reply::stockReply(Reply::badRequest);
 | 
			
		||||
				boost::asio::async_write(TCPsocket, reply.toBuffers(), strand.wrap( boost::bind(&Connection::handleWrite, this->shared_from_this(), boost::asio::placeholders::error)));
 | 
			
		||||
				boost::asio::async_write(
 | 
			
		||||
					TCP_socket,
 | 
			
		||||
					reply.toBuffers(),
 | 
			
		||||
					strand.wrap(
 | 
			
		||||
						boost::bind(
 | 
			
		||||
							&Connection::handle_write,
 | 
			
		||||
							this->shared_from_this(),
 | 
			
		||||
							boost::asio::placeholders::error
 | 
			
		||||
						)
 | 
			
		||||
					)
 | 
			
		||||
				);
 | 
			
		||||
			} else {
 | 
			
		||||
				TCPsocket.async_read_some(boost::asio::buffer(incomingDataBuffer), strand.wrap( boost::bind(&Connection::handleRead, this->shared_from_this(), boost::asio::placeholders::error, boost::asio::placeholders::bytes_transferred)));
 | 
			
		||||
				TCP_socket.async_read_some(
 | 
			
		||||
					boost::asio::buffer(incoming_data_buffer),
 | 
			
		||||
					strand.wrap(
 | 
			
		||||
						boost::bind(
 | 
			
		||||
							&Connection::handle_read,
 | 
			
		||||
							this->shared_from_this(),
 | 
			
		||||
							boost::asio::placeholders::error,
 | 
			
		||||
							boost::asio::placeholders::bytes_transferred
 | 
			
		||||
						)
 | 
			
		||||
					)
 | 
			
		||||
				);
 | 
			
		||||
			}
 | 
			
		||||
		}
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	/// Handle completion of a write operation.
 | 
			
		||||
	void handleWrite(const boost::system::error_code& e) {
 | 
			
		||||
	void handle_write(const boost::system::error_code& e) {
 | 
			
		||||
		if (!e) {
 | 
			
		||||
			// Initiate graceful connection closure.
 | 
			
		||||
			boost::system::error_code ignoredEC;
 | 
			
		||||
			TCPsocket.shutdown(boost::asio::ip::tcp::socket::shutdown_both, ignoredEC);
 | 
			
		||||
			TCP_socket.shutdown(
 | 
			
		||||
				boost::asio::ip::tcp::socket::shutdown_both,
 | 
			
		||||
				ignoredEC
 | 
			
		||||
			);
 | 
			
		||||
		}
 | 
			
		||||
		// No new asynchronous operations are started. This means that all shared_ptr
 | 
			
		||||
		// references to the connection object will disappear and the object will be
 | 
			
		||||
		// destroyed automatically after this handler returns. The connection class's
 | 
			
		||||
		// destructor closes the socket.
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	void compressCharArray(const void *in_data, size_t in_data_size, std::vector<unsigned char> &buffer, CompressionType type) {
 | 
			
		||||
	// Big thanks to deusty who explains how to use gzip compression by
 | 
			
		||||
	// the right call to deflateInit2():
 | 
			
		||||
	// http://deusty.blogspot.com/2007/07/gzip-compressiondecompression.html
 | 
			
		||||
	void compressCharArray(
 | 
			
		||||
		const char * in_data,
 | 
			
		||||
		size_t in_data_size,
 | 
			
		||||
		std::vector<unsigned char> & buffer,
 | 
			
		||||
		CompressionType type
 | 
			
		||||
	) {
 | 
			
		||||
		const size_t BUFSIZE = 128 * 1024;
 | 
			
		||||
		unsigned char temp_buffer[BUFSIZE];
 | 
			
		||||
 | 
			
		||||
@ -140,20 +238,23 @@ private:
 | 
			
		||||
			deflateInit(&strm, Z_BEST_SPEED);
 | 
			
		||||
			break;
 | 
			
		||||
		case gzipRFC1952:
 | 
			
		||||
			/*
 | 
			
		||||
			 * Big thanks to deusty who explains how to have gzip compression turned on by the right call to deflateInit2():
 | 
			
		||||
			 * http://deusty.blogspot.com/2007/07/gzip-compressiondecompression.html
 | 
			
		||||
			 */
 | 
			
		||||
			deflateInit2(&strm, Z_DEFAULT_COMPRESSION, Z_DEFLATED, (15+16), 9, Z_DEFAULT_STRATEGY);
 | 
			
		||||
			deflateInit2(
 | 
			
		||||
				&strm,
 | 
			
		||||
				Z_DEFAULT_COMPRESSION,
 | 
			
		||||
				Z_DEFLATED,
 | 
			
		||||
				(15+16),
 | 
			
		||||
				9,
 | 
			
		||||
				Z_DEFAULT_STRATEGY
 | 
			
		||||
			);
 | 
			
		||||
			break;
 | 
			
		||||
		default:
 | 
			
		||||
			assert(false);
 | 
			
		||||
			BOOST_ASSERT_MSG(false, "should not happen");
 | 
			
		||||
			break;
 | 
			
		||||
		}
 | 
			
		||||
 | 
			
		||||
		int deflate_res = Z_OK;
 | 
			
		||||
		do {
 | 
			
		||||
			if (strm.avail_out == 0) {
 | 
			
		||||
			if ( 0 == strm.avail_out ) {
 | 
			
		||||
				buffer.insert(buffer.end(), temp_buffer, temp_buffer + BUFSIZE);
 | 
			
		||||
				strm.next_out = temp_buffer;
 | 
			
		||||
				strm.avail_out = BUFSIZE;
 | 
			
		||||
@ -162,17 +263,25 @@ private:
 | 
			
		||||
 | 
			
		||||
		} while (deflate_res == Z_OK);
 | 
			
		||||
 | 
			
		||||
		assert(deflate_res == Z_STREAM_END);
 | 
			
		||||
		buffer.insert(buffer.end(), temp_buffer, temp_buffer + BUFSIZE - strm.avail_out);
 | 
			
		||||
		BOOST_ASSERT_MSG(
 | 
			
		||||
			deflate_res == Z_STREAM_END,
 | 
			
		||||
			"compression not properly finished"
 | 
			
		||||
		);
 | 
			
		||||
 | 
			
		||||
		buffer.insert(
 | 
			
		||||
			buffer.end(),
 | 
			
		||||
			temp_buffer,
 | 
			
		||||
			temp_buffer + BUFSIZE - strm.avail_out
 | 
			
		||||
		);
 | 
			
		||||
		deflateEnd(&strm);
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	boost::asio::io_service::strand strand;
 | 
			
		||||
	boost::asio::ip::tcp::socket TCPsocket;
 | 
			
		||||
	RequestHandler& requestHandler;
 | 
			
		||||
	boost::array<char, 8192> incomingDataBuffer;
 | 
			
		||||
	boost::asio::ip::tcp::socket TCP_socket;
 | 
			
		||||
	RequestHandler& request_handler;
 | 
			
		||||
	boost::array<char, 8192> incoming_data_buffer;
 | 
			
		||||
	Request request;
 | 
			
		||||
	RequestParser requestParser;
 | 
			
		||||
	RequestParser request_parser;
 | 
			
		||||
	Reply reply;
 | 
			
		||||
};
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
@ -1,79 +1,86 @@
 | 
			
		||||
/*
 | 
			
		||||
    open source routing machine
 | 
			
		||||
    Copyright (C) Dennis Luxen, others 2010
 | 
			
		||||
 | 
			
		||||
This program is free software; you can redistribute it and/or modify
 | 
			
		||||
it under the terms of the GNU AFFERO General Public License as published by
 | 
			
		||||
the Free Software Foundation; either version 3 of the License, or
 | 
			
		||||
any later version.
 | 
			
		||||
Copyright (c) 2013, Project OSRM, Dennis Luxen, others
 | 
			
		||||
All rights reserved.
 | 
			
		||||
 | 
			
		||||
This program is distributed in the hope that it will be useful,
 | 
			
		||||
but WITHOUT ANY WARRANTY; without even the implied warranty of
 | 
			
		||||
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
 | 
			
		||||
GNU General Public License for more details.
 | 
			
		||||
Redistribution and use in source and binary forms, with or without modification,
 | 
			
		||||
are permitted provided that the following conditions are met:
 | 
			
		||||
 | 
			
		||||
You should have received a copy of the GNU Affero General Public License
 | 
			
		||||
along with this program; if not, write to the Free Software
 | 
			
		||||
Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA
 | 
			
		||||
or see http://www.gnu.org/licenses/agpl.txt.
 | 
			
		||||
 */
 | 
			
		||||
Redistributions of source code must retain the above copyright notice, this list
 | 
			
		||||
of conditions and the following disclaimer.
 | 
			
		||||
Redistributions in binary form must reproduce the above copyright notice, this
 | 
			
		||||
list of conditions and the following disclaimer in the documentation and/or
 | 
			
		||||
other materials provided with the distribution.
 | 
			
		||||
 | 
			
		||||
THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND
 | 
			
		||||
ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
 | 
			
		||||
WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
 | 
			
		||||
DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR
 | 
			
		||||
ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
 | 
			
		||||
(INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
 | 
			
		||||
LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON
 | 
			
		||||
ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
 | 
			
		||||
(INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
 | 
			
		||||
SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
 | 
			
		||||
 | 
			
		||||
*/
 | 
			
		||||
 | 
			
		||||
#include "QueryObjectsStorage.h"
 | 
			
		||||
 | 
			
		||||
QueryObjectsStorage::QueryObjectsStorage(
 | 
			
		||||
	const std::string & hsgrPath,
 | 
			
		||||
	const std::string & ramIndexPath,
 | 
			
		||||
	const std::string & fileIndexPath,
 | 
			
		||||
	const std::string & nodesPath,
 | 
			
		||||
	const std::string & edgesPath,
 | 
			
		||||
	const std::string & namesPath,
 | 
			
		||||
	const std::string & timestampPath
 | 
			
		||||
) {
 | 
			
		||||
	if( hsgrPath.empty() ) {
 | 
			
		||||
QueryObjectsStorage::QueryObjectsStorage( const ServerPaths & paths ) {
 | 
			
		||||
	if( paths.find("hsgrdata") == paths.end() ) {
 | 
			
		||||
		throw OSRMException("no hsgr file given in ini file");
 | 
			
		||||
	}
 | 
			
		||||
	if( ramIndexPath.empty() ) {
 | 
			
		||||
	if( paths.find("ramindex") == paths.end() ) {
 | 
			
		||||
		throw OSRMException("no ram index file given in ini file");
 | 
			
		||||
	}
 | 
			
		||||
	if( fileIndexPath.empty() ) {
 | 
			
		||||
	if( paths.find("fileindex") == paths.end() ) {
 | 
			
		||||
		throw OSRMException("no mem index file given in ini file");
 | 
			
		||||
	}
 | 
			
		||||
	if( nodesPath.empty() ) {
 | 
			
		||||
	if( paths.find("nodesdata") == paths.end() ) {
 | 
			
		||||
		throw OSRMException("no nodes file given in ini file");
 | 
			
		||||
	}
 | 
			
		||||
	if( edgesPath.empty() ) {
 | 
			
		||||
	if( paths.find("edgesdata") == paths.end() ) {
 | 
			
		||||
		throw OSRMException("no edges file given in ini file");
 | 
			
		||||
	}
 | 
			
		||||
	if( namesPath.empty() ) {
 | 
			
		||||
	if( paths.find("namesdata") == paths.end() ) {
 | 
			
		||||
		throw OSRMException("no names file given in ini file");
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	SimpleLogger().Write() << "loading graph data";
 | 
			
		||||
	//Deserialize road network graph
 | 
			
		||||
	std::vector< QueryGraph::_StrNode> nodeList;
 | 
			
		||||
	std::vector< QueryGraph::_StrEdge> edgeList;
 | 
			
		||||
	const int n = readHSGRFromStream(
 | 
			
		||||
		hsgrPath,
 | 
			
		||||
		nodeList,
 | 
			
		||||
		edgeList,
 | 
			
		||||
		&checkSum
 | 
			
		||||
 | 
			
		||||
	ServerPaths::const_iterator paths_iterator = paths.find("hsgrdata");
 | 
			
		||||
	BOOST_ASSERT(paths.end() != paths_iterator);
 | 
			
		||||
	const std::string & hsgr_data_string = paths_iterator->second.string();
 | 
			
		||||
 | 
			
		||||
	std::vector< QueryGraph::_StrNode> node_list;
 | 
			
		||||
	std::vector< QueryGraph::_StrEdge> edge_list;
 | 
			
		||||
	const int number_of_nodes = readHSGRFromStream(
 | 
			
		||||
		hsgr_data_string,
 | 
			
		||||
		node_list,
 | 
			
		||||
		edge_list,
 | 
			
		||||
		&check_sum
 | 
			
		||||
	);
 | 
			
		||||
 | 
			
		||||
	SimpleLogger().Write() << "Data checksum is " << checkSum;
 | 
			
		||||
	graph = new QueryGraph(nodeList, edgeList);
 | 
			
		||||
	assert(0 == nodeList.size());
 | 
			
		||||
	assert(0 == edgeList.size());
 | 
			
		||||
	SimpleLogger().Write() << "Data checksum is " << check_sum;
 | 
			
		||||
	graph = new QueryGraph(node_list, edge_list);
 | 
			
		||||
	BOOST_ASSERT(0 == node_list.size());
 | 
			
		||||
	BOOST_ASSERT(0 == edge_list.size());
 | 
			
		||||
 | 
			
		||||
	if(timestampPath.length()) {
 | 
			
		||||
	paths_iterator = paths.find("timestamp");
 | 
			
		||||
 | 
			
		||||
	if(paths.end() != paths_iterator) {
 | 
			
		||||
	    SimpleLogger().Write() << "Loading Timestamp";
 | 
			
		||||
	    std::ifstream timestampInStream(timestampPath.c_str());
 | 
			
		||||
	    if(!timestampInStream) {
 | 
			
		||||
	    	SimpleLogger().Write(logWARNING) <<  timestampPath <<  " not found";
 | 
			
		||||
    	const std::string & timestamp_string = paths_iterator->second.string();
 | 
			
		||||
 | 
			
		||||
	    boost::filesystem::ifstream time_stamp_instream(timestamp_string);
 | 
			
		||||
	    if( !time_stamp_instream.good() ) {
 | 
			
		||||
	        SimpleLogger().Write(logWARNING) << timestamp_string << " not found";
 | 
			
		||||
	    }
 | 
			
		||||
 | 
			
		||||
	    getline(timestampInStream, timestamp);
 | 
			
		||||
	    timestampInStream.close();
 | 
			
		||||
	    getline(time_stamp_instream, timestamp);
 | 
			
		||||
	    time_stamp_instream.close();
 | 
			
		||||
	}
 | 
			
		||||
	if(!timestamp.length()) {
 | 
			
		||||
	    timestamp = "n/a";
 | 
			
		||||
@ -81,50 +88,96 @@ QueryObjectsStorage::QueryObjectsStorage(
 | 
			
		||||
	if(25 < timestamp.length()) {
 | 
			
		||||
	    timestamp.resize(25);
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
    SimpleLogger().Write() << "Loading auxiliary information";
 | 
			
		||||
 | 
			
		||||
    paths_iterator = paths.find("ramindex");
 | 
			
		||||
    BOOST_ASSERT(paths.end() != paths_iterator);
 | 
			
		||||
    const std::string & ram_index_string = paths_iterator->second.string();
 | 
			
		||||
	paths_iterator = paths.find("fileindex");
 | 
			
		||||
    BOOST_ASSERT(paths.end() != paths_iterator);
 | 
			
		||||
	const std::string & file_index_string = paths_iterator->second.string();
 | 
			
		||||
	paths_iterator = paths.find("nodesdata");
 | 
			
		||||
    BOOST_ASSERT(paths.end() != paths_iterator);
 | 
			
		||||
	const std::string & nodes_data_string = paths_iterator->second.string();
 | 
			
		||||
	paths_iterator = paths.find("edgesdata");
 | 
			
		||||
    BOOST_ASSERT(paths.end() != paths_iterator);
 | 
			
		||||
	const std::string & edges_data_string = paths_iterator->second.string();
 | 
			
		||||
 | 
			
		||||
    //Init nearest neighbor data structure
 | 
			
		||||
	nodeHelpDesk = new NodeInformationHelpDesk(
 | 
			
		||||
		ramIndexPath,
 | 
			
		||||
		fileIndexPath,
 | 
			
		||||
		nodesPath,
 | 
			
		||||
		edgesPath,
 | 
			
		||||
		n,
 | 
			
		||||
		checkSum
 | 
			
		||||
		ram_index_string,
 | 
			
		||||
		file_index_string,
 | 
			
		||||
		nodes_data_string,
 | 
			
		||||
		edges_data_string,
 | 
			
		||||
		number_of_nodes,
 | 
			
		||||
		check_sum
 | 
			
		||||
	);
 | 
			
		||||
 | 
			
		||||
	//deserialize street name list
 | 
			
		||||
	SimpleLogger().Write() << "Loading names index";
 | 
			
		||||
	boost::filesystem::path names_file(namesPath);
 | 
			
		||||
 | 
			
		||||
    if ( !boost::filesystem::exists( names_file ) ) {
 | 
			
		||||
	paths_iterator = paths.find("namesdata");
 | 
			
		||||
    BOOST_ASSERT(paths.end() != paths_iterator);
 | 
			
		||||
	const std::string & names_data_string = paths_iterator->second.string();
 | 
			
		||||
    if ( !boost::filesystem::exists( paths_iterator->second ) ) {
 | 
			
		||||
        throw OSRMException("names file does not exist");
 | 
			
		||||
    }
 | 
			
		||||
    if ( 0 == boost::filesystem::file_size( names_file ) ) {
 | 
			
		||||
    if ( 0 == boost::filesystem::file_size( paths_iterator->second ) ) {
 | 
			
		||||
        throw OSRMException("names file is empty");
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
	boost::filesystem::ifstream name_stream(names_file, std::ios::binary);
 | 
			
		||||
	boost::filesystem::ifstream name_stream(names_data_string, std::ios::binary);
 | 
			
		||||
	unsigned size = 0;
 | 
			
		||||
	name_stream.read((char *)&size, sizeof(unsigned));
 | 
			
		||||
	BOOST_ASSERT_MSG(0 != size, "name file empty");
 | 
			
		||||
	BOOST_ASSERT_MSG(0 != size, "name file broken");
 | 
			
		||||
 | 
			
		||||
	m_name_begin_indices.resize(size);
 | 
			
		||||
	name_stream.read((char*)&m_name_begin_indices[0], size*sizeof(unsigned));
 | 
			
		||||
	name_stream.read((char *)&size, sizeof(unsigned));
 | 
			
		||||
	BOOST_ASSERT_MSG(0 != size, "name file broken");
 | 
			
		||||
 | 
			
		||||
	m_names_char_list.resize(size+1); //+1 is sentinel/dummy element
 | 
			
		||||
	name_stream.read((char *)&m_names_char_list[0], size*sizeof(char));
 | 
			
		||||
	BOOST_ASSERT_MSG(0 != m_names_char_list.size(), "could not load any names");
 | 
			
		||||
 | 
			
		||||
	char buf[1024];
 | 
			
		||||
	for( unsigned i = 0; i < size; ++i ) {
 | 
			
		||||
		unsigned size_of_string = 0;
 | 
			
		||||
		name_stream.read((char *)&size_of_string, sizeof(unsigned));
 | 
			
		||||
		buf[size_of_string] = '\0'; // instead of memset
 | 
			
		||||
		name_stream.read(buf, size_of_string);
 | 
			
		||||
		names.push_back(buf);
 | 
			
		||||
	}
 | 
			
		||||
	std::vector<std::string>(names).swap(names);
 | 
			
		||||
	BOOST_ASSERT_MSG(0 != names.size(), "could not load any names");
 | 
			
		||||
	name_stream.close();
 | 
			
		||||
	SimpleLogger().Write() << "All query data structures loaded";
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
void QueryObjectsStorage::GetName(
 | 
			
		||||
	const unsigned name_id,
 | 
			
		||||
	std::string & result
 | 
			
		||||
) const {
 | 
			
		||||
	if(UINT_MAX == name_id) {
 | 
			
		||||
		result = "";
 | 
			
		||||
		return;
 | 
			
		||||
	}
 | 
			
		||||
	BOOST_ASSERT_MSG(
 | 
			
		||||
		name_id < m_name_begin_indices.size(),
 | 
			
		||||
		"name id too high"
 | 
			
		||||
	);
 | 
			
		||||
	unsigned begin_index = m_name_begin_indices[name_id];
 | 
			
		||||
	unsigned end_index = m_name_begin_indices[name_id+1];
 | 
			
		||||
	BOOST_ASSERT_MSG(
 | 
			
		||||
		begin_index < m_names_char_list.size(),
 | 
			
		||||
		"begin index of name too high"
 | 
			
		||||
	);
 | 
			
		||||
	BOOST_ASSERT_MSG(
 | 
			
		||||
		end_index < m_names_char_list.size(),
 | 
			
		||||
		"end index of name too high"
 | 
			
		||||
	);
 | 
			
		||||
 | 
			
		||||
	BOOST_ASSERT_MSG(begin_index <= end_index, "string ends before begin");
 | 
			
		||||
	result.clear();
 | 
			
		||||
	result.resize(end_index - begin_index);
 | 
			
		||||
	std::copy(
 | 
			
		||||
		m_names_char_list.begin() + begin_index,
 | 
			
		||||
		m_names_char_list.begin() + end_index,
 | 
			
		||||
		result.begin()
 | 
			
		||||
	);
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
QueryObjectsStorage::~QueryObjectsStorage() {
 | 
			
		||||
	//        delete names;
 | 
			
		||||
	delete graph;
 | 
			
		||||
	delete nodeHelpDesk;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
@ -1,29 +1,36 @@
 | 
			
		||||
/*
 | 
			
		||||
    open source routing machine
 | 
			
		||||
    Copyright (C) Dennis Luxen, others 2010
 | 
			
		||||
 | 
			
		||||
This program is free software; you can redistribute it and/or modify
 | 
			
		||||
it under the terms of the GNU AFFERO General Public License as published by
 | 
			
		||||
the Free Software Foundation; either version 3 of the License, or
 | 
			
		||||
any later version.
 | 
			
		||||
Copyright (c) 2013, Project OSRM, Dennis Luxen, others
 | 
			
		||||
All rights reserved.
 | 
			
		||||
 | 
			
		||||
This program is distributed in the hope that it will be useful,
 | 
			
		||||
but WITHOUT ANY WARRANTY; without even the implied warranty of
 | 
			
		||||
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
 | 
			
		||||
GNU General Public License for more details.
 | 
			
		||||
Redistribution and use in source and binary forms, with or without modification,
 | 
			
		||||
are permitted provided that the following conditions are met:
 | 
			
		||||
 | 
			
		||||
You should have received a copy of the GNU Affero General Public License
 | 
			
		||||
along with this program; if not, write to the Free Software
 | 
			
		||||
Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA
 | 
			
		||||
or see http://www.gnu.org/licenses/agpl.txt.
 | 
			
		||||
 */
 | 
			
		||||
Redistributions of source code must retain the above copyright notice, this list
 | 
			
		||||
of conditions and the following disclaimer.
 | 
			
		||||
Redistributions in binary form must reproduce the above copyright notice, this
 | 
			
		||||
list of conditions and the following disclaimer in the documentation and/or
 | 
			
		||||
other materials provided with the distribution.
 | 
			
		||||
 | 
			
		||||
THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND
 | 
			
		||||
ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
 | 
			
		||||
WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
 | 
			
		||||
DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR
 | 
			
		||||
ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
 | 
			
		||||
(INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
 | 
			
		||||
LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON
 | 
			
		||||
ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
 | 
			
		||||
(INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
 | 
			
		||||
SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
 | 
			
		||||
 | 
			
		||||
*/
 | 
			
		||||
 | 
			
		||||
#ifndef QUERYOBJECTSSTORAGE_H_
 | 
			
		||||
#define QUERYOBJECTSSTORAGE_H_
 | 
			
		||||
 | 
			
		||||
#include "../../Util/GraphLoader.h"
 | 
			
		||||
#include "../../Util/OSRMException.h"
 | 
			
		||||
#include "../../Util/ProgramOptions.h"
 | 
			
		||||
#include "../../Util/SimpleLogger.h"
 | 
			
		||||
#include "../../DataStructures/NodeInformationHelpDesk.h"
 | 
			
		||||
#include "../../DataStructures/QueryEdge.h"
 | 
			
		||||
@ -42,21 +49,15 @@ struct QueryObjectsStorage {
 | 
			
		||||
    typedef QueryGraph::InputEdge               InputEdge;
 | 
			
		||||
 | 
			
		||||
    NodeInformationHelpDesk                   * nodeHelpDesk;
 | 
			
		||||
    std::vector<std::string> names;
 | 
			
		||||
    std::vector<char>                           m_names_char_list;
 | 
			
		||||
    std::vector<unsigned>                       m_name_begin_indices;
 | 
			
		||||
    QueryGraph                                * graph;
 | 
			
		||||
    std::string                                 timestamp;
 | 
			
		||||
    unsigned checkSum;
 | 
			
		||||
    unsigned                                    check_sum;
 | 
			
		||||
 | 
			
		||||
    QueryObjectsStorage(
 | 
			
		||||
        const std::string & hsgrPath,
 | 
			
		||||
        const std::string & ramIndexPath,
 | 
			
		||||
        const std::string & fileIndexPath,
 | 
			
		||||
        const std::string & nodesPath,
 | 
			
		||||
        const std::string & edgesPath,
 | 
			
		||||
        const std::string & namesPath,
 | 
			
		||||
        const std::string & timestampPath
 | 
			
		||||
    );
 | 
			
		||||
    void GetName( const unsigned name_id, std::string & result ) const;
 | 
			
		||||
 | 
			
		||||
    QueryObjectsStorage( const ServerPaths & paths );
 | 
			
		||||
    ~QueryObjectsStorage();
 | 
			
		||||
};
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
@ -1,22 +1,29 @@
 | 
			
		||||
/*
 | 
			
		||||
    open source routing machine
 | 
			
		||||
    Copyright (C) Dennis Luxen, 2010
 | 
			
		||||
 | 
			
		||||
This program is free software; you can redistribute it and/or modify
 | 
			
		||||
it under the terms of the GNU AFFERO General Public License as published by
 | 
			
		||||
the Free Software Foundation; either version 3 of the License, or
 | 
			
		||||
any later version.
 | 
			
		||||
Copyright (c) 2013, Project OSRM, Dennis Luxen, others
 | 
			
		||||
All rights reserved.
 | 
			
		||||
 | 
			
		||||
This program is distributed in the hope that it will be useful,
 | 
			
		||||
but WITHOUT ANY WARRANTY; without even the implied warranty of
 | 
			
		||||
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
 | 
			
		||||
GNU General Public License for more details.
 | 
			
		||||
Redistribution and use in source and binary forms, with or without modification,
 | 
			
		||||
are permitted provided that the following conditions are met:
 | 
			
		||||
 | 
			
		||||
You should have received a copy of the GNU Affero General Public License
 | 
			
		||||
along with this program; if not, write to the Free Software
 | 
			
		||||
Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA
 | 
			
		||||
or see http://www.gnu.org/licenses/agpl.txt.
 | 
			
		||||
 */
 | 
			
		||||
Redistributions of source code must retain the above copyright notice, this list
 | 
			
		||||
of conditions and the following disclaimer.
 | 
			
		||||
Redistributions in binary form must reproduce the above copyright notice, this
 | 
			
		||||
list of conditions and the following disclaimer in the documentation and/or
 | 
			
		||||
other materials provided with the distribution.
 | 
			
		||||
 | 
			
		||||
THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND
 | 
			
		||||
ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
 | 
			
		||||
WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
 | 
			
		||||
DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR
 | 
			
		||||
ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
 | 
			
		||||
(INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
 | 
			
		||||
LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON
 | 
			
		||||
ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
 | 
			
		||||
(INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
 | 
			
		||||
SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
 | 
			
		||||
 | 
			
		||||
*/
 | 
			
		||||
 | 
			
		||||
#ifndef ROUTE_PARAMETERS_H
 | 
			
		||||
#define ROUTE_PARAMETERS_H
 | 
			
		||||
 | 
			
		||||
@ -1,22 +1,29 @@
 | 
			
		||||
/*
 | 
			
		||||
    open source routing machine
 | 
			
		||||
    Copyright (C) Dennis Luxen, 2010
 | 
			
		||||
 | 
			
		||||
This program is free software; you can redistribute it and/or modify
 | 
			
		||||
it under the terms of the GNU AFFERO General Public License as published by
 | 
			
		||||
the Free Software Foundation; either version 3 of the License, or
 | 
			
		||||
any later version.
 | 
			
		||||
Copyright (c) 2013, Project OSRM, Dennis Luxen, others
 | 
			
		||||
All rights reserved.
 | 
			
		||||
 | 
			
		||||
This program is distributed in the hope that it will be useful,
 | 
			
		||||
but WITHOUT ANY WARRANTY; without even the implied warranty of
 | 
			
		||||
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
 | 
			
		||||
GNU General Public License for more details.
 | 
			
		||||
Redistribution and use in source and binary forms, with or without modification,
 | 
			
		||||
are permitted provided that the following conditions are met:
 | 
			
		||||
 | 
			
		||||
You should have received a copy of the GNU Affero General Public License
 | 
			
		||||
along with this program; if not, write to the Free Software
 | 
			
		||||
Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA
 | 
			
		||||
or see http://www.gnu.org/licenses/agpl.txt.
 | 
			
		||||
 */
 | 
			
		||||
Redistributions of source code must retain the above copyright notice, this list
 | 
			
		||||
of conditions and the following disclaimer.
 | 
			
		||||
Redistributions in binary form must reproduce the above copyright notice, this
 | 
			
		||||
list of conditions and the following disclaimer in the documentation and/or
 | 
			
		||||
other materials provided with the distribution.
 | 
			
		||||
 | 
			
		||||
THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND
 | 
			
		||||
ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
 | 
			
		||||
WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
 | 
			
		||||
DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR
 | 
			
		||||
ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
 | 
			
		||||
(INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
 | 
			
		||||
LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON
 | 
			
		||||
ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
 | 
			
		||||
(INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
 | 
			
		||||
SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
 | 
			
		||||
 | 
			
		||||
*/
 | 
			
		||||
 | 
			
		||||
#ifndef REQUEST_HANDLER_H
 | 
			
		||||
#define REQUEST_HANDLER_H
 | 
			
		||||
@ -40,7 +47,7 @@ or see http://www.gnu.org/licenses/agpl.txt.
 | 
			
		||||
class RequestHandler : private boost::noncopyable {
 | 
			
		||||
public:
 | 
			
		||||
    typedef APIGrammar<std::string::iterator, RouteParameters> APIGrammarParser;
 | 
			
		||||
    explicit RequestHandler() { }
 | 
			
		||||
    explicit RequestHandler() : routing_machine(NULL) { }
 | 
			
		||||
 | 
			
		||||
    void handle_request(const http::Request& req, http::Reply& rep){
 | 
			
		||||
        //parse command
 | 
			
		||||
@ -90,6 +97,10 @@ public:
 | 
			
		||||
                rep.content += "^<br></pre>";
 | 
			
		||||
            } else {
 | 
			
		||||
                //parsing done, lets call the right plugin to handle the request
 | 
			
		||||
                BOOST_ASSERT_MSG(
 | 
			
		||||
                    routing_machine != NULL,
 | 
			
		||||
                    "pointer not init'ed"
 | 
			
		||||
                );
 | 
			
		||||
                routing_machine->RunQuery(routeParameters, rep);
 | 
			
		||||
                return;
 | 
			
		||||
            }
 | 
			
		||||
 | 
			
		||||
@ -1,22 +1,29 @@
 | 
			
		||||
/*
 | 
			
		||||
    open source routing machine
 | 
			
		||||
    Copyright (C) Dennis Luxen, 2010
 | 
			
		||||
 | 
			
		||||
This program is free software; you can redistribute it and/or modify
 | 
			
		||||
it under the terms of the GNU AFFERO General Public License as published by
 | 
			
		||||
the Free Software Foundation; either version 3 of the License, or
 | 
			
		||||
any later version.
 | 
			
		||||
Copyright (c) 2013, Project OSRM, Dennis Luxen, others
 | 
			
		||||
All rights reserved.
 | 
			
		||||
 | 
			
		||||
This program is distributed in the hope that it will be useful,
 | 
			
		||||
but WITHOUT ANY WARRANTY; without even the implied warranty of
 | 
			
		||||
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
 | 
			
		||||
GNU General Public License for more details.
 | 
			
		||||
Redistribution and use in source and binary forms, with or without modification,
 | 
			
		||||
are permitted provided that the following conditions are met:
 | 
			
		||||
 | 
			
		||||
You should have received a copy of the GNU Affero General Public License
 | 
			
		||||
along with this program; if not, write to the Free Software
 | 
			
		||||
Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA
 | 
			
		||||
or see http://www.gnu.org/licenses/agpl.txt.
 | 
			
		||||
 */
 | 
			
		||||
Redistributions of source code must retain the above copyright notice, this list
 | 
			
		||||
of conditions and the following disclaimer.
 | 
			
		||||
Redistributions in binary form must reproduce the above copyright notice, this
 | 
			
		||||
list of conditions and the following disclaimer in the documentation and/or
 | 
			
		||||
other materials provided with the distribution.
 | 
			
		||||
 | 
			
		||||
THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND
 | 
			
		||||
ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
 | 
			
		||||
WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
 | 
			
		||||
DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR
 | 
			
		||||
ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
 | 
			
		||||
(INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
 | 
			
		||||
LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON
 | 
			
		||||
ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
 | 
			
		||||
(INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
 | 
			
		||||
SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
 | 
			
		||||
 | 
			
		||||
*/
 | 
			
		||||
 | 
			
		||||
#ifndef REQUEST_PARSER_H
 | 
			
		||||
#define REQUEST_PARSER_H
 | 
			
		||||
 | 
			
		||||
@ -1,22 +1,29 @@
 | 
			
		||||
/*
 | 
			
		||||
    open source routing machine
 | 
			
		||||
    Copyright (C) Dennis Luxen, 2010
 | 
			
		||||
 | 
			
		||||
This program is free software; you can redistribute it and/or modify
 | 
			
		||||
it under the terms of the GNU AFFERO General Public License as published by
 | 
			
		||||
the Free Software Foundation; either version 3 of the License, or
 | 
			
		||||
any later version.
 | 
			
		||||
Copyright (c) 2013, Project OSRM, Dennis Luxen, others
 | 
			
		||||
All rights reserved.
 | 
			
		||||
 | 
			
		||||
This program is distributed in the hope that it will be useful,
 | 
			
		||||
but WITHOUT ANY WARRANTY; without even the implied warranty of
 | 
			
		||||
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
 | 
			
		||||
GNU General Public License for more details.
 | 
			
		||||
Redistribution and use in source and binary forms, with or without modification,
 | 
			
		||||
are permitted provided that the following conditions are met:
 | 
			
		||||
 | 
			
		||||
You should have received a copy of the GNU Affero General Public License
 | 
			
		||||
along with this program; if not, write to the Free Software
 | 
			
		||||
Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA
 | 
			
		||||
or see http://www.gnu.org/licenses/agpl.txt.
 | 
			
		||||
 */
 | 
			
		||||
Redistributions of source code must retain the above copyright notice, this list
 | 
			
		||||
of conditions and the following disclaimer.
 | 
			
		||||
Redistributions in binary form must reproduce the above copyright notice, this
 | 
			
		||||
list of conditions and the following disclaimer in the documentation and/or
 | 
			
		||||
other materials provided with the distribution.
 | 
			
		||||
 | 
			
		||||
THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND
 | 
			
		||||
ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
 | 
			
		||||
WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
 | 
			
		||||
DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR
 | 
			
		||||
ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
 | 
			
		||||
(INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
 | 
			
		||||
LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON
 | 
			
		||||
ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
 | 
			
		||||
(INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
 | 
			
		||||
SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
 | 
			
		||||
 | 
			
		||||
*/
 | 
			
		||||
 | 
			
		||||
#ifndef SERVER_H
 | 
			
		||||
#define SERVER_H
 | 
			
		||||
 | 
			
		||||
@ -1,67 +1,51 @@
 | 
			
		||||
/*
 | 
			
		||||
    open source routing machine
 | 
			
		||||
    Copyright (C) Dennis Luxen, 2010
 | 
			
		||||
 | 
			
		||||
This program is free software; you can redistribute it and/or modify
 | 
			
		||||
it under the terms of the GNU AFFERO General Public License as published by
 | 
			
		||||
the Free Software Foundation; either version 3 of the License, or
 | 
			
		||||
any later version.
 | 
			
		||||
Copyright (c) 2013, Project OSRM, Dennis Luxen, others
 | 
			
		||||
All rights reserved.
 | 
			
		||||
 | 
			
		||||
This program is distributed in the hope that it will be useful,
 | 
			
		||||
but WITHOUT ANY WARRANTY; without even the implied warranty of
 | 
			
		||||
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
 | 
			
		||||
GNU General Public License for more details.
 | 
			
		||||
Redistribution and use in source and binary forms, with or without modification,
 | 
			
		||||
are permitted provided that the following conditions are met:
 | 
			
		||||
 | 
			
		||||
You should have received a copy of the GNU Affero General Public License
 | 
			
		||||
along with this program; if not, write to the Free Software
 | 
			
		||||
Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA
 | 
			
		||||
or see http://www.gnu.org/licenses/agpl.txt.
 | 
			
		||||
 */
 | 
			
		||||
Redistributions of source code must retain the above copyright notice, this list
 | 
			
		||||
of conditions and the following disclaimer.
 | 
			
		||||
Redistributions in binary form must reproduce the above copyright notice, this
 | 
			
		||||
list of conditions and the following disclaimer in the documentation and/or
 | 
			
		||||
other materials provided with the distribution.
 | 
			
		||||
 | 
			
		||||
THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND
 | 
			
		||||
ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
 | 
			
		||||
WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
 | 
			
		||||
DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR
 | 
			
		||||
ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
 | 
			
		||||
(INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
 | 
			
		||||
LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON
 | 
			
		||||
ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
 | 
			
		||||
(INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
 | 
			
		||||
SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
 | 
			
		||||
 | 
			
		||||
*/
 | 
			
		||||
 | 
			
		||||
#ifndef SERVERFACTORY_H_
 | 
			
		||||
#define SERVERFACTORY_H_
 | 
			
		||||
 | 
			
		||||
#include "Server.h"
 | 
			
		||||
#include "../Util/IniFile.h"
 | 
			
		||||
#include "../Util/SimpleLogger.h"
 | 
			
		||||
#include "../Util/StringUtil.h"
 | 
			
		||||
 | 
			
		||||
#include <zlib.h>
 | 
			
		||||
 | 
			
		||||
#include <boost/noncopyable.hpp>
 | 
			
		||||
#include <sstream>
 | 
			
		||||
 | 
			
		||||
struct ServerFactory : boost::noncopyable {
 | 
			
		||||
	static Server * CreateServer( IniFile & serverConfig ) {
 | 
			
		||||
		int threads = omp_get_num_procs();
 | 
			
		||||
		if( serverConfig.GetParameter("IP").empty() ) {
 | 
			
		||||
			serverConfig.SetParameter("IP", "0.0.0.0");
 | 
			
		||||
		}
 | 
			
		||||
 | 
			
		||||
		if( serverConfig.GetParameter("Port").empty() ) {
 | 
			
		||||
			serverConfig.SetParameter("Port", "5000");
 | 
			
		||||
		}
 | 
			
		||||
 | 
			
		||||
		if(
 | 
			
		||||
			stringToInt(serverConfig.GetParameter("Threads")) >= 1 &&
 | 
			
		||||
			stringToInt(serverConfig.GetParameter("Threads")) <= threads
 | 
			
		||||
		) {
 | 
			
		||||
			threads = stringToInt( serverConfig.GetParameter("Threads") );
 | 
			
		||||
		}
 | 
			
		||||
	static Server * CreateServer(std::string& ip_address, int ip_port, int threads) {
 | 
			
		||||
 | 
			
		||||
		SimpleLogger().Write() <<
 | 
			
		||||
			"http 1.1 compression handled by zlib version " << zlibVersion();
 | 
			
		||||
 | 
			
		||||
		Server * server = new Server(
 | 
			
		||||
			serverConfig.GetParameter("IP"),
 | 
			
		||||
			serverConfig.GetParameter("Port"),
 | 
			
		||||
			threads
 | 
			
		||||
		);
 | 
			
		||||
		return server;
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	static Server * CreateServer(const char * iniFile) {
 | 
			
		||||
		IniFile serverConfig(iniFile);
 | 
			
		||||
		return CreateServer(serverConfig);
 | 
			
		||||
        std::stringstream   port_stream;
 | 
			
		||||
        port_stream << ip_port;
 | 
			
		||||
        return new Server( ip_address, port_stream.str(), std::min( omp_get_num_procs(), threads) );
 | 
			
		||||
	}
 | 
			
		||||
};
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
@ -1,22 +1,29 @@
 | 
			
		||||
/*
 | 
			
		||||
    open source routing machine
 | 
			
		||||
    Copyright (C) Dennis Luxen, 2010
 | 
			
		||||
 | 
			
		||||
This program is free software; you can redistribute it and/or modify
 | 
			
		||||
it under the terms of the GNU AFFERO General Public License as published by
 | 
			
		||||
the Free Software Foundation; either version 3 of the License, or
 | 
			
		||||
any later version.
 | 
			
		||||
Copyright (c) 2013, Project OSRM, Dennis Luxen, others
 | 
			
		||||
All rights reserved.
 | 
			
		||||
 | 
			
		||||
This program is distributed in the hope that it will be useful,
 | 
			
		||||
but WITHOUT ANY WARRANTY; without even the implied warranty of
 | 
			
		||||
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
 | 
			
		||||
GNU General Public License for more details.
 | 
			
		||||
Redistribution and use in source and binary forms, with or without modification,
 | 
			
		||||
are permitted provided that the following conditions are met:
 | 
			
		||||
 | 
			
		||||
You should have received a copy of the GNU Affero General Public License
 | 
			
		||||
along with this program; if not, write to the Free Software
 | 
			
		||||
Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA
 | 
			
		||||
or see http://www.gnu.org/licenses/agpl.txt.
 | 
			
		||||
 */
 | 
			
		||||
Redistributions of source code must retain the above copyright notice, this list
 | 
			
		||||
of conditions and the following disclaimer.
 | 
			
		||||
Redistributions in binary form must reproduce the above copyright notice, this
 | 
			
		||||
list of conditions and the following disclaimer in the documentation and/or
 | 
			
		||||
other materials provided with the distribution.
 | 
			
		||||
 | 
			
		||||
THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND
 | 
			
		||||
ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
 | 
			
		||||
WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
 | 
			
		||||
DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR
 | 
			
		||||
ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
 | 
			
		||||
(INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
 | 
			
		||||
LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON
 | 
			
		||||
ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
 | 
			
		||||
(INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
 | 
			
		||||
SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
 | 
			
		||||
 | 
			
		||||
*/
 | 
			
		||||
 | 
			
		||||
#include "../typedefs.h"
 | 
			
		||||
#include "../Algorithms/StronglyConnectedComponents.h"
 | 
			
		||||
@ -26,10 +33,10 @@ or see http://www.gnu.org/licenses/agpl.txt.
 | 
			
		||||
#include "../DataStructures/QueryEdge.h"
 | 
			
		||||
#include "../DataStructures/TurnInstructions.h"
 | 
			
		||||
#include "../Util/GraphLoader.h"
 | 
			
		||||
#include "../Util/IniFile.h"
 | 
			
		||||
#include "../Util/InputFileUtil.h"
 | 
			
		||||
#include "../Util/OSRMException.h"
 | 
			
		||||
#include "../Util/SimpleLogger.h"
 | 
			
		||||
#include "../Util/UUID.h"
 | 
			
		||||
 | 
			
		||||
#include <boost/foreach.hpp>
 | 
			
		||||
#include <fstream>
 | 
			
		||||
@ -58,6 +65,16 @@ int main (int argc, char * argv[]) {
 | 
			
		||||
    SimpleLogger().Write() <<
 | 
			
		||||
        "Using restrictions from file: " << argv[2];
 | 
			
		||||
    std::ifstream restriction_ifstream(argv[2], std::ios::binary);
 | 
			
		||||
    const UUID uuid_orig;
 | 
			
		||||
    UUID uuid_loaded;
 | 
			
		||||
    restriction_ifstream.read((char *) &uuid_loaded, sizeof(UUID));
 | 
			
		||||
 | 
			
		||||
    if( !uuid_loaded.TestGraphUtil(uuid_orig) ) {
 | 
			
		||||
        SimpleLogger().Write(logWARNING) <<
 | 
			
		||||
            argv[2] << " was prepared with a different build. "
 | 
			
		||||
            "Reprocess to get rid of this warning.";
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    if(!restriction_ifstream.good()) {
 | 
			
		||||
        throw OSRMException("Could not access <osrm-restrictions> files");
 | 
			
		||||
    }
 | 
			
		||||
@ -92,6 +109,11 @@ int main (int argc, char * argv[]) {
 | 
			
		||||
    );
 | 
			
		||||
    input_stream.close();
 | 
			
		||||
 | 
			
		||||
    BOOST_ASSERT_MSG(
 | 
			
		||||
        restrictions_vector.size() == usable_restriction_count,
 | 
			
		||||
        "size of restrictions_vector changed"
 | 
			
		||||
    );
 | 
			
		||||
 | 
			
		||||
    SimpleLogger().Write() <<
 | 
			
		||||
            restrictions_vector.size() << " restrictions, " <<
 | 
			
		||||
            bollard_node_IDs_vector.size() << " bollard nodes, " <<
 | 
			
		||||
 | 
			
		||||
							
								
								
									
										345
									
								
								Tools/io-benchmark.cpp
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										345
									
								
								Tools/io-benchmark.cpp
									
									
									
									
									
										Normal file
									
								
							@ -0,0 +1,345 @@
 | 
			
		||||
/*
 | 
			
		||||
 | 
			
		||||
Copyright (c) 2013, Project OSRM, Dennis Luxen, others
 | 
			
		||||
All rights reserved.
 | 
			
		||||
 | 
			
		||||
Redistribution and use in source and binary forms, with or without modification,
 | 
			
		||||
are permitted provided that the following conditions are met:
 | 
			
		||||
 | 
			
		||||
Redistributions of source code must retain the above copyright notice, this list
 | 
			
		||||
of conditions and the following disclaimer.
 | 
			
		||||
Redistributions in binary form must reproduce the above copyright notice, this
 | 
			
		||||
list of conditions and the following disclaimer in the documentation and/or
 | 
			
		||||
other materials provided with the distribution.
 | 
			
		||||
 | 
			
		||||
THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND
 | 
			
		||||
ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
 | 
			
		||||
WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
 | 
			
		||||
DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR
 | 
			
		||||
ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
 | 
			
		||||
(INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
 | 
			
		||||
LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON
 | 
			
		||||
ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
 | 
			
		||||
(INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
 | 
			
		||||
SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
 | 
			
		||||
 | 
			
		||||
*/
 | 
			
		||||
 | 
			
		||||
#include "../Util/OSRMException.h"
 | 
			
		||||
#include "../Util/SimpleLogger.h"
 | 
			
		||||
#include "../Util/TimingUtil.h"
 | 
			
		||||
 | 
			
		||||
#include <boost/filesystem.hpp>
 | 
			
		||||
#include <boost/filesystem/fstream.hpp>
 | 
			
		||||
#include <boost/ref.hpp>
 | 
			
		||||
 | 
			
		||||
#include <cmath>
 | 
			
		||||
#include <cstdio>
 | 
			
		||||
#include <cstdlib>
 | 
			
		||||
#include <fcntl.h>
 | 
			
		||||
#ifdef __linux__
 | 
			
		||||
#include <malloc.h>
 | 
			
		||||
#endif
 | 
			
		||||
#include <algorithm>
 | 
			
		||||
#include <iomanip>
 | 
			
		||||
#include <numeric>
 | 
			
		||||
#include <vector>
 | 
			
		||||
 | 
			
		||||
const unsigned number_of_elements = 268435456;
 | 
			
		||||
 | 
			
		||||
struct Statistics { double min, max, med, mean, dev; };
 | 
			
		||||
 | 
			
		||||
void RunStatistics(std::vector<double> & timings_vector, Statistics & stats) {
 | 
			
		||||
    std::sort(timings_vector.begin(), timings_vector.end());
 | 
			
		||||
    stats.min = timings_vector.front();
 | 
			
		||||
    stats.max = timings_vector.back();
 | 
			
		||||
    stats.med = timings_vector[timings_vector.size()/2];
 | 
			
		||||
    double primary_sum =    std::accumulate(
 | 
			
		||||
                                timings_vector.begin(),
 | 
			
		||||
                                timings_vector.end(),
 | 
			
		||||
                                0.0
 | 
			
		||||
                            );
 | 
			
		||||
    stats.mean = primary_sum / timings_vector.size();
 | 
			
		||||
 | 
			
		||||
    double primary_sq_sum = std::inner_product( timings_vector.begin(),
 | 
			
		||||
                                timings_vector.end(),
 | 
			
		||||
                                timings_vector.begin(),
 | 
			
		||||
                                0.0
 | 
			
		||||
                            );
 | 
			
		||||
     stats.dev = std::sqrt(
 | 
			
		||||
        primary_sq_sum / timings_vector.size() - (stats.mean * stats.mean)
 | 
			
		||||
    );
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
int main (int argc, char * argv[]) {
 | 
			
		||||
    LogPolicy::GetInstance().Unmute();
 | 
			
		||||
 | 
			
		||||
    SimpleLogger().Write(logDEBUG) << "starting up engines, compiled at " <<
 | 
			
		||||
        __DATE__ << ", " __TIME__;
 | 
			
		||||
 | 
			
		||||
    if( 1 == argc ) {
 | 
			
		||||
        SimpleLogger().Write(logWARNING) <<
 | 
			
		||||
            "usage: " << argv[0] << " /path/on/device";
 | 
			
		||||
        return -1;
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    boost::filesystem::path test_path = boost::filesystem::path(argv[1]);
 | 
			
		||||
    test_path /= "osrm.tst";
 | 
			
		||||
    SimpleLogger().Write(logDEBUG) << "temporary file: " << test_path.string();
 | 
			
		||||
 | 
			
		||||
    try {
 | 
			
		||||
        //create files for testing
 | 
			
		||||
        if( 2 == argc) {
 | 
			
		||||
            //create file to test
 | 
			
		||||
            if( boost::filesystem::exists(test_path) ) {
 | 
			
		||||
                throw OSRMException("Data file already exists");
 | 
			
		||||
            }
 | 
			
		||||
 | 
			
		||||
            double time1, time2;
 | 
			
		||||
            int * random_array = new int[number_of_elements];
 | 
			
		||||
            std::generate (
 | 
			
		||||
                random_array,
 | 
			
		||||
                random_array+number_of_elements,
 | 
			
		||||
                std::rand
 | 
			
		||||
            );
 | 
			
		||||
#ifdef __APPLE__
 | 
			
		||||
            FILE * fd = fopen(test_path.string().c_str(), "w");
 | 
			
		||||
            fcntl(fileno(fd), F_NOCACHE, 1);
 | 
			
		||||
            fcntl(fileno(fd), F_RDAHEAD, 0);
 | 
			
		||||
            time1 = get_timestamp();
 | 
			
		||||
            write(
 | 
			
		||||
                fileno(fd),
 | 
			
		||||
                (char*)random_array,
 | 
			
		||||
                number_of_elements*sizeof(unsigned)
 | 
			
		||||
            );
 | 
			
		||||
            time2 = get_timestamp();
 | 
			
		||||
            fclose(fd);
 | 
			
		||||
#endif
 | 
			
		||||
#ifdef __linux__
 | 
			
		||||
            int f = open(
 | 
			
		||||
                test_path.string().c_str(),
 | 
			
		||||
                O_CREAT|O_TRUNC|O_WRONLY|O_SYNC,
 | 
			
		||||
                S_IRWXU
 | 
			
		||||
            );
 | 
			
		||||
            time1 = get_timestamp();
 | 
			
		||||
            int ret = write(
 | 
			
		||||
                f,
 | 
			
		||||
                random_array,
 | 
			
		||||
                number_of_elements*sizeof(unsigned)
 | 
			
		||||
            );
 | 
			
		||||
            if(-1 == ret) {
 | 
			
		||||
                throw OSRMException("could not write random data file");
 | 
			
		||||
            }
 | 
			
		||||
            time2 = get_timestamp();
 | 
			
		||||
            close(f);
 | 
			
		||||
#endif
 | 
			
		||||
            delete[] random_array;
 | 
			
		||||
            SimpleLogger().Write(logDEBUG) <<
 | 
			
		||||
                "writing raw 1GB took " << (time2-time1)*1000 << "ms";
 | 
			
		||||
            SimpleLogger().Write() << "raw write performance: " <<
 | 
			
		||||
                std::setprecision(5) << std::fixed <<
 | 
			
		||||
                1024*1024/((time2-time1)*1000) << "MB/sec";
 | 
			
		||||
 | 
			
		||||
            SimpleLogger().Write(logDEBUG) <<
 | 
			
		||||
                "finished creation of random data. Flush disk cache now!";
 | 
			
		||||
 | 
			
		||||
        } else {
 | 
			
		||||
 | 
			
		||||
            //
 | 
			
		||||
            // Run Non-Cached I/O benchmarks
 | 
			
		||||
            //
 | 
			
		||||
 | 
			
		||||
            if( !boost::filesystem::exists(test_path) ) {
 | 
			
		||||
                throw OSRMException("data file does not exist");
 | 
			
		||||
            }
 | 
			
		||||
 | 
			
		||||
            double time1, time2;
 | 
			
		||||
            //volatiles do not get optimized
 | 
			
		||||
            Statistics stats;
 | 
			
		||||
 | 
			
		||||
#ifdef __APPLE__
 | 
			
		||||
            volatile unsigned single_block[1024];
 | 
			
		||||
            char * raw_array = new char[number_of_elements*sizeof(unsigned)];
 | 
			
		||||
            FILE * fd = fopen(test_path.string().c_str(), "r");
 | 
			
		||||
            fcntl(fileno(fd), F_NOCACHE, 1);
 | 
			
		||||
            fcntl(fileno(fd), F_RDAHEAD, 0);
 | 
			
		||||
#endif
 | 
			
		||||
#ifdef __linux__
 | 
			
		||||
            char * single_block = (char*) memalign(
 | 
			
		||||
                512,
 | 
			
		||||
                1024*sizeof(unsigned)
 | 
			
		||||
            );
 | 
			
		||||
 | 
			
		||||
            int f = open(test_path.string().c_str(), O_RDONLY|O_DIRECT|O_SYNC);
 | 
			
		||||
            SimpleLogger().Write(logDEBUG) <<
 | 
			
		||||
                "opened, error: " << strerror(errno);
 | 
			
		||||
            char * raw_array = (char*) memalign(
 | 
			
		||||
                512,
 | 
			
		||||
                number_of_elements*sizeof(unsigned)
 | 
			
		||||
            );
 | 
			
		||||
#endif
 | 
			
		||||
            time1 = get_timestamp();
 | 
			
		||||
#ifdef __APPLE__
 | 
			
		||||
            read(fileno(fd), raw_array, number_of_elements*sizeof(unsigned));
 | 
			
		||||
            close(fileno(fd));
 | 
			
		||||
            fd = fopen(test_path.string().c_str(), "r");
 | 
			
		||||
#endif
 | 
			
		||||
#ifdef __linux__
 | 
			
		||||
            int ret = read(f, raw_array, number_of_elements*sizeof(unsigned));
 | 
			
		||||
            SimpleLogger().Write(logDEBUG) <<
 | 
			
		||||
                "read " << ret << " bytes, error: " << strerror(errno);
 | 
			
		||||
            close(f);
 | 
			
		||||
            f = open(test_path.string().c_str(), O_RDONLY|O_DIRECT|O_SYNC);
 | 
			
		||||
            SimpleLogger().Write(logDEBUG) <<
 | 
			
		||||
                "opened, error: " << strerror(errno);
 | 
			
		||||
#endif
 | 
			
		||||
            time2 = get_timestamp();
 | 
			
		||||
 | 
			
		||||
            SimpleLogger().Write(logDEBUG) <<
 | 
			
		||||
                "reading raw 1GB took " << (time2-time1)*1000 << "ms";
 | 
			
		||||
            SimpleLogger().Write() << "raw read performance: " <<
 | 
			
		||||
                std::setprecision(5) << std::fixed <<
 | 
			
		||||
                1024*1024/((time2-time1)*1000) << "MB/sec";
 | 
			
		||||
 | 
			
		||||
            std::vector<double> timing_results_raw_random;
 | 
			
		||||
            SimpleLogger().Write(logDEBUG) << "running 1000 random I/Os of 4KB";
 | 
			
		||||
 | 
			
		||||
#ifdef __APPLE__
 | 
			
		||||
            fseek(fd, 0, SEEK_SET);
 | 
			
		||||
#endif
 | 
			
		||||
#ifdef __linux__
 | 
			
		||||
            lseek(f, 0, SEEK_SET);
 | 
			
		||||
#endif
 | 
			
		||||
            //make 1000 random access, time each I/O seperately
 | 
			
		||||
            unsigned number_of_blocks = (number_of_elements*sizeof(unsigned)-1)/4096;
 | 
			
		||||
            for(unsigned i = 0; i < 1000; ++i) {
 | 
			
		||||
                unsigned block_to_read = std::rand()%number_of_blocks;
 | 
			
		||||
                off_t current_offset = block_to_read*4096;
 | 
			
		||||
                time1 = get_timestamp();
 | 
			
		||||
#ifdef __APPLE__
 | 
			
		||||
                int ret1 = fseek(fd, current_offset, SEEK_SET);
 | 
			
		||||
                int ret2 = read(fileno(fd), (char*)&single_block[0], 4096);
 | 
			
		||||
#endif
 | 
			
		||||
#ifdef __linux__
 | 
			
		||||
                int ret1 = lseek(f, current_offset, SEEK_SET);
 | 
			
		||||
                int ret2 = read(f, (char*)single_block, 4096);
 | 
			
		||||
#endif
 | 
			
		||||
                time2 = get_timestamp();
 | 
			
		||||
                if( ((off_t)-1) == ret1) {
 | 
			
		||||
                    SimpleLogger().Write(logWARNING)
 | 
			
		||||
                        << "offset: " << current_offset;
 | 
			
		||||
                    SimpleLogger().Write(logWARNING)
 | 
			
		||||
                        << "seek error " << strerror(errno);
 | 
			
		||||
                    throw OSRMException("seek error");
 | 
			
		||||
                }
 | 
			
		||||
                 if(-1 == ret2) {
 | 
			
		||||
                    SimpleLogger().Write(logWARNING)
 | 
			
		||||
                        << "offset: " << current_offset;
 | 
			
		||||
                    SimpleLogger().Write(logWARNING)
 | 
			
		||||
                        << "read error " << strerror(errno);
 | 
			
		||||
                    throw OSRMException("read error");
 | 
			
		||||
                }
 | 
			
		||||
               timing_results_raw_random.push_back((time2-time1)*1000.);
 | 
			
		||||
            }
 | 
			
		||||
 | 
			
		||||
            // Do statistics
 | 
			
		||||
            SimpleLogger().Write(logDEBUG) << "running raw random I/O statistics";
 | 
			
		||||
            std::ofstream random_csv("random.csv", std::ios::trunc);
 | 
			
		||||
            for(unsigned i = 0; i < timing_results_raw_random.size(); ++i) {
 | 
			
		||||
                random_csv << i << ", " << timing_results_raw_random[i] << std::endl;
 | 
			
		||||
            }
 | 
			
		||||
            random_csv.close();
 | 
			
		||||
            RunStatistics(timing_results_raw_random, stats);
 | 
			
		||||
 | 
			
		||||
            SimpleLogger().Write() << "raw random I/O: "  <<
 | 
			
		||||
                std::setprecision(5) << std::fixed <<
 | 
			
		||||
                "min: "  << stats.min  << "ms, " <<
 | 
			
		||||
                "mean: " << stats.mean << "ms, " <<
 | 
			
		||||
                "med: "  << stats.med  << "ms, " <<
 | 
			
		||||
                "max: "  << stats.max  << "ms, " <<
 | 
			
		||||
                "dev: "  << stats.dev  << "ms";
 | 
			
		||||
 | 
			
		||||
            std::vector<double> timing_results_raw_seq;
 | 
			
		||||
#ifdef __APPLE__
 | 
			
		||||
            fseek(fd, 0, SEEK_SET);
 | 
			
		||||
#endif
 | 
			
		||||
#ifdef __linux__
 | 
			
		||||
            lseek(f, 0, SEEK_SET);
 | 
			
		||||
#endif
 | 
			
		||||
 | 
			
		||||
            //read every 100th block
 | 
			
		||||
            for(
 | 
			
		||||
                unsigned i = 0;
 | 
			
		||||
                i < 1000;
 | 
			
		||||
                ++i
 | 
			
		||||
            ) {
 | 
			
		||||
                off_t current_offset = i*4096;
 | 
			
		||||
                time1 = get_timestamp();
 | 
			
		||||
    #ifdef __APPLE__
 | 
			
		||||
                int ret1 = fseek(fd, current_offset, SEEK_SET);
 | 
			
		||||
                int ret2 = read(fileno(fd), (char*)&single_block, 4096);
 | 
			
		||||
    #endif
 | 
			
		||||
    #ifdef __linux__
 | 
			
		||||
                int ret1 = lseek(f, current_offset, SEEK_SET);
 | 
			
		||||
 | 
			
		||||
                int ret2 = read(f, (char*)single_block, 4096);
 | 
			
		||||
    #endif
 | 
			
		||||
                time2 = get_timestamp();
 | 
			
		||||
                if( ((off_t)-1) == ret1) {
 | 
			
		||||
                    SimpleLogger().Write(logWARNING)
 | 
			
		||||
                        << "offset: " << current_offset;
 | 
			
		||||
                    SimpleLogger().Write(logWARNING)
 | 
			
		||||
                        << "seek error " << strerror(errno);
 | 
			
		||||
                    throw OSRMException("seek error");
 | 
			
		||||
                }
 | 
			
		||||
                 if(-1 == ret2) {
 | 
			
		||||
                    SimpleLogger().Write(logWARNING)
 | 
			
		||||
                        << "offset: " << current_offset;
 | 
			
		||||
                    SimpleLogger().Write(logWARNING)
 | 
			
		||||
                        << "read error " << strerror(errno);
 | 
			
		||||
                    throw OSRMException("read error");
 | 
			
		||||
                }
 | 
			
		||||
               timing_results_raw_seq.push_back((time2-time1)*1000.);
 | 
			
		||||
            }
 | 
			
		||||
    #ifdef __APPLE__
 | 
			
		||||
            fclose(fd);
 | 
			
		||||
            // free(single_element);
 | 
			
		||||
            free(raw_array);
 | 
			
		||||
            // free(single_block);
 | 
			
		||||
    #endif
 | 
			
		||||
    #ifdef __linux__
 | 
			
		||||
            close(f);
 | 
			
		||||
    #endif
 | 
			
		||||
            //Do statistics
 | 
			
		||||
            SimpleLogger().Write(logDEBUG) << "running sequential I/O statistics";
 | 
			
		||||
            //print simple statistics: min, max, median, variance
 | 
			
		||||
            std::ofstream seq_csv("sequential.csv", std::ios::trunc);
 | 
			
		||||
            for(unsigned i = 0; i < timing_results_raw_seq.size(); ++i) {
 | 
			
		||||
                seq_csv << i << ", " << timing_results_raw_seq[i] << std::endl;
 | 
			
		||||
            }
 | 
			
		||||
            seq_csv.close();
 | 
			
		||||
            RunStatistics(timing_results_raw_seq, stats);
 | 
			
		||||
            SimpleLogger().Write() << "raw sequential I/O: " <<
 | 
			
		||||
                std::setprecision(5) << std::fixed <<
 | 
			
		||||
                "min: "  << stats.min  << "ms, " <<
 | 
			
		||||
                "mean: " << stats.mean << "ms, " <<
 | 
			
		||||
                "med: "  << stats.med  << "ms, " <<
 | 
			
		||||
                "max: "  << stats.max  << "ms, " <<
 | 
			
		||||
                "dev: "  << stats.dev  << "ms";
 | 
			
		||||
 | 
			
		||||
            if( boost::filesystem::exists(test_path) ) {
 | 
			
		||||
                boost::filesystem::remove(test_path);
 | 
			
		||||
                SimpleLogger().Write(logDEBUG) << "removing temporary files";
 | 
			
		||||
            }
 | 
			
		||||
        }
 | 
			
		||||
    } catch ( const std::exception & e ) {
 | 
			
		||||
        SimpleLogger().Write(logWARNING) << "caught exception: " << e.what();
 | 
			
		||||
        SimpleLogger().Write(logWARNING) << "cleaning up, and exiting";
 | 
			
		||||
        if(boost::filesystem::exists(test_path)) {
 | 
			
		||||
            boost::filesystem::remove(test_path);
 | 
			
		||||
            SimpleLogger().Write(logWARNING) << "removing temporary files";
 | 
			
		||||
        }
 | 
			
		||||
        return -1;
 | 
			
		||||
    }
 | 
			
		||||
    return 0;
 | 
			
		||||
}
 | 
			
		||||
@ -1,23 +1,29 @@
 | 
			
		||||
/*
 | 
			
		||||
    open source routing machine
 | 
			
		||||
    Copyright (C) Dennis Luxen, 2010
 | 
			
		||||
 | 
			
		||||
This program is free software; you can redistribute it and/or modify
 | 
			
		||||
it under the terms of the GNU AFFERO General Public License as published by
 | 
			
		||||
the Free Software Foundation; either version 3 of the License, or
 | 
			
		||||
any later version.
 | 
			
		||||
Copyright (c) 2013, Project OSRM, Dennis Luxen, others
 | 
			
		||||
All rights reserved.
 | 
			
		||||
 | 
			
		||||
This program is distributed in the hope that it will be useful,
 | 
			
		||||
but WITHOUT ANY WARRANTY; without even the implied warranty of
 | 
			
		||||
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
 | 
			
		||||
GNU General Public License for more details.
 | 
			
		||||
Redistribution and use in source and binary forms, with or without modification,
 | 
			
		||||
are permitted provided that the following conditions are met:
 | 
			
		||||
 | 
			
		||||
You should have received a copy of the GNU Affero General Public License
 | 
			
		||||
along with this program; if not, write to the Free Software
 | 
			
		||||
Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA
 | 
			
		||||
or see http://www.gnu.org/licenses/agpl.txt.
 | 
			
		||||
 */
 | 
			
		||||
Redistributions of source code must retain the above copyright notice, this list
 | 
			
		||||
of conditions and the following disclaimer.
 | 
			
		||||
Redistributions in binary form must reproduce the above copyright notice, this
 | 
			
		||||
list of conditions and the following disclaimer in the documentation and/or
 | 
			
		||||
other materials provided with the distribution.
 | 
			
		||||
 | 
			
		||||
THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND
 | 
			
		||||
ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
 | 
			
		||||
WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
 | 
			
		||||
DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR
 | 
			
		||||
ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
 | 
			
		||||
(INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
 | 
			
		||||
LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON
 | 
			
		||||
ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
 | 
			
		||||
(INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
 | 
			
		||||
SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
 | 
			
		||||
 | 
			
		||||
*/
 | 
			
		||||
 | 
			
		||||
#include "../Library/OSRM.h"
 | 
			
		||||
#include "../Util/SimpleLogger.h"
 | 
			
		||||
@ -44,13 +50,30 @@ void print_tree(boost::property_tree::ptree const& pt, const unsigned recursion_
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
int main (int argc, char * argv[]) {
 | 
			
		||||
int main (int argc, const char * argv[]) {
 | 
			
		||||
    LogPolicy::GetInstance().Unmute();
 | 
			
		||||
    try {
 | 
			
		||||
        std::cout   << "\n starting up engines, compile at "
 | 
			
		||||
                    << __DATE__ << ", " __TIME__ << std::endl;
 | 
			
		||||
        IniFile serverConfig((argc > 1 ? argv[1] : "server.ini"));
 | 
			
		||||
        OSRM routing_machine((argc > 1 ? argv[1] : "server.ini"));
 | 
			
		||||
        std::string ip_address;
 | 
			
		||||
        int ip_port, requested_num_threads;
 | 
			
		||||
 | 
			
		||||
        ServerPaths server_paths;
 | 
			
		||||
        if( !GenerateServerProgramOptions(
 | 
			
		||||
                argc,
 | 
			
		||||
                argv,
 | 
			
		||||
                server_paths,
 | 
			
		||||
                ip_address,
 | 
			
		||||
                ip_port,
 | 
			
		||||
                requested_num_threads
 | 
			
		||||
             )
 | 
			
		||||
        ) {
 | 
			
		||||
            return 0;
 | 
			
		||||
        }
 | 
			
		||||
 | 
			
		||||
        SimpleLogger().Write() <<
 | 
			
		||||
            "starting up engines, " << g_GIT_DESCRIPTION << ", " <<
 | 
			
		||||
            "compiled at " << __DATE__ << ", " __TIME__;
 | 
			
		||||
 | 
			
		||||
        OSRM routing_machine(server_paths);
 | 
			
		||||
 | 
			
		||||
        RouteParameters route_parameters;
 | 
			
		||||
        route_parameters.zoomLevel = 18; //no generalization
 | 
			
		||||
 | 
			
		||||
@ -1,24 +1,29 @@
 | 
			
		||||
/*
 | 
			
		||||
    open source routing machine
 | 
			
		||||
    Copyright (C) Dennis Luxen, others 2010
 | 
			
		||||
 | 
			
		||||
This program is free software; you can redistribute it and/or modify
 | 
			
		||||
it under the terms of the GNU AFFERO General Public License as published by
 | 
			
		||||
the Free Software Foundation; either version 3 of the License, or
 | 
			
		||||
any later version.
 | 
			
		||||
Copyright (c) 2013, Project OSRM, Dennis Luxen, others
 | 
			
		||||
All rights reserved.
 | 
			
		||||
 | 
			
		||||
This program is distributed in the hope that it will be useful,
 | 
			
		||||
but WITHOUT ANY WARRANTY; without even the implied warranty of
 | 
			
		||||
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
 | 
			
		||||
GNU General Public License for more details.
 | 
			
		||||
Redistribution and use in source and binary forms, with or without modification,
 | 
			
		||||
are permitted provided that the following conditions are met:
 | 
			
		||||
 | 
			
		||||
You should have received a copy of the GNU Affero General Public License
 | 
			
		||||
along with this program; if not, write to the Free Software
 | 
			
		||||
Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA
 | 
			
		||||
or see http://www.gnu.org/licenses/agpl.txt.
 | 
			
		||||
 */
 | 
			
		||||
Redistributions of source code must retain the above copyright notice, this list
 | 
			
		||||
of conditions and the following disclaimer.
 | 
			
		||||
Redistributions in binary form must reproduce the above copyright notice, this
 | 
			
		||||
list of conditions and the following disclaimer in the documentation and/or
 | 
			
		||||
other materials provided with the distribution.
 | 
			
		||||
 | 
			
		||||
THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND
 | 
			
		||||
ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
 | 
			
		||||
WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
 | 
			
		||||
DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR
 | 
			
		||||
ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
 | 
			
		||||
(INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
 | 
			
		||||
LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON
 | 
			
		||||
ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
 | 
			
		||||
(INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
 | 
			
		||||
SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
 | 
			
		||||
 | 
			
		||||
*/
 | 
			
		||||
 | 
			
		||||
#ifndef AZIMUTH_H_
 | 
			
		||||
#define AZIMUTH_H_
 | 
			
		||||
 | 
			
		||||
@ -1,9 +1,29 @@
 | 
			
		||||
/*
 | 
			
		||||
 * ContainerUtils.h
 | 
			
		||||
 *
 | 
			
		||||
 *  Created on: 02.02.2013
 | 
			
		||||
 *      Author: dennis
 | 
			
		||||
 */
 | 
			
		||||
 | 
			
		||||
Copyright (c) 2013, Project OSRM, Dennis Luxen, others
 | 
			
		||||
All rights reserved.
 | 
			
		||||
 | 
			
		||||
Redistribution and use in source and binary forms, with or without modification,
 | 
			
		||||
are permitted provided that the following conditions are met:
 | 
			
		||||
 | 
			
		||||
Redistributions of source code must retain the above copyright notice, this list
 | 
			
		||||
of conditions and the following disclaimer.
 | 
			
		||||
Redistributions in binary form must reproduce the above copyright notice, this
 | 
			
		||||
list of conditions and the following disclaimer in the documentation and/or
 | 
			
		||||
other materials provided with the distribution.
 | 
			
		||||
 | 
			
		||||
THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND
 | 
			
		||||
ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
 | 
			
		||||
WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
 | 
			
		||||
DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR
 | 
			
		||||
ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
 | 
			
		||||
(INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
 | 
			
		||||
LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON
 | 
			
		||||
ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
 | 
			
		||||
(INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
 | 
			
		||||
SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
 | 
			
		||||
 | 
			
		||||
*/
 | 
			
		||||
 | 
			
		||||
#ifndef CONTAINERUTILS_H_
 | 
			
		||||
#define CONTAINERUTILS_H_
 | 
			
		||||
 | 
			
		||||
							
								
								
									
										29
									
								
								Util/GitDescription.cpp.in
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										29
									
								
								Util/GitDescription.cpp.in
									
									
									
									
									
										Normal file
									
								
							@ -0,0 +1,29 @@
 | 
			
		||||
/*
 | 
			
		||||
 | 
			
		||||
Copyright (c) 2013, Project OSRM, Dennis Luxen, others
 | 
			
		||||
All rights reserved.
 | 
			
		||||
 | 
			
		||||
Redistribution and use in source and binary forms, with or without modification,
 | 
			
		||||
are permitted provided that the following conditions are met:
 | 
			
		||||
 | 
			
		||||
Redistributions of source code must retain the above copyright notice, this list
 | 
			
		||||
of conditions and the following disclaimer.
 | 
			
		||||
Redistributions in binary form must reproduce the above copyright notice, this
 | 
			
		||||
list of conditions and the following disclaimer in the documentation and/or
 | 
			
		||||
other materials provided with the distribution.
 | 
			
		||||
 | 
			
		||||
THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND
 | 
			
		||||
ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
 | 
			
		||||
WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
 | 
			
		||||
DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR
 | 
			
		||||
ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
 | 
			
		||||
(INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
 | 
			
		||||
LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON
 | 
			
		||||
ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
 | 
			
		||||
(INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
 | 
			
		||||
SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
 | 
			
		||||
 | 
			
		||||
*/
 | 
			
		||||
 | 
			
		||||
#define GIT_DESCRIPTION "${GIT_DESCRIPTION}"
 | 
			
		||||
char g_GIT_DESCRIPTION[] = GIT_DESCRIPTION;
 | 
			
		||||
							
								
								
									
										28
									
								
								Util/GitDescription.h
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										28
									
								
								Util/GitDescription.h
									
									
									
									
									
										Normal file
									
								
							@ -0,0 +1,28 @@
 | 
			
		||||
/*
 | 
			
		||||
 | 
			
		||||
Copyright (c) 2013, Project OSRM, Dennis Luxen, others
 | 
			
		||||
All rights reserved.
 | 
			
		||||
 | 
			
		||||
Redistribution and use in source and binary forms, with or without modification,
 | 
			
		||||
are permitted provided that the following conditions are met:
 | 
			
		||||
 | 
			
		||||
Redistributions of source code must retain the above copyright notice, this list
 | 
			
		||||
of conditions and the following disclaimer.
 | 
			
		||||
Redistributions in binary form must reproduce the above copyright notice, this
 | 
			
		||||
list of conditions and the following disclaimer in the documentation and/or
 | 
			
		||||
other materials provided with the distribution.
 | 
			
		||||
 | 
			
		||||
THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND
 | 
			
		||||
ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
 | 
			
		||||
WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
 | 
			
		||||
DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR
 | 
			
		||||
ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
 | 
			
		||||
(INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
 | 
			
		||||
LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON
 | 
			
		||||
ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
 | 
			
		||||
(INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
 | 
			
		||||
SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
 | 
			
		||||
 | 
			
		||||
*/
 | 
			
		||||
 | 
			
		||||
extern char g_GIT_DESCRIPTION[];
 | 
			
		||||
@ -1,22 +1,29 @@
 | 
			
		||||
/*
 | 
			
		||||
    open source routing machine
 | 
			
		||||
    Copyright (C) Dennis Luxen, others 2010
 | 
			
		||||
 | 
			
		||||
This program is free software; you can redistribute it and/or modify
 | 
			
		||||
it under the terms of the GNU AFFERO General Public License as published by
 | 
			
		||||
the Free Software Foundation; either version 3 of the License, or
 | 
			
		||||
any later version.
 | 
			
		||||
Copyright (c) 2013, Project OSRM, Dennis Luxen, others
 | 
			
		||||
All rights reserved.
 | 
			
		||||
 | 
			
		||||
This program is distributed in the hope that it will be useful,
 | 
			
		||||
but WITHOUT ANY WARRANTY; without even the implied warranty of
 | 
			
		||||
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
 | 
			
		||||
GNU General Public License for more details.
 | 
			
		||||
Redistribution and use in source and binary forms, with or without modification,
 | 
			
		||||
are permitted provided that the following conditions are met:
 | 
			
		||||
 | 
			
		||||
You should have received a copy of the GNU Affero General Public License
 | 
			
		||||
along with this program; if not, write to the Free Software
 | 
			
		||||
Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA
 | 
			
		||||
or see http://www.gnu.org/licenses/agpl.txt.
 | 
			
		||||
 */
 | 
			
		||||
Redistributions of source code must retain the above copyright notice, this list
 | 
			
		||||
of conditions and the following disclaimer.
 | 
			
		||||
Redistributions in binary form must reproduce the above copyright notice, this
 | 
			
		||||
list of conditions and the following disclaimer in the documentation and/or
 | 
			
		||||
other materials provided with the distribution.
 | 
			
		||||
 | 
			
		||||
THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND
 | 
			
		||||
ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
 | 
			
		||||
WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
 | 
			
		||||
DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR
 | 
			
		||||
ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
 | 
			
		||||
(INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
 | 
			
		||||
LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON
 | 
			
		||||
ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
 | 
			
		||||
(INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
 | 
			
		||||
SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
 | 
			
		||||
 | 
			
		||||
*/
 | 
			
		||||
 | 
			
		||||
#ifndef GRAPHLOADER_H
 | 
			
		||||
#define GRAPHLOADER_H
 | 
			
		||||
@ -68,21 +75,21 @@ NodeID readBinaryOSRMGraphFromStream(
 | 
			
		||||
 | 
			
		||||
    if( !uuid_loaded.TestGraphUtil(uuid_orig) ) {
 | 
			
		||||
        SimpleLogger().Write(logWARNING) <<
 | 
			
		||||
            ".osrm was prepared with different build.\n"
 | 
			
		||||
            ".osrm was prepared with different build."
 | 
			
		||||
            "Reprocess to get rid of this warning.";
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    NodeID n, source, target;
 | 
			
		||||
    EdgeID m;
 | 
			
		||||
    short dir;// direction (0 = open, 1 = forward, 2+ = open)
 | 
			
		||||
    ExternalNodeMap ext2IntNodeMap;
 | 
			
		||||
    ExternalNodeMap ext_to_int_id_map;
 | 
			
		||||
    in.read((char*)&n, sizeof(NodeID));
 | 
			
		||||
    SimpleLogger().Write() << "Importing n = " << n << " nodes ";
 | 
			
		||||
    _Node node;
 | 
			
		||||
    for (NodeID i=0; i<n; ++i) {
 | 
			
		||||
        in.read((char*)&node, sizeof(_Node));
 | 
			
		||||
        int2ExtNodeMap->push_back(NodeInfo(node.lat, node.lon, node.id));
 | 
			
		||||
        ext2IntNodeMap.insert(std::make_pair(node.id, i));
 | 
			
		||||
        ext_to_int_id_map.emplace(node.id, i);
 | 
			
		||||
        if(node.bollard) {
 | 
			
		||||
        	bollardNodes.push_back(i);
 | 
			
		||||
        }
 | 
			
		||||
@ -97,28 +104,29 @@ NodeID readBinaryOSRMGraphFromStream(
 | 
			
		||||
 | 
			
		||||
    in.read((char*)&m, sizeof(unsigned));
 | 
			
		||||
    SimpleLogger().Write() << " and " << m << " edges ";
 | 
			
		||||
    for(unsigned i = 0; i < inputRestrictions.size(); ++i) {
 | 
			
		||||
        ExternalNodeMap::iterator intNodeID = ext2IntNodeMap.find(inputRestrictions[i].fromNode);
 | 
			
		||||
        if( intNodeID == ext2IntNodeMap.end()) {
 | 
			
		||||
    // for(unsigned i = 0; i < inputRestrictions.size(); ++i) {
 | 
			
		||||
    BOOST_FOREACH(TurnRestriction & current_restriction, inputRestrictions) {
 | 
			
		||||
        ExternalNodeMap::iterator intNodeID = ext_to_int_id_map.find(current_restriction.fromNode);
 | 
			
		||||
        if( intNodeID == ext_to_int_id_map.end()) {
 | 
			
		||||
            SimpleLogger().Write(logDEBUG) << "Unmapped from Node of restriction";
 | 
			
		||||
            continue;
 | 
			
		||||
 | 
			
		||||
        }
 | 
			
		||||
        inputRestrictions[i].fromNode = intNodeID->second;
 | 
			
		||||
        current_restriction.fromNode = intNodeID->second;
 | 
			
		||||
 | 
			
		||||
        intNodeID = ext2IntNodeMap.find(inputRestrictions[i].viaNode);
 | 
			
		||||
        if( intNodeID == ext2IntNodeMap.end()) {
 | 
			
		||||
        intNodeID = ext_to_int_id_map.find(current_restriction.viaNode);
 | 
			
		||||
        if( intNodeID == ext_to_int_id_map.end()) {
 | 
			
		||||
            SimpleLogger().Write(logDEBUG) << "Unmapped via node of restriction";
 | 
			
		||||
            continue;
 | 
			
		||||
        }
 | 
			
		||||
        inputRestrictions[i].viaNode = intNodeID->second;
 | 
			
		||||
        current_restriction.viaNode = intNodeID->second;
 | 
			
		||||
 | 
			
		||||
        intNodeID = ext2IntNodeMap.find(inputRestrictions[i].toNode);
 | 
			
		||||
        if( intNodeID == ext2IntNodeMap.end()) {
 | 
			
		||||
        intNodeID = ext_to_int_id_map.find(current_restriction.toNode);
 | 
			
		||||
        if( intNodeID == ext_to_int_id_map.end()) {
 | 
			
		||||
            SimpleLogger().Write(logDEBUG) << "Unmapped to node of restriction";
 | 
			
		||||
            continue;
 | 
			
		||||
        }
 | 
			
		||||
        inputRestrictions[i].toNode = intNodeID->second;
 | 
			
		||||
        current_restriction.toNode = intNodeID->second;
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    edgeList.reserve(m);
 | 
			
		||||
@ -153,8 +161,8 @@ NodeID readBinaryOSRMGraphFromStream(
 | 
			
		||||
        assert(type >= 0);
 | 
			
		||||
 | 
			
		||||
        //         translate the external NodeIDs to internal IDs
 | 
			
		||||
        ExternalNodeMap::iterator intNodeID = ext2IntNodeMap.find(source);
 | 
			
		||||
        if( ext2IntNodeMap.find(source) == ext2IntNodeMap.end()) {
 | 
			
		||||
        ExternalNodeMap::iterator intNodeID = ext_to_int_id_map.find(source);
 | 
			
		||||
        if( ext_to_int_id_map.find(source) == ext_to_int_id_map.end()) {
 | 
			
		||||
#ifndef NDEBUG
 | 
			
		||||
            SimpleLogger().Write(logWARNING) <<
 | 
			
		||||
                " unresolved source NodeID: " << source;
 | 
			
		||||
@ -162,8 +170,8 @@ NodeID readBinaryOSRMGraphFromStream(
 | 
			
		||||
            continue;
 | 
			
		||||
        }
 | 
			
		||||
        source = intNodeID->second;
 | 
			
		||||
        intNodeID = ext2IntNodeMap.find(target);
 | 
			
		||||
        if(ext2IntNodeMap.find(target) == ext2IntNodeMap.end()) {
 | 
			
		||||
        intNodeID = ext_to_int_id_map.find(target);
 | 
			
		||||
        if(ext_to_int_id_map.find(target) == ext_to_int_id_map.end()) {
 | 
			
		||||
#ifndef NDEBUG
 | 
			
		||||
            SimpleLogger().Write(logWARNING) <<
 | 
			
		||||
            "unresolved target NodeID : " << target;
 | 
			
		||||
@ -215,7 +223,7 @@ NodeID readBinaryOSRMGraphFromStream(
 | 
			
		||||
        }
 | 
			
		||||
    }
 | 
			
		||||
    typename std::vector<EdgeT>::iterator newEnd = std::remove_if(edgeList.begin(), edgeList.end(), _ExcessRemover<EdgeT>());
 | 
			
		||||
    ext2IntNodeMap.clear();
 | 
			
		||||
    ext_to_int_id_map.clear();
 | 
			
		||||
    std::vector<EdgeT>(edgeList.begin(), newEnd).swap(edgeList); //remove excess candidates.
 | 
			
		||||
    SimpleLogger().Write() << "Graph loaded ok and has " << edgeList.size() << " edges";
 | 
			
		||||
    return n;
 | 
			
		||||
@ -225,13 +233,13 @@ NodeID readDTMPGraphFromStream(std::istream &in, std::vector<EdgeT>& edgeList, s
 | 
			
		||||
    NodeID n, source, target, id;
 | 
			
		||||
    EdgeID m;
 | 
			
		||||
    int dir, xcoord, ycoord;// direction (0 = open, 1 = forward, 2+ = open)
 | 
			
		||||
    ExternalNodeMap ext2IntNodeMap;
 | 
			
		||||
    ExternalNodeMap ext_to_int_id_map;
 | 
			
		||||
    in >> n;
 | 
			
		||||
    SimpleLogger().Write(logDEBUG) << "Importing n = " << n << " nodes ";
 | 
			
		||||
    for (NodeID i=0; i<n; ++i) {
 | 
			
		||||
        in >> id >> ycoord >> xcoord;
 | 
			
		||||
        int2ExtNodeMap->push_back(NodeInfo(xcoord, ycoord, id));
 | 
			
		||||
        ext2IntNodeMap.insert(std::make_pair(id, i));
 | 
			
		||||
        ext_to_int_id_map.insert(std::make_pair(id, i));
 | 
			
		||||
    }
 | 
			
		||||
    in >> m;
 | 
			
		||||
    SimpleLogger().Write(logDEBUG) << " and " << m << " edges";
 | 
			
		||||
@ -321,13 +329,13 @@ NodeID readDTMPGraphFromStream(std::istream &in, std::vector<EdgeT>& edgeList, s
 | 
			
		||||
        }
 | 
			
		||||
 | 
			
		||||
        //         translate the external NodeIDs to internal IDs
 | 
			
		||||
        ExternalNodeMap::iterator intNodeID = ext2IntNodeMap.find(source);
 | 
			
		||||
        if( ext2IntNodeMap.find(source) == ext2IntNodeMap.end()) {
 | 
			
		||||
        ExternalNodeMap::iterator intNodeID = ext_to_int_id_map.find(source);
 | 
			
		||||
        if( ext_to_int_id_map.find(source) == ext_to_int_id_map.end()) {
 | 
			
		||||
            throw OSRMException("unresolvable source Node ID");
 | 
			
		||||
        }
 | 
			
		||||
        source = intNodeID->second;
 | 
			
		||||
        intNodeID = ext2IntNodeMap.find(target);
 | 
			
		||||
        if(ext2IntNodeMap.find(target) == ext2IntNodeMap.end()) {
 | 
			
		||||
        intNodeID = ext_to_int_id_map.find(target);
 | 
			
		||||
        if(ext_to_int_id_map.find(target) == ext_to_int_id_map.end()) {
 | 
			
		||||
            throw OSRMException("unresolvable target Node ID");
 | 
			
		||||
        }
 | 
			
		||||
        target = intNodeID->second;
 | 
			
		||||
@ -339,7 +347,7 @@ NodeID readDTMPGraphFromStream(std::istream &in, std::vector<EdgeT>& edgeList, s
 | 
			
		||||
        EdgeT inputEdge(source, target, 0, weight, forward, backward, type );
 | 
			
		||||
        edgeList.push_back(inputEdge);
 | 
			
		||||
    }
 | 
			
		||||
    ext2IntNodeMap.clear();
 | 
			
		||||
    ext_to_int_id_map.clear();
 | 
			
		||||
    std::vector<EdgeT>(edgeList.begin(), edgeList.end()).swap(edgeList); //remove excess candidates.
 | 
			
		||||
    std::cout << "ok" << std::endl;
 | 
			
		||||
    return n;
 | 
			
		||||
 | 
			
		||||
Some files were not shown because too many files have changed in this diff Show More
		Loading…
	
		Reference in New Issue
	
	Block a user