Welcome to mirror list, hosted at ThFree Co, Russian Federation.

github.com/mapsme/omim.git - Unnamed repository; edit this file 'description' to name the repository.
summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorLev Dragunov <l.dragunov@corp.mail.ru>2014-12-17 14:43:09 +0300
committerAlex Zolotarev <alex@maps.me>2015-09-23 02:35:07 +0300
commit84db1d1338a6d589f33f62c844b88cdbb356d374 (patch)
tree4ec5c70f93cba1c87df19f42a2b7d2c6a132444a /3party/osrm
parent3a0135ff67a10988b9b284c6d143ad31f14b05a5 (diff)
OSRM update to commit 75f9c0844550261d5e9c842d0a10b8f82eac2965. CHECK MAPS.ME OSRM DIFFS FROM HERE
Diffstat (limited to '3party/osrm')
-rw-r--r--3party/osrm/osrm-backend/.clang-format53
-rw-r--r--3party/osrm/osrm-backend/.gitignore93
-rw-r--r--3party/osrm/osrm-backend/.gitmodules0
-rw-r--r--3party/osrm/osrm-backend/.travis.yml54
-rw-r--r--3party/osrm/osrm-backend/Algorithms/BFSComponentExplorer.h17
-rw-r--r--3party/osrm/osrm-backend/Algorithms/DouglasPeucker.cpp16
-rw-r--r--3party/osrm/osrm-backend/Algorithms/DouglasPeucker.h2
-rw-r--r--3party/osrm/osrm-backend/Algorithms/IteratorBasedCRC32.h118
-rw-r--r--3party/osrm/osrm-backend/Algorithms/ObjectToBase64.h111
-rw-r--r--3party/osrm/osrm-backend/Algorithms/PolylineCompressor.cpp18
-rw-r--r--3party/osrm/osrm-backend/Algorithms/StronglyConnectedComponents.h14
-rw-r--r--3party/osrm/osrm-backend/Benchmarks/StaticRTreeBench.cpp76
-rw-r--r--3party/osrm/osrm-backend/CMakeLists.txt145
-rw-r--r--3party/osrm/osrm-backend/Contractor/Contractor.h19
-rw-r--r--3party/osrm/osrm-backend/Contractor/EdgeBasedGraphFactory.cpp333
-rw-r--r--3party/osrm/osrm-backend/Contractor/EdgeBasedGraphFactory.h20
-rw-r--r--3party/osrm/osrm-backend/Contractor/GeometryCompressor.cpp15
-rw-r--r--3party/osrm/osrm-backend/Contractor/GeometryCompressor.h10
-rw-r--r--3party/osrm/osrm-backend/Contractor/Prepare.cpp124
-rw-r--r--3party/osrm/osrm-backend/Contractor/Prepare.h18
-rw-r--r--3party/osrm/osrm-backend/DataStructures/BinaryHeap.h4
-rw-r--r--3party/osrm/osrm-backend/DataStructures/ConcurrentQueue.h2
-rw-r--r--3party/osrm/osrm-backend/DataStructures/Coordinate.cpp58
-rw-r--r--3party/osrm/osrm-backend/DataStructures/DeallocatingVector.h6
-rw-r--r--3party/osrm/osrm-backend/DataStructures/DynamicGraph.h12
-rw-r--r--3party/osrm/osrm-backend/DataStructures/EdgeBasedNode.h26
-rw-r--r--3party/osrm/osrm-backend/DataStructures/EdgeBasedNodeData.h123
-rw-r--r--3party/osrm/osrm-backend/DataStructures/FixedPointNumber.h216
-rw-r--r--3party/osrm/osrm-backend/DataStructures/HashTable.h2
-rw-r--r--3party/osrm/osrm-backend/DataStructures/ImportEdge.cpp11
-rw-r--r--3party/osrm/osrm-backend/DataStructures/ImportEdge.h13
-rw-r--r--3party/osrm/osrm-backend/DataStructures/JSONContainer.h77
-rw-r--r--3party/osrm/osrm-backend/DataStructures/NodeBasedGraph.h36
-rw-r--r--3party/osrm/osrm-backend/DataStructures/OriginalEdgeData.h10
-rw-r--r--3party/osrm/osrm-backend/DataStructures/PhantomNodes.h20
-rw-r--r--3party/osrm/osrm-backend/DataStructures/QueryNode.h6
-rw-r--r--3party/osrm/osrm-backend/DataStructures/Range.h5
-rw-r--r--3party/osrm/osrm-backend/DataStructures/RangeTable.h14
-rw-r--r--3party/osrm/osrm-backend/DataStructures/RawRouteData.h19
-rw-r--r--3party/osrm/osrm-backend/DataStructures/Restriction.h4
-rw-r--r--3party/osrm/osrm-backend/DataStructures/RestrictionMap.cpp13
-rw-r--r--3party/osrm/osrm-backend/DataStructures/RestrictionMap.h10
-rw-r--r--3party/osrm/osrm-backend/DataStructures/RouteParameters.cpp10
-rw-r--r--3party/osrm/osrm-backend/DataStructures/SearchEngineData.h6
-rw-r--r--3party/osrm/osrm-backend/DataStructures/SegmentInformation.h18
-rw-r--r--3party/osrm/osrm-backend/DataStructures/SharedMemoryFactory.h23
-rw-r--r--3party/osrm/osrm-backend/DataStructures/SharedMemoryVectorWrapper.h10
-rw-r--r--3party/osrm/osrm-backend/DataStructures/StaticGraph.h17
-rw-r--r--3party/osrm/osrm-backend/DataStructures/StaticKDTree.h2
-rw-r--r--3party/osrm/osrm-backend/DataStructures/StaticRTree.h117
-rw-r--r--3party/osrm/osrm-backend/DataStructures/TravelMode.h (renamed from 3party/osrm/osrm-backend/Util/NumericUtil.h)18
-rw-r--r--3party/osrm/osrm-backend/DataStructures/TurnInstructions.h2
-rw-r--r--3party/osrm/osrm-backend/DataStructures/XORFastHashStorage.h8
-rw-r--r--3party/osrm/osrm-backend/Descriptors/DescriptionFactory.cpp51
-rw-r--r--3party/osrm/osrm-backend/Descriptors/DescriptionFactory.h15
-rw-r--r--3party/osrm/osrm-backend/Descriptors/GPXDescriptor.h19
-rw-r--r--3party/osrm/osrm-backend/Descriptors/JSONDescriptor.h54
-rw-r--r--3party/osrm/osrm-backend/Extractor/BaseParser.cpp2
-rw-r--r--3party/osrm/osrm-backend/Extractor/ExtractionContainers.cpp12
-rw-r--r--3party/osrm/osrm-backend/Extractor/ExtractionContainers.h14
-rw-r--r--3party/osrm/osrm-backend/Extractor/ExtractionHelperFunctions.h15
-rw-r--r--3party/osrm/osrm-backend/Extractor/ExtractionWay.h63
-rw-r--r--3party/osrm/osrm-backend/Extractor/Extractor.cpp4
-rw-r--r--3party/osrm/osrm-backend/Extractor/ExtractorCallbacks.cpp41
-rw-r--r--3party/osrm/osrm-backend/Extractor/ExtractorStructs.h6
-rw-r--r--3party/osrm/osrm-backend/Extractor/InternalExtractorEdge.h28
-rw-r--r--3party/osrm/osrm-backend/Extractor/PBFParser.cpp3
-rw-r--r--3party/osrm/osrm-backend/Extractor/ScriptingEnvironment.cpp9
-rw-r--r--3party/osrm/osrm-backend/Extractor/XMLParser.cpp19
-rw-r--r--3party/osrm/osrm-backend/Include/osrm/Coordinate.h11
-rw-r--r--3party/osrm/osrm-backend/Include/osrm/Header.h2
-rw-r--r--3party/osrm/osrm-backend/Include/osrm/RouteParameters.h3
-rw-r--r--3party/osrm/osrm-backend/Library/OSRM.h6
-rw-r--r--3party/osrm/osrm-backend/Library/OSRM_impl.cpp25
-rw-r--r--3party/osrm/osrm-backend/Library/OSRM_impl.h9
-rw-r--r--3party/osrm/osrm-backend/Plugins/DistanceTablePlugin.h18
-rw-r--r--3party/osrm/osrm-backend/Plugins/HelloWorldPlugin.h22
-rw-r--r--3party/osrm/osrm-backend/Plugins/LocatePlugin.h13
-rw-r--r--3party/osrm/osrm-backend/Plugins/NearestPlugin.h55
-rw-r--r--3party/osrm/osrm-backend/Plugins/TimestampPlugin.h6
-rw-r--r--3party/osrm/osrm-backend/Plugins/ViaRoutePlugin.h23
-rw-r--r--3party/osrm/osrm-backend/README.md2
-rw-r--r--3party/osrm/osrm-backend/Rakefile8
-rw-r--r--3party/osrm/osrm-backend/RoutingAlgorithms/AlternativePathRouting.h13
-rw-r--r--3party/osrm/osrm-backend/RoutingAlgorithms/BasicRoutingInterface.h204
-rw-r--r--3party/osrm/osrm-backend/RoutingAlgorithms/ManyToManyRouting.h8
-rw-r--r--3party/osrm/osrm-backend/RoutingAlgorithms/ShortestPathRouting.h6
-rw-r--r--3party/osrm/osrm-backend/Server/APIGrammar.h5
-rw-r--r--3party/osrm/osrm-backend/Server/DataStructures/BaseDataFacade.h17
-rw-r--r--3party/osrm/osrm-backend/Server/DataStructures/InternalDataFacade.h77
-rw-r--r--3party/osrm/osrm-backend/Server/DataStructures/SharedDataFacade.h121
-rw-r--r--3party/osrm/osrm-backend/Server/DataStructures/SharedDataType.h7
-rw-r--r--3party/osrm/osrm-backend/Server/Http/Reply.cpp7
-rw-r--r--3party/osrm/osrm-backend/Server/RequestHandler.cpp26
-rw-r--r--3party/osrm/osrm-backend/Server/RequestHandler.h2
-rw-r--r--3party/osrm/osrm-backend/Server/RequestParser.cpp20
-rw-r--r--3party/osrm/osrm-backend/Server/Server.h31
-rw-r--r--3party/osrm/osrm-backend/ThirdParty/variant/recursive_wrapper.hpp127
-rw-r--r--3party/osrm/osrm-backend/ThirdParty/variant/variant.hpp740
-rw-r--r--3party/osrm/osrm-backend/Tools/check-hsgr.cpp63
-rw-r--r--3party/osrm/osrm-backend/Tools/components.cpp42
-rw-r--r--3party/osrm/osrm-backend/Tools/io-benchmark.cpp78
-rw-r--r--3party/osrm/osrm-backend/Tools/simpleclient.cpp5
-rw-r--r--3party/osrm/osrm-backend/Tools/springclean.cpp102
-rw-r--r--3party/osrm/osrm-backend/Tools/unlock_all_mutexes.cpp5
-rw-r--r--3party/osrm/osrm-backend/UnitTests/DataStructures/StaticRTreeTest.cpp8
-rw-r--r--3party/osrm/osrm-backend/Util/BoostFileSystemFix.h19
-rw-r--r--3party/osrm/osrm-backend/Util/DataStoreOptions.h9
-rw-r--r--3party/osrm/osrm-backend/Util/FingerPrint.cpp.in3
-rw-r--r--3party/osrm/osrm-backend/Util/GraphLoader.h37
-rw-r--r--3party/osrm/osrm-backend/Util/MachineInfo.h4
-rw-r--r--3party/osrm/osrm-backend/Util/MercatorUtil.h8
-rw-r--r--3party/osrm/osrm-backend/Util/ProgramOptions.h189
-rw-r--r--3party/osrm/osrm-backend/Util/SimpleLogger.h159
-rw-r--r--3party/osrm/osrm-backend/Util/StdHashExtensions.h12
-rw-r--r--3party/osrm/osrm-backend/Util/StringUtil.h153
-rw-r--r--3party/osrm/osrm-backend/Util/TrigonometryTables.h2
-rw-r--r--3party/osrm/osrm-backend/Util/cast.hpp188
-rw-r--r--3party/osrm/osrm-backend/Util/compute_angle.cpp (renamed from 3party/osrm/osrm-backend/Util/ComputeAngle.h)20
-rw-r--r--3party/osrm/osrm-backend/Util/compute_angle.hpp41
-rw-r--r--3party/osrm/osrm-backend/Util/container.hpp (renamed from 3party/osrm/osrm-backend/Util/ContainerUtils.h)23
-rw-r--r--3party/osrm/osrm-backend/Util/floating_point.hpp44
-rw-r--r--3party/osrm/osrm-backend/Util/make_unique.hpp57
-rw-r--r--3party/osrm/osrm-backend/Util/simple_logger.cpp135
-rw-r--r--3party/osrm/osrm-backend/Util/simple_logger.hpp (renamed from 3party/osrm/osrm-backend/Server/ServerFactory.h)57
-rw-r--r--3party/osrm/osrm-backend/appveyor.yml11
-rw-r--r--3party/osrm/osrm-backend/cmake/CPackDebianConfig.cmake44
-rw-r--r--3party/osrm/osrm-backend/cmake/FindDebArch.cmake19
-rw-r--r--3party/osrm/osrm-backend/cmake/check_luabind.cmake40
-rw-r--r--3party/osrm/osrm-backend/cmake/postinst.in2
-rw-r--r--3party/osrm/osrm-backend/datastore.cpp54
-rw-r--r--3party/osrm/osrm-backend/extractor.cpp11
-rw-r--r--3party/osrm/osrm-backend/features/bicycle/mode.feature228
-rw-r--r--3party/osrm/osrm-backend/features/bicycle/pushing.feature26
-rw-r--r--3party/osrm/osrm-backend/features/car/ferry.feature37
-rw-r--r--3party/osrm/osrm-backend/features/car/link.feature111
-rw-r--r--3party/osrm/osrm-backend/features/car/maxspeed.feature30
-rw-r--r--3party/osrm/osrm-backend/features/car/speed.feature10
-rw-r--r--3party/osrm/osrm-backend/features/car/surface.feature140
-rw-r--r--3party/osrm/osrm-backend/features/foot/ferry.feature18
-rw-r--r--3party/osrm/osrm-backend/features/options/extract/files.feature6
-rw-r--r--3party/osrm/osrm-backend/features/options/prepare/files.feature6
-rw-r--r--3party/osrm/osrm-backend/features/options/routed/files.feature13
-rw-r--r--3party/osrm/osrm-backend/features/step_definitions/data.rb16
-rw-r--r--3party/osrm/osrm-backend/features/step_definitions/locate.rb2
-rw-r--r--3party/osrm/osrm-backend/features/step_definitions/nearest.rb2
-rw-r--r--3party/osrm/osrm-backend/features/step_definitions/options.rb6
-rw-r--r--3party/osrm/osrm-backend/features/step_definitions/requests.rb4
-rw-r--r--3party/osrm/osrm-backend/features/step_definitions/routability.rb8
-rw-r--r--3party/osrm/osrm-backend/features/step_definitions/routing.rb14
-rw-r--r--3party/osrm/osrm-backend/features/support/data.rb78
-rw-r--r--3party/osrm/osrm-backend/features/support/env.rb30
-rw-r--r--3party/osrm/osrm-backend/features/support/exceptions.rb6
-rw-r--r--3party/osrm/osrm-backend/features/support/hash.rb26
-rw-r--r--3party/osrm/osrm-backend/features/support/hooks.rb4
-rw-r--r--3party/osrm/osrm-backend/features/support/launch.rb167
-rw-r--r--3party/osrm/osrm-backend/features/support/log.rb6
-rw-r--r--3party/osrm/osrm-backend/features/support/run.rb18
-rw-r--r--3party/osrm/osrm-backend/features/testbot/bad.feature2
-rw-r--r--3party/osrm/osrm-backend/features/testbot/basic.feature2
-rw-r--r--3party/osrm/osrm-backend/features/testbot/bearing.feature2
-rw-r--r--3party/osrm/osrm-backend/features/testbot/bearing_param.feature2
-rw-r--r--3party/osrm/osrm-backend/features/testbot/compression.feature22
-rw-r--r--3party/osrm/osrm-backend/features/testbot/datastore.feature31
-rw-r--r--3party/osrm/osrm-backend/features/testbot/distance.feature2
-rw-r--r--3party/osrm/osrm-backend/features/testbot/fastest.feature2
-rw-r--r--3party/osrm/osrm-backend/features/testbot/geometry.feature2
-rw-r--r--3party/osrm/osrm-backend/features/testbot/graph.feature21
-rw-r--r--3party/osrm/osrm-backend/features/testbot/load.feature63
-rw-r--r--3party/osrm/osrm-backend/features/testbot/loop.feature8
-rw-r--r--3party/osrm/osrm-backend/features/testbot/mode.feature227
-rw-r--r--3party/osrm/osrm-backend/features/testbot/oneway.feature64
-rw-r--r--3party/osrm/osrm-backend/features/testbot/origin.feature2
-rw-r--r--3party/osrm/osrm-backend/features/testbot/penalty.feature2
-rw-r--r--3party/osrm/osrm-backend/features/testbot/planetary.feature2
-rw-r--r--3party/osrm/osrm-backend/features/testbot/projection.feature2
-rw-r--r--3party/osrm/osrm-backend/features/testbot/protobuffer.feature2
-rw-r--r--3party/osrm/osrm-backend/features/testbot/snap.feature2
-rw-r--r--3party/osrm/osrm-backend/features/testbot/status.feature2
-rw-r--r--3party/osrm/osrm-backend/features/testbot/time.feature2
-rw-r--r--3party/osrm/osrm-backend/features/testbot/turns.feature2
-rw-r--r--3party/osrm/osrm-backend/features/testbot/utf.feature2
-rw-r--r--3party/osrm/osrm-backend/features/testbot/uturn.feature8
-rw-r--r--3party/osrm/osrm-backend/features/testbot/via.feature24
-rw-r--r--3party/osrm/osrm-backend/mapsme/CMakeLists.txt12
-rw-r--r--3party/osrm/osrm-backend/mapsme/converter.cpp389
-rw-r--r--3party/osrm/osrm-backend/mapsme/converter.hpp13
-rw-r--r--3party/osrm/osrm-backend/mapsme/main.cpp29
-rw-r--r--[l---------]3party/osrm/osrm-backend/profile.lua413
-rw-r--r--3party/osrm/osrm-backend/profiles/bicycle.lua163
-rw-r--r--3party/osrm/osrm-backend/profiles/car.lua186
-rw-r--r--3party/osrm/osrm-backend/profiles/examples/postgis.lua4
-rw-r--r--3party/osrm/osrm-backend/profiles/foot.lua50
-rw-r--r--3party/osrm/osrm-backend/profiles/lib/maxspeed.lua17
-rw-r--r--3party/osrm/osrm-backend/profiles/testbot.lua33
-rw-r--r--3party/osrm/osrm-backend/routed.cpp39
-rw-r--r--3party/osrm/osrm-backend/taginfo.json84
-rw-r--r--3party/osrm/osrm-backend/test/.stxxl1
-rw-r--r--3party/osrm/osrm-backend/typedefs.h15
199 files changed, 5569 insertions, 3180 deletions
diff --git a/3party/osrm/osrm-backend/.clang-format b/3party/osrm/osrm-backend/.clang-format
deleted file mode 100644
index 47429976bc..0000000000
--- a/3party/osrm/osrm-backend/.clang-format
+++ /dev/null
@@ -1,53 +0,0 @@
----
-Language: Cpp
-# BasedOnStyle: LLVM
-AccessModifierOffset: -2
-ConstructorInitializerIndentWidth: 4
-AlignEscapedNewlinesLeft: false
-AlignTrailingComments: true
-AllowAllParametersOfDeclarationOnNextLine: true
-AllowShortIfStatementsOnASingleLine: false
-AllowShortLoopsOnASingleLine: false
-AllowShortFunctionsOnASingleLine: true
-AlwaysBreakTemplateDeclarations: false
-AlwaysBreakBeforeMultilineStrings: false
-BreakBeforeBinaryOperators: false
-BreakBeforeTernaryOperators: true
-BreakConstructorInitializersBeforeComma: false
-BinPackParameters: false
-ColumnLimit: 100
-ConstructorInitializerAllOnOneLineOrOnePerLine: false
-DerivePointerBinding: false
-ExperimentalAutoDetectBinPacking: false
-IndentCaseLabels: false
-MaxEmptyLinesToKeep: 1
-KeepEmptyLinesAtTheStartOfBlocks: true
-NamespaceIndentation: None
-ObjCSpaceAfterProperty: false
-ObjCSpaceBeforeProtocolList: true
-PenaltyBreakBeforeFirstCallParameter: 19
-PenaltyBreakComment: 300
-PenaltyBreakString: 1000
-PenaltyBreakFirstLessLess: 120
-PenaltyExcessCharacter: 1000
-PenaltyReturnTypeOnItsOwnLine: 60
-PointerBindsToType: false
-SpacesBeforeTrailingComments: 1
-Cpp11BracedListStyle: true
-Standard: Cpp11
-IndentWidth: 4
-TabWidth: 8
-UseTab: Never
-BreakBeforeBraces: Allman
-IndentFunctionDeclarationAfterType: false
-SpacesInParentheses: false
-SpacesInAngles: false
-SpaceInEmptyParentheses: false
-SpacesInCStyleCastParentheses: false
-SpacesInContainerLiterals: true
-SpaceBeforeAssignmentOperators: true
-ContinuationIndentWidth: 4
-CommentPragmas: '^ IWYU pragma:'
-ForEachMacros: [ foreach, Q_FOREACH, BOOST_FOREACH ]
-SpaceBeforeParens: ControlStatements
-...
diff --git a/3party/osrm/osrm-backend/.gitignore b/3party/osrm/osrm-backend/.gitignore
deleted file mode 100644
index 5e8c12d8bc..0000000000
--- a/3party/osrm/osrm-backend/.gitignore
+++ /dev/null
@@ -1,93 +0,0 @@
-# Compiled source #
-###################
-*.com
-*.class
-*.dll
-*.exe
-*.o
-*.so
-
-# Packages #
-############
-# it's better to unpack these files and commit the raw source
-# git has its own built in compression methods
-*.7z
-*.dmg
-*.gz
-*.iso
-*.jar
-*.rar
-*.tar
-*.zip
-
-# Logs and databases #
-######################
-*.log
-*.sql
-*.sqlite
-
-# OS generated files #
-######################
-.DS_Store
-ehthumbs.db
-Icon?
-Thumbs.db
-
-# build related files #
-#######################
-/build/
-/Util/FingerPrint.cpp
-/Util/GitDescription.cpp
-
-# Eclipse related files #
-#########################
-.setting*
-.scb
-.cproject
-.project
-
-# stxxl related files #
-#######################
-.stxxl
-stxxl.log
-stxxl.errlog
-
-# compiled protobuffers #
-#########################
-/DataStructures/pbf-proto/*.pb.h
-/DataStructures/pbf-proto/*.pb.cc
-
-# External Libs #
-#################
-/lib/
-/win/lib
-
-# Visual Studio Temp + build Files #
-####################################
-/win/*.user
-/win/*.ncb
-/win/*.suo
-/win/Debug/
-/win/Release/
-/win/bin/
-/win/bin-debug/
-/osrm-extract
-/osrm-io-benchmark
-/osrm-components
-/osrm-routed
-/osrm-datastore
-/osrm-prepare
-/osrm-unlock-all
-/osrm-cli
-/osrm-check-hsgr
-/nohup.out
-
-# Sandbox folder #
-###################
-/sandbox/
-
-/test/profile.lua
-
-# Deprecated config file #
-##########################
-/server.ini
diff --git a/3party/osrm/osrm-backend/.gitmodules b/3party/osrm/osrm-backend/.gitmodules
deleted file mode 100644
index e69de29bb2..0000000000
--- a/3party/osrm/osrm-backend/.gitmodules
+++ /dev/null
diff --git a/3party/osrm/osrm-backend/.travis.yml b/3party/osrm/osrm-backend/.travis.yml
deleted file mode 100644
index 8817e38747..0000000000
--- a/3party/osrm/osrm-backend/.travis.yml
+++ /dev/null
@@ -1,54 +0,0 @@
-language: cpp
-compiler:
- - gcc
-# - clang
-# Make sure CMake is installed
-install:
- - sudo apt-add-repository -y ppa:ubuntu-toolchain-r/test
- - sudo add-apt-repository -y ppa:boost-latest/ppa
- - sudo apt-get update >/dev/null
- - sudo apt-get -q install libprotoc-dev libprotobuf7 libprotobuf-dev libosmpbf-dev libbz2-dev libstxxl-dev libstxxl1 libxml2-dev libzip-dev lua5.1 liblua5.1-0-dev rubygems libtbb-dev
- - sudo apt-get -q install g++-4.7
- - sudo apt-get install libboost1.54-all-dev
- #luabind
- - curl https://gist.githubusercontent.com/DennisOSRM/f2eb7b948e6fe1ae319e/raw/install-luabind.sh | sudo bash
- #osmosis
- - curl -s https://gist.githubusercontent.com/DennisOSRM/803a64a9178ec375069f/raw/ | sudo bash
-before_script:
- - rvm use 1.9.3
- - gem install bundler
- - bundle install
- - mkdir build
- - cd build
- - cmake .. $CMAKEOPTIONS
-script:
- - make -j 2
- - cd ..
- - cucumber -p verify
-after_script:
-# - cd ..
-# - cucumber -p verify
-branches:
- only:
- - master
- - develop
-cache:
-- bundler
-- apt
-env:
- - CMAKEOPTIONS="-DCMAKE_BUILD_TYPE=Release -DCMAKE_CXX_COMPILER=g++-4.7" OSRM_PORT=5000 OSRM_TIMEOUT=60
- - CMAKEOPTIONS="-DCMAKE_BUILD_TYPE=Debug -DCMAKE_CXX_COMPILER=g++-4.7" OSRM_PORT=5010 OSRM_TIMEOUT=60
-notifications:
- irc:
- channels:
- - irc.oftc.net#osrm
- on_success: change
- on_failure: always
- use_notice: true
- skip_join: false
-
- recipients:
- - dennis@mapbox.com
- email:
- on_success: change
- on_failure: always
diff --git a/3party/osrm/osrm-backend/Algorithms/BFSComponentExplorer.h b/3party/osrm/osrm-backend/Algorithms/BFSComponentExplorer.h
index 7bc7ecb302..daab82a14f 100644
--- a/3party/osrm/osrm-backend/Algorithms/BFSComponentExplorer.h
+++ b/3party/osrm/osrm-backend/Algorithms/BFSComponentExplorer.h
@@ -1,8 +1,7 @@
-#ifndef __BFS_COMPONENT_EXPLORER_H__
-#define __BFS_COMPONENT_EXPLORER_H__
+#ifndef BFS_COMPONENT_EXPLORER_H_
+#define BFS_COMPONENT_EXPLORER_H_
#include "../typedefs.h"
-#include "../DataStructures/DynamicGraph.h"
#include "../DataStructures/RestrictionMap.h"
#include <queue>
@@ -13,10 +12,10 @@
template <typename GraphT> class BFSComponentExplorer
{
public:
- BFSComponentExplorer(const GraphT &dynamicGraph,
+ BFSComponentExplorer(const GraphT &dynamic_graph,
const RestrictionMap &restrictions,
const std::unordered_set<NodeID> &barrier_nodes)
- : m_graph(dynamicGraph), m_restriction_map(restrictions), m_barrier_nodes(barrier_nodes)
+ : m_graph(dynamic_graph), m_restriction_map(restrictions), m_barrier_nodes(barrier_nodes)
{
BOOST_ASSERT(m_graph.GetNumberOfNodes() > 0);
}
@@ -24,14 +23,14 @@ template <typename GraphT> class BFSComponentExplorer
/*!
* Returns the size of the component that the node belongs to.
*/
- inline unsigned int GetComponentSize(NodeID node)
+ unsigned int GetComponentSize(const NodeID node) const
{
BOOST_ASSERT(node < m_component_index_list.size());
return m_component_index_size[m_component_index_list[node]];
}
- inline unsigned int GetNumberOfComponents() { return m_component_index_size.size(); }
+ unsigned int GetNumberOfComponents() { return m_component_index_size.size(); }
/*!
* Computes the component sizes.
@@ -68,7 +67,7 @@ template <typename GraphT> class BFSComponentExplorer
/*!
* Explores the current component that starts at node using BFS.
*/
- inline unsigned ExploreComponent(std::queue<std::pair<NodeID, NodeID>> &bfs_queue,
+ unsigned ExploreComponent(std::queue<std::pair<NodeID, NodeID>> &bfs_queue,
NodeID node,
unsigned current_component)
{
@@ -145,4 +144,4 @@ template <typename GraphT> class BFSComponentExplorer
const std::unordered_set<NodeID> &m_barrier_nodes;
};
-#endif
+#endif // BFS_COMPONENT_EXPLORER_H_
diff --git a/3party/osrm/osrm-backend/Algorithms/DouglasPeucker.cpp b/3party/osrm/osrm-backend/Algorithms/DouglasPeucker.cpp
index f3a657fe17..6444f13575 100644
--- a/3party/osrm/osrm-backend/Algorithms/DouglasPeucker.cpp
+++ b/3party/osrm/osrm-backend/Algorithms/DouglasPeucker.cpp
@@ -25,17 +25,20 @@ SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
*/
-#include <osrm/Coordinate.h>
-
#include "DouglasPeucker.h"
+
+#include "../DataStructures/Range.h"
#include "../DataStructures/SegmentInformation.h"
+#include <osrm/Coordinate.h>
+
#include <boost/assert.hpp>
#include <cmath>
#include <algorithm>
+namespace {
struct CoordinatePairCalculator
{
CoordinatePairCalculator() = delete;
@@ -77,6 +80,7 @@ struct CoordinatePairCalculator
float second_lat;
float second_lon;
};
+}
DouglasPeucker::DouglasPeucker()
: douglas_peucker_thresholds({512440, // z0
@@ -149,13 +153,13 @@ void DouglasPeucker::Run(std::vector<SegmentInformation> &input_geometry, const
int max_int_distance = 0;
unsigned farthest_entry_index = pair.second;
- const CoordinatePairCalculator DistCalc(input_geometry[pair.first].location,
- input_geometry[pair.second].location);
+ const CoordinatePairCalculator dist_calc(input_geometry[pair.first].location,
+ input_geometry[pair.second].location);
// sweep over range to find the maximum
- for (unsigned i = pair.first + 1; i < pair.second; ++i)
+ for (const auto i : osrm::irange(pair.first + 1, pair.second))
{
- const int distance = DistCalc(input_geometry[i].location);
+ const int distance = dist_calc(input_geometry[i].location);
// found new feasible maximum?
if (distance > max_int_distance && distance > douglas_peucker_thresholds[zoom_level])
{
diff --git a/3party/osrm/osrm-backend/Algorithms/DouglasPeucker.h b/3party/osrm/osrm-backend/Algorithms/DouglasPeucker.h
index d0f295cc6a..60fc377b10 100644
--- a/3party/osrm/osrm-backend/Algorithms/DouglasPeucker.h
+++ b/3party/osrm/osrm-backend/Algorithms/DouglasPeucker.h
@@ -46,7 +46,7 @@ class DouglasPeucker
private:
std::vector<int> douglas_peucker_thresholds;
- typedef std::pair<unsigned, unsigned> GeometryRange;
+ using GeometryRange = std::pair<unsigned, unsigned>;
// Stack to simulate the recursion
std::stack<GeometryRange> recursion_stack;
diff --git a/3party/osrm/osrm-backend/Algorithms/IteratorBasedCRC32.h b/3party/osrm/osrm-backend/Algorithms/IteratorBasedCRC32.h
index 84a404a88f..a68514dceb 100644
--- a/3party/osrm/osrm-backend/Algorithms/IteratorBasedCRC32.h
+++ b/3party/osrm/osrm-backend/Algorithms/IteratorBasedCRC32.h
@@ -28,44 +28,59 @@ SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
#ifndef ITERATOR_BASED_CRC32_H
#define ITERATOR_BASED_CRC32_H
-#include "../Util/SimpleLogger.h"
-
-#include <iostream>
-
#if defined(__x86_64__) && !defined(__MINGW64__)
#include <cpuid.h>
-#else
+#endif
+
#include <boost/crc.hpp> // for boost::crc_32_type
-inline void __get_cpuid(int param, unsigned *eax, unsigned *ebx, unsigned *ecx, unsigned *edx)
-{
- *ecx = 0;
-}
-#endif
+#include <iterator>
-template <class ContainerT> class IteratorbasedCRC32
+class IteratorbasedCRC32
{
- private:
- typedef typename ContainerT::iterator IteratorType;
- unsigned crc;
+ public:
+ bool using_hardware() const { return use_hardware_implementation; }
- bool use_SSE42_CRC_function;
+ IteratorbasedCRC32() : crc(0) { use_hardware_implementation = detect_hardware_support(); }
-#if !defined(__x86_64__)
- boost::crc_optimal<32, 0x1EDC6F41, 0x0, 0x0, true, true> CRC32_processor;
-#endif
- unsigned SoftwareBasedCRC32(char *str, unsigned len)
+ template <class Iterator> unsigned operator()(Iterator iter, const Iterator end)
{
-#if !defined(__x86_64__)
- CRC32_processor.process_bytes(str, len);
- return CRC32_processor.checksum();
-#else
- return 0;
-#endif
+ unsigned crc = 0;
+ while (iter != end)
+ {
+ using value_type = typename std::iterator_traits<Iterator>::value_type;
+ char *data = (char *)(&(*iter));
+
+ if (use_hardware_implementation)
+ {
+ crc = compute_in_hardware(data, sizeof(value_type));
+ }
+ else
+ {
+ crc = compute_in_software(data, sizeof(value_type));
+ }
+ ++iter;
+ }
+ return crc;
+ }
+
+ private:
+ bool detect_hardware_support() const
+ {
+ static const int sse42_bit = 0x00100000;
+ const unsigned ecx = cpuid();
+ const bool sse42_found = (ecx & sse42_bit) != 0;
+ return sse42_found;
+ }
+
+ unsigned compute_in_software(char *str, unsigned len)
+ {
+ crc_processor.process_bytes(str, len);
+ return crc_processor.checksum();
}
// adapted from http://byteworm.com/2010/10/13/crc32/
- unsigned SSE42BasedCRC32(char *str, unsigned len)
+ unsigned compute_in_hardware(char *str, unsigned len)
{
#if defined(__x86_64__)
unsigned q = len / sizeof(unsigned);
@@ -101,44 +116,31 @@ template <class ContainerT> class IteratorbasedCRC32
return ecx;
}
- bool DetectNativeCRC32Support()
+#if defined(__MINGW64__) || defined(_MSC_VER)
+ inline void
+ __get_cpuid(int param, unsigned *eax, unsigned *ebx, unsigned *ecx, unsigned *edx) const
{
- static const int SSE42_BIT = 0x00100000;
- const unsigned ecx = cpuid();
- const bool has_SSE42 = (ecx & SSE42_BIT) != 0;
- if (has_SSE42)
- {
- SimpleLogger().Write() << "using hardware based CRC32 computation";
- }
- else
- {
- SimpleLogger().Write() << "using software based CRC32 computation";
- }
- return has_SSE42;
+ *ecx = 0;
}
+#endif
- public:
- IteratorbasedCRC32() : crc(0) { use_SSE42_CRC_function = DetectNativeCRC32Support(); }
+ boost::crc_optimal<32, 0x1EDC6F41, 0x0, 0x0, true, true> crc_processor;
+ unsigned crc;
+ bool use_hardware_implementation;
+};
- unsigned operator()(IteratorType iter, const IteratorType end)
+struct RangebasedCRC32
+{
+ template<typename Iteratable>
+ unsigned operator()(const Iteratable &iterable)
{
- unsigned crc = 0;
- while (iter != end)
- {
- char *data = reinterpret_cast<char *>(&(*iter));
-
- if (use_SSE42_CRC_function)
- {
- crc = SSE42BasedCRC32(data, sizeof(typename ContainerT::value_type));
- }
- else
- {
- crc = SoftwareBasedCRC32(data, sizeof(typename ContainerT::value_type));
- }
- ++iter;
- }
- return crc;
+ return crc32(std::begin(iterable), std::end(iterable));
}
+
+ bool using_hardware() const { return crc32.using_hardware(); }
+
+ private:
+ IteratorbasedCRC32 crc32;
};
#endif /* ITERATOR_BASED_CRC32_H */
diff --git a/3party/osrm/osrm-backend/Algorithms/ObjectToBase64.h b/3party/osrm/osrm-backend/Algorithms/ObjectToBase64.h
index b273043790..6930b9c2c1 100644
--- a/3party/osrm/osrm-backend/Algorithms/ObjectToBase64.h
+++ b/3party/osrm/osrm-backend/Algorithms/ObjectToBase64.h
@@ -25,8 +25,8 @@ SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
*/
-#ifndef OBJECTTOBASE64_H_
-#define OBJECTTOBASE64_H_
+#ifndef OBJECT_TO_BASE64_H_
+#define OBJECT_TO_BASE64_H_
#include "../Util/StringUtil.h"
@@ -39,61 +39,56 @@ SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
#include <string>
#include <vector>
-typedef
- boost::archive::iterators::base64_from_binary<
- boost::archive::iterators::transform_width<const char *, 6, 8>
- > base64_t;
-
-typedef
- boost::archive::iterators::transform_width<
- boost::archive::iterators::binary_from_base64<
- std::string::const_iterator>, 8, 6
- > binary_t;
-
-template<class ObjectT>
-static void EncodeObjectToBase64(const ObjectT & object, std::string& encoded) {
- const char * char_ptr_to_object = (const char *)&object;
- std::vector<unsigned char> data(sizeof(object));
- std::copy(
- char_ptr_to_object,
- char_ptr_to_object + sizeof(ObjectT),
- data.begin()
- );
-
- unsigned char number_of_padded_chars = 0; // is in {0,1,2};
- while(data.size() % 3 != 0) {
- ++number_of_padded_chars;
- data.push_back(0x00);
+struct ObjectEncoder
+{
+ using base64_t = boost::archive::iterators::base64_from_binary<
+ boost::archive::iterators::transform_width<const char *, 6, 8>>;
+
+ using binary_t = boost::archive::iterators::transform_width<
+ boost::archive::iterators::binary_from_base64<std::string::const_iterator>,
+ 8,
+ 6>;
+
+ template <class ObjectT>
+ static void EncodeToBase64(const ObjectT &object, std::string &encoded)
+ {
+ const char *char_ptr_to_object = (const char *)&object;
+ std::vector<unsigned char> data(sizeof(object));
+ std::copy(char_ptr_to_object, char_ptr_to_object + sizeof(ObjectT), data.begin());
+
+ unsigned char number_of_padded_chars = 0; // is in {0,1,2};
+ while (data.size() % 3 != 0)
+ {
+ ++number_of_padded_chars;
+ data.push_back(0x00);
+ }
+
+ BOOST_ASSERT_MSG(0 == data.size() % 3, "base64 input data size is not a multiple of 3!");
+ encoded.resize(sizeof(ObjectT));
+ encoded.assign(base64_t(&data[0]),
+ base64_t(&data[0] + (data.size() - number_of_padded_chars)));
+ replaceAll(encoded, "+", "-");
+ replaceAll(encoded, "/", "_");
}
- BOOST_ASSERT_MSG(
- 0 == data.size() % 3,
- "base64 input data size is not a multiple of 3!"
- );
- encoded.resize(sizeof(ObjectT));
- encoded.assign(
- base64_t( &data[0] ),
- base64_t( &data[0] + (data.size() - number_of_padded_chars) )
- );
- replaceAll(encoded, "+", "-");
- replaceAll(encoded, "/", "_");
-}
-
-template<class ObjectT>
-static void DecodeObjectFromBase64(const std::string& input, ObjectT & object) {
- try {
- std::string encoded(input);
- //replace "-" with "+" and "_" with "/"
- replaceAll(encoded, "-", "+");
- replaceAll(encoded, "_", "/");
-
- std::copy (
- binary_t( encoded.begin() ),
- binary_t( encoded.begin() + encoded.length() - 1),
- (char *)&object
- );
-
- } catch(...) { }
-}
-
-#endif /* OBJECTTOBASE64_H_ */
+ template <class ObjectT>
+ static void DecodeFromBase64(const std::string &input, ObjectT &object)
+ {
+ try
+ {
+ std::string encoded(input);
+ // replace "-" with "+" and "_" with "/"
+ replaceAll(encoded, "-", "+");
+ replaceAll(encoded, "_", "/");
+
+ std::copy(binary_t(encoded.begin()),
+ binary_t(encoded.begin() + encoded.length() - 1),
+ (char *)&object);
+ }
+ catch (...)
+ {
+ }
+ }
+};
+
+#endif /* OBJECT_TO_BASE64_H_ */
diff --git a/3party/osrm/osrm-backend/Algorithms/PolylineCompressor.cpp b/3party/osrm/osrm-backend/Algorithms/PolylineCompressor.cpp
index ca4a019c06..bae40052b3 100644
--- a/3party/osrm/osrm-backend/Algorithms/PolylineCompressor.cpp
+++ b/3party/osrm/osrm-backend/Algorithms/PolylineCompressor.cpp
@@ -30,8 +30,8 @@ SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
#include <osrm/Coordinate.h>
-void PolylineCompressor::encodeVectorSignedNumber(std::vector<int> &numbers, std::string &output)
- const
+void PolylineCompressor::encodeVectorSignedNumber(std::vector<int> &numbers,
+ std::string &output) const
{
const unsigned end = static_cast<unsigned>(numbers.size());
for (unsigned i = 0; i < end; ++i)
@@ -69,8 +69,8 @@ void PolylineCompressor::encodeNumber(int number_to_encode, std::string &output)
}
}
-JSON::String PolylineCompressor::printEncodedString(const std::vector<SegmentInformation> &polyline)
- const
+JSON::String
+PolylineCompressor::printEncodedString(const std::vector<SegmentInformation> &polyline) const
{
std::string output;
std::vector<int> delta_numbers;
@@ -102,12 +102,10 @@ PolylineCompressor::printUnencodedString(const std::vector<SegmentInformation> &
{
if (segment.necessary)
{
- std::string tmp, output;
- FixedPointCoordinate::convertInternalLatLonToString(segment.location.lat, tmp);
- output += (tmp + ",");
- FixedPointCoordinate::convertInternalLatLonToString(segment.location.lon, tmp);
- output += tmp;
- json_geometry_array.values.push_back(output);
+ JSON::Array json_coordinate;
+ json_coordinate.values.push_back(segment.location.lat / COORDINATE_PRECISION);
+ json_coordinate.values.push_back(segment.location.lon / COORDINATE_PRECISION);
+ json_geometry_array.values.push_back(json_coordinate);
}
}
return json_geometry_array;
diff --git a/3party/osrm/osrm-backend/Algorithms/StronglyConnectedComponents.h b/3party/osrm/osrm-backend/Algorithms/StronglyConnectedComponents.h
index bc9ba0406b..681f78fa3b 100644
--- a/3party/osrm/osrm-backend/Algorithms/StronglyConnectedComponents.h
+++ b/3party/osrm/osrm-backend/Algorithms/StronglyConnectedComponents.h
@@ -39,7 +39,7 @@ SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
#include "../DataStructures/TurnInstructions.h"
#include "../Util/OSRMException.h"
-#include "../Util/SimpleLogger.h"
+#include "../Util/simple_logger.hpp"
#include "../Util/StdHashExtensions.h"
#include "../Util/TimingUtil.h"
@@ -92,12 +92,12 @@ class TarjanSCC
NodeID parent;
};
- 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::unordered_map<RestrictionSource, unsigned> RestrictionMap;
+ using TarjanDynamicGraph = DynamicGraph<TarjanEdgeData>;
+ using TarjanEdge = TarjanDynamicGraph::InputEdge;
+ using RestrictionSource = std::pair<NodeID, NodeID>;
+ using RestrictionTarget = std::pair<NodeID, bool>;
+ using EmanatingRestrictionsVector = std::vector<RestrictionTarget>;
+ using RestrictionMap = std::unordered_map<RestrictionSource, unsigned>;
std::vector<NodeInfo> m_coordinate_list;
std::vector<EmanatingRestrictionsVector> m_restriction_bucket_list;
diff --git a/3party/osrm/osrm-backend/Benchmarks/StaticRTreeBench.cpp b/3party/osrm/osrm-backend/Benchmarks/StaticRTreeBench.cpp
index a7c9a5c2e5..b0b34fb6e0 100644
--- a/3party/osrm/osrm-backend/Benchmarks/StaticRTreeBench.cpp
+++ b/3party/osrm/osrm-backend/Benchmarks/StaticRTreeBench.cpp
@@ -11,16 +11,16 @@
// Choosen by a fair W20 dice roll (this value is completely arbitrary)
constexpr unsigned RANDOM_SEED = 13;
-constexpr int32_t WORLD_MIN_LAT = -90*COORDINATE_PRECISION;
-constexpr int32_t WORLD_MAX_LAT = 90*COORDINATE_PRECISION;
-constexpr int32_t WORLD_MIN_LON = -180*COORDINATE_PRECISION;
-constexpr int32_t WORLD_MAX_LON = 180*COORDINATE_PRECISION;
+constexpr int32_t WORLD_MIN_LAT = -90 * COORDINATE_PRECISION;
+constexpr int32_t WORLD_MAX_LAT = 90 * COORDINATE_PRECISION;
+constexpr int32_t WORLD_MIN_LON = -180 * COORDINATE_PRECISION;
+constexpr int32_t WORLD_MAX_LON = 180 * COORDINATE_PRECISION;
-typedef EdgeBasedNode RTreeLeaf;
-typedef std::shared_ptr<std::vector<FixedPointCoordinate>> FixedPointCoordinateListPtr;
-typedef StaticRTree<RTreeLeaf, ShM<FixedPointCoordinate, false>::vector, false> BenchStaticRTree;
+using RTreeLeaf = EdgeBasedNode;
+using FixedPointCoordinateListPtr = std::shared_ptr<std::vector<FixedPointCoordinate>>;
+using BenchStaticRTree = StaticRTree<RTreeLeaf, ShM<FixedPointCoordinate, false>::vector, false>;
-FixedPointCoordinateListPtr LoadCoordinates(const boost::filesystem::path& nodes_file)
+FixedPointCoordinateListPtr LoadCoordinates(const boost::filesystem::path &nodes_file)
{
boost::filesystem::ifstream nodes_input_stream(nodes_file, std::ios::binary);
@@ -39,74 +39,86 @@ FixedPointCoordinateListPtr LoadCoordinates(const boost::filesystem::path& nodes
return coords;
}
-void Benchmark(BenchStaticRTree& rtree, unsigned num_queries)
+void Benchmark(BenchStaticRTree &rtree, unsigned num_queries)
{
- std::mt19937 g(RANDOM_SEED);
+ std::mt19937 mt_rand(RANDOM_SEED);
std::uniform_int_distribution<> lat_udist(WORLD_MIN_LAT, WORLD_MAX_LAT);
std::uniform_int_distribution<> lon_udist(WORLD_MIN_LON, WORLD_MAX_LON);
std::vector<FixedPointCoordinate> queries;
for (unsigned i = 0; i < num_queries; i++)
{
- queries.emplace_back(
- FixedPointCoordinate(lat_udist(g), lon_udist(g))
- );
+ queries.emplace_back(FixedPointCoordinate(lat_udist(mt_rand), lon_udist(mt_rand)));
}
const unsigned num_results = 5;
- std::cout << "#### IncrementalFindPhantomNodeForCoordinate : " << num_results << " phantom nodes" << std::endl;
+ std::cout << "#### IncrementalFindPhantomNodeForCoordinate : " << num_results
+ << " phantom nodes"
+ << "\n";
TIMER_START(query_phantom);
std::vector<PhantomNode> resulting_phantom_node_vector;
- for (const auto& q : queries)
+ for (const auto &q : queries)
{
resulting_phantom_node_vector.clear();
- rtree.IncrementalFindPhantomNodeForCoordinate(q, resulting_phantom_node_vector, 3, num_results);
+ rtree.IncrementalFindPhantomNodeForCoordinate(
+ q, resulting_phantom_node_vector, 3, num_results);
resulting_phantom_node_vector.clear();
- rtree.IncrementalFindPhantomNodeForCoordinate(q, resulting_phantom_node_vector, 17, num_results);
+ rtree.IncrementalFindPhantomNodeForCoordinate(
+ q, resulting_phantom_node_vector, 17, num_results);
}
TIMER_STOP(query_phantom);
- std::cout << "Took " << TIMER_MSEC(query_phantom) << " msec for " << num_queries << " queries." << std::endl;
- std::cout << TIMER_MSEC(query_phantom)/((double) num_queries) << " msec/query." << std::endl;
+ std::cout << "Took " << TIMER_MSEC(query_phantom) << " msec for " << num_queries << " queries."
+ << "\n";
+ std::cout << TIMER_MSEC(query_phantom) / ((double)num_queries) << " msec/query."
+ << "\n";
- std::cout << "#### LocateClosestEndPointForCoordinate" << std::endl;
+ std::cout << "#### LocateClosestEndPointForCoordinate"
+ << "\n";
TIMER_START(query_endpoint);
FixedPointCoordinate result;
- for (const auto& q : queries)
+ for (const auto &q : queries)
{
rtree.LocateClosestEndPointForCoordinate(q, result, 3);
}
TIMER_STOP(query_endpoint);
- std::cout << "Took " << TIMER_MSEC(query_endpoint) << " msec for " << num_queries << " queries." << std::endl;
- std::cout << TIMER_MSEC(query_endpoint)/((double) num_queries) << " msec/query." << std::endl;
+ std::cout << "Took " << TIMER_MSEC(query_endpoint) << " msec for " << num_queries << " queries."
+ << "\n";
+ std::cout << TIMER_MSEC(query_endpoint) / ((double)num_queries) << " msec/query."
+ << "\n";
- std::cout << "#### FindPhantomNodeForCoordinate" << std::endl;
+ std::cout << "#### FindPhantomNodeForCoordinate"
+ << "\n";
TIMER_START(query_phantomnode);
- for (const auto& q : queries)
+ for (const auto &q : queries)
{
PhantomNode phantom;
rtree.FindPhantomNodeForCoordinate(q, phantom, 3);
}
TIMER_STOP(query_phantomnode);
- std::cout << "Took " << TIMER_MSEC(query_phantomnode) << " msec for " << num_queries << " queries." << std::endl;
- std::cout << TIMER_MSEC(query_phantomnode)/((double) num_queries) << " msec/query." << std::endl;
+ std::cout << "Took " << TIMER_MSEC(query_phantomnode) << " msec for " << num_queries
+ << " queries."
+ << "\n";
+ std::cout << TIMER_MSEC(query_phantomnode) / ((double)num_queries) << " msec/query."
+ << "\n";
}
-int main(int argc, char** argv)
+int main(int argc, char **argv)
{
if (argc < 4)
{
- std::cout << "./rtree-bench file.ramIndex file.fileIndx file.nodes" << std::endl;
+ std::cout << "./rtree-bench file.ramIndex file.fileIndx file.nodes"
+ << "\n";
return 1;
}
- const char* ramPath = argv[1];
- const char* filePath = argv[2];
- const char* nodesPath = argv[3];
+ const char *ramPath = argv[1];
+ const char *filePath = argv[2];
+ const char *nodesPath = argv[3];
auto coords = LoadCoordinates(nodesPath);
diff --git a/3party/osrm/osrm-backend/CMakeLists.txt b/3party/osrm/osrm-backend/CMakeLists.txt
index 4ce0e220df..b1034b1fdd 100644
--- a/3party/osrm/osrm-backend/CMakeLists.txt
+++ b/3party/osrm/osrm-backend/CMakeLists.txt
@@ -1,11 +1,16 @@
-cmake_minimum_required(VERSION 2.8)
+cmake_minimum_required(VERSION 2.8.8)
+
+if( CMAKE_SOURCE_DIR STREQUAL CMAKE_BINARY_DIR AND NOT MSVC_IDE )
+ message(FATAL_ERROR "In-source builds are not allowed.
+Please create a directory and run cmake from there, passing the path to this source directory as the last argument.
+This process created the file `CMakeCache.txt' and the directory `CMakeFiles'. Please delete them.")
+endif()
+
project(OSRM)
set(CMAKE_EXPORT_COMPILE_COMMANDS ON)
include(CheckCXXCompilerFlag)
include(FindPackageHandleStandardArgs)
-set (CMAKE_RUNTIME_OUTPUT_DIRECTORY ${CMAKE_BINARY_DIR})
-
list(APPEND CMAKE_MODULE_PATH "${CMAKE_SOURCE_DIR}/cmake")
include(GetGitRevisionDescription)
git_describe(GIT_DESCRIPTION)
@@ -22,7 +27,8 @@ if (WIN32 AND MSVC_VERSION LESS 1800)
message(FATAL_ERROR "Building with Microsoft compiler needs Visual Studio 2013 or later (Express version works too)")
endif()
-OPTION(WITH_TOOLS "Build ORSM tools" OFF)
+OPTION(WITH_TOOLS "Build OSRM tools" OFF)
+OPTION(BUILD_TOOLS "Build OSRM tools" OFF)
include_directories(${CMAKE_SOURCE_DIR}/Include/)
@@ -35,33 +41,36 @@ add_custom_command(OUTPUT ${CMAKE_SOURCE_DIR}/Util/FingerPrint.cpp FingerPrint.c
VERBATIM)
add_custom_target(FingerPrintConfigure DEPENDS ${CMAKE_SOURCE_DIR}/Util/FingerPrint.cpp)
+add_custom_target(tests DEPENDS datastructure-tests)
+add_custom_target(benchmarks DEPENDS rtree-bench)
-set(BOOST_COMPONENTS date_time filesystem iostreams program_options regex system thread)
+set(BOOST_COMPONENTS date_time filesystem iostreams program_options regex system thread unit_test_framework)
configure_file(
${CMAKE_SOURCE_DIR}/Util/GitDescription.cpp.in
${CMAKE_SOURCE_DIR}/Util/GitDescription.cpp
)
file(GLOB ExtractorGlob Extractor/*.cpp)
-file(GLOB ExtractorGlobH Extractor/*.h)
file(GLOB ImporterGlob DataStructures/Import*.cpp)
-add_library(IMPORT STATIC ${ImporterGlob})
-set(ExtractorSources extractor.cpp ${ExtractorGlob} ${ExtractorGlobH})
-add_executable(osrm-extract ${ExtractorSources})
+add_library(IMPORT OBJECT ${ImporterGlob})
+add_library(LOGGER OBJECT Util/simple_logger.cpp)
+
+set(ExtractorSources extractor.cpp ${ExtractorGlob})
+add_executable(osrm-extract ${ExtractorSources} $<TARGET_OBJECTS:COORDINATE> $<TARGET_OBJECTS:FINGERPRINT> $<TARGET_OBJECTS:GITDESCRIPTION> $<TARGET_OBJECTS:IMPORT> $<TARGET_OBJECTS:LOGGER>)
-file(GLOB PrepareGlobH Contractor/*.h DataStructures/*.h)
-file(GLOB PrepareGlob Contractor/*.cpp DataStructures/HilbertValue.cpp DataStructures/RestrictionMap.cpp)
-set(PrepareSources prepare.cpp ${PrepareGlob} ${PrepareGlobH})
-add_executable(osrm-prepare ${PrepareSources})
+file(GLOB PrepareGlob Contractor/*.cpp DataStructures/HilbertValue.cpp DataStructures/RestrictionMap.cpp Util/compute_angle.cpp)
+set(PrepareSources prepare.cpp ${PrepareGlob})
+add_executable(osrm-prepare ${PrepareSources} $<TARGET_OBJECTS:FINGERPRINT> $<TARGET_OBJECTS:GITDESCRIPTION> $<TARGET_OBJECTS:COORDINATE> $<TARGET_OBJECTS:IMPORT> $<TARGET_OBJECTS:LOGGER>)
file(GLOB ServerGlob Server/*.cpp)
-file(GLOB RoutingAlgs RoutingAlgorithms/*.h)
file(GLOB DescriptorGlob Descriptors/*.cpp)
file(GLOB DatastructureGlob DataStructures/SearchEngineData.cpp DataStructures/RouteParameters.cpp)
+list(REMOVE_ITEM DatastructureGlob DataStructures/Coordinate.cpp)
file(GLOB CoordinateGlob DataStructures/Coordinate.cpp)
file(GLOB AlgorithmGlob Algorithms/*.cpp)
file(GLOB HttpGlob Server/Http/*.cpp)
file(GLOB LibOSRMGlob Library/*.cpp)
+file(GLOB DataStructureTestsGlob UnitTests/DataStructures/*.cpp DataStructures/HilbertValue.cpp)
set(
OSRMSources
@@ -72,14 +81,20 @@ set(
${AlgorithmGlob}
${HttpGlob}
)
-add_library(COORDLIB STATIC ${CoordinateGlob})
-add_library(FINGERPRINT STATIC Util/FingerPrint.cpp)
-add_library(OSRM ${OSRMSources} Util/GitDescription.cpp Util/FingerPrint.cpp)
-add_library(GITDESCRIPTION STATIC Util/GitDescription.cpp)
+add_library(COORDINATE OBJECT ${CoordinateGlob})
+add_library(FINGERPRINT OBJECT Util/FingerPrint.cpp)
+add_library(GITDESCRIPTION OBJECT Util/GitDescription.cpp)
+add_library(OSRM ${OSRMSources} $<TARGET_OBJECTS:GITDESCRIPTION> $<TARGET_OBJECTS:FINGERPRINT> $<TARGET_OBJECTS:COORDINATE> $<TARGET_OBJECTS:LOGGER>)
add_dependencies(FINGERPRINT FingerPrintConfigure)
-add_executable(osrm-routed routed.cpp ${ServerGlob} ${RoutingAlgs})
-add_executable(osrm-datastore datastore.cpp)
+add_executable(osrm-routed routed.cpp ${ServerGlob})
+add_executable(osrm-datastore datastore.cpp $<TARGET_OBJECTS:COORDINATE> $<TARGET_OBJECTS:FINGERPRINT> $<TARGET_OBJECTS:GITDESCRIPTION> $<TARGET_OBJECTS:LOGGER>)
+
+# Unit tests
+add_executable(datastructure-tests EXCLUDE_FROM_ALL UnitTests/datastructure_tests.cpp ${DataStructureTestsGlob} $<TARGET_OBJECTS:COORDINATE> $<TARGET_OBJECTS:LOGGER>)
+
+# Benchmarks
+add_executable(rtree-bench EXCLUDE_FROM_ALL Benchmarks/StaticRTreeBench.cpp $<TARGET_OBJECTS:COORDINATE> $<TARGET_OBJECTS:LOGGER>)
# Check the release mode
if(NOT CMAKE_BUILD_TYPE MATCHES Debug)
@@ -103,7 +118,7 @@ if(CMAKE_BUILD_TYPE MATCHES Release)
# Since gcc 4.9 the LTO format is non-standart ('slim'), so we need to use the build-in tools
if ("${CMAKE_CXX_COMPILER_ID}" STREQUAL "GNU" AND
- NOT "${CMAKE_CXX_COMPILER_VERSION}" VERSION_LESS "4.9.0")
+ NOT "${CMAKE_CXX_COMPILER_VERSION}" VERSION_LESS "4.9.0" AND NOT MINGW)
message(STATUS "Using gcc specific binutils for LTO.")
set(CMAKE_AR "/usr/bin/gcc-ar")
set(CMAKE_RANLIB "/usr/bin/gcc-ranlib")
@@ -111,6 +126,10 @@ if(CMAKE_BUILD_TYPE MATCHES Release)
endif (HAS_LTO_FLAG)
endif()
+if (NOT WIN32)
+add_definitions(-DBOOST_TEST_DYN_LINK)
+endif()
+
# Configuring compilers
if("${CMAKE_CXX_COMPILER_ID}" STREQUAL "Clang")
# using Clang
@@ -119,10 +138,9 @@ elseif("${CMAKE_CXX_COMPILER_ID}" STREQUAL "GNU")
# using GCC
set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -Wall -pedantic -fPIC")
if (WIN32) # using mingw
- add_definitions(-DM_PI=3.141592653589793238462643383) # define M_PI
+ add_definitions(-D_USE_MATH_DEFINES) # define M_PI, M_1_PI etc.
add_definitions(-DWIN32)
SET(OPTIONAL_SOCKET_LIBS ws2_32 wsock32)
- SET(OPTIONAL_OMP_LIB gomp)
endif()
elseif("${CMAKE_CXX_COMPILER_ID}" STREQUAL "Intel")
# using Intel C++
@@ -136,18 +154,6 @@ elseif("${CMAKE_CXX_COMPILER_ID}" STREQUAL "MSVC")
add_definitions(-D_WIN32_WINNT=0x0501)
endif()
-# disable partitioning of LTO process when possible (fixes Debian issues)
-set(LTO_PARTITION_FLAGS "")
-CHECK_CXX_COMPILER_FLAG("-flto-partition=none" HAS_LTO_PARTITION_FLAG)
-if (HAS_LTO_PARTITION_FLAG)
- set(LTO_PARTITION_FLAGS "${LTO_PARTITION_FLAGS} -flto-partition=none")
-endif (HAS_LTO_PARTITION_FLAG)
-
-# Add Link-Time-Optimization flags, if supported (GCC >= 4.7) and enabled
-set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} ${LTO_FLAGS}")
-set(CMAKE_EXE_LINKER_FLAGS "${CMAKE_EXE_LINKER_FLAGS} ${LTO_FLAGS} ${LTO_PARTITION_FLAGS}")
-set(CMAKE_MODULE_LINKER_FLAGS "${CMAKE_MODULE_LINKER_FLAGS} ${LTO_FLAGS} ${LTO_PARTITION_FLAGS}")
-
# Activate C++11
if(NOT "${CMAKE_CXX_COMPILER_ID}" STREQUAL "MSVC")
ADD_DEFINITIONS(-std=c++11)
@@ -182,16 +188,21 @@ if(NOT Boost_FOUND)
endif()
include_directories(${Boost_INCLUDE_DIRS})
-target_link_libraries(OSRM ${Boost_LIBRARIES} COORDLIB)
-target_link_libraries(osrm-extract ${Boost_LIBRARIES} FINGERPRINT GITDESCRIPTION COORDLIB IMPORT)
-target_link_libraries(osrm-prepare ${Boost_LIBRARIES} FINGERPRINT GITDESCRIPTION COORDLIB IMPORT)
-target_link_libraries(osrm-routed ${Boost_LIBRARIES} ${OPTIONAL_SOCKET_LIBS} OSRM FINGERPRINT GITDESCRIPTION)
-target_link_libraries(osrm-datastore ${Boost_LIBRARIES} FINGERPRINT GITDESCRIPTION COORDLIB)
+target_link_libraries(OSRM ${Boost_LIBRARIES})
+target_link_libraries(osrm-extract ${Boost_LIBRARIES})
+target_link_libraries(osrm-prepare ${Boost_LIBRARIES})
+target_link_libraries(osrm-routed ${Boost_LIBRARIES} ${OPTIONAL_SOCKET_LIBS} OSRM)
+target_link_libraries(osrm-datastore ${Boost_LIBRARIES})
+target_link_libraries(datastructure-tests ${Boost_LIBRARIES})
+target_link_libraries(rtree-bench ${Boost_LIBRARIES})
find_package(Threads REQUIRED)
-target_link_libraries(osrm-extract ${CMAKE_THREAD_LIBS_INIT} ${OPTIONAL_OMP_LIB})
+target_link_libraries(osrm-extract ${CMAKE_THREAD_LIBS_INIT})
target_link_libraries(osrm-datastore ${CMAKE_THREAD_LIBS_INIT})
+target_link_libraries(osrm-prepare ${CMAKE_THREAD_LIBS_INIT})
target_link_libraries(OSRM ${CMAKE_THREAD_LIBS_INIT})
+target_link_libraries(datastructure-tests ${CMAKE_THREAD_LIBS_INIT})
+target_link_libraries(rtree-bench ${CMAKE_THREAD_LIBS_INIT})
find_package(TBB REQUIRED)
if(WIN32 AND CMAKE_BUILD_TYPE MATCHES Debug)
@@ -201,21 +212,13 @@ target_link_libraries(osrm-datastore ${TBB_LIBRARIES})
target_link_libraries(osrm-extract ${TBB_LIBRARIES})
target_link_libraries(osrm-prepare ${TBB_LIBRARIES})
target_link_libraries(osrm-routed ${TBB_LIBRARIES})
+target_link_libraries(datastructure-tests ${TBB_LIBRARIES})
+target_link_libraries(rtree-bench ${TBB_LIBRARIES})
include_directories(${TBB_INCLUDE_DIR})
-find_package(Lua52)
-if(NOT LUA52_FOUND)
- find_package(Lua51 REQUIRED)
- if(NOT APPLE)
- find_package(LuaJIT 5.1)
- endif()
-else()
- if(NOT APPLE)
- find_package(LuaJIT 5.2)
- endif()
-endif()
-
find_package( Luabind REQUIRED )
+include(check_luabind)
+
include_directories(${LUABIND_INCLUDE_DIR})
target_link_libraries(osrm-extract ${LUABIND_LIBRARY})
target_link_libraries(osrm-prepare ${LUABIND_LIBRARY})
@@ -258,29 +261,40 @@ include_directories(${ZLIB_INCLUDE_DIRS})
target_link_libraries(osrm-extract ${ZLIB_LIBRARY})
target_link_libraries(osrm-routed ${ZLIB_LIBRARY})
-if(WITH_TOOLS)
+if(WITH_TOOLS OR BUILD_TOOLS)
message(STATUS "Activating OSRM internal tools")
find_package(GDAL)
if(GDAL_FOUND)
- add_executable(osrm-components Tools/components.cpp)
- target_link_libraries(osrm-components ${TBB_LIBRARIES} IMPORT)
+ add_executable(osrm-components Tools/components.cpp $<TARGET_OBJECTS:FINGERPRINT> $<TARGET_OBJECTS:IMPORT> $<TARGET_OBJECTS:COORDINATE> $<TARGET_OBJECTS:LOGGER>)
+ target_link_libraries(osrm-components ${TBB_LIBRARIES})
include_directories(${GDAL_INCLUDE_DIR})
target_link_libraries(
osrm-components
- ${GDAL_LIBRARIES} ${Boost_LIBRARIES} FINGERPRINT GITDESCRIPTION COORDLIB)
+ ${GDAL_LIBRARIES} ${Boost_LIBRARIES})
+ install(TARGETS osrm-components DESTINATION bin)
else()
message(FATAL_ERROR "libgdal and/or development headers not found")
endif()
- add_executable(osrm-cli Tools/simpleclient.cpp)
- target_link_libraries(osrm-cli ${Boost_LIBRARIES} ${OPTIONAL_SOCKET_LIBS} OSRM FINGERPRINT GITDESCRIPTION)
+ add_executable(osrm-cli Tools/simpleclient.cpp $<TARGET_OBJECTS:LOGGER>)
+ target_link_libraries(osrm-cli ${Boost_LIBRARIES} ${OPTIONAL_SOCKET_LIBS} OSRM)
target_link_libraries(osrm-cli ${TBB_LIBRARIES})
- add_executable(osrm-io-benchmark Tools/io-benchmark.cpp)
- target_link_libraries(osrm-io-benchmark ${Boost_LIBRARIES} GITDESCRIPTION)
- add_executable(osrm-unlock-all Tools/unlock_all_mutexes.cpp)
- target_link_libraries(osrm-unlock-all ${Boost_LIBRARIES} GITDESCRIPTION)
+ add_executable(osrm-io-benchmark Tools/io-benchmark.cpp $<TARGET_OBJECTS:GITDESCRIPTION> $<TARGET_OBJECTS:LOGGER>)
+ target_link_libraries(osrm-io-benchmark ${Boost_LIBRARIES})
+ add_executable(osrm-unlock-all Tools/unlock_all_mutexes.cpp $<TARGET_OBJECTS:GITDESCRIPTION> $<TARGET_OBJECTS:LOGGER>)
+ target_link_libraries(osrm-unlock-all ${Boost_LIBRARIES} ${CMAKE_THREAD_LIBS_INIT})
if(UNIX AND NOT APPLE)
target_link_libraries(osrm-unlock-all rt)
endif()
+ add_executable(osrm-check-hsgr Tools/check-hsgr.cpp $<TARGET_OBJECTS:FINGERPRINT> $<TARGET_OBJECTS:LOGGER>)
+ target_link_libraries(osrm-check-hsgr ${Boost_LIBRARIES})
+ add_executable(osrm-springclean Tools/springclean.cpp $<TARGET_OBJECTS:FINGERPRINT> $<TARGET_OBJECTS:LOGGER> $<TARGET_OBJECTS:GITDESCRIPTION>)
+ target_link_libraries(osrm-springclean ${Boost_LIBRARIES})
+
+ install(TARGETS osrm-cli DESTINATION bin)
+ install(TARGETS osrm-io-benchmark DESTINATION bin)
+ install(TARGETS osrm-unlock-all DESTINATION bin)
+ install(TARGETS osrm-check-hsgr DESTINATION bin)
+ install(TARGETS osrm-springclean DESTINATION bin)
endif()
file(GLOB InstallGlob Include/osrm/*.h Library/OSRM.h)
@@ -311,4 +325,7 @@ endforeach ()
configure_file(${CMAKE_SOURCE_DIR}/cmake/pkgconfig.in libosrm.pc @ONLY)
install(FILES ${PROJECT_BINARY_DIR}/libosrm.pc DESTINATION lib/pkgconfig)
-add_subdirectory(mapsme)
+if(BUILD_DEBIAN_PACKAGE)
+ include(CPackDebianConfig)
+ include(CPack)
+endif()
diff --git a/3party/osrm/osrm-backend/Contractor/Contractor.h b/3party/osrm/osrm-backend/Contractor/Contractor.h
index 514d9649f3..9e1214f630 100644
--- a/3party/osrm/osrm-backend/Contractor/Contractor.h
+++ b/3party/osrm/osrm-backend/Contractor/Contractor.h
@@ -36,7 +36,7 @@ SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
#include "../DataStructures/Range.h"
#include "../DataStructures/XORFastHash.h"
#include "../DataStructures/XORFastHashStorage.h"
-#include "../Util/SimpleLogger.h"
+#include "../Util/simple_logger.hpp"
#include "../Util/StringUtil.h"
#include "../Util/TimingUtil.h"
#include "../typedefs.h"
@@ -92,19 +92,18 @@ class Contractor
ContractorHeapData(short h, bool t) : hop(h), target(t) {}
};
- typedef DynamicGraph<ContractorEdgeData> ContractorGraph;
- // typedef BinaryHeap< NodeID, NodeID, int, ContractorHeapData, ArrayStorage<NodeID, NodeID>
- // > ContractorHeap;
- typedef BinaryHeap<NodeID, NodeID, int, ContractorHeapData, XORFastHashStorage<NodeID, NodeID>>
- ContractorHeap;
- typedef ContractorGraph::InputEdge ContractorEdge;
+ using ContractorGraph = DynamicGraph<ContractorEdgeData>;
+ // using ContractorHeap = BinaryHeap<NodeID, NodeID, int, ContractorHeapData, ArrayStorage<NodeID, NodeID>
+ // >;
+ using ContractorHeap = BinaryHeap<NodeID, NodeID, int, ContractorHeapData, XORFastHashStorage<NodeID, NodeID>>;
+ using ContractorEdge = ContractorGraph::InputEdge;
struct ContractorThreadData
{
ContractorHeap heap;
std::vector<ContractorEdge> inserted_edges;
std::vector<NodeID> neighbours;
- ContractorThreadData(NodeID nodes) : heap(nodes) {}
+ explicit ContractorThreadData(NodeID nodes) : heap(nodes) {}
};
struct NodePriorityData
@@ -136,7 +135,7 @@ class Contractor
struct ThreadDataContainer
{
- ThreadDataContainer(int number_of_nodes) : number_of_nodes(number_of_nodes) {}
+ explicit ThreadDataContainer(int number_of_nodes) : number_of_nodes(number_of_nodes) {}
inline ContractorThreadData* getThreadData()
{
@@ -151,7 +150,7 @@ class Contractor
}
int number_of_nodes;
- typedef tbb::enumerable_thread_specific<std::shared_ptr<ContractorThreadData>> EnumerableThreadData;
+ using EnumerableThreadData = tbb::enumerable_thread_specific<std::shared_ptr<ContractorThreadData>>;
EnumerableThreadData data;
};
diff --git a/3party/osrm/osrm-backend/Contractor/EdgeBasedGraphFactory.cpp b/3party/osrm/osrm-backend/Contractor/EdgeBasedGraphFactory.cpp
index 590fce8ab5..2d58c90e82 100644
--- a/3party/osrm/osrm-backend/Contractor/EdgeBasedGraphFactory.cpp
+++ b/3party/osrm/osrm-backend/Contractor/EdgeBasedGraphFactory.cpp
@@ -29,28 +29,27 @@ SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
#include "../Algorithms/BFSComponentExplorer.h"
#include "../DataStructures/Percent.h"
#include "../DataStructures/Range.h"
-#include "../Util/ComputeAngle.h"
+#include "../Util/compute_angle.hpp"
#include "../Util/LuaUtil.h"
-#include "../Util/SimpleLogger.h"
+#include "../Util/simple_logger.hpp"
#include "../Util/TimingUtil.h"
#include <boost/assert.hpp>
#include <fstream>
+#include <iomanip>
#include <limits>
EdgeBasedGraphFactory::EdgeBasedGraphFactory(
const std::shared_ptr<NodeBasedDynamicGraph> &node_based_graph,
- const std::shared_ptr<NodeBasedDynamicGraph> &node_based_graph_origin,
std::unique_ptr<RestrictionMap> restriction_map,
std::vector<NodeID> &barrier_node_list,
std::vector<NodeID> &traffic_light_node_list,
- std::vector<NodeInfo> &m_node_info_list,
+ std::vector<NodeInfo> &node_info_list,
SpeedProfileProperties &speed_profile)
: speed_profile(speed_profile),
m_number_of_edge_based_nodes(std::numeric_limits<unsigned>::max()),
- m_node_info_list(m_node_info_list), m_node_based_graph(node_based_graph),
- m_node_based_graph_origin(node_based_graph_origin),
+ m_node_info_list(node_info_list), m_node_based_graph(node_based_graph),
m_restriction_map(std::move(restriction_map)), max_id(0)
{
@@ -79,35 +78,30 @@ void EdgeBasedGraphFactory::GetEdgeBasedNodes(std::vector<EdgeBasedNode> &nodes)
nodes.swap(m_edge_based_node_list);
}
-void EdgeBasedGraphFactory::GetEdgeBasedNodeData(osrm::NodeDataVectorT &data)
-{
- data.swap(m_edge_based_node_data);
-}
-
void
-EdgeBasedGraphFactory::InsertEdgeBasedNode(const NodeID u, const NodeID v, const bool belongs_to_tiny_cc)
+EdgeBasedGraphFactory::InsertEdgeBasedNode(const NodeID node_u, const NodeID node_v, const bool belongs_to_tiny_cc)
{
// merge edges together into one EdgeBasedNode
- BOOST_ASSERT(u != SPECIAL_NODEID);
- BOOST_ASSERT(v != SPECIAL_NODEID);
+ BOOST_ASSERT(node_u != SPECIAL_NODEID);
+ BOOST_ASSERT(node_v != SPECIAL_NODEID);
// find forward edge id and
- const EdgeID e1 = m_node_based_graph->FindEdge(u, v);
+ const EdgeID e1 = m_node_based_graph->FindEdge(node_u, node_v);
BOOST_ASSERT(e1 != SPECIAL_EDGEID);
const EdgeData &forward_data = m_node_based_graph->GetEdgeData(e1);
// find reverse edge id and
- const EdgeID e2 = m_node_based_graph->FindEdge(v, u);
+ const EdgeID e2 = m_node_based_graph->FindEdge(node_v, node_u);
#ifndef NDEBUG
- if (e2 == m_node_based_graph->EndEdges(v))
+ if (e2 == m_node_based_graph->EndEdges(node_v))
{
- SimpleLogger().Write(logWARNING) << "Did not find edge (" << v << "," << u << ")";
+ SimpleLogger().Write(logWARNING) << "Did not find edge (" << node_v << "," << node_u << ")";
}
#endif
BOOST_ASSERT(e2 != SPECIAL_EDGEID);
- BOOST_ASSERT(e2 < m_node_based_graph->EndEdges(v));
+ BOOST_ASSERT(e2 < m_node_based_graph->EndEdges(node_v));
const EdgeData &reverse_data = m_node_based_graph->GetEdgeData(e2);
if (forward_data.edgeBasedNodeID == SPECIAL_NODEID &&
@@ -157,7 +151,7 @@ EdgeBasedGraphFactory::InsertEdgeBasedNode(const NodeID u, const NodeID v, const
// BOOST_ASSERT(reverse_data.distance >= temp_sum);
}
- NodeID current_edge_source_coordinate_id = u;
+ NodeID current_edge_source_coordinate_id = node_u;
if (SPECIAL_NODEID != forward_data.edgeBasedNodeID)
{
@@ -177,32 +171,32 @@ EdgeBasedGraphFactory::InsertEdgeBasedNode(const NodeID u, const NodeID v, const
BOOST_ASSERT(current_edge_target_coordinate_id != current_edge_source_coordinate_id);
// build edges
- m_edge_based_node_list.emplace_back(forward_data.way_id,
- reverse_data.way_id,
- forward_data.edgeBasedNodeID,
+ m_edge_based_node_list.emplace_back(forward_data.edgeBasedNodeID,
reverse_data.edgeBasedNodeID,
current_edge_source_coordinate_id,
current_edge_target_coordinate_id,
forward_data.nameID,
forward_geometry[i].second,
- reverse_geometry[i].second,
+ reverse_geometry[geometry_size - 1 - i].second,
forward_dist_prefix_sum[i],
reverse_dist_prefix_sum[i],
m_geometry_compressor.GetPositionForID(e1),
i,
- belongs_to_tiny_cc);
+ belongs_to_tiny_cc,
+ forward_data.travel_mode,
+ reverse_data.travel_mode);
current_edge_source_coordinate_id = current_edge_target_coordinate_id;
BOOST_ASSERT(m_edge_based_node_list.back().IsCompressed());
- BOOST_ASSERT(u != m_edge_based_node_list.back().u ||
- v != m_edge_based_node_list.back().v);
+ BOOST_ASSERT(node_u != m_edge_based_node_list.back().u ||
+ node_v != m_edge_based_node_list.back().v);
- BOOST_ASSERT(u != m_edge_based_node_list.back().v ||
- v != m_edge_based_node_list.back().u);
+ BOOST_ASSERT(node_u != m_edge_based_node_list.back().v ||
+ node_v != m_edge_based_node_list.back().u);
}
- BOOST_ASSERT(current_edge_source_coordinate_id == v);
+ BOOST_ASSERT(current_edge_source_coordinate_id == node_v);
BOOST_ASSERT(m_edge_based_node_list.back().IsCompressed());
}
else
@@ -229,12 +223,10 @@ EdgeBasedGraphFactory::InsertEdgeBasedNode(const NodeID u, const NodeID v, const
BOOST_ASSERT(forward_data.edgeBasedNodeID != SPECIAL_NODEID ||
reverse_data.edgeBasedNodeID != SPECIAL_NODEID);
- m_edge_based_node_list.emplace_back(forward_data.way_id,
- reverse_data.way_id,
- forward_data.edgeBasedNodeID,
+ m_edge_based_node_list.emplace_back(forward_data.edgeBasedNodeID,
reverse_data.edgeBasedNodeID,
- u,
- v,
+ node_u,
+ node_v,
forward_data.nameID,
forward_data.distance,
reverse_data.distance,
@@ -242,7 +234,9 @@ EdgeBasedGraphFactory::InsertEdgeBasedNode(const NodeID u, const NodeID v, const
0,
SPECIAL_EDGEID,
0,
- belongs_to_tiny_cc);
+ belongs_to_tiny_cc,
+ forward_data.travel_mode,
+ reverse_data.travel_mode);
BOOST_ASSERT(!m_edge_based_node_list.back().IsCompressed());
}
}
@@ -279,11 +273,6 @@ void EdgeBasedGraphFactory::Run(const std::string &original_edge_data_filename,
GenerateEdgeExpandedEdges(original_edge_data_filename, lua_state);
TIMER_STOP(generate_edges);
- TIMER_START(generate_node_data);
- GenerateEdgeBasedNodeData();
- TIMER_STOP(generate_node_data);
-
-
m_geometry_compressor.SerializeInternalVector(geometry_filename);
SimpleLogger().Write() << "Timing statistics for edge-expanded graph:";
@@ -291,7 +280,6 @@ void EdgeBasedGraphFactory::Run(const std::string &original_edge_data_filename,
SimpleLogger().Write() << "Renumbering edges: " << TIMER_SEC(renumber) << "s";
SimpleLogger().Write() << "Generating nodes: " << TIMER_SEC(generate_nodes) << "s";
SimpleLogger().Write() << "Generating edges: " << TIMER_SEC(generate_edges) << "s";
- SimpleLogger().Write() << "Generating node data: " << TIMER_SEC(generate_node_data) << "s";
}
void EdgeBasedGraphFactory::CompressGeometry()
@@ -301,61 +289,61 @@ void EdgeBasedGraphFactory::CompressGeometry()
const unsigned original_number_of_nodes = m_node_based_graph->GetNumberOfNodes();
const unsigned original_number_of_edges = m_node_based_graph->GetNumberOfEdges();
- Percent p(original_number_of_nodes);
+ Percent progress(original_number_of_nodes);
unsigned removed_node_count = 0;
- for (const NodeID v : osrm::irange(0u, original_number_of_nodes))
+ for (const NodeID node_v : osrm::irange(0u, original_number_of_nodes))
{
- p.printStatus(v);
+ progress.printStatus(node_v);
// only contract degree 2 vertices
- if (2 != m_node_based_graph->GetOutDegree(v))
+ if (2 != m_node_based_graph->GetOutDegree(node_v))
{
continue;
}
// don't contract barrier node
- if (m_barrier_nodes.end() != m_barrier_nodes.find(v))
+ if (m_barrier_nodes.end() != m_barrier_nodes.find(node_v))
{
continue;
}
// check if v is a via node for a turn restriction, i.e. a 'directed' barrier node
- if (m_restriction_map->IsViaNode(v))
+ if (m_restriction_map->IsViaNode(node_v))
{
continue;
}
const bool reverse_edge_order =
- !(m_node_based_graph->GetEdgeData(m_node_based_graph->BeginEdges(v)).forward);
- const EdgeID forward_e2 = m_node_based_graph->BeginEdges(v) + reverse_edge_order;
+ !(m_node_based_graph->GetEdgeData(m_node_based_graph->BeginEdges(node_v)).forward);
+ const EdgeID forward_e2 = m_node_based_graph->BeginEdges(node_v) + reverse_edge_order;
BOOST_ASSERT(SPECIAL_EDGEID != forward_e2);
- const EdgeID reverse_e2 = m_node_based_graph->BeginEdges(v) + 1 - reverse_edge_order;
+ const EdgeID reverse_e2 = m_node_based_graph->BeginEdges(node_v) + 1 - reverse_edge_order;
BOOST_ASSERT(SPECIAL_EDGEID != reverse_e2);
const EdgeData &fwd_edge_data2 = m_node_based_graph->GetEdgeData(forward_e2);
const EdgeData &rev_edge_data2 = m_node_based_graph->GetEdgeData(reverse_e2);
- const NodeID w = m_node_based_graph->GetTarget(forward_e2);
- BOOST_ASSERT(SPECIAL_NODEID != w);
- BOOST_ASSERT(v != w);
- const NodeID u = m_node_based_graph->GetTarget(reverse_e2);
- BOOST_ASSERT(SPECIAL_NODEID != u);
- BOOST_ASSERT(u != v);
+ const NodeID node_w = m_node_based_graph->GetTarget(forward_e2);
+ BOOST_ASSERT(SPECIAL_NODEID != node_w);
+ BOOST_ASSERT(node_v != node_w);
+ const NodeID node_u = m_node_based_graph->GetTarget(reverse_e2);
+ BOOST_ASSERT(SPECIAL_NODEID != node_u);
+ BOOST_ASSERT(node_u != node_v);
- const EdgeID forward_e1 = m_node_based_graph->FindEdge(u, v);
- BOOST_ASSERT(m_node_based_graph->EndEdges(u) != forward_e1);
+ const EdgeID forward_e1 = m_node_based_graph->FindEdge(node_u, node_v);
+ BOOST_ASSERT(m_node_based_graph->EndEdges(node_u) != forward_e1);
BOOST_ASSERT(SPECIAL_EDGEID != forward_e1);
- BOOST_ASSERT(v == m_node_based_graph->GetTarget(forward_e1));
- const EdgeID reverse_e1 = m_node_based_graph->FindEdge(w, v);
+ BOOST_ASSERT(node_v == m_node_based_graph->GetTarget(forward_e1));
+ const EdgeID reverse_e1 = m_node_based_graph->FindEdge(node_w, node_v);
BOOST_ASSERT(SPECIAL_EDGEID != reverse_e1);
- BOOST_ASSERT(v == m_node_based_graph->GetTarget(reverse_e1));
+ BOOST_ASSERT(node_v == m_node_based_graph->GetTarget(reverse_e1));
const EdgeData &fwd_edge_data1 = m_node_based_graph->GetEdgeData(forward_e1);
const EdgeData &rev_edge_data1 = m_node_based_graph->GetEdgeData(reverse_e1);
- if ((m_node_based_graph->FindEdge(u, w) != m_node_based_graph->EndEdges(u)) ||
- (m_node_based_graph->FindEdge(w, u) != m_node_based_graph->EndEdges(w)))
+ if ((m_node_based_graph->FindEdge(node_u, node_w) != m_node_based_graph->EndEdges(node_u)) ||
+ (m_node_based_graph->FindEdge(node_w, node_u) != m_node_based_graph->EndEdges(node_w)))
{
continue;
}
@@ -378,7 +366,7 @@ void EdgeBasedGraphFactory::CompressGeometry()
BOOST_ASSERT(0 != forward_weight2);
const bool add_traffic_signal_penalty =
- (m_traffic_lights.find(v) != m_traffic_lights.end());
+ (m_traffic_lights.find(node_v) != m_traffic_lights.end());
// add weight of e2's to e1
m_node_based_graph->GetEdgeData(forward_e1).distance += fwd_edge_data2.distance;
@@ -386,43 +374,43 @@ void EdgeBasedGraphFactory::CompressGeometry()
if (add_traffic_signal_penalty)
{
m_node_based_graph->GetEdgeData(forward_e1).distance +=
- speed_profile.trafficSignalPenalty;
+ speed_profile.traffic_signal_penalty;
m_node_based_graph->GetEdgeData(reverse_e1).distance +=
- speed_profile.trafficSignalPenalty;
+ speed_profile.traffic_signal_penalty;
}
// extend e1's to targets of e2's
- m_node_based_graph->SetTarget(forward_e1, w);
- m_node_based_graph->SetTarget(reverse_e1, u);
+ m_node_based_graph->SetTarget(forward_e1, node_w);
+ m_node_based_graph->SetTarget(reverse_e1, node_u);
// remove e2's (if bidir, otherwise only one)
- m_node_based_graph->DeleteEdge(v, forward_e2);
- m_node_based_graph->DeleteEdge(v, reverse_e2);
+ m_node_based_graph->DeleteEdge(node_v, forward_e2);
+ m_node_based_graph->DeleteEdge(node_v, reverse_e2);
// update any involved turn restrictions
- m_restriction_map->FixupStartingTurnRestriction(u, v, w);
- m_restriction_map->FixupArrivingTurnRestriction(u, v, w);
+ m_restriction_map->FixupStartingTurnRestriction(node_u, node_v, node_w);
+ m_restriction_map->FixupArrivingTurnRestriction(node_u, node_v, node_w);
- m_restriction_map->FixupStartingTurnRestriction(w, v, u);
- m_restriction_map->FixupArrivingTurnRestriction(w, v, u);
+ m_restriction_map->FixupStartingTurnRestriction(node_w, node_v, node_u);
+ m_restriction_map->FixupArrivingTurnRestriction(node_w, node_v, node_u);
// store compressed geometry in container
m_geometry_compressor.CompressEdge(
forward_e1,
forward_e2,
- v,
- w,
+ node_v,
+ node_w,
forward_weight1 +
- (add_traffic_signal_penalty ? speed_profile.trafficSignalPenalty : 0),
+ (add_traffic_signal_penalty ? speed_profile.traffic_signal_penalty : 0),
forward_weight2);
m_geometry_compressor.CompressEdge(
reverse_e1,
reverse_e2,
- v,
- u,
+ node_v,
+ node_u,
reverse_weight1,
reverse_weight2 +
- (add_traffic_signal_penalty ? speed_profile.trafficSignalPenalty : 0));
+ (add_traffic_signal_penalty ? speed_profile.traffic_signal_penalty : 0));
++removed_node_count;
BOOST_ASSERT(m_node_based_graph->GetEdgeData(forward_e1).nameID ==
@@ -451,7 +439,7 @@ void EdgeBasedGraphFactory::CompressGeometry()
}
/**
- * Writes the id of the edge in the edge expanded graph (into the egde in the node based graph)
+ * Writes the id of the edge in the edge expanded graph (into the edge in the node based graph)
*/
void EdgeBasedGraphFactory::RenumberEdges()
{
@@ -478,104 +466,6 @@ void EdgeBasedGraphFactory::RenumberEdges()
m_number_of_edge_based_nodes = numbered_edges_count;
}
-void EdgeBasedGraphFactory::GenerateEdgeBasedNodeData()
-{
- BOOST_ASSERT(m_node_based_graph->GetNumberOfNodes() == m_node_based_graph_origin->GetNumberOfNodes());
-
- m_edge_based_node_data.resize(m_number_of_edge_based_nodes);
- std::vector<bool> found;
- found.resize(m_number_of_edge_based_nodes, false);
-
- for (NodeID current_node = 0; current_node < m_node_based_graph->GetNumberOfNodes();
- ++current_node)
- {
- for (EdgeID current_edge : m_node_based_graph->GetAdjacentEdgeRange(current_node))
- {
- EdgeData & edge_data = m_node_based_graph->GetEdgeData(current_edge);
- if (!edge_data.forward)
- {
- continue;
- }
-
- NodeID target = m_node_based_graph->GetTarget(current_edge);
-
- osrm::NodeData data;
- if (m_geometry_compressor.HasEntryForID(current_edge))
- {
- const std::vector<GeometryCompressor::CompressedNode> & via_nodes = m_geometry_compressor.GetBucketReference(current_edge);
- assert(via_nodes.size() > 0);
- std::vector< std::pair< NodeID, FixedPointCoordinate > > nodes;
- if (via_nodes.front().first != current_node)
- nodes.emplace_back(current_node, FixedPointCoordinate(m_node_info_list[current_node].lat, m_node_info_list[current_node].lon));
- for (auto n : via_nodes)
- nodes.emplace_back(n.first, FixedPointCoordinate(m_node_info_list[n.first].lat, m_node_info_list[n.first].lon));
- if (via_nodes.back().first != target)
- nodes.emplace_back(target, FixedPointCoordinate(m_node_info_list[target].lat, m_node_info_list[target].lon));
-
- for (uint32_t i = 1; i < nodes.size(); ++i)
- {
- auto n1 = nodes[i - 1];
- auto n2 = nodes[i];
-
- if (n1.first == n2.first)
- {
- SimpleLogger().Write() << "Error: Equal values " << n1.first << " and " << n2.first;
- SimpleLogger().Write() << "i: "<< i << " nodes: " << nodes.size();
- throw std::exception();
- }
-
- EdgeID e = m_node_based_graph_origin->FindEdge(n1.first, n2.first);
- if (e == SPECIAL_EDGEID)
- {
- SimpleLogger().Write() << "Error: Can't find edge between nodes " << n1.first << " and " << n2.first;
- continue;
- }
-
- EdgeData &ed = m_node_based_graph_origin->GetEdgeData(e);
-
- data.AddSegment(ed.way_id,
- m_node_info_list[n1.first].lat / COORDINATE_PRECISION,
- m_node_info_list[n1.first].lon / COORDINATE_PRECISION,
- m_node_info_list[n2.first].lat / COORDINATE_PRECISION,
- m_node_info_list[n2.first].lon / COORDINATE_PRECISION);
- }
-
- } else
- {
- data.AddSegment(edge_data.way_id,
- m_node_info_list[current_node].lat / COORDINATE_PRECISION,
- m_node_info_list[current_node].lon / COORDINATE_PRECISION,
- m_node_info_list[target].lat / COORDINATE_PRECISION,
- m_node_info_list[target].lon / COORDINATE_PRECISION);
- }
-
- if (found[edge_data.edgeBasedNodeID])
- {
- if (m_edge_based_node_data[edge_data.edgeBasedNodeID] != data)
- {
- std::cout << "Error!" << std::endl;
- throw std::exception();
- }
- } else
- {
- found[edge_data.edgeBasedNodeID] = true;
- m_edge_based_node_data[edge_data.edgeBasedNodeID] = data;
- }
- }
- }
-
- for (auto v : found)
- {
- if (!v)
- {
- std::cout << "Error2" << std::endl;
- throw std::exception();
- }
- }
-
- SimpleLogger().Write() << "Edge based node data count: " << m_edge_based_node_data.size();
-}
-
/**
* Creates the nodes in the edge expanded graph from edges in the node-based graph.
*/
@@ -593,21 +483,17 @@ void EdgeBasedGraphFactory::GenerateEdgeExpandedNodes()
<< " many components";
SimpleLogger().Write() << "generating edge-expanded nodes";
- Percent p(m_node_based_graph->GetNumberOfNodes());
+ Percent progress(m_node_based_graph->GetNumberOfNodes());
// loop over all edges and generate new set of nodes
for (NodeID u = 0, end = m_node_based_graph->GetNumberOfNodes(); u < end; ++u)
{
BOOST_ASSERT(u != SPECIAL_NODEID);
BOOST_ASSERT(u < m_node_based_graph->GetNumberOfNodes());
- p.printIncrement();
+ progress.printStatus(u);
for (EdgeID e1 : m_node_based_graph->GetAdjacentEdgeRange(u))
{
const EdgeData &edge_data = m_node_based_graph->GetEdgeData(e1);
- // if (edge_data.edgeBasedNodeID == SPECIAL_NODEID)
- // {
- // continue;
- // }
BOOST_ASSERT(e1 != SPECIAL_EDGEID);
const NodeID v = m_node_based_graph->GetTarget(e1);
@@ -619,7 +505,6 @@ void EdgeBasedGraphFactory::GenerateEdgeExpandedNodes()
}
BOOST_ASSERT(u < v);
- BOOST_ASSERT(edge_data.type != SHRT_MAX);
// Note: edges that end on barrier nodes or on a turn restriction
// may actually be in two distinct components. We choose the smallest
@@ -670,11 +555,12 @@ EdgeBasedGraphFactory::GenerateEdgeExpandedEdges(const std::string &original_edg
unsigned skipped_barrier_turns_counter = 0;
unsigned compressed = 0;
- Percent p(m_node_based_graph->GetNumberOfNodes());
+ Percent progress(m_node_based_graph->GetNumberOfNodes());
for (NodeID u = 0, end = m_node_based_graph->GetNumberOfNodes(); u < end; ++u)
{
- for (EdgeID e1 : m_node_based_graph->GetAdjacentEdgeRange(u))
+ progress.printStatus(u);
+ for (const EdgeID e1 : m_node_based_graph->GetAdjacentEdgeRange(u))
{
if (!m_node_based_graph->GetEdgeData(e1).forward)
{
@@ -739,29 +625,31 @@ EdgeBasedGraphFactory::GenerateEdgeExpandedEdges(const std::string &original_edg
BOOST_ASSERT(edge_data1.forward);
BOOST_ASSERT(edge_data2.forward);
- if (edge_data1.way_id == 244396524)
- {
- SimpleLogger().Write() << " - Id: " << edge_data1.way_id << " n1: " << u << " n2: " << v;
- }
-
- if (edge_data2.way_id == 244396524)
- {
- SimpleLogger().Write() << " - Id: " << edge_data2.way_id << " n1: " << v << " n2: " << w;
- }
-
// the following is the core of the loop.
unsigned distance = edge_data1.distance;
if (m_traffic_lights.find(v) != m_traffic_lights.end())
{
- distance += speed_profile.trafficSignalPenalty;
+ distance += speed_profile.traffic_signal_penalty;
}
- const double angle = GetAngleBetweenThreeFixedPointCoordinates(
- m_node_info_list[u], m_node_info_list[v], m_node_info_list[w]);
- const int turn_penalty = GetTurnPenalty(angle, lua_state);
- TurnInstruction turn_instruction = AnalyzeTurn(u, v, w, angle);
+
+ // unpack last node of first segment if packed
+ const auto first_coordinate = m_node_info_list[(m_geometry_compressor.HasEntryForID(e1) ?
+ m_geometry_compressor.GetLastNodeIDOfBucket(e1) :
+ u)];
+
+ // unpack first node of second segment if packed
+ const auto third_coordinate = m_node_info_list[(m_geometry_compressor.HasEntryForID(e2) ?
+ m_geometry_compressor.GetFirstNodeIDOfBucket(e2) :
+ w)];
+
+ const double turn_angle = ComputeAngle::OfThreeFixedPointCoordinates(
+ first_coordinate, m_node_info_list[v], third_coordinate);
+
+ const int turn_penalty = GetTurnPenalty(turn_angle, lua_state);
+ TurnInstruction turn_instruction = AnalyzeTurn(u, v, w, turn_angle);
if (turn_instruction == TurnInstruction::UTurn)
{
- distance += speed_profile.uTurnPenalty;
+ distance += speed_profile.u_turn_penalty;
}
distance += turn_penalty;
@@ -776,7 +664,8 @@ EdgeBasedGraphFactory::GenerateEdgeExpandedEdges(const std::string &original_edg
(edge_is_compressed ? m_geometry_compressor.GetPositionForID(e1) : v),
edge_data1.nameID,
turn_instruction,
- edge_is_compressed);
+ edge_is_compressed,
+ edge_data2.travel_mode);
++original_edges_counter;
@@ -796,7 +685,6 @@ EdgeBasedGraphFactory::GenerateEdgeExpandedEdges(const std::string &original_edg
false));
}
}
- p.printIncrement();
}
FlushVectorToStream(edge_data_file, original_edge_data_vector);
@@ -830,37 +718,28 @@ int EdgeBasedGraphFactory::GetTurnPenalty(double angle, lua_State *lua_state) co
return 0;
}
-TurnInstruction EdgeBasedGraphFactory::AnalyzeTurn(const NodeID u,
- const NodeID v,
- const NodeID w,
- double angle)
+TurnInstruction EdgeBasedGraphFactory::AnalyzeTurn(const NodeID node_u,
+ const NodeID node_v,
+ const NodeID node_w,
+ const double angle)
const
{
- if (u == w)
+ if (node_u == node_w)
{
return TurnInstruction::UTurn;
}
- const EdgeID edge1 = m_node_based_graph->FindEdge(u, v);
- const EdgeID edge2 = m_node_based_graph->FindEdge(v, w);
+ const EdgeID edge1 = m_node_based_graph->FindEdge(node_u, node_v);
+ const EdgeID edge2 = m_node_based_graph->FindEdge(node_v, node_w);
const EdgeData &data1 = m_node_based_graph->GetEdgeData(edge1);
const EdgeData &data2 = m_node_based_graph->GetEdgeData(edge2);
- if (!data1.contraFlow && data2.contraFlow)
- {
- return TurnInstruction::EnterAgainstAllowedDirection;
- }
- if (data1.contraFlow && !data2.contraFlow)
- {
- return TurnInstruction::LeaveAgainstAllowedDirection;
- }
-
// roundabouts need to be handled explicitely
if (data1.roundabout && data2.roundabout)
{
// Is a turn possible? If yes, we stay on the roundabout!
- if (1 == m_node_based_graph->GetDirectedOutDegree(v))
+ if (1 == m_node_based_graph->GetDirectedOutDegree(node_v))
{
// No turn possible.
return TurnInstruction::NoTurn;
@@ -888,11 +767,7 @@ TurnInstruction EdgeBasedGraphFactory::AnalyzeTurn(const NodeID u,
{
// TODO: Here we should also do a small graph exploration to check for
// more complex situations
- if (0 != data1.nameID)
- {
- return TurnInstruction::NoTurn;
- }
- else if (m_node_based_graph->GetOutDegree(v) <= 2)
+ if (0 != data1.nameID || m_node_based_graph->GetOutDegree(node_v) <= 2)
{
return TurnInstruction::NoTurn;
}
diff --git a/3party/osrm/osrm-backend/Contractor/EdgeBasedGraphFactory.h b/3party/osrm/osrm-backend/Contractor/EdgeBasedGraphFactory.h
index 1a06a15c7d..be35a199c4 100644
--- a/3party/osrm/osrm-backend/Contractor/EdgeBasedGraphFactory.h
+++ b/3party/osrm/osrm-backend/Contractor/EdgeBasedGraphFactory.h
@@ -38,7 +38,6 @@ SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
#include "../DataStructures/TurnInstructions.h"
#include "../DataStructures/NodeBasedGraph.h"
#include "../DataStructures/RestrictionMap.h"
-#include "../DataStructures/EdgeBasedNodeData.h"
#include "GeometryCompressor.h"
#include <algorithm>
@@ -50,7 +49,6 @@ SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
#include <unordered_set>
#include <vector>
-
struct lua_State;
class EdgeBasedGraphFactory
@@ -62,7 +60,6 @@ class EdgeBasedGraphFactory
struct SpeedProfileProperties;
explicit EdgeBasedGraphFactory(const std::shared_ptr<NodeBasedDynamicGraph> &node_based_graph,
- const std::shared_ptr<NodeBasedDynamicGraph> &node_based_graph_origin,
std::unique_ptr<RestrictionMap> restricion_map,
std::vector<NodeID> &barrier_node_list,
std::vector<NodeID> &traffic_light_node_list,
@@ -77,9 +74,7 @@ class EdgeBasedGraphFactory
void GetEdgeBasedNodes(std::vector<EdgeBasedNode> &nodes);
- void GetEdgeBasedNodeData(osrm::NodeDataVectorT &data);
-
- TurnInstruction AnalyzeTurn(const NodeID u, const NodeID v, const NodeID w, double angle) const;
+ TurnInstruction AnalyzeTurn(const NodeID u, const NodeID v, const NodeID w, const double angle) const;
int GetTurnPenalty(double angle, lua_State *lua_state) const;
@@ -88,17 +83,17 @@ class EdgeBasedGraphFactory
struct SpeedProfileProperties
{
SpeedProfileProperties()
- : trafficSignalPenalty(0), uTurnPenalty(0), has_turn_penalty_function(false)
+ : traffic_signal_penalty(0), u_turn_penalty(0), has_turn_penalty_function(false)
{
}
- int trafficSignalPenalty;
- int uTurnPenalty;
+ int traffic_signal_penalty;
+ int u_turn_penalty;
bool has_turn_penalty_function;
} speed_profile;
private:
- typedef NodeBasedDynamicGraph::EdgeData EdgeData;
+ using EdgeData = NodeBasedDynamicGraph::EdgeData;
unsigned m_number_of_edge_based_nodes;
@@ -107,18 +102,15 @@ class EdgeBasedGraphFactory
DeallocatingVector<EdgeBasedEdge> m_edge_based_edge_list;
std::shared_ptr<NodeBasedDynamicGraph> m_node_based_graph;
- std::shared_ptr<NodeBasedDynamicGraph> m_node_based_graph_origin;
std::unordered_set<NodeID> m_barrier_nodes;
std::unordered_set<NodeID> m_traffic_lights;
std::unique_ptr<RestrictionMap> m_restriction_map;
- std::vector<osrm::NodeData> m_edge_based_node_data;
GeometryCompressor m_geometry_compressor;
void CompressGeometry();
void RenumberEdges();
- void GenerateEdgeBasedNodeData();
void GenerateEdgeExpandedNodes();
void GenerateEdgeExpandedEdges(const std::string &original_edge_data_filename,
lua_State *lua_state);
@@ -128,7 +120,7 @@ class EdgeBasedGraphFactory
void FlushVectorToStream(std::ofstream &edge_data_file,
std::vector<OriginalEdgeData> &original_edge_data_vector) const;
- unsigned max_id;
+ NodeID max_id;
};
#endif /* EDGEBASEDGRAPHFACTORY_H_ */
diff --git a/3party/osrm/osrm-backend/Contractor/GeometryCompressor.cpp b/3party/osrm/osrm-backend/Contractor/GeometryCompressor.cpp
index 7c5191002e..be4dc7afd5 100644
--- a/3party/osrm/osrm-backend/Contractor/GeometryCompressor.cpp
+++ b/3party/osrm/osrm-backend/Contractor/GeometryCompressor.cpp
@@ -26,7 +26,7 @@ SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
*/
#include "GeometryCompressor.h"
-#include "../Util/SimpleLogger.h"
+#include "../Util/simple_logger.hpp"
#include <boost/assert.hpp>
#include <boost/filesystem.hpp>
@@ -225,3 +225,16 @@ GeometryCompressor::GetBucketReference(const EdgeID edge_id) const
const unsigned index = m_edge_id_to_list_index_map.at(edge_id);
return m_compressed_geometries.at(index);
}
+
+ NodeID GeometryCompressor::GetFirstNodeIDOfBucket(const EdgeID edge_id) const
+ {
+ const auto &bucket = GetBucketReference(edge_id);
+ BOOST_ASSERT(bucket.size() >= 2);
+ return bucket[1].first;
+ }
+ NodeID GeometryCompressor::GetLastNodeIDOfBucket(const EdgeID edge_id) const
+ {
+ const auto &bucket = GetBucketReference(edge_id);
+ BOOST_ASSERT(bucket.size() >= 2);
+ return bucket[bucket.size()-2].first;
+ }
diff --git a/3party/osrm/osrm-backend/Contractor/GeometryCompressor.h b/3party/osrm/osrm-backend/Contractor/GeometryCompressor.h
index 7c4fba45cd..f0af3710c0 100644
--- a/3party/osrm/osrm-backend/Contractor/GeometryCompressor.h
+++ b/3party/osrm/osrm-backend/Contractor/GeometryCompressor.h
@@ -25,6 +25,9 @@ SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
*/
+#ifndef GEOMETRY_COMPRESSOR_H
+#define GEOMETRY_COMPRESSOR_H
+
#include "../typedefs.h"
#include <unordered_map>
@@ -32,13 +35,10 @@ SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
#include <string>
#include <vector>
-#ifndef GEOMETRY_COMPRESSOR_H
-#define GEOMETRY_COMPRESSOR_H
-
class GeometryCompressor
{
public:
- typedef std::pair<NodeID, EdgeWeight> CompressedNode;
+ using CompressedNode = std::pair<NodeID, EdgeWeight>;
GeometryCompressor();
void CompressEdge(const EdgeID surviving_edge_id,
@@ -54,6 +54,8 @@ class GeometryCompressor
unsigned GetPositionForID(const EdgeID edge_id) const;
const std::vector<GeometryCompressor::CompressedNode> &
GetBucketReference(const EdgeID edge_id) const;
+ NodeID GetFirstNodeIDOfBucket(const EdgeID edge_id) const;
+ NodeID GetLastNodeIDOfBucket(const EdgeID edge_id) const;
private:
void IncreaseFreeList();
diff --git a/3party/osrm/osrm-backend/Contractor/Prepare.cpp b/3party/osrm/osrm-backend/Contractor/Prepare.cpp
index 28f1e84d60..6dae9fa370 100644
--- a/3party/osrm/osrm-backend/Contractor/Prepare.cpp
+++ b/3party/osrm/osrm-backend/Contractor/Prepare.cpp
@@ -38,8 +38,9 @@ SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
#include "../Util/GitDescription.h"
#include "../Util/LuaUtil.h"
+#include "../Util/make_unique.hpp"
#include "../Util/OSRMException.h"
-#include "../Util/SimpleLogger.h"
+#include "../Util/simple_logger.hpp"
#include "../Util/StringUtil.h"
#include "../Util/TimingUtil.h"
#include "../typedefs.h"
@@ -108,7 +109,7 @@ int Prepare::Process(int argc, char *argv[])
FingerPrint fingerprint_orig;
CheckRestrictionsFile(fingerprint_orig);
- boost::filesystem::ifstream in(input_path, std::ios::in | std::ios::binary);
+ boost::filesystem::ifstream input_stream(input_path, std::ios::in | std::ios::binary);
node_filename = input_path.string() + ".nodes";
edge_out = input_path.string() + ".edges";
@@ -116,7 +117,6 @@ int Prepare::Process(int argc, char *argv[])
graph_out = input_path.string() + ".hsgr";
rtree_nodes_path = input_path.string() + ".ramIndex";
rtree_leafs_path = input_path.string() + ".fileIndex";
- node_data_filename = input_path.string() + ".nodeData";
/*** Setup Scripting Environment ***/
// Create a new lua state
@@ -135,17 +135,17 @@ int Prepare::Process(int argc, char *argv[])
#ifdef WIN32
#pragma message("Memory consumption on Windows can be higher due to different bit packing")
#else
- static_assert(sizeof(ImportEdge) == 24,
+ static_assert(sizeof(ImportEdge) == 20,
"changing ImportEdge type has influence on memory consumption!");
#endif
NodeID number_of_node_based_nodes =
- readBinaryOSRMGraphFromStream(in,
+ readBinaryOSRMGraphFromStream(input_stream,
edge_list,
barrier_node_list,
traffic_light_list,
&internal_to_external_node_map,
restriction_list);
- in.close();
+ input_stream.close();
if (edge_list.empty())
{
@@ -162,24 +162,31 @@ int Prepare::Process(int argc, char *argv[])
DeallocatingVector<EdgeBasedEdge> edge_based_edge_list;
// init node_based_edge_list, edge_based_edge_list by edgeList
- BuildEdgeExpandedGraph(lua_state,
- number_of_node_based_nodes,
- number_of_edge_based_nodes,
- node_based_edge_list,
- edge_based_edge_list,
- speed_profile);
+ number_of_edge_based_nodes = BuildEdgeExpandedGraph(lua_state,
+ number_of_node_based_nodes,
+ node_based_edge_list,
+ edge_based_edge_list,
+ speed_profile);
lua_close(lua_state);
TIMER_STOP(expansion);
BuildRTree(node_based_edge_list);
- IteratorbasedCRC32<std::vector<EdgeBasedNode>> crc32;
- const unsigned node_based_edge_list_CRC32 =
- crc32(node_based_edge_list.begin(), node_based_edge_list.end());
+ RangebasedCRC32 crc32;
+ if (crc32.using_hardware())
+ {
+ SimpleLogger().Write() << "using hardware based CRC32 computation";
+ }
+ else
+ {
+ SimpleLogger().Write() << "using software based CRC32 computation";
+ }
+
+ const unsigned crc32_value = crc32(node_based_edge_list);
node_based_edge_list.clear();
node_based_edge_list.shrink_to_fit();
- SimpleLogger().Write() << "CRC32: " << node_based_edge_list_CRC32;
+ SimpleLogger().Write() << "CRC32: " << crc32_value;
WriteNodeMapping();
@@ -188,7 +195,8 @@ int Prepare::Process(int argc, char *argv[])
*/
SimpleLogger().Write() << "initializing contractor";
- Contractor *contractor = new Contractor(number_of_edge_based_nodes, edge_based_edge_list);
+ auto contractor =
+ osrm::make_unique<Contractor>(number_of_edge_based_nodes, edge_based_edge_list);
TIMER_START(contraction);
contractor->Run();
@@ -198,31 +206,34 @@ int Prepare::Process(int argc, char *argv[])
DeallocatingVector<QueryEdge> contracted_edge_list;
contractor->GetEdges(contracted_edge_list);
- delete contractor;
+ contractor.reset();
/***
* Sorting contracted edges in a way that the static query graph can read some in in-place.
*/
tbb::parallel_sort(contracted_edge_list.begin(), contracted_edge_list.end());
- unsigned max_used_node_id = 0;
- unsigned contracted_edge_count = contracted_edge_list.size();
+ const unsigned contracted_edge_count = contracted_edge_list.size();
SimpleLogger().Write() << "Serializing compacted graph of " << contracted_edge_count
<< " edges";
boost::filesystem::ofstream hsgr_output_stream(graph_out, std::ios::binary);
hsgr_output_stream.write((char *)&fingerprint_orig, sizeof(FingerPrint));
- for (const QueryEdge &edge : contracted_edge_list)
+ const unsigned max_used_node_id = 1 + [&contracted_edge_list]
{
- BOOST_ASSERT(UINT_MAX != edge.source);
- BOOST_ASSERT(UINT_MAX != edge.target);
+ unsigned tmp_max = 0;
+ for (const QueryEdge &edge : contracted_edge_list)
+ {
+ BOOST_ASSERT(SPECIAL_NODEID != edge.source);
+ BOOST_ASSERT(SPECIAL_NODEID != edge.target);
+ tmp_max = std::max(tmp_max, edge.source);
+ tmp_max = std::max(tmp_max, edge.target);
+ }
+ return tmp_max;
+ }();
- max_used_node_id = std::max(max_used_node_id, edge.source);
- max_used_node_id = std::max(max_used_node_id, edge.target);
- }
SimpleLogger().Write(logDEBUG) << "input graph has " << number_of_edge_based_nodes << " nodes";
SimpleLogger().Write(logDEBUG) << "contracted graph has " << max_used_node_id << " nodes";
- max_used_node_id += 1;
std::vector<StaticGraph<EdgeData>::NodeArrayEntry> node_array;
node_array.resize(number_of_edge_based_nodes + 1);
@@ -254,7 +265,7 @@ int Prepare::Process(int argc, char *argv[])
const unsigned node_array_size = node_array.size();
// serialize crc32, aka checksum
- hsgr_output_stream.write((char *)&node_based_edge_list_CRC32, sizeof(unsigned));
+ hsgr_output_stream.write((char *)&crc32_value, sizeof(unsigned));
// serialize number of nodes
hsgr_output_stream.write((char *)&node_array_size, sizeof(unsigned));
// serialize number of edges
@@ -462,9 +473,9 @@ Prepare::SetupScriptingEnvironment(lua_State *lua_state,
std::cerr << lua_tostring(lua_state, -1) << " occured in scripting block" << std::endl;
return false;
}
- speed_profile.trafficSignalPenalty = 10 * lua_tointeger(lua_state, -1);
+ speed_profile.traffic_signal_penalty = 10 * lua_tointeger(lua_state, -1);
SimpleLogger().Write(logDEBUG)
- << "traffic_signal_penalty: " << speed_profile.trafficSignalPenalty;
+ << "traffic_signal_penalty: " << speed_profile.traffic_signal_penalty;
if (0 != luaL_dostring(lua_state, "return u_turn_penalty\n"))
{
@@ -472,7 +483,7 @@ Prepare::SetupScriptingEnvironment(lua_State *lua_state,
return false;
}
- speed_profile.uTurnPenalty = 10 * lua_tointeger(lua_state, -1);
+ speed_profile.u_turn_penalty = 10 * lua_tointeger(lua_state, -1);
speed_profile.has_turn_penalty_function = lua_function_exists(lua_state, "turn_function");
return true;
@@ -481,30 +492,25 @@ Prepare::SetupScriptingEnvironment(lua_State *lua_state,
/**
\brief Building an edge-expanded graph from node-based input and turn restrictions
*/
-void Prepare::BuildEdgeExpandedGraph(lua_State *lua_state,
- NodeID number_of_node_based_nodes,
- unsigned &number_of_edge_based_nodes,
- std::vector<EdgeBasedNode> &node_based_edge_list,
- DeallocatingVector<EdgeBasedEdge> &edge_based_edge_list,
- EdgeBasedGraphFactory::SpeedProfileProperties &speed_profile)
+std::size_t
+Prepare::BuildEdgeExpandedGraph(lua_State *lua_state,
+ NodeID number_of_node_based_nodes,
+ std::vector<EdgeBasedNode> &node_based_edge_list,
+ DeallocatingVector<EdgeBasedEdge> &edge_based_edge_list,
+ EdgeBasedGraphFactory::SpeedProfileProperties &speed_profile)
{
SimpleLogger().Write() << "Generating edge-expanded graph representation";
std::shared_ptr<NodeBasedDynamicGraph> node_based_graph =
NodeBasedDynamicGraphFromImportEdges(number_of_node_based_nodes, edge_list);
std::unique_ptr<RestrictionMap> restriction_map =
std::unique_ptr<RestrictionMap>(new RestrictionMap(node_based_graph, restriction_list));
-
- std::shared_ptr<NodeBasedDynamicGraph> node_based_graph_origin =
- NodeBasedDynamicGraphFromImportEdges(number_of_node_based_nodes, edge_list);
-
- EdgeBasedGraphFactory *edge_based_graph_factory =
- new EdgeBasedGraphFactory(node_based_graph,
- node_based_graph_origin,
- std::move(restriction_map),
- barrier_node_list,
- traffic_light_list,
- internal_to_external_node_map,
- speed_profile);
+ std::shared_ptr<EdgeBasedGraphFactory> edge_based_graph_factory =
+ std::make_shared<EdgeBasedGraphFactory>(node_based_graph,
+ std::move(restriction_map),
+ barrier_node_list,
+ traffic_light_list,
+ internal_to_external_node_map,
+ speed_profile);
edge_list.clear();
edge_list.shrink_to_fit();
@@ -517,7 +523,8 @@ void Prepare::BuildEdgeExpandedGraph(lua_State *lua_state,
traffic_light_list.clear();
traffic_light_list.shrink_to_fit();
- number_of_edge_based_nodes = edge_based_graph_factory->GetNumberOfEdgeBasedNodes();
+ const std::size_t number_of_edge_based_nodes =
+ edge_based_graph_factory->GetNumberOfEdgeBasedNodes();
BOOST_ASSERT(number_of_edge_based_nodes != std::numeric_limits<unsigned>::max());
#ifndef WIN32
@@ -528,17 +535,10 @@ void Prepare::BuildEdgeExpandedGraph(lua_State *lua_state,
edge_based_graph_factory->GetEdgeBasedEdges(edge_based_edge_list);
edge_based_graph_factory->GetEdgeBasedNodes(node_based_edge_list);
- // serialize node data
- osrm::NodeDataVectorT data;
- edge_based_graph_factory->GetEdgeBasedNodeData(data);
-
- SimpleLogger().Write() << "Serialize node data";
-
- osrm::SaveNodeDataToFile(node_data_filename, data);
-
- delete edge_based_graph_factory;
-
+ edge_based_graph_factory.reset();
node_based_graph.reset();
+
+ return number_of_edge_based_nodes;
}
/**
@@ -565,10 +565,10 @@ void Prepare::WriteNodeMapping()
Saves info to files: '.ramIndex' and '.fileIndex'.
*/
-void Prepare::BuildRTree(std::vector<EdgeBasedNode> &edge_based_node_list)
+void Prepare::BuildRTree(std::vector<EdgeBasedNode> &node_based_edge_list)
{
SimpleLogger().Write() << "building r-tree ...";
- StaticRTree<EdgeBasedNode>(edge_based_node_list,
+ StaticRTree<EdgeBasedNode>(node_based_edge_list,
rtree_nodes_path.c_str(),
rtree_leafs_path.c_str(),
internal_to_external_node_map);
diff --git a/3party/osrm/osrm-backend/Contractor/Prepare.h b/3party/osrm/osrm-backend/Contractor/Prepare.h
index b7100b0c7e..cd8cbcadd7 100644
--- a/3party/osrm/osrm-backend/Contractor/Prepare.h
+++ b/3party/osrm/osrm-backend/Contractor/Prepare.h
@@ -18,9 +18,9 @@
class Prepare
{
public:
- typedef QueryEdge::EdgeData EdgeData;
- typedef DynamicGraph<EdgeData>::InputEdge InputEdge;
- typedef StaticGraph<EdgeData>::InputEdge StaticEdge;
+ using EdgeData = QueryEdge::EdgeData;
+ using InputEdge = DynamicGraph<EdgeData>::InputEdge;
+ using StaticEdge = StaticGraph<EdgeData>::InputEdge;
explicit Prepare();
Prepare(const Prepare &) = delete;
@@ -33,12 +33,11 @@ class Prepare
void CheckRestrictionsFile(FingerPrint &fingerprint_orig);
bool SetupScriptingEnvironment(lua_State *myLuaState,
EdgeBasedGraphFactory::SpeedProfileProperties &speed_profile);
- void BuildEdgeExpandedGraph(lua_State *myLuaState,
- NodeID nodeBasedNodeNumber,
- unsigned &nodeBasedEdgesNumber,
- std::vector<EdgeBasedNode> &nodeBasedEdgeList,
- DeallocatingVector<EdgeBasedEdge> &edgeBasedEdgeList,
- EdgeBasedGraphFactory::SpeedProfileProperties &speed_profile);
+ std::size_t BuildEdgeExpandedGraph(lua_State *myLuaState,
+ NodeID nodeBasedNodeNumber,
+ std::vector<EdgeBasedNode> &nodeBasedEdgeList,
+ DeallocatingVector<EdgeBasedEdge> &edgeBasedEdgeList,
+ EdgeBasedGraphFactory::SpeedProfileProperties &speed_profile);
void WriteNodeMapping();
void BuildRTree(std::vector<EdgeBasedNode> &node_based_edge_list);
@@ -63,7 +62,6 @@ class Prepare
std::string graph_out;
std::string rtree_nodes_path;
std::string rtree_leafs_path;
- std::string node_data_filename;
};
#endif // PREPARE_H
diff --git a/3party/osrm/osrm-backend/DataStructures/BinaryHeap.h b/3party/osrm/osrm-backend/DataStructures/BinaryHeap.h
index 6903be1b3f..24a65cbf08 100644
--- a/3party/osrm/osrm-backend/DataStructures/BinaryHeap.h
+++ b/3party/osrm/osrm-backend/DataStructures/BinaryHeap.h
@@ -100,8 +100,8 @@ class BinaryHeap
void operator=(const BinaryHeap &right);
public:
- typedef Weight WeightType;
- typedef Data DataType;
+ using WeightType = Weight;
+ using DataType = Data;
explicit BinaryHeap(size_t maxID) : node_index(maxID) { Clear(); }
diff --git a/3party/osrm/osrm-backend/DataStructures/ConcurrentQueue.h b/3party/osrm/osrm-backend/DataStructures/ConcurrentQueue.h
index 9d5b366f9c..a61503a6dd 100644
--- a/3party/osrm/osrm-backend/DataStructures/ConcurrentQueue.h
+++ b/3party/osrm/osrm-backend/DataStructures/ConcurrentQueue.h
@@ -28,8 +28,6 @@ SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
#ifndef CONCURRENT_QUEUE_H
#define CONCURRENT_QUEUE_H
-#include "../typedefs.h"
-
#include <boost/circular_buffer.hpp>
#include <condition_variable>
#include <mutex>
diff --git a/3party/osrm/osrm-backend/DataStructures/Coordinate.cpp b/3party/osrm/osrm-backend/DataStructures/Coordinate.cpp
index 1960d68d68..3bd27df109 100644
--- a/3party/osrm/osrm-backend/DataStructures/Coordinate.cpp
+++ b/3party/osrm/osrm-backend/DataStructures/Coordinate.cpp
@@ -28,7 +28,7 @@ SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
#include <osrm/Coordinate.h>
#include "../Util/MercatorUtil.h"
#ifndef NDEBUG
-#include "../Util/SimpleLogger.h"
+#include "../Util/simple_logger.hpp"
#endif
#include "../Util/StringUtil.h"
@@ -159,11 +159,11 @@ FixedPointCoordinate::ComputePerpendicularDistance(const FixedPointCoordinate &s
const FixedPointCoordinate &point)
{
// initialize values
- const float x_value = lat2y(point.lat / COORDINATE_PRECISION);
+ const float x_value = static_cast<float>(lat2y(point.lat / COORDINATE_PRECISION));
const float y_value = point.lon / COORDINATE_PRECISION;
- float a = lat2y(source_coordinate.lat / COORDINATE_PRECISION);
+ float a = static_cast<float>(lat2y(source_coordinate.lat / COORDINATE_PRECISION));
float b = source_coordinate.lon / COORDINATE_PRECISION;
- float c = lat2y(target_coordinate.lat / COORDINATE_PRECISION);
+ float c = static_cast<float>(lat2y(target_coordinate.lat / COORDINATE_PRECISION));
float d = target_coordinate.lon / COORDINATE_PRECISION;
float p, q;
if (std::abs(a - c) > std::numeric_limits<float>::epsilon())
@@ -184,7 +184,8 @@ FixedPointCoordinate::ComputePerpendicularDistance(const FixedPointCoordinate &s
bool inverse_ratio = false;
// straight line segment on equator
- if (std::abs(c) < std::numeric_limits<float>::epsilon() && std::abs(a) < std::numeric_limits<float>::epsilon())
+ if (std::abs(c) < std::numeric_limits<float>::epsilon() &&
+ std::abs(a) < std::numeric_limits<float>::epsilon())
{
ratio = (q - b) / (d - b);
}
@@ -228,7 +229,7 @@ FixedPointCoordinate::ComputePerpendicularDistance(const FixedPointCoordinate &s
ratio = 1.0f - ratio;
}
- //compute the nearest location
+ // compute the nearest location
FixedPointCoordinate nearest_location;
BOOST_ASSERT(!std::isnan(ratio));
if (ratio <= 0.f)
@@ -258,16 +259,16 @@ float FixedPointCoordinate::ComputePerpendicularDistance(const FixedPointCoordin
BOOST_ASSERT(query_location.isValid());
// initialize values
- const float x = lat2y(query_location.lat / COORDINATE_PRECISION);
- const float y = query_location.lon / COORDINATE_PRECISION;
- const float a = lat2y(segment_source.lat / COORDINATE_PRECISION);
- const float b = segment_source.lon / COORDINATE_PRECISION;
- const float c = lat2y(segment_target.lat / COORDINATE_PRECISION);
- const float d = segment_target.lon / COORDINATE_PRECISION;
- float p, q /*,mX*/, nY;
- if (std::abs(a - c) > std::numeric_limits<float>::epsilon())
+ const double x = lat2y(query_location.lat / COORDINATE_PRECISION);
+ const double y = query_location.lon / COORDINATE_PRECISION;
+ const double a = lat2y(segment_source.lat / COORDINATE_PRECISION);
+ const double b = segment_source.lon / COORDINATE_PRECISION;
+ const double c = lat2y(segment_target.lat / COORDINATE_PRECISION);
+ const double d = segment_target.lon / COORDINATE_PRECISION;
+ double p, q /*,mX*/, nY;
+ if (std::abs(a - c) > std::numeric_limits<double>::epsilon())
{
- const float m = (d - b) / (c - a); // slope
+ 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.f + m * m);
q = b + m * (p - a);
@@ -293,11 +294,11 @@ float FixedPointCoordinate::ComputePerpendicularDistance(const FixedPointCoordin
{
ratio = (segment_target == query_location ? 1.f : 0.f);
}
- else if (std::abs(ratio) <= std::numeric_limits<float>::epsilon())
+ else if (std::abs(ratio) <= std::numeric_limits<double>::epsilon())
{
- ratio = 0.;
+ ratio = 0.f;
}
- else if (std::abs(ratio - 1.f) <= std::numeric_limits<float>::epsilon())
+ else if (std::abs(ratio - 1.f) <= std::numeric_limits<double>::epsilon())
{
ratio = 1.f;
}
@@ -308,7 +309,7 @@ float FixedPointCoordinate::ComputePerpendicularDistance(const FixedPointCoordin
{
nearest_location = segment_source;
}
- else if (ratio >= 1.)
+ else if (ratio >= 1.f)
{
nearest_location = segment_target;
}
@@ -366,7 +367,8 @@ void FixedPointCoordinate::Output(std::ostream &out) const
float FixedPointCoordinate::GetBearing(const FixedPointCoordinate &first_coordinate,
const FixedPointCoordinate &second_coordinate)
{
- const float lon_diff = second_coordinate.lon / COORDINATE_PRECISION - first_coordinate.lon / COORDINATE_PRECISION;
+ const float lon_diff =
+ second_coordinate.lon / COORDINATE_PRECISION - first_coordinate.lon / COORDINATE_PRECISION;
const float lon_delta = DegreeToRadian(lon_diff);
const float lat1 = DegreeToRadian(first_coordinate.lat / COORDINATE_PRECISION);
const float lat2 = DegreeToRadian(second_coordinate.lat / COORDINATE_PRECISION);
@@ -408,9 +410,15 @@ float FixedPointCoordinate::GetBearing(const FixedPointCoordinate &other) const
return result;
}
-float FixedPointCoordinate::DegreeToRadian(const float degree) { return degree * (static_cast<float>(M_PI) / 180.f); }
+float FixedPointCoordinate::DegreeToRadian(const float degree)
+{
+ return degree * (static_cast<float>(M_PI) / 180.f);
+}
-float FixedPointCoordinate::RadianToDegree(const float radian) { return radian * (180.f * static_cast<float>(M_1_PI)); }
+float FixedPointCoordinate::RadianToDegree(const float radian)
+{
+ return radian * (180.f * static_cast<float>(M_1_PI));
+}
// This distance computation does integer arithmetic only and is a lot faster than
// the other distance function which are numerically correct('ish).
@@ -421,11 +429,11 @@ int FixedPointCoordinate::OrderedPerpendicularDistanceApproximation(
const FixedPointCoordinate &segment_target)
{
// initialize values
- const float x = lat2y(input_point.lat / COORDINATE_PRECISION);
+ const float x = static_cast<float>(lat2y(input_point.lat / COORDINATE_PRECISION));
const float y = input_point.lon / COORDINATE_PRECISION;
- const float a = lat2y(segment_source.lat / COORDINATE_PRECISION);
+ const float a = static_cast<float>(lat2y(segment_source.lat / COORDINATE_PRECISION));
const float b = segment_source.lon / COORDINATE_PRECISION;
- const float c = lat2y(segment_target.lat / COORDINATE_PRECISION);
+ const float c = static_cast<float>(lat2y(segment_target.lat / COORDINATE_PRECISION));
const float d = segment_target.lon / COORDINATE_PRECISION;
float p, q;
diff --git a/3party/osrm/osrm-backend/DataStructures/DeallocatingVector.h b/3party/osrm/osrm-backend/DataStructures/DeallocatingVector.h
index 3aec167d66..422dd5f19d 100644
--- a/3party/osrm/osrm-backend/DataStructures/DeallocatingVector.h
+++ b/3party/osrm/osrm-backend/DataStructures/DeallocatingVector.h
@@ -165,11 +165,11 @@ class DeallocatingVector
std::vector<ElementT *> bucket_list;
public:
- typedef DeallocatingVectorIterator<ElementT, ELEMENTS_PER_BLOCK> iterator;
- typedef DeallocatingVectorIterator<ElementT, ELEMENTS_PER_BLOCK> const_iterator;
+ using iterator = DeallocatingVectorIterator<ElementT, ELEMENTS_PER_BLOCK>;
+ using const_iterator = DeallocatingVectorIterator<ElementT, ELEMENTS_PER_BLOCK>;
// this forward-only iterator deallocates all buckets that have been visited
- typedef DeallocatingVectorRemoveIterator<ElementT, ELEMENTS_PER_BLOCK> deallocation_iterator;
+ using deallocation_iterator = DeallocatingVectorRemoveIterator<ElementT, ELEMENTS_PER_BLOCK>;
DeallocatingVector() : current_size(0) { bucket_list.emplace_back(new ElementT[ELEMENTS_PER_BLOCK]); }
diff --git a/3party/osrm/osrm-backend/DataStructures/DynamicGraph.h b/3party/osrm/osrm-backend/DataStructures/DynamicGraph.h
index 4fc345df04..81b1afe117 100644
--- a/3party/osrm/osrm-backend/DataStructures/DynamicGraph.h
+++ b/3party/osrm/osrm-backend/DataStructures/DynamicGraph.h
@@ -43,10 +43,10 @@ SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
template <typename EdgeDataT> class DynamicGraph
{
public:
- typedef EdgeDataT EdgeData;
- typedef unsigned NodeIterator;
- typedef unsigned EdgeIterator;
- typedef osrm::range<EdgeIterator> EdgeRange;
+ using EdgeData = EdgeDataT;
+ using NodeIterator = unsigned;
+ using EdgeIterator = unsigned;
+ using EdgeRange = osrm::range<EdgeIterator>;
class InputEdge
{
@@ -71,7 +71,7 @@ template <typename EdgeDataT> class DynamicGraph
};
// Constructs an empty graph with a given number of nodes.
- explicit DynamicGraph(int32_t nodes) : number_of_nodes(nodes), number_of_edges(0)
+ explicit DynamicGraph(NodeIterator nodes) : number_of_nodes(nodes), number_of_edges(0)
{
node_list.reserve(number_of_nodes);
node_list.resize(number_of_nodes);
@@ -80,7 +80,7 @@ template <typename EdgeDataT> class DynamicGraph
edge_list.resize(number_of_nodes);
}
- template <class ContainerT> DynamicGraph(const int32_t nodes, const ContainerT &graph)
+ template <class ContainerT> DynamicGraph(const NodeIterator nodes, const ContainerT &graph)
{
number_of_nodes = nodes;
number_of_edges = (EdgeIterator)graph.size();
diff --git a/3party/osrm/osrm-backend/DataStructures/EdgeBasedNode.h b/3party/osrm/osrm-backend/DataStructures/EdgeBasedNode.h
index b0a5c7111e..e2ac9acab1 100644
--- a/3party/osrm/osrm-backend/DataStructures/EdgeBasedNode.h
+++ b/3party/osrm/osrm-backend/DataStructures/EdgeBasedNode.h
@@ -1,10 +1,10 @@
#ifndef EDGE_BASED_NODE_H
#define EDGE_BASED_NODE_H
-#include "../Util/SimpleLogger.h"
+#include "../DataStructures/TravelMode.h"
#include "../typedefs.h"
-#include "../Include/osrm/Coordinate.h"
+#include <osrm/Coordinate.h>
#include <boost/assert.hpp>
@@ -14,8 +14,6 @@ struct EdgeBasedNode
{
EdgeBasedNode() :
- forward_way_id(-1),
- reverse_way_id(-1),
forward_edge_based_node_id(SPECIAL_NODEID),
reverse_edge_based_node_id(SPECIAL_NODEID),
u(SPECIAL_NODEID),
@@ -27,12 +25,12 @@ struct EdgeBasedNode
reverse_offset(0),
packed_geometry_id(SPECIAL_EDGEID),
fwd_segment_position( std::numeric_limits<unsigned short>::max() ),
- is_in_tiny_cc(false)
+ is_in_tiny_cc(false),
+ forward_travel_mode(TRAVEL_MODE_INACCESSIBLE),
+ backward_travel_mode(TRAVEL_MODE_INACCESSIBLE)
{ }
explicit EdgeBasedNode(
- unsigned forward_way_id,
- unsigned reverse_way_id,
NodeID forward_edge_based_node_id,
NodeID reverse_edge_based_node_id,
NodeID u,
@@ -44,10 +42,10 @@ struct EdgeBasedNode
int reverse_offset,
unsigned packed_geometry_id,
unsigned short fwd_segment_position,
- bool belongs_to_tiny_component
+ bool belongs_to_tiny_component,
+ TravelMode forward_travel_mode,
+ TravelMode backward_travel_mode
) :
- forward_way_id(forward_way_id),
- reverse_way_id(reverse_way_id),
forward_edge_based_node_id(forward_edge_based_node_id),
reverse_edge_based_node_id(reverse_edge_based_node_id),
u(u),
@@ -59,7 +57,9 @@ struct EdgeBasedNode
reverse_offset(reverse_offset),
packed_geometry_id(packed_geometry_id),
fwd_segment_position(fwd_segment_position),
- is_in_tiny_cc(belongs_to_tiny_component)
+ is_in_tiny_cc(belongs_to_tiny_component),
+ forward_travel_mode(forward_travel_mode),
+ backward_travel_mode(backward_travel_mode)
{
BOOST_ASSERT((forward_edge_based_node_id != SPECIAL_NODEID) ||
(reverse_edge_based_node_id != SPECIAL_NODEID));
@@ -79,8 +79,6 @@ struct EdgeBasedNode
return packed_geometry_id != SPECIAL_EDGEID;
}
- unsigned forward_way_id;
- unsigned reverse_way_id;
NodeID forward_edge_based_node_id; // needed for edge-expanded graph
NodeID reverse_edge_based_node_id; // needed for edge-expanded graph
NodeID u; // indices into the coordinates array
@@ -93,6 +91,8 @@ struct EdgeBasedNode
unsigned packed_geometry_id; // if set, then the edge represents a packed geometry
unsigned short fwd_segment_position; // segment id in a compressed geometry
bool is_in_tiny_cc;
+ TravelMode forward_travel_mode : 4;
+ TravelMode backward_travel_mode : 4;
};
#endif //EDGE_BASED_NODE_H
diff --git a/3party/osrm/osrm-backend/DataStructures/EdgeBasedNodeData.h b/3party/osrm/osrm-backend/DataStructures/EdgeBasedNodeData.h
deleted file mode 100644
index dbcadfe01b..0000000000
--- a/3party/osrm/osrm-backend/DataStructures/EdgeBasedNodeData.h
+++ /dev/null
@@ -1,123 +0,0 @@
-#pragma once
-
-#include <stdint.h>
-#include <vector>
-#include <fstream>
-
-
-namespace osrm
-{
-
-struct NodeData
-{
-#pragma pack (push, 1)
- struct SegmentInfo
- {
- uint64_t wayId;
- double lat1, lon1, lat2, lon2;
-
- SegmentInfo()
- : wayId(-1), lat1(-10000), lon1(-10000), lat2(-10000), lon2(-10000)
- {
- }
-
- SegmentInfo(uint64_t wayId, double lat1, double lon1, double lat2, double lon2)
- : wayId(wayId), lat1(lat1), lon1(lon1), lat2(lat2), lon2(lon2)
- {
- }
-
- bool operator != (SegmentInfo const & other) const
- {
- return wayId != other.wayId || lat1 != other.lat1 || lon1 != other.lon1 ||
- lat2 != other.lat2 || lon2 != other.lon2;
- }
- };
-#pragma pack (pop)
-
- typedef std::vector<SegmentInfo> SegmentInfoVectorT;
- SegmentInfoVectorT m_segments;
-
- NodeData()
- {
- }
-
- NodeData(SegmentInfoVectorT & vec)
- {
- m_segments.swap(vec);
- }
-
- bool operator == (NodeData const & other) const
- {
- if (m_segments.size() != other.m_segments.size())
- return false;
-
- for (uint32_t i = 0; i < m_segments.size(); ++i)
- if (m_segments[i] != other.m_segments[i])
- return false;
-
- return true;
- }
-
- bool operator != (NodeData const & other) const
- {
- return !(*this == other);
- }
-
- void AddSegment(uint64_t wayId, double lat1, double lon1, double lat2, double lon2)
- {
- m_segments.emplace_back(wayId, lat1, lon1, lat2, lon2);
- }
-
- void SetSegments(SegmentInfoVectorT & segments)
- {
- m_segments.swap(segments);
- }
-};
-
-
-typedef std::vector<NodeData> NodeDataVectorT;
-
-inline bool SaveNodeDataToFile(std::string const & filename, NodeDataVectorT const & data)
-{
- std::ofstream stream;
- stream.open(filename);
- if (!stream.is_open())
- return false;
-
- uint32_t count = data.size();
- stream.write((char*)&count, sizeof(count));
- for (auto d : data)
- {
- uint32_t pc = d.m_segments.size();
- stream.write((char*)&pc, sizeof(pc));
- stream.write((char*)d.m_segments.data(), sizeof(NodeData::SegmentInfo) * pc);
- }
- stream.close();
- return true;
-}
-
-inline bool LoadNodeDataFromFile(std::string const & filename, NodeDataVectorT & data)
-{
- std::ifstream stream;
- stream.open(filename);
- if (!stream.is_open())
- return false;
-
- uint32_t count = 0;
- stream.read((char*)&count, sizeof(count));
- for (uint32_t i = 0; i < count; ++i)
- {
- uint32_t pc;
- stream.read((char*)&pc, sizeof(pc));
- NodeData::SegmentInfoVectorT segments;
- segments.resize(pc);
- stream.read((char*)segments.data(), sizeof(NodeData::SegmentInfo) * pc);
-
- data.emplace_back(segments);
- }
- stream.close();
-
- return true;
-}
-
-}
diff --git a/3party/osrm/osrm-backend/DataStructures/FixedPointNumber.h b/3party/osrm/osrm-backend/DataStructures/FixedPointNumber.h
new file mode 100644
index 0000000000..77de365aa2
--- /dev/null
+++ b/3party/osrm/osrm-backend/DataStructures/FixedPointNumber.h
@@ -0,0 +1,216 @@
+/*
+
+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 OSRM_FIXED_POINT_NUMBER_H
+#define OSRM_FIXED_POINT_NUMBER_H
+
+#include <cmath>
+#include <cstdint>
+
+#include <iostream>
+#include <limits>
+#include <type_traits>
+#include <utility>
+
+namespace osrm
+{
+
+// implements an binary based fixed point number type
+template <unsigned FractionalBitSize,
+ bool use_64_bits = false,
+ bool is_unsigned = false,
+ bool truncate_results = false>
+class FixedPointNumber
+{
+ static_assert(FractionalBitSize > 0, "FractionalBitSize must be greater than 0");
+ static_assert(FractionalBitSize <= 32, "FractionalBitSize must at most 32");
+
+ typename std::conditional<use_64_bits, int64_t, int32_t>::type m_fixed_point_state;
+ constexpr static const decltype(m_fixed_point_state) PRECISION = 1 << FractionalBitSize;
+
+ // state signage encapsulates whether the state should either represent a
+ // signed or an unsigned floating point number
+ using state_signage =
+ typename std::conditional<is_unsigned,
+ typename std::make_unsigned<decltype(m_fixed_point_state)>::type,
+ decltype(m_fixed_point_state)>::type;
+
+ public:
+ FixedPointNumber() : m_fixed_point_state(0) {}
+
+ // the type is either initialized with a floating point value or an
+ // integral state. Anything else will throw at compile-time.
+ template <class T>
+ constexpr FixedPointNumber(const T &&input) noexcept
+ : m_fixed_point_state(static_cast<decltype(m_fixed_point_state)>(
+ std::round(std::forward<const T>(input) * PRECISION)))
+ {
+ static_assert(
+ std::is_floating_point<T>::value || std::is_integral<T>::value,
+ "FixedPointNumber needs to be initialized with floating point or integral value");
+ }
+
+ // get max value
+ template <typename T,
+ typename std::enable_if<std::is_floating_point<T>::value>::type * = nullptr>
+ constexpr static auto max() noexcept -> T
+ {
+ return static_cast<T>(std::numeric_limits<state_signage>::max()) / PRECISION;
+ }
+
+ // get min value
+ template <typename T,
+ typename std::enable_if<std::is_floating_point<T>::value>::type * = nullptr>
+ constexpr static auto min() noexcept -> T
+ {
+ return static_cast<T>(1) / PRECISION;
+ }
+
+ // get lowest value
+ template <typename T,
+ typename std::enable_if<std::is_floating_point<T>::value>::type * = nullptr>
+ constexpr static auto lowest() noexcept -> T
+ {
+ return static_cast<T>(std::numeric_limits<state_signage>::min()) / PRECISION;
+ }
+
+ // cast to floating point type T, return value
+ template <typename T,
+ typename std::enable_if<std::is_floating_point<T>::value>::type * = nullptr>
+ explicit operator const T() const noexcept
+ {
+ // casts to external type (signed or unsigned) and then to float
+ return static_cast<T>(static_cast<state_signage>(m_fixed_point_state)) / PRECISION;
+ }
+
+ // warn about cast to integral type T, its disabled for good reason
+ template <typename T, typename std::enable_if<std::is_integral<T>::value>::type * = nullptr>
+ explicit operator T() const
+ {
+ static_assert(std::is_integral<T>::value,
+ "casts to integral types have been disabled on purpose");
+ }
+
+ // compare, ie. sort fixed-point numbers
+ bool operator<(const FixedPointNumber &other) const noexcept
+ {
+ return m_fixed_point_state < other.m_fixed_point_state;
+ }
+
+ // equality, ie. sort fixed-point numbers
+ bool operator==(const FixedPointNumber &other) const noexcept
+ {
+ return m_fixed_point_state == other.m_fixed_point_state;
+ }
+
+ bool operator!=(const FixedPointNumber &other) const { return !(*this == other); }
+ bool operator>(const FixedPointNumber &other) const { return other < *this; }
+ bool operator<=(const FixedPointNumber &other) const { return !(other < *this); }
+ bool operator>=(const FixedPointNumber &other) const { return !(*this < other); }
+
+ // arithmetic operators
+ FixedPointNumber operator+(const FixedPointNumber &other) const noexcept
+ {
+ FixedPointNumber tmp = *this;
+ tmp.m_fixed_point_state += other.m_fixed_point_state;
+ return tmp;
+ }
+
+ FixedPointNumber &operator+=(const FixedPointNumber &other) noexcept
+ {
+ this->m_fixed_point_state += other.m_fixed_point_state;
+ return *this;
+ }
+
+ FixedPointNumber operator-(const FixedPointNumber &other) const noexcept
+ {
+ FixedPointNumber tmp = *this;
+ tmp.m_fixed_point_state -= other.m_fixed_point_state;
+ return tmp;
+ }
+
+ FixedPointNumber &operator-=(const FixedPointNumber &other) noexcept
+ {
+ this->m_fixed_point_state -= other.m_fixed_point_state;
+ return *this;
+ }
+
+ FixedPointNumber operator*(const FixedPointNumber &other) const noexcept
+ {
+ int64_t temp = this->m_fixed_point_state;
+ temp *= other.m_fixed_point_state;
+
+ // rounding!
+ if (!truncate_results)
+ {
+ temp = temp + ((temp & 1 << (FractionalBitSize - 1)) << 1);
+ }
+ temp >>= FractionalBitSize;
+ FixedPointNumber tmp;
+ tmp.m_fixed_point_state = static_cast<decltype(m_fixed_point_state)>(temp);
+ return tmp;
+ }
+
+ FixedPointNumber &operator*=(const FixedPointNumber &other) noexcept
+ {
+ int64_t temp = this->m_fixed_point_state;
+ temp *= other.m_fixed_point_state;
+
+ // rounding!
+ if (!truncate_results)
+ {
+ temp = temp + ((temp & 1 << (FractionalBitSize - 1)) << 1);
+ }
+ temp >>= FractionalBitSize;
+ this->m_fixed_point_state = static_cast<decltype(m_fixed_point_state)>(temp);
+ return *this;
+ }
+
+ FixedPointNumber operator/(const FixedPointNumber &other) const noexcept
+ {
+ int64_t temp = this->m_fixed_point_state;
+ temp <<= FractionalBitSize;
+ temp /= static_cast<int64_t>(other.m_fixed_point_state);
+ FixedPointNumber tmp;
+ tmp.m_fixed_point_state = static_cast<decltype(m_fixed_point_state)>(temp);
+ return tmp;
+ }
+
+ FixedPointNumber &operator/=(const FixedPointNumber &other) noexcept
+ {
+ int64_t temp = this->m_fixed_point_state;
+ temp <<= FractionalBitSize;
+ temp /= static_cast<int64_t>(other.m_fixed_point_state);
+ FixedPointNumber tmp;
+ this->m_fixed_point_state = static_cast<decltype(m_fixed_point_state)>(temp);
+ return *this;
+ }
+};
+
+static_assert(4 == sizeof(FixedPointNumber<1>), "FP19 has wrong size != 4");
+}
+#endif // OSRM_FIXED_POINT_NUMBER_H
diff --git a/3party/osrm/osrm-backend/DataStructures/HashTable.h b/3party/osrm/osrm-backend/DataStructures/HashTable.h
index 199c6df86c..8ff4688363 100644
--- a/3party/osrm/osrm-backend/DataStructures/HashTable.h
+++ b/3party/osrm/osrm-backend/DataStructures/HashTable.h
@@ -34,7 +34,7 @@ template <typename Key, typename Value>
class HashTable
{
private:
- typedef std::pair<Key, Value> KeyValPair;
+ using KeyValPair = std::pair<Key, Value>;
std::vector<KeyValPair> table;
public:
diff --git a/3party/osrm/osrm-backend/DataStructures/ImportEdge.cpp b/3party/osrm/osrm-backend/DataStructures/ImportEdge.cpp
index f0716bf7b5..b59d6149c6 100644
--- a/3party/osrm/osrm-backend/DataStructures/ImportEdge.cpp
+++ b/3party/osrm/osrm-backend/DataStructures/ImportEdge.cpp
@@ -46,24 +46,21 @@ bool NodeBasedEdge::operator<(const NodeBasedEdge &other) const
return source < other.source;
}
-NodeBasedEdge::NodeBasedEdge(unsigned way_id,
- NodeID source,
+NodeBasedEdge::NodeBasedEdge(NodeID source,
NodeID target,
NodeID name_id,
EdgeWeight weight,
bool forward,
bool backward,
- short type,
bool roundabout,
bool in_tiny_cc,
bool access_restricted,
- bool contra_flow,
+ TravelMode travel_mode,
bool is_split)
- : way_id(way_id), source(source), target(target), name_id(name_id), weight(weight), type(type),
+ : source(source), target(target), name_id(name_id), weight(weight),
forward(forward), backward(backward), roundabout(roundabout), in_tiny_cc(in_tiny_cc),
- access_restricted(access_restricted), contra_flow(contra_flow), is_split(is_split)
+ access_restricted(access_restricted), is_split(is_split), travel_mode(travel_mode)
{
- BOOST_ASSERT_MSG(type > 0, "negative edge type");
}
bool EdgeBasedEdge::operator<(const EdgeBasedEdge &other) const
diff --git a/3party/osrm/osrm-backend/DataStructures/ImportEdge.h b/3party/osrm/osrm-backend/DataStructures/ImportEdge.h
index 1ebde38493..4ccbee6d91 100644
--- a/3party/osrm/osrm-backend/DataStructures/ImportEdge.h
+++ b/3party/osrm/osrm-backend/DataStructures/ImportEdge.h
@@ -28,39 +28,36 @@ SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
#ifndef IMPORT_EDGE_H
#define IMPORT_EDGE_H
+#include "../DataStructures/TravelMode.h"
#include "../typedefs.h"
struct NodeBasedEdge
{
bool operator<(const NodeBasedEdge &e) const;
- explicit NodeBasedEdge(unsigned way_id,
- NodeID source,
+ explicit NodeBasedEdge(NodeID source,
NodeID target,
NodeID name_id,
EdgeWeight weight,
bool forward,
bool backward,
- short type,
bool roundabout,
bool in_tiny_cc,
bool access_restricted,
- bool contra_flow,
+ TravelMode travel_mode,
bool is_split);
- unsigned way_id;
NodeID source;
NodeID target;
NodeID name_id;
EdgeWeight weight;
- short type;
bool forward : 1;
bool backward : 1;
bool roundabout : 1;
bool in_tiny_cc : 1;
bool access_restricted : 1;
- bool contra_flow : 1;
bool is_split : 1;
+ TravelMode travel_mode : 4;
NodeBasedEdge() = delete;
};
@@ -89,6 +86,6 @@ struct EdgeBasedEdge
bool backward : 1;
};
-typedef NodeBasedEdge ImportEdge;
+using ImportEdge = NodeBasedEdge;
#endif /* IMPORT_EDGE_H */
diff --git a/3party/osrm/osrm-backend/DataStructures/JSONContainer.h b/3party/osrm/osrm-backend/DataStructures/JSONContainer.h
index 47dc34b279..350441d12b 100644
--- a/3party/osrm/osrm-backend/DataStructures/JSONContainer.h
+++ b/3party/osrm/osrm-backend/DataStructures/JSONContainer.h
@@ -25,14 +25,14 @@ SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
*/
-// based on https://svn.apache.org/repos/asf/mesos/tags/release-0.9.0-incubating-RC0/src/common/json.hpp
+// based on
+// https://svn.apache.org/repos/asf/mesos/tags/release-0.9.0-incubating-RC0/src/common/json.hpp
#ifndef JSON_CONTAINER_H
#define JSON_CONTAINER_H
-#include "../Util/StringUtil.h"
-
-#include <boost/variant.hpp>
+#include "../ThirdParty/variant/variant.hpp"
+#include "../Util/cast.hpp"
#include <iostream>
#include <vector>
@@ -42,21 +42,8 @@ SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
namespace JSON
{
-struct String;
-struct Number;
struct Object;
struct Array;
-struct True;
-struct False;
-struct Null;
-
-typedef boost::variant<boost::recursive_wrapper<String>,
- boost::recursive_wrapper<Number>,
- boost::recursive_wrapper<Object>,
- boost::recursive_wrapper<Array>,
- boost::recursive_wrapper<True>,
- boost::recursive_wrapper<False>,
- boost::recursive_wrapper<Null> > Value;
struct String
{
@@ -73,31 +60,39 @@ struct Number
double value;
};
-struct Object
+struct True
{
- std::unordered_map<std::string, Value> values;
};
-struct Array
+struct False
{
- std::vector<Value> values;
};
-struct True
+struct Null
{
};
-struct False
+using Value = mapbox::util::variant<String,
+ Number,
+ mapbox::util::recursive_wrapper<Object>,
+ mapbox::util::recursive_wrapper<Array>,
+ True,
+ False,
+ Null>;
+
+struct Object
{
+ std::unordered_map<std::string, Value> values;
};
-struct Null
+struct Array
{
+ std::vector<Value> values;
};
-struct Renderer : boost::static_visitor<>
+struct Renderer : mapbox::util::static_visitor<>
{
- Renderer(std::ostream &_out) : out(_out) {}
+ explicit Renderer(std::ostream &_out) : out(_out) {}
void operator()(const String &string) const { out << "\"" << string.value << "\""; }
@@ -114,7 +109,7 @@ struct Renderer : boost::static_visitor<>
while (iterator != object.values.end())
{
out << "\"" << (*iterator).first << "\":";
- boost::apply_visitor(Renderer(out), (*iterator).second);
+ mapbox::util::apply_visitor(Renderer(out), (*iterator).second);
if (++iterator != object.values.end())
{
out << ",";
@@ -130,7 +125,7 @@ struct Renderer : boost::static_visitor<>
iterator = array.values.begin();
while (iterator != array.values.end())
{
- boost::apply_visitor(Renderer(out), *iterator);
+ mapbox::util::apply_visitor(Renderer(out), *iterator);
if (++iterator != array.values.end())
{
out << ",";
@@ -149,11 +144,12 @@ struct Renderer : boost::static_visitor<>
std::ostream &out;
};
-struct ArrayRenderer : boost::static_visitor<>
+struct ArrayRenderer : mapbox::util::static_visitor<>
{
- ArrayRenderer(std::vector<char> &_out) : out(_out) {}
+ explicit ArrayRenderer(std::vector<char> &_out) : out(_out) {}
- void operator()(const String &string) const {
+ void operator()(const String &string) const
+ {
out.push_back('\"');
out.insert(out.end(), string.value.begin(), string.value.end());
out.push_back('\"');
@@ -161,7 +157,7 @@ struct ArrayRenderer : boost::static_visitor<>
void operator()(const Number &number) const
{
- const std::string number_string = FixedDoubleToString(number.value);
+ const std::string number_string = cast::double_fixed_to_string(number.value);
out.insert(out.end(), number_string.begin(), number_string.end());
}
@@ -176,7 +172,7 @@ struct ArrayRenderer : boost::static_visitor<>
out.push_back('\"');
out.push_back(':');
- boost::apply_visitor(ArrayRenderer(out), (*iterator).second);
+ mapbox::util::apply_visitor(ArrayRenderer(out), (*iterator).second);
if (++iterator != object.values.end())
{
out.push_back(',');
@@ -192,7 +188,7 @@ struct ArrayRenderer : boost::static_visitor<>
iterator = array.values.begin();
while (iterator != array.values.end())
{
- boost::apply_visitor(ArrayRenderer(out), *iterator);
+ mapbox::util::apply_visitor(ArrayRenderer(out), *iterator);
if (++iterator != array.values.end())
{
out.push_back(',');
@@ -201,17 +197,20 @@ struct ArrayRenderer : boost::static_visitor<>
out.push_back(']');
}
- void operator()(const True &) const {
+ void operator()(const True &) const
+ {
const std::string temp("true");
out.insert(out.end(), temp.begin(), temp.end());
}
- void operator()(const False &) const {
+ void operator()(const False &) const
+ {
const std::string temp("false");
out.insert(out.end(), temp.begin(), temp.end());
}
- void operator()(const Null &) const {
+ void operator()(const Null &) const
+ {
const std::string temp("null");
out.insert(out.end(), temp.begin(), temp.end());
}
@@ -223,13 +222,13 @@ struct ArrayRenderer : boost::static_visitor<>
inline void render(std::ostream &out, const Object &object)
{
Value value = object;
- boost::apply_visitor(Renderer(out), value);
+ mapbox::util::apply_visitor(Renderer(out), value);
}
inline void render(std::vector<char> &out, const Object &object)
{
Value value = object;
- boost::apply_visitor(ArrayRenderer(out), value);
+ mapbox::util::apply_visitor(ArrayRenderer(out), value);
}
} // namespace JSON
diff --git a/3party/osrm/osrm-backend/DataStructures/NodeBasedGraph.h b/3party/osrm/osrm-backend/DataStructures/NodeBasedGraph.h
index c9f34196a9..cceb4a0786 100644
--- a/3party/osrm/osrm-backend/DataStructures/NodeBasedGraph.h
+++ b/3party/osrm/osrm-backend/DataStructures/NodeBasedGraph.h
@@ -1,9 +1,9 @@
-#ifndef __NODE_BASED_GRAPH_H__
-#define __NODE_BASED_GRAPH_H__
+#ifndef NODE_BASED_GRAPH_H_
+#define NODE_BASED_GRAPH_H_
#include "DynamicGraph.h"
#include "ImportEdge.h"
-#include "../Util/SimpleLogger.h"
+#include "../Util/simple_logger.hpp"
#include <tbb/parallel_sort.h>
@@ -12,25 +12,23 @@
struct NodeBasedEdgeData
{
NodeBasedEdgeData()
- : way_id(-1), distance(INVALID_EDGE_WEIGHT), edgeBasedNodeID(SPECIAL_NODEID),
- nameID(std::numeric_limits<unsigned>::max()), type(std::numeric_limits<short>::max()),
+ : distance(INVALID_EDGE_WEIGHT), edgeBasedNodeID(SPECIAL_NODEID),
+ nameID(std::numeric_limits<unsigned>::max()),
isAccessRestricted(false), shortcut(false), forward(false), backward(false),
- roundabout(false), ignore_in_grid(false), contraFlow(false)
+ roundabout(false), ignore_in_grid(false), travel_mode(TRAVEL_MODE_INACCESSIBLE)
{
}
- unsigned way_id;
int distance;
unsigned edgeBasedNodeID;
unsigned nameID;
- short type;
bool isAccessRestricted : 1;
bool shortcut : 1;
bool forward : 1;
bool backward : 1;
bool roundabout : 1;
bool ignore_in_grid : 1;
- bool contraFlow : 1;
+ TravelMode travel_mode : 4;
void SwapDirectionFlags()
{
@@ -43,7 +41,7 @@ struct NodeBasedEdgeData
{
return (forward == other.forward) && (backward == other.backward) &&
(nameID == other.nameID) && (ignore_in_grid == other.ignore_in_grid) &&
- (contraFlow == other.contraFlow);
+ (travel_mode == other.travel_mode);
}
};
@@ -53,14 +51,14 @@ struct SimpleEdgeData
EdgeWeight capacity;
};
-typedef DynamicGraph<NodeBasedEdgeData> NodeBasedDynamicGraph;
-typedef DynamicGraph<SimpleEdgeData> SimpleNodeBasedDynamicGraph;
+using NodeBasedDynamicGraph = DynamicGraph<NodeBasedEdgeData>;
+using SimpleNodeBasedDynamicGraph = DynamicGraph<SimpleEdgeData>;
// Factory method to create NodeBasedDynamicGraph from ImportEdges
inline std::shared_ptr<NodeBasedDynamicGraph>
NodeBasedDynamicGraphFromImportEdges(int number_of_nodes, std::vector<ImportEdge> &input_edge_list)
{
- static_assert(sizeof(NodeBasedEdgeData) == 20, "changing node based edge data size changes memory consumption");
+ static_assert(sizeof(NodeBasedEdgeData) == 16, "changing node based edge data size changes memory consumption");
DeallocatingVector<NodeBasedDynamicGraph::InputEdge> edges_list;
NodeBasedDynamicGraph::InputEdge edge;
@@ -81,8 +79,6 @@ NodeBasedDynamicGraphFromImportEdges(int number_of_nodes, std::vector<ImportEdge
edge.data.forward = import_edge.backward;
}
- edge.data.way_id = import_edge.way_id;
-
if (edge.source == edge.target)
{
continue;
@@ -94,9 +90,9 @@ NodeBasedDynamicGraphFromImportEdges(int number_of_nodes, std::vector<ImportEdge
edge.data.roundabout = import_edge.roundabout;
edge.data.ignore_in_grid = import_edge.in_tiny_cc;
edge.data.nameID = import_edge.name_id;
- edge.data.type = import_edge.type;
edge.data.isAccessRestricted = import_edge.access_restricted;
- edge.data.contraFlow = import_edge.contra_flow;
+ edge.data.travel_mode = import_edge.travel_mode;
+
edges_list.push_back(edge);
if (!import_edge.is_split)
@@ -168,7 +164,7 @@ NodeBasedDynamicGraphFromImportEdges(int number_of_nodes, std::vector<ImportEdge
edges_list.resize(edge_count);
SimpleLogger().Write() << "merged " << edges_list.size() - edge_count << " edges out of " << edges_list.size();
- auto graph = std::make_shared<NodeBasedDynamicGraph>(number_of_nodes, edges_list);
+ auto graph = std::make_shared<NodeBasedDynamicGraph>(static_cast<NodeBasedDynamicGraph::NodeIterator>(number_of_nodes), edges_list);
return graph;
}
@@ -176,7 +172,7 @@ template<class SimpleEdgeT>
inline std::shared_ptr<SimpleNodeBasedDynamicGraph>
SimpleNodeBasedDynamicGraphFromEdges(int number_of_nodes, std::vector<SimpleEdgeT> &input_edge_list)
{
- static_assert(sizeof(NodeBasedEdgeData) == 20, "changing node based edge data size changes memory consumption");
+ static_assert(sizeof(NodeBasedEdgeData) == 16, "changing node based edge data size changes memory consumption");
tbb::parallel_sort(input_edge_list.begin(), input_edge_list.end());
DeallocatingVector<SimpleNodeBasedDynamicGraph::InputEdge> edges_list;
@@ -245,4 +241,4 @@ SimpleNodeBasedDynamicGraphFromEdges(int number_of_nodes, std::vector<SimpleEdge
return graph;
}
-#endif // __NODE_BASED_GRAPH_H__
+#endif // NODE_BASED_GRAPH_H_
diff --git a/3party/osrm/osrm-backend/DataStructures/OriginalEdgeData.h b/3party/osrm/osrm-backend/DataStructures/OriginalEdgeData.h
index f75aeda5c1..3d7c543301 100644
--- a/3party/osrm/osrm-backend/DataStructures/OriginalEdgeData.h
+++ b/3party/osrm/osrm-backend/DataStructures/OriginalEdgeData.h
@@ -29,6 +29,7 @@ SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
#define ORIGINAL_EDGE_DATA_H
#include "TurnInstructions.h"
+#include "../DataStructures/TravelMode.h"
#include "../typedefs.h"
#include <limits>
@@ -38,16 +39,18 @@ struct OriginalEdgeData
explicit OriginalEdgeData(NodeID via_node,
unsigned name_id,
TurnInstruction turn_instruction,
- bool compressed_geometry)
+ bool compressed_geometry,
+ TravelMode travel_mode)
: via_node(via_node), name_id(name_id), turn_instruction(turn_instruction),
- compressed_geometry(compressed_geometry)
+ compressed_geometry(compressed_geometry), travel_mode(travel_mode)
{
}
OriginalEdgeData()
: via_node(std::numeric_limits<unsigned>::max()),
name_id(std::numeric_limits<unsigned>::max()),
- turn_instruction(TurnInstruction::NoTurn), compressed_geometry(false)
+ turn_instruction(TurnInstruction::NoTurn), compressed_geometry(false),
+ travel_mode(TRAVEL_MODE_INACCESSIBLE)
{
}
@@ -55,6 +58,7 @@ struct OriginalEdgeData
unsigned name_id;
TurnInstruction turn_instruction;
bool compressed_geometry;
+ TravelMode travel_mode;
};
#endif // ORIGINAL_EDGE_DATA_H
diff --git a/3party/osrm/osrm-backend/DataStructures/PhantomNodes.h b/3party/osrm/osrm-backend/DataStructures/PhantomNodes.h
index 5206ea6abe..7c12790725 100644
--- a/3party/osrm/osrm-backend/DataStructures/PhantomNodes.h
+++ b/3party/osrm/osrm-backend/DataStructures/PhantomNodes.h
@@ -28,8 +28,9 @@ SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
#ifndef PHANTOM_NODES_H
#define PHANTOM_NODES_H
-#include "../Include/osrm/Coordinate.h"
-#include "../Util/SimpleLogger.h"
+#include <osrm/Coordinate.h>
+#include "../DataStructures/TravelMode.h"
+#include "../Util/simple_logger.hpp"
#include "../typedefs.h"
#include <vector>
@@ -39,7 +40,8 @@ struct PhantomNode
PhantomNode(NodeID forward_node_id, NodeID reverse_node_id, unsigned name_id,
int forward_weight, int reverse_weight, int forward_offset, int reverse_offset,
unsigned packed_geometry_id, FixedPointCoordinate &location,
- unsigned short fwd_segment_position) :
+ unsigned short fwd_segment_position,
+ TravelMode forward_travel_mode, TravelMode backward_travel_mode) :
forward_node_id(forward_node_id),
reverse_node_id(reverse_node_id),
name_id(name_id),
@@ -49,7 +51,9 @@ struct PhantomNode
reverse_offset(reverse_offset),
packed_geometry_id(packed_geometry_id),
location(location),
- fwd_segment_position(fwd_segment_position)
+ fwd_segment_position(fwd_segment_position),
+ forward_travel_mode(forward_travel_mode),
+ backward_travel_mode(backward_travel_mode)
{ }
PhantomNode() :
@@ -61,7 +65,9 @@ struct PhantomNode
forward_offset(0),
reverse_offset(0),
packed_geometry_id(SPECIAL_EDGEID),
- fwd_segment_position(0)
+ fwd_segment_position(0),
+ forward_travel_mode(TRAVEL_MODE_INACCESSIBLE),
+ backward_travel_mode(TRAVEL_MODE_INACCESSIBLE)
{ }
NodeID forward_node_id;
@@ -74,6 +80,8 @@ struct PhantomNode
unsigned packed_geometry_id;
FixedPointCoordinate location;
unsigned short fwd_segment_position;
+ TravelMode forward_travel_mode : 4;
+ TravelMode backward_travel_mode : 4;
int GetForwardWeightPlusOffset() const
{
@@ -134,7 +142,7 @@ struct PhantomNode
}
};
-typedef std::vector<std::vector<PhantomNode>> PhantomNodeArray;
+using PhantomNodeArray = std::vector<std::vector<PhantomNode>>;
struct PhantomNodeLists
{
diff --git a/3party/osrm/osrm-backend/DataStructures/QueryNode.h b/3party/osrm/osrm-backend/DataStructures/QueryNode.h
index 1e7ca9eb90..6ebbce46d7 100644
--- a/3party/osrm/osrm-backend/DataStructures/QueryNode.h
+++ b/3party/osrm/osrm-backend/DataStructures/QueryNode.h
@@ -30,7 +30,7 @@ SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
#include "../typedefs.h"
-#include "../Include/osrm/Coordinate.h"
+#include <osrm/Coordinate.h>
#include <boost/assert.hpp>
@@ -38,8 +38,8 @@ SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
struct NodeInfo
{
- typedef NodeID key_type; // type of NodeID
- typedef int value_type; // type of lat,lons
+ using key_type = NodeID; // type of NodeID
+ using value_type = int; // type of lat,lons
explicit NodeInfo(int lat, int lon, NodeID node_id) : lat(lat), lon(lon), node_id(node_id) {}
NodeInfo()
diff --git a/3party/osrm/osrm-backend/DataStructures/Range.h b/3party/osrm/osrm-backend/DataStructures/Range.h
index 2d08fed8a5..7e2461ce73 100644
--- a/3party/osrm/osrm-backend/DataStructures/Range.h
+++ b/3party/osrm/osrm-backend/DataStructures/Range.h
@@ -1,6 +1,6 @@
/*
-Copyright (c) 2013, Project OSRM, Dennis Luxen, others
+Copyright (c) 2013,2014, Project OSRM, Dennis Luxen, others
All rights reserved.
Redistribution and use in source and binary forms, with or without modification,
@@ -49,7 +49,7 @@ template <typename Integer> class range
const range &begin() const { return *this; }
const range &end() const { return *this; }
Integer front() const { return iter; }
- Integer back() const { return last-1; }
+ Integer back() const { return last - 1; }
// Iterator functions
bool operator!=(const range &) const { return iter < last; }
@@ -57,6 +57,7 @@ template <typename Integer> class range
Integer operator*() const { return iter; }
};
+// convenience function to construct an integer range with type deduction
template <typename Integer> range<Integer> irange(Integer first, Integer last)
{
return range<Integer>(first, last);
diff --git a/3party/osrm/osrm-backend/DataStructures/RangeTable.h b/3party/osrm/osrm-backend/DataStructures/RangeTable.h
index 3ac498df21..46333aefb5 100644
--- a/3party/osrm/osrm-backend/DataStructures/RangeTable.h
+++ b/3party/osrm/osrm-backend/DataStructures/RangeTable.h
@@ -1,5 +1,5 @@
-#ifndef __RANGE_TABLE_H__
-#define __RANGE_TABLE_H__
+#ifndef RANGE_TABLE_H_
+#define RANGE_TABLE_H_
#include "Range.h"
#include "SharedMemoryFactory.h"
@@ -36,10 +36,10 @@ class RangeTable
{
public:
- typedef std::array<unsigned char, BLOCK_SIZE> BlockT;
- typedef typename ShM<BlockT, USE_SHARED_MEMORY>::vector BlockContainerT;
- typedef typename ShM<unsigned, USE_SHARED_MEMORY>::vector OffsetContainerT;
- typedef osrm::range<unsigned> RangeT;
+ using BlockT = std::array<unsigned char, BLOCK_SIZE>;
+ using BlockContainerT = typename ShM<BlockT, USE_SHARED_MEMORY>::vector;
+ using OffsetContainerT = typename ShM<unsigned, USE_SHARED_MEMORY>::vector;
+ using RangeT = osrm::range<unsigned>;
friend std::ostream& operator<< <>(std::ostream &out, const RangeTable &table);
friend std::istream& operator>> <>(std::istream &in, RangeTable &table);
@@ -228,4 +228,4 @@ std::istream& operator>>(std::istream &in, RangeTable<BLOCK_SIZE, USE_SHARED_MEM
return in;
}
-#endif
+#endif //RANGE_TABLE_H_
diff --git a/3party/osrm/osrm-backend/DataStructures/RawRouteData.h b/3party/osrm/osrm-backend/DataStructures/RawRouteData.h
index e034b43bc4..d92242e7fa 100644
--- a/3party/osrm/osrm-backend/DataStructures/RawRouteData.h
+++ b/3party/osrm/osrm-backend/DataStructures/RawRouteData.h
@@ -29,6 +29,7 @@ SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
#define RAW_ROUTE_DATA_H
#include "../DataStructures/PhantomNodes.h"
+#include "../DataStructures/TravelMode.h"
#include "../DataStructures/TurnInstructions.h"
#include "../typedefs.h"
@@ -41,18 +42,25 @@ struct PathData
PathData()
: node(SPECIAL_NODEID), name_id(INVALID_EDGE_WEIGHT),
segment_duration(INVALID_EDGE_WEIGHT),
- turn_instruction(TurnInstruction::NoTurn)
+ turn_instruction(TurnInstruction::NoTurn),
+ travel_mode(TRAVEL_MODE_INACCESSIBLE)
{
}
- PathData(NodeID node, unsigned name_id, TurnInstruction turn_instruction, EdgeWeight segment_duration)
- : node(node), name_id(name_id), segment_duration(segment_duration), turn_instruction(turn_instruction)
+ PathData(NodeID node,
+ unsigned name_id,
+ TurnInstruction turn_instruction,
+ EdgeWeight segment_duration,
+ TravelMode travel_mode)
+ : node(node), name_id(name_id), segment_duration(segment_duration), turn_instruction(turn_instruction),
+ travel_mode(travel_mode)
{
}
NodeID node;
unsigned name_id;
EdgeWeight segment_duration;
TurnInstruction turn_instruction;
+ TravelMode travel_mode : 4;
};
struct RawRouteData
@@ -69,6 +77,11 @@ struct RawRouteData
int shortest_path_length;
int alternative_path_length;
+ bool is_via_leg(const std::size_t leg) const
+ {
+ return (leg != unpacked_path_segments.size() - 1);
+ }
+
RawRouteData()
: check_sum(SPECIAL_NODEID),
shortest_path_length(INVALID_EDGE_WEIGHT),
diff --git a/3party/osrm/osrm-backend/DataStructures/Restriction.h b/3party/osrm/osrm-backend/DataStructures/Restriction.h
index 2b166f5152..bda0f01961 100644
--- a/3party/osrm/osrm-backend/DataStructures/Restriction.h
+++ b/3party/osrm/osrm-backend/DataStructures/Restriction.h
@@ -101,7 +101,7 @@ struct InputRestrictionContainer
struct CmpRestrictionContainerByFrom
{
- typedef InputRestrictionContainer value_type;
+ using value_type = InputRestrictionContainer;
inline bool operator()(const InputRestrictionContainer &a, const InputRestrictionContainer &b)
const
{
@@ -113,7 +113,7 @@ struct CmpRestrictionContainerByFrom
struct CmpRestrictionContainerByTo
{
- typedef InputRestrictionContainer value_type;
+ using value_type = InputRestrictionContainer;
inline bool operator()(const InputRestrictionContainer &a, const InputRestrictionContainer &b)
const
{
diff --git a/3party/osrm/osrm-backend/DataStructures/RestrictionMap.cpp b/3party/osrm/osrm-backend/DataStructures/RestrictionMap.cpp
index 1859b8287c..f2c56e0cfd 100644
--- a/3party/osrm/osrm-backend/DataStructures/RestrictionMap.cpp
+++ b/3party/osrm/osrm-backend/DataStructures/RestrictionMap.cpp
@@ -28,8 +28,6 @@ SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
#include "RestrictionMap.h"
#include "NodeBasedGraph.h"
-#include "../Util/SimpleLogger.h"
-
bool RestrictionMap::IsViaNode(const NodeID node) const
{
return m_no_turn_via_node_set.find(node) != m_no_turn_via_node_set.end();
@@ -96,9 +94,8 @@ void RestrictionMap::FixupArrivingTurnRestriction(const NodeID node_u,
std::vector<NodeID> predecessors;
for (const EdgeID current_edge_id : m_graph->GetAdjacentEdgeRange(node_u))
{
- const EdgeData &edge_data = m_graph->GetEdgeData(current_edge_id);
const NodeID target = m_graph->GetTarget(current_edge_id);
- if (edge_data.backward && (node_v != target))
+ if (node_v != target)
{
predecessors.push_back(target);
}
@@ -163,11 +160,11 @@ NodeID RestrictionMap::CheckForEmanatingIsOnlyTurn(const NodeID node_u, const No
return SPECIAL_NODEID;
}
- auto restriction_iter = m_restriction_map.find({node_u, node_v});
+ const auto restriction_iter = m_restriction_map.find({node_u, node_v});
if (restriction_iter != m_restriction_map.end())
{
const unsigned index = restriction_iter->second;
- auto &bucket = m_restriction_bucket_list.at(index);
+ const auto &bucket = m_restriction_bucket_list.at(index);
for (const RestrictionTarget &restriction_target : bucket)
{
if (restriction_target.is_only)
@@ -184,8 +181,6 @@ bool RestrictionMap::CheckIfTurnIsRestricted(const NodeID node_u,
const NodeID node_v,
const NodeID node_w) const
{
- // return false;
-
BOOST_ASSERT(node_u != SPECIAL_NODEID);
BOOST_ASSERT(node_v != SPECIAL_NODEID);
BOOST_ASSERT(node_w != SPECIAL_NODEID);
@@ -195,7 +190,7 @@ bool RestrictionMap::CheckIfTurnIsRestricted(const NodeID node_u,
return false;
}
- auto restriction_iter = m_restriction_map.find({node_u, node_v});
+ const auto restriction_iter = m_restriction_map.find({node_u, node_v});
if (restriction_iter != m_restriction_map.end())
{
const unsigned index = restriction_iter->second;
diff --git a/3party/osrm/osrm-backend/DataStructures/RestrictionMap.h b/3party/osrm/osrm-backend/DataStructures/RestrictionMap.h
index 580d5e3487..3945a3982b 100644
--- a/3party/osrm/osrm-backend/DataStructures/RestrictionMap.h
+++ b/3party/osrm/osrm-backend/DataStructures/RestrictionMap.h
@@ -25,8 +25,8 @@ SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
*/
-#ifndef __RESTRICTION_MAP_H__
-#define __RESTRICTION_MAP_H__
+#ifndef RESTRICTION_MAP_H_
+#define RESTRICTION_MAP_H_
#include <memory>
@@ -110,8 +110,8 @@ class RestrictionMap
private:
bool IsSourceNode(const NodeID node) const;
- typedef std::vector<RestrictionTarget> EmanatingRestrictionsVector;
- typedef NodeBasedDynamicGraph::EdgeData EdgeData;
+ using EmanatingRestrictionsVector = std::vector<RestrictionTarget>;
+ using EdgeData = NodeBasedDynamicGraph::EdgeData;
std::size_t m_count;
std::shared_ptr<NodeBasedDynamicGraph> m_graph;
@@ -123,4 +123,4 @@ class RestrictionMap
std::unordered_set<NodeID> m_no_turn_via_node_set;
};
-#endif
+#endif //RESTRICTION_MAP_H_
diff --git a/3party/osrm/osrm-backend/DataStructures/RouteParameters.cpp b/3party/osrm/osrm-backend/DataStructures/RouteParameters.cpp
index 4357ebd39b..1019a9149e 100644
--- a/3party/osrm/osrm-backend/DataStructures/RouteParameters.cpp
+++ b/3party/osrm/osrm-backend/DataStructures/RouteParameters.cpp
@@ -33,7 +33,7 @@ SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
RouteParameters::RouteParameters()
: zoom_level(18), print_instructions(false), alternate_route(true), geometry(true),
- compression(true), deprecatedAPI(false), uturn_default(false), check_sum(-1)
+ compression(true), deprecatedAPI(false), uturn_default(false), check_sum(-1), num_results(1)
{
}
@@ -45,6 +45,14 @@ void RouteParameters::setZoomLevel(const short level)
}
}
+void RouteParameters::setNumberOfResults(const short number)
+{
+ if (number > 0 && number <= 100)
+ {
+ num_results = number;
+ }
+}
+
void RouteParameters::setAlternateRouteFlag(const bool flag) { alternate_route = flag; }
void RouteParameters::setUTurn(const bool flag)
diff --git a/3party/osrm/osrm-backend/DataStructures/SearchEngineData.h b/3party/osrm/osrm-backend/DataStructures/SearchEngineData.h
index c7446adc80..d5bfb53f92 100644
--- a/3party/osrm/osrm-backend/DataStructures/SearchEngineData.h
+++ b/3party/osrm/osrm-backend/DataStructures/SearchEngineData.h
@@ -28,7 +28,7 @@ SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
#ifndef SEARCH_ENGINE_DATA_H
#define SEARCH_ENGINE_DATA_H
-#include <boost/scoped_ptr.hpp>
+#include <boost/thread/tss.hpp>
#include "../typedefs.h"
#include "BinaryHeap.h"
@@ -41,8 +41,8 @@ struct HeapData
struct SearchEngineData
{
- typedef BinaryHeap<NodeID, NodeID, int, HeapData, UnorderedMapStorage<NodeID, int>> QueryHeap;
- typedef boost::scoped_ptr<QueryHeap> SearchEngineHeapPtr;
+ using QueryHeap = BinaryHeap<NodeID, NodeID, int, HeapData, UnorderedMapStorage<NodeID, int>>;
+ using SearchEngineHeapPtr = boost::thread_specific_ptr<QueryHeap>;
static SearchEngineHeapPtr forwardHeap;
static SearchEngineHeapPtr backwardHeap;
diff --git a/3party/osrm/osrm-backend/DataStructures/SegmentInformation.h b/3party/osrm/osrm-backend/DataStructures/SegmentInformation.h
index f145804491..6e8d683974 100644
--- a/3party/osrm/osrm-backend/DataStructures/SegmentInformation.h
+++ b/3party/osrm/osrm-backend/DataStructures/SegmentInformation.h
@@ -30,6 +30,7 @@ SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
#include "TurnInstructions.h"
+#include "../DataStructures/TravelMode.h"
#include "../typedefs.h"
#include <osrm/Coordinate.h>
@@ -43,8 +44,9 @@ struct SegmentInformation
float length;
short bearing; // more than enough [0..3600] fits into 12 bits
TurnInstruction turn_instruction;
- bool necessary:1;
- bool is_via_location:1;
+ TravelMode travel_mode;
+ bool necessary;
+ bool is_via_location;
explicit SegmentInformation(const FixedPointCoordinate &location,
const NodeID name_id,
@@ -52,9 +54,11 @@ struct SegmentInformation
const float length,
const TurnInstruction turn_instruction,
const bool necessary,
- const bool is_via_location)
+ const bool is_via_location,
+ const TravelMode travel_mode)
: location(location), name_id(name_id), duration(duration), length(length), bearing(0),
- turn_instruction(turn_instruction), necessary(necessary), is_via_location(is_via_location)
+ turn_instruction(turn_instruction), travel_mode(travel_mode), necessary(necessary),
+ is_via_location(is_via_location)
{
}
@@ -62,9 +66,11 @@ struct SegmentInformation
const NodeID name_id,
const EdgeWeight duration,
const float length,
- const TurnInstruction turn_instruction)
+ const TurnInstruction turn_instruction,
+ const TravelMode travel_mode)
: location(location), name_id(name_id), duration(duration), length(length), bearing(0),
- turn_instruction(turn_instruction), necessary(turn_instruction != TurnInstruction::NoTurn), is_via_location(false)
+ turn_instruction(turn_instruction), travel_mode(travel_mode),
+ necessary(turn_instruction != TurnInstruction::NoTurn), is_via_location(false)
{
}
};
diff --git a/3party/osrm/osrm-backend/DataStructures/SharedMemoryFactory.h b/3party/osrm/osrm-backend/DataStructures/SharedMemoryFactory.h
index d3f9d8e321..0b1f0e1c5f 100644
--- a/3party/osrm/osrm-backend/DataStructures/SharedMemoryFactory.h
+++ b/3party/osrm/osrm-backend/DataStructures/SharedMemoryFactory.h
@@ -29,21 +29,21 @@ SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
#define SHARED_MEMORY_FACTORY_H
#include "../Util/OSRMException.h"
-#include "../Util/SimpleLogger.h"
+#include "../Util/simple_logger.hpp"
#include <boost/filesystem.hpp>
#include <boost/filesystem/fstream.hpp>
#include <boost/interprocess/mapped_region.hpp>
-#if !defined(WIN32) && !defined(__ANDROID__)
+#ifndef WIN32
#include <boost/interprocess/xsi_shared_memory.hpp>
#else
#include <boost/interprocess/shared_memory_object.hpp>
#endif
-//#ifdef __linux__
-//#include <sys/ipc.h>
-//#include <sys/shm.h>
-//#endif
+#ifdef __linux__
+#include <sys/ipc.h>
+#include <sys/shm.h>
+#endif
// #include <cstring>
#include <cstdint>
@@ -61,7 +61,7 @@ struct OSRMLockFile
}
};
-#if !defined(WIN32) && !defined(__ANDROID__)
+#ifndef WIN32
class SharedMemory
{
@@ -196,12 +196,14 @@ class SharedMemory
};
#else
// Windows - specific code
-class SharedMemory : boost::noncopyable
+class SharedMemory
{
+ SharedMemory(const SharedMemory&) = delete;
// Remove shared memory on destruction
- class shm_remove : boost::noncopyable
+ class shm_remove
{
private:
+ shm_remove(const shm_remove&) = delete;
char *m_shmid;
bool m_initialized;
@@ -286,7 +288,6 @@ class SharedMemory : boost::noncopyable
private:
static void build_key(int id, char *key)
{
- OSRMLockFile lock_file;
sprintf(key, "%s.%d", "osrm.lock", id);
}
@@ -365,6 +366,6 @@ template <class LockFileT = OSRMLockFile> class SharedMemoryFactory_tmpl
SharedMemoryFactory_tmpl(const SharedMemoryFactory_tmpl &) = delete;
};
-typedef SharedMemoryFactory_tmpl<> SharedMemoryFactory;
+using SharedMemoryFactory = SharedMemoryFactory_tmpl<>;
#endif /* SHARED_MEMORY_POINTER_FACTORY_H */
diff --git a/3party/osrm/osrm-backend/DataStructures/SharedMemoryVectorWrapper.h b/3party/osrm/osrm-backend/DataStructures/SharedMemoryVectorWrapper.h
index fe4baf3385..bcc30a7f2c 100644
--- a/3party/osrm/osrm-backend/DataStructures/SharedMemoryVectorWrapper.h
+++ b/3party/osrm/osrm-backend/DataStructures/SharedMemoryVectorWrapper.h
@@ -28,8 +28,6 @@ SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
#ifndef SHARED_MEMORY_VECTOR_WRAPPER_H
#define SHARED_MEMORY_VECTOR_WRAPPER_H
-#include "../Util/SimpleLogger.h"
-
#include <boost/assert.hpp>
#include <algorithm>
@@ -78,7 +76,7 @@ template <typename DataT> class SharedMemoryWrapper
void swap(SharedMemoryWrapper<DataT> &other)
{
- BOOST_ASSERT_MSG(m_size != 0 || other.size() != 0, "size invalid");
+ // BOOST_ASSERT_MSG(m_size != 0 || other.size() != 0, "size invalid");
std::swap(m_size, other.m_size);
std::swap(m_ptr, other.m_ptr);
}
@@ -121,7 +119,7 @@ template <> class SharedMemoryWrapper<bool>
void swap(SharedMemoryWrapper<bool> &other)
{
- BOOST_ASSERT_MSG(m_size != 0 || other.size() != 0, "size invalid");
+ // BOOST_ASSERT_MSG(m_size != 0 || other.size() != 0, "size invalid");
std::swap(m_size, other.m_size);
std::swap(m_ptr, other.m_ptr);
}
@@ -148,9 +146,9 @@ template <> class SharedMemoryWrapper<bool>
template <typename DataT, bool UseSharedMemory> struct ShM
{
- typedef typename std::conditional<UseSharedMemory,
+ using vector = typename std::conditional<UseSharedMemory,
SharedMemoryWrapper<DataT>,
- std::vector<DataT>>::type vector;
+ std::vector<DataT>>::type;
};
#endif // SHARED_MEMORY_VECTOR_WRAPPER_H
diff --git a/3party/osrm/osrm-backend/DataStructures/StaticGraph.h b/3party/osrm/osrm-backend/DataStructures/StaticGraph.h
index 850017b0e2..456acfe32e 100644
--- a/3party/osrm/osrm-backend/DataStructures/StaticGraph.h
+++ b/3party/osrm/osrm-backend/DataStructures/StaticGraph.h
@@ -31,11 +31,12 @@ SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
#include "Percent.h"
#include "Range.h"
#include "SharedMemoryVectorWrapper.h"
-#include "../Util/SimpleLogger.h"
#include "../typedefs.h"
#include <boost/assert.hpp>
+#include <tbb/parallel_sort.h>
+
#include <algorithm>
#include <limits>
#include <utility>
@@ -44,10 +45,10 @@ SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
template <typename EdgeDataT, bool UseSharedMemory = false> class StaticGraph
{
public:
- typedef NodeID NodeIterator;
- typedef NodeID EdgeIterator;
- typedef EdgeDataT EdgeData;
- typedef osrm::range<EdgeIterator> EdgeRange;
+ using NodeIterator = NodeID;
+ using EdgeIterator = NodeID;
+ using EdgeData = EdgeDataT;
+ using EdgeRange = osrm::range<EdgeIterator>;
class InputEdge
{
@@ -87,7 +88,7 @@ template <typename EdgeDataT, bool UseSharedMemory = false> class StaticGraph
StaticGraph(const int nodes, std::vector<InputEdge> &graph)
{
- std::sort(graph.begin(), graph.end());
+ tbb::parallel_sort(graph.begin(), graph.end());
number_of_nodes = nodes;
number_of_edges = (EdgeIterator)graph.size();
node_array.resize(number_of_nodes + 1);
@@ -121,8 +122,8 @@ template <typename EdgeDataT, bool UseSharedMemory = false> class StaticGraph
StaticGraph(typename ShM<NodeArrayEntry, UseSharedMemory>::vector &nodes,
typename ShM<EdgeArrayEntry, UseSharedMemory>::vector &edges)
{
- number_of_nodes = nodes.size() - 1;
- number_of_edges = edges.size();
+ number_of_nodes = static_cast<decltype(number_of_nodes)>(nodes.size() - 1);
+ number_of_edges = static_cast<decltype(number_of_edges)>(edges.size());
node_array.swap(nodes);
edge_array.swap(edges);
diff --git a/3party/osrm/osrm-backend/DataStructures/StaticKDTree.h b/3party/osrm/osrm-backend/DataStructures/StaticKDTree.h
index e36eee97a7..4e93884472 100644
--- a/3party/osrm/osrm-backend/DataStructures/StaticKDTree.h
+++ b/3party/osrm/osrm-backend/DataStructures/StaticKDTree.h
@@ -211,7 +211,7 @@ class StaticKDTree
}
private:
- typedef unsigned Iterator;
+ using Iterator = unsigned;
struct Tree
{
Iterator left;
diff --git a/3party/osrm/osrm-backend/DataStructures/StaticRTree.h b/3party/osrm/osrm-backend/DataStructures/StaticRTree.h
index 3009f962df..6e09b4347d 100644
--- a/3party/osrm/osrm-backend/DataStructures/StaticRTree.h
+++ b/3party/osrm/osrm-backend/DataStructures/StaticRTree.h
@@ -35,10 +35,11 @@ SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
#include "SharedMemoryFactory.h"
#include "SharedMemoryVectorWrapper.h"
+#include "../ThirdParty/variant/variant.hpp"
+#include "../Util/floating_point.hpp"
#include "../Util/MercatorUtil.h"
-#include "../Util/NumericUtil.h"
#include "../Util/OSRMException.h"
-#include "../Util/SimpleLogger.h"
+#include "../Util/simple_logger.hpp"
#include "../Util/TimingUtil.h"
#include "../typedefs.h"
@@ -48,7 +49,9 @@ SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
#include <boost/filesystem.hpp>
#include <boost/filesystem/fstream.hpp>
#include <boost/thread.hpp>
-#include <boost/variant.hpp>
+
+#include <tbb/parallel_for.h>
+#include <tbb/parallel_sort.h>
#include <algorithm>
#include <array>
@@ -67,7 +70,6 @@ template <class EdgeDataT,
class StaticRTree
{
public:
-
struct RectangleInt2D
{
RectangleInt2D() : min_lon(INT_MAX), max_lon(INT_MIN), min_lat(INT_MAX), max_lat(INT_MIN) {}
@@ -252,7 +254,7 @@ class StaticRTree
}
};
- typedef RectangleInt2D RectangleT;
+ using RectangleT = RectangleInt2D;
struct TreeNode
{
@@ -305,7 +307,7 @@ class StaticRTree
}
};
- typedef boost::variant<TreeNode, EdgeDataT> IncrementalQueryNodeType;
+ using IncrementalQueryNodeType = mapbox::util::variant<TreeNode, EdgeDataT>;
struct IncrementalQueryCandidate
{
explicit IncrementalQueryCandidate(const float dist, const IncrementalQueryNodeType &node)
@@ -321,23 +323,8 @@ class StaticRTree
return other.min_dist < min_dist;
}
- inline bool RepresentsTreeNode() const
- {
- return boost::apply_visitor(decide_type_visitor(), node);
- }
-
float min_dist;
IncrementalQueryNodeType node;
-
- private:
- class decide_type_visitor : public boost::static_visitor<bool>
- {
- public:
- bool operator()(const TreeNode &) const { return true; }
-
- template<typename AnotherType>
- bool operator()(const AnotherType &) const { return false; }
- };
};
typename ShM<TreeNode, UseSharedMemory>::vector m_search_tree;
@@ -366,33 +353,39 @@ class StaticRTree
HilbertCode get_hilbert_number;
- // generate auxiliary vector of hilbert-valuesß∫
- for (uint64_t element_counter = 0; element_counter != m_element_count; ++element_counter)
- {
- WrappedInputElement &current_wrapper = input_wrapper_vector[element_counter];
- current_wrapper.m_array_index = element_counter;
-
- EdgeDataT const &current_element = input_data_vector[element_counter];
+ // generate auxiliary vector of hilbert-values
+ tbb::parallel_for(
+ tbb::blocked_range<uint64_t>(0, m_element_count),
+ [&input_data_vector, &input_wrapper_vector, &get_hilbert_number, &coordinate_list](
+ const tbb::blocked_range<uint64_t> &range)
+ {
+ for (uint64_t element_counter = range.begin(); element_counter != range.end();
+ ++element_counter)
+ {
+ WrappedInputElement &current_wrapper = input_wrapper_vector[element_counter];
+ current_wrapper.m_array_index = element_counter;
- // Get Hilbert-Value for centroid in mercartor projection
- FixedPointCoordinate current_centroid = EdgeDataT::Centroid(
- FixedPointCoordinate(coordinate_list.at(current_element.u).lat,
- coordinate_list.at(current_element.u).lon),
- FixedPointCoordinate(coordinate_list.at(current_element.v).lat,
- coordinate_list.at(current_element.v).lon));
- current_centroid.lat =
- COORDINATE_PRECISION * lat2y(current_centroid.lat / COORDINATE_PRECISION);
+ EdgeDataT const &current_element = input_data_vector[element_counter];
- current_wrapper.m_hilbert_value = get_hilbert_number(current_centroid);
- }
+ // Get Hilbert-Value for centroid in mercartor projection
+ FixedPointCoordinate current_centroid = EdgeDataT::Centroid(
+ FixedPointCoordinate(coordinate_list.at(current_element.u).lat,
+ coordinate_list.at(current_element.u).lon),
+ FixedPointCoordinate(coordinate_list.at(current_element.v).lat,
+ coordinate_list.at(current_element.v).lon));
+ current_centroid.lat =
+ COORDINATE_PRECISION * lat2y(current_centroid.lat / COORDINATE_PRECISION);
+ current_wrapper.m_hilbert_value = get_hilbert_number(current_centroid);
+ }
+ });
// open leaf file
boost::filesystem::ofstream leaf_node_file(leaf_node_filename, std::ios::binary);
leaf_node_file.write((char *)&m_element_count, sizeof(uint64_t));
// sort the hilbert-value representatives
- sort(input_wrapper_vector.begin(), input_wrapper_vector.end());
+ tbb::parallel_sort(input_wrapper_vector.begin(), input_wrapper_vector.end());
std::vector<TreeNode> tree_nodes_in_level;
// pack M elements into leaf node and write to leaf file
@@ -472,18 +465,22 @@ class StaticRTree
// reverse and renumber tree to have root at index 0
std::reverse(m_search_tree.begin(), m_search_tree.end());
+
uint32_t search_tree_size = m_search_tree.size();
- for (uint32_t i = 0; i != search_tree_size; ++i)
- {
- TreeNode &current_tree_node = this->m_search_tree[i];
- for (uint32_t j = 0; j < current_tree_node.child_count; ++j)
+ tbb::parallel_for(tbb::blocked_range<uint32_t>(0, search_tree_size),
+ [this, &search_tree_size](const tbb::blocked_range<uint32_t> &range)
+ {
+ for (uint32_t i = range.begin(); i != range.end(); ++i)
{
- const uint32_t old_id = current_tree_node.children[j];
- const uint32_t new_id = search_tree_size - old_id - 1;
- current_tree_node.children[j] = new_id;
+ TreeNode &current_tree_node = this->m_search_tree[i];
+ for (uint32_t j = 0; j < current_tree_node.child_count; ++j)
+ {
+ const uint32_t old_id = current_tree_node.children[j];
+ const uint32_t new_id = search_tree_size - old_id - 1;
+ current_tree_node.children[j] = new_id;
+ }
}
- }
-
+ });
// open tree file
boost::filesystem::ofstream tree_node_file(tree_node_filename, std::ios::binary);
@@ -688,9 +685,9 @@ class StaticRTree
continue;
}
- if (current_query_node.RepresentsTreeNode())
+ if (current_query_node.node.template is<TreeNode>())
{
- const TreeNode & current_tree_node = boost::get<TreeNode>(current_query_node.node);
+ const TreeNode & current_tree_node = current_query_node.node.template get<TreeNode>();
if (current_tree_node.child_is_on_disk)
{
++loaded_leafs;
@@ -763,7 +760,7 @@ class StaticRTree
{
++inspected_segments;
// inspecting an actual road segment
- const EdgeDataT & current_segment = boost::get<EdgeDataT>(current_query_node.node);
+ const EdgeDataT & current_segment = current_query_node.node.template get<EdgeDataT>();
// don't collect too many results from small components
if (number_of_results_found_in_big_cc == number_of_results && !current_segment.is_in_tiny_cc)
@@ -791,7 +788,7 @@ class StaticRTree
BOOST_ASSERT(0. <= current_perpendicular_distance);
if ((current_perpendicular_distance < current_min_dist) &&
- !EpsilonCompare(current_perpendicular_distance, current_min_dist))
+ !osrm::epsilon_compare(current_perpendicular_distance, current_min_dist))
{
// store phantom node in result vector
result_phantom_node_vector.emplace_back(
@@ -804,7 +801,9 @@ class StaticRTree
current_segment.reverse_offset,
current_segment.packed_geometry_id,
foot_point_coordinate_on_segment,
- current_segment.fwd_segment_position);
+ current_segment.fwd_segment_position,
+ current_segment.forward_travel_mode,
+ current_segment.backward_travel_mode);
// Hack to fix rounding errors and wandering via nodes.
FixUpRoundingIssue(input_coordinate, result_phantom_node_vector.back());
@@ -891,7 +890,7 @@ class StaticRTree
if (current_query_node.RepresentsTreeNode())
{
- const TreeNode & current_tree_node = boost::get<TreeNode>(current_query_node.node);
+ const TreeNode & current_tree_node = current_query_node.node.template get<TreeNode>();
if (current_tree_node.child_is_on_disk)
{
LeafNode current_leaf_node;
@@ -940,7 +939,7 @@ class StaticRTree
{
++inspected_segments;
// inspecting an actual road segment
- const EdgeDataT & current_segment = boost::get<EdgeDataT>(current_query_node.node);
+ const EdgeDataT & current_segment = current_query_node.node.template get<EdgeDataT>();
// don't collect too many results from small components
if (number_of_results_found_in_big_cc == number_of_results && !current_segment.is_in_tiny_cc)
@@ -968,7 +967,7 @@ class StaticRTree
BOOST_ASSERT(0. <= current_perpendicular_distance);
if ((current_perpendicular_distance < current_min_dist) &&
- !EpsilonCompare(current_perpendicular_distance, current_min_dist))
+ !osrm::epsilon_compare(current_perpendicular_distance, current_min_dist))
{
// store phantom node in result vector
result_phantom_node_vector.emplace_back(
@@ -1068,7 +1067,7 @@ class StaticRTree
BOOST_ASSERT(0. <= current_perpendicular_distance);
if ((current_perpendicular_distance < min_dist) &&
- !EpsilonCompare(current_perpendicular_distance, min_dist))
+ !osrm::epsilon_compare(current_perpendicular_distance, min_dist))
{ // found a new minimum
min_dist = current_perpendicular_distance;
result_phantom_node = {current_edge.forward_edge_based_node_id,
@@ -1080,7 +1079,9 @@ class StaticRTree
current_edge.reverse_offset,
current_edge.packed_geometry_id,
nearest,
- current_edge.fwd_segment_position};
+ current_edge.fwd_segment_position,
+ current_edge.forward_travel_mode,
+ current_edge.backward_travel_mode};
nearest_edge = current_edge;
}
}
diff --git a/3party/osrm/osrm-backend/Util/NumericUtil.h b/3party/osrm/osrm-backend/DataStructures/TravelMode.h
index 5853f81869..7ccc24d215 100644
--- a/3party/osrm/osrm-backend/Util/NumericUtil.h
+++ b/3party/osrm/osrm-backend/DataStructures/TravelMode.h
@@ -1,4 +1,5 @@
/*
+
Copyright (c) 2013, Project OSRM, Dennis Luxen, others
All rights reserved.
@@ -24,16 +25,11 @@ SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
*/
-#ifndef __NUMERIC_UTIL_H__
-#define __NUMERIC_UTIL_H__
-
-#include <cstdlib>
-
-#include <limits>
+#ifndef TRAVEL_MODE_H
+#define TRAVEL_MODE_H
-template <typename FloatT> inline bool EpsilonCompare(const FloatT d1, const FloatT d2)
-{
- return (std::abs(d1 - d2) < std::numeric_limits<FloatT>::epsilon());
-}
+using TravelMode = unsigned char;
+static const TravelMode TRAVEL_MODE_INACCESSIBLE = 0;
+static const TravelMode TRAVEL_MODE_DEFAULT = 1;
-#endif
+#endif /* TRAVEL_MODE_H */
diff --git a/3party/osrm/osrm-backend/DataStructures/TurnInstructions.h b/3party/osrm/osrm-backend/DataStructures/TurnInstructions.h
index 61de3b11b7..611b574ddd 100644
--- a/3party/osrm/osrm-backend/DataStructures/TurnInstructions.h
+++ b/3party/osrm/osrm-backend/DataStructures/TurnInstructions.h
@@ -31,7 +31,7 @@ SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
enum class TurnInstruction : unsigned char
{
NoTurn = 0, GoStraight, TurnSlightRight, TurnRight, TurnSharpRight, UTurn,
- TurnSharpLeft, TurnLeft, TurnSlightLeft, ReachViaPoint, HeadOn, EnterRoundAbout,
+ TurnSharpLeft, TurnLeft, TurnSlightLeft, ReachViaLocation, HeadOn, EnterRoundAbout,
LeaveRoundAbout, StayOnRoundAbout, StartAtEndOfStreet, ReachedYourDestination,
EnterAgainstAllowedDirection, LeaveAgainstAllowedDirection,
InverseAccessRestrictionFlag = 127,
diff --git a/3party/osrm/osrm-backend/DataStructures/XORFastHashStorage.h b/3party/osrm/osrm-backend/DataStructures/XORFastHashStorage.h
index abdb9ac44e..18de3c52c8 100644
--- a/3party/osrm/osrm-backend/DataStructures/XORFastHashStorage.h
+++ b/3party/osrm/osrm-backend/DataStructures/XORFastHashStorage.h
@@ -49,14 +49,14 @@ template <typename NodeID, typename Key> class XORFastHashStorage
HashCell(const HashCell &other) : key(other.key), id(other.id), time(other.time) {}
- inline operator Key() const { return key; }
+ operator Key() const { return key; }
- inline void operator=(const Key &key_to_insert) { key = key_to_insert; }
+ void operator=(const Key &key_to_insert) { key = key_to_insert; }
};
explicit XORFastHashStorage(size_t) : positions(2 << 16), current_timestamp(0) {}
- inline HashCell &operator[](const NodeID node)
+ HashCell &operator[](const NodeID node)
{
unsigned short position = fast_hasher(node);
while ((positions[position].time == current_timestamp) && (positions[position].id != node))
@@ -69,7 +69,7 @@ template <typename NodeID, typename Key> class XORFastHashStorage
return positions[position];
}
- inline void Clear()
+ void Clear()
{
++current_timestamp;
if (std::numeric_limits<unsigned>::max() == current_timestamp)
diff --git a/3party/osrm/osrm-backend/Descriptors/DescriptionFactory.cpp b/3party/osrm/osrm-backend/Descriptors/DescriptionFactory.cpp
index 2d66cc197e..715bf69037 100644
--- a/3party/osrm/osrm-backend/Descriptors/DescriptionFactory.cpp
+++ b/3party/osrm/osrm-backend/Descriptors/DescriptionFactory.cpp
@@ -45,38 +45,71 @@ void DescriptionFactory::SetStartSegment(const PhantomNode &source, const bool t
start_phantom = source;
const EdgeWeight segment_duration =
(traversed_in_reverse ? source.reverse_weight : source.forward_weight);
- AppendSegment(source.location,
- PathData(0, source.name_id, TurnInstruction::HeadOn, segment_duration));
+ const TravelMode travel_mode =
+ (traversed_in_reverse ? source.backward_travel_mode : source.forward_travel_mode);
+ AppendSegment(
+ source.location,
+ PathData(0, source.name_id, TurnInstruction::HeadOn, segment_duration, travel_mode));
BOOST_ASSERT(path_description.back().duration == segment_duration);
}
-void DescriptionFactory::SetEndSegment(const PhantomNode &target, const bool traversed_in_reverse)
+void DescriptionFactory::SetEndSegment(const PhantomNode &target,
+ const bool traversed_in_reverse,
+ const bool is_via_location)
{
target_phantom = target;
const EdgeWeight segment_duration =
(traversed_in_reverse ? target.reverse_weight : target.forward_weight);
- path_description.emplace_back(
- target.location, target.name_id, segment_duration, 0.f, TurnInstruction::NoTurn, true, true);
+ const TravelMode travel_mode =
+ (traversed_in_reverse ? target.backward_travel_mode : target.forward_travel_mode);
+ path_description.emplace_back(target.location,
+ target.name_id,
+ segment_duration,
+ 0.f,
+ is_via_location ? TurnInstruction::ReachViaLocation
+ : TurnInstruction::NoTurn,
+ true,
+ true,
+ travel_mode);
BOOST_ASSERT(path_description.back().duration == segment_duration);
}
void DescriptionFactory::AppendSegment(const FixedPointCoordinate &coordinate,
const PathData &path_point)
{
- if ((1 == path_description.size()) && (path_description.back().location == coordinate))
+ // if the start location is on top of a node, the first movement might be zero-length,
+ // in which case we dont' add a new description, but instead update the existing one
+ if ((1 == path_description.size()) && (path_description.front().location == coordinate))
{
- path_description.back().name_id = path_point.name_id;
+ if (path_point.segment_duration > 0)
+ {
+ path_description.front().name_id = path_point.name_id;
+ path_description.front().travel_mode = path_point.travel_mode;
+ }
return;
}
+ // make sure mode changes are announced, even when there otherwise is no turn
+ const TurnInstruction turn = [&]() -> TurnInstruction
+ {
+ if (TurnInstruction::NoTurn == path_point.turn_instruction &&
+ path_description.front().travel_mode != path_point.travel_mode &&
+ path_point.segment_duration > 0)
+ {
+ return TurnInstruction::GoStraight;
+ }
+ return path_point.turn_instruction;
+ }();
+
path_description.emplace_back(coordinate,
path_point.name_id,
path_point.segment_duration,
0.f,
- path_point.turn_instruction);
+ turn,
+ path_point.travel_mode);
}
-JSON::Value DescriptionFactory::AppendEncodedPolylineString(const bool return_encoded)
+JSON::Value DescriptionFactory::AppendGeometryString(const bool return_encoded)
{
if (return_encoded)
{
diff --git a/3party/osrm/osrm-backend/Descriptors/DescriptionFactory.h b/3party/osrm/osrm-backend/Descriptors/DescriptionFactory.h
index d081bae888..ac4c70234f 100644
--- a/3party/osrm/osrm-backend/Descriptors/DescriptionFactory.h
+++ b/3party/osrm/osrm-backend/Descriptors/DescriptionFactory.h
@@ -80,9 +80,11 @@ class DescriptionFactory
void AppendSegment(const FixedPointCoordinate &coordinate, const PathData &data);
void BuildRouteSummary(const double distance, const unsigned time);
void SetStartSegment(const PhantomNode &start_phantom, const bool traversed_in_reverse);
- void SetEndSegment(const PhantomNode &start_phantom, const bool traversed_in_reverse);
- JSON::Value AppendEncodedPolylineString(const bool return_encoded);
- std::vector<unsigned> const & GetViaIndices() const;
+ void SetEndSegment(const PhantomNode &start_phantom,
+ const bool traversed_in_reverse,
+ const bool is_via_location = false);
+ JSON::Value AppendGeometryString(const bool return_encoded);
+ std::vector<unsigned> const &GetViaIndices() const;
template <class DataFacadeT> void Run(const DataFacadeT *facade, const unsigned zoomLevel)
{
@@ -198,14 +200,15 @@ class DescriptionFactory
{
++necessary_pieces;
if (path_description[i].is_via_location)
- { //mark the end of a leg
+ { // mark the end of a leg
via_indices.push_back(necessary_pieces);
}
- const double angle = path_description[i+1].location.GetBearing(path_description[i].location);
+ const double angle =
+ path_description[i + 1].location.GetBearing(path_description[i].location);
path_description[i].bearing = static_cast<unsigned>(angle * 10);
}
}
- via_indices.push_back(necessary_pieces+1);
+ via_indices.push_back(necessary_pieces + 1);
BOOST_ASSERT(via_indices.size() >= 2);
// BOOST_ASSERT(0 != necessary_pieces || path_description.empty());
return;
diff --git a/3party/osrm/osrm-backend/Descriptors/GPXDescriptor.h b/3party/osrm/osrm-backend/Descriptors/GPXDescriptor.h
index 50efd9ae2d..6f76b3bc87 100644
--- a/3party/osrm/osrm-backend/Descriptors/GPXDescriptor.h
+++ b/3party/osrm/osrm-backend/Descriptors/GPXDescriptor.h
@@ -30,14 +30,14 @@ SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
#include "BaseDescriptor.h"
-template <class DataFacadeT> class GPXDescriptor : public BaseDescriptor<DataFacadeT>
+template <class DataFacadeT> class GPXDescriptor final : public BaseDescriptor<DataFacadeT>
{
private:
DescriptorConfig config;
FixedPointCoordinate current;
- DataFacadeT * facade;
+ DataFacadeT *facade;
- void AddRoutePoint(const FixedPointCoordinate & coordinate, std::vector<char> & output)
+ void AddRoutePoint(const FixedPointCoordinate &coordinate, std::vector<char> &output)
{
const std::string route_point_head = "<rtept lat=\"";
const std::string route_point_middle = " lon=\"";
@@ -57,12 +57,12 @@ template <class DataFacadeT> class GPXDescriptor : public BaseDescriptor<DataFac
}
public:
- GPXDescriptor(DataFacadeT *facade) : facade(facade) {}
+ explicit GPXDescriptor(DataFacadeT *facade) : facade(facade) {}
- void SetConfig(const DescriptorConfig &c) { config = c; }
+ void SetConfig(const DescriptorConfig &c) final { config = c; }
// TODO: reorder parameters
- void Run(const RawRouteData &raw_route, http::Reply &reply)
+ void Run(const RawRouteData &raw_route, http::Reply &reply) final
{
std::string header("<?xml version=\"1.0\" encoding=\"UTF-8\"?>"
"<gpx creator=\"OSRM Routing Engine\" version=\"1.1\" "
@@ -79,7 +79,8 @@ template <class DataFacadeT> class GPXDescriptor : public BaseDescriptor<DataFac
(!raw_route.unpacked_path_segments.front().empty());
if (found_route)
{
- AddRoutePoint(raw_route.segment_end_coordinates.front().source_phantom.location, reply.content);
+ AddRoutePoint(raw_route.segment_end_coordinates.front().source_phantom.location,
+ reply.content);
for (const std::vector<PathData> &path_data_vector : raw_route.unpacked_path_segments)
{
@@ -90,8 +91,8 @@ template <class DataFacadeT> class GPXDescriptor : public BaseDescriptor<DataFac
AddRoutePoint(current_coordinate, reply.content);
}
}
- AddRoutePoint(raw_route.segment_end_coordinates.back().target_phantom.location, reply.content);
-
+ AddRoutePoint(raw_route.segment_end_coordinates.back().target_phantom.location,
+ reply.content);
}
std::string footer("</rte></gpx>");
reply.content.insert(reply.content.end(), footer.begin(), footer.end());
diff --git a/3party/osrm/osrm-backend/Descriptors/JSONDescriptor.h b/3party/osrm/osrm-backend/Descriptors/JSONDescriptor.h
index f0db43f17a..9e095c151e 100644
--- a/3party/osrm/osrm-backend/Descriptors/JSONDescriptor.h
+++ b/3party/osrm/osrm-backend/Descriptors/JSONDescriptor.h
@@ -42,7 +42,7 @@ SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
#include <algorithm>
-template <class DataFacadeT> class JSONDescriptor : public BaseDescriptor<DataFacadeT>
+template <class DataFacadeT> class JSONDescriptor final : public BaseDescriptor<DataFacadeT>
{
private:
DataFacadeT *facade;
@@ -70,13 +70,14 @@ template <class DataFacadeT> class JSONDescriptor : public BaseDescriptor<DataFa
ExtractRouteNames<DataFacadeT, Segment> GenerateRouteNames;
public:
- JSONDescriptor(DataFacadeT *facade) : facade(facade), entered_restricted_area_count(0) {}
+ explicit JSONDescriptor(DataFacadeT *facade) : facade(facade), entered_restricted_area_count(0) {}
- void SetConfig(const DescriptorConfig &c) { config = c; }
+ void SetConfig(const DescriptorConfig &c) final { config = c; }
unsigned DescribeLeg(const std::vector<PathData> route_leg,
const PhantomNodes &leg_phantoms,
- const bool target_traversed_in_reverse)
+ const bool target_traversed_in_reverse,
+ const bool is_via_leg)
{
unsigned added_element_count = 0;
// Get all the coordinates for the computed route
@@ -87,13 +88,14 @@ template <class DataFacadeT> class JSONDescriptor : public BaseDescriptor<DataFa
description_factory.AppendSegment(current_coordinate, path_data);
++added_element_count;
}
- description_factory.SetEndSegment(leg_phantoms.target_phantom, target_traversed_in_reverse);
+ description_factory.SetEndSegment(
+ leg_phantoms.target_phantom, target_traversed_in_reverse, is_via_leg);
++added_element_count;
BOOST_ASSERT((route_leg.size() + 1) == added_element_count);
return added_element_count;
}
- void Run(const RawRouteData &raw_route, http::Reply &reply)
+ void Run(const RawRouteData &raw_route, http::Reply &reply) final
{
JSON::Object json_result;
if (INVALID_EDGE_WEIGHT == raw_route.shortest_path_length)
@@ -124,9 +126,10 @@ template <class DataFacadeT> class JSONDescriptor : public BaseDescriptor<DataFa
#ifndef NDEBUG
const int added_segments =
#endif
- DescribeLeg(raw_route.unpacked_path_segments[i],
- raw_route.segment_end_coordinates[i],
- raw_route.target_traversed_in_reverse[i]);
+ DescribeLeg(raw_route.unpacked_path_segments[i],
+ raw_route.segment_end_coordinates[i],
+ raw_route.target_traversed_in_reverse[i],
+ raw_route.is_via_leg(i));
BOOST_ASSERT(0 < added_segments);
}
description_factory.Run(facade, config.zoom_level);
@@ -134,7 +137,7 @@ template <class DataFacadeT> class JSONDescriptor : public BaseDescriptor<DataFa
if (config.geometry)
{
JSON::Value route_geometry =
- description_factory.AppendEncodedPolylineString(config.encode_geometry);
+ description_factory.AppendGeometryString(config.encode_geometry);
json_result.values["route_geometry"] = route_geometry;
}
if (config.instructions)
@@ -202,14 +205,15 @@ template <class DataFacadeT> class JSONDescriptor : public BaseDescriptor<DataFa
current = facade->GetCoordinateOfNode(path_data.node);
alternate_description_factory.AppendSegment(current, path_data);
}
- alternate_description_factory.SetEndSegment(raw_route.segment_end_coordinates.back().target_phantom, raw_route.alt_source_traversed_in_reverse.back());
+ alternate_description_factory.SetEndSegment(
+ raw_route.segment_end_coordinates.back().target_phantom,
+ raw_route.alt_source_traversed_in_reverse.back());
alternate_description_factory.Run(facade, config.zoom_level);
if (config.geometry)
{
JSON::Value alternate_geometry_string =
- alternate_description_factory.AppendEncodedPolylineString(
- config.encode_geometry);
+ alternate_description_factory.AppendGeometryString(config.encode_geometry);
JSON::Array json_alternate_geometries_array;
json_alternate_geometries_array.values.push_back(alternate_geometry_string);
json_result.values["alternative_geometries"] = json_alternate_geometries_array;
@@ -279,10 +283,10 @@ template <class DataFacadeT> class JSONDescriptor : public BaseDescriptor<DataFa
std::string hint;
for (const auto i : osrm::irange<std::size_t>(0, raw_route.segment_end_coordinates.size()))
{
- EncodeObjectToBase64(raw_route.segment_end_coordinates[i].source_phantom, hint);
+ ObjectEncoder::EncodeToBase64(raw_route.segment_end_coordinates[i].source_phantom, hint);
json_location_hint_array.values.push_back(hint);
}
- EncodeObjectToBase64(raw_route.segment_end_coordinates.back().target_phantom, hint);
+ ObjectEncoder::EncodeToBase64(raw_route.segment_end_coordinates.back().target_phantom, hint);
json_location_hint_array.values.push_back(hint);
json_hint_object.values["locations"] = json_location_hint_array;
json_result.values["hint_data"] = json_hint_object;
@@ -326,16 +330,16 @@ template <class DataFacadeT> class JSONDescriptor : public BaseDescriptor<DataFa
if (TurnInstruction::LeaveRoundAbout == current_instruction)
{
temp_instruction =
- IntToString(as_integer(TurnInstruction::EnterRoundAbout));
+ cast::integral_to_string(cast::enum_to_underlying(TurnInstruction::EnterRoundAbout));
current_turn_instruction += temp_instruction;
current_turn_instruction += "-";
- temp_instruction = IntToString(round_about.leave_at_exit + 1);
+ temp_instruction = cast::integral_to_string(round_about.leave_at_exit + 1);
current_turn_instruction += temp_instruction;
round_about.leave_at_exit = 0;
}
else
{
- temp_instruction = IntToString(as_integer(current_instruction));
+ temp_instruction = cast::integral_to_string(cast::enum_to_underlying(current_instruction));
current_turn_instruction += temp_instruction;
}
json_instruction_row.values.push_back(current_turn_instruction);
@@ -346,13 +350,17 @@ template <class DataFacadeT> class JSONDescriptor : public BaseDescriptor<DataFa
json_instruction_row.values.push_back(necessary_segments_running_index);
json_instruction_row.values.push_back(round(segment.duration / 10));
json_instruction_row.values.push_back(
- UintToString(static_cast<int>(segment.length)) + "m");
- const double bearing_value = (segment.bearing / 10.) ;
+ cast::integral_to_string(static_cast<unsigned>(segment.length)) + "m");
+ const double bearing_value = (segment.bearing / 10.);
json_instruction_row.values.push_back(Azimuth::Get(bearing_value));
- json_instruction_row.values.push_back(static_cast<unsigned>(round(bearing_value)));
+ json_instruction_row.values.push_back(
+ static_cast<unsigned>(round(bearing_value)));
+ json_instruction_row.values.push_back(segment.travel_mode);
route_segments_list.emplace_back(
- segment.name_id, static_cast<int>(segment.length), static_cast<unsigned>(route_segments_list.size()));
+ segment.name_id,
+ static_cast<int>(segment.length),
+ static_cast<unsigned>(route_segments_list.size()));
json_instruction_array.values.push_back(json_instruction_row);
}
}
@@ -367,7 +375,7 @@ template <class DataFacadeT> class JSONDescriptor : public BaseDescriptor<DataFa
}
JSON::Array json_last_instruction_row;
- temp_instruction = IntToString(as_integer(TurnInstruction::ReachedYourDestination));
+ temp_instruction = cast::integral_to_string(cast::enum_to_underlying(TurnInstruction::ReachedYourDestination));
json_last_instruction_row.values.push_back(temp_instruction);
json_last_instruction_row.values.push_back("");
json_last_instruction_row.values.push_back(0);
diff --git a/3party/osrm/osrm-backend/Extractor/BaseParser.cpp b/3party/osrm/osrm-backend/Extractor/BaseParser.cpp
index 698552a1ce..20c864556b 100644
--- a/3party/osrm/osrm-backend/Extractor/BaseParser.cpp
+++ b/3party/osrm/osrm-backend/Extractor/BaseParser.cpp
@@ -32,7 +32,7 @@ SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
#include "../DataStructures/ImportNode.h"
#include "../Util/LuaUtil.h"
#include "../Util/OSRMException.h"
-#include "../Util/SimpleLogger.h"
+#include "../Util/simple_logger.hpp"
#include <boost/algorithm/string.hpp>
#include <boost/algorithm/string/regex.hpp>
diff --git a/3party/osrm/osrm-backend/Extractor/ExtractionContainers.cpp b/3party/osrm/osrm-backend/Extractor/ExtractionContainers.cpp
index d9e891cf0f..fda062e935 100644
--- a/3party/osrm/osrm-backend/Extractor/ExtractionContainers.cpp
+++ b/3party/osrm/osrm-backend/Extractor/ExtractionContainers.cpp
@@ -28,7 +28,7 @@ SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
#include "ExtractionContainers.h"
#include "ExtractionWay.h"
#include "../Util/OSRMException.h"
-#include "../Util/SimpleLogger.h"
+#include "../Util/simple_logger.hpp"
#include "../Util/TimingUtil.h"
#include "../DataStructures/RangeTable.h"
@@ -330,7 +330,6 @@ void ExtractionContainers::PrepareData(const std::string &output_file_name,
edge_iterator->source_coordinate.lon != std::numeric_limits<int>::min())
{
BOOST_ASSERT(edge_iterator->speed != -1);
- BOOST_ASSERT(edge_iterator->type >= 0);
edge_iterator->target_coordinate.lat = node_iterator->lat;
edge_iterator->target_coordinate.lon = node_iterator->lon;
@@ -349,7 +348,6 @@ void ExtractionContainers::PrepareData(const std::string &output_file_name,
short zero = 0;
short one = 1;
- file_out_stream.write((char *)&edge_iterator->way_id, sizeof(unsigned));
file_out_stream.write((char *)&edge_iterator->start, sizeof(unsigned));
file_out_stream.write((char *)&edge_iterator->target, sizeof(unsigned));
file_out_stream.write((char *)&integer_distance, sizeof(int));
@@ -372,14 +370,16 @@ void ExtractionContainers::PrepareData(const std::string &output_file_name,
}
file_out_stream.write((char *)&integer_weight, sizeof(int));
- file_out_stream.write((char *)&edge_iterator->type, sizeof(short));
file_out_stream.write((char *)&edge_iterator->name_id, sizeof(unsigned));
file_out_stream.write((char *)&edge_iterator->is_roundabout, sizeof(bool));
file_out_stream.write((char *)&edge_iterator->is_in_tiny_cc, sizeof(bool));
file_out_stream.write((char *)&edge_iterator->is_access_restricted, sizeof(bool));
- file_out_stream.write((char *)&edge_iterator->is_contra_flow, sizeof(bool));
- file_out_stream.write((char *)&edge_iterator->is_split, sizeof(bool));
+ // cannot take adress of bit field, so use local
+ const TravelMode travel_mode = edge_iterator->travel_mode;
+ file_out_stream.write((char *)&travel_mode, sizeof(TravelMode));
+
+ file_out_stream.write((char *)&edge_iterator->is_split, sizeof(bool));
++number_of_used_edges;
}
++edge_iterator;
diff --git a/3party/osrm/osrm-backend/Extractor/ExtractionContainers.h b/3party/osrm/osrm-backend/Extractor/ExtractionContainers.h
index a272387ea2..bfb318ba7a 100644
--- a/3party/osrm/osrm-backend/Extractor/ExtractionContainers.h
+++ b/3party/osrm/osrm-backend/Extractor/ExtractionContainers.h
@@ -43,12 +43,12 @@ class ExtractionContainers
const static unsigned stxxl_memory = ((sizeof(std::size_t) == 4) ? INT_MAX : UINT_MAX);
#endif
public:
- typedef stxxl::vector<NodeID> STXXLNodeIDVector;
- typedef stxxl::vector<ExternalMemoryNode> STXXLNodeVector;
- typedef stxxl::vector<InternalExtractorEdge> STXXLEdgeVector;
- typedef stxxl::vector<std::string> STXXLStringVector;
- typedef stxxl::vector<InputRestrictionContainer> STXXLRestrictionsVector;
- typedef stxxl::vector<WayIDStartAndEndEdge> STXXLWayIDStartEndVector;
+ using STXXLNodeIDVector = stxxl::vector<NodeID>;
+ using STXXLNodeVector = stxxl::vector<ExternalMemoryNode>;
+ using STXXLEdgeVector = stxxl::vector<InternalExtractorEdge>;
+ using STXXLStringVector = stxxl::vector<std::string>;
+ using STXXLRestrictionsVector = stxxl::vector<InputRestrictionContainer>;
+ using STXXLWayIDStartEndVector = stxxl::vector<WayIDStartAndEndEdge>;
STXXLNodeIDVector used_node_id_list;
STXXLNodeVector all_nodes_list;
@@ -60,7 +60,7 @@ class ExtractionContainers
ExtractionContainers();
- virtual ~ExtractionContainers();
+ ~ExtractionContainers();
void PrepareData(const std::string &output_file_name,
const std::string &restrictions_file_name);
diff --git a/3party/osrm/osrm-backend/Extractor/ExtractionHelperFunctions.h b/3party/osrm/osrm-backend/Extractor/ExtractionHelperFunctions.h
index a918744f16..b053338fd0 100644
--- a/3party/osrm/osrm-backend/Extractor/ExtractionHelperFunctions.h
+++ b/3party/osrm/osrm-backend/Extractor/ExtractionHelperFunctions.h
@@ -28,10 +28,11 @@ SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
#ifndef EXTRACTION_HELPER_FUNCTIONS_H
#define EXTRACTION_HELPER_FUNCTIONS_H
-#include "../Util/StringUtil.h"
+#include "../Util/cast.hpp"
#include <boost/algorithm/string.hpp>
#include <boost/algorithm/string_regex.hpp>
+#include <boost/spirit/include/qi.hpp>
#include <boost/regex.hpp>
#include <limits>
@@ -68,18 +69,18 @@ inline unsigned parseDuration(const std::string &s)
{
if (1 == result.size())
{
- minutes = StringToUint(result[0]);
+ minutes = cast::string_to_int(result[0]);
}
if (2 == result.size())
{
- minutes = StringToUint(result[1]);
- hours = StringToUint(result[0]);
+ minutes = cast::string_to_int(result[1]);
+ hours = cast::string_to_int(result[0]);
}
if (3 == result.size())
{
- seconds = StringToUint(result[2]);
- minutes = StringToUint(result[1]);
- hours = StringToUint(result[0]);
+ seconds = cast::string_to_int(result[2]);
+ minutes = cast::string_to_int(result[1]);
+ hours = cast::string_to_int(result[0]);
}
return 10 * (3600 * hours + 60 * minutes + seconds);
}
diff --git a/3party/osrm/osrm-backend/Extractor/ExtractionWay.h b/3party/osrm/osrm-backend/Extractor/ExtractionWay.h
index 6c3c93d63e..1a197b6599 100644
--- a/3party/osrm/osrm-backend/Extractor/ExtractionWay.h
+++ b/3party/osrm/osrm-backend/Extractor/ExtractionWay.h
@@ -29,6 +29,7 @@ SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
#define EXTRACTION_WAY_H
#include "../DataStructures/HashTable.h"
+#include "../DataStructures/TravelMode.h"
#include "../typedefs.h"
#include <string>
@@ -44,15 +45,15 @@ struct ExtractionWay
nameID = INVALID_NAMEID;
path.clear();
keyVals.Clear();
- direction = ExtractionWay::notSure;
- speed = -1;
+ forward_speed = -1;
backward_speed = -1;
duration = -1;
- type = -1;
access = true;
roundabout = false;
isAccessRestricted = false;
ignoreInGrid = false;
+ forward_travel_mode = TRAVEL_MODE_DEFAULT;
+ backward_travel_mode = TRAVEL_MODE_DEFAULT;
}
enum Directions
@@ -60,20 +61,70 @@ struct ExtractionWay
oneway,
bidirectional,
opposite };
+
+ // These accessor methods exists to support the depreciated "way.direction" access
+ // in LUA. Since the direction attribute was removed from ExtractionWay, the
+ // accessors translate to/from the mode attributes.
+ inline void set_direction(const Directions m)
+ {
+ if (Directions::oneway == m)
+ {
+ forward_travel_mode = TRAVEL_MODE_DEFAULT;
+ backward_travel_mode = TRAVEL_MODE_INACCESSIBLE;
+ }
+ else if (Directions::opposite == m)
+ {
+ forward_travel_mode = TRAVEL_MODE_INACCESSIBLE;
+ backward_travel_mode = TRAVEL_MODE_DEFAULT;
+ }
+ else if (Directions::bidirectional == m)
+ {
+ forward_travel_mode = TRAVEL_MODE_DEFAULT;
+ backward_travel_mode = TRAVEL_MODE_DEFAULT;
+ }
+ }
+
+ inline const Directions get_direction() const
+ {
+ if (TRAVEL_MODE_INACCESSIBLE != forward_travel_mode && TRAVEL_MODE_INACCESSIBLE != backward_travel_mode)
+ {
+ return Directions::bidirectional;
+ }
+ else if (TRAVEL_MODE_INACCESSIBLE != forward_travel_mode)
+ {
+ return Directions::oneway;
+ }
+ else if (TRAVEL_MODE_INACCESSIBLE != backward_travel_mode)
+ {
+ return Directions::opposite;
+ }
+ else
+ {
+ return Directions::notSure;
+ }
+ }
+
+ // These accessors exists because it's not possible to take the address of a bitfield,
+ // and LUA therefore cannot read/write the mode attributes directly.
+ inline void set_forward_mode(const TravelMode m) { forward_travel_mode = m; }
+ inline const TravelMode get_forward_mode() const { return forward_travel_mode; }
+ inline void set_backward_mode(const TravelMode m) { backward_travel_mode = m; }
+ inline const TravelMode get_backward_mode() const { return backward_travel_mode; }
+
unsigned id;
unsigned nameID;
- double speed;
+ double forward_speed;
double backward_speed;
double duration;
- Directions direction;
std::string name;
- short type;
bool access;
bool roundabout;
bool isAccessRestricted;
bool ignoreInGrid;
std::vector<NodeID> path;
HashTable<std::string, std::string> keyVals;
+ TravelMode forward_travel_mode : 4;
+ TravelMode backward_travel_mode : 4;
};
#endif // EXTRACTION_WAY_H
diff --git a/3party/osrm/osrm-backend/Extractor/Extractor.cpp b/3party/osrm/osrm-backend/Extractor/Extractor.cpp
index dd95685df4..0849768510 100644
--- a/3party/osrm/osrm-backend/Extractor/Extractor.cpp
+++ b/3party/osrm/osrm-backend/Extractor/Extractor.cpp
@@ -34,9 +34,9 @@ SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
#include "XMLParser.h"
#include "../Util/GitDescription.h"
+#include "../Util/IniFileUtil.h"
#include "../Util/OSRMException.h"
-#include "../Util/ProgramOptions.h"
-#include "../Util/SimpleLogger.h"
+#include "../Util/simple_logger.hpp"
#include "../Util/TimingUtil.h"
#include "../typedefs.h"
diff --git a/3party/osrm/osrm-backend/Extractor/ExtractorCallbacks.cpp b/3party/osrm/osrm-backend/Extractor/ExtractorCallbacks.cpp
index 8474c40055..16bd77aa65 100644
--- a/3party/osrm/osrm-backend/Extractor/ExtractorCallbacks.cpp
+++ b/3party/osrm/osrm-backend/Extractor/ExtractorCallbacks.cpp
@@ -31,7 +31,7 @@ SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
#include "../DataStructures/Restriction.h"
#include "../DataStructures/ImportNode.h"
-#include "../Util/SimpleLogger.h"
+#include "../Util/simple_logger.hpp"
#include <osrm/Coordinate.h>
@@ -63,7 +63,11 @@ bool ExtractorCallbacks::ProcessRestriction(const InputRestrictionContainer &res
/** warning: caller needs to take care of synchronization! */
void ExtractorCallbacks::ProcessWay(ExtractionWay &parsed_way)
{
- if ((0 >= parsed_way.speed) && (0 >= parsed_way.duration))
+ if (((0 >= parsed_way.forward_speed) ||
+ (TRAVEL_MODE_INACCESSIBLE == parsed_way.forward_travel_mode)) &&
+ ((0 >= parsed_way.backward_speed) ||
+ (TRAVEL_MODE_INACCESSIBLE == parsed_way.backward_travel_mode)) &&
+ (0 >= parsed_way.duration))
{ // Only true if the way is specified by the speed profile
return;
}
@@ -84,10 +88,11 @@ void ExtractorCallbacks::ProcessWay(ExtractionWay &parsed_way)
{
// TODO: iterate all way segments and set duration corresponding to the length of each
// segment
- parsed_way.speed = parsed_way.duration / (parsed_way.path.size() - 1);
+ parsed_way.forward_speed = parsed_way.duration / (parsed_way.path.size() - 1);
+ parsed_way.backward_speed = parsed_way.duration / (parsed_way.path.size() - 1);
}
- if (std::numeric_limits<double>::epsilon() >= std::abs(-1. - parsed_way.speed))
+ if (std::numeric_limits<double>::epsilon() >= std::abs(-1. - parsed_way.forward_speed))
{
SimpleLogger().Write(logDEBUG) << "found way with bogus speed, id: " << parsed_way.id;
return;
@@ -106,30 +111,34 @@ void ExtractorCallbacks::ProcessWay(ExtractionWay &parsed_way)
parsed_way.nameID = string_map_iterator->second;
}
- if (ExtractionWay::opposite == parsed_way.direction)
+ if (TRAVEL_MODE_INACCESSIBLE == parsed_way.forward_travel_mode)
{
std::reverse(parsed_way.path.begin(), parsed_way.path.end());
- parsed_way.direction = ExtractionWay::oneway;
+ parsed_way.forward_travel_mode = parsed_way.backward_travel_mode;
+ parsed_way.backward_travel_mode = TRAVEL_MODE_INACCESSIBLE;
}
const bool split_edge =
- (parsed_way.backward_speed > 0) && (parsed_way.speed != parsed_way.backward_speed);
+ (parsed_way.forward_speed>0) && (TRAVEL_MODE_INACCESSIBLE != parsed_way.forward_travel_mode) &&
+ (parsed_way.backward_speed>0) && (TRAVEL_MODE_INACCESSIBLE != parsed_way.backward_travel_mode) &&
+ ((parsed_way.forward_speed != parsed_way.backward_speed) ||
+ (parsed_way.forward_travel_mode != parsed_way.backward_travel_mode));
+ BOOST_ASSERT(parsed_way.forward_travel_mode>0);
for (unsigned n = 0; n < (parsed_way.path.size() - 1); ++n)
{
external_memory.all_edges_list.push_back(InternalExtractorEdge(
- parsed_way.id,
parsed_way.path[n],
parsed_way.path[n + 1],
- parsed_way.type,
- (split_edge ? ExtractionWay::oneway : parsed_way.direction),
- parsed_way.speed,
+ ((split_edge || TRAVEL_MODE_INACCESSIBLE == parsed_way.backward_travel_mode) ? ExtractionWay::oneway
+ : ExtractionWay::bidirectional),
+ parsed_way.forward_speed,
parsed_way.nameID,
parsed_way.roundabout,
parsed_way.ignoreInGrid,
(0 < parsed_way.duration),
parsed_way.isAccessRestricted,
- false,
+ parsed_way.forward_travel_mode,
split_edge));
external_memory.used_node_id_list.push_back(parsed_way.path[n]);
}
@@ -145,14 +154,14 @@ void ExtractorCallbacks::ProcessWay(ExtractionWay &parsed_way)
if (split_edge)
{ // Only true if the way should be split
+ BOOST_ASSERT(parsed_way.backward_travel_mode>0);
std::reverse(parsed_way.path.begin(), parsed_way.path.end());
+
for (std::vector<NodeID>::size_type n = 0; n < parsed_way.path.size() - 1; ++n)
{
external_memory.all_edges_list.push_back(
- InternalExtractorEdge(parsed_way.id,
- parsed_way.path[n],
+ InternalExtractorEdge(parsed_way.path[n],
parsed_way.path[n + 1],
- parsed_way.type,
ExtractionWay::oneway,
parsed_way.backward_speed,
parsed_way.nameID,
@@ -160,7 +169,7 @@ void ExtractorCallbacks::ProcessWay(ExtractionWay &parsed_way)
parsed_way.ignoreInGrid,
(0 < parsed_way.duration),
parsed_way.isAccessRestricted,
- (ExtractionWay::oneway == parsed_way.direction),
+ parsed_way.backward_travel_mode,
split_edge));
}
external_memory.way_start_end_id_list.push_back(
diff --git a/3party/osrm/osrm-backend/Extractor/ExtractorStructs.h b/3party/osrm/osrm-backend/Extractor/ExtractorStructs.h
index 51a74c3be5..a3c6f3eaf5 100644
--- a/3party/osrm/osrm-backend/Extractor/ExtractorStructs.h
+++ b/3party/osrm/osrm-backend/Extractor/ExtractorStructs.h
@@ -83,7 +83,7 @@ struct WayIDStartAndEndEdge
struct CmpWayByID
{
- typedef WayIDStartAndEndEdge value_type;
+ using value_type = WayIDStartAndEndEdge;
bool operator()(const WayIDStartAndEndEdge &a, const WayIDStartAndEndEdge &b) const
{
return a.wayID < b.wayID;
@@ -94,7 +94,7 @@ struct CmpWayByID
struct Cmp
{
- typedef NodeID value_type;
+ using value_type = NodeID;
bool operator()(const NodeID left, const NodeID right) const { return left < right; }
value_type max_value() { return 0xffffffff; }
value_type min_value() { return 0x0; }
@@ -102,7 +102,7 @@ struct Cmp
struct CmpNodeByID
{
- typedef ExternalMemoryNode value_type;
+ using value_type = ExternalMemoryNode;
bool operator()(const ExternalMemoryNode &left, const ExternalMemoryNode &right) const
{
return left.node_id < right.node_id;
diff --git a/3party/osrm/osrm-backend/Extractor/InternalExtractorEdge.h b/3party/osrm/osrm-backend/Extractor/InternalExtractorEdge.h
index 32f11089f7..848b24fb34 100644
--- a/3party/osrm/osrm-backend/Extractor/InternalExtractorEdge.h
+++ b/3party/osrm/osrm-backend/Extractor/InternalExtractorEdge.h
@@ -29,6 +29,7 @@ SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
#define INTERNAL_EXTRACTOR_EDGE_H
#include "../typedefs.h"
+#include "../DataStructures/TravelMode.h"
#include <osrm/Coordinate.h>
#include <boost/assert.hpp>
@@ -36,16 +37,14 @@ SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
struct InternalExtractorEdge
{
InternalExtractorEdge()
- : way_id(0), start(0), target(0), type(0), direction(0), speed(0), name_id(0), is_roundabout(false),
+ : start(0), target(0), direction(0), speed(0), name_id(0), is_roundabout(false),
is_in_tiny_cc(false), is_duration_set(false), is_access_restricted(false),
- is_contra_flow(false), is_split(false)
+ travel_mode(TRAVEL_MODE_INACCESSIBLE), is_split(false)
{
}
- explicit InternalExtractorEdge(unsigned id,
- NodeID start,
+ explicit InternalExtractorEdge(NodeID start,
NodeID target,
- short type,
short direction,
double speed,
unsigned name_id,
@@ -53,31 +52,28 @@ struct InternalExtractorEdge
bool is_in_tiny_cc,
bool is_duration_set,
bool is_access_restricted,
- bool is_contra_flow,
+ TravelMode travel_mode,
bool is_split)
- : way_id(id), start(start), target(target), type(type), direction(direction), speed(speed),
+ : start(start), target(target), direction(direction), speed(speed),
name_id(name_id), is_roundabout(is_roundabout), is_in_tiny_cc(is_in_tiny_cc),
is_duration_set(is_duration_set), is_access_restricted(is_access_restricted),
- is_contra_flow(is_contra_flow), is_split(is_split)
+ travel_mode(travel_mode), is_split(is_split)
{
- BOOST_ASSERT(0 <= type);
}
// necessary static util functions for stxxl's sorting
static InternalExtractorEdge min_value()
{
- return InternalExtractorEdge(0, 0, 0, 0, 0, 0, 0, false, false, false, false, false, false);
+ return InternalExtractorEdge(0, 0, 0, 0, 0, false, false, false, false, TRAVEL_MODE_INACCESSIBLE, false);
}
static InternalExtractorEdge max_value()
{
return InternalExtractorEdge(
- SPECIAL_EDGEID, SPECIAL_NODEID, SPECIAL_NODEID, 0, 0, 0, 0, false, false, false, false, false, false);
+ SPECIAL_NODEID, SPECIAL_NODEID, 0, 0, 0, false, false, false, false, TRAVEL_MODE_INACCESSIBLE, false);
}
- unsigned way_id;
NodeID start;
NodeID target;
- short type;
short direction;
double speed;
unsigned name_id;
@@ -85,7 +81,7 @@ struct InternalExtractorEdge
bool is_in_tiny_cc;
bool is_duration_set;
bool is_access_restricted;
- bool is_contra_flow;
+ TravelMode travel_mode : 4;
bool is_split;
FixedPointCoordinate source_coordinate;
@@ -94,7 +90,7 @@ struct InternalExtractorEdge
struct CmpEdgeByStartID
{
- typedef InternalExtractorEdge value_type;
+ using value_type = InternalExtractorEdge;
bool operator()(const InternalExtractorEdge &a, const InternalExtractorEdge &b) const
{
return a.start < b.start;
@@ -107,7 +103,7 @@ struct CmpEdgeByStartID
struct CmpEdgeByTargetID
{
- typedef InternalExtractorEdge value_type;
+ using value_type = InternalExtractorEdge;
bool operator()(const InternalExtractorEdge &a, const InternalExtractorEdge &b) const
{
diff --git a/3party/osrm/osrm-backend/Extractor/PBFParser.cpp b/3party/osrm/osrm-backend/Extractor/PBFParser.cpp
index 1abc480798..fd489533f1 100644
--- a/3party/osrm/osrm-backend/Extractor/PBFParser.cpp
+++ b/3party/osrm/osrm-backend/Extractor/PBFParser.cpp
@@ -36,7 +36,7 @@ SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
#include "../DataStructures/Restriction.h"
#include "../Util/MachineInfo.h"
#include "../Util/OSRMException.h"
-#include "../Util/SimpleLogger.h"
+#include "../Util/simple_logger.hpp"
#include "../typedefs.h"
#include <boost/assert.hpp>
@@ -49,6 +49,7 @@ SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
#include <zlib.h>
#include <functional>
+#include <iostream>
#include <limits>
#include <thread>
diff --git a/3party/osrm/osrm-backend/Extractor/ScriptingEnvironment.cpp b/3party/osrm/osrm-backend/Extractor/ScriptingEnvironment.cpp
index e25939fdae..3ecb0c4664 100644
--- a/3party/osrm/osrm-backend/Extractor/ScriptingEnvironment.cpp
+++ b/3party/osrm/osrm-backend/Extractor/ScriptingEnvironment.cpp
@@ -32,7 +32,7 @@ SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
#include "../DataStructures/ImportNode.h"
#include "../Util/LuaUtil.h"
#include "../Util/OSRMException.h"
-#include "../Util/SimpleLogger.h"
+#include "../Util/simple_logger.hpp"
#include "../typedefs.h"
#include <sstream>
@@ -76,16 +76,17 @@ void ScriptingEnvironment::initLuaState(lua_State* lua_state)
// .def(luabind::constructor<>())
.def_readonly("id", &ExtractionWay::id)
.def_readwrite("name", &ExtractionWay::name)
- .def_readwrite("speed", &ExtractionWay::speed)
+ .def_readwrite("forward_speed", &ExtractionWay::forward_speed)
.def_readwrite("backward_speed", &ExtractionWay::backward_speed)
.def_readwrite("duration", &ExtractionWay::duration)
- .def_readwrite("type", &ExtractionWay::type)
.def_readwrite("access", &ExtractionWay::access)
.def_readwrite("roundabout", &ExtractionWay::roundabout)
.def_readwrite("is_access_restricted", &ExtractionWay::isAccessRestricted)
.def_readwrite("ignore_in_grid", &ExtractionWay::ignoreInGrid)
.def_readwrite("tags", &ExtractionWay::keyVals)
- .def_readwrite("direction", &ExtractionWay::direction)
+ .property("direction", &ExtractionWay::get_direction, &ExtractionWay::set_direction)
+ .property("forward_mode", &ExtractionWay::get_forward_mode, &ExtractionWay::set_forward_mode)
+ .property("backward_mode", &ExtractionWay::get_backward_mode, &ExtractionWay::set_backward_mode)
.enum_("constants")[
luabind::value("notSure", 0),
luabind::value("oneway", 1),
diff --git a/3party/osrm/osrm-backend/Extractor/XMLParser.cpp b/3party/osrm/osrm-backend/Extractor/XMLParser.cpp
index 273ed66937..a984c76b72 100644
--- a/3party/osrm/osrm-backend/Extractor/XMLParser.cpp
+++ b/3party/osrm/osrm-backend/Extractor/XMLParser.cpp
@@ -34,7 +34,8 @@ SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
#include "../DataStructures/ImportNode.h"
#include "../DataStructures/InputReaderFactory.h"
#include "../DataStructures/Restriction.h"
-#include "../Util/SimpleLogger.h"
+#include "../Util/cast.hpp"
+#include "../Util/simple_logger.hpp"
#include "../Util/StringUtil.h"
#include "../typedefs.h"
@@ -168,17 +169,17 @@ InputRestrictionContainer XMLParser::ReadXMLRestriction()
if (xmlStrEqual(role, (const xmlChar *)"to") &&
xmlStrEqual(type, (const xmlChar *)"way"))
{
- restriction.toWay = StringToUint((const char *)ref);
+ restriction.toWay = cast::string_to_uint((const char *)ref);
}
if (xmlStrEqual(role, (const xmlChar *)"from") &&
xmlStrEqual(type, (const xmlChar *)"way"))
{
- restriction.fromWay = StringToUint((const char *)ref);
+ restriction.fromWay = cast::string_to_uint((const char *)ref);
}
if (xmlStrEqual(role, (const xmlChar *)"via") &&
xmlStrEqual(type, (const xmlChar *)"node"))
{
- restriction.restriction.viaNode = StringToUint((const char *)ref);
+ restriction.restriction.viaNode = cast::string_to_uint((const char *)ref);
}
if (nullptr != type)
@@ -231,7 +232,7 @@ ExtractionWay XMLParser::ReadXMLWay()
xmlStrEqual(child_name, (const xmlChar *)"way") == 1)
{
xmlChar *way_id = xmlTextReaderGetAttribute(inputReader, (const xmlChar *)"id");
- way.id = StringToUint((char *)way_id);
+ way.id = cast::string_to_uint((char *)way_id);
xmlFree(way_id);
xmlFree(child_name);
break;
@@ -265,7 +266,7 @@ ExtractionWay XMLParser::ReadXMLWay()
xmlChar *ref = xmlTextReaderGetAttribute(inputReader, (const xmlChar *)"ref");
if (ref != nullptr)
{
- way.path.push_back(StringToUint((const char *)ref));
+ way.path.push_back(cast::string_to_uint((const char *)ref));
xmlFree(ref);
}
}
@@ -281,19 +282,19 @@ ImportNode XMLParser::ReadXMLNode()
xmlChar *attribute = xmlTextReaderGetAttribute(inputReader, (const xmlChar *)"lat");
if (attribute != nullptr)
{
- node.lat = static_cast<int>(COORDINATE_PRECISION * StringToDouble((const char *)attribute));
+ node.lat = static_cast<int>(COORDINATE_PRECISION * cast::string_to_double((const char *)attribute));
xmlFree(attribute);
}
attribute = xmlTextReaderGetAttribute(inputReader, (const xmlChar *)"lon");
if (attribute != nullptr)
{
- node.lon = static_cast<int>(COORDINATE_PRECISION * StringToDouble((const char *)attribute));
+ node.lon = static_cast<int>(COORDINATE_PRECISION * cast::string_to_double((const char *)attribute));
xmlFree(attribute);
}
attribute = xmlTextReaderGetAttribute(inputReader, (const xmlChar *)"id");
if (attribute != nullptr)
{
- node.node_id = StringToUint((const char *)attribute);
+ node.node_id = cast::string_to_uint((const char *)attribute);
xmlFree(attribute);
}
diff --git a/3party/osrm/osrm-backend/Include/osrm/Coordinate.h b/3party/osrm/osrm-backend/Include/osrm/Coordinate.h
index 5426ed3a36..462ac0b63b 100644
--- a/3party/osrm/osrm-backend/Include/osrm/Coordinate.h
+++ b/3party/osrm/osrm-backend/Include/osrm/Coordinate.h
@@ -30,8 +30,9 @@ SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
#include <iosfwd> //for std::ostream
#include <string>
+#include <type_traits>
-const float COORDINATE_PRECISION = 1000000.f;
+constexpr float COORDINATE_PRECISION = 1000000.f;
struct FixedPointCoordinate
{
@@ -40,6 +41,14 @@ struct FixedPointCoordinate
FixedPointCoordinate();
FixedPointCoordinate(int lat, int lon);
+
+ template<class T>
+ FixedPointCoordinate(const T &coordinate) : lat(coordinate.lat), lon(coordinate.lon)
+ {
+ static_assert(std::is_same<decltype(lat), decltype(coordinate.lat)>::value, "coordinate types incompatible");
+ static_assert(std::is_same<decltype(lon), decltype(coordinate.lon)>::value, "coordinate types incompatible");
+ }
+
void Reset();
bool isSet() const;
bool isValid() const;
diff --git a/3party/osrm/osrm-backend/Include/osrm/Header.h b/3party/osrm/osrm-backend/Include/osrm/Header.h
index de0b2abc80..d126c4c989 100644
--- a/3party/osrm/osrm-backend/Include/osrm/Header.h
+++ b/3party/osrm/osrm-backend/Include/osrm/Header.h
@@ -37,7 +37,7 @@ struct Header
{
Header& operator=(const Header& other) = default;
Header(const std::string & name, const std::string & value) : name(name), value(value) {}
- Header(const Header && other) : name(std::move(other.name)), value(std::move(other.value)) {}
+ Header(Header && other) : name(std::move(other.name)), value(std::move(other.value)) {}
void Clear()
{
diff --git a/3party/osrm/osrm-backend/Include/osrm/RouteParameters.h b/3party/osrm/osrm-backend/Include/osrm/RouteParameters.h
index 33a8296c35..62f45148a5 100644
--- a/3party/osrm/osrm-backend/Include/osrm/RouteParameters.h
+++ b/3party/osrm/osrm-backend/Include/osrm/RouteParameters.h
@@ -41,6 +41,8 @@ struct RouteParameters
void setZoomLevel(const short level);
+ void setNumberOfResults(const short number);
+
void setAlternateRouteFlag(const bool flag);
void setUTurn(const bool flag);
@@ -77,6 +79,7 @@ struct RouteParameters
bool deprecatedAPI;
bool uturn_default;
unsigned check_sum;
+ short num_results;
std::string service;
std::string output_format;
std::string jsonp_parameter;
diff --git a/3party/osrm/osrm-backend/Library/OSRM.h b/3party/osrm/osrm-backend/Library/OSRM.h
index 16b9977cc0..372e82c391 100644
--- a/3party/osrm/osrm-backend/Library/OSRM.h
+++ b/3party/osrm/osrm-backend/Library/OSRM.h
@@ -30,6 +30,8 @@ SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
#include <osrm/ServerPaths.h>
+#include <memory>
+
class OSRM_impl;
struct RouteParameters;
@@ -41,10 +43,10 @@ class Reply;
class OSRM
{
private:
- OSRM_impl *OSRM_pimpl_;
+ std::unique_ptr<OSRM_impl> OSRM_pimpl_;
public:
- explicit OSRM(const ServerPaths &paths, const bool use_shared_memory = false);
+ explicit OSRM(ServerPaths paths, const bool use_shared_memory = false);
~OSRM();
void RunQuery(RouteParameters &route_parameters, http::Reply &reply);
};
diff --git a/3party/osrm/osrm-backend/Library/OSRM_impl.cpp b/3party/osrm/osrm-backend/Library/OSRM_impl.cpp
index 5c20b5aefd..c5417187be 100644
--- a/3party/osrm/osrm-backend/Library/OSRM_impl.cpp
+++ b/3party/osrm/osrm-backend/Library/OSRM_impl.cpp
@@ -45,7 +45,9 @@ namespace boost { namespace interprocess { class named_mutex; } }
#include "../Server/DataStructures/InternalDataFacade.h"
#include "../Server/DataStructures/SharedBarriers.h"
#include "../Server/DataStructures/SharedDataFacade.h"
-#include "../Util/SimpleLogger.h"
+#include "../Util/make_unique.hpp"
+#include "../Util/ProgramOptions.h"
+#include "../Util/simple_logger.hpp"
#include <boost/assert.hpp>
#include <boost/interprocess/sync/named_condition.hpp>
@@ -56,16 +58,17 @@ namespace boost { namespace interprocess { class named_mutex; } }
#include <utility>
#include <vector>
-OSRM_impl::OSRM_impl(const ServerPaths &server_paths, const bool use_shared_memory)
- : use_shared_memory(use_shared_memory)
+OSRM_impl::OSRM_impl(ServerPaths server_paths, const bool use_shared_memory)
{
if (use_shared_memory)
{
- barrier = new SharedBarriers();
+ barrier = osrm::make_unique<SharedBarriers>();
query_data_facade = new SharedDataFacade<QueryEdge::EdgeData>();
}
else
{
+ // populate base path
+ populate_base_path(server_paths);
query_data_facade = new InternalDataFacade<QueryEdge::EdgeData>(server_paths);
}
@@ -85,10 +88,6 @@ OSRM_impl::~OSRM_impl()
{
delete plugin_pointer.second;
}
- if (use_shared_memory)
- {
- delete barrier;
- }
}
void OSRM_impl::RegisterPlugin(BasePlugin *plugin)
@@ -108,7 +107,7 @@ void OSRM_impl::RunQuery(RouteParameters &route_parameters, http::Reply &reply)
if (plugin_map.end() != iter)
{
reply.status = http::Reply::ok;
- if (use_shared_memory)
+ if (barrier)
{
// lock update pending
boost::interprocess::scoped_lock<boost::interprocess::named_mutex> pending_lock(
@@ -129,7 +128,7 @@ void OSRM_impl::RunQuery(RouteParameters &route_parameters, http::Reply &reply)
}
iter->second->HandleRequest(route_parameters, reply);
- if (use_shared_memory)
+ if (barrier)
{
// lock query
boost::interprocess::scoped_lock<boost::interprocess::named_mutex> query_lock(
@@ -154,12 +153,12 @@ void OSRM_impl::RunQuery(RouteParameters &route_parameters, http::Reply &reply)
// proxy code for compilation firewall
-OSRM::OSRM(const ServerPaths &paths, const bool use_shared_memory)
- : OSRM_pimpl_(new OSRM_impl(paths, use_shared_memory))
+OSRM::OSRM(ServerPaths paths, const bool use_shared_memory)
+ : OSRM_pimpl_(osrm::make_unique<OSRM_impl>(paths, use_shared_memory))
{
}
-OSRM::~OSRM() { delete OSRM_pimpl_; }
+OSRM::~OSRM() { OSRM_pimpl_.reset(); }
void OSRM::RunQuery(RouteParameters &route_parameters, http::Reply &reply)
{
diff --git a/3party/osrm/osrm-backend/Library/OSRM_impl.h b/3party/osrm/osrm-backend/Library/OSRM_impl.h
index 8ad98bbda5..a4af62cb65 100644
--- a/3party/osrm/osrm-backend/Library/OSRM_impl.h
+++ b/3party/osrm/osrm-backend/Library/OSRM_impl.h
@@ -36,6 +36,7 @@ struct RouteParameters;
#include "../DataStructures/QueryEdge.h"
+#include <memory>
#include <unordered_map>
#include <string>
@@ -45,10 +46,10 @@ template <class EdgeDataT> class BaseDataFacade;
class OSRM_impl
{
private:
- typedef std::unordered_map<std::string, BasePlugin *> PluginMap;
+ using PluginMap = std::unordered_map<std::string, BasePlugin *>;
public:
- OSRM_impl(const ServerPaths &paths, const bool use_shared_memory);
+ OSRM_impl(ServerPaths paths, const bool use_shared_memory);
OSRM_impl(const OSRM_impl &) = delete;
virtual ~OSRM_impl();
void RunQuery(RouteParameters &route_parameters, http::Reply &reply);
@@ -56,8 +57,8 @@ class OSRM_impl
private:
void RegisterPlugin(BasePlugin *plugin);
PluginMap plugin_map;
- bool use_shared_memory;
- SharedBarriers *barrier;
+ // will only be initialized if shared memory is used
+ std::unique_ptr<SharedBarriers> barrier;
// base class pointer to the objects
BaseDataFacade<QueryEdge::EdgeData> *query_data_facade;
};
diff --git a/3party/osrm/osrm-backend/Plugins/DistanceTablePlugin.h b/3party/osrm/osrm-backend/Plugins/DistanceTablePlugin.h
index d3e307b54b..715c4f52cf 100644
--- a/3party/osrm/osrm-backend/Plugins/DistanceTablePlugin.h
+++ b/3party/osrm/osrm-backend/Plugins/DistanceTablePlugin.h
@@ -35,7 +35,7 @@ SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
#include "../DataStructures/QueryEdge.h"
#include "../DataStructures/SearchEngine.h"
#include "../Descriptors/BaseDescriptor.h"
-#include "../Util/SimpleLogger.h"
+#include "../Util/make_unique.hpp"
#include "../Util/StringUtil.h"
#include "../Util/TimingUtil.h"
@@ -47,22 +47,22 @@ SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
#include <string>
#include <vector>
-template <class DataFacadeT> class DistanceTablePlugin : public BasePlugin
+template <class DataFacadeT> class DistanceTablePlugin final : public BasePlugin
{
private:
- std::shared_ptr<SearchEngine<DataFacadeT>> search_engine_ptr;
+ std::unique_ptr<SearchEngine<DataFacadeT>> search_engine_ptr;
public:
explicit DistanceTablePlugin(DataFacadeT *facade) : descriptor_string("table"), facade(facade)
{
- search_engine_ptr = std::make_shared<SearchEngine<DataFacadeT>>(facade);
+ search_engine_ptr = osrm::make_unique<SearchEngine<DataFacadeT>>(facade);
}
virtual ~DistanceTablePlugin() {}
- const std::string GetDescriptor() const { return descriptor_string; }
+ const std::string GetDescriptor() const final { return descriptor_string; }
- void HandleRequest(const RouteParameters &route_parameters, http::Reply &reply)
+ void HandleRequest(const RouteParameters &route_parameters, http::Reply &reply) final
{
// check number of parameters
if (2 > route_parameters.coordinates.size())
@@ -77,7 +77,9 @@ template <class DataFacadeT> class DistanceTablePlugin : public BasePlugin
if (std::any_of(begin(route_parameters.coordinates),
end(route_parameters.coordinates),
[&](FixedPointCoordinate coordinate)
- { return !coordinate.isValid(); }))
+ {
+ return !coordinate.isValid();
+ }))
{
reply = http::Reply::StockReply(http::Reply::badRequest);
return;
@@ -98,7 +100,7 @@ template <class DataFacadeT> class DistanceTablePlugin : public BasePlugin
!route_parameters.hints[i].empty())
{
PhantomNode current_phantom_node;
- DecodeObjectFromBase64(route_parameters.hints[i], current_phantom_node);
+ ObjectEncoder::DecodeFromBase64(route_parameters.hints[i], current_phantom_node);
if (current_phantom_node.isValid(facade->GetNumberOfNodes()))
{
phantom_node_vector[i].emplace_back(std::move(current_phantom_node));
diff --git a/3party/osrm/osrm-backend/Plugins/HelloWorldPlugin.h b/3party/osrm/osrm-backend/Plugins/HelloWorldPlugin.h
index 2d99a1093f..d9b4a8d0e2 100644
--- a/3party/osrm/osrm-backend/Plugins/HelloWorldPlugin.h
+++ b/3party/osrm/osrm-backend/Plugins/HelloWorldPlugin.h
@@ -30,11 +30,11 @@ SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
#include "BasePlugin.h"
#include "../DataStructures/JSONContainer.h"
-#include "../Util/StringUtil.h"
+#include "../Util/cast.hpp"
#include <string>
-class HelloWorldPlugin : public BasePlugin
+class HelloWorldPlugin final : public BasePlugin
{
private:
std::string temp_string;
@@ -42,9 +42,9 @@ class HelloWorldPlugin : public BasePlugin
public:
HelloWorldPlugin() : descriptor_string("hello") {}
virtual ~HelloWorldPlugin() {}
- const std::string GetDescriptor() const { return descriptor_string; }
+ const std::string GetDescriptor() const final { return descriptor_string; }
- void HandleRequest(const RouteParameters &routeParameters, http::Reply &reply)
+ void HandleRequest(const RouteParameters &routeParameters, http::Reply &reply) final
{
reply.status = http::Reply::ok;
@@ -52,20 +52,22 @@ class HelloWorldPlugin : public BasePlugin
std::string temp_string;
json_result.values["title"] = "Hello World";
- temp_string = IntToString(routeParameters.zoom_level);
+ temp_string = cast::integral_to_string(routeParameters.zoom_level);
json_result.values["zoom_level"] = temp_string;
- temp_string = UintToString(routeParameters.check_sum);
+ temp_string = cast::integral_to_string(routeParameters.check_sum);
json_result.values["check_sum"] = temp_string;
json_result.values["instructions"] = (routeParameters.print_instructions ? "yes" : "no");
json_result.values["geometry"] = (routeParameters.geometry ? "yes" : "no");
json_result.values["compression"] = (routeParameters.compression ? "yes" : "no");
- json_result.values["output_format"] = (!routeParameters.output_format.empty() ? "yes" : "no");
+ json_result.values["output_format"] =
+ (!routeParameters.output_format.empty() ? "yes" : "no");
- json_result.values["jsonp_parameter"] = (!routeParameters.jsonp_parameter.empty() ? "yes" : "no");
+ json_result.values["jsonp_parameter"] =
+ (!routeParameters.jsonp_parameter.empty() ? "yes" : "no");
json_result.values["language"] = (!routeParameters.language.empty() ? "yes" : "no");
- temp_string = UintToString(static_cast<unsigned>(routeParameters.coordinates.size()));
+ temp_string = cast::integral_to_string(routeParameters.coordinates.size());
json_result.values["location_count"] = temp_string;
JSON::Array json_locations;
@@ -77,7 +79,7 @@ class HelloWorldPlugin : public BasePlugin
json_coordinates.values.push_back(coordinate.lat / COORDINATE_PRECISION);
json_coordinates.values.push_back(coordinate.lon / COORDINATE_PRECISION);
- json_location.values[UintToString(counter)] = json_coordinates;
+ json_location.values[cast::integral_to_string(counter)] = json_coordinates;
json_locations.values.push_back(json_location);
++counter;
}
diff --git a/3party/osrm/osrm-backend/Plugins/LocatePlugin.h b/3party/osrm/osrm-backend/Plugins/LocatePlugin.h
index 518259d704..1701bbe15a 100644
--- a/3party/osrm/osrm-backend/Plugins/LocatePlugin.h
+++ b/3party/osrm/osrm-backend/Plugins/LocatePlugin.h
@@ -35,17 +35,16 @@ SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
#include <string>
// locates the nearest node in the road network for a given coordinate.
-template <class DataFacadeT> class LocatePlugin : public BasePlugin
+template <class DataFacadeT> class LocatePlugin final : public BasePlugin
{
public:
explicit LocatePlugin(DataFacadeT *facade) : descriptor_string("locate"), facade(facade) {}
- const std::string GetDescriptor() const { return descriptor_string; }
+ const std::string GetDescriptor() const final { return descriptor_string; }
- void HandleRequest(const RouteParameters &route_parameters, http::Reply &reply)
+ void HandleRequest(const RouteParameters &route_parameters, http::Reply &reply) final
{
// check number of parameters
- if (route_parameters.coordinates.empty() ||
- !route_parameters.coordinates.front().isValid())
+ if (route_parameters.coordinates.empty() || !route_parameters.coordinates.front().isValid())
{
reply = http::Reply::StockReply(http::Reply::badRequest);
return;
@@ -63,8 +62,8 @@ template <class DataFacadeT> class LocatePlugin : public BasePlugin
reply.status = http::Reply::ok;
json_result.values["status"] = 0;
JSON::Array json_coordinate;
- json_coordinate.values.push_back(result.lat/COORDINATE_PRECISION);
- json_coordinate.values.push_back(result.lon/COORDINATE_PRECISION);
+ json_coordinate.values.push_back(result.lat / COORDINATE_PRECISION);
+ json_coordinate.values.push_back(result.lon / COORDINATE_PRECISION);
json_result.values["mapped_coordinate"] = json_coordinate;
}
diff --git a/3party/osrm/osrm-backend/Plugins/NearestPlugin.h b/3party/osrm/osrm-backend/Plugins/NearestPlugin.h
index 27bd01692b..e4fec91c19 100644
--- a/3party/osrm/osrm-backend/Plugins/NearestPlugin.h
+++ b/3party/osrm/osrm-backend/Plugins/NearestPlugin.h
@@ -31,6 +31,7 @@ SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
#include "BasePlugin.h"
#include "../DataStructures/JSONContainer.h"
#include "../DataStructures/PhantomNodes.h"
+#include "../DataStructures/Range.h"
#include <string>
@@ -38,14 +39,14 @@ SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
* This Plugin locates the nearest point on a street in the road network for a given coordinate.
*/
-template <class DataFacadeT> class NearestPlugin : public BasePlugin
+template <class DataFacadeT> class NearestPlugin final : public BasePlugin
{
public:
explicit NearestPlugin(DataFacadeT *facade) : facade(facade), descriptor_string("nearest") {}
- const std::string GetDescriptor() const { return descriptor_string; }
+ const std::string GetDescriptor() const final { return descriptor_string; }
- void HandleRequest(const RouteParameters &route_parameters, http::Reply &reply)
+ void HandleRequest(const RouteParameters &route_parameters, http::Reply &reply) final
{
// check number of parameters
if (route_parameters.coordinates.empty() || !route_parameters.coordinates.front().isValid())
@@ -53,12 +54,12 @@ template <class DataFacadeT> class NearestPlugin : public BasePlugin
reply = http::Reply::StockReply(http::Reply::badRequest);
return;
}
-
+ auto number_of_results = static_cast<std::size_t>(route_parameters.num_results);
std::vector<PhantomNode> phantom_node_vector;
facade->IncrementalFindPhantomNodeForCoordinate(route_parameters.coordinates.front(),
phantom_node_vector,
route_parameters.zoom_level,
- 1);
+ static_cast<int>(number_of_results));
JSON::Object json_result;
if (phantom_node_vector.empty() || !phantom_node_vector.front().isValid())
@@ -69,17 +70,41 @@ template <class DataFacadeT> class NearestPlugin : public BasePlugin
{
reply.status = http::Reply::ok;
json_result.values["status"] = 0;
- JSON::Array json_coordinate;
- json_coordinate.values.push_back(phantom_node_vector.front().location.lat /
- COORDINATE_PRECISION);
- json_coordinate.values.push_back(phantom_node_vector.front().location.lon /
- COORDINATE_PRECISION);
- json_result.values["mapped_coordinate"] = json_coordinate;
- std::string temp_string;
- facade->GetName(phantom_node_vector.front().name_id, temp_string);
- json_result.values["name"] = temp_string;
- }
+ if (number_of_results > 1)
+ {
+ JSON::Array results;
+
+ auto vector_length = phantom_node_vector.size();
+ for (const auto i : osrm::irange<std::size_t>(0, std::min(number_of_results, vector_length)))
+ {
+ JSON::Array json_coordinate;
+ JSON::Object result;
+ json_coordinate.values.push_back(phantom_node_vector.at(i).location.lat /
+ COORDINATE_PRECISION);
+ json_coordinate.values.push_back(phantom_node_vector.at(i).location.lon /
+ COORDINATE_PRECISION);
+ result.values["mapped coordinate"] = json_coordinate;
+ std::string temp_string;
+ facade->GetName(phantom_node_vector.front().name_id, temp_string);
+ result.values["name"] = temp_string;
+ results.values.push_back(result);
+ }
+ json_result.values["results"] = results;
+ }
+ else
+ {
+ JSON::Array json_coordinate;
+ json_coordinate.values.push_back(phantom_node_vector.front().location.lat /
+ COORDINATE_PRECISION);
+ json_coordinate.values.push_back(phantom_node_vector.front().location.lon /
+ COORDINATE_PRECISION);
+ json_result.values["mapped_coordinate"] = json_coordinate;
+ std::string temp_string;
+ facade->GetName(phantom_node_vector.front().name_id, temp_string);
+ json_result.values["name"] = temp_string;
+ }
+ }
JSON::render(reply.content, json_result);
}
diff --git a/3party/osrm/osrm-backend/Plugins/TimestampPlugin.h b/3party/osrm/osrm-backend/Plugins/TimestampPlugin.h
index 63f63b2db0..0047db199b 100644
--- a/3party/osrm/osrm-backend/Plugins/TimestampPlugin.h
+++ b/3party/osrm/osrm-backend/Plugins/TimestampPlugin.h
@@ -33,15 +33,15 @@ SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
#include <string>
-template <class DataFacadeT> class TimestampPlugin : public BasePlugin
+template <class DataFacadeT> class TimestampPlugin final : public BasePlugin
{
public:
explicit TimestampPlugin(const DataFacadeT *facade)
: facade(facade), descriptor_string("timestamp")
{
}
- const std::string GetDescriptor() const { return descriptor_string; }
- void HandleRequest(const RouteParameters &route_parameters, http::Reply &reply)
+ const std::string GetDescriptor() const final { return descriptor_string; }
+ void HandleRequest(const RouteParameters &route_parameters, http::Reply &reply) final
{
reply.status = http::Reply::ok;
JSON::Object json_result;
diff --git a/3party/osrm/osrm-backend/Plugins/ViaRoutePlugin.h b/3party/osrm/osrm-backend/Plugins/ViaRoutePlugin.h
index 491fff08f4..7bd4b70ecd 100644
--- a/3party/osrm/osrm-backend/Plugins/ViaRoutePlugin.h
+++ b/3party/osrm/osrm-backend/Plugins/ViaRoutePlugin.h
@@ -31,13 +31,13 @@ SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
#include "BasePlugin.h"
#include "../Algorithms/ObjectToBase64.h"
-
#include "../DataStructures/QueryEdge.h"
#include "../DataStructures/SearchEngine.h"
#include "../Descriptors/BaseDescriptor.h"
#include "../Descriptors/GPXDescriptor.h"
#include "../Descriptors/JSONDescriptor.h"
-#include "../Util/SimpleLogger.h"
+#include "../Util/make_unique.hpp"
+#include "../Util/simple_logger.hpp"
#include "../Util/StringUtil.h"
#include "../Util/TimingUtil.h"
@@ -49,16 +49,16 @@ SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
#include <string>
#include <vector>
-template <class DataFacadeT> class ViaRoutePlugin : public BasePlugin
+template <class DataFacadeT> class ViaRoutePlugin final : public BasePlugin
{
private:
std::unordered_map<std::string, unsigned> descriptor_table;
- std::shared_ptr<SearchEngine<DataFacadeT>> search_engine_ptr;
+ std::unique_ptr<SearchEngine<DataFacadeT>> search_engine_ptr;
public:
explicit ViaRoutePlugin(DataFacadeT *facade) : descriptor_string("viaroute"), facade(facade)
{
- search_engine_ptr = std::make_shared<SearchEngine<DataFacadeT>>(facade);
+ search_engine_ptr = osrm::make_unique<SearchEngine<DataFacadeT>>(facade);
descriptor_table.emplace("json", 0);
descriptor_table.emplace("gpx", 1);
@@ -67,16 +67,18 @@ template <class DataFacadeT> class ViaRoutePlugin : public BasePlugin
virtual ~ViaRoutePlugin() {}
- const std::string GetDescriptor() const { return descriptor_string; }
+ const std::string GetDescriptor() const final { return descriptor_string; }
- void HandleRequest(const RouteParameters &route_parameters, http::Reply &reply)
+ void HandleRequest(const RouteParameters &route_parameters, http::Reply &reply) final
{
// check number of parameters
if (2 > route_parameters.coordinates.size() ||
std::any_of(begin(route_parameters.coordinates),
end(route_parameters.coordinates),
[&](FixedPointCoordinate coordinate)
- { return !coordinate.isValid(); }))
+ {
+ return !coordinate.isValid();
+ }))
{
reply = http::Reply::StockReply(http::Reply::badRequest);
return;
@@ -97,7 +99,7 @@ template <class DataFacadeT> class ViaRoutePlugin : public BasePlugin
if (checksum_OK && i < route_parameters.hints.size() &&
!route_parameters.hints[i].empty())
{
- DecodeObjectFromBase64(route_parameters.hints[i], phantom_node_vector[i]);
+ ObjectEncoder::DecodeFromBase64(route_parameters.hints[i], phantom_node_vector[i]);
if (phantom_node_vector[i].isValid(facade->GetNumberOfNodes()))
{
continue;
@@ -125,7 +127,8 @@ template <class DataFacadeT> class ViaRoutePlugin : public BasePlugin
}
else
{
- search_engine_ptr->shortest_path(raw_route.segment_end_coordinates, route_parameters.uturns, raw_route);
+ search_engine_ptr->shortest_path(
+ raw_route.segment_end_coordinates, route_parameters.uturns, raw_route);
}
if (INVALID_EDGE_WEIGHT == raw_route.shortest_path_length)
diff --git a/3party/osrm/osrm-backend/README.md b/3party/osrm/osrm-backend/README.md
index 442ccf906a..624cc1da77 100644
--- a/3party/osrm/osrm-backend/README.md
+++ b/3party/osrm/osrm-backend/README.md
@@ -36,6 +36,6 @@ When using the code in a (scientific) publication, please cite
| build config | branch | status |
|:-------------|:--------|:------------|
| Linux | master | [![Build Status](https://travis-ci.org/Project-OSRM/osrm-backend.png?branch=master)](https://travis-ci.org/DennisOSRM/Project-OSRM) |
-| Lunux | develop | [![Build Status](https://travis-ci.org/Project-OSRM/osrm-backend.png?branch=develop)](https://travis-ci.org/DennisOSRM/Project-OSRM) |
+| Linux | develop | [![Build Status](https://travis-ci.org/Project-OSRM/osrm-backend.png?branch=develop)](https://travis-ci.org/DennisOSRM/Project-OSRM) |
| Windows | master/develop | [![Build status](https://ci.appveyor.com/api/projects/status/4iuo3s9gxprmcjjh)](https://ci.appveyor.com/project/DennisOSRM/osrm-backend) |
| LUAbind fork | master | [![Build Status](https://travis-ci.org/DennisOSRM/luabind.png?branch=master)](https://travis-ci.org/DennisOSRM/luabind) |
diff --git a/3party/osrm/osrm-backend/Rakefile b/3party/osrm/osrm-backend/Rakefile
index 006961ebc5..562823b8ae 100644
--- a/3party/osrm/osrm-backend/Rakefile
+++ b/3party/osrm/osrm-backend/Rakefile
@@ -6,7 +6,7 @@ require 'sys/proctable'
BUILD_FOLDER = 'build'
DATA_FOLDER = 'sandbox'
-PROFILE = 'examples/postgis'
+PROFILE = 'bicycle'
OSRM_PORT = 5000
PROFILES_FOLDER = '../profiles'
@@ -181,3 +181,9 @@ end
desc "Stop, reprocess and restart."
task :update => [:down,:process,:up] do
end
+
+
+desc "Remove test cache files."
+task :sweep do
+ system "rm test/cache/*"
+end
diff --git a/3party/osrm/osrm-backend/RoutingAlgorithms/AlternativePathRouting.h b/3party/osrm/osrm-backend/RoutingAlgorithms/AlternativePathRouting.h
index 897def587c..83875f3d04 100644
--- a/3party/osrm/osrm-backend/RoutingAlgorithms/AlternativePathRouting.h
+++ b/3party/osrm/osrm-backend/RoutingAlgorithms/AlternativePathRouting.h
@@ -31,6 +31,7 @@ SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
#include "BasicRoutingInterface.h"
#include "../DataStructures/Range.h"
#include "../DataStructures/SearchEngineData.h"
+#include "../Util/container.hpp"
#include <boost/assert.hpp>
@@ -43,12 +44,12 @@ const double VIAPATH_ALPHA = 0.10;
const double VIAPATH_EPSILON = 0.15; // alternative at most 15% longer
const double VIAPATH_GAMMA = 0.75; // alternative shares at most 75% with the shortest.
-template <class DataFacadeT> class AlternativeRouting : private BasicRoutingInterface<DataFacadeT>
+template <class DataFacadeT> class AlternativeRouting final : private BasicRoutingInterface<DataFacadeT>
{
- typedef BasicRoutingInterface<DataFacadeT> super;
- typedef typename DataFacadeT::EdgeData EdgeData;
- typedef SearchEngineData::QueryHeap QueryHeap;
- typedef std::pair<NodeID, NodeID> SearchSpaceEdge;
+ using super = BasicRoutingInterface<DataFacadeT>;
+ using EdgeData = typename DataFacadeT::EdgeData;
+ using QueryHeap = SearchEngineData::QueryHeap;
+ using SearchSpaceEdge = std::pair<NodeID, NodeID>;
struct RankedCandidateNode
{
@@ -172,7 +173,7 @@ template <class DataFacadeT> class AlternativeRouting : private BasicRoutingInte
return;
}
- sort_unique_resize(via_node_candidate_list);
+ osrm::sort_unique_resize(via_node_candidate_list);
std::vector<NodeID> packed_forward_path;
std::vector<NodeID> packed_reverse_path;
diff --git a/3party/osrm/osrm-backend/RoutingAlgorithms/BasicRoutingInterface.h b/3party/osrm/osrm-backend/RoutingAlgorithms/BasicRoutingInterface.h
index c7491bd024..72f1155e54 100644
--- a/3party/osrm/osrm-backend/RoutingAlgorithms/BasicRoutingInterface.h
+++ b/3party/osrm/osrm-backend/RoutingAlgorithms/BasicRoutingInterface.h
@@ -31,8 +31,7 @@ SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
#include "../DataStructures/RawRouteData.h"
#include "../DataStructures/SearchEngineData.h"
#include "../DataStructures/TurnInstructions.h"
-#include "../Util/ContainerUtils.h"
-#include "../Util/SimpleLogger.h"
+// #include "../Util/simple_logger.hpp.h"
#include <boost/assert.hpp>
@@ -98,7 +97,7 @@ template <class DataFacadeT> class BasicRoutingInterface
// Stalling
for (const auto edge : facade->GetAdjacentEdgeRange(node))
{
- const EdgeData &data = facade->GetEdgeData(edge, node);
+ const EdgeData &data = facade->GetEdgeData(edge);
const bool reverse_flag = ((!forward_direction) ? data.forward : data.backward);
if (reverse_flag)
{
@@ -119,7 +118,7 @@ template <class DataFacadeT> class BasicRoutingInterface
for (const auto edge : facade->GetAdjacentEdgeRange(node))
{
- const EdgeData &data = facade->GetEdgeData(edge, node);
+ const EdgeData &data = facade->GetEdgeData(edge);
bool forward_directionFlag = (forward_direction ? data.forward : data.backward);
if (forward_directionFlag)
{
@@ -164,7 +163,6 @@ template <class DataFacadeT> class BasicRoutingInterface
recursion_stack.emplace(packed_path[i - 1], packed_path[i]);
}
- unpacked_path.emplace_back(packed_path[0], INVALID_EDGE_WEIGHT, TurnInstruction::NoTurn, INVALID_EDGE_WEIGHT);
std::pair<NodeID, NodeID> edge;
while (!recursion_stack.empty())
{
@@ -181,17 +179,14 @@ template <class DataFacadeT> class BasicRoutingInterface
// facade->FindEdge does not suffice here in case of shortcuts.
// The above explanation unclear? Think!
EdgeID smaller_edge_id = SPECIAL_EDGEID;
- NodeID smaller_node_id = SPECIAL_NODEID;
int edge_weight = std::numeric_limits<EdgeWeight>::max();
for (const auto edge_id : facade->GetAdjacentEdgeRange(edge.first))
{
- auto const & edgeData = facade->GetEdgeData(edge_id, edge.first);
- const int weight = edgeData.distance;
+ const int weight = facade->GetEdgeData(edge_id).distance;
if ((facade->GetTarget(edge_id) == edge.second) && (weight < edge_weight) &&
- edgeData.forward)
+ facade->GetEdgeData(edge_id).forward)
{
smaller_edge_id = edge_id;
- smaller_node_id = edge.first;
edge_weight = weight;
}
}
@@ -207,20 +202,18 @@ template <class DataFacadeT> class BasicRoutingInterface
{
for (const auto edge_id : facade->GetAdjacentEdgeRange(edge.second))
{
- auto const & edgeData = facade->GetEdgeData(edge_id, edge.second);
- const int weight = edgeData.distance;
+ const int weight = facade->GetEdgeData(edge_id).distance;
if ((facade->GetTarget(edge_id) == edge.first) && (weight < edge_weight) &&
- edgeData.backward)
+ facade->GetEdgeData(edge_id).backward)
{
smaller_edge_id = edge_id;
- smaller_node_id = edge.second;
edge_weight = weight;
}
}
}
BOOST_ASSERT_MSG(edge_weight != INVALID_EDGE_WEIGHT, "edge id invalid");
- const EdgeData &ed = facade->GetEdgeData(smaller_edge_id, smaller_node_id);
+ const EdgeData &ed = facade->GetEdgeData(smaller_edge_id);
if (ed.shortcut)
{ // unpack
const NodeID middle_node_id = ed.id;
@@ -230,91 +223,91 @@ template <class DataFacadeT> class BasicRoutingInterface
}
else
{
- unpacked_path.emplace_back(edge.second,
- INVALID_EDGE_WEIGHT,
- TurnInstruction::NoTurn,
- ed.distance);
-// BOOST_ASSERT_MSG(!ed.shortcut, "original edge flagged as shortcut");
-// unsigned name_index = facade->GetNameIndexFromEdgeID(ed.id);
-// const TurnInstruction turn_instruction = facade->GetTurnInstructionForEdgeID(ed.id);
-
-// if (!facade->EdgeIsCompressed(ed.id))
-// {
-// BOOST_ASSERT(!facade->EdgeIsCompressed(ed.id));
-// unpacked_path.emplace_back(facade->GetGeometryIndexForEdgeID(ed.id),
-// name_index,
-// turn_instruction,
-// ed.distance);
-// }
-// else
-// {
-// std::vector<unsigned> id_vector;
-// facade->GetUncompressedGeometry(facade->GetGeometryIndexForEdgeID(ed.id),
-// id_vector);
-
-// const std::size_t start_index =
-// (unpacked_path.empty()
-// ? ((start_traversed_in_reverse)
-// ? id_vector.size() -
-// phantom_node_pair.source_phantom.fwd_segment_position - 1
-// : phantom_node_pair.source_phantom.fwd_segment_position)
-// : 0);
-// const std::size_t end_index = id_vector.size();
-
-// BOOST_ASSERT(start_index >= 0);
-// BOOST_ASSERT(start_index <= end_index);
-// for (std::size_t i = start_index; i < end_index; ++i)
-// {
-// unpacked_path.emplace_back(id_vector[i], name_index, TurnInstruction::NoTurn, 0);
-// }
-// unpacked_path.back().turn_instruction = turn_instruction;
-// unpacked_path.back().segment_duration = ed.distance;
-// }
+ BOOST_ASSERT_MSG(!ed.shortcut, "original edge flagged as shortcut");
+ unsigned name_index = facade->GetNameIndexFromEdgeID(ed.id);
+ const TurnInstruction turn_instruction = facade->GetTurnInstructionForEdgeID(ed.id);
+ const TravelMode travel_mode = facade->GetTravelModeForEdgeID(ed.id);
+
+
+ if (!facade->EdgeIsCompressed(ed.id))
+ {
+ BOOST_ASSERT(!facade->EdgeIsCompressed(ed.id));
+ unpacked_path.emplace_back(facade->GetGeometryIndexForEdgeID(ed.id),
+ name_index,
+ turn_instruction,
+ ed.distance,
+ travel_mode);
+ }
+ else
+ {
+ std::vector<unsigned> id_vector;
+ facade->GetUncompressedGeometry(facade->GetGeometryIndexForEdgeID(ed.id),
+ id_vector);
+
+ const std::size_t start_index =
+ (unpacked_path.empty()
+ ? ((start_traversed_in_reverse)
+ ? id_vector.size() -
+ phantom_node_pair.source_phantom.fwd_segment_position - 1
+ : phantom_node_pair.source_phantom.fwd_segment_position)
+ : 0);
+ const std::size_t end_index = id_vector.size();
+
+ BOOST_ASSERT(start_index >= 0);
+ BOOST_ASSERT(start_index <= end_index);
+ for (std::size_t i = start_index; i < end_index; ++i)
+ {
+ unpacked_path.emplace_back(id_vector[i], name_index, TurnInstruction::NoTurn, 0, travel_mode);
+ }
+ unpacked_path.back().turn_instruction = turn_instruction;
+ unpacked_path.back().segment_duration = ed.distance;
+ }
+ }
+ }
+ if (SPECIAL_EDGEID != phantom_node_pair.target_phantom.packed_geometry_id)
+ {
+ std::vector<unsigned> id_vector;
+ facade->GetUncompressedGeometry(phantom_node_pair.target_phantom.packed_geometry_id,
+ id_vector);
+ const bool is_local_path = (phantom_node_pair.source_phantom.packed_geometry_id ==
+ phantom_node_pair.target_phantom.packed_geometry_id) &&
+ unpacked_path.empty();
+
+ std::size_t start_index = 0;
+ if (is_local_path)
+ {
+ start_index = phantom_node_pair.source_phantom.fwd_segment_position;
+ if (target_traversed_in_reverse)
+ {
+ start_index =
+ id_vector.size() - phantom_node_pair.source_phantom.fwd_segment_position;
+ }
+ }
+
+ std::size_t end_index = phantom_node_pair.target_phantom.fwd_segment_position;
+ if (target_traversed_in_reverse)
+ {
+ std::reverse(id_vector.begin(), id_vector.end());
+ end_index =
+ id_vector.size() - phantom_node_pair.target_phantom.fwd_segment_position;
+ }
+
+ if (start_index > end_index)
+ {
+ start_index = std::min(start_index, id_vector.size()-1);
+ }
+
+ for (std::size_t i = start_index; i != end_index; (start_index < end_index ? ++i : --i))
+ {
+ BOOST_ASSERT(i < id_vector.size());
+ BOOST_ASSERT(phantom_node_pair.target_phantom.forward_travel_mode>0 );
+ unpacked_path.emplace_back(PathData{id_vector[i],
+ phantom_node_pair.target_phantom.name_id,
+ TurnInstruction::NoTurn,
+ 0,
+ phantom_node_pair.target_phantom.forward_travel_mode});
}
}
-// if (SPECIAL_EDGEID != phantom_node_pair.target_phantom.packed_geometry_id)
-// {
-// std::vector<unsigned> id_vector;
-// facade->GetUncompressedGeometry(phantom_node_pair.target_phantom.packed_geometry_id,
-// id_vector);
-// const bool is_local_path = (phantom_node_pair.source_phantom.packed_geometry_id ==
-// phantom_node_pair.target_phantom.packed_geometry_id) &&
-// unpacked_path.empty();
-
-// std::size_t start_index = 0;
-// if (is_local_path)
-// {
-// start_index = phantom_node_pair.source_phantom.fwd_segment_position;
-// if (target_traversed_in_reverse)
-// {
-// start_index =
-// id_vector.size() - phantom_node_pair.source_phantom.fwd_segment_position;
-// }
-// }
-
-// std::size_t end_index = phantom_node_pair.target_phantom.fwd_segment_position;
-// if (target_traversed_in_reverse)
-// {
-// std::reverse(id_vector.begin(), id_vector.end());
-// end_index =
-// id_vector.size() - phantom_node_pair.target_phantom.fwd_segment_position;
-// }
-
-// if (start_index > end_index)
-// {
-// start_index = std::min(start_index, id_vector.size()-1);
-// }
-
-// SimpleLogger().Write() << "start_index: " << start_index << ", end_index: " << end_index;
-// for (std::size_t i = start_index; i != end_index; (start_index < end_index ? ++i : --i))
-// {
-// BOOST_ASSERT(i < id_vector.size());
-// unpacked_path.emplace_back(PathData{id_vector[i],
-// phantom_node_pair.target_phantom.name_id,
-// TurnInstruction::NoTurn,
-// 0});
-// }
-// }
// there is no equivalent to a node-based node in an edge-expanded graph.
// two equivalent routes may start (or end) at different node-based edges
@@ -349,17 +342,14 @@ template <class DataFacadeT> class BasicRoutingInterface
recursion_stack.pop();
EdgeID smaller_edge_id = SPECIAL_EDGEID;
- NodeID smaller_node_id = SPECIAL_NODEID;
int edge_weight = std::numeric_limits<EdgeWeight>::max();
for (const auto edge_id : facade->GetAdjacentEdgeRange(edge.first))
{
- auto const & edgeData = facade->GetEdgeData(edge_id, edge.first);
- const int weight = edgeData.distance;
+ const int weight = facade->GetEdgeData(edge_id).distance;
if ((facade->GetTarget(edge_id) == edge.second) && (weight < edge_weight) &&
- edgeData.forward)
+ facade->GetEdgeData(edge_id).forward)
{
smaller_edge_id = edge_id;
- smaller_node_id = edge.first;
edge_weight = weight;
}
}
@@ -368,20 +358,18 @@ template <class DataFacadeT> class BasicRoutingInterface
{
for (const auto edge_id : facade->GetAdjacentEdgeRange(edge.second))
{
- auto const & edgeData = facade->GetEdgeData(edge_id, edge.second);
- const int weight = edgeData.distance;
+ const int weight = facade->GetEdgeData(edge_id).distance;
if ((facade->GetTarget(edge_id) == edge.first) && (weight < edge_weight) &&
- edgeData.backward)
+ facade->GetEdgeData(edge_id).backward)
{
smaller_edge_id = edge_id;
- smaller_node_id = edge.second;
edge_weight = weight;
}
}
}
BOOST_ASSERT_MSG(edge_weight != std::numeric_limits<EdgeWeight>::max(), "edge weight invalid");
- const EdgeData &ed = facade->GetEdgeData(smaller_edge_id, smaller_node_id);
+ const EdgeData &ed = facade->GetEdgeData(smaller_edge_id);
if (ed.shortcut)
{ // unpack
const NodeID middle_node_id = ed.id;
diff --git a/3party/osrm/osrm-backend/RoutingAlgorithms/ManyToManyRouting.h b/3party/osrm/osrm-backend/RoutingAlgorithms/ManyToManyRouting.h
index 7819c676d6..6761c25ca8 100644
--- a/3party/osrm/osrm-backend/RoutingAlgorithms/ManyToManyRouting.h
+++ b/3party/osrm/osrm-backend/RoutingAlgorithms/ManyToManyRouting.h
@@ -39,10 +39,10 @@ SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
#include <unordered_map>
#include <vector>
-template <class DataFacadeT> class ManyToManyRouting : public BasicRoutingInterface<DataFacadeT>
+template <class DataFacadeT> class ManyToManyRouting final : public BasicRoutingInterface<DataFacadeT>
{
- typedef BasicRoutingInterface<DataFacadeT> super;
- typedef SearchEngineData::QueryHeap QueryHeap;
+ using super = BasicRoutingInterface<DataFacadeT>;
+ using QueryHeap = SearchEngineData::QueryHeap;
SearchEngineData &engine_working_data;
struct NodeBucket
@@ -54,7 +54,7 @@ template <class DataFacadeT> class ManyToManyRouting : public BasicRoutingInterf
{
}
};
- typedef std::unordered_map<NodeID, std::vector<NodeBucket>> SearchSpaceWithBuckets;
+ using SearchSpaceWithBuckets = std::unordered_map<NodeID, std::vector<NodeBucket>>;
public:
ManyToManyRouting(DataFacadeT *facade, SearchEngineData &engine_working_data)
diff --git a/3party/osrm/osrm-backend/RoutingAlgorithms/ShortestPathRouting.h b/3party/osrm/osrm-backend/RoutingAlgorithms/ShortestPathRouting.h
index 997cc644ef..4670eedf57 100644
--- a/3party/osrm/osrm-backend/RoutingAlgorithms/ShortestPathRouting.h
+++ b/3party/osrm/osrm-backend/RoutingAlgorithms/ShortestPathRouting.h
@@ -35,10 +35,10 @@ SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
#include "../DataStructures/SearchEngineData.h"
#include "../typedefs.h"
-template <class DataFacadeT> class ShortestPathRouting : public BasicRoutingInterface<DataFacadeT>
+template <class DataFacadeT> class ShortestPathRouting final : public BasicRoutingInterface<DataFacadeT>
{
- typedef BasicRoutingInterface<DataFacadeT> super;
- typedef SearchEngineData::QueryHeap QueryHeap;
+ using super = BasicRoutingInterface<DataFacadeT>;
+ using QueryHeap = SearchEngineData::QueryHeap;
SearchEngineData &engine_working_data;
public:
diff --git a/3party/osrm/osrm-backend/Server/APIGrammar.h b/3party/osrm/osrm-backend/Server/APIGrammar.h
index ddf53ce719..83a5cd03b3 100644
--- a/3party/osrm/osrm-backend/Server/APIGrammar.h
+++ b/3party/osrm/osrm-backend/Server/APIGrammar.h
@@ -40,7 +40,7 @@ struct APIGrammar : qi::grammar<Iterator>
explicit APIGrammar(HandlerT * h) : APIGrammar::base_type(api_call), handler(h)
{
api_call = qi::lit('/') >> string[boost::bind(&HandlerT::setService, handler, ::_1)] >> *(query) >> -(uturns);
- query = ('?') >> (+(zoom | output | jsonp | checksum | location | hint | u | cmp | language | instruction | geometry | alt_route | old_API));
+ query = ('?') >> (+(zoom | output | jsonp | checksum | location | hint | u | cmp | language | instruction | geometry | alt_route | old_API | num_results) ) ;
zoom = (-qi::lit('&')) >> qi::lit('z') >> '=' >> qi::short_[boost::bind(&HandlerT::setZoomLevel, handler, ::_1)];
output = (-qi::lit('&')) >> qi::lit("output") >> '=' >> string[boost::bind(&HandlerT::setOutputFormat, handler, ::_1)];
@@ -56,6 +56,7 @@ struct APIGrammar : qi::grammar<Iterator>
language = (-qi::lit('&')) >> qi::lit("hl") >> '=' >> string[boost::bind(&HandlerT::setLanguage, handler, ::_1)];
alt_route = (-qi::lit('&')) >> qi::lit("alt") >> '=' >> qi::bool_[boost::bind(&HandlerT::setAlternateRouteFlag, handler, ::_1)];
old_API = (-qi::lit('&')) >> qi::lit("geomformat") >> '=' >> string[boost::bind(&HandlerT::setDeprecatedAPIFlag, handler, ::_1)];
+ num_results = (-qi::lit('&')) >> qi::lit("num_results") >> '=' >> qi::short_[boost::bind(&HandlerT::setNumberOfResults, handler, ::_1)];
string = +(qi::char_("a-zA-Z"));
stringwithDot = +(qi::char_("a-zA-Z0-9_.-"));
@@ -65,7 +66,7 @@ struct APIGrammar : qi::grammar<Iterator>
qi::rule<Iterator> api_call, query;
qi::rule<Iterator, std::string()> service, zoom, output, string, jsonp, checksum, location, hint,
stringwithDot, stringwithPercent, language, instruction, geometry,
- cmp, alt_route, u, uturns, old_API ;
+ cmp, alt_route, u, uturns, old_API, num_results;
HandlerT * handler;
};
diff --git a/3party/osrm/osrm-backend/Server/DataStructures/BaseDataFacade.h b/3party/osrm/osrm-backend/Server/DataStructures/BaseDataFacade.h
index 11e5dc30d3..f4a4fe18b0 100644
--- a/3party/osrm/osrm-backend/Server/DataStructures/BaseDataFacade.h
+++ b/3party/osrm/osrm-backend/Server/DataStructures/BaseDataFacade.h
@@ -39,7 +39,7 @@ SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
#include "../../Util/StringUtil.h"
#include "../../typedefs.h"
-#include "../../Include/osrm/Coordinate.h"
+#include <osrm/Coordinate.h>
#include <string>
@@ -62,7 +62,7 @@ template <class EdgeDataT> class BaseDataFacade
virtual NodeID GetTarget(const EdgeID e) const = 0;
- virtual EdgeDataT &GetEdgeData(const EdgeID e) = 0;
+ // virtual EdgeDataT &GetEdgeData(const EdgeID e) = 0;
virtual EdgeDataT GetEdgeData(const EdgeID e, NodeID node)
{
@@ -70,8 +70,6 @@ template <class EdgeDataT> class BaseDataFacade
return edge;
}
- // virtual const EdgeDataT &GetEdgeData( const EdgeID e ) const = 0;
-
virtual EdgeID BeginEdges(const NodeID n) const = 0;
virtual EdgeID EndEdges(const NodeID n) const = 0;
@@ -98,6 +96,8 @@ template <class EdgeDataT> class BaseDataFacade
virtual TurnInstruction GetTurnInstructionForEdgeID(const unsigned id) const = 0;
+ virtual TravelMode GetTravelModeForEdgeID(const unsigned id) const = 0;
+
virtual bool LocateClosestEndPointForCoordinate(const FixedPointCoordinate &input_coordinate,
FixedPointCoordinate &result,
const unsigned zoom_level = 18) = 0;
@@ -106,10 +106,11 @@ template <class EdgeDataT> class BaseDataFacade
PhantomNode &resulting_phantom_node,
const unsigned zoom_level) = 0;
- virtual bool IncrementalFindPhantomNodeForCoordinate(const FixedPointCoordinate &input_coordinate,
- std::vector<PhantomNode> &resulting_phantom_node_vector,
- const unsigned zoom_level,
- const unsigned number_of_results) = 0;
+ virtual bool
+ IncrementalFindPhantomNodeForCoordinate(const FixedPointCoordinate &input_coordinate,
+ std::vector<PhantomNode> &resulting_phantom_node_vector,
+ const unsigned zoom_level,
+ const unsigned number_of_results) = 0;
virtual unsigned GetCheckSum() const = 0;
diff --git a/3party/osrm/osrm-backend/Server/DataStructures/InternalDataFacade.h b/3party/osrm/osrm-backend/Server/DataStructures/InternalDataFacade.h
index 1c622e67ff..93c212d004 100644
--- a/3party/osrm/osrm-backend/Server/DataStructures/InternalDataFacade.h
+++ b/3party/osrm/osrm-backend/Server/DataStructures/InternalDataFacade.h
@@ -42,7 +42,7 @@ SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
#include "../../Util/BoostFileSystemFix.h"
#include "../../Util/GraphLoader.h"
#include "../../Util/ProgramOptions.h"
-#include "../../Util/SimpleLogger.h"
+#include "../../Util/simple_logger.hpp"
#include <osrm/Coordinate.h>
@@ -66,13 +66,14 @@ template <class EdgeDataT> class InternalDataFacade : public BaseDataFacade<Edge
ShM<NodeID, false>::vector m_via_node_list;
ShM<unsigned, false>::vector m_name_ID_list;
ShM<TurnInstruction, false>::vector m_turn_instruction_list;
+ ShM<TravelMode, false>::vector m_travel_mode_list;
ShM<char, false>::vector m_names_char_list;
- ShM<bool, false>::vector m_egde_is_compressed;
+ ShM<bool, false>::vector m_edge_is_compressed;
ShM<unsigned, false>::vector m_geometry_indices;
ShM<unsigned, false>::vector m_geometry_list;
- boost::thread_specific_ptr<StaticRTree<RTreeLeaf, ShM<FixedPointCoordinate, false>::vector, false>>
- m_static_rtree;
+ boost::thread_specific_ptr<
+ StaticRTree<RTreeLeaf, ShM<FixedPointCoordinate, false>::vector, false>> m_static_rtree;
boost::filesystem::path ram_index_path;
boost::filesystem::path file_index_path;
RangeTable<16, false> m_name_table;
@@ -145,7 +146,8 @@ template <class EdgeDataT> class InternalDataFacade : public BaseDataFacade<Edge
m_via_node_list.resize(number_of_edges);
m_name_ID_list.resize(number_of_edges);
m_turn_instruction_list.resize(number_of_edges);
- m_egde_is_compressed.resize(number_of_edges);
+ m_travel_mode_list.resize(number_of_edges);
+ m_edge_is_compressed.resize(number_of_edges);
unsigned compressed = 0;
@@ -156,8 +158,9 @@ template <class EdgeDataT> class InternalDataFacade : public BaseDataFacade<Edge
m_via_node_list[i] = current_edge_data.via_node;
m_name_ID_list[i] = current_edge_data.name_id;
m_turn_instruction_list[i] = current_edge_data.turn_instruction;
- m_egde_is_compressed[i] = current_edge_data.compressed_geometry;
- if (m_egde_is_compressed[i])
+ m_travel_mode_list[i] = current_edge_data.travel_mode;
+ m_edge_is_compressed[i] = current_edge_data.compressed_geometry;
+ if (m_edge_is_compressed[i])
{
++compressed;
}
@@ -199,8 +202,7 @@ template <class EdgeDataT> class InternalDataFacade : public BaseDataFacade<Edge
BOOST_ASSERT_MSG(!m_coordinate_list->empty(), "coordinates must be loaded before r-tree");
m_static_rtree.reset(
- new StaticRTree<RTreeLeaf>(ram_index_path, file_index_path, m_coordinate_list)
- );
+ new StaticRTree<RTreeLeaf>(ram_index_path, file_index_path, m_coordinate_list));
}
void LoadStreetNames(const boost::filesystem::path &names_file)
@@ -289,7 +291,7 @@ template <class EdgeDataT> class InternalDataFacade : public BaseDataFacade<Edge
SimpleLogger().Write() << "loading graph data";
AssertPathExists(hsgr_path);
LoadGraph(hsgr_path);
- SimpleLogger().Write() << "loading egde information";
+ SimpleLogger().Write() << "loading edge information";
AssertPathExists(nodes_data_path);
AssertPathExists(edges_data_path);
LoadNodeAndEdgeInformation(nodes_data_path, edges_data_path);
@@ -307,59 +309,64 @@ template <class EdgeDataT> class InternalDataFacade : public BaseDataFacade<Edge
}
// search graph access
- unsigned GetNumberOfNodes() const { return m_query_graph->GetNumberOfNodes(); }
+ unsigned GetNumberOfNodes() const final { return m_query_graph->GetNumberOfNodes(); }
- unsigned GetNumberOfEdges() const { return m_query_graph->GetNumberOfEdges(); }
+ unsigned GetNumberOfEdges() const final { return m_query_graph->GetNumberOfEdges(); }
- unsigned GetOutDegree(const NodeID n) const { return m_query_graph->GetOutDegree(n); }
+ unsigned GetOutDegree(const NodeID n) const final { return m_query_graph->GetOutDegree(n); }
- NodeID GetTarget(const EdgeID e) const { return m_query_graph->GetTarget(e); }
+ NodeID GetTarget(const EdgeID e) const final { return m_query_graph->GetTarget(e); }
- EdgeDataT &GetEdgeData(const EdgeID e) { return m_query_graph->GetEdgeData(e); }
+ // EdgeDataT &GetEdgeData(const EdgeID e) final { return m_query_graph->GetEdgeData(e); }
- const EdgeDataT &GetEdgeData(const EdgeID e) const { return m_query_graph->GetEdgeData(e); }
+ EdgeDataT &GetEdgeData(const EdgeID e) const final { return m_query_graph->GetEdgeData(e); }
- EdgeID BeginEdges(const NodeID n) const { return m_query_graph->BeginEdges(n); }
+ EdgeID BeginEdges(const NodeID n) const final { return m_query_graph->BeginEdges(n); }
- EdgeID EndEdges(const NodeID n) const { return m_query_graph->EndEdges(n); }
+ EdgeID EndEdges(const NodeID n) const final { return m_query_graph->EndEdges(n); }
- EdgeRange GetAdjacentEdgeRange(const NodeID node) const
+ EdgeRange GetAdjacentEdgeRange(const NodeID node) const final
{
return m_query_graph->GetAdjacentEdgeRange(node);
};
// searches for a specific edge
- EdgeID FindEdge(const NodeID from, const NodeID to) const
+ EdgeID FindEdge(const NodeID from, const NodeID to) const final
{
return m_query_graph->FindEdge(from, to);
}
- EdgeID FindEdgeInEitherDirection(const NodeID from, const NodeID to) const
+ EdgeID FindEdgeInEitherDirection(const NodeID from, const NodeID to) const final
{
return m_query_graph->FindEdgeInEitherDirection(from, to);
}
- EdgeID FindEdgeIndicateIfReverse(const NodeID from, const NodeID to, bool &result) const
+ EdgeID FindEdgeIndicateIfReverse(const NodeID from, const NodeID to, bool &result) const final
{
return m_query_graph->FindEdgeIndicateIfReverse(from, to, result);
}
// node and edge information access
- FixedPointCoordinate GetCoordinateOfNode(const unsigned id) const
+ FixedPointCoordinate GetCoordinateOfNode(const unsigned id) const final
{
return m_coordinate_list->at(id);
};
- bool EdgeIsCompressed(const unsigned id) const { return m_egde_is_compressed.at(id); }
+ bool EdgeIsCompressed(const unsigned id) const { return m_edge_is_compressed.at(id); }
- TurnInstruction GetTurnInstructionForEdgeID(const unsigned id) const
+ TurnInstruction GetTurnInstructionForEdgeID(const unsigned id) const final
{
return m_turn_instruction_list.at(id);
}
+ TravelMode GetTravelModeForEdgeID(const unsigned id) const
+ {
+ return m_travel_mode_list.at(id);
+ }
+
bool LocateClosestEndPointForCoordinate(const FixedPointCoordinate &input_coordinate,
FixedPointCoordinate &result,
- const unsigned zoom_level = 18)
+ const unsigned zoom_level = 18) final
{
if (!m_static_rtree.get())
{
@@ -372,7 +379,7 @@ template <class EdgeDataT> class InternalDataFacade : public BaseDataFacade<Edge
bool FindPhantomNodeForCoordinate(const FixedPointCoordinate &input_coordinate,
PhantomNode &resulting_phantom_node,
- const unsigned zoom_level)
+ const unsigned zoom_level) final
{
if (!m_static_rtree.get())
{
@@ -387,7 +394,7 @@ template <class EdgeDataT> class InternalDataFacade : public BaseDataFacade<Edge
IncrementalFindPhantomNodeForCoordinate(const FixedPointCoordinate &input_coordinate,
std::vector<PhantomNode> &resulting_phantom_node_vector,
const unsigned zoom_level,
- const unsigned number_of_results)
+ const unsigned number_of_results) final
{
if (!m_static_rtree.get())
{
@@ -398,14 +405,14 @@ template <class EdgeDataT> class InternalDataFacade : public BaseDataFacade<Edge
input_coordinate, resulting_phantom_node_vector, zoom_level, number_of_results);
}
- unsigned GetCheckSum() const { return m_check_sum; }
+ unsigned GetCheckSum() const final { return m_check_sum; }
- unsigned GetNameIndexFromEdgeID(const unsigned id) const
+ unsigned GetNameIndexFromEdgeID(const unsigned id) const final
{
return m_name_ID_list.at(id);
};
- void GetName(const unsigned name_id, std::string &result) const
+ void GetName(const unsigned name_id, std::string &result) const final
{
if (UINT_MAX == name_id)
{
@@ -424,13 +431,13 @@ template <class EdgeDataT> class InternalDataFacade : public BaseDataFacade<Edge
}
}
- virtual unsigned GetGeometryIndexForEdgeID(const unsigned id) const
+ virtual unsigned GetGeometryIndexForEdgeID(const unsigned id) const final
{
return m_via_node_list.at(id);
}
- virtual void GetUncompressedGeometry(const unsigned id, std::vector<unsigned> &result_nodes)
- const
+ virtual void GetUncompressedGeometry(const unsigned id,
+ std::vector<unsigned> &result_nodes) const final
{
const unsigned begin = m_geometry_indices.at(id);
const unsigned end = m_geometry_indices.at(id + 1);
@@ -440,7 +447,7 @@ template <class EdgeDataT> class InternalDataFacade : public BaseDataFacade<Edge
result_nodes.begin(), m_geometry_list.begin() + begin, m_geometry_list.begin() + end);
}
- std::string GetTimestamp() const { return m_timestamp; }
+ std::string GetTimestamp() const final { return m_timestamp; }
};
#endif // INTERNAL_DATA_FACADE
diff --git a/3party/osrm/osrm-backend/Server/DataStructures/SharedDataFacade.h b/3party/osrm/osrm-backend/Server/DataStructures/SharedDataFacade.h
index 6eef51bdc7..835a50f273 100644
--- a/3party/osrm/osrm-backend/Server/DataStructures/SharedDataFacade.h
+++ b/3party/osrm/osrm-backend/Server/DataStructures/SharedDataFacade.h
@@ -38,7 +38,8 @@ SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
#include "../../DataStructures/StaticRTree.h"
#include "../../Util/BoostFileSystemFix.h"
#include "../../Util/ProgramOptions.h"
-#include "../../Util/SimpleLogger.h"
+#include "../../Util/make_unique.hpp"
+#include "../../Util/simple_logger.hpp"
#include <algorithm>
#include <memory>
@@ -55,8 +56,9 @@ template <class EdgeDataT> class SharedDataFacade : public BaseDataFacade<EdgeDa
typedef typename RangeTable<16, true>::BlockT NameIndexBlock;
typedef typename QueryGraph::InputEdge InputEdge;
typedef typename super::RTreeLeaf RTreeLeaf;
- typedef typename StaticRTree<RTreeLeaf, ShM<FixedPointCoordinate, true>::vector, true>::TreeNode
- RTreeNode;
+ using SharedRTree = StaticRTree<RTreeLeaf, ShM<FixedPointCoordinate, true>::vector, true>;
+ using TimeStampedRTreePair = std::pair<unsigned, std::shared_ptr<SharedRTree>>;
+ using RTreeNode = typename SharedRTree::TreeNode;
SharedDataLayout *data_layout;
char *shared_memory;
@@ -67,24 +69,23 @@ template <class EdgeDataT> class SharedDataFacade : public BaseDataFacade<EdgeDa
unsigned CURRENT_TIMESTAMP;
unsigned m_check_sum;
- unsigned m_number_of_nodes;
- std::shared_ptr<QueryGraph> m_query_graph;
- std::shared_ptr<SharedMemory> m_layout_memory;
- std::shared_ptr<SharedMemory> m_large_memory;
+ std::unique_ptr<QueryGraph> m_query_graph;
+ std::unique_ptr<SharedMemory> m_layout_memory;
+ std::unique_ptr<SharedMemory> m_large_memory;
std::string m_timestamp;
std::shared_ptr<ShM<FixedPointCoordinate, true>::vector> m_coordinate_list;
ShM<NodeID, true>::vector m_via_node_list;
ShM<unsigned, true>::vector m_name_ID_list;
ShM<TurnInstruction, true>::vector m_turn_instruction_list;
+ ShM<TravelMode, true>::vector m_travel_mode_list;
ShM<char, true>::vector m_names_char_list;
ShM<unsigned, true>::vector m_name_begin_indices;
- ShM<bool, true>::vector m_egde_is_compressed;
+ ShM<bool, true>::vector m_edge_is_compressed;
ShM<unsigned, true>::vector m_geometry_indices;
ShM<unsigned, true>::vector m_geometry_list;
- boost::thread_specific_ptr<StaticRTree<RTreeLeaf, ShM<FixedPointCoordinate, true>::vector, true>>
- m_static_rtree;
+ boost::thread_specific_ptr<std::pair<unsigned, std::shared_ptr<SharedRTree>>> m_static_rtree;
boost::filesystem::path file_index_path;
std::shared_ptr<RangeTable<16, true>> m_name_table;
@@ -112,18 +113,16 @@ template <class EdgeDataT> class SharedDataFacade : public BaseDataFacade<EdgeDa
RTreeNode *tree_ptr =
data_layout->GetBlockPtr<RTreeNode>(shared_memory, SharedDataLayout::R_SEARCH_TREE);
- m_static_rtree.reset(
- new StaticRTree<RTreeLeaf, ShM<FixedPointCoordinate, true>::vector, true>(
+ m_static_rtree.reset(new TimeStampedRTreePair(CURRENT_TIMESTAMP,
+ osrm::make_unique<SharedRTree>(
tree_ptr,
data_layout->num_entries[SharedDataLayout::R_SEARCH_TREE],
file_index_path,
- m_coordinate_list)
- );
+ m_coordinate_list)));
}
void LoadGraph()
{
- m_number_of_nodes = data_layout->num_entries[SharedDataLayout::GRAPH_NODE_LIST];
GraphNode *graph_nodes_ptr =
data_layout->GetBlockPtr<GraphNode>(shared_memory, SharedDataLayout::GRAPH_NODE_LIST);
@@ -142,9 +141,16 @@ template <class EdgeDataT> class SharedDataFacade : public BaseDataFacade<EdgeDa
FixedPointCoordinate *coordinate_list_ptr = data_layout->GetBlockPtr<FixedPointCoordinate>(
shared_memory, SharedDataLayout::COORDINATE_LIST);
- m_coordinate_list = std::make_shared<ShM<FixedPointCoordinate, true>::vector>(
+ m_coordinate_list = osrm::make_unique<ShM<FixedPointCoordinate, true>::vector>(
coordinate_list_ptr, data_layout->num_entries[SharedDataLayout::COORDINATE_LIST]);
+ TravelMode *travel_mode_list_ptr = data_layout->GetBlockPtr<TravelMode>(
+ shared_memory, SharedDataLayout::TRAVEL_MODE);
+ typename ShM<TravelMode, true>::vector travel_mode_list(
+ travel_mode_list_ptr,
+ data_layout->num_entries[SharedDataLayout::TRAVEL_MODE]);
+ m_travel_mode_list.swap(travel_mode_list);
+
TurnInstruction *turn_instruction_list_ptr = data_layout->GetBlockPtr<TurnInstruction>(
shared_memory, SharedDataLayout::TURN_INSTRUCTION);
typename ShM<TurnInstruction, true>::vector turn_instruction_list(
@@ -183,8 +189,8 @@ template <class EdgeDataT> class SharedDataFacade : public BaseDataFacade<EdgeDa
data_layout->GetBlockPtr<char>(shared_memory, SharedDataLayout::NAME_CHAR_LIST);
typename ShM<char, true>::vector names_char_list(
names_list_ptr, data_layout->num_entries[SharedDataLayout::NAME_CHAR_LIST]);
- m_name_table = std::make_shared<RangeTable<16, true>>(
- name_offsets, name_blocks, names_char_list.size());
+ m_name_table = osrm::make_unique<RangeTable<16, true>>(
+ name_offsets, name_blocks, static_cast<unsigned>(names_char_list.size()));
m_names_char_list.swap(names_char_list);
}
@@ -193,10 +199,10 @@ template <class EdgeDataT> class SharedDataFacade : public BaseDataFacade<EdgeDa
{
unsigned *geometries_compressed_ptr = data_layout->GetBlockPtr<unsigned>(
shared_memory, SharedDataLayout::GEOMETRIES_INDICATORS);
- typename ShM<bool, true>::vector egde_is_compressed(
+ typename ShM<bool, true>::vector edge_is_compressed(
geometries_compressed_ptr,
data_layout->num_entries[SharedDataLayout::GEOMETRIES_INDICATORS]);
- m_egde_is_compressed.swap(egde_is_compressed);
+ m_edge_is_compressed.swap(edge_is_compressed);
unsigned *geometries_index_ptr =
data_layout->GetBlockPtr<unsigned>(shared_memory, SharedDataLayout::GEOMETRIES_INDEX);
@@ -218,7 +224,6 @@ template <class EdgeDataT> class SharedDataFacade : public BaseDataFacade<EdgeDa
{
data_timestamp_ptr = (SharedDataTimestamp *)SharedMemoryFactory::Get(
CURRENT_REGIONS, sizeof(SharedDataTimestamp), false, false)->Ptr();
-
CURRENT_LAYOUT = LAYOUT_NONE;
CURRENT_DATA = DATA_NONE;
CURRENT_TIMESTAMP = 0;
@@ -271,7 +276,7 @@ template <class EdgeDataT> class SharedDataFacade : public BaseDataFacade<EdgeDa
SimpleLogger().Write() << "number of geometries: " << m_coordinate_list->size();
for (unsigned i = 0; i < m_coordinate_list->size(); ++i)
{
- if(!GetCoordinateOfNode(i).isValid())
+ if (!GetCoordinateOfNode(i).isValid())
{
SimpleLogger().Write() << "coordinate " << i << " not valid";
}
@@ -280,55 +285,54 @@ template <class EdgeDataT> class SharedDataFacade : public BaseDataFacade<EdgeDa
}
// search graph access
- unsigned GetNumberOfNodes() const { return m_query_graph->GetNumberOfNodes(); }
+ unsigned GetNumberOfNodes() const final { return m_query_graph->GetNumberOfNodes(); }
- unsigned GetNumberOfEdges() const { return m_query_graph->GetNumberOfEdges(); }
+ unsigned GetNumberOfEdges() const final { return m_query_graph->GetNumberOfEdges(); }
- unsigned GetOutDegree(const NodeID n) const { return m_query_graph->GetOutDegree(n); }
+ unsigned GetOutDegree(const NodeID n) const final { return m_query_graph->GetOutDegree(n); }
- NodeID GetTarget(const EdgeID e) const { return m_query_graph->GetTarget(e); }
+ NodeID GetTarget(const EdgeID e) const final { return m_query_graph->GetTarget(e); }
- EdgeDataT &GetEdgeData(const EdgeID e) { return m_query_graph->GetEdgeData(e); }
+ EdgeDataT &GetEdgeData(const EdgeID e) const final { return m_query_graph->GetEdgeData(e); }
- // const EdgeDataT &GetEdgeData( const EdgeID e ) const {
- // return m_query_graph->GetEdgeData(e);
- // }
+ EdgeID BeginEdges(const NodeID n) const final { return m_query_graph->BeginEdges(n); }
- EdgeID BeginEdges(const NodeID n) const { return m_query_graph->BeginEdges(n); }
+ EdgeID EndEdges(const NodeID n) const final { return m_query_graph->EndEdges(n); }
- EdgeID EndEdges(const NodeID n) const { return m_query_graph->EndEdges(n); }
-
- EdgeRange GetAdjacentEdgeRange(const NodeID node) const
+ EdgeRange GetAdjacentEdgeRange(const NodeID node) const final
{
return m_query_graph->GetAdjacentEdgeRange(node);
};
// searches for a specific edge
- EdgeID FindEdge(const NodeID from, const NodeID to) const
+ EdgeID FindEdge(const NodeID from, const NodeID to) const final
{
return m_query_graph->FindEdge(from, to);
}
- EdgeID FindEdgeInEitherDirection(const NodeID from, const NodeID to) const
+ EdgeID FindEdgeInEitherDirection(const NodeID from, const NodeID to) const final
{
return m_query_graph->FindEdgeInEitherDirection(from, to);
}
- EdgeID FindEdgeIndicateIfReverse(const NodeID from, const NodeID to, bool &result) const
+ EdgeID FindEdgeIndicateIfReverse(const NodeID from, const NodeID to, bool &result) const final
{
return m_query_graph->FindEdgeIndicateIfReverse(from, to, result);
}
// node and edge information access
- FixedPointCoordinate GetCoordinateOfNode(const NodeID id) const
+ FixedPointCoordinate GetCoordinateOfNode(const NodeID id) const final
{
return m_coordinate_list->at(id);
};
- virtual bool EdgeIsCompressed(const unsigned id) const { return m_egde_is_compressed.at(id); }
+ virtual bool EdgeIsCompressed(const unsigned id) const final
+ {
+ return m_edge_is_compressed.at(id);
+ }
- virtual void GetUncompressedGeometry(const unsigned id, std::vector<unsigned> &result_nodes)
- const
+ virtual void GetUncompressedGeometry(const unsigned id,
+ std::vector<unsigned> &result_nodes) const final
{
const unsigned begin = m_geometry_indices.at(id);
const unsigned end = m_geometry_indices.at(id + 1);
@@ -338,39 +342,44 @@ template <class EdgeDataT> class SharedDataFacade : public BaseDataFacade<EdgeDa
result_nodes.begin(), m_geometry_list.begin() + begin, m_geometry_list.begin() + end);
}
- virtual unsigned GetGeometryIndexForEdgeID(const unsigned id) const
+ virtual unsigned GetGeometryIndexForEdgeID(const unsigned id) const final
{
return m_via_node_list.at(id);
}
- TurnInstruction GetTurnInstructionForEdgeID(const unsigned id) const
+ TurnInstruction GetTurnInstructionForEdgeID(const unsigned id) const final
{
return m_turn_instruction_list.at(id);
}
+ TravelMode GetTravelModeForEdgeID(const unsigned id) const
+ {
+ return m_travel_mode_list.at(id);
+ }
+
bool LocateClosestEndPointForCoordinate(const FixedPointCoordinate &input_coordinate,
FixedPointCoordinate &result,
- const unsigned zoom_level = 18)
+ const unsigned zoom_level = 18) final
{
- if (!m_static_rtree.get())
+ if (!m_static_rtree.get() || CURRENT_TIMESTAMP != m_static_rtree->first)
{
LoadRTree();
}
- return m_static_rtree->LocateClosestEndPointForCoordinate(
+ return m_static_rtree->second->LocateClosestEndPointForCoordinate(
input_coordinate, result, zoom_level);
}
bool FindPhantomNodeForCoordinate(const FixedPointCoordinate &input_coordinate,
PhantomNode &resulting_phantom_node,
- const unsigned zoom_level)
+ const unsigned zoom_level) final
{
- if (!m_static_rtree.get())
+ if (!m_static_rtree.get() || CURRENT_TIMESTAMP != m_static_rtree->first)
{
LoadRTree();
}
- return m_static_rtree->FindPhantomNodeForCoordinate(
+ return m_static_rtree->second->FindPhantomNodeForCoordinate(
input_coordinate, resulting_phantom_node, zoom_level);
}
@@ -378,25 +387,25 @@ template <class EdgeDataT> class SharedDataFacade : public BaseDataFacade<EdgeDa
IncrementalFindPhantomNodeForCoordinate(const FixedPointCoordinate &input_coordinate,
std::vector<PhantomNode> &resulting_phantom_node_vector,
const unsigned zoom_level,
- const unsigned number_of_results)
+ const unsigned number_of_results) final
{
- if (!m_static_rtree.get())
+ if (!m_static_rtree.get() || CURRENT_TIMESTAMP != m_static_rtree->first)
{
LoadRTree();
}
- return m_static_rtree->IncrementalFindPhantomNodeForCoordinate(
+ return m_static_rtree->second->IncrementalFindPhantomNodeForCoordinate(
input_coordinate, resulting_phantom_node_vector, zoom_level, number_of_results);
}
- unsigned GetCheckSum() const { return m_check_sum; }
+ unsigned GetCheckSum() const final { return m_check_sum; }
- unsigned GetNameIndexFromEdgeID(const unsigned id) const
+ unsigned GetNameIndexFromEdgeID(const unsigned id) const final
{
return m_name_ID_list.at(id);
};
- void GetName(const unsigned name_id, std::string &result) const
+ void GetName(const unsigned name_id, std::string &result) const final
{
if (UINT_MAX == name_id)
{
@@ -415,7 +424,7 @@ template <class EdgeDataT> class SharedDataFacade : public BaseDataFacade<EdgeDa
}
}
- std::string GetTimestamp() const { return m_timestamp; }
+ std::string GetTimestamp() const final { return m_timestamp; }
};
#endif // SHARED_DATA_FACADE_H
diff --git a/3party/osrm/osrm-backend/Server/DataStructures/SharedDataType.h b/3party/osrm/osrm-backend/Server/DataStructures/SharedDataType.h
index 98bdfd5deb..5f07f131fc 100644
--- a/3party/osrm/osrm-backend/Server/DataStructures/SharedDataType.h
+++ b/3party/osrm/osrm-backend/Server/DataStructures/SharedDataType.h
@@ -29,14 +29,14 @@ SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
#define SHARED_DATA_TYPE_H_
#include "../../Util/OSRMException.h"
-#include "../../Util/SimpleLogger.h"
+#include "../../Util/simple_logger.hpp"
#include <cstdint>
#include <array>
// Added at the start and end of each block as sanity check
-constexpr char CANARY[] = "OSRM";
+static const char CANARY[] = "OSRM";
struct SharedDataLayout
{
@@ -50,6 +50,7 @@ struct SharedDataLayout
GRAPH_EDGE_LIST,
COORDINATE_LIST,
TURN_INSTRUCTION,
+ TRAVEL_MODE,
R_SEARCH_TREE,
GEOMETRIES_INDEX,
GEOMETRIES_LIST,
@@ -82,6 +83,7 @@ struct SharedDataLayout
SimpleLogger().Write(logDEBUG) << "timestamp_length: " << num_entries[TIMESTAMP];
SimpleLogger().Write(logDEBUG) << "coordinate_list_size: " << num_entries[COORDINATE_LIST];
SimpleLogger().Write(logDEBUG) << "turn_instruction_list_size: " << num_entries[TURN_INSTRUCTION];
+ SimpleLogger().Write(logDEBUG) << "travel_mode_list_size: " << num_entries[TRAVEL_MODE];
SimpleLogger().Write(logDEBUG) << "r_search_tree_size: " << num_entries[R_SEARCH_TREE];
SimpleLogger().Write(logDEBUG) << "geometries_indicators: " << num_entries[GEOMETRIES_INDICATORS]
<< "/" << ((num_entries[GEOMETRIES_INDICATORS] / 8) + 1);
@@ -98,6 +100,7 @@ struct SharedDataLayout
SimpleLogger().Write(logDEBUG) << "GRAPH_EDGE_LIST " << ": " << GetBlockSize(GRAPH_EDGE_LIST );
SimpleLogger().Write(logDEBUG) << "COORDINATE_LIST " << ": " << GetBlockSize(COORDINATE_LIST );
SimpleLogger().Write(logDEBUG) << "TURN_INSTRUCTION " << ": " << GetBlockSize(TURN_INSTRUCTION );
+ SimpleLogger().Write(logDEBUG) << "TRAVEL_MODE " << ": " << GetBlockSize(TRAVEL_MODE );
SimpleLogger().Write(logDEBUG) << "R_SEARCH_TREE " << ": " << GetBlockSize(R_SEARCH_TREE );
SimpleLogger().Write(logDEBUG) << "GEOMETRIES_INDEX " << ": " << GetBlockSize(GEOMETRIES_INDEX );
SimpleLogger().Write(logDEBUG) << "GEOMETRIES_LIST " << ": " << GetBlockSize(GEOMETRIES_LIST );
diff --git a/3party/osrm/osrm-backend/Server/Http/Reply.cpp b/3party/osrm/osrm-backend/Server/Http/Reply.cpp
index b3247ece8c..e2cf0aecf8 100644
--- a/3party/osrm/osrm-backend/Server/Http/Reply.cpp
+++ b/3party/osrm/osrm-backend/Server/Http/Reply.cpp
@@ -27,7 +27,7 @@ SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
#include <osrm/Reply.h>
-#include "../../Util/StringUtil.h"
+#include "../../Util/cast.hpp"
namespace http
{
@@ -38,7 +38,7 @@ void Reply::SetSize(const unsigned size)
{
if ("Content-Length" == h.name)
{
- h.value = UintToString(size);
+ h.value = cast::integral_to_string(size);
}
}
}
@@ -87,8 +87,7 @@ Reply Reply::StockReply(Reply::status_type status)
const std::string status_string = reply.ToString(status);
reply.content.insert(reply.content.end(), status_string.begin(), status_string.end());
reply.headers.emplace_back("Access-Control-Allow-Origin", "*");
- reply.headers.emplace_back("Content-Length",
- UintToString(static_cast<unsigned>(reply.content.size())));
+ reply.headers.emplace_back("Content-Length", cast::integral_to_string(reply.content.size()));
reply.headers.emplace_back("Content-Type", "text/html");
return reply;
}
diff --git a/3party/osrm/osrm-backend/Server/RequestHandler.cpp b/3party/osrm/osrm-backend/Server/RequestHandler.cpp
index 36a2808e8a..b358d8d2da 100644
--- a/3party/osrm/osrm-backend/Server/RequestHandler.cpp
+++ b/3party/osrm/osrm-backend/Server/RequestHandler.cpp
@@ -25,13 +25,14 @@ SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
*/
-#include "APIGrammar.h"
#include "RequestHandler.h"
+
+#include "APIGrammar.h"
#include "Http/Request.h"
#include "../DataStructures/JSONContainer.h"
#include "../Library/OSRM.h"
-#include "../Util/SimpleLogger.h"
+#include "../Util/simple_logger.hpp"
#include "../Util/StringUtil.h"
#include "../typedefs.h"
@@ -61,17 +62,17 @@ void RequestHandler::handle_request(const http::Request &req, http::Reply &reply
// req.agent << ( 0 == req.agent.length() ? "- " :" ") << request;
time_t ltime;
- struct tm *Tm;
+ struct tm *time_stamp;
ltime = time(nullptr);
- Tm = localtime(&ltime);
+ time_stamp = localtime(&ltime);
// log timestamp
- SimpleLogger().Write() << (Tm->tm_mday < 10 ? "0" : "") << Tm->tm_mday << "-"
- << (Tm->tm_mon + 1 < 10 ? "0" : "") << (Tm->tm_mon + 1) << "-"
- << 1900 + Tm->tm_year << " " << (Tm->tm_hour < 10 ? "0" : "")
- << Tm->tm_hour << ":" << (Tm->tm_min < 10 ? "0" : "") << Tm->tm_min
- << ":" << (Tm->tm_sec < 10 ? "0" : "") << Tm->tm_sec << " "
+ SimpleLogger().Write() << (time_stamp->tm_mday < 10 ? "0" : "") << time_stamp->tm_mday << "-"
+ << (time_stamp->tm_mon + 1 < 10 ? "0" : "") << (time_stamp->tm_mon + 1) << "-"
+ << 1900 + time_stamp->tm_year << " " << (time_stamp->tm_hour < 10 ? "0" : "")
+ << time_stamp->tm_hour << ":" << (time_stamp->tm_min < 10 ? "0" : "") << time_stamp->tm_min
+ << ":" << (time_stamp->tm_sec < 10 ? "0" : "") << time_stamp->tm_sec << " "
<< req.endpoint.to_string() << " " << req.referrer
<< (0 == req.referrer.length() ? "- " : " ") << req.agent
<< (0 == req.agent.length() ? "- " : " ") << request;
@@ -87,11 +88,11 @@ void RequestHandler::handle_request(const http::Request &req, http::Reply &reply
{
reply = http::Reply::StockReply(http::Reply::badRequest);
reply.content.clear();
- const unsigned position = static_cast<unsigned>(std::distance(request.begin(), iter));
+ const auto position = std::distance(request.begin(), iter);
JSON::Object json_result;
json_result.values["status"] = 400;
std::string message = "Query string malformed close to position ";
- message += UintToString(position);
+ message += cast::integral_to_string(position);
json_result.values["status_message"] = message;
JSON::render(reply.content, json_result);
return;
@@ -112,8 +113,7 @@ void RequestHandler::handle_request(const http::Request &req, http::Reply &reply
}
// set headers
- reply.headers.emplace_back("Content-Length",
- UintToString(static_cast<unsigned>(reply.content.size())));
+ reply.headers.emplace_back("Content-Length", cast::integral_to_string(reply.content.size()));
if ("gpx" == route_parameters.output_format)
{ // gpx file
reply.headers.emplace_back("Content-Type", "application/gpx+xml; charset=UTF-8");
diff --git a/3party/osrm/osrm-backend/Server/RequestHandler.h b/3party/osrm/osrm-backend/Server/RequestHandler.h
index 462c34ffc2..7263dad4ef 100644
--- a/3party/osrm/osrm-backend/Server/RequestHandler.h
+++ b/3party/osrm/osrm-backend/Server/RequestHandler.h
@@ -44,7 +44,7 @@ class RequestHandler
{
public:
- typedef APIGrammar<std::string::iterator, RouteParameters> APIGrammarParser;
+ using APIGrammarParser = APIGrammar<std::string::iterator, RouteParameters>;
RequestHandler();
RequestHandler(const RequestHandler &) = delete;
diff --git a/3party/osrm/osrm-backend/Server/RequestParser.cpp b/3party/osrm/osrm-backend/Server/RequestParser.cpp
index cad05b97d3..6e9cddf5ee 100644
--- a/3party/osrm/osrm-backend/Server/RequestParser.cpp
+++ b/3party/osrm/osrm-backend/Server/RequestParser.cpp
@@ -25,9 +25,10 @@ SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
*/
-#include "Http/Request.h"
#include "RequestParser.h"
+#include "Http/Request.h"
+
namespace http
{
@@ -264,18 +265,21 @@ RequestParser::consume(Request &req, char input, http::CompressionType *compress
return false;
default: // expecting_newline_3:
return (input == '\n');
- // default:
- // return false;
+ // default:
+ // return false;
}
}
-inline bool RequestParser::isChar(int c) { return c >= 0 && c <= 127; }
+inline bool RequestParser::isChar(int character) { return character >= 0 && character <= 127; }
-inline bool RequestParser::isCTL(int c) { return (c >= 0 && c <= 31) || (c == 127); }
+inline bool RequestParser::isCTL(int character)
+{
+ return (character >= 0 && character <= 31) || (character == 127);
+}
-inline bool RequestParser::isTSpecial(int c)
+inline bool RequestParser::isTSpecial(int character)
{
- switch (c)
+ switch (character)
{
case '(':
case ')':
@@ -302,5 +306,5 @@ inline bool RequestParser::isTSpecial(int c)
}
}
-inline bool RequestParser::isDigit(int c) { return c >= '0' && c <= '9'; }
+inline bool RequestParser::isDigit(int character) { return character >= '0' && character <= '9'; }
}
diff --git a/3party/osrm/osrm-backend/Server/Server.h b/3party/osrm/osrm-backend/Server/Server.h
index d5dab1ff3f..8e0b101302 100644
--- a/3party/osrm/osrm-backend/Server/Server.h
+++ b/3party/osrm/osrm-backend/Server/Server.h
@@ -28,14 +28,18 @@ SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
#ifndef SERVER_H
#define SERVER_H
-#include "../Util/StringUtil.h"
-
#include "Connection.h"
#include "RequestHandler.h"
+#include "../Util/cast.hpp"
+#include "../Util/make_unique.hpp"
+#include "../Util/simple_logger.hpp"
+
#include <boost/asio.hpp>
#include <boost/bind.hpp>
+#include <zlib.h>
+
#include <functional>
#include <memory>
#include <thread>
@@ -44,11 +48,21 @@ SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
class Server
{
public:
+
+ // Note: returns a shared instead of a unique ptr as it is captured in a lambda somewhere else
+ static std::shared_ptr<Server> CreateServer(std::string &ip_address, int ip_port, unsigned requested_num_threads)
+ {
+ SimpleLogger().Write() << "http 1.1 compression handled by zlib version " << zlibVersion();
+ const unsigned hardware_threads = std::max(1u, std::thread::hardware_concurrency());
+ const unsigned real_num_threads = std::min(hardware_threads, requested_num_threads);
+ return std::make_shared<Server>(ip_address, ip_port, real_num_threads);
+ }
+
explicit Server(const std::string &address, const int port, const unsigned thread_pool_size)
: thread_pool_size(thread_pool_size), acceptor(io_service),
- new_connection(new http::Connection(io_service, request_handler)), request_handler()
+ new_connection(std::make_shared<http::Connection>(io_service, request_handler)), request_handler()
{
- const std::string port_string = IntToString(port);
+ const std::string port_string = cast::integral_to_string(port);
boost::asio::ip::tcp::resolver resolver(io_service);
boost::asio::ip::tcp::resolver::query query(address, port_string);
@@ -63,9 +77,6 @@ class Server
boost::bind(&Server::HandleAccept, this, boost::asio::placeholders::error));
}
- // Server() = delete;
- // Server(const Server &) = delete;
-
void Run()
{
std::vector<std::shared_ptr<std::thread>> threads;
@@ -75,9 +86,9 @@ class Server
boost::bind(&boost::asio::io_service::run, &io_service));
threads.push_back(thread);
}
- for (unsigned i = 0; i < threads.size(); ++i)
+ for (auto thread : threads)
{
- threads[i]->join();
+ thread->join();
}
}
@@ -91,7 +102,7 @@ class Server
if (!e)
{
new_connection->start();
- new_connection.reset(new http::Connection(io_service, request_handler));
+ new_connection = std::make_shared<http::Connection>(io_service, request_handler);
acceptor.async_accept(
new_connection->socket(),
boost::bind(&Server::HandleAccept, this, boost::asio::placeholders::error));
diff --git a/3party/osrm/osrm-backend/ThirdParty/variant/recursive_wrapper.hpp b/3party/osrm/osrm-backend/ThirdParty/variant/recursive_wrapper.hpp
new file mode 100644
index 0000000000..54b27634a3
--- /dev/null
+++ b/3party/osrm/osrm-backend/ThirdParty/variant/recursive_wrapper.hpp
@@ -0,0 +1,127 @@
+#ifndef MAPBOX_UTIL_VARIANT_RECURSIVE_WRAPPER_HPP
+#define MAPBOX_UTIL_VARIANT_RECURSIVE_WRAPPER_HPP
+
+#include <utility>
+
+namespace mapbox { namespace util {
+
+template <typename T>
+class recursive_wrapper
+{
+public:
+ using type = T;
+private:
+
+ T* p_;
+
+public:
+
+ ~recursive_wrapper();
+ recursive_wrapper();
+
+ recursive_wrapper(recursive_wrapper const& operand);
+ recursive_wrapper(T const& operand);
+ recursive_wrapper(recursive_wrapper&& operand);
+ recursive_wrapper(T&& operand);
+
+private:
+
+ void assign(const T& rhs);
+
+public:
+
+ inline recursive_wrapper& operator=(recursive_wrapper const& rhs)
+ {
+ assign( rhs.get() );
+ return *this;
+ }
+
+ inline recursive_wrapper& operator=(T const& rhs)
+ {
+ assign( rhs );
+ return *this;
+ }
+
+ inline void swap(recursive_wrapper& operand) noexcept
+ {
+ T* temp = operand.p_;
+ operand.p_ = p_;
+ p_ = temp;
+ }
+
+
+ recursive_wrapper& operator=(recursive_wrapper&& rhs) noexcept
+ {
+ swap(rhs);
+ return *this;
+ }
+
+ recursive_wrapper& operator=(T&& rhs)
+ {
+ get() = std::move(rhs);
+ return *this;
+ }
+
+
+public:
+
+ T& get() { return *get_pointer(); }
+ const T& get() const { return *get_pointer(); }
+ T* get_pointer() { return p_; }
+ const T* get_pointer() const { return p_; }
+ operator T const&() const { return this->get(); }
+ operator T&() { return this->get(); }
+};
+
+template <typename T>
+recursive_wrapper<T>::~recursive_wrapper()
+{
+ delete p_;
+}
+
+template <typename T>
+recursive_wrapper<T>::recursive_wrapper()
+ : p_(new T)
+{
+}
+
+template <typename T>
+recursive_wrapper<T>::recursive_wrapper(recursive_wrapper const& operand)
+ : p_(new T( operand.get() ))
+{
+}
+
+template <typename T>
+recursive_wrapper<T>::recursive_wrapper(T const& operand)
+ : p_(new T(operand))
+{
+}
+
+template <typename T>
+recursive_wrapper<T>::recursive_wrapper(recursive_wrapper&& operand)
+ : p_(operand.p_)
+{
+ operand.p_ = nullptr;
+}
+
+template <typename T>
+recursive_wrapper<T>::recursive_wrapper(T&& operand)
+ : p_(new T( std::move(operand) ))
+{
+}
+
+template <typename T>
+void recursive_wrapper<T>::assign(const T& rhs)
+{
+ this->get() = rhs;
+}
+
+template <typename T>
+inline void swap(recursive_wrapper<T>& lhs, recursive_wrapper<T>& rhs) noexcept
+{
+ lhs.swap(rhs);
+}
+
+}}
+
+#endif // MAPBOX_UTIL_VARIANT_RECURSIVE_WRAPPER_HPP
diff --git a/3party/osrm/osrm-backend/ThirdParty/variant/variant.hpp b/3party/osrm/osrm-backend/ThirdParty/variant/variant.hpp
new file mode 100644
index 0000000000..3b5659425a
--- /dev/null
+++ b/3party/osrm/osrm-backend/ThirdParty/variant/variant.hpp
@@ -0,0 +1,740 @@
+#ifndef MAPBOX_UTIL_VARIANT_HPP
+#define MAPBOX_UTIL_VARIANT_HPP
+
+#include <utility>
+#include <typeinfo>
+#include <type_traits>
+#include <stdexcept> // runtime_error
+#include <new> // operator new
+#include <cstddef> // size_t
+#include <iosfwd>
+#include <string>
+
+#include "recursive_wrapper.hpp"
+
+#ifdef _MSC_VER
+ // http://msdn.microsoft.com/en-us/library/z8y1yy88.aspx
+ #ifdef NDEBUG
+ #define VARIANT_INLINE __forceinline
+ #else
+ #define VARIANT_INLINE __declspec(noinline)
+ #endif
+#else
+ #ifdef NDEBUG
+ #define VARIANT_INLINE inline __attribute__((always_inline))
+ #else
+ #define VARIANT_INLINE __attribute__((noinline))
+ #endif
+#endif
+
+#define VARIANT_MAJOR_VERSION 0
+#define VARIANT_MINOR_VERSION 1
+#define VARIANT_PATCH_VERSION 0
+
+// translates to 100
+#define VARIANT_VERSION (VARIANT_MAJOR_VERSION*100000) + (VARIANT_MINOR_VERSION*100) + (VARIANT_PATCH_VERSION)
+
+namespace mapbox { namespace util { namespace detail {
+
+static constexpr std::size_t invalid_value = std::size_t(-1);
+
+template <typename T, typename...Types>
+struct direct_type;
+
+template <typename T, typename First, typename...Types>
+struct direct_type<T, First, Types...>
+{
+ static constexpr std::size_t index = std::is_same<T, First>::value
+ ? sizeof...(Types) : direct_type<T, Types...>::index;
+};
+
+template <typename T>
+struct direct_type<T>
+{
+ static constexpr std::size_t index = invalid_value;
+};
+
+template <typename T, typename...Types>
+struct convertible_type;
+
+template <typename T, typename First, typename...Types>
+struct convertible_type<T, First, Types...>
+{
+ static constexpr std::size_t index = std::is_convertible<T, First>::value
+ ? sizeof...(Types) : convertible_type<T, Types...>::index;
+};
+
+template <typename T>
+struct convertible_type<T>
+{
+ static constexpr std::size_t index = invalid_value;
+};
+
+template <typename T, typename...Types>
+struct value_traits
+{
+ static constexpr std::size_t direct_index = direct_type<T, Types...>::index;
+ static constexpr std::size_t index =
+ (direct_index == invalid_value) ? convertible_type<T, Types...>::index : direct_index;
+};
+
+template <typename T, typename...Types>
+struct is_valid_type;
+
+template <typename T, typename First, typename... Types>
+struct is_valid_type<T, First, Types...>
+{
+ static constexpr bool value = std::is_convertible<T, First>::value
+ || is_valid_type<T, Types...>::value;
+};
+
+template <typename T>
+struct is_valid_type<T> : std::false_type {};
+
+template <std::size_t N, typename ... Types>
+struct select_type
+{
+ static_assert(N < sizeof...(Types), "index out of bounds");
+};
+
+template <std::size_t N, typename T, typename ... Types>
+struct select_type<N, T, Types...>
+{
+ using type = typename select_type<N - 1, Types...>::type;
+};
+
+template <typename T, typename ... Types>
+struct select_type<0, T, Types...>
+{
+ using type = T;
+};
+
+} // namespace detail
+
+// static visitor
+template <typename R = void>
+struct static_visitor
+{
+ using result_type = R;
+protected:
+ static_visitor() {}
+ ~static_visitor() {}
+};
+
+
+template <std::size_t arg1, std::size_t ... others>
+struct static_max;
+
+template <std::size_t arg>
+struct static_max<arg>
+{
+ static const std::size_t value = arg;
+};
+
+template <std::size_t arg1, std::size_t arg2, std::size_t ... others>
+struct static_max<arg1, arg2, others...>
+{
+ static const std::size_t value = arg1 >= arg2 ? static_max<arg1, others...>::value :
+ static_max<arg2, others...>::value;
+};
+
+template<typename... Types>
+struct variant_helper;
+
+template<typename T, typename... Types>
+struct variant_helper<T, Types...>
+{
+ VARIANT_INLINE static void destroy(const std::size_t id, void * data)
+ {
+ if (id == sizeof...(Types))
+ {
+ reinterpret_cast<T*>(data)->~T();
+ }
+ else
+ {
+ variant_helper<Types...>::destroy(id, data);
+ }
+ }
+
+ VARIANT_INLINE static void move(const std::size_t old_id, void * old_value, void * new_value)
+ {
+ if (old_id == sizeof...(Types))
+ {
+ new (new_value) T(std::move(*reinterpret_cast<T*>(old_value)));
+ //std::memcpy(new_value, old_value, sizeof(T));
+ // ^^ DANGER: this should only be considered for relocatable types e.g built-in types
+ // Also, I don't see any measurable performance benefit just yet
+ }
+ else
+ {
+ variant_helper<Types...>::move(old_id, old_value, new_value);
+ }
+ }
+
+ VARIANT_INLINE static void copy(const std::size_t old_id, const void * old_value, void * new_value)
+ {
+ if (old_id == sizeof...(Types))
+ {
+ new (new_value) T(*reinterpret_cast<const T*>(old_value));
+ }
+ else
+ {
+ variant_helper<Types...>::copy(old_id, old_value, new_value);
+ }
+ }
+};
+
+template<> struct variant_helper<>
+{
+ VARIANT_INLINE static void destroy(const std::size_t, void *) {}
+ VARIANT_INLINE static void move(const std::size_t, void *, void *) {}
+ VARIANT_INLINE static void copy(const std::size_t, const void *, void *) {}
+};
+
+namespace detail {
+
+template <typename T>
+struct unwrapper
+{
+ T const& operator() (T const& obj) const
+ {
+ return obj;
+ }
+
+ T& operator() (T & obj) const
+ {
+ return obj;
+ }
+};
+
+
+template <typename T>
+struct unwrapper<recursive_wrapper<T>>
+{
+ auto operator() (recursive_wrapper<T> const& obj) const
+ -> typename recursive_wrapper<T>::type const&
+ {
+ return obj.get();
+ }
+};
+
+
+template <typename F, typename V, typename...Types>
+struct dispatcher;
+
+template <typename F, typename V, typename T, typename...Types>
+struct dispatcher<F, V, T, Types...>
+{
+ using result_type = typename F::result_type;
+ VARIANT_INLINE static result_type apply_const(V const& v, F f)
+ {
+ if (v.get_type_index() == sizeof...(Types))
+ {
+ return f(unwrapper<T>()(v. template get<T>()));
+ }
+ else
+ {
+ return dispatcher<F, V, Types...>::apply_const(v, f);
+ }
+ }
+
+ VARIANT_INLINE static result_type apply(V & v, F f)
+ {
+ if (v.get_type_index() == sizeof...(Types))
+ {
+ return f(unwrapper<T>()(v. template get<T>()));
+ }
+ else
+ {
+ return dispatcher<F, V, Types...>::apply(v, f);
+ }
+ }
+};
+
+template<typename F, typename V>
+struct dispatcher<F, V>
+{
+ using result_type = typename F::result_type;
+ VARIANT_INLINE static result_type apply_const(V const&, F)
+ {
+ throw std::runtime_error(std::string("unary dispatch: FAIL ") + typeid(V).name());
+ }
+
+ VARIANT_INLINE static result_type apply(V &, F)
+ {
+ throw std::runtime_error(std::string("unary dispatch: FAIL ") + typeid(V).name());
+ }
+};
+
+
+template <typename F, typename V, typename T, typename...Types>
+struct binary_dispatcher_rhs;
+
+template <typename F, typename V, typename T0, typename T1, typename...Types>
+struct binary_dispatcher_rhs<F, V, T0, T1, Types...>
+{
+ using result_type = typename F::result_type;
+ VARIANT_INLINE static result_type apply_const(V const& lhs, V const& rhs, F f)
+ {
+ if (rhs.get_type_index() == sizeof...(Types)) // call binary functor
+ {
+ return f(unwrapper<T0>()(lhs. template get<T0>()),
+ unwrapper<T1>()(rhs. template get<T1>()));
+ }
+ else
+ {
+ return binary_dispatcher_rhs<F, V, T0, Types...>::apply_const(lhs, rhs, f);
+ }
+ }
+
+ VARIANT_INLINE static result_type apply(V & lhs, V & rhs, F f)
+ {
+ if (rhs.get_type_index() == sizeof...(Types)) // call binary functor
+ {
+ return f(unwrapper<T0>()(lhs. template get<T0>()),
+ unwrapper<T1>()(rhs. template get<T1>()));
+ }
+ else
+ {
+ return binary_dispatcher_rhs<F, V, T0, Types...>::apply(lhs, rhs, f);
+ }
+ }
+
+};
+
+template<typename F, typename V, typename T>
+struct binary_dispatcher_rhs<F, V, T>
+{
+ using result_type = typename F::result_type;
+ VARIANT_INLINE static result_type apply_const(V const&, V const&, F)
+ {
+ throw std::runtime_error("binary dispatch: FAIL");
+ }
+ VARIANT_INLINE static result_type apply(V &, V &, F)
+ {
+ throw std::runtime_error("binary dispatch: FAIL");
+ }
+};
+
+
+template <typename F, typename V, typename T, typename...Types>
+struct binary_dispatcher_lhs;
+
+template <typename F, typename V, typename T0, typename T1, typename...Types>
+struct binary_dispatcher_lhs<F, V, T0, T1, Types...>
+{
+ using result_type = typename F::result_type;
+ VARIANT_INLINE static result_type apply_const(V const& lhs, V const& rhs, F f)
+ {
+ if (lhs.get_type_index() == sizeof...(Types)) // call binary functor
+ {
+ return f(lhs. template get<T1>(), rhs. template get<T0>());
+ }
+ else
+ {
+ return binary_dispatcher_lhs<F, V, T0, Types...>::apply_const(lhs, rhs, f);
+ }
+ }
+
+ VARIANT_INLINE static result_type apply(V & lhs, V & rhs, F f)
+ {
+ if (lhs.get_type_index() == sizeof...(Types)) // call binary functor
+ {
+ return f(lhs. template get<T1>(), rhs. template get<T0>());
+ }
+ else
+ {
+ return binary_dispatcher_lhs<F, V, T0, Types...>::apply(lhs, rhs, f);
+ }
+ }
+
+};
+
+template<typename F, typename V, typename T>
+struct binary_dispatcher_lhs<F, V, T>
+{
+ using result_type = typename F::result_type;
+ VARIANT_INLINE static result_type apply_const(V const&, V const&, F)
+ {
+ throw std::runtime_error("binary dispatch: FAIL");
+ }
+
+ VARIANT_INLINE static result_type apply(V &, V &, F)
+ {
+ throw std::runtime_error("binary dispatch: FAIL");
+ }
+};
+
+template <typename F, typename V, typename...Types>
+struct binary_dispatcher;
+
+template <typename F, typename V, typename T, typename...Types>
+struct binary_dispatcher<F, V, T, Types...>
+{
+ using result_type = typename F::result_type;
+ VARIANT_INLINE static result_type apply_const(V const& v0, V const& v1, F f)
+ {
+ if (v0.get_type_index() == sizeof...(Types))
+ {
+ if (v0.get_type_index() == v1.get_type_index())
+ {
+ return f(v0. template get<T>(), v1. template get<T>()); // call binary functor
+ }
+ else
+ {
+ return binary_dispatcher_rhs<F, V, T, Types...>::apply_const(v0, v1, f);
+ }
+ }
+ else if (v1.get_type_index() == sizeof...(Types))
+ {
+ return binary_dispatcher_lhs<F, V, T, Types...>::apply_const(v0, v1, f);
+ }
+ return binary_dispatcher<F, V, Types...>::apply_const(v0, v1, f);
+ }
+
+ VARIANT_INLINE static result_type apply(V & v0, V & v1, F f)
+ {
+ if (v0.get_type_index() == sizeof...(Types))
+ {
+ if (v0.get_type_index() == v1.get_type_index())
+ {
+ return f(v0. template get<T>(), v1. template get<T>()); // call binary functor
+ }
+ else
+ {
+ return binary_dispatcher_rhs<F, V, T, Types...>::apply(v0, v1, f);
+ }
+ }
+ else if (v1.get_type_index() == sizeof...(Types))
+ {
+ return binary_dispatcher_lhs<F, V, T, Types...>::apply(v0, v1, f);
+ }
+ return binary_dispatcher<F, V, Types...>::apply(v0, v1, f);
+ }
+};
+
+template<typename F, typename V>
+struct binary_dispatcher<F, V>
+{
+ using result_type = typename F::result_type;
+ VARIANT_INLINE static result_type apply_const(V const&, V const&, F)
+ {
+ throw std::runtime_error("binary dispatch: FAIL");
+ }
+
+ VARIANT_INLINE static result_type apply(V &, V &, F)
+ {
+ throw std::runtime_error("binary dispatch: FAIL");
+ }
+};
+
+// comparator functors
+struct equal_comp
+{
+ template <typename T>
+ bool operator()(T const& lhs, T const& rhs) const
+ {
+ return lhs == rhs;
+ }
+};
+
+struct less_comp
+{
+ template <typename T>
+ bool operator()(T const& lhs, T const& rhs) const
+ {
+ return lhs < rhs;
+ }
+};
+
+template <typename Variant, typename Comp>
+class comparer : public static_visitor<bool>
+{
+public:
+ explicit comparer(Variant const& lhs) noexcept
+ : lhs_(lhs) {}
+ comparer& operator=(comparer const&) = delete;
+ // visitor
+ template<typename T>
+ bool operator()(T const& rhs_content) const
+ {
+ T const& lhs_content = lhs_.template get<T>();
+ return Comp()(lhs_content, rhs_content);
+ }
+private:
+ Variant const& lhs_;
+};
+
+// operator<< helper
+template <typename Out>
+class printer : public static_visitor<>
+{
+public:
+ explicit printer(Out & out)
+ : out_(out) {}
+ printer& operator=(printer const&) = delete;
+
+// visitor
+ template <typename T>
+ void operator()(T const& operand) const
+ {
+ out_ << operand;
+ }
+private:
+ Out & out_;
+};
+
+} // namespace detail
+
+struct no_init {};
+
+template<typename... Types>
+class variant
+{
+private:
+
+ static const std::size_t data_size = static_max<sizeof(Types)...>::value;
+ static const std::size_t data_align = static_max<alignof(Types)...>::value;
+
+ using data_type = typename std::aligned_storage<data_size, data_align>::type;
+ using helper_type = variant_helper<Types...>;
+
+ std::size_t type_index;
+ data_type data;
+
+public:
+
+
+ VARIANT_INLINE variant()
+ : type_index(sizeof...(Types) - 1)
+ {
+ new (&data) typename detail::select_type<0, Types...>::type();
+ }
+
+ VARIANT_INLINE variant(no_init)
+ : type_index(detail::invalid_value) {}
+
+ // http://isocpp.org/blog/2012/11/universal-references-in-c11-scott-meyers
+ template <typename T, class = typename std::enable_if<
+ detail::is_valid_type<typename std::remove_reference<T>::type, Types...>::value>::type>
+ VARIANT_INLINE variant(T && val) noexcept
+ : type_index(detail::value_traits<typename std::remove_reference<T>::type, Types...>::index)
+ {
+ constexpr std::size_t index = sizeof...(Types) - detail::value_traits<typename std::remove_reference<T>::type, Types...>::index - 1;
+ using target_type = typename detail::select_type<index, Types...>::type;
+ new (&data) target_type(std::forward<T>(val)); // nothrow
+ }
+
+ VARIANT_INLINE variant(variant<Types...> const& old)
+ : type_index(old.type_index)
+ {
+ helper_type::copy(old.type_index, &old.data, &data);
+ }
+
+ VARIANT_INLINE variant(variant<Types...>&& old) noexcept
+ : type_index(old.type_index)
+ {
+ helper_type::move(old.type_index, &old.data, &data);
+ }
+
+ friend void swap(variant<Types...> & first, variant<Types...> & second)
+ {
+ using std::swap; //enable ADL
+ swap(first.type_index, second.type_index);
+ swap(first.data, second.data);
+ }
+
+ VARIANT_INLINE variant<Types...>& operator=(variant<Types...> other)
+ {
+ swap(*this, other);
+ return *this;
+ }
+
+ // conversions
+ // move-assign
+ template <typename T>
+ VARIANT_INLINE variant<Types...>& operator=(T && rhs) noexcept
+ {
+ variant<Types...> temp(std::forward<T>(rhs));
+ swap(*this, temp);
+ return *this;
+ }
+
+ // copy-assign
+ template <typename T>
+ VARIANT_INLINE variant<Types...>& operator=(T const& rhs)
+ {
+ variant<Types...> temp(rhs);
+ swap(*this, temp);
+ return *this;
+ }
+
+ template<typename T>
+ VARIANT_INLINE bool is() const
+ {
+ return (type_index == detail::direct_type<T, Types...>::index);
+ }
+
+ VARIANT_INLINE bool valid() const
+ {
+ return (type_index != detail::invalid_value);
+ }
+
+ template<typename T, typename... Args>
+ VARIANT_INLINE void set(Args&&... args)
+ {
+ helper_type::destroy(type_index, &data);
+ new (&data) T(std::forward<Args>(args)...);
+ type_index = detail::direct_type<T, Types...>::index;
+ }
+
+ template<typename T>
+ VARIANT_INLINE T& get()
+ {
+ if (type_index == detail::direct_type<T, Types...>::index)
+ {
+ return *reinterpret_cast<T*>(&data);
+ }
+ else
+ {
+ throw std::runtime_error("in get()");
+ }
+ }
+
+ template<typename T>
+ VARIANT_INLINE T const& get() const
+ {
+ if (type_index == detail::direct_type<T, Types...>::index)
+ {
+ return *reinterpret_cast<T const*>(&data);
+ }
+ else
+ {
+ throw std::runtime_error("in get()");
+ }
+ }
+
+ VARIANT_INLINE std::size_t get_type_index() const
+ {
+ return type_index;
+ }
+
+ // visitor
+ // unary
+ template <typename F, typename V>
+ auto VARIANT_INLINE
+ static visit(V const& v, F f)
+ -> decltype(detail::dispatcher<F, V, Types...>::apply_const(v, f))
+ {
+ return detail::dispatcher<F, V, Types...>::apply_const(v, f);
+ }
+ // non-const
+ template <typename F, typename V>
+ auto VARIANT_INLINE
+ static visit(V & v, F f)
+ -> decltype(detail::dispatcher<F, V, Types...>::apply(v, f))
+ {
+ return detail::dispatcher<F, V, Types...>::apply(v, f);
+ }
+
+ // binary
+ // const
+ template <typename F, typename V>
+ auto VARIANT_INLINE
+ static binary_visit(V const& v0, V const& v1, F f)
+ -> decltype(detail::binary_dispatcher<F, V, Types...>::apply_const(v0, v1, f))
+ {
+ return detail::binary_dispatcher<F, V, Types...>::apply_const(v0, v1, f);
+ }
+ // non-const
+ template <typename F, typename V>
+ auto VARIANT_INLINE
+ static binary_visit(V& v0, V& v1, F f)
+ -> decltype(detail::binary_dispatcher<F, V, Types...>::apply(v0, v1, f))
+ {
+ return detail::binary_dispatcher<F, V, Types...>::apply(v0, v1, f);
+ }
+
+ ~variant() noexcept
+ {
+ helper_type::destroy(type_index, &data);
+ }
+
+ // comparison operators
+ // equality
+ VARIANT_INLINE bool operator==(variant const& rhs) const
+ {
+ if (this->get_type_index() != rhs.get_type_index())
+ return false;
+ detail::comparer<variant, detail::equal_comp> visitor(*this);
+ return visit(rhs, visitor);
+ }
+ // less than
+ VARIANT_INLINE bool operator<(variant const& rhs) const
+ {
+ if (this->get_type_index() != rhs.get_type_index())
+ {
+ return this->get_type_index() < rhs.get_type_index();
+ // ^^ borrowed from boost::variant
+ }
+ detail::comparer<variant, detail::less_comp> visitor(*this);
+ return visit(rhs, visitor);
+ }
+};
+
+// unary visitor interface
+
+// const
+template <typename V, typename F>
+auto VARIANT_INLINE static apply_visitor(F f, V const& v) -> decltype(V::visit(v, f))
+{
+ return V::visit(v, f);
+}
+// non-const
+template <typename V, typename F>
+auto VARIANT_INLINE static apply_visitor(F f, V & v) -> decltype(V::visit(v, f))
+{
+ return V::visit(v, f);
+}
+
+// binary visitor interface
+// const
+template <typename V, typename F>
+auto VARIANT_INLINE static apply_visitor(F f, V const& v0, V const& v1) -> decltype(V::binary_visit(v0, v1, f))
+{
+ return V::binary_visit(v0, v1, f);
+}
+// non-const
+template <typename V, typename F>
+auto VARIANT_INLINE static apply_visitor(F f, V & v0, V & v1) -> decltype(V::binary_visit(v0, v1, f))
+{
+ return V::binary_visit(v0, v1, f);
+}
+
+// getter interface
+template<typename ResultType, typename T>
+ResultType & get(T & var)
+{
+ return var.template get<ResultType>();
+}
+
+template<typename ResultType, typename T>
+ResultType const& get(T const& var)
+{
+ return var.template get<ResultType>();
+}
+
+
+// operator<<
+template <typename charT, typename traits, typename... Types>
+VARIANT_INLINE std::basic_ostream<charT, traits>&
+operator<< (std::basic_ostream<charT, traits>& out, variant<Types...> const& rhs)
+{
+ detail::printer<std::basic_ostream<charT, traits>> visitor(out);
+ apply_visitor(visitor, rhs);
+ return out;
+}
+
+}}
+
+#endif // MAPBOX_UTIL_VARIANT_HPP
diff --git a/3party/osrm/osrm-backend/Tools/check-hsgr.cpp b/3party/osrm/osrm-backend/Tools/check-hsgr.cpp
index f784659741..b3b157ad11 100644
--- a/3party/osrm/osrm-backend/Tools/check-hsgr.cpp
+++ b/3party/osrm/osrm-backend/Tools/check-hsgr.cpp
@@ -24,13 +24,13 @@ ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
*/
-#include "../DataStructures/DeallocatingVector.h"
#include "../DataStructures/Percent.h"
#include "../DataStructures/QueryEdge.h"
#include "../DataStructures/Range.h"
#include "../DataStructures/StaticGraph.h"
#include "../Util/GraphLoader.h"
-#include "../Util/SimpleLogger.h"
+#include "../Util/simple_logger.hpp"
+#include "../Util/OSRMException.h"
#include <boost/assert.hpp>
#include <boost/filesystem.hpp>
@@ -38,69 +38,68 @@ SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
#include <memory>
#include <vector>
-typedef QueryEdge::EdgeData EdgeData;
-typedef StaticGraph<EdgeData> QueryGraph;
+using EdgeData = QueryEdge::EdgeData;
+using QueryGraph = StaticGraph<EdgeData>;
int main(int argc, char *argv[])
{
LogPolicy::GetInstance().Unmute();
- if (argc != 2)
- {
- SimpleLogger().Write(logWARNING) << "usage: " << argv[0] << " <file.hsgr>";
- return 1;
- }
-
try
{
+ if (argc != 2)
+ {
+ SimpleLogger().Write(logWARNING) << "usage: " << argv[0] << " <file.hsgr>";
+ return 1;
+ }
+
boost::filesystem::path hsgr_path(argv[1]);
std::vector<QueryGraph::NodeArrayEntry> node_list;
std::vector<QueryGraph::EdgeArrayEntry> edge_list;
-
SimpleLogger().Write() << "loading graph from " << hsgr_path.string();
unsigned m_check_sum = 0;
- unsigned m_number_of_nodes = readHSGRFromStream(hsgr_path, node_list, edge_list, &m_check_sum);
- SimpleLogger().Write() << "announced " << m_number_of_nodes
+ unsigned m_number_of_nodes =
+ readHSGRFromStream(hsgr_path, node_list, edge_list, &m_check_sum);
+ SimpleLogger().Write() << "expecting " << m_number_of_nodes
<< " nodes, checksum: " << m_check_sum;
BOOST_ASSERT_MSG(0 != node_list.size(), "node list empty");
- // BOOST_ASSERT_MSG(0 != edge_list.size(), "edge list empty");
SimpleLogger().Write() << "loaded " << node_list.size() << " nodes and " << edge_list.size()
<< " edges";
- std::shared_ptr<QueryGraph> m_query_graph = std::make_shared<QueryGraph>(node_list, edge_list);
+ auto m_query_graph = std::make_shared<QueryGraph>(node_list, edge_list);
BOOST_ASSERT_MSG(0 == node_list.size(), "node list not flushed");
BOOST_ASSERT_MSG(0 == edge_list.size(), "edge list not flushed");
- Percent p(m_query_graph->GetNumberOfNodes());
- for (const auto u : osrm::irange(0u, m_query_graph->GetNumberOfNodes()))
+ Percent progress(m_query_graph->GetNumberOfNodes());
+ for (const auto node_u : osrm::irange(0u, m_query_graph->GetNumberOfNodes()))
{
- for (const auto eid : m_query_graph->GetAdjacentEdgeRange(u))
+ for (const auto eid : m_query_graph->GetAdjacentEdgeRange(node_u))
{
const EdgeData &data = m_query_graph->GetEdgeData(eid);
if (!data.shortcut)
{
continue;
}
- const unsigned v = m_query_graph->GetTarget(eid);
- const EdgeID first_edge_id = m_query_graph->FindEdgeInEitherDirection(u, data.id);
- if (SPECIAL_EDGEID == first_edge_id)
+ const unsigned node_v = m_query_graph->GetTarget(eid);
+ const EdgeID edge_id_1 = m_query_graph->FindEdgeInEitherDirection(node_u, data.id);
+ if (SPECIAL_EDGEID == edge_id_1)
{
- SimpleLogger().Write(logWARNING) << "cannot find first segment of edge (" << u
- << "," << data.id << "," << v << "), eid: " << eid;
- BOOST_ASSERT(false);
- return 1;
+ throw OSRMException("cannot find first segment of edge (" +
+ std::to_string(node_u) + "," + std::to_string(data.id) +
+ "," + std::to_string(node_v) + "), eid: " +
+ std::to_string(eid));
}
- const EdgeID second_edge_id = m_query_graph->FindEdgeInEitherDirection(data.id, v);
- if (SPECIAL_EDGEID == second_edge_id)
+ const EdgeID edge_id_2 = m_query_graph->FindEdgeInEitherDirection(data.id, node_v);
+ if (SPECIAL_EDGEID == edge_id_2)
{
- SimpleLogger().Write(logWARNING) << "cannot find second segment of edge (" << u
- << "," << data.id << "," << v << "), eid: " << eid;
- BOOST_ASSERT(false);
- return 1;
+ throw OSRMException("cannot find second segment of edge (" +
+ std::to_string(node_u) + "," + std::to_string(data.id) +
+ "," + std::to_string(node_v) + "), eid: " +
+ std::to_string(eid));
}
}
- p.printIncrement();
+ progress.printStatus(node_u);
}
m_query_graph.reset();
SimpleLogger().Write() << "Data file " << argv[0] << " appears to be OK";
diff --git a/3party/osrm/osrm-backend/Tools/components.cpp b/3party/osrm/osrm-backend/Tools/components.cpp
index 74e9fd3281..b60077bd0d 100644
--- a/3party/osrm/osrm-backend/Tools/components.cpp
+++ b/3party/osrm/osrm-backend/Tools/components.cpp
@@ -29,7 +29,7 @@ SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
#include "../Algorithms/StronglyConnectedComponents.h"
#include "../Util/GraphLoader.h"
#include "../Util/OSRMException.h"
-#include "../Util/SimpleLogger.h"
+#include "../Util/simple_logger.hpp"
#include "../Util/FingerPrint.h"
#include <fstream>
@@ -44,16 +44,17 @@ std::vector<NodeID> trafficlight_ID_list;
int main(int argc, char *argv[])
{
- // enable logging
LogPolicy::GetInstance().Unmute();
- if (argc < 3)
- {
- SimpleLogger().Write(logWARNING) << "usage:\n" << argv[0] << " <osrm> <osrm.restrictions>";
- return -1;
- }
-
try
{
+ // enable logging
+ if (argc < 3)
+ {
+ SimpleLogger().Write(logWARNING) << "usage:\n" << argv[0]
+ << " <osrm> <osrm.restrictions>";
+ return -1;
+ }
+
SimpleLogger().Write() << "Using restrictions from file: " << argv[2];
std::ifstream restriction_ifstream(argv[2], std::ios::binary);
const FingerPrint fingerprint_orig;
@@ -71,15 +72,15 @@ int main(int argc, char *argv[])
{
throw OSRMException("Could not access <osrm-restrictions> files");
}
- uint32_t usable_restriction_count = 0;
- restriction_ifstream.read((char *)&usable_restriction_count, sizeof(uint32_t));
- restrictions_vector.resize(usable_restriction_count);
+ uint32_t usable_restrictions = 0;
+ restriction_ifstream.read((char *)&usable_restrictions, sizeof(uint32_t));
+ restrictions_vector.resize(usable_restrictions);
// load restrictions
- if (usable_restriction_count>0)
+ if (usable_restrictions > 0)
{
restriction_ifstream.read((char *)&(restrictions_vector[0]),
- usable_restriction_count * sizeof(TurnRestriction));
+ usable_restrictions * sizeof(TurnRestriction));
}
restriction_ifstream.close();
@@ -99,7 +100,7 @@ int main(int argc, char *argv[])
restrictions_vector);
input_stream.close();
- BOOST_ASSERT_MSG(restrictions_vector.size() == usable_restriction_count,
+ BOOST_ASSERT_MSG(restrictions_vector.size() == usable_restrictions,
"size of restrictions_vector changed");
SimpleLogger().Write() << restrictions_vector.size() << " restrictions, "
@@ -109,13 +110,12 @@ int main(int argc, char *argv[])
// Building an edge-expanded graph from node-based input an turn
// restrictions
SimpleLogger().Write() << "Starting SCC graph traversal";
- std::shared_ptr<TarjanSCC> tarjan =
- std::make_shared<TarjanSCC>(number_of_nodes,
- edge_list,
- bollard_ID_list,
- trafficlight_ID_list,
- restrictions_vector,
- coordinate_list);
+ std::shared_ptr<TarjanSCC> tarjan = std::make_shared<TarjanSCC>(number_of_nodes,
+ edge_list,
+ bollard_ID_list,
+ trafficlight_ID_list,
+ restrictions_vector,
+ coordinate_list);
edge_list.clear();
edge_list.shrink_to_fit();
diff --git a/3party/osrm/osrm-backend/Tools/io-benchmark.cpp b/3party/osrm/osrm-backend/Tools/io-benchmark.cpp
index 6304aaec05..b438000558 100644
--- a/3party/osrm/osrm-backend/Tools/io-benchmark.cpp
+++ b/3party/osrm/osrm-backend/Tools/io-benchmark.cpp
@@ -27,7 +27,7 @@ SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
#include "../Util/GitDescription.h"
#include "../Util/OSRMException.h"
-#include "../Util/SimpleLogger.h"
+#include "../Util/simple_logger.hpp"
#include "../Util/TimingUtil.h"
#include <boost/filesystem.hpp>
@@ -71,32 +71,30 @@ void RunStatistics(std::vector<double> &timings_vector, Statistics &stats)
int main(int argc, char *argv[])
{
LogPolicy::GetInstance().Unmute();
-
- SimpleLogger().Write() << "starting up engines, " << g_GIT_DESCRIPTION << ", "
- << "compiled at " << __DATE__ << ", " __TIME__;
+ boost::filesystem::path test_path;
+ try
+ {
+ SimpleLogger().Write() << "starting up engines, " << g_GIT_DESCRIPTION;
#ifdef __FreeBSD__
- SimpleLogger().Write() << "Not supported on FreeBSD";
- return 0;
+ SimpleLogger().Write() << "Not supported on FreeBSD";
+ return 0;
#endif
#ifdef WIN32
- SimpleLogger().Write() << "Not supported on Windows";
- return 0;
+ SimpleLogger().Write() << "Not supported on Windows";
+ return 0;
#else
+ if (1 == argc)
+ {
+ SimpleLogger().Write(logWARNING) << "usage: " << argv[0] << " /path/on/device";
+ return -1;
+ }
- 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();
+ 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)
{
@@ -118,27 +116,26 @@ int main(int argc, char *argv[])
fclose(fd);
#endif
#ifdef __linux__
- int f =
+ int file_desc =
open(test_path.string().c_str(), O_CREAT | O_TRUNC | O_WRONLY | O_SYNC, S_IRWXU);
- if (-1 == f)
+ if (-1 == file_desc)
{
throw OSRMException("Could not open random data file");
}
TIMER_START(write_1gb);
- int ret = write(f, random_array, number_of_elements * sizeof(unsigned));
+ int ret = write(file_desc, random_array, number_of_elements * sizeof(unsigned));
if (0 > ret)
{
throw OSRMException("could not write random data file");
}
TIMER_STOP(write_1gb);
- close(f);
+ close(file_desc);
#endif
delete[] random_array;
SimpleLogger().Write(logDEBUG) << "writing raw 1GB took " << TIMER_SEC(write_1gb)
<< "s";
SimpleLogger().Write() << "raw write performance: " << std::setprecision(5)
- << std::fixed << 1024 * 1024 / TIMER_SEC(write_1gb)
- << "MB/sec";
+ << std::fixed << 1024 * 1024 / TIMER_SEC(write_1gb) << "MB/sec";
SimpleLogger().Write(logDEBUG)
<< "finished creation of random data. Flush disk cache now!";
@@ -164,8 +161,8 @@ int main(int argc, char *argv[])
#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);
- if (-1 == f)
+ int file_desc = open(test_path.string().c_str(), O_RDONLY | O_DIRECT | O_SYNC);
+ if (-1 == file_desc)
{
SimpleLogger().Write(logDEBUG) << "opened, error: " << strerror(errno);
return -1;
@@ -179,17 +176,16 @@ int main(int argc, char *argv[])
fd = fopen(test_path.string().c_str(), "r");
#endif
#ifdef __linux__
- int ret = read(f, raw_array, number_of_elements * sizeof(unsigned));
+ int ret = read(file_desc, 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);
+ close(file_desc);
+ file_desc = open(test_path.string().c_str(), O_RDONLY | O_DIRECT | O_SYNC);
SimpleLogger().Write(logDEBUG) << "opened, error: " << strerror(errno);
#endif
TIMER_STOP(read_1gb);
- SimpleLogger().Write(logDEBUG) << "reading raw 1GB took " << TIMER_SEC(read_1gb)
- << "s";
+ SimpleLogger().Write(logDEBUG) << "reading raw 1GB took " << TIMER_SEC(read_1gb) << "s";
SimpleLogger().Write() << "raw read performance: " << std::setprecision(5) << std::fixed
<< 1024 * 1024 / TIMER_SEC(read_1gb) << "MB/sec";
@@ -200,7 +196,7 @@ int main(int argc, char *argv[])
fseek(fd, 0, SEEK_SET);
#endif
#ifdef __linux__
- lseek(f, 0, SEEK_SET);
+ lseek(file_desc, 0, SEEK_SET);
#endif
// make 1000 random access, time each I/O seperately
unsigned number_of_blocks = (number_of_elements * sizeof(unsigned) - 1) / 4096;
@@ -220,11 +216,11 @@ int main(int argc, char *argv[])
#endif
#ifdef __linux__
- int ret1 = lseek(f, current_offset, SEEK_SET);
- int ret2 = read(f, (char *)single_block, 4096);
+ int ret1 = lseek(file_desc, current_offset, SEEK_SET);
+ int ret2 = read(file_desc, (char *)single_block, 4096);
#endif
TIMER_STOP(random_access);
- if (((off_t) - 1) == ret1)
+ if (((off_t)-1) == ret1)
{
SimpleLogger().Write(logWARNING) << "offset: " << current_offset;
SimpleLogger().Write(logWARNING) << "seek error " << strerror(errno);
@@ -261,7 +257,7 @@ int main(int argc, char *argv[])
fseek(fd, 0, SEEK_SET);
#endif
#ifdef __linux__
- lseek(f, 0, SEEK_SET);
+ lseek(file_desc, 0, SEEK_SET);
#endif
// read every 100th block
@@ -280,12 +276,12 @@ int main(int argc, char *argv[])
#endif
#ifdef __linux__
- int ret1 = lseek(f, current_offset, SEEK_SET);
+ int ret1 = lseek(file_desc, current_offset, SEEK_SET);
- int ret2 = read(f, (char *)single_block, 4096);
+ int ret2 = read(file_desc, (char *)single_block, 4096);
#endif
TIMER_STOP(read_every_100);
- if (((off_t) - 1) == ret1)
+ if (((off_t)-1) == ret1)
{
SimpleLogger().Write(logWARNING) << "offset: " << current_offset;
SimpleLogger().Write(logWARNING) << "seek error " << strerror(errno);
@@ -306,7 +302,7 @@ int main(int argc, char *argv[])
// free(single_block);
#endif
#ifdef __linux__
- close(f);
+ close(file_desc);
#endif
// Do statistics
SimpleLogger().Write(logDEBUG) << "running sequential I/O statistics";
diff --git a/3party/osrm/osrm-backend/Tools/simpleclient.cpp b/3party/osrm/osrm-backend/Tools/simpleclient.cpp
index 68d4b1d6b7..b6714566a2 100644
--- a/3party/osrm/osrm-backend/Tools/simpleclient.cpp
+++ b/3party/osrm/osrm-backend/Tools/simpleclient.cpp
@@ -28,7 +28,7 @@ SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
#include "../Library/OSRM.h"
#include "../Util/GitDescription.h"
#include "../Util/ProgramOptions.h"
-#include "../Util/SimpleLogger.h"
+#include "../Util/simple_logger.hpp"
#include <osrm/Reply.h>
#include <osrm/RouteParameters.h>
@@ -80,8 +80,7 @@ int main(int argc, const char *argv[])
return 0;
}
- SimpleLogger().Write() << "starting up engines, " << g_GIT_DESCRIPTION << ", "
- << "compiled at " << __DATE__ << ", " __TIME__;
+ SimpleLogger().Write() << "starting up engines, " << g_GIT_DESCRIPTION;
OSRM routing_machine(server_paths, use_shared_memory);
diff --git a/3party/osrm/osrm-backend/Tools/springclean.cpp b/3party/osrm/osrm-backend/Tools/springclean.cpp
new file mode 100644
index 0000000000..f528d3da38
--- /dev/null
+++ b/3party/osrm/osrm-backend/Tools/springclean.cpp
@@ -0,0 +1,102 @@
+/*
+
+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 <cstdio>
+
+#include "../DataStructures/SharedMemoryFactory.h"
+#include "../Server/DataStructures/SharedDataType.h"
+#include "../Util/GitDescription.h"
+#include "../Util/simple_logger.hpp"
+
+void delete_region(const SharedDataType region)
+{
+ if (SharedMemory::RegionExists(region) && !SharedMemory::Remove(region))
+ {
+ const std::string name = [&]
+ {
+ switch (region)
+ {
+ case CURRENT_REGIONS:
+ return "CURRENT_REGIONS";
+ case LAYOUT_1:
+ return "LAYOUT_1";
+ case DATA_1:
+ return "DATA_1";
+ case LAYOUT_2:
+ return "LAYOUT_2";
+ case DATA_2:
+ return "DATA_2";
+ case LAYOUT_NONE:
+ return "LAYOUT_NONE";
+ default: // DATA_NONE:
+ return "DATA_NONE";
+ }
+ }();
+
+ SimpleLogger().Write(logWARNING) << "could not delete shared memory region " << name;
+ }
+}
+
+// find all existing shmem regions and remove them.
+void springclean()
+{
+ SimpleLogger().Write() << "spring-cleaning all shared memory regions";
+ delete_region(DATA_1);
+ delete_region(LAYOUT_1);
+ delete_region(DATA_2);
+ delete_region(LAYOUT_2);
+ delete_region(CURRENT_REGIONS);
+}
+
+int main()
+{
+ LogPolicy::GetInstance().Unmute();
+ try
+ {
+ SimpleLogger().Write() << "starting up engines, " << g_GIT_DESCRIPTION << "\n\n";
+ SimpleLogger().Write() << "Releasing all locks";
+ SimpleLogger().Write() << "ATTENTION! BE CAREFUL!";
+ SimpleLogger().Write() << "----------------------";
+ SimpleLogger().Write() << "This tool may put osrm-routed into an undefined state!";
+ SimpleLogger().Write() << "Type 'Y' to acknowledge that you know what your are doing.";
+ SimpleLogger().Write() << "\n\nDo you want to purge all shared memory allocated " <<
+ "by osrm-datastore? [type 'Y' to confirm]";
+
+ const auto letter = getchar();
+ if (letter != 'Y')
+ {
+ SimpleLogger().Write() << "aborted.";
+ return 0;
+ }
+ springclean();
+ }
+ catch (const std::exception &e)
+ {
+ SimpleLogger().Write(logWARNING) << "[excpetion] " << e.what();
+ }
+ return 0;
+}
diff --git a/3party/osrm/osrm-backend/Tools/unlock_all_mutexes.cpp b/3party/osrm/osrm-backend/Tools/unlock_all_mutexes.cpp
index 4d4156fa52..d448a2049c 100644
--- a/3party/osrm/osrm-backend/Tools/unlock_all_mutexes.cpp
+++ b/3party/osrm/osrm-backend/Tools/unlock_all_mutexes.cpp
@@ -26,7 +26,7 @@ SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
*/
#include "../Util/GitDescription.h"
-#include "../Util/SimpleLogger.h"
+#include "../Util/simple_logger.hpp"
#include "../Server/DataStructures/SharedBarriers.h"
#include <iostream>
@@ -36,8 +36,7 @@ int main()
LogPolicy::GetInstance().Unmute();
try
{
- SimpleLogger().Write() << "starting up engines, " << g_GIT_DESCRIPTION << ", "
- << "compiled at " << __DATE__ << ", " __TIME__;
+ SimpleLogger().Write() << "starting up engines, " << g_GIT_DESCRIPTION;
SimpleLogger().Write() << "Releasing all locks";
SharedBarriers barrier;
barrier.pending_update_mutex.unlock();
diff --git a/3party/osrm/osrm-backend/UnitTests/DataStructures/StaticRTreeTest.cpp b/3party/osrm/osrm-backend/UnitTests/DataStructures/StaticRTreeTest.cpp
index 8e7511daa0..46dbc4e4bb 100644
--- a/3party/osrm/osrm-backend/UnitTests/DataStructures/StaticRTreeTest.cpp
+++ b/3party/osrm/osrm-backend/UnitTests/DataStructures/StaticRTreeTest.cpp
@@ -1,7 +1,7 @@
#include "../../DataStructures/StaticRTree.h"
#include "../../DataStructures/QueryNode.h"
#include "../../DataStructures/EdgeBasedNode.h"
-#include "../../Util/NumericUtil.h"
+#include "../../Util/floating_point.hpp"
#include "../../typedefs.h"
#include <osrm/Coordinate.h>
@@ -97,7 +97,7 @@ class LinearSearchNN
coords->at(e.u), coords->at(e.v), input_coordinate, nearest, current_ratio);
if ((current_perpendicular_distance < min_dist) &&
- !EpsilonCompare(current_perpendicular_distance, min_dist))
+ !osrm::epsilon_compare(current_perpendicular_distance, min_dist))
{ // found a new minimum
min_dist = current_perpendicular_distance;
result_phantom_node = {e.forward_edge_based_node_id,
@@ -109,7 +109,9 @@ class LinearSearchNN
e.reverse_offset,
e.packed_geometry_id,
nearest,
- e.fwd_segment_position};
+ e.fwd_segment_position,
+ e.forward_travel_mode,
+ e.backward_travel_mode};
nearest_edge = e;
}
}
diff --git a/3party/osrm/osrm-backend/Util/BoostFileSystemFix.h b/3party/osrm/osrm-backend/Util/BoostFileSystemFix.h
index 1e1e98e0e1..d7049cc2e1 100644
--- a/3party/osrm/osrm-backend/Util/BoostFileSystemFix.h
+++ b/3party/osrm/osrm-backend/Util/BoostFileSystemFix.h
@@ -29,11 +29,10 @@ SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
#define BOOST_FILE_SYSTEM_FIX_H
#include "OSRMException.h"
-#include "SimpleLogger.h"
-#include <boost/any.hpp>
+// #include <boost/any.hpp>
#include <boost/filesystem.hpp>
-#include <boost/program_options.hpp>
+// #include <boost/program_options.hpp>
// This is one big workaround for latest boost renaming woes.
@@ -51,7 +50,7 @@ namespace filesystem
// exists. The validate() function must be defined in the same namespace
// as the target type, (boost::filesystem::path in this case), otherwise
// it is not called
-// inline void validate(
+// void validate(
// boost::any & v,
// const std::vector<std::string> & values,
// boost::filesystem::path *,
@@ -60,8 +59,6 @@ namespace filesystem
// boost::program_options::validators::check_first_occurrence(v);
// const std::string & input_string =
// boost::program_options::validators::get_single_string(values);
-// // SimpleLogger().Write() << "validator called for " << input_string;
-// // SimpleLogger().Write() << "validator called for " << input_string;
// if(boost::filesystem::is_regular_file(input_string)) {
// v = boost::any(boost::filesystem::path(input_string));
// } else {
@@ -71,7 +68,7 @@ namespace filesystem
// adapted from:
// http://stackoverflow.com/questions/1746136/how-do-i-normalize-a-pathname-using-boostfilesystem
-inline boost::filesystem::path
+boost::filesystem::path
portable_canonical(const boost::filesystem::path &relative_path,
const boost::filesystem::path &current_path = boost::filesystem::current_path())
{
@@ -118,15 +115,15 @@ portable_canonical(const boost::filesystem::path &relative_path,
#if BOOST_FILESYSTEM_VERSION < 3
-inline path temp_directory_path()
+path temp_directory_path()
{
char *buffer;
- buffer = tmpnam(NULL);
+ buffer = tmpnam(nullptr);
return path(buffer);
}
-inline path unique_path(const path &) { return temp_directory_path(); }
+path unique_path(const path &) { return temp_directory_path(); }
#endif
}
@@ -136,7 +133,7 @@ inline path unique_path(const path &) { return temp_directory_path(); }
#define BOOST_FILESYSTEM_VERSION 3
#endif
-inline void AssertPathExists(const boost::filesystem::path &path)
+void AssertPathExists(const boost::filesystem::path &path)
{
if (!boost::filesystem::is_regular_file(path))
{
diff --git a/3party/osrm/osrm-backend/Util/DataStoreOptions.h b/3party/osrm/osrm-backend/Util/DataStoreOptions.h
index 7a76bfb6ae..f67b12d727 100644
--- a/3party/osrm/osrm-backend/Util/DataStoreOptions.h
+++ b/3party/osrm/osrm-backend/Util/DataStoreOptions.h
@@ -32,7 +32,7 @@ SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
#include "GitDescription.h"
#include "IniFileUtil.h"
#include "OSRMException.h"
-#include "SimpleLogger.h"
+#include "simple_logger.hpp"
#include <osrm/ServerPaths.h>
@@ -43,7 +43,7 @@ SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
#include <string>
// generate boost::program_options object for the routing part
-inline bool GenerateDataStoreOptions(const int argc, const char *argv[], ServerPaths &paths, bool & springclean)
+bool GenerateDataStoreOptions(const int argc, const char *argv[], ServerPaths &paths)
{
// declare a group of options that will be allowed only on command line
boost::program_options::options_description generic_options("Options");
@@ -122,11 +122,6 @@ inline bool GenerateDataStoreOptions(const int argc, const char *argv[], ServerP
return false;
}
- if (option_variables.count("springclean"))
- {
- springclean = true;
- return true;
- }
boost::program_options::notify(option_variables);
const bool parameter_present = (paths.find("hsgrdata") != paths.end() &&
diff --git a/3party/osrm/osrm-backend/Util/FingerPrint.cpp.in b/3party/osrm/osrm-backend/Util/FingerPrint.cpp.in
index d074a2079e..c3bf0c035f 100644
--- a/3party/osrm/osrm-backend/Util/FingerPrint.cpp.in
+++ b/3party/osrm/osrm-backend/Util/FingerPrint.cpp.in
@@ -45,8 +45,7 @@ FingerPrint::FingerPrint() : magic_number(1297240911)
md5_prepare[32] = md5_tree[32] = md5_graph[32] = md5_objects[32] = '\0';
boost::uuids::name_generator gen(named_uuid);
- std::string temp_string(__DATE__);
- temp_string += __TIME__;
+ std::string temp_string;
std::memcpy(md5_prepare, MD5PREPARE, strlen(MD5PREPARE));
temp_string += md5_prepare;
diff --git a/3party/osrm/osrm-backend/Util/GraphLoader.h b/3party/osrm/osrm-backend/Util/GraphLoader.h
index 636994642a..94cb190379 100644
--- a/3party/osrm/osrm-backend/Util/GraphLoader.h
+++ b/3party/osrm/osrm-backend/Util/GraphLoader.h
@@ -33,7 +33,7 @@ SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
#include "../DataStructures/ImportEdge.h"
#include "../DataStructures/QueryNode.h"
#include "../DataStructures/Restriction.h"
-#include "../Util/SimpleLogger.h"
+#include "../Util/simple_logger.hpp"
#include "../Util/FingerPrint.h"
#include "../typedefs.h"
@@ -41,6 +41,8 @@ SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
#include <boost/filesystem.hpp>
#include <boost/filesystem/fstream.hpp>
+#include <tbb/parallel_sort.h>
+
#include <cmath>
#include <algorithm>
@@ -124,26 +126,22 @@ NodeID readBinaryOSRMGraphFromStream(std::istream &input_stream,
edge_list.reserve(m);
EdgeWeight weight;
- short type;
NodeID nameID;
int length;
- bool is_roundabout, ignore_in_grid, is_access_restricted, is_contra_flow, is_split;
- unsigned way_id;
-
+ bool is_roundabout, ignore_in_grid, is_access_restricted, is_split;
+ TravelMode travel_mode;
for (EdgeID i = 0; i < m; ++i)
{
- input_stream.read((char *)&way_id, sizeof(unsigned));
input_stream.read((char *)&source, sizeof(unsigned));
input_stream.read((char *)&target, sizeof(unsigned));
input_stream.read((char *)&length, sizeof(int));
input_stream.read((char *)&dir, sizeof(short));
input_stream.read((char *)&weight, sizeof(int));
- input_stream.read((char *)&type, sizeof(short));
input_stream.read((char *)&nameID, sizeof(unsigned));
input_stream.read((char *)&is_roundabout, sizeof(bool));
input_stream.read((char *)&ignore_in_grid, sizeof(bool));
input_stream.read((char *)&is_access_restricted, sizeof(bool));
- input_stream.read((char *)&is_contra_flow, sizeof(bool));
+ input_stream.read((char *)&travel_mode, sizeof(TravelMode));
input_stream.read((char *)&is_split, sizeof(bool));
BOOST_ASSERT_MSG(length > 0, "loaded null length edge");
@@ -161,8 +159,6 @@ NodeID readBinaryOSRMGraphFromStream(std::istream &input_stream,
forward = false;
}
- BOOST_ASSERT(type >= 0);
-
// translate the external NodeIDs to internal IDs
auto internal_id_iter = ext_to_int_id_map.find(source);
if (ext_to_int_id_map.find(source) == ext_to_int_id_map.end())
@@ -190,22 +186,20 @@ NodeID readBinaryOSRMGraphFromStream(std::istream &input_stream,
std::swap(forward, backward);
}
- edge_list.emplace_back(way_id,
- source,
+ edge_list.emplace_back(source,
target,
nameID,
weight,
forward,
backward,
- type,
is_roundabout,
ignore_in_grid,
is_access_restricted,
- is_contra_flow,
+ travel_mode,
is_split);
}
- std::sort(edge_list.begin(), edge_list.end());
+ tbb::parallel_sort(edge_list.begin(), edge_list.end());
for (unsigned i = 1; i < edge_list.size(); ++i)
{
if ((edge_list[i - 1].target == edge_list[i].target) &&
@@ -304,34 +298,29 @@ NodeID readBinaryOSRMGraphFromStream(std::istream &input_stream,
edge_list.reserve(m);
EdgeWeight weight;
- short type;
NodeID nameID;
int length;
- unsigned way_id;
- bool is_roundabout, ignore_in_grid, is_access_restricted, is_contra_flow, is_split;
+ bool is_roundabout, ignore_in_grid, is_access_restricted, is_split;
+ TravelMode travel_mode;
for (EdgeID i = 0; i < m; ++i)
{
- input_stream.read((char *)&way_id, sizeof(unsigned));
input_stream.read((char *)&source, sizeof(unsigned));
input_stream.read((char *)&target, sizeof(unsigned));
input_stream.read((char *)&length, sizeof(int));
input_stream.read((char *)&dir, sizeof(short));
input_stream.read((char *)&weight, sizeof(int));
- input_stream.read((char *)&type, sizeof(short));
input_stream.read((char *)&nameID, sizeof(unsigned));
input_stream.read((char *)&is_roundabout, sizeof(bool));
input_stream.read((char *)&ignore_in_grid, sizeof(bool));
input_stream.read((char *)&is_access_restricted, sizeof(bool));
- input_stream.read((char *)&is_contra_flow, sizeof(bool));
+ input_stream.read((char *)&travel_mode, sizeof(TravelMode));
input_stream.read((char *)&is_split, sizeof(bool));
BOOST_ASSERT_MSG(length > 0, "loaded null length edge");
BOOST_ASSERT_MSG(weight > 0, "loaded null weight");
BOOST_ASSERT_MSG(0 <= dir && dir <= 2, "loaded bogus direction");
- BOOST_ASSERT(type >= 0);
-
// translate the external NodeIDs to internal IDs
auto internal_id_iter = ext_to_int_id_map.find(source);
if (ext_to_int_id_map.find(source) == ext_to_int_id_map.end())
@@ -362,7 +351,7 @@ NodeID readBinaryOSRMGraphFromStream(std::istream &input_stream,
target);
}
- std::sort(edge_list.begin(), edge_list.end());
+ tbb::parallel_sort(edge_list.begin(), edge_list.end());
for (unsigned i = 1; i < edge_list.size(); ++i)
{
if ((edge_list[i - 1].target == edge_list[i].target) &&
diff --git a/3party/osrm/osrm-backend/Util/MachineInfo.h b/3party/osrm/osrm-backend/Util/MachineInfo.h
index c5cb0522b6..a9a88a1ec0 100644
--- a/3party/osrm/osrm-backend/Util/MachineInfo.h
+++ b/3party/osrm/osrm-backend/Util/MachineInfo.h
@@ -33,7 +33,7 @@ enum Endianness
BigEndian = 2 };
// Function is optimized to a single 'mov eax,1' on GCC, clang and icc using -O3
-inline Endianness GetMachineEndianness()
+Endianness GetMachineEndianness()
{
int i(1);
char *p = (char *)&i;
@@ -45,7 +45,7 @@ inline Endianness GetMachineEndianness()
}
// Reverses Network Byte Order into something usable, compiles down to a bswap-mov combination
-inline unsigned SwapEndian(unsigned x)
+unsigned SwapEndian(unsigned x)
{
if (GetMachineEndianness() == LittleEndian)
{
diff --git a/3party/osrm/osrm-backend/Util/MercatorUtil.h b/3party/osrm/osrm-backend/Util/MercatorUtil.h
index 31d1139bef..b4a15b779c 100644
--- a/3party/osrm/osrm-backend/Util/MercatorUtil.h
+++ b/3party/osrm/osrm-backend/Util/MercatorUtil.h
@@ -30,14 +30,14 @@ SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
#include <cmath>
-inline float y2lat(const float a)
+inline double y2lat(const double a)
{
- return 180.f * static_cast<float>(M_1_PI) * (2.f * std::atan(std::exp(a * static_cast<float>(M_PI) / 180.f)) - static_cast<float>(M_PI_2));
+ return 180. * M_1_PI * (2. * std::atan(std::exp(a * M_PI / 180.)) - M_PI_2);
}
-inline float lat2y(const float a)
+inline double lat2y(const double a)
{
- return 180.f * static_cast<float>(M_1_PI) * std::log(std::tan(static_cast<float>(M_PI_4) + a * (static_cast<float>(M_PI) / 180.f) / 2.f));
+ return 180. * M_1_PI * std::log(std::tan(M_PI_4 + a * (M_PI / 180.) / 2.));
}
#endif // MERCATOR_UTIL_H
diff --git a/3party/osrm/osrm-backend/Util/ProgramOptions.h b/3party/osrm/osrm-backend/Util/ProgramOptions.h
index c6e5448a69..bde9766a65 100644
--- a/3party/osrm/osrm-backend/Util/ProgramOptions.h
+++ b/3party/osrm/osrm-backend/Util/ProgramOptions.h
@@ -31,7 +31,7 @@ SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
#include "GitDescription.h"
#include "IniFileUtil.h"
#include "OSRMException.h"
-#include "SimpleLogger.h"
+#include "simple_logger.hpp"
#include <osrm/ServerPaths.h>
@@ -45,6 +45,104 @@ const static unsigned INIT_OK_START_ENGINE = 0;
const static unsigned INIT_OK_DO_NOT_START_ENGINE = 1;
const static unsigned INIT_FAILED = -1;
+inline void populate_base_path(ServerPaths &server_paths)
+{
+ // populate the server_path object
+ auto path_iterator = server_paths.find("base");
+
+ // if a base path has been set, we populate it.
+ if (path_iterator != server_paths.end())
+ {
+ const std::string base_string = path_iterator->second.string();
+ SimpleLogger().Write() << "populating base path: " << base_string;
+
+ server_paths["hsgrdata"] = base_string + ".hsgr";
+ BOOST_ASSERT(server_paths.find("hsgrdata") != server_paths.end());
+ server_paths["nodesdata"] = base_string + ".nodes";
+ BOOST_ASSERT(server_paths.find("nodesdata") != server_paths.end());
+ server_paths["edgesdata"] = base_string + ".edges";
+ BOOST_ASSERT(server_paths.find("edgesdata") != server_paths.end());
+ server_paths["geometries"] = base_string + ".geometry";
+ BOOST_ASSERT(server_paths.find("geometries") != server_paths.end());
+ server_paths["ramindex"] = base_string + ".ramIndex";
+ BOOST_ASSERT(server_paths.find("ramindex") != server_paths.end());
+ server_paths["fileindex"] = base_string + ".fileIndex";
+ BOOST_ASSERT(server_paths.find("fileindex") != server_paths.end());
+ server_paths["namesdata"] = base_string + ".names";
+ BOOST_ASSERT(server_paths.find("namesdata") != server_paths.end());
+ server_paths["timestamp"] = base_string + ".timestamp";
+ BOOST_ASSERT(server_paths.find("timestamp") != server_paths.end());
+ }
+
+ // check if files are give and whether they exist at all
+ path_iterator = server_paths.find("hsgrdata");
+ if (path_iterator == server_paths.end() ||
+ !boost::filesystem::is_regular_file(path_iterator->second))
+ {
+ if (path_iterator == server_paths.end())
+ {
+ SimpleLogger().Write() << "hsgrdata unset";
+ }
+ if (!boost::filesystem::is_regular_file(path_iterator->second))
+ {
+ SimpleLogger().Write() << "not a regular file";
+ }
+
+ throw OSRMException(".hsgr not found: " + path_iterator->second.string());
+ }
+
+ path_iterator = server_paths.find("nodesdata");
+ if (path_iterator == server_paths.end() ||
+ !boost::filesystem::is_regular_file(path_iterator->second))
+ {
+ throw OSRMException(".nodes not found");
+ }
+
+ path_iterator = server_paths.find("edgesdata");
+ if (path_iterator == server_paths.end() ||
+ !boost::filesystem::is_regular_file(path_iterator->second))
+ {
+ throw OSRMException(".edges not found");
+ }
+
+ path_iterator = server_paths.find("geometries");
+ if (path_iterator == server_paths.end() ||
+ !boost::filesystem::is_regular_file(path_iterator->second))
+ {
+ throw OSRMException(".geometry not found");
+ }
+
+ path_iterator = server_paths.find("ramindex");
+ if (path_iterator == server_paths.end() ||
+ !boost::filesystem::is_regular_file(path_iterator->second))
+ {
+ throw OSRMException(".ramIndex not found");
+ }
+
+ path_iterator = server_paths.find("fileindex");
+ if (path_iterator == server_paths.end() ||
+ !boost::filesystem::is_regular_file(path_iterator->second))
+ {
+ throw OSRMException(".fileIndex not found");
+ }
+
+ path_iterator = server_paths.find("namesdata");
+ if (path_iterator == server_paths.end() ||
+ !boost::filesystem::is_regular_file(path_iterator->second))
+ {
+ throw OSRMException(".namesIndex not found");
+ }
+
+ SimpleLogger().Write() << "HSGR file:\t" << server_paths["hsgrdata"];
+ SimpleLogger().Write(logDEBUG) << "Nodes file:\t" << server_paths["nodesdata"];
+ SimpleLogger().Write(logDEBUG) << "Edges file:\t" << server_paths["edgesdata"];
+ SimpleLogger().Write(logDEBUG) << "Geometry file:\t" << server_paths["geometries"];
+ SimpleLogger().Write(logDEBUG) << "RAM file:\t" << server_paths["ramindex"];
+ SimpleLogger().Write(logDEBUG) << "Index file:\t" << server_paths["fileindex"];
+ SimpleLogger().Write(logDEBUG) << "Names file:\t" << server_paths["namesdata"];
+ SimpleLogger().Write(logDEBUG) << "Timestamp file:\t" << server_paths["timestamp"];
+}
+
// generate boost::program_options object for the routing part
inline unsigned GenerateServerProgramOptions(const int argc,
const char *argv[],
@@ -55,7 +153,6 @@ inline unsigned GenerateServerProgramOptions(const int argc,
bool &use_shared_memory,
bool &trial)
{
-
// declare a group of options that will be allowed only on command line
boost::program_options::options_description generic_options("Options");
generic_options.add_options()("version,v", "Show version")("help,h", "Show this help message")(
@@ -169,94 +266,6 @@ inline unsigned GenerateServerProgramOptions(const int argc,
if (!use_shared_memory && option_variables.count("base"))
{
- path_iterator = paths.find("base");
- BOOST_ASSERT(paths.end() != path_iterator);
- std::string base_string = path_iterator->second.string();
-
- path_iterator = paths.find("hsgrdata");
- if (path_iterator != paths.end() &&
- !boost::filesystem::is_regular_file(path_iterator->second))
- {
- path_iterator->second = base_string + ".hsgr";
- }
- else
- {
- throw OSRMException(base_string + ".hsgr not found");
- }
-
- path_iterator = paths.find("nodesdata");
- if (path_iterator != paths.end() &&
- !boost::filesystem::is_regular_file(path_iterator->second))
- {
- path_iterator->second = base_string + ".nodes";
- }
- else
- {
- throw OSRMException(base_string + ".nodes not found");
- }
-
- path_iterator = paths.find("edgesdata");
- if (path_iterator != paths.end() &&
- !boost::filesystem::is_regular_file(path_iterator->second))
- {
- path_iterator->second = base_string + ".edges";
- }
- else
- {
- throw OSRMException(base_string + ".edges not found");
- }
-
- path_iterator = paths.find("geometries");
- if (path_iterator != paths.end() &&
- !boost::filesystem::is_regular_file(path_iterator->second))
- {
- path_iterator->second = base_string + ".geometry";
- }
- else
- {
- throw OSRMException(base_string + ".geometry not found");
- }
-
- path_iterator = paths.find("ramindex");
- if (path_iterator != paths.end() &&
- !boost::filesystem::is_regular_file(path_iterator->second))
- {
- path_iterator->second = base_string + ".ramIndex";
- }
- else
- {
- throw OSRMException(base_string + ".ramIndex not found");
- }
-
- path_iterator = paths.find("fileindex");
- if (path_iterator != paths.end() &&
- !boost::filesystem::is_regular_file(path_iterator->second))
- {
- path_iterator->second = base_string + ".fileIndex";
- }
- else
- {
- throw OSRMException(base_string + ".fileIndex not found");
- }
-
- path_iterator = paths.find("namesdata");
- if (path_iterator != paths.end() &&
- !boost::filesystem::is_regular_file(path_iterator->second))
- {
- path_iterator->second = base_string + ".names";
- }
- else
- {
- throw OSRMException(base_string + ".namesIndex not found");
- }
-
- path_iterator = paths.find("timestamp");
- if (path_iterator != paths.end() &&
- !boost::filesystem::is_regular_file(path_iterator->second))
- {
- path_iterator->second = base_string + ".timestamp";
- }
-
return INIT_OK_START_ENGINE;
}
if (use_shared_memory && !option_variables.count("base"))
diff --git a/3party/osrm/osrm-backend/Util/SimpleLogger.h b/3party/osrm/osrm-backend/Util/SimpleLogger.h
deleted file mode 100644
index 648b65db66..0000000000
--- a/3party/osrm/osrm-backend/Util/SimpleLogger.h
+++ /dev/null
@@ -1,159 +0,0 @@
-/*
-
-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 SIMPLE_LOGGER_H
-#define SIMPLE_LOGGER_H
-
-#include <boost/assert.hpp>
-
-#include <cstdio>
-
-#ifdef _MSC_VER
-#include <io.h>
-#define isatty _isatty
-#define fileno _fileno
-#else
-#include <unistd.h>
-#endif
-
-#include <atomic>
-#include <ostream>
-#include <iostream>
-#include <mutex>
-#include <sstream>
-
-enum LogLevel
-{ logINFO,
- logWARNING,
- logDEBUG };
-
-const char COL_RESET[] = "\x1b[0m";
-const char RED[] = "\x1b[31m";
-const char GREEN[] = "\x1b[32m";
-const char YELLOW[] = "\x1b[33m";
-const char BLUE[] = "\x1b[34m";
-const char MAGENTA[] = "\x1b[35m";
-const char CYAN[] = "\x1b[36m";
-
-class LogPolicy
-{
- public:
- void Unmute() { m_is_mute = false; }
-
- void Mute() { m_is_mute = true; }
-
- bool IsMute() const { return m_is_mute; }
-
- static LogPolicy &GetInstance()
- {
- static LogPolicy runningInstance;
- return runningInstance;
- }
-
- LogPolicy(const LogPolicy &) = delete;
-
- private:
- LogPolicy() : m_is_mute(true) {}
- std::atomic<bool> m_is_mute;
-};
-
-class SimpleLogger
-{
- public:
- SimpleLogger() : level(logINFO) {}
-
- std::mutex& get_mutex()
- {
- static std::mutex m;
- return m;
- }
-
-
- std::ostringstream &Write(LogLevel l = logINFO)
- {
- std::lock_guard<std::mutex> lock(get_mutex());
- try
- {
- level = l;
- os << "[";
- switch (level)
- {
- case logINFO:
- os << "info";
- break;
- case logWARNING:
- os << "warn";
- break;
- case logDEBUG:
-#ifndef NDEBUG
- os << "debug";
-#endif
- break;
- default:
- BOOST_ASSERT_MSG(false, "should not happen");
- break;
- }
- os << "] ";
- }
- catch (...) {}
- return os;
- }
-
- virtual ~SimpleLogger()
- {
- std::lock_guard<std::mutex> lock(get_mutex());
- if (!LogPolicy::GetInstance().IsMute())
- {
- const bool is_terminal = ( 0 != isatty(fileno(stdout)) ? true : false);
- switch (level)
- {
- case logINFO:
- std::cout << os.str() << (is_terminal ? COL_RESET : "") << std::endl;
- break;
- case logWARNING:
- std::cerr << (is_terminal ? RED : "") << os.str() << (is_terminal ? COL_RESET : "")
- << std::endl;
- break;
- case logDEBUG:
-#ifndef NDEBUG
- std::cout << (is_terminal ? YELLOW : "") << os.str()
- << (is_terminal ? COL_RESET : "") << std::endl;
-#endif
- break;
- default:
- BOOST_ASSERT_MSG(false, "should not happen");
- break;
- }
- }
- }
-
- private:
- LogLevel level;
- std::ostringstream os;
-};
-
-#endif /* SIMPLE_LOGGER_H */
diff --git a/3party/osrm/osrm-backend/Util/StdHashExtensions.h b/3party/osrm/osrm-backend/Util/StdHashExtensions.h
index 50cd337ee2..0d310d3c39 100644
--- a/3party/osrm/osrm-backend/Util/StdHashExtensions.h
+++ b/3party/osrm/osrm-backend/Util/StdHashExtensions.h
@@ -32,32 +32,36 @@ SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
// this is largely inspired by boost's hash combine as can be found in
// "The C++ Standard Library" 2nd Edition. Nicolai M. Josuttis. 2012.
+
+namespace {
+
template<typename T>
-inline void hash_combine(std::size_t &seed, const T& val)
+void hash_combine(std::size_t &seed, const T& val)
{
seed ^= std::hash<T>()(val) + 0x9e3779b9 + (seed << 6) + (seed >> 2);
}
template<typename T>
-inline void hash_val(std::size_t &seed, const T& val)
+void hash_val(std::size_t &seed, const T& val)
{
hash_combine(seed, val);
}
template<typename T, typename ... Types>
-inline void hash_val(std::size_t &seed, const T& val, const Types& ... args)
+void hash_val(std::size_t &seed, const T& val, const Types& ... args)
{
hash_combine(seed, val);
hash_val(seed, args ...);
}
template<typename ... Types>
-inline std::size_t hash_val( const Types&... args)
+std::size_t hash_val(const Types&... args)
{
std::size_t seed = 0;
hash_val(seed, args...);
return seed;
}
+}
namespace std
{
diff --git a/3party/osrm/osrm-backend/Util/StringUtil.h b/3party/osrm/osrm-backend/Util/StringUtil.h
index 94705d8100..3c9375ca73 100644
--- a/3party/osrm/osrm-backend/Util/StringUtil.h
+++ b/3party/osrm/osrm-backend/Util/StringUtil.h
@@ -29,13 +29,10 @@ SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
#define STRINGUTIL_H
#include <boost/algorithm/string.hpp>
-#include <boost/spirit/include/karma.hpp>
-#include <boost/spirit/include/qi.hpp>
#include <cstdio>
#include <cctype>
#include <string>
-#include <type_traits>
#include <vector>
// precision: position after decimal point
@@ -74,151 +71,6 @@ template <int length, int precision> static inline char *printInt(char *buffer,
return buffer;
}
-// convert scoped enums to integers
-template <typename Enumeration>
-auto as_integer(Enumeration const value)
- -> typename std::underlying_type<Enumeration>::type
-{
- return static_cast<typename std::underlying_type<Enumeration>::type>(value);
-}
-
-static inline std::string IntToString(const int value)
-{
- std::string output;
- std::back_insert_iterator<std::string> sink(output);
- boost::spirit::karma::generate(sink, boost::spirit::karma::int_, value);
- return output;
-}
-
-static inline std::string UintToString(const unsigned value)
-{
- std::string output;
- std::back_insert_iterator<std::string> sink(output);
- boost::spirit::karma::generate(sink, boost::spirit::karma::uint_, value);
- return output;
-}
-
-static inline void int64ToString(const int64_t value, std::string &output)
-{
- output.clear();
- std::back_insert_iterator<std::string> sink(output);
- boost::spirit::karma::generate(sink, boost::spirit::karma::long_long, value);
-}
-
-static inline int StringToInt(const std::string &input)
-{
- auto first_digit = input.begin();
- // Delete any trailing white-spaces
- while (first_digit != input.end() && std::isspace(*first_digit))
- {
- ++first_digit;
- }
- int value = 0;
- boost::spirit::qi::parse(first_digit, input.end(), boost::spirit::int_, value);
- return value;
-}
-
-static inline unsigned StringToUint(const std::string &input)
-{
- auto first_digit = input.begin();
- // Delete any trailing white-spaces
- while (first_digit != input.end() && (std::isspace(*first_digit) || '-' == *first_digit))
- {
- ++first_digit;
- }
- unsigned value = 0;
- boost::spirit::qi::parse(first_digit, input.end(), boost::spirit::uint_, value);
- return value;
-}
-
-static inline uint64_t StringToInt64(const std::string &input)
-{
- auto first_digit = input.begin();
- // Delete any trailing white-spaces
- while (first_digit != input.end() && std::isspace(*first_digit))
- {
- ++first_digit;
- }
- uint64_t value = 0;
- boost::spirit::qi::parse(first_digit, input.end(), boost::spirit::long_long, value);
- return value;
-}
-
-// source: http://tinodidriksen.com/2011/05/28/cpp-convert-string-to-double-speed/
-static inline double StringToDouble(const char *p)
-{
- double r = 0.0;
- bool neg = false;
- if (*p == '-')
- {
- neg = true;
- ++p;
- }
- while (*p >= '0' && *p <= '9')
- {
- r = (r * 10.0) + (*p - '0');
- ++p;
- }
- if (*p == '.')
- {
- double f = 0.0;
- int n = 0;
- ++p;
- while (*p >= '0' && *p <= '9')
- {
- f = (f * 10.0) + (*p - '0');
- ++p;
- ++n;
- }
- r += f / std::pow(10.0, n);
- }
- if (neg)
- {
- r = -r;
- }
- return r;
-}
-
-template <typename T>
-struct scientific_policy : boost::spirit::karma::real_policies<T>
-{
- // we want the numbers always to be in fixed format
- static int floatfield(T n) { return boost::spirit::karma::real_policies<T>::fmtflags::fixed; }
- static unsigned int precision(T) { return 6; }
-};
-typedef
-boost::spirit::karma::real_generator<double, scientific_policy<double> >
-science_type;
-
-static inline std::string FixedDoubleToString(const double value)
-{
- std::string output;
- std::back_insert_iterator<std::string> sink(output);
- boost::spirit::karma::generate(sink, science_type(), value);
- if (output.size() >= 2 && output[output.size()-2] == '.' && output[output.size()-1] == '0')
- {
- output.resize(output.size()-2);
- }
- return output;
-}
-
-static inline std::string DoubleToString(const double value)
-{
- std::string output;
- std::back_insert_iterator<std::string> sink(output);
- boost::spirit::karma::generate(sink, value);
- return output;
-}
-
-static inline void doubleToStringWithTwoDigitsBehindComma(const double value, std::string &output)
-{
- // The largest 32-bit integer is 4294967295, that is 10 chars
- // On the safe side, add 1 for sign, and 1 for trailing zero
- char buffer[12];
- sprintf(buffer, "%g", value);
- output = buffer;
-}
-
inline void replaceAll(std::string &s, const std::string &sub, const std::string &other)
{
boost::replace_all(s, sub, other);
@@ -265,8 +117,8 @@ inline std::string EscapeJSONString(const std::string &input)
}
static std::string originals[] = {"&", "\"", "<", ">", "'", "[", "]", "\\"};
-static std::string entities[] = {"&amp;", "&quot;", "&lt;", "&gt;",
- "&#39;", "&91;", "&93;", " &#92;"};
+static std::string entities[] = {
+ "&amp;", "&quot;", "&lt;", "&gt;", "&#39;", "&91;", "&93;", " &#92;"};
inline std::size_t URIDecode(const std::string &input, std::string &output)
{
@@ -294,6 +146,7 @@ inline std::size_t URIDecode(const std::string &input, std::string &output)
inline std::size_t URIDecodeInPlace(std::string &URI) { return URIDecode(URI, URI); }
+// TODO: remove after switch to libosmium
inline bool StringStartsWith(const std::string &input, const std::string &prefix)
{
return boost::starts_with(input, prefix);
diff --git a/3party/osrm/osrm-backend/Util/TrigonometryTables.h b/3party/osrm/osrm-backend/Util/TrigonometryTables.h
index d14540482d..64076a23c3 100644
--- a/3party/osrm/osrm-backend/Util/TrigonometryTables.h
+++ b/3party/osrm/osrm-backend/Util/TrigonometryTables.h
@@ -722,7 +722,7 @@ constexpr unsigned short atan_table[4096] = {
// max value is pi/4
constexpr double SCALING_FACTOR = 4. / M_PI * 0xFFFF;
-inline double atan2_lookup(double y, double x)
+double atan2_lookup(double y, double x)
{
if (std::abs(x) < std::numeric_limits<double>::epsilon())
{
diff --git a/3party/osrm/osrm-backend/Util/cast.hpp b/3party/osrm/osrm-backend/Util/cast.hpp
new file mode 100644
index 0000000000..7807eda9ac
--- /dev/null
+++ b/3party/osrm/osrm-backend/Util/cast.hpp
@@ -0,0 +1,188 @@
+/*
+
+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 CAST_HPP
+#define CAST_HPP
+
+#include <boost/spirit/include/karma.hpp>
+#include <boost/spirit/include/qi.hpp>
+
+#include <string>
+#include <type_traits>
+
+struct cast
+{
+ // convert scoped enums to integers
+ template <typename Enumeration>
+ static auto enum_to_underlying(Enumeration const value) -> typename std::underlying_type<Enumeration>::type
+ {
+ return static_cast<typename std::underlying_type<Enumeration>::type>(value);
+ }
+
+ template <typename Number>
+ static typename std::enable_if<std::is_integral<Number>::value, std::string>::type
+ integral_to_string(const Number value)
+ {
+ std::string output;
+ std::back_insert_iterator<std::string> sink(output);
+
+ if (8 == sizeof(Number))
+ {
+ boost::spirit::karma::generate(sink, boost::spirit::karma::long_long, value);
+ }
+ else
+ {
+ if (std::is_signed<Number>::value)
+ {
+ boost::spirit::karma::generate(sink, boost::spirit::karma::int_, value);
+ }
+ else
+ {
+ boost::spirit::karma::generate(sink, boost::spirit::karma::uint_, value);
+ }
+ }
+ return output;
+ }
+
+ static int string_to_int(const std::string &input)
+ {
+ auto first_digit = input.begin();
+ // Delete any trailing white-spaces
+ while (first_digit != input.end() && std::isspace(*first_digit))
+ {
+ ++first_digit;
+ }
+ int value = 0;
+ boost::spirit::qi::parse(first_digit, input.end(), boost::spirit::int_, value);
+ return value;
+ }
+
+ static unsigned string_to_uint(const std::string &input)
+ {
+ auto first_digit = input.begin();
+ // Delete any trailing white-spaces
+ while (first_digit != input.end() && (std::isspace(*first_digit) || '-' == *first_digit))
+ {
+ ++first_digit;
+ }
+ unsigned value = 0;
+ boost::spirit::qi::parse(first_digit, input.end(), boost::spirit::uint_, value);
+ return value;
+ }
+
+ static uint64_t string_to_uint64(const std::string &input)
+ {
+ auto first_digit = input.begin();
+ // Delete any trailing white-spaces
+ while (first_digit != input.end() && std::isspace(*first_digit))
+ {
+ ++first_digit;
+ }
+ uint64_t value = 0;
+ boost::spirit::qi::parse(first_digit, input.end(), boost::spirit::long_long, value);
+ return value;
+ }
+
+ // source: http://tinodidriksen.com/2011/05/28/cpp-convert-string-to-double-speed/
+ static double string_to_double(const char *p)
+ {
+ double r = 0.0;
+ bool neg = false;
+ if (*p == '-')
+ {
+ neg = true;
+ ++p;
+ }
+ while (*p >= '0' && *p <= '9')
+ {
+ r = (r * 10.0) + (*p - '0');
+ ++p;
+ }
+ if (*p == '.')
+ {
+ double f = 0.0;
+ int n = 0;
+ ++p;
+ while (*p >= '0' && *p <= '9')
+ {
+ f = (f * 10.0) + (*p - '0');
+ ++p;
+ ++n;
+ }
+ r += f / std::pow(10.0, n);
+ }
+ if (neg)
+ {
+ r = -r;
+ }
+ return r;
+ }
+
+ template <typename T> struct scientific_policy : boost::spirit::karma::real_policies<T>
+ {
+ // we want the numbers always to be in fixed format
+ static int floatfield(T n)
+ {
+ return boost::spirit::karma::real_policies<T>::fmtflags::fixed;
+ }
+ static unsigned int precision(T) { return 6; }
+ };
+ typedef boost::spirit::karma::real_generator<double, scientific_policy<double>> science_type;
+
+ static std::string double_fixed_to_string(const double value)
+ {
+ std::string output;
+ std::back_insert_iterator<std::string> sink(output);
+ boost::spirit::karma::generate(sink, science_type(), value);
+ if (output.size() >= 2 && output[output.size() - 2] == '.' &&
+ output[output.size() - 1] == '0')
+ {
+ output.resize(output.size() - 2);
+ }
+ return output;
+ }
+
+ static std::string double_to_string(const double value)
+ {
+ std::string output;
+ std::back_insert_iterator<std::string> sink(output);
+ boost::spirit::karma::generate(sink, value);
+ return output;
+ }
+
+ static void double_with_two_digits_to_string(const double value,
+ std::string &output)
+ {
+ // The largest 32-bit integer is 4294967295, that is 10 chars
+ // On the safe side, add 1 for sign, and 1 for trailing zero
+ char buffer[12];
+ sprintf(buffer, "%g", value);
+ output = buffer;
+ }
+};
+
+#endif // CAST_HPP
diff --git a/3party/osrm/osrm-backend/Util/ComputeAngle.h b/3party/osrm/osrm-backend/Util/compute_angle.cpp
index 02f678a075..b6350e445f 100644
--- a/3party/osrm/osrm-backend/Util/ComputeAngle.h
+++ b/3party/osrm/osrm-backend/Util/compute_angle.cpp
@@ -25,33 +25,27 @@ SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
*/
-#ifndef COMPUTE_ANGLE_H
-#define COMPUTE_ANGLE_H
+#include "compute_angle.hpp"
#include "TrigonometryTables.h"
#include "../Util/MercatorUtil.h"
#include <osrm/Coordinate.h>
-#include <boost/assert.hpp>
#include <cmath>
-/* Get angle of line segment (A,C)->(C,B), atan2 magic, formerly cosine theorem*/
-template <class CoordinateT>
-inline static double GetAngleBetweenThreeFixedPointCoordinates(const CoordinateT &A,
- const CoordinateT &C,
- const CoordinateT &B)
+double ComputeAngle::OfThreeFixedPointCoordinates(const FixedPointCoordinate &A,
+ const FixedPointCoordinate &C,
+ const FixedPointCoordinate &B)
{
const double v1x = (A.lon - C.lon) / COORDINATE_PRECISION;
const double v1y = lat2y(A.lat / COORDINATE_PRECISION) - lat2y(C.lat / COORDINATE_PRECISION);
const double v2x = (B.lon - C.lon) / COORDINATE_PRECISION;
const double v2y = lat2y(B.lat / COORDINATE_PRECISION) - lat2y(C.lat / COORDINATE_PRECISION);
- double angle = (atan2_lookup(v2y, v2x) - atan2_lookup(v1y, v1x)) * 180 / M_PI;
- while (angle < 0)
+ double angle = (atan2_lookup(v2y, v2x) - atan2_lookup(v1y, v1x)) * 180. / M_PI;
+ while (angle < 0.)
{
- angle += 360;
+ angle += 360.;
}
return angle;
}
-
-#endif // COMPUTE_ANGLE_H
diff --git a/3party/osrm/osrm-backend/Util/compute_angle.hpp b/3party/osrm/osrm-backend/Util/compute_angle.hpp
new file mode 100644
index 0000000000..72c861a45d
--- /dev/null
+++ b/3party/osrm/osrm-backend/Util/compute_angle.hpp
@@ -0,0 +1,41 @@
+/*
+
+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 COMPUTE_ANGLE_HPP
+#define COMPUTE_ANGLE_HPP
+
+struct FixedPointCoordinate;
+struct NodeInfo;
+
+struct ComputeAngle
+{
+ /* Get angle of line segment (A,C)->(C,B), atan2 magic, formerly cosine theorem*/
+ static double OfThreeFixedPointCoordinates(const FixedPointCoordinate &A,
+ const FixedPointCoordinate &C,
+ const FixedPointCoordinate &B);
+};
+#endif // COMPUTE_ANGLE_HPP
diff --git a/3party/osrm/osrm-backend/Util/ContainerUtils.h b/3party/osrm/osrm-backend/Util/container.hpp
index ae61a15b09..86e9de31ca 100644
--- a/3party/osrm/osrm-backend/Util/ContainerUtils.h
+++ b/3party/osrm/osrm-backend/Util/container.hpp
@@ -25,26 +25,29 @@ SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
*/
-#ifndef CONTAINERUTILS_H_
-#define CONTAINERUTILS_H_
+#ifndef CONTAINER_HPP_
+#define CONTAINER_HPP_
#include <algorithm>
+#include <iterator>
#include <vector>
-template <typename T> inline void sort_unique_resize(std::vector<T> &vector)
+namespace osrm
+{
+template <typename T> void sort_unique_resize(std::vector<T> &vector)
{
std::sort(vector.begin(), vector.end());
const auto number_of_unique_elements = std::unique(vector.begin(), vector.end()) - vector.begin();
vector.resize(number_of_unique_elements);
}
-// template <typename T> inline void sort_unique_resize_shrink_vector(std::vector<T> &vector)
+// template <typename T> void sort_unique_resize_shrink_vector(std::vector<T> &vector)
// {
// sort_unique_resize(vector);
// vector.shrink_to_fit();
// }
-// template <typename T> inline void remove_consecutive_duplicates_from_vector(std::vector<T> &vector)
+// template <typename T> void remove_consecutive_duplicates_from_vector(std::vector<T> &vector)
// {
// const auto number_of_unique_elements = std::unique(vector.begin(), vector.end()) - vector.begin();
// vector.resize(number_of_unique_elements);
@@ -58,15 +61,15 @@ Function for_each_pair(ForwardIterator begin, ForwardIterator end, Function func
return function;
}
- ForwardIterator next = begin;
- ++next;
+ auto next = begin;
+ next = std::next(next);
while (next != end)
{
function(*begin, *next);
- ++begin; ++next;
+ begin = std::next(begin); next = std::next(next);
}
return function;
}
-
-#endif /* CONTAINERUTILS_H_ */
+}
+#endif /* CONTAINER_HPP_ */
diff --git a/3party/osrm/osrm-backend/Util/floating_point.hpp b/3party/osrm/osrm-backend/Util/floating_point.hpp
new file mode 100644
index 0000000000..5c4810279a
--- /dev/null
+++ b/3party/osrm/osrm-backend/Util/floating_point.hpp
@@ -0,0 +1,44 @@
+/*
+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 FLOATING_POINT_HPP
+#define FLOATING_POINT_HPP
+
+#include <cmath>
+
+#include <limits>
+#include <type_traits>
+
+namespace osrm
+{
+template <typename FloatT> bool epsilon_compare(const FloatT number1, const FloatT number2)
+{
+ static_assert(std::is_floating_point<FloatT>::value, "type must be floating point");
+ return (std::abs(number1 - number2) < std::numeric_limits<FloatT>::epsilon());
+}
+}
+
+#endif // FLOATING_POINT_HPP
diff --git a/3party/osrm/osrm-backend/Util/make_unique.hpp b/3party/osrm/osrm-backend/Util/make_unique.hpp
new file mode 100644
index 0000000000..07786feaac
--- /dev/null
+++ b/3party/osrm/osrm-backend/Util/make_unique.hpp
@@ -0,0 +1,57 @@
+/*
+
+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 MAKE_UNIQUE_H_
+#define MAKE_UNIQUE_H_
+
+#include <cstdlib>
+#include <memory>
+#include <type_traits>
+
+namespace osrm
+{
+// Taken from http://msdn.microsoft.com/en-us/library/dn439780.asp
+// Note, that the snippet was broken there and needed minor massaging
+
+// make_unique<T>
+template <class T, class... Types> std::unique_ptr<T> make_unique(Types &&... Args)
+{
+ return (std::unique_ptr<T>(new T(std::forward<Types>(Args)...)));
+}
+
+// make_unique<T[]>
+template <class T> std::unique_ptr<T[]> make_unique(std::size_t Size)
+{
+ return (std::unique_ptr<T>(new T[Size]()));
+}
+
+// make_unique<T[N]> disallowed
+template <class T, class... Types>
+typename std::enable_if<std::extent<T>::value != 0, void>::type make_unique(Types &&...) = delete;
+}
+
+#endif //MAKE_UNIQUE_H_
diff --git a/3party/osrm/osrm-backend/Util/simple_logger.cpp b/3party/osrm/osrm-backend/Util/simple_logger.cpp
new file mode 100644
index 0000000000..5442f54c15
--- /dev/null
+++ b/3party/osrm/osrm-backend/Util/simple_logger.cpp
@@ -0,0 +1,135 @@
+/*
+
+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 "simple_logger.hpp"
+
+#include "OSRMException.h"
+
+#include <boost/assert.hpp>
+
+#include <cstdio>
+
+#ifdef _MSC_VER
+#include <io.h>
+#define isatty _isatty
+#define fileno _fileno
+#else
+#include <unistd.h>
+#endif
+
+#include <ostream>
+#include <iostream>
+#include <mutex>
+
+namespace
+{
+static const char COL_RESET[] { "\x1b[0m"};
+static const char RED[] { "\x1b[31m"};
+#ifndef NDEBUG
+static const char YELLOW[] { "\x1b[33m"};
+#endif
+// static const char GREEN[] { "\x1b[32m"};
+// static const char BLUE[] { "\x1b[34m"};
+// static const char MAGENTA[] { "\x1b[35m"};
+// static const char CYAN[] { "\x1b[36m"};
+}
+
+void LogPolicy::Unmute() { m_is_mute = false; }
+
+void LogPolicy::Mute() { m_is_mute = true; }
+
+bool LogPolicy::IsMute() const { return m_is_mute; }
+
+LogPolicy &LogPolicy::GetInstance()
+{
+ static LogPolicy runningInstance;
+ return runningInstance;
+}
+
+SimpleLogger::SimpleLogger() : level(logINFO) {}
+
+std::mutex &SimpleLogger::get_mutex()
+{
+ static std::mutex m;
+ return m;
+}
+
+std::ostringstream &SimpleLogger::Write(LogLevel l)
+{
+ std::lock_guard<std::mutex> lock(get_mutex());
+ try
+ {
+ level = l;
+ os << "[";
+ switch (level)
+ {
+ case logWARNING:
+ os << "warn";
+ break;
+ case logDEBUG:
+#ifndef NDEBUG
+ os << "debug";
+#endif
+ break;
+ default: //logINFO:
+ os << "info";
+ break;
+ }
+ os << "] ";
+ }
+ catch (const std::exception &e)
+ {
+ // encapsulate in OSRMException
+ throw OSRMException(std::string(e.what()) + ", getting ostringstream");
+ }
+ return os;
+}
+
+SimpleLogger::~SimpleLogger()
+{
+ std::lock_guard<std::mutex> lock(get_mutex());
+ if (!LogPolicy::GetInstance().IsMute())
+ {
+ const bool is_terminal = static_cast<bool>(isatty(fileno(stdout)));
+ switch (level)
+ {
+ case logWARNING:
+ std::cerr << (is_terminal ? RED : "") << os.str() << (is_terminal ? COL_RESET : "")
+ << std::endl;
+ break;
+ case logDEBUG:
+#ifndef NDEBUG
+ std::cout << (is_terminal ? YELLOW : "") << os.str() << (is_terminal ? COL_RESET : "")
+ << std::endl;
+#endif
+ break;
+ default: //logINFO:
+ std::cout << os.str() << (is_terminal ? COL_RESET : "") << std::endl;
+ break;
+ }
+ }
+}
diff --git a/3party/osrm/osrm-backend/Server/ServerFactory.h b/3party/osrm/osrm-backend/Util/simple_logger.hpp
index 5e037cf058..2f7d1ed79b 100644
--- a/3party/osrm/osrm-backend/Server/ServerFactory.h
+++ b/3party/osrm/osrm-backend/Util/simple_logger.hpp
@@ -25,25 +25,50 @@ SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
*/
-#ifndef SERVER_FACTORY_H
-#define SERVER_FACTORY_H
+#ifndef SIMPLE_LOGGER_HPP
+#define SIMPLE_LOGGER_HPP
-#include "Server.h"
-#include "../Util/SimpleLogger.h"
+#include <atomic>
+#include <mutex>
+#include <sstream>
-#include <zlib.h>
+enum LogLevel
+{
+ logINFO,
+ logWARNING,
+ logDEBUG
+};
+
+class LogPolicy
+{
+ public:
+ void Unmute();
+
+ void Mute();
+
+ bool IsMute() const;
-struct ServerFactory
+ static LogPolicy &GetInstance();
+
+ LogPolicy(const LogPolicy &) = delete;
+
+ private:
+ LogPolicy() : m_is_mute(true) {}
+ std::atomic<bool> m_is_mute;
+};
+
+class SimpleLogger
{
- ServerFactory() = delete;
- ServerFactory(const ServerFactory &) = delete;
- static Server *CreateServer(std::string &ip_address, int ip_port, unsigned requested_num_threads)
- {
- SimpleLogger().Write() << "http 1.1 compression handled by zlib version " << zlibVersion();
- const unsigned hardware_threads = std::max(1u, std::thread::hardware_concurrency());
- const unsigned real_num_threads = std::min(hardware_threads, requested_num_threads);
- return new Server(ip_address, ip_port, real_num_threads);
- }
+ public:
+ SimpleLogger();
+
+ virtual ~SimpleLogger();
+ std::mutex &get_mutex();
+ std::ostringstream &Write(LogLevel l = logINFO);
+
+ private:
+ LogLevel level;
+ std::ostringstream os;
};
-#endif // SERVER_FACTORY_H
+#endif /* SIMPLE_LOGGER_HPP */
diff --git a/3party/osrm/osrm-backend/appveyor.yml b/3party/osrm/osrm-backend/appveyor.yml
index 6635c5117b..9c3dcdee24 100644
--- a/3party/osrm/osrm-backend/appveyor.yml
+++ b/3party/osrm/osrm-backend/appveyor.yml
@@ -23,6 +23,7 @@ platform: x64
install:
# by default, all script lines are interpreted as batch
+ - nuget install protobuf
- cd c:\projects\osrm
- curl -O http://build.project-osrm.org/libs_osrm_%Configuration%.7z
- 7z x libs_osrm_%Configuration%.7z | find ":"
@@ -33,16 +34,16 @@ build_script:
- cd build
- echo Running cmake...
- call "%VS120COMNTOOLS%\..\..\VC\vcvarsall.bat" x86_amd64
+ - SET PATH=C:\Program Files (x86)\MSBuild\12.0\bin\;%PATH%
- SET P=c:/projects/osrm
- set TBB_INSTALL_DIR=%P%/tbb
- set TBB_ARCH_PLATFORM=intel64/vc12
- - cmake .. -G "NMake Makefiles" -DCMAKE_BUILD_TYPE=%Configuration% -DBZIP2_INCLUDE_DIR=%P%/libs/include -DBZIP2_LIBRARIES=%P%/libs/lib/libbz2.lib -DCMAKE_INSTALL_PREFIX=%P%/libs -DBOOST_ROOT=%P%/boost_min -DBoost_USE_STATIC_LIBS=ON
- - nmake
- - nmake tests
- - nmake benchmarks
+ - cmake .. -G "Visual Studio 12 Win64" -DCMAKE_BUILD_TYPE=%Configuration% -DBZIP2_INCLUDE_DIR=%P%/libs/include -DBZIP2_LIBRARIES=%P%/libs/lib/libbz2.lib -DCMAKE_INSTALL_PREFIX=%P%/libs -DBOOST_ROOT=%P%/boost_min -DBoost_USE_STATIC_LIBS=ON -T CTP_Nov2013
+ - msbuild /clp:Verbosity=minimal /nologo OSRM.sln
+ - msbuild /clp:Verbosity=minimal /nologo tests.vcxproj
- if "%APPVEYOR_REPO_BRANCH%"=="develop" (7z a %P%/osrm_%Configuration%.zip *.exe *.pdb %P%/libs/bin/*.dll -tzip)
- set PATH=%PATH%;c:/projects/osrm/libs/bin
- - cd c:/projects/osrm/build
+ - cd c:/projects/osrm/build/%Configuration%
- datastructure-tests.exe
test: off
diff --git a/3party/osrm/osrm-backend/cmake/CPackDebianConfig.cmake b/3party/osrm/osrm-backend/cmake/CPackDebianConfig.cmake
new file mode 100644
index 0000000000..065c429001
--- /dev/null
+++ b/3party/osrm/osrm-backend/cmake/CPackDebianConfig.cmake
@@ -0,0 +1,44 @@
+IF(NOT CMAKE_SYSTEM_NAME STREQUAL "Linux")
+ MESSAGE(FATAL_ERROR "Cannot configure CPack to generate Debian packages on non-linux systems.")
+ENDIF()
+
+INCLUDE(FindDebArch)
+
+SET(CPACK_RESOURCE_FILE_README "${CMAKE_SOURCE_DIR}/README.md")
+SET(CPACK_RESOURCE_FILE_LICENSE "${CMAKE_SOURCE_DIR}/LICENCE.TXT")
+SET(CPACK_PACKAGE_DESCRIPTION_FILE "${CPACK_RESOURCE_FILE_README}")
+SET(CPACK_PACKAGE_VERSION_MAJOR "0")
+SET(CPACK_PACKAGE_VERSION_MINOR "4")
+SET(CPACK_PACKAGE_VERSION_PATCH "3")
+
+SET(CPACK_PACKAGE_VERSION "${CPACK_PACKAGE_VERSION_MAJOR}.${CPACK_PACKAGE_VERSION_MINOR}.${CPACK_PACKAGE_VERSION_PATCH}")
+
+string(TOLOWER "${CMAKE_PROJECT_NAME}" LOWER_PROJECT_NAME)
+SET(CPACK_PACKAGE_FILE_NAME "${LOWER_PROJECT_NAME}_${CPACK_PACKAGE_VERSION}_${CPACK_DEBIAN_PACKAGE_ARCHITECTURE}")
+SET(CPACK_SOURCE_PACKAGE_FILE_NAME "${LOWER_PROJECT_NAME}_${CPACK_PACKAGE_VERSION}_orig")
+SET(CPACK_PACKAGE_DESCRIPTION_SUMMARY "Open Source Routing Machine (OSRM).")
+SET(CPACK_PACKAGE_DESCRIPTION "Open Source Routing Machine (OSRM) is a routing engine.")
+
+# To create a proper Debian/Ubuntu package, the following CMake
+# options should be used:
+
+SET(CPACK_STRIP_FILES "TRUE")
+SET(CPACK_INCLUDE_TOPLEVEL_DIRECTORY "FALSE")
+SET(CPACK_GENERATOR "DEB")
+
+SET(CPACK_DEBIAN_PACKAGE_NAME "${CPACK_PACKAGE_NAME}${VERSION_SUFFIX}")
+SET(CPACK_DEBIAN_PACKAGE_VERSION "${CPACK_PACKAGE_VERSION}${CPACK_PACKAGE_REVISION}")
+SET(CPACK_DEBIAN_PACKAGE_MAINTAINER "Dennis Luxen <info@project-osrm.org>")
+SET(CPACK_DEBIAN_PACKAGE_PRIORITY "optional")
+SET(CPACK_DEBIAN_PACKAGE_SECTION "devel")
+SET(CPACK_DEBIAN_PACKAGE_DESCRIPTION "Open Source Routing Machine (OSRM) is a high-performance routing engine.
+ It combines sophisticated routing algorithms with the open and free data of the OpenStreetMap."
+)
+SET(CPACK_DEBIAN_PACKAGE_DEPENDS "libc6-dev, libprotobuf-dev, libosmpbf-dev, libbz2-1.0, libstxxl1, libxml2, libzip2, liblua5.1-0, libtbb2, libboost-all-dev")
+
+file(GLOB_RECURSE ProfileGlob ${CMAKE_SOURCE_DIR}/profiles/*)
+install(FILES ${ProfileGlob} DESTINATION "share/doc/${LOWER_PROJECT_NAME}/profiles")
+CONFIGURE_FILE (${CMAKE_SOURCE_DIR}/cmake/postinst.in postinst)
+set(CPACK_DEBIAN_PACKAGE_CONTROL_EXTRA "${CMAKE_CURRENT_BINARY_DIR}/postinst;${CMAKE_CURRENT_BINARY_DIR}/copyright;")
+
+MESSAGE(STATUS "Debian Package: ${CPACK_DEBIAN_PACKAGE_NAME} (${CPACK_DEBIAN_PACKAGE_VERSION}) [${CPACK_PACKAGE_FILE_NAME}.deb]")
diff --git a/3party/osrm/osrm-backend/cmake/FindDebArch.cmake b/3party/osrm/osrm-backend/cmake/FindDebArch.cmake
new file mode 100644
index 0000000000..5b405bc39b
--- /dev/null
+++ b/3party/osrm/osrm-backend/cmake/FindDebArch.cmake
@@ -0,0 +1,19 @@
+#
+# Copyright (C) 2013 Emmanuel Roullit <emmanuel.roullit@gmail.com>
+#
+
+IF(NOT CPACK_DEBIAN_PACKAGE_ARCHITECTURE)
+ FIND_PROGRAM(DPKG_CMD dpkg)
+ IF(NOT DPKG_CMD)
+ EXECUTE_PROCESS(COMMAND uname -p
+ OUTPUT_VARIABLE CPACK_DEBIAN_PACKAGE_ARCHITECTURE
+ OUTPUT_STRIP_TRAILING_WHITESPACE
+ )
+ MESSAGE(STATUS "Can not find dpkg in your path, default to uname -p: ${CPACK_DEBIAN_PACKAGE_ARCHITECTURE}.")
+ ELSE(NOT DPKG_CMD)
+ EXECUTE_PROCESS(COMMAND "${DPKG_CMD}" --print-architecture
+ OUTPUT_VARIABLE CPACK_DEBIAN_PACKAGE_ARCHITECTURE
+ OUTPUT_STRIP_TRAILING_WHITESPACE
+ )
+ ENDIF(NOT DPKG_CMD)
+ENDIF(NOT CPACK_DEBIAN_PACKAGE_ARCHITECTURE)
diff --git a/3party/osrm/osrm-backend/cmake/check_luabind.cmake b/3party/osrm/osrm-backend/cmake/check_luabind.cmake
new file mode 100644
index 0000000000..18f065666b
--- /dev/null
+++ b/3party/osrm/osrm-backend/cmake/check_luabind.cmake
@@ -0,0 +1,40 @@
+INCLUDE (CheckCXXSourceCompiles)
+unset(LUABIND_WORKS CACHE)
+unset(LUABIND51_WORKS CACHE)
+set (LUABIND_CHECK_SRC "#include \"lua.h\"\n#include <luabind/luabind.hpp>\n int main() { lua_State *myLuaState = luaL_newstate(); luabind::open(myLuaState); return 0;}")
+set (CMAKE_TRY_COMPILE_CONFIGURATION ${CMAKE_BUILD_TYPE})
+set (CMAKE_REQUIRED_INCLUDES "${Boost_INCLUDE_DIR};${LUABIND_INCLUDE_DIR};${LUA_INCLUDE_DIR}")
+set (CMAKE_REQUIRED_LIBRARIES "${LUABIND_LIBRARY};${LUA_LIBRARY}")
+
+find_package(Lua52)
+if(NOT APPLE)
+ find_package(LuaJIT 5.2)
+endif()
+if(LUA52_FOUND)
+ set (CMAKE_REQUIRED_INCLUDES "${Boost_INCLUDE_DIR};${LUABIND_INCLUDE_DIR};${LUA_INCLUDE_DIR}")
+ set (CMAKE_REQUIRED_LIBRARIES "${LUABIND_LIBRARY};${LUA_LIBRARY}")
+ CHECK_CXX_SOURCE_COMPILES("${LUABIND_CHECK_SRC}" LUABIND_WORKS)
+endif()
+
+if(LUABIND_WORKS)
+ message(STATUS "Luabind/Lua5.2 combination working with ${LUA_LIBRARY}")
+else()
+ message(STATUS "Luabind/Lua5.2 not feasible, falling back to Lua 5.1.")
+ unset(LUA_FOUND CACHE)
+ unset(LUA_INCLUDE_DIR CACHE)
+ unset(LUA_LIBRARY CACHE)
+ find_package(Lua51 REQUIRED)
+ if(NOT APPLE)
+ find_package(LuaJIT 5.1)
+ endif()
+ set (CMAKE_REQUIRED_INCLUDES "${Boost_INCLUDE_DIR};${LUABIND_INCLUDE_DIR};${LUA_INCLUDE_DIR}")
+ set (CMAKE_REQUIRED_LIBRARIES "${LUABIND_LIBRARY};${LUA_LIBRARY}")
+
+ CHECK_CXX_SOURCE_COMPILES("${LUABIND_CHECK_SRC}" LUABIND51_WORKS)
+
+ if(LUABIND51_WORKS)
+ message(STATUS "Luabind works with Lua 5.1 at ${LUA_LIBRARY}")
+ else()
+ message(FATAL_ERROR "Luabind does not work with Lua 5.1 at ${LUA_LIBRARY}, no working Luabind found")
+ endif()
+endif()
diff --git a/3party/osrm/osrm-backend/cmake/postinst.in b/3party/osrm/osrm-backend/cmake/postinst.in
new file mode 100644
index 0000000000..92f2fde4fb
--- /dev/null
+++ b/3party/osrm/osrm-backend/cmake/postinst.in
@@ -0,0 +1,2 @@
+#/usr/bin/env bash
+ln -s /usr/share/doc/@CMAKE_PROJECT_NAME@/profiles/car.lua @CMAKE_INSTALL_PREFIX@/profile.lua
diff --git a/3party/osrm/osrm-backend/datastore.cpp b/3party/osrm/osrm-backend/datastore.cpp
index 34c4e0477e..e26ab4b8ac 100644
--- a/3party/osrm/osrm-backend/datastore.cpp
+++ b/3party/osrm/osrm-backend/datastore.cpp
@@ -38,15 +38,15 @@ SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
#include "Server/DataStructures/SharedBarriers.h"
#include "Util/BoostFileSystemFix.h"
#include "Util/DataStoreOptions.h"
-#include "Util/SimpleLogger.h"
+#include "Util/simple_logger.hpp"
#include "Util/FingerPrint.h"
#include "typedefs.h"
#include <osrm/Coordinate.h>
-typedef BaseDataFacade<QueryEdge::EdgeData>::RTreeLeaf RTreeLeaf;
-typedef StaticRTree<RTreeLeaf, ShM<FixedPointCoordinate, true>::vector, true>::TreeNode RTreeNode;
-typedef StaticGraph<QueryEdge::EdgeData> QueryGraph;
+using RTreeLeaf = BaseDataFacade<QueryEdge::EdgeData>::RTreeLeaf;
+using RTreeNode = StaticRTree<RTreeLeaf, ShM<FixedPointCoordinate, true>::vector, true>::TreeNode;
+using QueryGraph = StaticGraph<QueryEdge::EdgeData>;
#ifdef __linux__
#include <sys/mman.h>
@@ -90,33 +90,21 @@ void delete_region(const SharedDataType region)
}
}
-// find all existing shmem regions and remove them.
-void springclean()
-{
- SimpleLogger().Write() << "spring-cleaning all shared memory regions";
- delete_region(DATA_1);
- delete_region(LAYOUT_1);
- delete_region(DATA_2);
- delete_region(LAYOUT_2);
- delete_region(CURRENT_REGIONS);
-}
-
int main(const int argc, const char *argv[])
{
LogPolicy::GetInstance().Unmute();
SharedBarriers barrier;
-#ifdef __linux__
- // try to disable swapping on Linux
- const bool lock_flags = MCL_CURRENT | MCL_FUTURE;
- if (-1 == mlockall(lock_flags))
- {
- SimpleLogger().Write(logWARNING) << "Process " << argv[0] << " could not request RAM lock";
- }
-#endif
-
try
{
+#ifdef __linux__
+ // try to disable swapping on Linux
+ const bool lock_flags = MCL_CURRENT | MCL_FUTURE;
+ if (-1 == mlockall(lock_flags))
+ {
+ SimpleLogger().Write(logWARNING) << "Process " << argv[0] << " could not request RAM lock";
+ }
+#endif
try
{
boost::interprocess::scoped_lock<boost::interprocess::named_mutex> pending_lock(
@@ -138,14 +126,8 @@ int main(const int argc, const char *argv[])
SimpleLogger().Write(logDEBUG) << "Checking input parameters";
ServerPaths server_paths;
- bool should_springclean = false;
- if (!GenerateDataStoreOptions(argc, argv, server_paths, should_springclean))
- {
- return 0;
- }
- if (should_springclean)
+ if (!GenerateDataStoreOptions(argc, argv, server_paths))
{
- springclean();
return 0;
}
@@ -267,6 +249,8 @@ int main(const int argc, const char *argv[])
number_of_original_edges);
shared_layout_ptr->SetBlockSize<unsigned>(SharedDataLayout::NAME_ID_LIST,
number_of_original_edges);
+ shared_layout_ptr->SetBlockSize<TravelMode>(SharedDataLayout::TRAVEL_MODE,
+ number_of_original_edges);
shared_layout_ptr->SetBlockSize<TurnInstruction>(SharedDataLayout::TURN_INSTRUCTION,
number_of_original_edges);
// note: there are 32 geometry indicators in one unsigned block
@@ -302,7 +286,7 @@ int main(const int argc, const char *argv[])
// load graph edge size
unsigned number_of_graph_edges = 0;
hsgr_input_stream.read((char *)&number_of_graph_edges, sizeof(unsigned));
- BOOST_ASSERT_MSG(0 != number_of_graph_edges, "number of graph edges is zero");
+ // BOOST_ASSERT_MSG(0 != number_of_graph_edges, "number of graph edges is zero");
shared_layout_ptr->SetBlockSize<QueryGraph::EdgeArrayEntry>(
SharedDataLayout::GRAPH_EDGE_LIST, number_of_graph_edges);
@@ -360,7 +344,6 @@ int main(const int argc, const char *argv[])
geometry_input_stream.read((char *)&number_of_compressed_geometries, sizeof(unsigned));
shared_layout_ptr->SetBlockSize<unsigned>(SharedDataLayout::GEOMETRIES_LIST,
number_of_compressed_geometries);
-
// allocate shared memory block
SimpleLogger().Write() << "allocating shared memory of "
<< shared_layout_ptr->GetSizeOfLayout() << " bytes";
@@ -426,6 +409,10 @@ int main(const int argc, const char *argv[])
unsigned *name_id_ptr = shared_layout_ptr->GetBlockPtr<unsigned, true>(
shared_memory_ptr, SharedDataLayout::NAME_ID_LIST);
+ TravelMode *travel_mode_ptr =
+ shared_layout_ptr->GetBlockPtr<TravelMode, true>(
+ shared_memory_ptr, SharedDataLayout::TRAVEL_MODE);
+
TurnInstruction *turn_instructions_ptr =
shared_layout_ptr->GetBlockPtr<TurnInstruction, true>(
shared_memory_ptr, SharedDataLayout::TURN_INSTRUCTION);
@@ -439,6 +426,7 @@ int main(const int argc, const char *argv[])
edges_input_stream.read((char *)&(current_edge_data), sizeof(OriginalEdgeData));
via_node_ptr[i] = current_edge_data.via_node;
name_id_ptr[i] = current_edge_data.name_id;
+ travel_mode_ptr[i] = current_edge_data.travel_mode;
turn_instructions_ptr[i] = current_edge_data.turn_instruction;
const unsigned bucket = i / 32;
diff --git a/3party/osrm/osrm-backend/extractor.cpp b/3party/osrm/osrm-backend/extractor.cpp
index 6536b0c6ab..43a0296b1b 100644
--- a/3party/osrm/osrm-backend/extractor.cpp
+++ b/3party/osrm/osrm-backend/extractor.cpp
@@ -26,8 +26,17 @@ SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
*/
#include "Extractor/Extractor.h"
+#include "Util/simple_logger.hpp"
int main (int argc, char *argv[])
{
- return Extractor().Run(argc, argv);
+ try
+ {
+ return Extractor().Run(argc, argv);
+ }
+ catch (const std::exception &e)
+ {
+ SimpleLogger().Write(logWARNING) << "[exception] " << e.what();
+ }
+
}
diff --git a/3party/osrm/osrm-backend/features/bicycle/mode.feature b/3party/osrm/osrm-backend/features/bicycle/mode.feature
index eac04302c0..195a37f67b 100644
--- a/3party/osrm/osrm-backend/features/bicycle/mode.feature
+++ b/3party/osrm/osrm-backend/features/bicycle/mode.feature
@@ -1,89 +1,177 @@
@routing @bicycle @mode
Feature: Bike - Mode flag
- Background:
- Given the profile "bicycle"
+# bicycle modes:
+# 1 bike
+# 2 pushing
+# 3 ferry
+# 4 train
+
+ Background:
+ Given the profile "bicycle"
- @todo
Scenario: Bike - Mode when using a ferry
- Given the node map
- | a | b | |
- | | c | d |
+ Given the node map
+ | a | b | |
+ | | c | d |
- And the ways
- | nodes | highway | route | duration |
- | ab | primary | | |
- | bc | | ferry | 0:01 |
- | cd | primary | | |
+ And the ways
+ | nodes | highway | route | duration |
+ | ab | primary | | |
+ | bc | | ferry | 0:01 |
+ | cd | primary | | |
- When I route I should get
- | from | to | route | turns | modes |
- | a | d | ab,bc,cd | head,right,left, destination | bike,ferry,bike |
- | d | a | cd,bc,ab | head,right,left, destination | bike,ferry,bike |
- | c | a | bc,ab | head,left,destination | ferry,bike |
- | d | b | cd,bc | head,right,destination | bike,ferry |
- | a | c | ab,bc | head,right,destination | bike,ferry |
- | b | d | bc,cd | head,left,destination | ferry,bike |
-
- @todo
- Scenario: Bike - Mode when pushing bike against oneways
- Given the node map
- | a | b | |
- | | c | d |
+ When I route I should get
+ | from | to | route | turns | modes |
+ | a | d | ab,bc,cd | head,right,left,destination | 1,3,1 |
+ | d | a | cd,bc,ab | head,right,left,destination | 1,3,1 |
+ | c | a | bc,ab | head,left,destination | 3,1 |
+ | d | b | cd,bc | head,right,destination | 1,3 |
+ | a | c | ab,bc | head,right,destination | 1,3 |
+ | b | d | bc,cd | head,left,destination | 3,1 |
- And the ways
- | nodes | highway | oneway |
- | ab | primary | |
- | bc | primary | yes |
- | cd | primary | |
+ Scenario: Bike - Mode when using a train
+ Given the node map
+ | a | b | |
+ | | c | d |
- When I route I should get
- | from | to | route | turns | modes |
- | a | d | ab,bc,cd | head,right,left,destination | bike,push,bike |
- | d | a | cd,bc,ab | head,right,left,destination | bike,push,bike |
- | c | a | bc,ab | head,left,destination | push,bike |
- | d | b | cd,bc | head,right,destination | bike,push |
- | a | c | ab,bc | head,right,destination | bike,push |
- | b | d | bc,cd | head,left,destination | push,bike |
-
- @todo
- Scenario: Bike - Mode when pushing on pedestrain streets
+ And the ways
+ | nodes | highway | railway | bicycle |
+ | ab | primary | | |
+ | bc | | train | yes |
+ | cd | primary | | |
+
+ When I route I should get
+ | from | to | route | turns | modes |
+ | a | d | ab,bc,cd | head,right,left,destination | 1,4,1 |
+ | d | a | cd,bc,ab | head,right,left,destination | 1,4,1 |
+ | c | a | bc,ab | head,left,destination | 4,1 |
+ | d | b | cd,bc | head,right,destination | 1,4 |
+ | a | c | ab,bc | head,right,destination | 1,4 |
+ | b | d | bc,cd | head,left,destination | 4,1 |
+
+ Scenario: Bike - Mode when pushing bike against oneways
+ Given the node map
+ | a | b | |
+ | | c | d |
+
+ And the ways
+ | nodes | highway | oneway |
+ | ab | primary | |
+ | bc | primary | yes |
+ | cd | primary | |
+
+ When I route I should get
+ | from | to | route | turns | modes |
+ | a | d | ab,bc,cd | head,right,left,destination | 1,1,1 |
+ | d | a | cd,bc,ab | head,right,left,destination | 1,2,1 |
+ | c | a | bc,ab | head,left,destination | 2,1 |
+ | d | b | cd,bc | head,right,destination | 1,2 |
+ | a | c | ab,bc | head,right,destination | 1,1 |
+ | b | d | bc,cd | head,left,destination | 1,1 |
+
+ Scenario: Bike - Mode when pushing on pedestrain streets
+ Given the node map
+ | a | b | |
+ | | c | d |
+
+ And the ways
+ | nodes | highway |
+ | ab | primary |
+ | bc | pedestrian |
+ | cd | primary |
+
+ When I route I should get
+ | from | to | route | turns | modes |
+ | a | d | ab,bc,cd | head,right,left,destination | 1,2,1 |
+ | d | a | cd,bc,ab | head,right,left,destination | 1,2,1 |
+ | c | a | bc,ab | head,left,destination | 2,1 |
+ | d | b | cd,bc | head,right,destination | 1,2 |
+ | a | c | ab,bc | head,right,destination | 1,2 |
+ | b | d | bc,cd | head,left,destination | 2,1 |
+
+ Scenario: Bike - Mode when pushing on pedestrain areas
+ Given the node map
+ | a | b | | |
+ | | c | d | f |
+
+ And the ways
+ | nodes | highway | area |
+ | ab | primary | |
+ | bcd | pedestrian | yes |
+ | df | primary | |
+
+ When I route I should get
+ | from | to | route | modes |
+ | a | f | ab,bcd,df | 1,2,1 |
+ | f | a | df,bcd,ab | 1,2,1 |
+ | d | a | bcd,ab | 2,1 |
+ | f | b | df,bcd | 1,2 |
+ | a | d | ab,bcd | 1,2 |
+ | b | f | bcd,df | 2,1 |
+
+ Scenario: Bike - Mode when pushing on steps
+ Given the node map
+ | a | b | | |
+ | | c | d | f |
+
+ And the ways
+ | nodes | highway |
+ | ab | primary |
+ | bc | steps |
+ | cd | primary |
+
+ When I route I should get
+ | from | to | route | turns | modes |
+ | a | d | ab,bc,cd | head,right,left,destination | 1,2,1 |
+ | d | a | cd,bc,ab | head,right,left,destination | 1,2,1 |
+ | c | a | bc,ab | head,left,destination | 2,1 |
+ | d | b | cd,bc | head,right,destination | 1,2 |
+ | a | c | ab,bc | head,right,destination | 1,2 |
+ | b | d | bc,cd | head,left,destination | 2,1 |
+
+ Scenario: Bike - Mode when bicycle=dismount
+ Given the node map
+ | a | b | | |
+ | | c | d | f |
+
+ And the ways
+ | nodes | highway | bicycle |
+ | ab | primary | |
+ | bc | primary | dismount |
+ | cd | primary | |
+
+ When I route I should get
+ | from | to | route | turns | modes |
+ | a | d | ab,bc,cd | head,right,left,destination | 1,2,1 |
+ | d | a | cd,bc,ab | head,right,left,destination | 1,2,1 |
+ | c | a | bc,ab | head,left,destination | 2,1 |
+ | d | b | cd,bc | head,right,destination | 1,2 |
+ | a | c | ab,bc | head,right,destination | 1,2 |
+ | b | d | bc,cd | head,left,destination | 2,1 |
+
+ Scenario: Bicycle - Modes when starting on forward oneway
Given the node map
- | a | b | |
- | | c | d |
+ | a | b |
And the ways
- | nodes | highway |
- | ab | primary |
- | bc | pedestrian |
- | cd | primary |
+ | nodes | oneway |
+ | ab | yes |
When I route I should get
- | from | to | route | turns | modes |
- | a | d | ab,bc,cd | head,right,left,destination | bike,push,bike |
- | d | a | cd,bc,ab | head,right,left,destination | bike,push,bike |
- | c | a | bc,ab | head,left,destination | push,bike |
- | d | b | cd,bc | head,right,destination | bike,push |
- | a | c | ab,bc | head,right,destination | bike,push |
- | b | d | bc,cd | head,left,destination | push,bike |
-
- @todo
- Scenario: Bike - Mode when pushing on pedestrain areas
+ | from | to | route | modes |
+ | a | b | ab | 1 |
+ | b | a | ab | 2 |
+
+ Scenario: Bicycle - Modes when starting on reverse oneway
Given the node map
- | a | b | | |
- | | c | d | f |
+ | a | b |
And the ways
- | nodes | highway | area |
- | ab | primary | |
- | bcd | pedestrian | yes |
- | df | primary | |
+ | nodes | oneway |
+ | ab | -1 |
When I route I should get
- | from | to | route | modes |
- | a | f | ab,bcd,df | bike,push,bike |
- | f | a | df,bcd,ab | bike,push,bike |
- | d | a | bcd,ab | push,bike |
- | f | b | df,bcd | bike,push |
- | a | d | ab,bcd | bike,push |
- | b | f | bcd,df | push,bike |
+ | from | to | route | modes |
+ | a | b | ab | 2 |
+ | b | a | ab | 1 |
diff --git a/3party/osrm/osrm-backend/features/bicycle/pushing.feature b/3party/osrm/osrm-backend/features/bicycle/pushing.feature
index 5b8d01500d..7cb5400bca 100644
--- a/3party/osrm/osrm-backend/features/bicycle/pushing.feature
+++ b/3party/osrm/osrm-backend/features/bicycle/pushing.feature
@@ -4,9 +4,9 @@ Feature: Bike - Accessability of different way types
Background:
Given the profile "bicycle"
Given the shortcuts
- | key | value |
- | bike | 49s ~20% |
- | foot | 121s ~20% |
+ | key | value |
+ | bike | 15 km/h ~20% |
+ | foot | 5 km/h ~20% |
Scenario: Bike - Pushing bikes on pedestrian-only ways
Then routability should be
@@ -98,11 +98,11 @@ Feature: Bike - Accessability of different way types
| cd | primary | |
When I route I should get
- | from | to | route | turns |
- | a | d | ab,bc,cd | head,right,left,destination |
- | d | a | cd,bc,ab | head,enter_contraflow,leave_contraflow,destination |
- | c | a | bc,ab | head,leave_contraflow,destination |
- | d | b | cd,bc | head,enter_contraflow,destination |
+ | from | to | route | turns |
+ | a | d | ab,bc,cd | head,right,left,destination |
+ | d | a | cd,bc,ab | head,right,left,destination |
+ | c | a | bc,ab | head,left,destination |
+ | d | b | cd,bc | head,right,destination |
@todo
Scenario: Bike - Instructions when pushing bike on footway/pedestrian, etc.
@@ -117,8 +117,8 @@ Feature: Bike - Accessability of different way types
| cd | primary |
When I route I should get
- | from | to | route | turns |
- | a | d | ab,bc,cd | head,right,left,destination |
- | d | a | cd,bc,ab | head,enter_contraflow,leave_contraflow,destination |
- | c | a | bc,ab | head,leave_contraflow,destination |
- | d | b | cd,bc | head,enter_contraflow,destination |
+ | from | to | route | turns |
+ | a | d | ab,bc,cd | head,right,left,destination |
+ | d | a | cd,bc,ab | head,right,left,destination |
+ | c | a | bc,ab | head,left,destination |
+ | d | b | cd,bc | head,right,destination |
diff --git a/3party/osrm/osrm-backend/features/car/ferry.feature b/3party/osrm/osrm-backend/features/car/ferry.feature
index 3e90cf0053..0e1fe98e52 100644
--- a/3party/osrm/osrm-backend/features/car/ferry.feature
+++ b/3party/osrm/osrm-backend/features/car/ferry.feature
@@ -17,12 +17,31 @@ Feature: Car - Handle ferry routes
| efg | primary | | |
When I route I should get
- | from | to | route |
- | a | g | abc,cde,efg |
- | b | f | abc,cde,efg |
- | e | c | cde |
- | e | b | cde,abc |
- | e | a | cde,abc |
- | c | e | cde |
- | c | f | cde,efg |
- | c | g | cde,efg |
+ | from | to | route | modes |
+ | a | g | abc,cde,efg | 1,2,1 |
+ | b | f | abc,cde,efg | 1,2,1 |
+ | e | c | cde | 2 |
+ | e | b | cde,abc | 2,1 |
+ | e | a | cde,abc | 2,1 |
+ | c | e | cde | 2 |
+ | c | f | cde,efg | 2,1 |
+ | c | g | cde,efg | 2,1 |
+
+ Scenario: Car - Properly handle durations
+ Given the node map
+ | a | b | c | | |
+ | | | d | | |
+ | | | e | f | g |
+
+ And the ways
+ | nodes | highway | route | duration |
+ | abc | primary | | |
+ | cde | | ferry | 00:01:00 |
+ | efg | primary | | |
+
+ When I route I should get
+ | from | to | route | modes | speed |
+ | a | g | abc,cde,efg | 1,2,1 | 24 km/h |
+ | b | f | abc,cde,efg | 1,2,1 | 19 km/h |
+ | c | e | cde | 2 | 12 km/h |
+ | e | c | cde | 2 | 12 km/h |
diff --git a/3party/osrm/osrm-backend/features/car/link.feature b/3party/osrm/osrm-backend/features/car/link.feature
new file mode 100644
index 0000000000..f4628e4cec
--- /dev/null
+++ b/3party/osrm/osrm-backend/features/car/link.feature
@@ -0,0 +1,111 @@
+@routing @link @car
+Feature: Car - Speed on links
+# Check that there's a reasonable ratio between the
+# speed of a way and it's corresponding link type.
+
+ Background: Use specific speeds
+ Given the profile "car"
+ Given a grid size of 1000 meters
+
+ Scenario: Car - Use motorway_link when reasonable
+ Given the node map
+ | | | e | | | | f | | |
+ | x | a | b | | | | c | d | y |
+
+ And the ways
+ | nodes | highway |
+ | xa | unclassified |
+ | ab | motorway_link |
+ | bc | motorway_link |
+ | cd | motorway_link |
+ | ae | motorway |
+ | ef | motorway |
+ | fd | motorway |
+ | dy | unclassified |
+
+ When I route I should get
+ | from | to | route |
+ | x | y | xa,ae,ef,fd,dy |
+ | b | c | bc |
+
+ Scenario: Car - Use trunk_link when reasonable
+ Given the node map
+ | | | e | | | | f | | |
+ | x | a | b | | | | c | d | y |
+
+ And the ways
+ | nodes | highway |
+ | xa | unclassified |
+ | ab | trunk_link |
+ | bc | trunk_link |
+ | cd | trunk_link |
+ | ae | trunk |
+ | ef | trunk |
+ | fd | trunk |
+ | dy | unclassified |
+ When I route I should get
+ | from | to | route |
+ | x | y | xa,ae,ef,fd,dy |
+ | b | c | bc |
+
+ Scenario: Car - Use primary_link when reasonable
+ Given the node map
+ | | | e | | | | f | | |
+ | x | a | b | | | | c | d | y |
+
+ And the ways
+ | nodes | highway |
+ | xa | unclassified |
+ | ab | primary_link |
+ | bc | primary_link |
+ | cd | primary_link |
+ | ae | primary |
+ | ef | primary |
+ | fd | primary |
+ | dy | unclassified |
+ When I route I should get
+ | from | to | route |
+ | x | y | xa,ae,ef,fd,dy |
+ | b | c | bc |
+
+ Scenario: Car - Use secondary_link when reasonable
+ Given the node map
+ | | | e | | | | f | | |
+ | x | a | b | | | | c | d | y |
+
+ And the ways
+ | nodes | highway |
+ | xa | unclassified |
+ | ab | secondary_link |
+ | bc | secondary_link |
+ | cd | secondary_link |
+ | ae | secondary |
+ | ef | secondary |
+ | fd | secondary |
+ | dy | unclassified |
+
+ When I route I should get
+ | from | to | route |
+ | x | y | xa,ae,ef,fd,dy |
+ | b | c | bc |
+
+ Scenario: Car - Use tertiary_link when reasonable
+ Given the node map
+ | | | e | | | | f | | |
+ | x | a | b | | | | c | d | y |
+
+ And the ways
+ | nodes | highway |
+ | xa | unclassified |
+ | ab | tertiary_link |
+ | bc | tertiary_link |
+ | cd | tertiary_link |
+ | ae | tertiary |
+ | ef | tertiary |
+ | fd | tertiary |
+ | dy | unclassified |
+
+ When I route I should get
+ | from | to | route |
+ | x | y | xa,ae,ef,fd,dy |
+ | b | c | bc |
diff --git a/3party/osrm/osrm-backend/features/car/maxspeed.feature b/3party/osrm/osrm-backend/features/car/maxspeed.feature
index 9e77cde74f..4a548020c4 100644
--- a/3party/osrm/osrm-backend/features/car/maxspeed.feature
+++ b/3party/osrm/osrm-backend/features/car/maxspeed.feature
@@ -8,44 +8,48 @@ OSRM will use 4/5 of the projected free-flow speed.
Scenario: Car - Respect maxspeeds when lower that way type speed
Given the node map
- | a | b | c |
+ | a | b | c | d |
And the ways
| nodes | highway | maxspeed |
| ab | trunk | |
| bc | trunk | 60 |
+ | cd | trunk | FR:urban |
When I route I should get
| from | to | route | speed |
| a | b | ab | 67 km/h |
| b | c | bc | 48 km/h +- 1 |
+ | c | d | cd | 40 km/h |
Scenario: Car - Do not ignore maxspeed when higher than way speed
Given the node map
- | a | b | c |
+ | a | b | c | d |
And the ways
- | nodes | highway | maxspeed |
- | ab | residential | |
- | bc | residential | 90 |
+ | nodes | highway | maxspeed |
+ | ab | residential | |
+ | bc | residential | 90 |
+ | cd | living_street | FR:urban |
When I route I should get
| from | to | route | speed |
| a | b | ab | 20 km/h |
| b | c | bc | 72 km/h +- 1 |
+ | c | d | cd | 40 km/h |
Scenario: Car - Forward/backward maxspeed
Given a grid size of 100 meters
Then routability should be
- | highway | maxspeed | maxspeed:forward | maxspeed:backward | forw | backw |
- | primary | | | | 51 km/h | 51 km/h |
- | primary | 60 | | | 48 km/h | 48 km/h |
- | primary | | 60 | | 48 km/h | 65 km/h |
- | primary | | | 60 | 51 km/h | 48 km/h |
- | primary | 15 | 60 | | 48 km/h | 15 km/h +- 1 |
- | primary | 15 | | 60 | 12 km/h +- 1| 48 km/h |
- | primary | 15 | 30 | 60 | 24 km/h | 48 km/h |
+ | highway | maxspeed | maxspeed:forward | maxspeed:backward | forw | backw |
+ | primary | | | | 51 km/h | 51 km/h |
+ | primary | 60 | | | 48 km/h | 48 km/h |
+ | primary | | 60 | | 48 km/h | 51 km/h |
+ | primary | | | 60 | 51 km/h | 48 km/h |
+ | primary | 15 | 60 | | 48 km/h | 12 km/h |
+ | primary | 15 | | 60 | 12 km/h | 48 km/h |
+ | primary | 15 | 30 | 60 | 24 km/h | 48 km/h |
Scenario: Car - Maxspeed should not allow routing on unroutable ways
Then routability should be
diff --git a/3party/osrm/osrm-backend/features/car/speed.feature b/3party/osrm/osrm-backend/features/car/speed.feature
index 4f54a332c3..5682f31949 100644
--- a/3party/osrm/osrm-backend/features/car/speed.feature
+++ b/3party/osrm/osrm-backend/features/car/speed.feature
@@ -9,15 +9,15 @@ Feature: Car - speeds
Then routability should be
| highway | oneway | bothw |
| motorway | no | 72 km/h |
- | motorway_link | no | 60 km/h |
+ | motorway_link | no | 36 km/h |
| trunk | no | 67 km/h +- 1 |
- | trunk_link | no | 55 km/h +- 1 |
+ | trunk_link | no | 32 km/h +- 1 |
| primary | no | 52 km/h +- 1 |
- | primary_link | no | 48 km/h |
+ | primary_link | no | 24 km/h |
| secondary | no | 43 km/h +- 1 |
- | secondary_link | no | 40 km/h |
+ | secondary_link | no | 20 km/h |
| tertiary | no | 32 km/h |
- | tertiary_link | no | 24 km/h |
+ | tertiary_link | no | 16 km/h |
| unclassified | no | 20 km/h |
| residential | no | 20 km/h |
| living_street | no | 8 km/h |
diff --git a/3party/osrm/osrm-backend/features/car/surface.feature b/3party/osrm/osrm-backend/features/car/surface.feature
new file mode 100644
index 0000000000..cd31acc983
--- /dev/null
+++ b/3party/osrm/osrm-backend/features/car/surface.feature
@@ -0,0 +1,140 @@
+@routing @car @surface
+Feature: Car - Surfaces
+
+ Background:
+ Given the profile "car"
+
+ Scenario: Car - Routeability of tracktype tags
+ Then routability should be
+ | highway | tracktype | bothw |
+ | trunk | grade1 | x |
+ | trunk | grade2 | x |
+ | trunk | grade3 | x |
+ | trunk | grade4 | x |
+ | trunk | grade5 | x |
+ | trunk | nonsense | x |
+
+ Scenario: Car - Routability of smoothness tags
+ Then routability should be
+ | highway | smoothness | bothw |
+ | trunk | excellent | x |
+ | trunk | good | x |
+ | trunk | intermediate | x |
+ | trunk | bad | x |
+ | trunk | very_bad | x |
+ | trunk | horrible | x |
+ | trunk | very_horrible | x |
+ | trunk | impassable | |
+ | trunk | nonsense | x |
+
+ Scenario: Car - Routabiliy of surface tags
+ Then routability should be
+ | highway | surface | bothw |
+ | trunk | asphalt | x |
+ | trunk | sett | x |
+ | trunk | gravel | x |
+ | trunk | nonsense | x |
+
+ Scenario: Car - Good surfaces should not grant access
+ Then routability should be
+ | highway | access | tracktype | smoothness | surface | forw | backw |
+ | motorway | | | | | x | |
+ | motorway | no | grade1 | excellent | asphalt | | |
+ | motorway | private | grade1 | excellent | asphalt | | |
+ | motorway | agricultural | grade1 | excellent | asphalt | | |
+ | motorway | forestry | grade1 | excellent | asphalt | | |
+ | motorway | emergency | grade1 | excellent | asphalt | | |
+ | primary | | | | | x | x |
+ | primary | no | grade1 | excellent | asphalt | | |
+ | primary | private | grade1 | excellent | asphalt | | |
+ | primary | agricultural | grade1 | excellent | asphalt | | |
+ | primary | forestry | grade1 | excellent | asphalt | | |
+ | primary | emergency | grade1 | excellent | asphalt | | |
+
+ Scenario: Car - Impassable surfaces should deny access
+ Then routability should be
+ | highway | access | smoothness | forw | backw |
+ | motorway | | impassable | | |
+ | motorway | yes | | x | |
+ | motorway | yes | impassable | | |
+ | primary | | impassable | | |
+ | primary | yes | | x | x |
+ | primary | yes | impassable | | |
+
+ Scenario: Car - Surface should reduce speed
+ Then routability should be
+ | highway | oneway | surface | forw | backw |
+ | motorway | no | | 72 km/h +-1 | 72 km/h +-1 |
+ | motorway | no | asphalt | 72 km/h +-1 | 72 km/h +-1 |
+ | motorway | no | concrete | 72 km/h +-1 | 72 km/h +-1 |
+ | motorway | no | concrete:plates | 72 km/h +-1 | 72 km/h +-1 |
+ | motorway | no | concrete:lanes | 72 km/h +-1 | 72 km/h +-1 |
+ | motorway | no | paved | 72 km/h +-1 | 72 km/h +-1 |
+ | motorway | no | cement | 65 km/h +-1 | 65 km/h +-1 |
+ | motorway | no | compacted | 65 km/h +-1 | 65 km/h +-1 |
+ | motorway | no | fine_gravel | 65 km/h +-1 | 65 km/h +-1 |
+ | motorway | no | paving_stones | 48 km/h +-1 | 48 km/h +-1 |
+ | motorway | no | metal | 48 km/h +-1 | 48 km/h +-1 |
+ | motorway | no | bricks | 48 km/h +-1 | 48 km/h +-1 |
+ | motorway | no | grass | 32 km/h +-1 | 32 km/h +-1 |
+ | motorway | no | wood | 32 km/h +-1 | 32 km/h +-1 |
+ | motorway | no | sett | 32 km/h +-1 | 32 km/h +-1 |
+ | motorway | no | grass_paver | 32 km/h +-1 | 32 km/h +-1 |
+ | motorway | no | gravel | 32 km/h +-1 | 32 km/h +-1 |
+ | motorway | no | unpaved | 32 km/h +-1 | 32 km/h +-1 |
+ | motorway | no | ground | 32 km/h +-1 | 32 km/h +-1 |
+ | motorway | no | dirt | 32 km/h +-1 | 32 km/h +-1 |
+ | motorway | no | pebblestone | 32 km/h +-1 | 32 km/h +-1 |
+ | motorway | no | tartan | 32 km/h +-1 | 32 km/h +-1 |
+ | motorway | no | cobblestone | 24 km/h +-1 | 24 km/h +-1 |
+ | motorway | no | clay | 24 km/h +-1 | 24 km/h +-1 |
+ | motorway | no | earth | 16 km/h +-1 | 16 km/h +-1 |
+ | motorway | no | stone | 16 km/h +-1 | 16 km/h +-1 |
+ | motorway | no | rocky | 16 km/h +-1 | 16 km/h +-1 |
+ | motorway | no | sand | 16 km/h +-1 | 16 km/h +-1 |
+
+ Scenario: Car - Tracktypes should reduce speed
+ Then routability should be
+ | highway | oneway | tracktype | forw | backw |
+ | motorway | no | | 72 km/h +-1 | 72 km/h +-1 |
+ | motorway | no | grade1 | 48 km/h +-1 | 48 km/h +-1 |
+ | motorway | no | grade2 | 32 km/h +-1 | 32 km/h +-1 |
+ | motorway | no | grade3 | 24 km/h +-1 | 24 km/h +-1 |
+ | motorway | no | grade4 | 20 km/h +-1 | 20 km/h +-1 |
+ | motorway | no | grade5 | 16 km/h +-1 | 16 km/h +-1 |
+
+ Scenario: Car - Smoothness should reduce speed
+ Then routability should be
+ | highway | oneway | smoothness | forw | backw |
+ | motorway | no | | 72 km/h +-1 | 72 km/h +-1 |
+ | motorway | no | intermediate | 65 km/h +-1 | 65 km/h +-1 |
+ | motorway | no | bad | 32 km/h +-1 | 32 km/h +-1 |
+ | motorway | no | very_bad | 16 km/h +-1 | 16 km/h +-1 |
+ | motorway | no | horrible | 8 km/h +-1 | 8 km/h +-1 |
+ | motorway | no | very_horrible | 4 km/h +-1 | 4 km/h +-1 |
+
+ Scenario: Car - Combination of surface tags should use lowest speed
+ Then routability should be
+ | highway | oneway | tracktype | surface | smoothness | backw | forw |
+ | motorway | no | | | | 72 km/h | 72 km/h |
+ | service | no | grade1 | asphalt | excellent | 12 km/h | 12 km/h |
+ | motorway | no | grade5 | asphalt | excellent | 16 km/h | 16 km/h |
+ | motorway | no | grade1 | mud | excellent | 8 km/h | 8 km/h |
+ | motorway | no | grade1 | asphalt | very_horrible | 4 km/h | 4 km/h |
+ | service | no | grade5 | mud | very_horrible | 4 km/h | 4 km/h |
+
+ Scenario: Car - Surfaces should not affect oneway direction
+ Then routability should be
+ | highway | oneway | tracktype | smoothness | surface | forw | backw |
+ | primary | | grade1 | excellent | asphalt | x | x |
+ | primary | | grade5 | very_bad | mud | x | x |
+ | primary | | nonsense | nonsense | nonsense | x | x |
+ | primary | no | grade1 | excellent | asphalt | x | x |
+ | primary | no | grade5 | very_bad | mud | x | x |
+ | primary | no | nonsense | nonsense | nonsense | x | x |
+ | primary | yes | grade1 | excellent | asphalt | x | |
+ | primary | yes | grade5 | very_bad | mud | x | |
+ | primary | yes | nonsense | nonsense | nonsense | x | |
+ | primary | -1 | grade1 | excellent | asphalt | | x |
+ | primary | -1 | grade5 | very_bad | mud | | x |
+ | primary | -1 | nonsense | nonsense | nonsense | | x |
diff --git a/3party/osrm/osrm-backend/features/foot/ferry.feature b/3party/osrm/osrm-backend/features/foot/ferry.feature
index 4308756559..866644d26a 100644
--- a/3party/osrm/osrm-backend/features/foot/ferry.feature
+++ b/3party/osrm/osrm-backend/features/foot/ferry.feature
@@ -17,15 +17,15 @@ Feature: Foot - Handle ferry routes
| efg | primary | | |
When I route I should get
- | from | to | route |
- | a | g | abc,cde,efg |
- | b | f | abc,cde,efg |
- | e | c | cde |
- | e | b | cde,abc |
- | e | a | cde,abc |
- | c | e | cde |
- | c | f | cde,efg |
- | c | g | cde,efg |
+ | from | to | route | modes |
+ | a | g | abc,cde,efg | 1,2,1 |
+ | b | f | abc,cde,efg | 1,2,1 |
+ | e | c | cde | 2 |
+ | e | b | cde,abc | 2,1 |
+ | e | a | cde,abc | 2,1 |
+ | c | e | cde | 2 |
+ | c | f | cde,efg | 2,1 |
+ | c | g | cde,efg | 2,1 |
Scenario: Foot - Ferry duration, single node
Given the node map
diff --git a/3party/osrm/osrm-backend/features/options/extract/files.feature b/3party/osrm/osrm-backend/features/options/extract/files.feature
index 3061263e92..aceab19f74 100644
--- a/3party/osrm/osrm-backend/features/options/extract/files.feature
+++ b/3party/osrm/osrm-backend/features/options/extract/files.feature
@@ -1,7 +1,7 @@
@extract @options @files
Feature: osrm-extract command line options: files
# expansions:
-# {base} => path to current input file
+# {osm_base} => path to current input file
# {profile} => path to current profile script
Background:
@@ -14,12 +14,12 @@ Feature: osrm-extract command line options: files
And the data has been saved to disk
Scenario: osrm-extract - Passing base file
- When I run "osrm-extract {base}.osm --profile {profile}"
+ When I run "osrm-extract {osm_base}.osm --profile {profile}"
Then stderr should be empty
And it should exit with code 0
Scenario: osrm-extract - Order of options should not matter
- When I run "osrm-extract --profile {profile} {base}.osm"
+ When I run "osrm-extract --profile {profile} {osm_base}.osm"
Then stderr should be empty
And it should exit with code 0
diff --git a/3party/osrm/osrm-backend/features/options/prepare/files.feature b/3party/osrm/osrm-backend/features/options/prepare/files.feature
index de356a82be..6e82a6b1b8 100644
--- a/3party/osrm/osrm-backend/features/options/prepare/files.feature
+++ b/3party/osrm/osrm-backend/features/options/prepare/files.feature
@@ -1,7 +1,7 @@
@prepare @options @files
Feature: osrm-prepare command line options: files
# expansions:
-# {base} => path to current input file
+# {extracted_base} => path to current extracted input file
# {profile} => path to current profile script
Background:
@@ -14,12 +14,12 @@ Feature: osrm-prepare command line options: files
And the data has been extracted
Scenario: osrm-prepare - Passing base file
- When I run "osrm-prepare {base}.osrm --profile {profile}"
+ When I run "osrm-prepare {extracted_base}.osrm --profile {profile}"
Then stderr should be empty
And it should exit with code 0
Scenario: osrm-prepare - Order of options should not matter
- When I run "osrm-prepare --profile {profile} {base}.osrm"
+ When I run "osrm-prepare --profile {profile} {extracted_base}.osrm"
Then stderr should be empty
And it should exit with code 0
diff --git a/3party/osrm/osrm-backend/features/options/routed/files.feature b/3party/osrm/osrm-backend/features/options/routed/files.feature
index 68c13902e1..9be77f775e 100644
--- a/3party/osrm/osrm-backend/features/options/routed/files.feature
+++ b/3party/osrm/osrm-backend/features/options/routed/files.feature
@@ -1,11 +1,16 @@
-@routed @options @files
+@routed @options @files @todo
Feature: osrm-routed command line options: files
# Normally when launching osrm-routed, it will keep running as a server until it's shut down.
# For testing program options, the --trial option is used, which causes osrm-routed to quit
# immediately after initialization. This makes testing easier and faster.
#
-# The {base} part of the options to osrm-routed will be expanded to the actual base path of
-# the preprocessed file.
+# The {prepared_base} part of the options to osrm-routed will be expanded to the actual base path of
+# the prepared input file.
+
+# TODO
+# Since we're not using osmr-datastore for all testing, osrm-routed is kept running.
+# This means this test fails because osrm-routed is already running.
+# It probably needs to be rewritten to first quit osrm-routed.
Background:
Given the profile "testbot"
@@ -17,7 +22,7 @@ Feature: osrm-routed command line options: files
And the data has been prepared
Scenario: osrm-routed - Passing base file
- When I run "osrm-routed {base}.osrm --trial"
+ When I run "osrm-routed {prepared_base}.osrm --trial"
Then stdout should contain /^\[info\] starting up engines/
And stdout should contain /\d{1,2}\.\d{1,2}\.\d{1,2}/
And stdout should contain /compiled at/
diff --git a/3party/osrm/osrm-backend/features/step_definitions/data.rb b/3party/osrm/osrm-backend/features/step_definitions/data.rb
index e0985a4b16..f1e58bae22 100644
--- a/3party/osrm/osrm-backend/features/step_definitions/data.rb
+++ b/3party/osrm/osrm-backend/features/step_definitions/data.rb
@@ -158,3 +158,19 @@ Given /^the data has been prepared$/ do
@process_error = e
end
end
+
+Given /^osrm\-routed is stopped$/ do
+ begin
+ OSRMLoader.shutdown
+ rescue OSRMError => e
+ @process_error = e
+ end
+end
+
+Given /^data is loaded directly/ do
+ @load_method = 'directly'
+end
+
+Given /^data is loaded with datastore$/ do
+ @load_method = 'datastore'
+end
diff --git a/3party/osrm/osrm-backend/features/step_definitions/locate.rb b/3party/osrm/osrm-backend/features/step_definitions/locate.rb
index 9d3d74f655..3e67be3c96 100644
--- a/3party/osrm/osrm-backend/features/step_definitions/locate.rb
+++ b/3party/osrm/osrm-backend/features/step_definitions/locate.rb
@@ -1,7 +1,7 @@
When /^I request locate I should get$/ do |table|
reprocess
actual = []
- OSRMBackgroundLauncher.new("#{@osm_file}.osrm") do
+ OSRMLoader.load(self,"#{prepared_file}.osrm") do
table.hashes.each_with_index do |row,ri|
in_node = find_node_by_name row['in']
raise "*** unknown in-node '#{row['in']}" unless in_node
diff --git a/3party/osrm/osrm-backend/features/step_definitions/nearest.rb b/3party/osrm/osrm-backend/features/step_definitions/nearest.rb
index ae5a79cf57..532c1f0d74 100644
--- a/3party/osrm/osrm-backend/features/step_definitions/nearest.rb
+++ b/3party/osrm/osrm-backend/features/step_definitions/nearest.rb
@@ -1,7 +1,7 @@
When /^I request nearest I should get$/ do |table|
reprocess
actual = []
- OSRMBackgroundLauncher.new("#{@osm_file}.osrm") do
+ OSRMLoader.load(self,"#{prepared_file}.osrm") do
table.hashes.each_with_index do |row,ri|
in_node = find_node_by_name row['in']
raise "*** unknown in-node '#{row['in']}" unless in_node
diff --git a/3party/osrm/osrm-backend/features/step_definitions/options.rb b/3party/osrm/osrm-backend/features/step_definitions/options.rb
index 38c9ea2566..e2e50661e2 100644
--- a/3party/osrm/osrm-backend/features/step_definitions/options.rb
+++ b/3party/osrm/osrm-backend/features/step_definitions/options.rb
@@ -1,6 +1,6 @@
When(/^I run "osrm\-routed\s?(.*?)"$/) do |options|
begin
- Timeout.timeout(1) { run_bin 'osrm-routed', options }
+ Timeout.timeout(SHUTDOWN_TIMEOUT) { run_bin 'osrm-routed', options }
rescue Timeout::Error
raise "*** osrm-routed didn't quit. Maybe the --trial option wasn't used?"
end
@@ -14,6 +14,10 @@ When(/^I run "osrm\-prepare\s?(.*?)"$/) do |options|
run_bin 'osrm-prepare', options
end
+When(/^I run "osrm\-datastore\s?(.*?)"$/) do |options|
+ run_bin 'osrm-datastore', options
+end
+
Then /^it should exit with code (\d+)$/ do |code|
expect(@exit_code).to eq( code.to_i )
end
diff --git a/3party/osrm/osrm-backend/features/step_definitions/requests.rb b/3party/osrm/osrm-backend/features/step_definitions/requests.rb
index 7002cd9e31..41257e5b9d 100644
--- a/3party/osrm/osrm-backend/features/step_definitions/requests.rb
+++ b/3party/osrm/osrm-backend/features/step_definitions/requests.rb
@@ -1,6 +1,6 @@
When /^I request \/(.*)$/ do |path|
reprocess
- OSRMBackgroundLauncher.new("#{@osm_file}.osrm") do
+ OSRMLoader.load(self,"#{prepared_file}.osrm") do
@response = request_path path
end
end
@@ -43,4 +43,4 @@ Then /^"([^"]*)" should return code (\d+)$/ do |binary, code|
expect(@process_error.is_a?(OSRMError)).to eq(true)
expect(@process_error.process).to eq(binary)
expect(@process_error.code.to_i).to eq(code.to_i)
-end \ No newline at end of file
+end
diff --git a/3party/osrm/osrm-backend/features/step_definitions/routability.rb b/3party/osrm/osrm-backend/features/step_definitions/routability.rb
index 03336e583d..dcbde5afad 100644
--- a/3party/osrm/osrm-backend/features/step_definitions/routability.rb
+++ b/3party/osrm/osrm-backend/features/step_definitions/routability.rb
@@ -44,7 +44,7 @@ Then /^routability should be$/ do |table|
if table.headers&["forw","backw","bothw"] == []
raise "*** routability tabel must contain either 'forw', 'backw' or 'bothw' column"
end
- OSRMBackgroundLauncher.new("#{@osm_file}.osrm") do
+ OSRMLoader.load(self,"#{prepared_file}.osrm") do
table.hashes.each_with_index do |row,i|
output_row = row.dup
attempts = []
@@ -54,11 +54,11 @@ Then /^routability should be$/ do |table|
want = shortcuts_hash[row[direction]] || row[direction] #expand shortcuts
case want
when '', 'x'
- output_row[direction] = result[direction][:status].to_s
+ output_row[direction] = result[direction][:status] ? result[direction][:status].to_s : ''
when /^\d+s/
- output_row[direction] = "#{result[direction][:time]}s"
+ output_row[direction] = result[direction][:time] ? "#{result[direction][:time]}s" : ''
when /^\d+ km\/h/
- output_row[direction] = "#{result[direction][:speed]} km/h"
+ output_row[direction] = result[direction][:speed] ? "#{result[direction][:speed]} km/h" : ''
else
raise "*** Unknown expectation format: #{want}"
end
diff --git a/3party/osrm/osrm-backend/features/step_definitions/routing.rb b/3party/osrm/osrm-backend/features/step_definitions/routing.rb
index 73bd5381d1..c25f5b7c8c 100644
--- a/3party/osrm/osrm-backend/features/step_definitions/routing.rb
+++ b/3party/osrm/osrm-backend/features/step_definitions/routing.rb
@@ -1,7 +1,7 @@
When /^I route I should get$/ do |table|
reprocess
actual = []
- OSRMBackgroundLauncher.new("#{@osm_file}.osrm") do
+ OSRMLoader.load(self,"#{prepared_file}.osrm") do
table.hashes.each_with_index do |row,ri|
if row['request']
got = {'request' => row['request'] }
@@ -104,22 +104,22 @@ When /^I route I should get$/ do |table|
end
end
if table.headers.include? 'bearing'
- got['bearing'] = bearings
+ got['bearing'] = instructions ? bearings : ''
end
if table.headers.include? 'compass'
- got['compass'] = compasses
+ got['compass'] = instructions ? compasses : ''
end
if table.headers.include? 'turns'
- got['turns'] = turns
+ got['turns'] = instructions ? turns : ''
end
if table.headers.include? 'modes'
- got['modes'] = modes
+ got['modes'] = instructions ? modes : ''
end
if table.headers.include? 'times'
- got['times'] = times
+ got['times'] = instructions ? times : ''
end
if table.headers.include? 'distances'
- got['distances'] = distances
+ got['distances'] = instructions ? distances : ''
end
end
end
diff --git a/3party/osrm/osrm-backend/features/support/data.rb b/3party/osrm/osrm-backend/features/support/data.rb
index 7c1ba887ae..1ff186181f 100644
--- a/3party/osrm/osrm-backend/features/support/data.rb
+++ b/3party/osrm/osrm-backend/features/support/data.rb
@@ -1,6 +1,7 @@
require 'OSM/objects' #osmlib gem
require 'OSM/Database'
require 'builder'
+require 'fileutils'
class Location
attr_accessor :lon,:lat
@@ -11,6 +12,7 @@ class Location
end
end
+
def set_input_format format
raise '*** Input format must be eiter "osm" or "pbf"' unless ['pbf','osm'].include? format.to_s
@input_format = format.to_s
@@ -21,7 +23,7 @@ def input_format
end
def sanitized_scenario_title
- @sanitized_scenario_title ||= @scenario_title.gsub /[^0-9A-Za-z.\-]/, '_'
+ @sanitized_scenario_title ||= @scenario_title.to_s.gsub /[^0-9A-Za-z.\-]/, '_'
end
def set_grid_size meters
@@ -154,7 +156,10 @@ def reset_data
end
reset_profile
reset_osm
- @fingerprint = nil
+ @fingerprint_osm = nil
+ @fingerprint_extract = nil
+ @fingerprint_prepare = nil
+ @fingerprint_route = nil
end
def make_osm_id
@@ -204,20 +209,30 @@ def osm_str
@osm_str
end
+def osm_file
+ @osm_file ||= "#{DATA_FOLDER}/#{fingerprint_osm}"
+end
+
+def extracted_file
+ @extracted_file ||= "#{osm_file}_#{fingerprint_extract}"
+end
+
+def prepared_file
+ @prepared_file ||= "#{osm_file}_#{fingerprint_extract}_#{fingerprint_prepare}"
+end
+
def write_osm
- #write .oms file if needed
Dir.mkdir DATA_FOLDER unless File.exist? DATA_FOLDER
- @osm_file = "#{DATA_FOLDER}/#{sanitized_scenario_title}_#{fingerprint}"
- unless File.exist?("#{@osm_file}.osm")
- File.open( "#{@osm_file}.osm", 'w') {|f| f.write(osm_str) }
+ unless File.exist?("#{osm_file}.osm")
+ File.open( "#{osm_file}.osm", 'w') {|f| f.write(osm_str) }
end
end
def convert_osm_to_pbf
- unless File.exist?("#{@osm_file}.osm.pbf")
+ unless File.exist?("#{osm_file}.osm.pbf")
log_preprocess_info
- log "== Converting #{@osm_file}.osm to protobuffer format...", :preprocess
- unless system "osmosis --read-xml #{@osm_file}.osm --write-pbf #{@osm_file}.osm.pbf omitmetadata=true >>#{PREPROCESS_LOG_FILE} 2>&1"
+ log "== Converting #{osm_file}.osm to protobuffer format...", :preprocess
+ unless system "osmosis --read-xml #{osm_file}.osm --write-pbf #{osm_file}.osm.pbf omitmetadata=true >>#{PREPROCESS_LOG_FILE} 2>&1"
raise OsmosisError.new $?, "osmosis exited with code #{$?.exitstatus}"
end
log '', :preprocess
@@ -225,22 +240,27 @@ def convert_osm_to_pbf
end
def extracted?
- File.exist?("#{@osm_file}.osrm") &&
- File.exist?("#{@osm_file}.osrm.names") &&
- File.exist?("#{@osm_file}.osrm.restrictions")
+ Dir.chdir TEST_FOLDER do
+ File.exist?("#{extracted_file}.osrm") &&
+ File.exist?("#{extracted_file}.osrm.names") &&
+ File.exist?("#{extracted_file}.osrm.restrictions")
+ end
end
def prepared?
- File.exist?("#{@osm_file}.osrm.hsgr")
+ Dir.chdir TEST_FOLDER do
+ File.exist?("#{prepared_file}.osrm.hsgr")
+ end
end
def write_timestamp
- File.open( "#{@osm_file}.osrm.timestamp", 'w') {|f| f.write(OSM_TIMESTAMP) }
+ File.open( "#{prepared_file}.osrm.timestamp", 'w') {|f| f.write(OSM_TIMESTAMP) }
end
def pbf?
input_format=='pbf'
end
+
def write_input_data
Dir.chdir TEST_FOLDER do
write_osm
@@ -252,23 +272,43 @@ end
def extract_data
Dir.chdir TEST_FOLDER do
log_preprocess_info
- log "== Extracting #{@osm_file}.osm...", :preprocess
- unless system "#{BIN_PATH}/osrm-extract #{@osm_file}.osm#{'.pbf' if pbf?} --profile #{PROFILES_PATH}/#{@profile}.lua >>#{PREPROCESS_LOG_FILE} 2>&1"
+ log "== Extracting #{osm_file}.osm...", :preprocess
+ unless system "#{BIN_PATH}/osrm-extract #{osm_file}.osm#{'.pbf' if pbf?} --profile #{PROFILES_PATH}/#{@profile}.lua >>#{PREPROCESS_LOG_FILE} 2>&1"
log "*** Exited with code #{$?.exitstatus}.", :preprocess
raise ExtractError.new $?.exitstatus, "osrm-extract exited with code #{$?.exitstatus}."
end
- log '', :preprocess
+ begin
+ ["osrm","osrm.names","osrm.restrictions"].each do |file|
+ File.rename "#{osm_file}.#{file}", "#{extracted_file}.#{file}"
+ end
+ rescue Exception => e
+ raise FileError.new nil, "failed to rename data file after extracting."
+ end
end
end
def prepare_data
Dir.chdir TEST_FOLDER do
log_preprocess_info
- log "== Preparing #{@osm_file}.osm...", :preprocess
- unless system "#{BIN_PATH}/osrm-prepare #{@osm_file}.osrm --profile #{PROFILES_PATH}/#{@profile}.lua >>#{PREPROCESS_LOG_FILE} 2>&1"
+ log "== Preparing #{extracted_file}.osm...", :preprocess
+ unless system "#{BIN_PATH}/osrm-prepare #{extracted_file}.osrm --profile #{PROFILES_PATH}/#{@profile}.lua >>#{PREPROCESS_LOG_FILE} 2>&1"
log "*** Exited with code #{$?.exitstatus}.", :preprocess
raise PrepareError.new $?.exitstatus, "osrm-prepare exited with code #{$?.exitstatus}."
end
+ begin
+ ["osrm.hsgr","osrm.fileIndex","osrm.geometry","osrm.nodes","osrm.ramIndex"].each do |file|
+ File.rename "#{extracted_file}.#{file}", "#{prepared_file}.#{file}"
+ end
+ rescue Exception => e
+ raise FileError.new nil, "failed to rename data file after preparing."
+ end
+ begin
+ ["osrm.names","osrm.edges","osrm.restrictions"].each do |file|
+ FileUtils.cp "#{extracted_file}.#{file}", "#{prepared_file}.#{file}"
+ end
+ rescue Exception => e
+ raise FileError.new nil, "failed to copy data file after preparing."
+ end
log '', :preprocess
end
end
diff --git a/3party/osrm/osrm-backend/features/support/env.rb b/3party/osrm/osrm-backend/features/support/env.rb
index 369705ab03..a01341dd6a 100644
--- a/3party/osrm/osrm-backend/features/support/env.rb
+++ b/3party/osrm/osrm-backend/features/support/env.rb
@@ -1,8 +1,8 @@
require 'rspec/expectations'
+
DEFAULT_PORT = 5000
DEFAULT_TIMEOUT = 2
-
ROOT_FOLDER = Dir.pwd
OSM_USER = 'osrm'
OSM_GENERATOR = 'osrm-test'
@@ -17,6 +17,26 @@ PROFILES_PATH = File.join ROOT_FOLDER, 'profiles'
BIN_PATH = File.join ROOT_FOLDER, 'build'
DEFAULT_INPUT_FORMAT = 'osm'
DEFAULT_ORIGIN = [1,1]
+LAUNCH_TIMEOUT = 1
+SHUTDOWN_TIMEOUT = 10
+DEFAULT_LOAD_METHOD = 'datastore'
+OSRM_ROUTED_LOG_FILE = 'osrm-routed.log'
+
+if ENV['OS']==/Windows.*/ then
+ TERMSIGNAL='TERM'
+else
+ TERMSIGNAL=9
+end
+
+
+def log_time_and_run cmd
+ log_time cmd
+ `#{cmd}`
+end
+
+def log_time cmd
+ puts "[#{Time.now.strftime('%Y-%m-%d %H:%M:%S:%L')}] #{cmd}"
+end
puts "Ruby version #{RUBY_VERSION}"
@@ -44,6 +64,7 @@ unless File.exists? TEST_FOLDER
raise "*** Test folder #{TEST_FOLDER} doesn't exist."
end
+
if ENV['OS']=~/Windows.*/ then
EXE='.exe'
QQ='"'
@@ -53,5 +74,12 @@ else
end
AfterConfiguration do |config|
+ if OSRMLoader::OSRMBaseLoader.new.osrm_up?
+ raise "*** osrm-routed is already running."
+ end
clear_log_files
end
+
+at_exit do
+ OSRMLoader::OSRMBaseLoader.new.shutdown
+end
diff --git a/3party/osrm/osrm-backend/features/support/exceptions.rb b/3party/osrm/osrm-backend/features/support/exceptions.rb
index 2901bfe6af..02f59d388a 100644
--- a/3party/osrm/osrm-backend/features/support/exceptions.rb
+++ b/3party/osrm/osrm-backend/features/support/exceptions.rb
@@ -31,6 +31,12 @@ class OSRMError < StandardError
end
end
+class FileError < OSRMError
+ def initialize code, msg
+ super 'fileutil', code, msg, PREPROCESS_LOG_FILE, 5
+ end
+end
+
class OsmosisError < OSRMError
def initialize code, msg
super 'osmosis', code, msg, PREPROCESS_LOG_FILE, 40
diff --git a/3party/osrm/osrm-backend/features/support/hash.rb b/3party/osrm/osrm-backend/features/support/hash.rb
index 197cd426ee..6980b66456 100644
--- a/3party/osrm/osrm-backend/features/support/hash.rb
+++ b/3party/osrm/osrm-backend/features/support/hash.rb
@@ -32,18 +32,32 @@ def lua_lib_hash
end
def bin_extract_hash
- bin_extract_hash ||= hash_of_files "#{BIN_PATH}/osrm-extract#{EXE}"
+ @bin_extract_hash ||= hash_of_files "#{BIN_PATH}/osrm-extract#{EXE}"
+ @bin_extract_hash
end
def bin_prepare_hash
- bin_prepare_hash ||= hash_of_files "#{BIN_PATH}/osrm-prepare#{EXE}"
+ @bin_prepare_hash ||= hash_of_files "#{BIN_PATH}/osrm-prepare#{EXE}"
end
def bin_routed_hash
- bin_routed_hash ||= hash_of_files "#{BIN_PATH}/osrm-routed#{EXE}"
+ @bin_routed_hash ||= hash_of_files "#{BIN_PATH}/osrm-routed#{EXE}"
end
-#combine state of data, profile and binaries into a hash that identifies the exact test scenario
-def fingerprint
- @fingerprint ||= Digest::SHA1.hexdigest "#{bin_extract_hash}-#{bin_prepare_hash}-#{bin_routed_hash}-#{profile_hash}-#{lua_lib_hash}-#{osm_hash}"
+# combine state of data, profile and binaries into a hashes that identifies
+# the exact test situation at different stages, so we can later skip steps when possible.
+def fingerprint_osm
+ @fingerprint_osm ||= Digest::SHA1.hexdigest "#{osm_hash}"
end
+
+def fingerprint_extract
+ @fingerprint_extract ||= Digest::SHA1.hexdigest "#{profile_hash}-#{lua_lib_hash}-#{bin_extract_hash}"
+end
+
+def fingerprint_prepare
+ @fingerprint_prepare ||= Digest::SHA1.hexdigest "#{bin_prepare_hash}"
+end
+
+def fingerprint_route
+ @fingerprint_route ||= Digest::SHA1.hexdigest "#{bin_routed_hash}"
+end \ No newline at end of file
diff --git a/3party/osrm/osrm-backend/features/support/hooks.rb b/3party/osrm/osrm-backend/features/support/hooks.rb
index ff8f10ff1d..3370142468 100644
--- a/3party/osrm/osrm-backend/features/support/hooks.rb
+++ b/3party/osrm/osrm-backend/features/support/hooks.rb
@@ -1,7 +1,9 @@
STRESS_TIMEOUT = 300
+
Before do |scenario|
+
# feature name
case scenario
when Cucumber::Ast::Scenario
@@ -18,6 +20,7 @@ Before do |scenario|
@scenario_title = scenario.scenario_outline.name
end
+ @load_method = DEFAULT_LOAD_METHOD
@query_params = {}
@scenario_time = Time.now.strftime("%Y-%m-%dT%H:%m:%SZ")
reset_data
@@ -25,6 +28,7 @@ Before do |scenario|
@has_logged_scenario_info = false
set_grid_size DEFAULT_GRID_SIZE
set_origin DEFAULT_ORIGIN
+
end
Around('@stress') do |scenario, block|
diff --git a/3party/osrm/osrm-backend/features/support/launch.rb b/3party/osrm/osrm-backend/features/support/launch.rb
index e55867a671..f6667fad6d 100644
--- a/3party/osrm/osrm-backend/features/support/launch.rb
+++ b/3party/osrm/osrm-backend/features/support/launch.rb
@@ -1,95 +1,136 @@
require 'socket'
require 'open3'
-if ENV['OS']==/Windows.*/ then
- TERMSIGNAL='TERM'
-else
- TERMSIGNAL=9
-end
+# Only one isntance of osrm-routed is ever launched, to avoid collisions.
+# The default is to keep osrm-routed running and load data with datastore.
+# however, osrm-routed it shut down and relaunched for each scenario thats
+# loads data directly.
+class OSRMLoader
-OSRM_ROUTED_LOG_FILE = 'osrm-routed.log'
+ class OSRMBaseLoader
+ @@pid = nil
-class OSRMBackgroundLauncher
- def initialize input_file, &block
- @input_file = input_file
- Dir.chdir TEST_FOLDER do
- begin
- launch
- yield
- ensure
- shutdown
+ def launch
+ Timeout.timeout(LAUNCH_TIMEOUT) do
+ osrm_up
+ wait_for_connection
end
+ rescue Timeout::Error
+ raise RoutedError.new "Launching osrm-routed timed out."
end
- end
- private
+ def shutdown
+ Timeout.timeout(SHUTDOWN_TIMEOUT) do
+ osrm_down
+ end
+ rescue Timeout::Error
+ kill
+ raise RoutedError.new "Shutting down osrm-routed timed out."
+ end
- def launch
- Timeout.timeout(OSRM_TIMEOUT) do
- osrm_up
- wait_for_connection
+ def osrm_up?
+ if @@pid
+ begin
+ if Process.waitpid(@@pid, Process::WNOHANG) then
+ false
+ else
+ true
+ end
+ rescue Errno::ESRCH, Errno::ECHILD
+ false
+ end
+ end
end
- rescue Timeout::Error
- raise RoutedError.new "Launching osrm-routed timed out."
- end
- def shutdown
- Timeout.timeout(OSRM_TIMEOUT) do
- osrm_down
+ def osrm_down
+ if @@pid
+ Process.kill TERMSIGNAL, @@pid
+ wait_for_shutdown
+ @@pid = nil
+ end
end
- rescue Timeout::Error
- kill
- raise RoutedError.new "Shutting down osrm-routed timed out."
- end
+ def kill
+ if @@pid
+ Process.kill 'KILL', @@pid
+ end
+ end
- def osrm_up?
- if @pid
- begin
- if Process.waitpid(@pid, Process::WNOHANG) then
- false
- else
- true
+ def wait_for_connection
+ while true
+ begin
+ socket = TCPSocket.new('127.0.0.1', OSRM_PORT)
+ return
+ rescue Errno::ECONNREFUSED
+ sleep 0.1
end
- rescue Errno::ESRCH, Errno::ECHILD
- false
end
end
- end
- def osrm_up
- return if osrm_up?
- @pid = Process.spawn("#{BIN_PATH}/osrm-routed #{@input_file} --port #{OSRM_PORT}",:out=>OSRM_ROUTED_LOG_FILE, :err=>OSRM_ROUTED_LOG_FILE)
- Process.detach(@pid) # avoid zombie processes
+ def wait_for_shutdown
+ while osrm_up?
+ sleep 0.01
+ end
+ end
end
- def osrm_down
- if @pid
- Process.kill TERMSIGNAL, @pid
- wait_for_shutdown
+ # looading data directly when lauching osrm-routed:
+ # under this scheme, osmr-routed is launched and shutdown for each scenario,
+ # and osrm-datastore is not used
+ class OSRMDirectLoader < OSRMBaseLoader
+ def load world, input_file, &block
+ @world = world
+ @input_file = input_file
+ Dir.chdir TEST_FOLDER do
+ shutdown
+ launch
+ yield
+ shutdown
+ end
end
- end
- def kill
- if @pid
- Process.kill 'KILL', @pid
+ def osrm_up
+ return if @@pid
+ @@pid = Process.spawn("#{BIN_PATH}/osrm-routed #{@input_file} --port #{OSRM_PORT}",:out=>OSRM_ROUTED_LOG_FILE, :err=>OSRM_ROUTED_LOG_FILE)
+ Process.detach(@@pid) # avoid zombie processes
end
+
end
- def wait_for_connection
- while true
- begin
- socket = TCPSocket.new('127.0.0.1', OSRM_PORT)
- return
- rescue Errno::ECONNREFUSED
- sleep 0.1
+ # looading data with osrm-datastore:
+ # under this scheme, osmr-routed is launched once and kept running for all scenarios,
+ # and osrm-datastore is used to load data for each scenario
+ class OSRMDatastoreLoader < OSRMBaseLoader
+ def load world, input_file, &block
+ @world = world
+ @input_file = input_file
+ Dir.chdir TEST_FOLDER do
+ load_data
+ launch unless @@pid
+ yield
end
end
+
+ def load_data
+ run_bin "osrm-datastore", @input_file
+ end
+
+ def osrm_up
+ return if osrm_up?
+ @@pid = Process.spawn("#{BIN_PATH}/osrm-routed --sharedmemory=1 --port #{OSRM_PORT}",:out=>OSRM_ROUTED_LOG_FILE, :err=>OSRM_ROUTED_LOG_FILE)
+ Process.detach(@@pid) # avoid zombie processes
+ end
end
- def wait_for_shutdown
- while osrm_up?
- sleep 0.1
+ def self.load world, input_file, &block
+ method = world.instance_variable_get "@load_method"
+ if method == 'datastore'
+ OSRMDatastoreLoader.new.load world, input_file, &block
+ elsif method == 'directly'
+ OSRMDirectLoader.new.load world, input_file, &block
+ else
+ raise "*** Unknown load method '#{method}'"
end
end
+
end
diff --git a/3party/osrm/osrm-backend/features/support/log.rb b/3party/osrm/osrm-backend/features/support/log.rb
index 7dc34f29c8..e480bdb0c4 100644
--- a/3party/osrm/osrm-backend/features/support/log.rb
+++ b/3party/osrm/osrm-backend/features/support/log.rb
@@ -29,7 +29,10 @@ def log_scenario_fail_info
log "========================================="
log "Failed scenario: #{@scenario_title}"
log "Time: #{@scenario_time}"
- log "Fingerprint: #{@fingerprint}"
+ log "Fingerprint osm stage: #{@fingerprint_osm}"
+ log "Fingerprint extract stage: #{@fingerprint_extract}"
+ log "Fingerprint prepare stage: #{@fingerprint_prepare}"
+ log "Fingerprint route stage: #{@fingerprint_route}"
log "Profile: #{@profile}"
log
log '```xml' #so output can be posted directly to github comment fields
@@ -41,6 +44,7 @@ def log_scenario_fail_info
end
def log_fail expected,got,attempts
+ return
log_scenario_fail_info
log "== "
log "Expected: #{expected}"
diff --git a/3party/osrm/osrm-backend/features/support/run.rb b/3party/osrm/osrm-backend/features/support/run.rb
index 3eadf90d57..0e64b93de5 100644
--- a/3party/osrm/osrm-backend/features/support/run.rb
+++ b/3party/osrm/osrm-backend/features/support/run.rb
@@ -2,16 +2,26 @@ def run_bin bin, options
Dir.chdir TEST_FOLDER do
opt = options.dup
- if opt.include? '{base}'
- raise "*** {base} is missing" unless @osm_file
- opt.gsub! "{base}", "#{@osm_file}"
+ if opt.include? '{osm_base}'
+ raise "*** {osm_base} is missing" unless osm_file
+ opt.gsub! "{osm_base}", "#{osm_file}"
end
+ if opt.include? '{extracted_base}'
+ raise "*** {extracted_base} is missing" unless extracted_file
+ opt.gsub! "{extracted_base}", "#{extracted_file}"
+ end
+
+ if opt.include? '{prepared_base}'
+ raise "*** {prepared_base} is missing" unless prepared_file
+ opt.gsub! "{prepared_base}", "#{prepared_file}"
+ end
if opt.include? '{profile}'
opt.gsub! "{profile}", "#{PROFILES_PATH}/#{@profile}.lua"
end
- @stdout = `#{QQ}#{BIN_PATH}/#{bin}#{EXE}#{QQ} #{opt} 2>error.log`
+ cmd = "#{QQ}#{BIN_PATH}/#{bin}#{EXE}#{QQ} #{opt} 2>error.log"
+ @stdout = `#{cmd}`
@stderr = File.read 'error.log'
@exit_code = $?.exitstatus
end
diff --git a/3party/osrm/osrm-backend/features/testbot/bad.feature b/3party/osrm/osrm-backend/features/testbot/bad.feature
index f0f3cfacc6..d7e3c95af1 100644
--- a/3party/osrm/osrm-backend/features/testbot/bad.feature
+++ b/3party/osrm/osrm-backend/features/testbot/bad.feature
@@ -1,4 +1,4 @@
-@routing @bad
+@routing @bad @testbot
Feature: Handle bad data in a graceful manner
Background:
diff --git a/3party/osrm/osrm-backend/features/testbot/basic.feature b/3party/osrm/osrm-backend/features/testbot/basic.feature
index 3fda3d3633..2b35d29a01 100644
--- a/3party/osrm/osrm-backend/features/testbot/basic.feature
+++ b/3party/osrm/osrm-backend/features/testbot/basic.feature
@@ -1,4 +1,4 @@
-@routing @basic
+@routing @basic @testbot
Feature: Basic Routing
Background:
diff --git a/3party/osrm/osrm-backend/features/testbot/bearing.feature b/3party/osrm/osrm-backend/features/testbot/bearing.feature
index c306af92db..9b3dc4eb7a 100644
--- a/3party/osrm/osrm-backend/features/testbot/bearing.feature
+++ b/3party/osrm/osrm-backend/features/testbot/bearing.feature
@@ -1,4 +1,4 @@
-@routing @bearing
+@routing @bearing @testbot
Feature: Compass bearing
Background:
diff --git a/3party/osrm/osrm-backend/features/testbot/bearing_param.feature b/3party/osrm/osrm-backend/features/testbot/bearing_param.feature
index e9db873317..810f690384 100644
--- a/3party/osrm/osrm-backend/features/testbot/bearing_param.feature
+++ b/3party/osrm/osrm-backend/features/testbot/bearing_param.feature
@@ -1,4 +1,4 @@
-@routing @bearing_param @todo
+@routing @bearing_param @todo @testbot
Feature: Bearing parameter
Background:
diff --git a/3party/osrm/osrm-backend/features/testbot/compression.feature b/3party/osrm/osrm-backend/features/testbot/compression.feature
new file mode 100644
index 0000000000..146ad63df7
--- /dev/null
+++ b/3party/osrm/osrm-backend/features/testbot/compression.feature
@@ -0,0 +1,22 @@
+@routing @graph @testbot
+Feature: Geometry Compression
+
+ Background:
+ Given the profile "testbot"
+
+ Scenario: Compressed segments have correct order
+ Given the node map
+ | a | | d | | | | h |
+ | b | | | | e | | f |
+ | | c | | | | | g |
+
+ And the ways
+ | nodes |
+ | abcdef |
+ | fh |
+ | fg |
+
+ When I route I should get
+ | from | to | route | distance | speed |
+ | b | e | abcdef | 589m | 35 km/h |
+ | e | b | abcdef | 589m | 35 km/h |
diff --git a/3party/osrm/osrm-backend/features/testbot/datastore.feature b/3party/osrm/osrm-backend/features/testbot/datastore.feature
new file mode 100644
index 0000000000..568ae7aa4b
--- /dev/null
+++ b/3party/osrm/osrm-backend/features/testbot/datastore.feature
@@ -0,0 +1,31 @@
+@routing @datastore @testbot
+Feature: Temporary tests related to osrm-datastore
+
+ Background:
+ Given the profile "testbot"
+
+ Scenario: Scenario ab
+ Given the node map
+ | a | b |
+
+ And the ways
+ | nodes |
+ | ab |
+
+ When I route I should get
+ | from | to | route |
+ | a | b | ab |
+ | b | a | ab |
+
+ Scenario: Scenaria xy
+ Given the node map
+ | x | y |
+
+ And the ways
+ | nodes |
+ | xy |
+
+ When I route I should get
+ | from | to | route |
+ | x | y | xy |
+ | y | x | xy |
diff --git a/3party/osrm/osrm-backend/features/testbot/distance.feature b/3party/osrm/osrm-backend/features/testbot/distance.feature
index f9f166bd72..1f777d24f4 100644
--- a/3party/osrm/osrm-backend/features/testbot/distance.feature
+++ b/3party/osrm/osrm-backend/features/testbot/distance.feature
@@ -1,4 +1,4 @@
-@routing @distance
+@routing @distance @testbot
Feature: Distance calculation
Background:
diff --git a/3party/osrm/osrm-backend/features/testbot/fastest.feature b/3party/osrm/osrm-backend/features/testbot/fastest.feature
index 9a5cf24a34..8c24a5334d 100644
--- a/3party/osrm/osrm-backend/features/testbot/fastest.feature
+++ b/3party/osrm/osrm-backend/features/testbot/fastest.feature
@@ -1,4 +1,4 @@
-@routing @fastest
+@routing @fastest @testbot
Feature: Choosing fastest route
Background:
diff --git a/3party/osrm/osrm-backend/features/testbot/geometry.feature b/3party/osrm/osrm-backend/features/testbot/geometry.feature
index 553af9393f..8b38c06f81 100644
--- a/3party/osrm/osrm-backend/features/testbot/geometry.feature
+++ b/3party/osrm/osrm-backend/features/testbot/geometry.feature
@@ -1,4 +1,4 @@
-@routing
+@routing @testbot
Feature: Retrieve geometry
Background: Use some profile
diff --git a/3party/osrm/osrm-backend/features/testbot/graph.feature b/3party/osrm/osrm-backend/features/testbot/graph.feature
index a870106dc1..adff998681 100644
--- a/3party/osrm/osrm-backend/features/testbot/graph.feature
+++ b/3party/osrm/osrm-backend/features/testbot/graph.feature
@@ -1,4 +1,4 @@
-@routing @graph
+@routing @graph @testbot
Feature: Basic Routing
#Test the input data descibed on https://github.com/DennisOSRM/Project-OSRM/wiki/Graph-representation
@@ -19,3 +19,22 @@ Feature: Basic Routing
When I route I should get
| from | to | route |
| a | e | abc,dce |
+
+ Scenario: Turn instructions on compressed road network geometry
+ Given the node map
+ | x | a | | |
+ | | b | | |
+ | f | | | e |
+ | | | | |
+ | | | | |
+ | y | c | | d |
+
+ And the ways
+ | nodes | name |
+ | xa | first |
+ | abcdef | compr |
+ | fy | last |
+
+ When I route I should get
+ | from | to | route | turns |
+ | x | y | first,compr,last | head,right,left,destination |
diff --git a/3party/osrm/osrm-backend/features/testbot/load.feature b/3party/osrm/osrm-backend/features/testbot/load.feature
new file mode 100644
index 0000000000..cf5e470bdc
--- /dev/null
+++ b/3party/osrm/osrm-backend/features/testbot/load.feature
@@ -0,0 +1,63 @@
+@routing @load @testbot
+Feature: Ways of loading data
+# Several scenarios that change between direct/datastore makes
+# it easier to check that the test framework behaves as expected.
+
+ Background:
+ Given the profile "testbot"
+
+ Scenario: Load data with datastore - ab
+ Given data is loaded with datastore
+ Given the node map
+ | a | b |
+
+ And the ways
+ | nodes |
+ | ab |
+
+ When I route I should get
+ | from | to | route |
+ | a | b | ab |
+ | b | a | ab |
+
+ Scenario: Load data directly - st
+ Given data is loaded directly
+ Given the node map
+ | s | t |
+
+ And the ways
+ | nodes |
+ | st |
+
+ When I route I should get
+ | from | to | route |
+ | s | t | st |
+ | t | s | st |
+
+ Scenario: Load data datstore - xy
+ Given data is loaded with datastore
+ Given the node map
+ | x | y |
+
+ And the ways
+ | nodes |
+ | xy |
+
+ When I route I should get
+ | from | to | route |
+ | x | y | xy |
+ | y | x | xy |
+
+ Scenario: Load data directly - cd
+ Given data is loaded directly
+ Given the node map
+ | c | d |
+
+ And the ways
+ | nodes |
+ | cd |
+
+ When I route I should get
+ | from | to | route |
+ | c | d | cd |
+ | d | c | cd |
diff --git a/3party/osrm/osrm-backend/features/testbot/loop.feature b/3party/osrm/osrm-backend/features/testbot/loop.feature
index eb5b45e669..fe898ecf08 100644
--- a/3party/osrm/osrm-backend/features/testbot/loop.feature
+++ b/3party/osrm/osrm-backend/features/testbot/loop.feature
@@ -1,4 +1,4 @@
-@routing @726
+@routing @726 @testbot
Feature: Avoid weird loops caused by rounding errors
Background:
@@ -73,6 +73,6 @@ Feature: Avoid weird loops caused by rounding errors
| cf | secondary |
When I route I should get
- | waypoints | route | turns |
- | a,2,d | ab,be,ef,cf,cd | head,left,right,right,left,destination |
- | a,1,d | ab,be,ef,cf,cd | head,left,right,right,left,destination |
+ | waypoints | route | turns |
+ | a,2,d | ab,be,ef,ef,cf,cd | head,left,right,via,right,left,destination |
+ | a,1,d | ab,be,ef,ef,cf,cd | head,left,right,via,right,left,destination |
diff --git a/3party/osrm/osrm-backend/features/testbot/mode.feature b/3party/osrm/osrm-backend/features/testbot/mode.feature
index bcc087ec44..54b99d3a11 100644
--- a/3party/osrm/osrm-backend/features/testbot/mode.feature
+++ b/3party/osrm/osrm-backend/features/testbot/mode.feature
@@ -1,26 +1,227 @@
@routing @testbot @mode
-Feature: Testbot - Mode flag
+Feature: Testbot - Travel mode
+
+# testbot modes:
+# 1 normal
+# 2 route
+# 3 river downstream
+# 4 river upstream
+# 5 steps down
+# 6 steps up
Background:
- Given the profile "testbot"
+ Given the profile "testbot"
+
+ Scenario: Testbot - Modes in each direction, different forward/backward speeds
+ Given the node map
+ | | 0 | 1 | |
+ | a | | | b |
+
+ And the ways
+ | nodes | highway | oneway |
+ | ab | river | |
+
+ When I route I should get
+ | from | to | route | modes |
+ | a | 0 | ab | 3 |
+ | a | b | ab | 3 |
+ | 0 | 1 | ab | 3 |
+ | 0 | b | ab | 3 |
+ | b | 1 | ab | 4 |
+ | b | a | ab | 4 |
+ | 1 | 0 | ab | 4 |
+ | 1 | a | ab | 4 |
+
+ Scenario: Testbot - Modes in each direction, same forward/backward speeds
+ Given the node map
+ | | 0 | 1 | |
+ | a | | | b |
+
+ And the ways
+ | nodes | highway |
+ | ab | steps |
+
+ When I route I should get
+ | from | to | route | modes | time |
+ | 0 | 1 | ab | 5 | 60s +-1 |
+ | 1 | 0 | ab | 6 | 60s +-1 |
+
+ @oneway
+ Scenario: Testbot - Modes for oneway, different forward/backward speeds
+ Given the node map
+ | a | b |
+
+ And the ways
+ | nodes | highway | oneway |
+ | ab | river | yes |
+
+ When I route I should get
+ | from | to | route | modes |
+ | a | b | ab | 3 |
+ | b | a | | |
+
+ @oneway
+ Scenario: Testbot - Modes for oneway, same forward/backward speeds
+ Given the node map
+ | a | b |
+
+ And the ways
+ | nodes | highway | oneway |
+ | ab | steps | yes |
+
+ When I route I should get
+ | from | to | route | modes |
+ | a | b | ab | 5 |
+ | b | a | | |
+
+ @oneway
+ Scenario: Testbot - Modes for reverse oneway, different forward/backward speeds
+ Given the node map
+ | a | b |
+
+ And the ways
+ | nodes | highway | oneway |
+ | ab | river | -1 |
+
+ When I route I should get
+ | from | to | route | modes |
+ | a | b | | |
+ | b | a | ab | 4 |
+
+ @oneway
+ Scenario: Testbot - Modes for reverse oneway, same forward/backward speeds
+ Given the node map
+ | a | b |
+
+ And the ways
+ | nodes | highway | oneway |
+ | ab | steps | -1 |
- @todo
- Scenario: Bike - Mode
+ When I route I should get
+ | from | to | route | modes |
+ | a | b | | |
+ | b | a | ab | 6 |
+
+ @via
+ Scenario: Testbot - Mode should be set at via points
Given the node map
- | a | b | |
- | | c | d |
+ | a | 1 | b |
And the ways
+ | nodes | highway |
+ | ab | river |
+
+ When I route I should get
+ | waypoints | route | modes | turns |
+ | a,1,b | ab,ab | 3,3 | head,via,destination |
+ | b,1,a | ab,ab | 4,4 | head,via,destination |
+
+ Scenario: Testbot - Starting at a tricky node
+ Given the node map
+ | | a | | | |
+ | | | | b | c |
+
+ And the ways
+ | nodes | highway |
+ | ab | river |
+ | bc | primary |
+
+ When I route I should get
+ | from | to | route | modes |
+ | b | a | ab | 4 |
+
+ Scenario: Testbot - Mode changes on straight way without name change
+ Given the node map
+ | a | 1 | b | 2 | c |
+
+ And the ways
+ | nodes | highway | name |
+ | ab | primary | Avenue |
+ | bc | river | Avenue |
+
+ When I route I should get
+ | from | to | route | modes | turns |
+ | a | c | Avenue,Avenue | 1,3 | head,straight,destination |
+ | c | a | Avenue,Avenue | 4,1 | head,straight,destination |
+ | 1 | 2 | Avenue,Avenue | 1,3 | head,straight,destination |
+ | 2 | 1 | Avenue,Avenue | 4,1 | head,straight,destination |
+
+ Scenario: Testbot - Mode for routes
+ Given the node map
+ | a | b | | | |
+ | | c | d | e | f |
+
+ And the ways
| nodes | highway | route | duration |
| ab | primary | | |
| bc | | ferry | 0:01 |
| cd | primary | | |
+ | de | primary | | |
+ | ef | primary | | |
+
+ When I route I should get
+ | from | to | route | turns | modes |
+ | a | d | ab,bc,cd | head,right,left,destination | 1,2,1 |
+ | d | a | cd,bc,ab | head,right,left,destination | 1,2,1 |
+ | c | a | bc,ab | head,left,destination | 2,1 |
+ | d | b | cd,bc | head,right,destination | 1,2 |
+ | a | c | ab,bc | head,right,destination | 1,2 |
+ | b | d | bc,cd | head,left,destination | 2,1 |
+ | a | f | ab,bc,cd,de,ef | head,right,left,straight,straight,destination | 1,2,1,1,1 |
+
+ Scenario: Testbot - Modes, triangle map
+ Given the node map
+ | | | | | | | d |
+ | | | | | | 2 | |
+ | | | | | 6 | | 5 |
+ | a | 0 | b | c | | | |
+ | | | | | 4 | | 1 |
+ | | | | | | 3 | |
+ | | | | | | | e |
+
+ And the ways
+ | nodes | highway | oneway |
+ | abc | primary | |
+ | cd | primary | yes |
+ | ce | river | |
+ | de | primary | |
+
+ When I route I should get
+ | from | to | route | modes |
+ | 0 | 1 | abc,ce,de | 1,3,1 |
+ | 1 | 0 | de,ce,abc | 1,4,1 |
+ | 0 | 2 | abc,cd | 1,1 |
+ | 2 | 0 | cd,de,ce,abc | 1,1,4,1 |
+ | 0 | 3 | abc,ce | 1,3 |
+ | 3 | 0 | ce,abc | 4,1 |
+ | 4 | 3 | ce | 3 |
+ | 3 | 4 | ce | 4 |
+ | 3 | 1 | ce,de | 3,1 |
+ | 1 | 3 | de,ce | 1,4 |
+ | a | e | abc,ce | 1,3 |
+ | e | a | ce,abc | 4,1 |
+ | a | d | abc,cd | 1,1 |
+ | d | a | de,ce,abc | 1,4,1 |
+
+ Scenario: Testbot - River in the middle
+ Given the node map
+ | a | b | c | | |
+ | | | d | | |
+ | | | e | f | g |
+
+ And the ways
+ | nodes | highway |
+ | abc | primary |
+ | cde | river |
+ | efg | primary |
When I route I should get
- | from | to | route | turns | modes |
- | a | d | ab,bc,cd | head,right,left,destination | bot,ferry,bot |
- | d | a | cd,bc,ab | head,right left,destination | bot,ferry,bot |
- | c | a | bc,ab | head,left,destination | ferry,bot |
- | d | b | cd,bc | head,right,destination | bot,ferry |
- | a | c | ab,bc | head,right,destination | bot,ferry |
- | b | d | bc,cd | head,left,destination | ferry,bot |
+ | from | to | route | modes |
+ | a | g | abc,cde,efg | 1,3,1 |
+ | b | f | abc,cde,efg | 1,3,1 |
+ | e | c | cde | 4 |
+ | e | b | cde,abc | 4,1 |
+ | e | a | cde,abc | 4,1 |
+ | c | e | cde | 3 |
+ | c | f | cde,efg | 3,1 |
+ | c | g | cde,efg | 3,1 |
diff --git a/3party/osrm/osrm-backend/features/testbot/oneway.feature b/3party/osrm/osrm-backend/features/testbot/oneway.feature
index c21d8b1cb6..766bf8b3b9 100644
--- a/3party/osrm/osrm-backend/features/testbot/oneway.feature
+++ b/3party/osrm/osrm-backend/features/testbot/oneway.feature
@@ -6,11 +6,12 @@ Feature: Testbot - oneways
Scenario: Routing on a oneway roundabout
Given the node map
- | x | | | v | | |
- | | | d | c | | |
+ | | | | | v | |
+ | x | | d | c | | |
| | e | | | b | |
| | f | | | a | |
- | | | g | h | | |
+ | | | g | h | | y |
+ | | z | | | | |
And the ways
| nodes | oneway |
@@ -23,6 +24,9 @@ Feature: Testbot - oneways
| gh | yes |
| ha | yes |
| vx | yes |
+ | vy | yes |
+ | yz | yes |
+ | xe | yes |
When I route I should get
| from | to | route |
@@ -42,3 +46,57 @@ Feature: Testbot - oneways
| g | f | gh,ha,ab,bc,cd,de,ef |
| h | g | ha,ab,bc,cd,de,ef,fg |
| a | h | ab,bc,cd,de,ef,fg,gh |
+
+ Scenario: Testbot - Simple oneway
+ Then routability should be
+ | highway | foot | oneway | forw | backw |
+ | primary | no | yes | x | |
+
+ Scenario: Simple reverse oneway
+ Then routability should be
+ | highway | foot | oneway | forw | backw |
+ | primary | no | -1 | | x |
+
+ Scenario: Testbot - Around the Block
+ Given the node map
+ | a | b |
+ | d | c |
+
+ And the ways
+ | nodes | oneway | foot |
+ | ab | yes | no |
+ | bc | | no |
+ | cd | | no |
+ | da | | no |
+
+ When I route I should get
+ | from | to | route |
+ | a | b | ab |
+ | b | a | bc,cd,da |
+
+ Scenario: Testbot - Handle various oneway tag values
+ Then routability should be
+ | foot | oneway | forw | backw |
+ | no | | x | x |
+ | no | nonsense | x | x |
+ | no | no | x | x |
+ | no | false | x | x |
+ | no | 0 | x | x |
+ | no | yes | x | |
+ | no | true | x | |
+ | no | 1 | x | |
+ | no | -1 | | x |
+
+ Scenario: Testbot - Two consecutive oneways
+ Given the node map
+ | a | b | c |
+
+ And the ways
+ | nodes | oneway |
+ | ab | yes |
+ | bc | yes |
+
+
+ When I route I should get
+ | from | to | route |
+ | a | c | ab,bc |
diff --git a/3party/osrm/osrm-backend/features/testbot/origin.feature b/3party/osrm/osrm-backend/features/testbot/origin.feature
index c43e04e612..b5b1945020 100644
--- a/3party/osrm/osrm-backend/features/testbot/origin.feature
+++ b/3party/osrm/osrm-backend/features/testbot/origin.feature
@@ -1,4 +1,4 @@
-@routing @origin
+@routing @origin @testbot
Feature: Routing close to the [0,0] origin
Background:
diff --git a/3party/osrm/osrm-backend/features/testbot/penalty.feature b/3party/osrm/osrm-backend/features/testbot/penalty.feature
index 85f43c7ed8..e4f3cb632f 100644
--- a/3party/osrm/osrm-backend/features/testbot/penalty.feature
+++ b/3party/osrm/osrm-backend/features/testbot/penalty.feature
@@ -1,4 +1,4 @@
-@routing @penalty @signal
+@routing @penalty @signal @testbot
Feature: Penalties
# Testbot uses a signal penalty of 7s.
diff --git a/3party/osrm/osrm-backend/features/testbot/planetary.feature b/3party/osrm/osrm-backend/features/testbot/planetary.feature
index f2ba21e887..19925fe27f 100644
--- a/3party/osrm/osrm-backend/features/testbot/planetary.feature
+++ b/3party/osrm/osrm-backend/features/testbot/planetary.feature
@@ -1,4 +1,4 @@
-@routing @planetary
+@routing @planetary @testbot
Feature: Distance calculation
Scenario: Approximated Longitudinal distances at equator
diff --git a/3party/osrm/osrm-backend/features/testbot/projection.feature b/3party/osrm/osrm-backend/features/testbot/projection.feature
index ed2f2fcc4a..d7a0b89930 100644
--- a/3party/osrm/osrm-backend/features/testbot/projection.feature
+++ b/3party/osrm/osrm-backend/features/testbot/projection.feature
@@ -1,4 +1,4 @@
-@routing @projection
+@routing @projection @testbot
Feature: Projection to nearest point on road
# Waypoints are projected perpendiculary onto the closest road
diff --git a/3party/osrm/osrm-backend/features/testbot/protobuffer.feature b/3party/osrm/osrm-backend/features/testbot/protobuffer.feature
index a77ff34a64..e32de26c25 100644
--- a/3party/osrm/osrm-backend/features/testbot/protobuffer.feature
+++ b/3party/osrm/osrm-backend/features/testbot/protobuffer.feature
@@ -1,4 +1,4 @@
-@routing @pbf
+@routing @pbf @testbot
Feature: Importing protobuffer (.pbf) format
# Test normally read .osm, which is faster than .pbf files,
# since we don't need to use osmosis to first convert to .pbf
diff --git a/3party/osrm/osrm-backend/features/testbot/snap.feature b/3party/osrm/osrm-backend/features/testbot/snap.feature
index c8a04bfd74..bee75bc445 100644
--- a/3party/osrm/osrm-backend/features/testbot/snap.feature
+++ b/3party/osrm/osrm-backend/features/testbot/snap.feature
@@ -1,4 +1,4 @@
-@routing @snap
+@routing @snap @testbot
Feature: Snap start/end point to the nearest way
Background:
diff --git a/3party/osrm/osrm-backend/features/testbot/status.feature b/3party/osrm/osrm-backend/features/testbot/status.feature
index 4fa15ebb3c..1b12b33ea8 100644
--- a/3party/osrm/osrm-backend/features/testbot/status.feature
+++ b/3party/osrm/osrm-backend/features/testbot/status.feature
@@ -1,4 +1,4 @@
-@routing @status
+@routing @status @testbot
Feature: Status messages
Background:
diff --git a/3party/osrm/osrm-backend/features/testbot/time.feature b/3party/osrm/osrm-backend/features/testbot/time.feature
index e0ccc3760a..c838796f23 100644
--- a/3party/osrm/osrm-backend/features/testbot/time.feature
+++ b/3party/osrm/osrm-backend/features/testbot/time.feature
@@ -1,4 +1,4 @@
-@routing @time
+@routing @time @testbot
Feature: Estimation of travel time
# Testbot speeds:
# Primary road: 36km/h = 36000m/3600s = 100m/10s
diff --git a/3party/osrm/osrm-backend/features/testbot/turns.feature b/3party/osrm/osrm-backend/features/testbot/turns.feature
index 87bf21f551..6eba4f9e9f 100644
--- a/3party/osrm/osrm-backend/features/testbot/turns.feature
+++ b/3party/osrm/osrm-backend/features/testbot/turns.feature
@@ -1,4 +1,4 @@
-@routing @turns
+@routing @turns @testbot
Feature: Turn directions/codes
Background:
diff --git a/3party/osrm/osrm-backend/features/testbot/utf.feature b/3party/osrm/osrm-backend/features/testbot/utf.feature
index e9d324c1bc..d979e9f925 100644
--- a/3party/osrm/osrm-backend/features/testbot/utf.feature
+++ b/3party/osrm/osrm-backend/features/testbot/utf.feature
@@ -1,4 +1,4 @@
-@routing @utf
+@routing @utf @testbot
Feature: Handling of UTF characters
Background:
diff --git a/3party/osrm/osrm-backend/features/testbot/uturn.feature b/3party/osrm/osrm-backend/features/testbot/uturn.feature
index 0056f023b3..943796e698 100644
--- a/3party/osrm/osrm-backend/features/testbot/uturn.feature
+++ b/3party/osrm/osrm-backend/features/testbot/uturn.feature
@@ -1,4 +1,4 @@
-@routing @uturn @via
+@routing @uturn @via @testbot
Feature: U-turns at via points
Background:
@@ -21,7 +21,7 @@ Feature: U-turns at via points
When I route I should get
| waypoints | route | turns |
- | a,e,c | ab,be,ef,fg,dg,cd | head,right,left,straight,left,left,destination |
+ | a,e,c | ab,be,be,ef,fg,dg,cd | head,right,via,left,straight,left,left,destination |
Scenario: Query param to allow U-turns at all via points
Given the node map
@@ -42,8 +42,8 @@ Feature: U-turns at via points
| fg |
When I route I should get
- | waypoints | route |
- | a,e,c | ab,be,bc |
+ | waypoints | route |
+ | a,e,c | ab,be,be,bc |
@todo
Scenario: Instructions at via points at u-turns
diff --git a/3party/osrm/osrm-backend/features/testbot/via.feature b/3party/osrm/osrm-backend/features/testbot/via.feature
index 79fe540904..9eb8f556ec 100644
--- a/3party/osrm/osrm-backend/features/testbot/via.feature
+++ b/3party/osrm/osrm-backend/features/testbot/via.feature
@@ -13,9 +13,9 @@ Feature: Via points
| abc |
When I route I should get
- | waypoints | route |
- | a,b,c | abc |
- | c,b,a | abc |
+ | waypoints | route |
+ | a,b,c | abc,abc |
+ | c,b,a | abc,abc |
Scenario: Via point at a dead end
Given the node map
@@ -28,9 +28,9 @@ Feature: Via points
| bd |
When I route I should get
- | waypoints | route |
- | a,d,c | abc,bd,bd,abc |
- | c,d,a | abc,bd,bd,abc |
+ | waypoints | route |
+ | a,d,c | abc,bd,bd,bd,abc |
+ | c,d,a | abc,bd,bd,bd,abc |
Scenario: Multiple via points
Given the node map
@@ -48,9 +48,9 @@ Feature: Via points
| dh |
When I route I should get
- | waypoints | route |
- | a,c,f | ab,bcd,de,efg |
- | a,c,f,h | ab,bcd,de,efg,gh |
+ | waypoints | route |
+ | a,c,f | ab,bcd,bcd,de,efg |
+ | a,c,f,h | ab,bcd,bcd,de,efg,efg,gh |
Scenario: Via points on ring of oneways
# xa it to avoid only having a single ring, which cna trigger edge cases
@@ -73,9 +73,9 @@ Feature: Via points
| waypoints | route | distance | turns |
| 1,3 | ab,bc,cd | 400m +-1 | head,straight,straight,destination |
| 3,1 | cd,de,ef,fa,ab | 1000m +-1 | head,right,right,right,right,destination |
- | 1,2,3 | ab,bc,cd | 400m +-1 | head,straight,straight,destination |
- | 1,3,2 | ab,bc,cd,de,ef,fa,ab,bc | 1600m +-1 | head,straight,straight,right,right,right,right,straight,destination |
- | 3,2,1 | cd,de,ef,fa,ab,bc,cd,de,ef,fa,ab | 2400m +-1 | head,right,right,right,right,straight,straight,right,right,right,right,destination |
+ | 1,2,3 | ab,bc,bc,cd | 400m +-1 | head,straight,via,straight,destination |
+ | 1,3,2 | ab,bc,cd,cd,de,ef,fa,ab,bc | 1600m +-1 | head,straight,straight,via,right,right,right,right,straight,destination |
+ | 3,2,1 | cd,de,ef,fa,ab,bc,bc,cd,de,ef,fa,ab | 2400m +-1 | head,right,right,right,right,straight,via,straight,right,right,right,right,destination |
@bug
Scenario: Via points on ring on the same oneway
diff --git a/3party/osrm/osrm-backend/mapsme/CMakeLists.txt b/3party/osrm/osrm-backend/mapsme/CMakeLists.txt
deleted file mode 100644
index 09fe32e968..0000000000
--- a/3party/osrm/osrm-backend/mapsme/CMakeLists.txt
+++ /dev/null
@@ -1,12 +0,0 @@
-file(GLOB_RECURSE SOURCES "*.cpp")
-file(GLOB_RECURSE HEADERS "*.hpp")
-
-
-set(CMAKE_CXX_FLAGS_DEBUG "${CMAKE_CXX_FLAGS_DEBUG} -DNDEBUG")
-
-add_executable(osrm-mapsme ${SOURCES} ${HEADERS} "${CMAKE_SOURCE_DIR}/../../succinct/rs_bit_vector.cpp")
-target_link_libraries(osrm-mapsme ${Boost_LIBRARIES} FINGERPRINT GITDESCRIPTION COORDLIB
- debug "${CMAKE_SOURCE_DIR}/../../../../omim-build-debug/out/debug/libcoding.a"
- "${CMAKE_SOURCE_DIR}/../../../../omim-build-debug/out/debug/libbase.a"
- general "${CMAKE_SOURCE_DIR}/../../../../omim-build-release/out/release/libcoding.a"
- "${CMAKE_SOURCE_DIR}/../../../../omim-build-release/out/release/libbase.a")
diff --git a/3party/osrm/osrm-backend/mapsme/converter.cpp b/3party/osrm/osrm-backend/mapsme/converter.cpp
deleted file mode 100644
index 38b7c39169..0000000000
--- a/3party/osrm/osrm-backend/mapsme/converter.cpp
+++ /dev/null
@@ -1,389 +0,0 @@
-#include "converter.hpp"
-
-#include <iostream>
-
-
-#include "../../../../base/bits.hpp"
-#include "../../../../base/logging.hpp"
-#include "../../../../base/scope_guard.hpp"
-
-#include "../../../../coding/matrix_traversal.hpp"
-#include "../../../../coding/internal/file_data.hpp"
-
-#include "../../../../routing/osrm_data_facade.hpp"
-
-#include "../../../succinct/elias_fano.hpp"
-#include "../../../succinct/elias_fano_compressed_list.hpp"
-#include "../../../succinct/gamma_vector.hpp"
-#include "../../../succinct/rs_bit_vector.hpp"
-#include "../../../succinct/mapper.hpp"
-
-#include "../Server/DataStructures/InternalDataFacade.h"
-
-namespace mapsme
-{
-
-typedef pair<NodeID, QueryEdge::EdgeData> EdgeOsrmT;
-
-struct EdgeLess
-{
- bool operator () (EdgeOsrmT const & e1, EdgeOsrmT const & e2) const
- {
- if (e1.first != e2.first)
- return e1.first < e2.first;
-
- QueryEdge::EdgeData const & d1 = e1.second;
- QueryEdge::EdgeData const & d2 = e2.second;
-
- if (d1.distance != d2.distance)
- return d1.distance < d2.distance;
-
- if (d1.shortcut != d2.shortcut)
- return d1.shortcut < d2.shortcut;
-
- if (d1.forward != d2.forward)
- return d1.forward < d2.forward;
-
- if (d1.backward != d2.backward)
- return e1.second.backward < d2.backward;
-
- if (d1.id != d2.id)
- return d1.id < d2.id;
-
- return false;
- }
-};
-
-void PrintStatus(bool b)
-{
- std::cout << (b ? "[Ok]" : "[Fail]") << std::endl;
-}
-
-string EdgeDataToString(EdgeOsrmT const & d)
-{
- stringstream ss;
- ss << "[" << d.first << ", " << d.second.distance << ", " << d.second.shortcut << ", " << d.second.forward << ", "
- << d.second.backward << ", " << d.second.id << "]";
- return ss.str();
-}
-
-
-
-void GenerateRoutingIndex(const std::string & fPath)
-{
- ServerPaths server_paths;
-
- server_paths["hsgrdata"] = boost::filesystem::path(fPath + ".hsgr");
- server_paths["ramindex"] = boost::filesystem::path(fPath + ".ramIndex");
- server_paths["fileindex"] = boost::filesystem::path(fPath + ".fileIndex");
- server_paths["geometries"] = boost::filesystem::path(fPath + ".geometry");
- server_paths["nodesdata"] = boost::filesystem::path(fPath + ".nodes");
- server_paths["edgesdata"] = boost::filesystem::path(fPath + ".edges");
- server_paths["namesdata"] = boost::filesystem::path(fPath + ".names");
- server_paths["timestamp"] = boost::filesystem::path(fPath + ".timestamp");
-
- std::cout << "Create internal data facade for file: " << fPath << "...";
- InternalDataFacade<QueryEdge::EdgeData> facade(server_paths);
- PrintStatus(true);
-
- uint32_t const nodeCount = facade.GetNumberOfNodes();
-
- std::vector<uint64_t> edges;
- std::vector<uint32_t> edgesData;
- std::vector<bool> shortcuts;
- std::vector<uint64_t> edgeId;
-
- std::cout << "Repack graph..." << std::endl;
-
- typedef pair<uint64_t, QueryEdge::EdgeData> EdgeInfoT;
- typedef vector<EdgeInfoT> EdgeInfoVecT;
-
- uint64_t copiedEdges = 0, ignoredEdges = 0;
- for (uint32_t node = 0; node < nodeCount; ++node)
- {
- EdgeInfoVecT edgesInfo;
- for (auto edge : facade.GetAdjacentEdgeRange(node))
- {
- uint64_t target = facade.GetTarget(edge);
- auto const & data = facade.GetEdgeData(edge);
-
- edgesInfo.push_back(EdgeInfoT(target, data));
- }
-
- sort(edgesInfo.begin(), edgesInfo.end(), [](EdgeInfoT const & a, EdgeInfoT const & b)
- {
- if (a.first != b.first)
- return a.first < b.first;
-
- if (a.second.forward != b.second.forward)
- return a.second.forward > b.second.forward;
-
- return a.second.id < b.second.id;
- });
-
- uint64_t lastTarget = 0;
- for (auto edge : edgesInfo)
- {
- uint64_t const target = edge.first;
- auto const & data = edge.second;
-
- if (target < lastTarget)
- LOG(LCRITICAL, ("Invalid order of target nodes", target, lastTarget));
-
- lastTarget = target;
- assert(data.forward || data.backward);
-
- auto addDataFn = [&](bool b)
- {
- uint64_t const e = TraverseMatrixInRowOrder<uint64_t>(nodeCount, node, target, b);
-
- auto compressId = [&](uint64_t id)
- {
- return bits::ZigZagEncode(int64_t(node) - int64_t(id));
- };
-
- if (!edges.empty())
- CHECK_GREATER_OR_EQUAL(e, edges.back(), ());
-
- if (!edges.empty() && (edges.back() == e))
- {
- LOG(LWARNING, ("Invalid order of edges", e, edges.back(), nodeCount, node, target, b));
- CHECK(data.shortcut == shortcuts.back(), ());
-
- auto const last = edgesData.back();
- if (data.distance <= last)
- {
- if (!edgeId.empty() && data.shortcut)
- {
- CHECK(shortcuts.back(), ());
- unsigned oldId = node - bits::ZigZagDecode(edgeId.back());
-
- if (data.distance == last)
- edgeId.back() = compressId(min(oldId, data.id));
- else
- edgeId.back() = compressId(data.id);
- }
-
- edgesData.back() = data.distance;
- }
-
- ++ignoredEdges;
- return;
- }
-
- edges.push_back(e);
- edgesData.push_back(data.distance);
- shortcuts.push_back(data.shortcut);
-
- if (data.shortcut)
- edgeId.push_back(compressId(data.id));
- };
-
- if (data.forward && data.backward)
- {
- addDataFn(false);
- addDataFn(true);
- copiedEdges++;
- }
- else
- addDataFn(data.backward);
- }
- }
-
- std::cout << "Edges count: " << edgeId.size() << std::endl;
- PrintStatus(true);
-
- std::cout << "Sort edges...";
- std::sort(edges.begin(), edges.end());
- PrintStatus(true);
-
- std::cout << "Edges count: " << edges.size() << std::endl;
- std::cout << "Nodes count: " << nodeCount << std::endl;
-
- std::cout << "--- Save matrix" << std::endl;
- succinct::elias_fano::elias_fano_builder builder(edges.back(), edges.size());
- for (auto e : edges)
- builder.push_back(e);
- succinct::elias_fano matrix(&builder);
-
- std::string fileName = fPath + "." + ROUTING_MATRIX_FILE_TAG;
- std::ofstream fout(fileName, std::ios::binary);
- fout.write((const char*)&nodeCount, sizeof(nodeCount));
- succinct::mapper::freeze(matrix, fout);
- fout.close();
-
- std::cout << "--- Save edge data" << std::endl;
- succinct::elias_fano_compressed_list edgeVector(edgesData);
- fileName = fPath + "." + ROUTING_EDGEDATA_FILE_TAG;
- succinct::mapper::freeze(edgeVector, fileName.c_str());
-
- succinct::elias_fano_compressed_list edgeIdVector(edgeId);
- fileName = fPath + "." + ROUTING_EDGEID_FILE_TAG;
- succinct::mapper::freeze(edgeIdVector, fileName.c_str());
-
- std::cout << "--- Save edge shortcuts" << std::endl;
- succinct::rs_bit_vector shortcutsVector(shortcuts);
- fileName = fPath + "." + ROUTING_SHORTCUTS_FILE_TAG;
- succinct::mapper::freeze(shortcutsVector, fileName.c_str());
-
- if (edgeId.size() != shortcutsVector.num_ones())
- LOG(LCRITICAL, ("Invalid data"));
-
- std::cout << "--- Test packed data" << std::endl;
- std::string path = fPath + ".test";
-
- {
- FilesContainerW routingCont(path);
-
- auto appendFile = [&] (string const & tag)
- {
- string const fileName = fPath + "." + tag;
- routingCont.Write(fileName, tag);
- };
-
- appendFile(ROUTING_SHORTCUTS_FILE_TAG);
- appendFile(ROUTING_EDGEDATA_FILE_TAG);
- appendFile(ROUTING_MATRIX_FILE_TAG);
- appendFile(ROUTING_EDGEID_FILE_TAG);
-
- routingCont.Finish();
- }
-
- MY_SCOPE_GUARD(testFileGuard, bind(&my::DeleteFileX, cref(path)));
-
- FilesMappingContainer container;
- container.Open(path);
- typedef routing::OsrmDataFacade<QueryEdge::EdgeData> DataFacadeT;
- DataFacadeT facadeNew;
- facadeNew.Load(container);
-
- uint64_t edgesCount = facadeNew.GetNumberOfEdges() - copiedEdges + ignoredEdges;
- std::cout << "Check node count " << facade.GetNumberOfNodes() << " == " << facadeNew.GetNumberOfNodes() << "..." << std::endl;
- CHECK_EQUAL(facade.GetNumberOfNodes(), facadeNew.GetNumberOfNodes(), ());
- std::cout << "Check edges count " << facade.GetNumberOfEdges() << " == " << edgesCount << "..." << std::endl;
- CHECK_EQUAL(facade.GetNumberOfEdges(), edgesCount, ());
-
- std::cout << "Check edges data ...";
- bool error = false;
-
- typedef vector<QueryEdge::EdgeData> EdgeDataT;
- assert(facade.GetNumberOfEdges() == facadeNew.GetNumberOfEdges());
- for (uint32_t i = 0; i < facade.GetNumberOfNodes(); ++i)
- {
- // get all edges from osrm datafacade and store just minimal weights for duplicates
- vector<EdgeOsrmT> edgesOsrm;
- for (auto e : facade.GetAdjacentEdgeRange(i))
- edgesOsrm.push_back(EdgeOsrmT(facade.GetTarget(e), facade.GetEdgeData(e)));
-
- sort(edgesOsrm.begin(), edgesOsrm.end(), [](EdgeOsrmT const & a, EdgeOsrmT const & b)
- {
- if (a.first != b.first)
- return a.first < b.first;
-
- QueryEdge::EdgeData const & d1 = a.second;
- QueryEdge::EdgeData const & d2 = b.second;
-
- if (d1.forward != d2.forward)
- return d1.forward < d2.forward;
-
- if (d1.backward != d2.backward)
- return d1.backward < d2.backward;
-
- if (d1.distance != d2.distance)
- return d1.distance < d2.distance;
-
- return d1.id < d2.id;
- });
-
- for (size_t k = 1; k < edgesOsrm.size();)
- {
- auto const & e1 = edgesOsrm[k - 1];
- auto const & e2 = edgesOsrm[k];
-
- if (e1.first != e2.first ||
- e1.second.forward != e2.second.forward ||
- e1.second.backward != e2.second.backward)
- {
- ++k;
- continue;
- }
-
- if (e1.second.distance > e2.second.distance)
- edgesOsrm.erase(edgesOsrm.begin() + k - 1);
- else
- edgesOsrm.erase(edgesOsrm.begin() + k);
- }
-
- vector<EdgeOsrmT> v1, v2;
- for (auto e : edgesOsrm)
- {
- QueryEdge::EdgeData d = e.second;
- if (d.forward && d.backward)
- {
- d.backward = false;
- v1.push_back(EdgeOsrmT(e.first, d));
- d.forward = false;
- d.backward = true;
- }
-
- v1.push_back(EdgeOsrmT(e.first, d));
- }
-
- for (auto e : facadeNew.GetAdjacentEdgeRange(i))
- v2.push_back(EdgeOsrmT(facadeNew.GetTarget(e), facadeNew.GetEdgeData(e, i)));
-
- if (v1.size() != v2.size())
- {
- auto printV = [](vector<EdgeOsrmT> const & v, stringstream & ss)
- {
- for (auto i : v)
- ss << EdgeDataToString(i) << std::endl;
- };
-
- sort(v1.begin(), v1.end(), EdgeLess());
- sort(v2.begin(), v2.end(), EdgeLess());
-
- stringstream ss;
- ss << "File name: " << fPath << std::endl;
- ss << "Not equal edges count for node: " << i << std::endl;
- ss << "v1: " << v1.size() << " v2: " << v2.size() << std::endl;
- ss << "--- v1 ---" << std::endl;
- printV(v1, ss);
- ss << "--- v2 ---" << std::endl;
- printV(v2, ss);
-
- LOG(LCRITICAL, (ss.str()));
- }
-
- sort(v1.begin(), v1.end(), EdgeLess());
- sort(v2.begin(), v2.end(), EdgeLess());
-
- // compare vectors
- for (size_t k = 0; k < v1.size(); ++k)
- {
- EdgeOsrmT const & e1 = v1[k];
- EdgeOsrmT const & e2 = v2[k];
-
- QueryEdge::EdgeData const & d1 = e1.second;
- QueryEdge::EdgeData const & d2 = e2.second;
-
- if (e1.first != e2.first ||
- d1.backward != d2.backward ||
- d1.forward != d2.forward ||
- d1.distance != d2.distance ||
- (d1.id != d2.id && (d1.shortcut || d2.shortcut)) ||
- d1.shortcut != d2.shortcut)
- {
- std::cout << "--- " << std::endl;
- for (size_t j = 0; j < v1.size(); ++j)
- std::cout << EdgeDataToString(v1[j]) << " - " << EdgeDataToString(v2[j]) << std::endl;
-
- LOG(LCRITICAL, ("File:", fPath, "Node:", i, EdgeDataToString(e1), EdgeDataToString(e2)));
- }
- }
-
- }
- PrintStatus(!error);
-}
-
-}
diff --git a/3party/osrm/osrm-backend/mapsme/converter.hpp b/3party/osrm/osrm-backend/mapsme/converter.hpp
deleted file mode 100644
index 77961dd3ca..0000000000
--- a/3party/osrm/osrm-backend/mapsme/converter.hpp
+++ /dev/null
@@ -1,13 +0,0 @@
-#pragma once
-
-#include <string>
-
-#include "../DataStructures/QueryEdge.h"
-
-namespace mapsme
-{
-
-
-void GenerateRoutingIndex(const std::string & fPath);
-
-}
diff --git a/3party/osrm/osrm-backend/mapsme/main.cpp b/3party/osrm/osrm-backend/mapsme/main.cpp
deleted file mode 100644
index 5d626a9e61..0000000000
--- a/3party/osrm/osrm-backend/mapsme/main.cpp
+++ /dev/null
@@ -1,29 +0,0 @@
-#include <stdlib.h>
-
-#include <iostream>
-#include <boost/program_options.hpp>
-#include "converter.hpp"
-
-int main(int argc, char **argv)
-{
-
- boost::program_options::options_description descr;
-
- descr.add_options()
- ("help", "h")
- ("input,i", boost::program_options::value<std::string>(), "Path to input osrm file (belarus.osrm)");
-
- boost::program_options::variables_map vm;
- boost::program_options::store(boost::program_options::command_line_parser(argc, argv).options(descr).run(), vm);
- boost::program_options::notify(vm);
- if (vm.count("help") || !vm.count("input"))
- {
- std::cout << descr;
- return 0;
- }
-
-
- mapsme::GenerateRoutingIndex(vm["input"].as<std::string>());
-
- return 0;
-}
diff --git a/3party/osrm/osrm-backend/profile.lua b/3party/osrm/osrm-backend/profile.lua
index bad7e6bb5b..ad58cd86ef 120000..100644
--- a/3party/osrm/osrm-backend/profile.lua
+++ b/3party/osrm/osrm-backend/profile.lua
@@ -1 +1,412 @@
-profiles/car.lua \ No newline at end of file
+-- Begin of globals
+--require("lib/access") --function temporarily inlined
+
+barrier_whitelist = { ["cattle_grid"] = true, ["border_control"] = true, ["checkpoint"] = true, ["toll_booth"] = true, ["sally_port"] = true, ["gate"] = true, ["no"] = true, ["entrance"] = true }
+access_tag_whitelist = { ["yes"] = true, ["motorcar"] = true, ["motor_vehicle"] = true, ["vehicle"] = true, ["permissive"] = true, ["designated"] = true }
+access_tag_blacklist = { ["no"] = true, ["private"] = true, ["agricultural"] = true, ["forestry"] = true, ["emergency"] = true }
+access_tag_restricted = { ["destination"] = true, ["delivery"] = true }
+access_tags = { "motorcar", "motor_vehicle", "vehicle" }
+access_tags_hierachy = { "motorcar", "motor_vehicle", "vehicle", "access" }
+service_tag_restricted = { ["parking_aisle"] = true }
+ignore_in_grid = { ["ferry"] = true }
+restriction_exception_tags = { "motorcar", "motor_vehicle", "vehicle" }
+
+speed_profile = {
+ ["motorway"] = 90,
+ ["motorway_link"] = 45,
+ ["trunk"] = 85,
+ ["trunk_link"] = 40,
+ ["primary"] = 65,
+ ["primary_link"] = 30,
+ ["secondary"] = 55,
+ ["secondary_link"] = 25,
+ ["tertiary"] = 40,
+ ["tertiary_link"] = 20,
+ ["unclassified"] = 25,
+ ["residential"] = 25,
+ ["living_street"] = 10,
+ ["service"] = 15,
+-- ["track"] = 5,
+ ["ferry"] = 5,
+ ["shuttle_train"] = 10,
+ ["default"] = 10
+}
+
+
+-- surface/trackype/smoothness
+-- values were estimated from looking at the photos at the relevant wiki pages
+
+-- max speed for surfaces
+surface_speeds = {
+ ["asphalt"] = nil, -- nil mean no limit. removing the line has the same effect
+ ["concrete"] = nil,
+ ["concrete:plates"] = nil,
+ ["concrete:lanes"] = nil,
+ ["paved"] = nil,
+
+ ["cement"] = 80,
+ ["compacted"] = 80,
+ ["fine_gravel"] = 80,
+
+ ["paving_stones"] = 60,
+ ["metal"] = 60,
+ ["bricks"] = 60,
+
+ ["grass"] = 40,
+ ["wood"] = 40,
+ ["sett"] = 40,
+ ["grass_paver"] = 40,
+ ["gravel"] = 40,
+ ["unpaved"] = 40,
+ ["ground"] = 40,
+ ["dirt"] = 40,
+ ["pebblestone"] = 40,
+ ["tartan"] = 40,
+
+ ["cobblestone"] = 30,
+ ["clay"] = 30,
+
+ ["earth"] = 20,
+ ["stone"] = 20,
+ ["rocky"] = 20,
+ ["sand"] = 20,
+
+ ["mud"] = 10
+}
+
+-- max speed for tracktypes
+tracktype_speeds = {
+ ["grade1"] = 60,
+ ["grade2"] = 40,
+ ["grade3"] = 30,
+ ["grade4"] = 25,
+ ["grade5"] = 20
+}
+
+-- max speed for smoothnesses
+smoothness_speeds = {
+ ["intermediate"] = 80,
+ ["bad"] = 40,
+ ["very_bad"] = 20,
+ ["horrible"] = 10,
+ ["very_horrible"] = 5,
+ ["impassable"] = 0
+}
+
+-- http://wiki.openstreetmap.org/wiki/Speed_limits
+maxspeed_table_default = {
+ ["urban"] = 50,
+ ["rural"] = 90,
+ ["trunk"] = 110,
+ ["motorway"] = 130
+}
+
+-- List only exceptions
+maxspeed_table = {
+ ["de:living_street"] = 7,
+ ["ru:living_street"] = 20,
+ ["ru:urban"] = 60,
+ ["ua:urban"] = 60,
+ ["at:rural"] = 100,
+ ["de:rural"] = 100,
+ ["at:trunk"] = 100,
+ ["cz:trunk"] = 0,
+ ["ro:trunk"] = 100,
+ ["cz:motorway"] = 0,
+ ["de:motorway"] = 0,
+ ["ru:motorway"] = 110,
+ ["gb:nsl_single"] = (60*1609)/1000,
+ ["gb:nsl_dual"] = (70*1609)/1000,
+ ["gb:motorway"] = (70*1609)/1000,
+ ["uk:nsl_single"] = (60*1609)/1000,
+ ["uk:nsl_dual"] = (70*1609)/1000,
+ ["uk:motorway"] = (70*1609)/1000
+}
+
+traffic_signal_penalty = 2
+
+local take_minimum_of_speeds = false
+local obey_oneway = true
+local obey_bollards = true
+local use_turn_restrictions = true
+local ignore_areas = true -- future feature
+local u_turn_penalty = 20
+
+local abs = math.abs
+local min = math.min
+local max = math.max
+
+local speed_reduction = 0.8
+
+--modes
+local mode_normal = 1
+local mode_ferry = 2
+
+
+local function find_access_tag(source,access_tags_hierachy)
+ for i,v in ipairs(access_tags_hierachy) do
+ local has_tag = source.tags:Holds(v)
+ if has_tag then
+ return source.tags:Find(v)
+ end
+ end
+ return nil
+end
+
+function get_exceptions(vector)
+ for i,v in ipairs(restriction_exception_tags) do
+ vector:Add(v)
+ end
+end
+
+local function parse_maxspeed(source)
+ if not source then
+ return 0
+ end
+ local n = tonumber(source:match("%d*"))
+ if n then
+ if string.match(source, "mph") or string.match(source, "mp/h") then
+ n = (n*1609)/1000;
+ end
+ else
+ -- parse maxspeed like FR:urban
+ source = string.lower(source)
+ n = maxspeed_table[source]
+ if not n then
+ local highway_type = string.match(source, "%a%a:(%a+)")
+ n = maxspeed_table_default[highway_type]
+ if not n then
+ n = 0
+ end
+ end
+ end
+ return n
+end
+
+-- function turn_function (angle)
+-- -- print ("called at angle " .. angle )
+-- local index = math.abs(math.floor(angle/10+0.5))+1 -- +1 'coz LUA starts as idx 1
+-- local penalty = turn_cost_table[index]
+-- -- print ("index: " .. index .. ", bias: " .. penalty )
+-- return penalty
+-- end
+
+function node_function (node)
+ local access = find_access_tag(node, access_tags_hierachy)
+
+ --flag node if it carries a traffic light
+ if node.tags:Holds("highway") then
+ if node.tags:Find("highway") == "traffic_signals" then
+ node.traffic_light = true;
+ end
+ end
+
+ -- parse access and barrier tags
+ if access and access ~= "" then
+ if access_tag_blacklist[access] then
+ node.bollard = true
+ end
+ elseif node.tags:Holds("barrier") then
+ local barrier = node.tags:Find("barrier")
+ if barrier_whitelist[barrier] then
+ return
+ else
+ node.bollard = true
+ end
+ end
+end
+
+function way_function (way)
+
+ local is_highway = way.tags:Holds("highway")
+ local is_route = way.tags:Holds("route")
+
+ if not (is_highway or is_route) then
+ return
+ end
+
+ -- we dont route over areas
+ local is_area = way.tags:Holds("area")
+ if ignore_areas and is_area then
+ local area = way.tags:Find("area")
+ if "yes" == area then
+ return
+ end
+ end
+
+ -- check if oneway tag is unsupported
+ local oneway = way.tags:Find("oneway")
+ if "reversible" == oneway then
+ return
+ end
+
+ local is_impassable = way.tags:Holds("impassable")
+ if is_impassable then
+ local impassable = way.tags:Find("impassable")
+ if "yes" == impassable then
+ return
+ end
+ end
+
+ local is_status = way.tags:Holds("status")
+ if is_status then
+ local status = way.tags:Find("status")
+ if "impassable" == status then
+ return
+ end
+ end
+
+ -- Check if we are allowed to access the way
+ local access = find_access_tag(way, access_tags_hierachy)
+ if access_tag_blacklist[access] then
+ return
+ end
+
+ -- Second, parse the way according to these properties
+ local highway = way.tags:Find("highway")
+ local route = way.tags:Find("route")
+
+ -- Handling ferries and piers
+ local route_speed = speed_profile[route]
+ if(route_speed and route_speed > 0) then
+ highway = route;
+ local duration = way.tags:Find("duration")
+ if durationIsValid(duration) then
+ way.duration = max( parseDuration(duration), 1 );
+ end
+ way.forward_mode = mode_ferry
+ way.backward_mode = mode_ferry
+ way.forward_speed = route_speed
+ way.backward_speed = route_speed
+ end
+
+ -- leave early of this way is not accessible
+ if "" == highway then
+ return
+ end
+
+ if way.forward_speed == -1 then
+ local highway_speed = speed_profile[highway]
+ local max_speed = parse_maxspeed( way.tags:Find("maxspeed") )
+ -- Set the avg speed on the way if it is accessible by road class
+ if highway_speed then
+ if max_speed > highway_speed then
+ way.forward_speed = max_speed
+ way.backward_speed = max_speed
+ -- max_speed = math.huge
+ else
+ way.forward_speed = highway_speed
+ way.backward_speed = highway_speed
+ end
+ else
+ -- Set the avg speed on ways that are marked accessible
+ if access_tag_whitelist[access] then
+ way.forward_speed = speed_profile["default"]
+ way.backward_speed = speed_profile["default"]
+ end
+ end
+ if 0 == max_speed then
+ max_speed = math.huge
+ end
+ way.forward_speed = min(way.forward_speed, max_speed)
+ way.backward_speed = min(way.backward_speed, max_speed)
+ end
+
+ if -1 == way.forward_speed and -1 == way.backward_speed then
+ return
+ end
+
+ -- reduce speed on bad surfaces
+ local surface = way.tags:Find("surface")
+ local tracktype = way.tags:Find("tracktype")
+ local smoothness = way.tags:Find("smoothness")
+
+ if surface and surface_speeds[surface] then
+ way.forward_speed = math.min(surface_speeds[surface], way.forward_speed)
+ way.backward_speed = math.min(surface_speeds[surface], way.backward_speed)
+ end
+ if tracktype and tracktype_speeds[tracktype] then
+ way.forward_speed = math.min(tracktype_speeds[tracktype], way.forward_speed)
+ way.backward_speed = math.min(tracktype_speeds[tracktype], way.backward_speed)
+ end
+ if smoothness and smoothness_speeds[smoothness] then
+ way.forward_speed = math.min(smoothness_speeds[smoothness], way.forward_speed)
+ way.backward_speed = math.min(smoothness_speeds[smoothness], way.backward_speed)
+ end
+
+ -- parse the remaining tags
+ local name = way.tags:Find("name")
+ local ref = way.tags:Find("ref")
+ local junction = way.tags:Find("junction")
+ -- local barrier = way.tags:Find("barrier")
+ -- local cycleway = way.tags:Find("cycleway")
+ local service = way.tags:Find("service")
+
+ -- Set the name that will be used for instructions
+ if "" ~= ref then
+ way.name = ref
+ elseif "" ~= name then
+ way.name = name
+-- else
+ -- way.name = highway -- if no name exists, use way type
+ end
+
+ if "roundabout" == junction then
+ way.roundabout = true;
+ end
+
+ -- Set access restriction flag if access is allowed under certain restrictions only
+ if access ~= "" and access_tag_restricted[access] then
+ way.is_access_restricted = true
+ end
+
+ -- Set access restriction flag if service is allowed under certain restrictions only
+ if service ~= "" and service_tag_restricted[service] then
+ way.is_access_restricted = true
+ end
+
+ -- Set direction according to tags on way
+ if obey_oneway then
+ if oneway == "-1" then
+ way.forward_mode = 0
+ elseif oneway == "yes" or
+ oneway == "1" or
+ oneway == "true" or
+ junction == "roundabout" or
+ (highway == "motorway_link" and oneway ~="no") or
+ (highway == "motorway" and oneway ~= "no") then
+ way.backward_mode = 0
+ end
+ end
+
+ -- Override speed settings if explicit forward/backward maxspeeds are given
+ local maxspeed_forward = parse_maxspeed(way.tags:Find( "maxspeed:forward"))
+ local maxspeed_backward = parse_maxspeed(way.tags:Find( "maxspeed:backward"))
+ if maxspeed_forward > 0 then
+ if 0 ~= way.forward_mode and 0 ~= way.backward_mode then
+ way.backward_speed = way.forward_speed
+ end
+ way.forward_speed = maxspeed_forward
+ end
+ if maxspeed_backward > 0 then
+ way.backward_speed = maxspeed_backward
+ end
+
+ -- Override general direction settings of there is a specific one for our mode of travel
+ if ignore_in_grid[highway] then
+ way.ignore_in_grid = true
+ end
+
+ -- scale speeds to get better avg driving times
+ way.forward_speed = way.forward_speed * speed_reduction
+ if way.backward_speed > 0 then
+ way.backward_speed = way.backward_speed*speed_reduction
+ end
+end
+
+-- These are wrappers to parse vectors of nodes and ways and thus to speed up any tracing JIT
+function node_vector_function(vector)
+ for v in vector.nodes do
+ node_function(v)
+ end
+end
diff --git a/3party/osrm/osrm-backend/profiles/bicycle.lua b/3party/osrm/osrm-backend/profiles/bicycle.lua
index 3efa3d025d..13bfd280db 100644
--- a/3party/osrm/osrm-backend/profiles/bicycle.lua
+++ b/3party/osrm/osrm-backend/profiles/bicycle.lua
@@ -1,4 +1,5 @@
require("lib/access")
+require("lib/maxspeed")
-- Begin of globals
barrier_whitelist = { [""] = true, ["cycle_barrier"] = true, ["bollard"] = true, ["entrance"] = true, ["cattle_grid"] = true, ["border_control"] = true, ["toll_booth"] = true, ["sally_port"] = true, ["gate"] = true, ["no"] = true }
@@ -94,7 +95,13 @@ u_turn_penalty = 20
use_turn_restrictions = false
turn_penalty = 60
turn_bias = 1.4
--- End of globals
+
+
+--modes
+mode_normal = 1
+mode_pushing = 2
+mode_ferry = 3
+mode_train = 4
local function parse_maxspeed(source)
@@ -161,18 +168,18 @@ function way_function (way)
(not man_made or man_made=='') and
(not public_transport or public_transport=='')
then
- return 0
+ return
end
-- don't route on ways or railways that are still under construction
if highway=='construction' or railway=='construction' then
- return 0
+ return
end
-- access
local access = Access.find_access_tag(way, access_tags_hierachy)
if access_tag_blacklist[access] then
- return 0
+ return
end
-- other tags
@@ -193,6 +200,7 @@ function way_function (way)
local area = way.tags:Find("area")
local foot = way.tags:Find("foot")
local surface = way.tags:Find("surface")
+ local bicycle = way.tags:Find("bicycle")
-- name
if "" ~= ref and "" ~= name then
@@ -215,126 +223,152 @@ function way_function (way)
-- speed
if route_speeds[route] then
-- ferries (doesn't cover routes tagged using relations)
- way.direction = Way.bidirectional
+ way.forward_mode = mode_ferry
+ way.backward_mode = mode_ferry
way.ignore_in_grid = true
if durationIsValid(duration) then
way.duration = math.max( 1, parseDuration(duration) )
else
- way.speed = route_speeds[route]
+ way.forward_speed = route_speeds[route]
+ way.backward_speed = route_speeds[route]
end
elseif railway and platform_speeds[railway] then
-- railway platforms (old tagging scheme)
- way.speed = platform_speeds[railway]
+ way.forward_speed = platform_speeds[railway]
+ way.backward_speed = platform_speeds[railway]
elseif platform_speeds[public_transport] then
-- public_transport platforms (new tagging platform)
- way.speed = platform_speeds[public_transport]
+ way.forward_speed = platform_speeds[public_transport]
+ way.backward_speed = platform_speeds[public_transport]
elseif railway and railway_speeds[railway] then
+ way.forward_mode = mode_train
+ way.backward_mode = mode_train
-- railways
if access and access_tag_whitelist[access] then
- way.speed = railway_speeds[railway]
- way.direction = Way.bidirectional
+ way.forward_speed = railway_speeds[railway]
+ way.backward_speed = railway_speeds[railway]
end
elseif amenity and amenity_speeds[amenity] then
-- parking areas
- way.speed = amenity_speeds[amenity]
+ way.forward_speed = amenity_speeds[amenity]
+ way.backward_speed = amenity_speeds[amenity]
elseif bicycle_speeds[highway] then
-- regular ways
- way.speed = bicycle_speeds[highway]
+ way.forward_speed = bicycle_speeds[highway]
+ way.backward_speed = bicycle_speeds[highway]
elseif access and access_tag_whitelist[access] then
-- unknown way, but valid access tag
- way.speed = default_speed
+ way.forward_speed = default_speed
+ way.backward_speed = default_speed
else
-- biking not allowed, maybe we can push our bike?
-- essentially requires pedestrian profiling, for example foot=no mean we can't push a bike
- -- TODO: if we can push, the way should be marked as pedestrion mode, but there's no way to do it yet from lua..
- if foot ~= 'no' then
+ if foot ~= 'no' and junction ~= "roundabout" then
if pedestrian_speeds[highway] then
-- pedestrian-only ways and areas
- way.speed = pedestrian_speeds[highway]
+ way.forward_speed = pedestrian_speeds[highway]
+ way.backward_speed = pedestrian_speeds[highway]
+ way.forward_mode = mode_pushing
+ way.backward_mode = mode_pushing
elseif man_made and man_made_speeds[man_made] then
-- man made structures
- way.speed = man_made_speeds[man_made]
+ way.forward_speed = man_made_speeds[man_made]
+ way.backward_speed = man_made_speeds[man_made]
+ way.forward_mode = mode_pushing
+ way.backward_mode = mode_pushing
elseif foot == 'yes' then
- way.speed = walking_speed
+ way.forward_speed = walking_speed
+ way.backward_speed = walking_speed
+ way.forward_mode = mode_pushing
+ way.backward_mode = mode_pushing
+ elseif foot_forward == 'yes' then
+ way.forward_speed = walking_speed
+ way.forward_mode = mode_pushing
+ way.backward_mode = 0
+ elseif foot_backward == 'yes' then
+ way.forward_speed = walking_speed
+ way.forward_mode = 0
+ way.backward_mode = mode_pushing
end
end
end
-- direction
- way.direction = Way.bidirectional
local impliedOneway = false
if junction == "roundabout" or highway == "motorway_link" or highway == "motorway" then
- way.direction = Way.oneway
impliedOneway = true
end
if onewayClass == "yes" or onewayClass == "1" or onewayClass == "true" then
- way.direction = Way.oneway
+ way.backward_mode = 0
elseif onewayClass == "no" or onewayClass == "0" or onewayClass == "false" then
- way.direction = Way.bidirectional
+ -- prevent implied oneway
elseif onewayClass == "-1" then
- way.direction = Way.opposite
+ way.forward_mode = 0
elseif oneway == "no" or oneway == "0" or oneway == "false" then
- way.direction = Way.bidirectional
+ -- prevent implied oneway
elseif cycleway and string.find(cycleway, "opposite") == 1 then
if impliedOneway then
- way.direction = Way.opposite
- else
- way.direction = Way.bidirectional
+ way.forward_mode = 0
+ way.backward_mode = mode_normal
+ way.backward_speed = bicycle_speeds["cycleway"]
end
elseif cycleway_left and cycleway_tags[cycleway_left] and cycleway_right and cycleway_tags[cycleway_right] then
- way.direction = Way.bidirectional
+ -- prevent implied
elseif cycleway_left and cycleway_tags[cycleway_left] then
if impliedOneway then
- way.direction = Way.opposite
- else
- way.direction = Way.bidirectional
+ way.forward_mode = 0
+ way.backward_mode = mode_normal
+ way.backward_speed = bicycle_speeds["cycleway"]
end
elseif cycleway_right and cycleway_tags[cycleway_right] then
if impliedOneway then
- way.direction = Way.oneway
- else
- way.direction = Way.bidirectional
+ way.forward_mode = mode_normal
+ way.backward_speed = bicycle_speeds["cycleway"]
+ way.backward_mode = 0
end
elseif oneway == "-1" then
- way.direction = Way.opposite
- elseif oneway == "yes" or oneway == "1" or oneway == "true" then
- way.direction = Way.oneway
+ way.forward_mode = 0
+ elseif oneway == "yes" or oneway == "1" or oneway == "true" or impliedOneway then
+ way.backward_mode = 0
end
-- pushing bikes
if bicycle_speeds[highway] or pedestrian_speeds[highway] then
- if foot ~= 'no' then
- if junction ~= "roundabout" then
- if way.direction == Way.oneway then
- way.backward_speed = walking_speed
- elseif way.direction == Way.opposite then
- way.backward_speed = walking_speed
- way.speed = way.speed
- end
+ if foot ~= "no" and junction ~= "roundabout" then
+ if way.backward_mode == 0 then
+ way.backward_speed = walking_speed
+ way.backward_mode = mode_pushing
+ elseif way.forward_mode == 0 then
+ way.forward_speed = walking_speed
+ way.forward_mode = mode_pushing
end
end
- if way.backward_speed == way.speed then
- -- TODO: no way yet to mark a way as pedestrian mode if forward/backward speeds are equal
- way.direction = Way.bidirectional
- end
end
-- cycleways
if cycleway and cycleway_tags[cycleway] then
- way.speed = bicycle_speeds["cycleway"]
+ way.forward_speed = bicycle_speeds["cycleway"]
elseif cycleway_left and cycleway_tags[cycleway_left] then
- way.speed = bicycle_speeds["cycleway"]
+ way.forward_speed = bicycle_speeds["cycleway"]
elseif cycleway_right and cycleway_tags[cycleway_right] then
- way.speed = bicycle_speeds["cycleway"]
+ way.forward_speed = bicycle_speeds["cycleway"]
+ end
+
+ -- dismount
+ if bicycle == "dismount" then
+ way.forward_mode = mode_pushing
+ way.backward_mode = mode_pushing
+ way.forward_speed = walking_speed
+ way.backward_speed = walking_speed
end
-- surfaces
if surface then
surface_speed = surface_speeds[surface]
if surface_speed then
- if way.speed > 0 then
- way.speed = surface_speed
+ if way.forward_speed > 0 then
+ way.forward_speed = surface_speed
end
if way.backward_speed > 0 then
way.backward_speed = surface_speed
@@ -343,26 +377,7 @@ function way_function (way)
end
-- maxspeed
- -- TODO: maxspeed of backward direction
- if take_minimum_of_speeds then
- if maxspeed and maxspeed>0 then
- way.speed = math.min(way.speed, maxspeed)
- end
- end
-
- -- Override speed settings if explicit forward/backward maxspeeds are given
- if way.speed > 0 and maxspeed_forward ~= nil and maxspeed_forward > 0 then
- if Way.bidirectional == way.direction then
- way.backward_speed = way.speed
- end
- way.speed = maxspeed_forward
- end
- if maxspeed_backward ~= nil and maxspeed_backward > 0 then
- way.backward_speed = maxspeed_backward
- end
-
- way.type = 1
- return 1
+ MaxSpeed.limit( way, maxspeed, maxspeed_forward, maxspeed_backward )
end
function turn_function (angle)
diff --git a/3party/osrm/osrm-backend/profiles/car.lua b/3party/osrm/osrm-backend/profiles/car.lua
index 8f8d1bcdde..ad58cd86ef 100644
--- a/3party/osrm/osrm-backend/profiles/car.lua
+++ b/3party/osrm/osrm-backend/profiles/car.lua
@@ -1,7 +1,7 @@
-- Begin of globals
--require("lib/access") --function temporarily inlined
-barrier_whitelist = { ["cattle_grid"] = true, ["border_control"] = true, ["toll_booth"] = true, ["sally_port"] = true, ["gate"] = true, ["no"] = true, ["entrance"] = true }
+barrier_whitelist = { ["cattle_grid"] = true, ["border_control"] = true, ["checkpoint"] = true, ["toll_booth"] = true, ["sally_port"] = true, ["gate"] = true, ["no"] = true, ["entrance"] = true }
access_tag_whitelist = { ["yes"] = true, ["motorcar"] = true, ["motor_vehicle"] = true, ["vehicle"] = true, ["permissive"] = true, ["designated"] = true }
access_tag_blacklist = { ["no"] = true, ["private"] = true, ["agricultural"] = true, ["forestry"] = true, ["emergency"] = true }
access_tag_restricted = { ["destination"] = true, ["delivery"] = true }
@@ -13,15 +13,15 @@ restriction_exception_tags = { "motorcar", "motor_vehicle", "vehicle" }
speed_profile = {
["motorway"] = 90,
- ["motorway_link"] = 75,
+ ["motorway_link"] = 45,
["trunk"] = 85,
- ["trunk_link"] = 70,
+ ["trunk_link"] = 40,
["primary"] = 65,
- ["primary_link"] = 60,
+ ["primary_link"] = 30,
["secondary"] = 55,
- ["secondary_link"] = 50,
+ ["secondary_link"] = 25,
["tertiary"] = 40,
- ["tertiary_link"] = 30,
+ ["tertiary_link"] = 20,
["unclassified"] = 25,
["residential"] = 25,
["living_street"] = 10,
@@ -32,9 +32,99 @@ speed_profile = {
["default"] = 10
}
+
+-- surface/trackype/smoothness
+-- values were estimated from looking at the photos at the relevant wiki pages
+
+-- max speed for surfaces
+surface_speeds = {
+ ["asphalt"] = nil, -- nil mean no limit. removing the line has the same effect
+ ["concrete"] = nil,
+ ["concrete:plates"] = nil,
+ ["concrete:lanes"] = nil,
+ ["paved"] = nil,
+
+ ["cement"] = 80,
+ ["compacted"] = 80,
+ ["fine_gravel"] = 80,
+
+ ["paving_stones"] = 60,
+ ["metal"] = 60,
+ ["bricks"] = 60,
+
+ ["grass"] = 40,
+ ["wood"] = 40,
+ ["sett"] = 40,
+ ["grass_paver"] = 40,
+ ["gravel"] = 40,
+ ["unpaved"] = 40,
+ ["ground"] = 40,
+ ["dirt"] = 40,
+ ["pebblestone"] = 40,
+ ["tartan"] = 40,
+
+ ["cobblestone"] = 30,
+ ["clay"] = 30,
+
+ ["earth"] = 20,
+ ["stone"] = 20,
+ ["rocky"] = 20,
+ ["sand"] = 20,
+
+ ["mud"] = 10
+}
+
+-- max speed for tracktypes
+tracktype_speeds = {
+ ["grade1"] = 60,
+ ["grade2"] = 40,
+ ["grade3"] = 30,
+ ["grade4"] = 25,
+ ["grade5"] = 20
+}
+
+-- max speed for smoothnesses
+smoothness_speeds = {
+ ["intermediate"] = 80,
+ ["bad"] = 40,
+ ["very_bad"] = 20,
+ ["horrible"] = 10,
+ ["very_horrible"] = 5,
+ ["impassable"] = 0
+}
+
+-- http://wiki.openstreetmap.org/wiki/Speed_limits
+maxspeed_table_default = {
+ ["urban"] = 50,
+ ["rural"] = 90,
+ ["trunk"] = 110,
+ ["motorway"] = 130
+}
+
+-- List only exceptions
+maxspeed_table = {
+ ["de:living_street"] = 7,
+ ["ru:living_street"] = 20,
+ ["ru:urban"] = 60,
+ ["ua:urban"] = 60,
+ ["at:rural"] = 100,
+ ["de:rural"] = 100,
+ ["at:trunk"] = 100,
+ ["cz:trunk"] = 0,
+ ["ro:trunk"] = 100,
+ ["cz:motorway"] = 0,
+ ["de:motorway"] = 0,
+ ["ru:motorway"] = 110,
+ ["gb:nsl_single"] = (60*1609)/1000,
+ ["gb:nsl_dual"] = (70*1609)/1000,
+ ["gb:motorway"] = (70*1609)/1000,
+ ["uk:nsl_single"] = (60*1609)/1000,
+ ["uk:nsl_dual"] = (70*1609)/1000,
+ ["uk:motorway"] = (70*1609)/1000
+}
+
traffic_signal_penalty = 2
--- End of globals
local take_minimum_of_speeds = false
local obey_oneway = true
local obey_bollards = true
@@ -48,6 +138,11 @@ local max = math.max
local speed_reduction = 0.8
+--modes
+local mode_normal = 1
+local mode_ferry = 2
+
+
local function find_access_tag(source,access_tags_hierachy)
for i,v in ipairs(access_tags_hierachy) do
local has_tag = source.tags:Holds(v)
@@ -69,11 +164,21 @@ local function parse_maxspeed(source)
return 0
end
local n = tonumber(source:match("%d*"))
- if not n then
- n = 0
- end
- if string.match(source, "mph") or string.match(source, "mp/h") then
- n = (n*1609)/1000;
+ if n then
+ if string.match(source, "mph") or string.match(source, "mp/h") then
+ n = (n*1609)/1000;
+ end
+ else
+ -- parse maxspeed like FR:urban
+ source = string.lower(source)
+ n = maxspeed_table[source]
+ if not n then
+ local highway_type = string.match(source, "%a%a:(%a+)")
+ n = maxspeed_table_default[highway_type]
+ if not n then
+ n = 0
+ end
+ end
end
return n
end
@@ -169,8 +274,10 @@ function way_function (way)
if durationIsValid(duration) then
way.duration = max( parseDuration(duration), 1 );
end
- way.direction = Way.bidirectional
- way.speed = route_speed
+ way.forward_mode = mode_ferry
+ way.backward_mode = mode_ferry
+ way.forward_speed = route_speed
+ way.backward_speed = route_speed
end
-- leave early of this way is not accessible
@@ -178,33 +285,55 @@ function way_function (way)
return
end
- if way.speed == -1 then
+ if way.forward_speed == -1 then
local highway_speed = speed_profile[highway]
local max_speed = parse_maxspeed( way.tags:Find("maxspeed") )
-- Set the avg speed on the way if it is accessible by road class
if highway_speed then
if max_speed > highway_speed then
- way.speed = max_speed
+ way.forward_speed = max_speed
+ way.backward_speed = max_speed
-- max_speed = math.huge
else
- way.speed = highway_speed
+ way.forward_speed = highway_speed
+ way.backward_speed = highway_speed
end
else
-- Set the avg speed on ways that are marked accessible
if access_tag_whitelist[access] then
- way.speed = speed_profile["default"]
+ way.forward_speed = speed_profile["default"]
+ way.backward_speed = speed_profile["default"]
end
end
if 0 == max_speed then
max_speed = math.huge
end
- way.speed = min(way.speed, max_speed)
+ way.forward_speed = min(way.forward_speed, max_speed)
+ way.backward_speed = min(way.backward_speed, max_speed)
end
- if -1 == way.speed then
+ if -1 == way.forward_speed and -1 == way.backward_speed then
return
end
+ -- reduce speed on bad surfaces
+ local surface = way.tags:Find("surface")
+ local tracktype = way.tags:Find("tracktype")
+ local smoothness = way.tags:Find("smoothness")
+
+ if surface and surface_speeds[surface] then
+ way.forward_speed = math.min(surface_speeds[surface], way.forward_speed)
+ way.backward_speed = math.min(surface_speeds[surface], way.backward_speed)
+ end
+ if tracktype and tracktype_speeds[tracktype] then
+ way.forward_speed = math.min(tracktype_speeds[tracktype], way.forward_speed)
+ way.backward_speed = math.min(tracktype_speeds[tracktype], way.backward_speed)
+ end
+ if smoothness and smoothness_speeds[smoothness] then
+ way.forward_speed = math.min(smoothness_speeds[smoothness], way.forward_speed)
+ way.backward_speed = math.min(smoothness_speeds[smoothness], way.backward_speed)
+ end
+
-- parse the remaining tags
local name = way.tags:Find("name")
local ref = way.tags:Find("ref")
@@ -237,17 +366,16 @@ function way_function (way)
end
-- Set direction according to tags on way
- way.direction = Way.bidirectional
if obey_oneway then
if oneway == "-1" then
- way.direction = Way.opposite
+ way.forward_mode = 0
elseif oneway == "yes" or
oneway == "1" or
oneway == "true" or
junction == "roundabout" or
(highway == "motorway_link" and oneway ~="no") or
(highway == "motorway" and oneway ~= "no") then
- way.direction = Way.oneway
+ way.backward_mode = 0
end
end
@@ -255,10 +383,10 @@ function way_function (way)
local maxspeed_forward = parse_maxspeed(way.tags:Find( "maxspeed:forward"))
local maxspeed_backward = parse_maxspeed(way.tags:Find( "maxspeed:backward"))
if maxspeed_forward > 0 then
- if Way.bidirectional == way.direction then
- way.backward_speed = way.speed
+ if 0 ~= way.forward_mode and 0 ~= way.backward_mode then
+ way.backward_speed = way.forward_speed
end
- way.speed = maxspeed_forward
+ way.forward_speed = maxspeed_forward
end
if maxspeed_backward > 0 then
way.backward_speed = maxspeed_backward
@@ -268,14 +396,12 @@ function way_function (way)
if ignore_in_grid[highway] then
way.ignore_in_grid = true
end
- way.type = 1
-- scale speeds to get better avg driving times
- way.speed = way.speed * speed_reduction
- if maxspeed_backward > 0 then
+ way.forward_speed = way.forward_speed * speed_reduction
+ if way.backward_speed > 0 then
way.backward_speed = way.backward_speed*speed_reduction
end
- return
end
-- These are wrappers to parse vectors of nodes and ways and thus to speed up any tracing JIT
diff --git a/3party/osrm/osrm-backend/profiles/examples/postgis.lua b/3party/osrm/osrm-backend/profiles/examples/postgis.lua
index 89ecbc7958..b02a43d8a5 100644
--- a/3party/osrm/osrm-backend/profiles/examples/postgis.lua
+++ b/3party/osrm/osrm-backend/profiles/examples/postgis.lua
@@ -65,11 +65,11 @@ function way_function (way)
local cursor = assert( sql_con:execute(sql_query) ) -- execute querty
local row = cursor:fetch( {}, "a" ) -- fetch first (and only) row
- way.speed = 20.0 -- default speed
+ way.forward_speed = 20.0 -- default speed
if row then
local val = tonumber(row.val) -- read 'val' from row
if val > 10 then
- way.speed = way.speed / math.log10( val ) -- reduce speed by amount of industry close by
+ way.forward_speed = way.forward_speed / math.log10( val ) -- reduce speed by amount of industry close by
end
end
cursor:close() -- done with this query
diff --git a/3party/osrm/osrm-backend/profiles/foot.lua b/3party/osrm/osrm-backend/profiles/foot.lua
index 144a5f96c4..7c366bf119 100644
--- a/3party/osrm/osrm-backend/profiles/foot.lua
+++ b/3party/osrm/osrm-backend/profiles/foot.lua
@@ -63,6 +63,10 @@ traffic_signal_penalty = 2
u_turn_penalty = 2
use_turn_restrictions = false
+--modes
+local mode_normal = 1
+local mode_ferry = 2
+
function get_exceptions(vector)
for i,v in ipairs(restriction_exception_tags) do
vector:Add(v)
@@ -105,25 +109,25 @@ function way_function (way)
local railway = way.tags:Find("railway")
local amenity = way.tags:Find("amenity")
local public_transport = way.tags:Find("public_transport")
- if (not highway or highway == '') and
+ if (not highway or highway == '') and
(not route or route == '') and
(not railway or railway=='') and
(not amenity or amenity=='') and
(not man_made or man_made=='') and
- (not public_transport or public_transport=='')
- then
- return 0
+ (not public_transport or public_transport=='')
+ then
+ return
end
-- don't route on ways that are still under construction
if highway=='construction' then
- return 0
+ return
end
-- access
local access = Access.find_access_tag(way, access_tags_hierachy)
if access_tag_blacklist[access] then
- return 0
+ return
end
local name = way.tags:Find("name")
@@ -156,50 +160,52 @@ function way_function (way)
-- speed
if route_speeds[route] then
-- ferries (doesn't cover routes tagged using relations)
- way.direction = Way.bidirectional
way.ignore_in_grid = true
if durationIsValid(duration) then
way.duration = math.max( 1, parseDuration(duration) )
else
- way.speed = route_speeds[route]
+ way.forward_speed = route_speeds[route]
+ way.backward_speed = route_speeds[route]
end
+ way.forward_mode = mode_ferry
+ way.backward_mode = mode_ferry
elseif railway and platform_speeds[railway] then
-- railway platforms (old tagging scheme)
- way.speed = platform_speeds[railway]
+ way.forward_speed = platform_speeds[railway]
+ way.backward_speed = platform_speeds[railway]
elseif platform_speeds[public_transport] then
-- public_transport platforms (new tagging platform)
- way.speed = platform_speeds[public_transport]
+ way.forward_speed = platform_speeds[public_transport]
+ way.backward_speed = platform_speeds[public_transport]
elseif amenity and amenity_speeds[amenity] then
-- parking areas
- way.speed = amenity_speeds[amenity]
+ way.forward_speed = amenity_speeds[amenity]
+ way.backward_speed = amenity_speeds[amenity]
elseif speeds[highway] then
-- regular ways
- way.speed = speeds[highway]
+ way.forward_speed = speeds[highway]
+ way.backward_speed = speeds[highway]
elseif access and access_tag_whitelist[access] then
-- unknown way, but valid access tag
- way.speed = walking_speed
+ way.forward_speed = walking_speed
+ way.backward_speed = walking_speed
end
-- oneway
if onewayClass == "yes" or onewayClass == "1" or onewayClass == "true" then
- way.direction = Way.oneway
+ way.backward_mode = 0
elseif onewayClass == "no" or onewayClass == "0" or onewayClass == "false" then
- way.direction = Way.bidirectional
+ -- nothing to do
elseif onewayClass == "-1" then
- way.direction = Way.opposite
- else
- way.direction = Way.bidirectional
+ way.forward_mode = 0
end
-- surfaces
if surface then
surface_speed = surface_speeds[surface]
if surface_speed then
- way.speed = math.min(way.speed, surface_speed)
+ way.forward_speed = math.min(way.forward_speed, surface_speed)
way.backward_speed = math.min(way.backward_speed, surface_speed)
end
end
-
- way.type = 1
- return 1
end
diff --git a/3party/osrm/osrm-backend/profiles/lib/maxspeed.lua b/3party/osrm/osrm-backend/profiles/lib/maxspeed.lua
new file mode 100644
index 0000000000..aca344a796
--- /dev/null
+++ b/3party/osrm/osrm-backend/profiles/lib/maxspeed.lua
@@ -0,0 +1,17 @@
+local math = math
+
+module "MaxSpeed"
+
+function limit(way,max,maxf,maxb)
+ if maxf and maxf>0 then
+ way.forward_speed = math.min(way.forward_speed, maxf)
+ elseif max and max>0 then
+ way.forward_speed = math.min(way.forward_speed, max)
+ end
+
+ if maxb and maxb>0 then
+ way.backward_speed = math.min(way.backward_speed, maxb)
+ elseif max and max>0 then
+ way.backward_speed = math.min(way.backward_speed, max)
+ end
+end
diff --git a/3party/osrm/osrm-backend/profiles/testbot.lua b/3party/osrm/osrm-backend/profiles/testbot.lua
index 66d6599740..a0b06f56d2 100644
--- a/3party/osrm/osrm-backend/profiles/testbot.lua
+++ b/3party/osrm/osrm-backend/profiles/testbot.lua
@@ -6,10 +6,19 @@
-- Secondary road: 18km/h = 18000m/3600s = 100m/20s
-- Tertiary road: 12km/h = 12000m/3600s = 100m/30s
+-- modes:
+-- 1: normal
+-- 2: route
+-- 3: river downstream
+-- 4: river upstream
+-- 5: steps down
+-- 6: steps up
+
speed_profile = {
["primary"] = 36,
["secondary"] = 18,
["tertiary"] = 12,
+ ["steps"] = 6,
["default"] = 24
}
@@ -61,14 +70,21 @@ function way_function (way)
if route ~= nil and durationIsValid(duration) then
way.duration = math.max( 1, parseDuration(duration) )
+ way.forward_mode = 2
+ way.backward_mode = 2
else
local speed_forw = speed_profile[highway] or speed_profile['default']
local speed_back = speed_forw
if highway == "river" then
local temp_speed = speed_forw;
+ way.forward_mode = 3
+ way.backward_mode = 4
speed_forw = temp_speed*1.5
speed_back = temp_speed/1.5
+ elseif highway == "steps" then
+ way.forward_mode = 5
+ way.backward_mode = 6
end
if maxspeed_forward ~= nil and maxspeed_forward > 0 then
@@ -87,26 +103,19 @@ function way_function (way)
end
end
- way.speed = speed_forw
- if speed_back ~= way_forw then
- way.backward_speed = speed_back
- end
+ way.forward_speed = speed_forw
+ way.backward_speed = speed_back
end
if oneway == "no" or oneway == "0" or oneway == "false" then
- way.direction = Way.bidirectional
+ -- nothing to do
elseif oneway == "-1" then
- way.direction = Way.opposite
+ way.forward_mode = 0
elseif oneway == "yes" or oneway == "1" or oneway == "true" or junction == "roundabout" then
- way.direction = Way.oneway
- else
- way.direction = Way.bidirectional
+ way.backward_mode = 0
end
if junction == 'roundabout' then
way.roundabout = true
end
-
- way.type = 1
- return 1
end
diff --git a/3party/osrm/osrm-backend/routed.cpp b/3party/osrm/osrm-backend/routed.cpp
index adf2e2dbc9..a7ba54ab5f 100644
--- a/3party/osrm/osrm-backend/routed.cpp
+++ b/3party/osrm/osrm-backend/routed.cpp
@@ -26,10 +26,10 @@ SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
*/
#include "Library/OSRM.h"
-#include "Server/ServerFactory.h"
+#include "Server/Server.h"
#include "Util/GitDescription.h"
#include "Util/ProgramOptions.h"
-#include "Util/SimpleLogger.h"
+#include "Util/simple_logger.hpp"
#include "Util/FingerPrint.h"
#ifdef __linux__
@@ -101,27 +101,16 @@ int main(int argc, const char *argv[])
SimpleLogger().Write(logWARNING) << argv[0] << " could not be locked to RAM";
}
#endif
- SimpleLogger().Write() << "starting up engines, " << g_GIT_DESCRIPTION << ", "
- << "compiled at " << __DATE__ << ", " __TIME__;
+ SimpleLogger().Write() << "starting up engines, " << g_GIT_DESCRIPTION;
if (use_shared_memory)
{
SimpleLogger().Write(logDEBUG) << "Loading from shared memory";
}
- else
- {
- SimpleLogger().Write() << "HSGR file:\t" << server_paths["hsgrdata"];
- SimpleLogger().Write(logDEBUG) << "Nodes file:\t" << server_paths["nodesdata"];
- SimpleLogger().Write(logDEBUG) << "Edges file:\t" << server_paths["edgesdata"];
- SimpleLogger().Write(logDEBUG) << "Geometry file:\t" << server_paths["geometries"];
- SimpleLogger().Write(logDEBUG) << "RAM file:\t" << server_paths["ramindex"];
- SimpleLogger().Write(logDEBUG) << "Index file:\t" << server_paths["fileindex"];
- SimpleLogger().Write(logDEBUG) << "Names file:\t" << server_paths["namesdata"];
- SimpleLogger().Write(logDEBUG) << "Timestamp file:\t" << server_paths["timestamp"];
- SimpleLogger().Write(logDEBUG) << "Threads:\t" << requested_thread_num;
- SimpleLogger().Write(logDEBUG) << "IP address:\t" << ip_address;
- SimpleLogger().Write(logDEBUG) << "IP port:\t" << ip_port;
- }
+
+ SimpleLogger().Write(logDEBUG) << "Threads:\t" << requested_thread_num;
+ SimpleLogger().Write(logDEBUG) << "IP address:\t" << ip_address;
+ SimpleLogger().Write(logDEBUG) << "IP port:\t" << ip_port;
#ifndef _WIN32
int sig = 0;
sigset_t new_mask;
@@ -131,8 +120,8 @@ int main(int argc, const char *argv[])
#endif
OSRM osrm_lib(server_paths, use_shared_memory);
- Server *routing_server =
- ServerFactory::CreateServer(ip_address, ip_port, requested_thread_num);
+ auto routing_server =
+ Server::CreateServer(ip_address, ip_port, requested_thread_num);
routing_server->GetRequestHandlerPtr().RegisterRoutingMachine(&osrm_lib);
@@ -169,19 +158,19 @@ int main(int argc, const char *argv[])
auto status = future.wait_for(std::chrono::seconds(2));
- if (status != std::future_status::ready)
+ if (status == std::future_status::ready)
{
- SimpleLogger().Write(logWARNING) << "Didn't exit within 2 seconds. Hard abort!";
- server_task.reset(); // just kill it
+ server_thread.join();
}
else
{
- server_thread.join();
+ SimpleLogger().Write(logWARNING) << "Didn't exit within 2 seconds. Hard abort!";
+ server_task.reset(); // just kill it
}
}
SimpleLogger().Write() << "freeing objects";
- delete routing_server;
+ routing_server.reset();
SimpleLogger().Write() << "shutdown completed";
}
catch (const std::exception &e)
diff --git a/3party/osrm/osrm-backend/taginfo.json b/3party/osrm/osrm-backend/taginfo.json
new file mode 100644
index 0000000000..17a4f8f24e
--- /dev/null
+++ b/3party/osrm/osrm-backend/taginfo.json
@@ -0,0 +1,84 @@
+{
+ "data_format": 1,
+ "data_url": "https://raw.githubusercontent.com/Project-OSRM/osrm-backend/develop/taginfo.json",
+ "project": {
+ "name": "Open Source Routing Machine (car profile)",
+ "description": "High-performance routing engine for shortest paths in road networks.",
+ "project_url": "http://project-osrm.org",
+ "icon_url": "http://project-osrm.org/images/osrm_icon.png",
+ "contact_name": "Dennis Luxen",
+ "contact_email": "info@project-osrm.org"
+ },
+ "tags": [
+ {
+ "key": "highway",
+ "description": "Type of road.",
+ "object_types": [ "way" ]
+ },
+ {
+ "key": "service",
+ "value": "parking_aisle",
+ "object_types": [ "way" ]
+ },
+ {
+ "key": "oneway",
+ "object_types": [ "way" ]
+ },
+ {
+ "key": "area",
+ "value": "yes",
+ "object_types": [ "way" ],
+ "description": "Roads with area=yes are ignored by default."
+ },
+ {
+ "key": "impassable",
+ "description": "This is used by HOT."
+ },
+ {
+ "key": "status",
+ "description": "This is used by HOT."
+ },
+ {
+ "key": "access",
+ "object_types": [ "way" ]
+ },
+ {
+ "key": "barrier"
+ },
+ {
+ "key": "maxspeed",
+ "object_types": [ "way" ]
+ },
+ {
+ "key": "maxspeed:forward",
+ "object_types": [ "way" ]
+ },
+ {
+ "key": "maxspeed:backward",
+ "object_types": [ "way" ]
+ },
+ {
+ "key": "duration"
+ },
+ {
+ "key": "name",
+ "object_types": [ "way" ],
+ "description": "Name of road for navigation instructions."
+ },
+ {
+ "key": "ref",
+ "object_types": [ "way" ],
+ "description": "Ref of road for navigation instructions, overrides name."
+ },
+ {
+ "key": "junction",
+ "object_types": [ "way" ],
+ "value": "roundabout"
+ },
+ {
+ "key": "type",
+ "value": "restriction",
+ "object_types": [ "relation" ]
+ }
+ ]
+}
diff --git a/3party/osrm/osrm-backend/test/.stxxl b/3party/osrm/osrm-backend/test/.stxxl
new file mode 100644
index 0000000000..b1765e2c08
--- /dev/null
+++ b/3party/osrm/osrm-backend/test/.stxxl
@@ -0,0 +1 @@
+disk=/tmp/stxxl,10,syscall
diff --git a/3party/osrm/osrm-backend/typedefs.h b/3party/osrm/osrm-backend/typedefs.h
index ff1d2a1579..e45a6e8c90 100644
--- a/3party/osrm/osrm-backend/typedefs.h
+++ b/3party/osrm/osrm-backend/typedefs.h
@@ -35,16 +35,15 @@ SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
#ifndef M_PI
#define M_PI 3.14159265358979323846
#endif
-#define constexpr const static
#endif
-typedef unsigned int NodeID;
-typedef unsigned int EdgeID;
-typedef int EdgeWeight;
+using NodeID = unsigned int;
+using EdgeID = unsigned int;
+using EdgeWeight = int;
-constexpr NodeID SPECIAL_NODEID = std::numeric_limits<unsigned>::max();
-constexpr EdgeID SPECIAL_EDGEID = std::numeric_limits<unsigned>::max();
-constexpr unsigned INVALID_NAMEID = std::numeric_limits<unsigned>::max();
-constexpr EdgeWeight INVALID_EDGE_WEIGHT = std::numeric_limits<int>::max();
+static const NodeID SPECIAL_NODEID = std::numeric_limits<unsigned>::max();
+static const EdgeID SPECIAL_EDGEID = std::numeric_limits<unsigned>::max();
+static const unsigned INVALID_NAMEID = std::numeric_limits<unsigned>::max();
+static const EdgeWeight INVALID_EDGE_WEIGHT = std::numeric_limits<int>::max();
#endif /* TYPEDEFS_H */