Compare commits

...

89 Commits

Author SHA1 Message Date
6ab6564d42
fix arch on normal build
Some checks failed
Build and Publish Docker Image / publish (debian) (release) Failing after 21s
Build and Publish Docker Image / publish (alpine) (release) Failing after 3h14m36s
2025-02-15 14:29:51 -05:00
513966056b
remove 2 32bit unsupported arch
Some checks failed
Build and Publish Docker Image / publish (alpine) (release) Failing after 1h38m5s
Build and Publish Docker Image / publish (debian) (release) Failing after 22s
2025-02-15 12:28:08 -05:00
2c91c0c259
update image name
Some checks failed
Build and Publish Docker Image / publish (alpine) (release) Failing after 1m49s
Build and Publish Docker Image / publish (debian) (release) Failing after 21s
2025-02-15 12:21:44 -05:00
Matt Robinson
c59ad69d6a
Correct Docker FromAsCasing warning (#7064) 2025-02-10 19:22:09 +01:00
Alexander Farber
61464fc2bd
Fix no member named 'construct' in 'optional<type-parameter-0-0 &>' error in sol.hpp with Clang 19 (#7098) 2025-01-25 07:09:37 +00:00
Alexander Farber
6f235cca15
Use libtbb-dev/libtbb12 packages in Dockerfile-debian, sort packages alphabetically in both Dockerfiles (#7095)
* - Use libtbb-dev in builder stage and libtbb12 package in the runstage instead of building oneTBB v2021.12.0 from source code
- Remove wget package from builder stage, because it is not used
- Uppercase "FROM ... as" -> "FROM ... AS" to silence a "docker build" warning
- Sort packages alphabetically and put them on separate lines for easier comparison

* - Fix the warning "FromAsCasing: 'as' and 'FROM' keywords' casing do not match"
- Sort packages alphabetically and put them on separate lines for easier comparison

* Revert  -Wno-stringop-overflow

* Update the link to multi staged builds in the comment

* Update alpine:3.20.0 -> alpine:3.20.5
2025-01-12 16:28:56 +00:00
Siarhei Fedartsou
3614af7f64
Use std::string_view for key type in json::Object (#7062) 2024-11-03 18:23:23 +01:00
Siarhei Fedartsou
48e8382785
Remove unused bearing::get function (#7040)
* Remove unused bearing::get function

* Remove unused bearing::get function

* Remove unused bearing::get function

* Remove unused bearing::get function
2024-10-20 19:46:49 +02:00
Frédéric Rodrigo
becfd8a56d
Add optional support of cargo bike exclusion and width to bicyle profile (#7044) 2024-10-01 15:19:44 +03:00
Siarhei Fedartsou
4f1c62a768
Bump version of protozero to 1.7.1 (#6999) 2024-09-28 20:35:20 +02:00
Siarhei Fedartsou
09a716a9e5
Bump osmium to version 2.20.0 (#6997) 2024-09-28 20:35:05 +02:00
Siarhei Fedartsou
676f6d4704
Use std::popcount instead of __builtin_popcount (#7026) 2024-09-28 20:34:39 +02:00
Siarhei Fedartsou
f636dbfd44
Use std::countl_zero instead of __builtin_clzll (#7025) 2024-09-28 20:34:23 +02:00
Siarhei Fedartsou
5f67e715af
Add std::vector<...>::reserve in ContiguousInternalMemoryDataFacadeBase::GetOverridesThatStartAt (#7024) 2024-09-28 20:33:33 +02:00
Siarhei Fedartsou
203314b1aa
Remove unused middle_nodes_table vector (#7012) 2024-08-03 22:32:37 +02:00
Siarhei Fedartsou
e5e25a1aca
Configure self-hosted runner for benchmarks job (#6975) 2024-07-26 21:19:47 +02:00
Siarhei Fedartsou
84f12c7c6d
Add NodeJs bindings benchmarks (#7004) 2024-07-26 19:36:43 +02:00
Siarhei Fedartsou
7802f86bd6
Measure peak RAM in benchmarks (#6995) 2024-07-25 21:27:37 +02:00
Siarhei Fedartsou
43afec3b39
Move flatbuffers non-generated files back to include/engine/api/flatbuffers/ (#6996) 2024-07-13 13:43:56 +02:00
Dennis Luxen
2da7ca5338
Route pedestrians over highway=platform (#6993) 2024-07-12 20:12:19 +02:00
Dennis Luxen
8ae9abaa63
Fix parsing on feature files on other gherkin parser (#6992) 2024-07-12 17:35:44 +02:00
Siarhei Fedartsou
d3638ace59
Use thread_local instead of boost::thread_specific_ptr (#6991) 2024-07-11 23:53:22 +02:00
Siarhei Fedartsou
c2f877eb9d
Remove unused MapStorage and GenerationArrayStorage (#6990) 2024-07-11 23:10:14 +02:00
Siarhei Fedartsou
825132eec7
Bump flatbuffers to v24.3.25 version (#6968) 2024-07-10 20:44:36 +02:00
Dennis Luxen
7436835244
Remove corech options, redundant tests (#6989)
* Remove corech options, redundant tests

* Small fix
2024-07-10 16:28:07 +02:00
Siarhei Fedartsou
5e6fdda16b
Add NOTE: label to comment in stale.yml (#6987) 2024-07-09 21:27:46 +02:00
Siarhei Fedartsou
f5598efcff
Add .reserve(...) to assembleGeometry function (#6983) 2024-07-09 20:12:47 +02:00
Siarhei Fedartsou
ab771c6142
Do not trigger stale bot on each PR (#6986) 2024-07-09 19:58:03 +02:00
Siarhei Fedartsou
f1510b758d
Increase number of GitHub operations allowed in stale bot (#6985) 2024-07-09 19:32:03 +02:00
Siarhei Fedartsou
4930d2ef05
Use clang 18/17/16 instead of 15/14/13 (#6978) 2024-07-03 20:02:44 +02:00
Siarhei Fedartsou
57b792c768
Get rid of boost::optional leftovers (#6977) 2024-07-02 22:37:09 +02:00
Siarhei Fedartsou
d0ed29adb7
Use Link Time Optimisation whenever possible (#6967) 2024-06-30 21:07:49 +02:00
Siarhei Fedartsou
bdc6ed8a53
Use struct instead of tuple to define UnpackedPath (#6974) 2024-06-29 21:34:43 +02:00
Siarhei Fedartsou
93c0e1dab3
Micro performance optimisation in map matching (#6976) 2024-06-29 19:59:08 +02:00
Siarhei Fedartsou
cacb1b23f9
Fix calculation of best ops/sec in benchmarks (#6973) 2024-06-29 10:31:23 +02:00
Siarhei Fedartsou
0e17869e21
Re-use priority queue in StaticRTree (#6952) 2024-06-25 18:58:48 +02:00
Siarhei Fedartsou
5a48ce85b3
Use tmpfs for running benchmarks (#6966) 2024-06-25 17:49:41 +02:00
Siarhei Fedartsou
7d72dfebf7
Optimise encodePolyline function (#6940) 2024-06-22 20:04:32 +02:00
Siarhei Fedartsou
3d01d96036
Avoid reallocations in base64 encoding (#6951) 2024-06-22 08:50:18 +02:00
Siarhei Fedartsou
e8da3d9231
Calculate confidence interval for benchmark measurements (#6950) 2024-06-21 21:43:27 +02:00
Siarhei Fedartsou
d9ce9cf780
Get rid of unused Boost dependencies (#6960) 2024-06-21 19:04:34 +02:00
Siarhei Fedartsou
3285ce3b2f
Configure stale bot (#6963) 2024-06-21 08:51:56 +02:00
Dennis Luxen
f1eabc3ecc
Replace boost::filesystem with std (#6432) 2024-06-20 21:44:28 +02:00
knowname
c3f2a6cdb9
Add CI job for building Alpine-based Docker image (#6959) 2024-06-20 09:08:57 +02:00
knowname
97f676d5a3
add alpine dockerfile (#6958) 2024-06-19 14:15:23 +02:00
Siarhei Fedartsou
7ffc08be28
Bump versions of TBB, Expat and Lua installed via Conan (#6957) 2024-06-19 07:46:56 +02:00
Siarhei Fedartsou
feb9389436
Apply micro-optimisation for Table & Trip APIs (#6949) 2024-06-15 18:57:26 +02:00
Siarhei Fedartsou
a0eda3e7d7
Apply micro-optimisation for Route API (#6948) 2024-06-15 18:56:40 +02:00
Siarhei Fedartsou
7652f6ca6b
Apply micro-optimisation for Match API (#6945) 2024-06-14 16:04:19 +02:00
Siarhei Fedartsou
aa4e6b1cf3
Apply micro-optimisation for Nearest API (#6944) 2024-06-13 18:18:36 +02:00
Siarhei Fedartsou
de2f392960
Avoid copy of intersection in totalTurnAngle (#6938) 2024-06-10 22:40:37 +02:00
Siarhei Fedartsou
0188d2bccd
Use std::unordered_map::emplace instead of operator[] when producing JSONs (#6936) 2024-06-10 21:29:31 +02:00
Siarhei Fedartsou
054161fc7e
Avoid copy of vectors in MakeRoute function (#6939) 2024-06-10 20:06:43 +02:00
Siarhei Fedartsou
89435aa87f
Add new randomized benchmarks (#6929) 2024-06-09 17:03:24 +02:00
Siarhei Fedartsou
0cbb23abe1
Fix Windows CI: update conan.cmake and disable unit tests as temporary workaround for OOM issues (#6930) 2024-06-09 09:24:02 +02:00
Siarhei Fedartsou
a2915f78c5
Make e2e benchmarks more stable (#6927) 2024-06-08 22:27:12 +02:00
Siarhei Fedartsou
99cb17aed3
Fix bugprone-unused-return-value clang-tidy warning (#6934) 2024-06-08 14:33:24 +02:00
Siarhei Fedartsou
8fd8d0c24a
Fix performance-noexcept-move-constructor clang-tidy warning (#6933) 2024-06-08 08:33:54 +02:00
Siarhei Fedartsou
c57b0d28b0
Fix performance-noexcept-swap clang-tidy warning (#6931) 2024-06-07 16:18:10 +02:00
Siarhei Fedartsou
523ee762f0
Upgrade to clang-tidy 18 (#6919) 2024-06-06 22:20:38 +02:00
Siarhei Fedartsou
feeed75cf1
Add simple benchmarks for osrm-* tools (#6925) 2024-06-06 21:01:34 +02:00
Siarhei Fedartsou
c7ee1a59eb
Implement end to end benchmark (#6910) 2024-06-05 21:39:10 +02:00
Dennis Luxen
2725202771
Use Lemire's fast check whether to escape a JSON string (#6923) 2024-05-31 19:58:57 +02:00
Siarhei Fedartsou
42fafdcdfe
Use custom struct instead of std::pair in QueryHeap (#6921) 2024-05-31 07:06:58 +02:00
Siarhei Fedartsou
c8de759cd6
Use std::string_view::starts_with instead of boost::starts_with (#6918) 2024-05-30 21:55:25 +02:00
Siarhei Fedartsou
fb9d1cefcc
Get rid of boost::math::constants::* and M_PI in favor of std::numbers (#6916) 2024-05-30 19:40:56 +02:00
Dennis Luxen
a9b1bd88d3
Remove all core-CH left-overs (#6920)
* Remove all core-CH left-overs

* Fix formatting

* Update CHANGELOG.md
2024-05-30 17:13:44 +02:00
Siarhei Fedartsou
1ff096ac5c
Make constants in PackedVector constexpr (#6917) 2024-05-30 15:12:42 +02:00
Dennis Luxen
0ea757ed02
Remove unused header file (#6913) 2024-05-29 09:13:13 +02:00
Dennis Luxen
42cbca0ff0
Move Sol2 to canonical path (#6912) 2024-05-28 21:23:51 +02:00
Siarhei Fedartsou
c1ed73126d
Use std::variant instead of mapbox::util::variant (#6903) 2024-05-28 18:52:49 +02:00
Siarhei Fedartsou
01b1673c8a
Fix CCache usage in GitHub Actions (#6911) 2024-05-28 08:43:23 +02:00
Siarhei Fedartsou
d4dc297f75
Add CI job with GCC 14 (#6905) 2024-05-27 09:31:13 +02:00
Siarhei Fedartsou
9aaab7a53f
Enable readability-container-contains clang-tidy check (#6909) 2024-05-27 08:33:26 +02:00
Siarhei Fedartsou
1a6f4c44e7
Fix performance-type-promotion-in-math-fn clang-tidy warning (#6908) 2024-05-27 08:33:05 +02:00
Siarhei Fedartsou
163a2cfe3c
Bump rapidjson version (#6906) 2024-05-27 08:31:59 +02:00
Siarhei Fedartsou
667fd198ac
Use the latest Debian version in Dockerfile (#6904) 2024-05-27 08:30:44 +02:00
Siarhei Fedartsou
b7a990d0b5
Use C++20 (#6877) 2024-05-25 18:25:13 +02:00
Dennis Luxen
8306ed8ae3
Remove superflous iostreams include from header files (#6901) 2024-05-25 09:17:45 +02:00
Dennis Luxen
640df69aa1
Remove dead CRC32 processor code (#6900) 2024-05-24 22:43:03 +02:00
Siarhei Fedartsou
8b48e2ccc6
Bump mapbox/variant to version 1.2.0 (#6898) 2024-05-24 20:39:45 +02:00
Dennis Luxen
babdced52f
Replace GCC-specific attribute with [[nodiscard]] attribute (#6899) 2024-05-24 20:34:04 +02:00
Siarhei Fedartsou
21607e0cb2
Optimise getNetworkDistance in MLD even more (#6884) 2024-05-23 20:46:13 +02:00
Dennis Luxen
24646aada9
Remove outdated warnings (#6894) 2024-05-23 19:39:00 +02:00
Dennis Luxen
51b74a99aa
Avoid copy of std::function-based callback in path unpacking (#6895)
* Avoid copy of std::function-based callback in path unpacking

* Fix formatting

* Update CHANGELOG.md
2024-05-23 18:51:51 +02:00
Dennis Luxen
ed5003b502
Upgrade CI actions to latest versions (#6893)
* Upgrade actions

* Update remaining actions

* Update CHANGELOG.md

* Update CHANGELOG.md
2024-05-23 14:40:47 +02:00
Dennis Luxen
46dc660801
Replace boost::hash by std::hash (#6892)
* Replace boost::hash by std::hash

* Fix formatting

* Update CHANGELOG.md
2024-05-23 14:35:56 +02:00
Siarhei Fedartsou
73fb53cf36
Add benchmark for route (#6890) 2024-05-23 14:27:43 +02:00
Mugr Rex
efe6840d08
Replace boost::optional with std::optional (#6611) 2024-05-22 14:58:07 +02:00
1820 changed files with 70697 additions and 147610 deletions

View File

@ -13,6 +13,11 @@ Checks: >
-bugprone-forward-declaration-namespace, -bugprone-forward-declaration-namespace,
-bugprone-sizeof-expression, -bugprone-sizeof-expression,
-bugprone-throw-keyword-missing, -bugprone-throw-keyword-missing,
-bugprone-chained-comparison,
-bugprone-incorrect-enable-if,
-bugprone-switch-missing-default-case,
-bugprone-empty-catch,
-bugprone-unchecked-optional-access,
-clang-analyzer-*, -clang-analyzer-*,
-clang-diagnostic-deprecated-declarations, -clang-diagnostic-deprecated-declarations,
-clang-diagnostic-constant-conversion, -clang-diagnostic-constant-conversion,
@ -49,11 +54,13 @@ Checks: >
-misc-misplaced-const, -misc-misplaced-const,
-misc-definitions-in-headers, -misc-definitions-in-headers,
-misc-unused-parameters, -misc-unused-parameters,
-misc-include-cleaner,
modernize-concat-nested-namespaces, modernize-concat-nested-namespaces,
modernize-use-using, modernize-use-using,
performance-*, performance-*,
-performance-noexcept-move-constructor,
-performance-no-int-to-ptr, -performance-no-int-to-ptr,
-performance-enum-size,
-performance-avoid-endl,
readability-*, readability-*,
-readability-avoid-const-params-in-decls, -readability-avoid-const-params-in-decls,
-readability-braces-around-statements, -readability-braces-around-statements,
@ -82,6 +89,10 @@ Checks: >
-readability-make-member-function-const, -readability-make-member-function-const,
-readability-redundant-string-init, -readability-redundant-string-init,
-readability-non-const-parameter, -readability-non-const-parameter,
-readability-redundant-inline-specifier,
-readability-avoid-nested-conditional-operator,
-readability-avoid-return-with-void-value,
-readability-redundant-casting,
-readability-static-accessed-through-instance -readability-static-accessed-through-instance
WarningsAsErrors: '*' WarningsAsErrors: '*'

View File

@ -0,0 +1,65 @@
name: Build and Publish Docker Image
on:
release:
types: [published, prereleased]
env:
IMAGE_NAME: openharbor/osrm-backend
jobs:
publish:
strategy:
matrix:
docker-base-image: ["debian", "alpine"]
runs-on: ubuntu-latest
steps:
- name: Check out the repo
uses: actions/checkout@v3
- name: Set up QEMU
uses: docker/setup-qemu-action@v2
- name: Set up Docker Buildx
uses: docker/setup-buildx-action@v2
- name: Docker meta
id: meta
uses: docker/metadata-action@v4
with:
images: ${{ env.IMAGE_NAME }}
- name: Docker meta - debug
id: metadebug
uses: docker/metadata-action@v4
with:
images: ${{ env.IMAGE_NAME }}
flavor: |
latest=true
suffix=-debug,onlatest=true
- name: Log in to DockerHub
uses: docker/login-action@v2
with:
username: ${{ secrets.DOCKERHUB_USERNAME }}
password: ${{ secrets.DOCKERHUB_ACCESS_TOKEN }}
- name: Build and push debug image
uses: docker/build-push-action@v4
with:
push: true
platforms: linux/amd64,linux/arm64,linux/ppc64le,linux/riscv64
file: ./docker/Dockerfile-${{ matrix.docker-base-image }}
tags: ${{ steps.metadebug.outputs.tags }}
build-args: |
DOCKER_TAG=${{ join(steps.metadebug.outputs.tags) }}-${{ matrix.docker-base-image }}
- name: Build and push normal image
uses: docker/build-push-action@v4
with:
push: true
platforms: linux/amd64,linux/arm64,linux/ppc64le,linux/riscv64
file: ./docker/Dockerfile-${{ matrix.docker-base-image }}
tags: ${{ steps.meta.outputs.tags }}
build-args: |
DOCKER_TAG=${{ join(steps.meta.outputs.tags) }}-${{ matrix.docker-base-image }}

View File

@ -6,6 +6,9 @@ on:
jobs: jobs:
publish: publish:
strategy:
matrix:
docker-base-image: ["debian", "alpine"]
runs-on: ubuntu-latest runs-on: ubuntu-latest
steps: steps:
- name: Check out the repo - name: Check out the repo
@ -53,10 +56,10 @@ jobs:
with: with:
push: true push: true
platforms: linux/amd64,linux/arm64 platforms: linux/amd64,linux/arm64
file: ./docker/Dockerfile file: ./docker/Dockerfile-${{ matrix.docker-base-image }}
tags: ${{ steps.metadebug.outputs.tags }} tags: ${{ steps.metadebug.outputs.tags }}
build-args: | build-args: |
DOCKER_TAG=${{ join(steps.metadebug.outputs.tags ) }} DOCKER_TAG=${{ join(steps.metadebug.outputs.tags ) }}-${{ matrix.docker-base-image }}
- name: Build container image - assertions - name: Build container image - assertions
@ -64,10 +67,10 @@ jobs:
with: with:
push: true push: true
platforms: linux/amd64,linux/arm64 platforms: linux/amd64,linux/arm64
file: ./docker/Dockerfile file: ./docker/Dockerfile-${{ matrix.docker-base-image }}
tags: ${{ steps.metaassertions.outputs.tags }} tags: ${{ steps.metaassertions.outputs.tags }}
build-args: | build-args: |
DOCKER_TAG=${{ join(steps.metaassertions.outputs.tags ) }} DOCKER_TAG=${{ join(steps.metaassertions.outputs.tags ) }}-${{ matrix.docker-base-image }}
# build and publish "normal" image as last to get it listed on top # build and publish "normal" image as last to get it listed on top
- name: Build container image - normal - name: Build container image - normal
@ -75,10 +78,7 @@ jobs:
with: with:
push: true push: true
platforms: linux/amd64,linux/arm64 platforms: linux/amd64,linux/arm64
file: ./docker/Dockerfile file: ./docker/Dockerfile-${{ matrix.docker-base-image }}
tags: ${{ steps.meta.outputs.tags }} tags: ${{ steps.meta.outputs.tags }}
build-args: | build-args: |
DOCKER_TAG=${{ join(steps.meta.outputs.tags ) }} DOCKER_TAG=${{ join(steps.meta.outputs.tags ) }}-${{ matrix.docker-base-image }}

View File

@ -15,7 +15,6 @@ env:
CCACHE_TEMPDIR: /tmp/.ccache-temp CCACHE_TEMPDIR: /tmp/.ccache-temp
CCACHE_COMPRESS: 1 CCACHE_COMPRESS: 1
CASHER_TIME_OUT: 599 # one second less than 10m to avoid 10m timeout error: https://github.com/Project-OSRM/osrm-backend/issues/2742 CASHER_TIME_OUT: 599 # one second less than 10m to avoid 10m timeout error: https://github.com/Project-OSRM/osrm-backend/issues/2742
CCACHE_VERSION: 3.3.1
CMAKE_VERSION: 3.21.2 CMAKE_VERSION: 3.21.2
ENABLE_NODE_BINDINGS: "ON" ENABLE_NODE_BINDINGS: "ON"
@ -31,11 +30,11 @@ jobs:
env: env:
BUILD_TYPE: Release BUILD_TYPE: Release
steps: steps:
- uses: actions/checkout@v3 - uses: actions/checkout@v4
- run: pip install "conan<2.0.0" - run: pip install "conan<2.0.0"
- run: conan --version - run: conan --version
- run: cmake --version - run: cmake --version
- uses: actions/setup-node@v3 - uses: actions/setup-node@v4
with: with:
node-version: 18 node-version: 18
- run: node --version - run: node --version
@ -47,15 +46,32 @@ jobs:
echo PUBLISH=$([[ "${GITHUB_REF:-}" == "refs/tags/v${PACKAGE_JSON_VERSION}" ]] && echo "On" || echo "Off") >> $GITHUB_ENV echo PUBLISH=$([[ "${GITHUB_REF:-}" == "refs/tags/v${PACKAGE_JSON_VERSION}" ]] && echo "On" || echo "Off") >> $GITHUB_ENV
- run: npm install --ignore-scripts - run: npm install --ignore-scripts
- run: npm link --ignore-scripts - run: npm link --ignore-scripts
- uses: microsoft/setup-msbuild@v1.1
- name: Build - name: Build
run: |
.\scripts\ci\windows-build.bat
- name: Run node tests
shell: bash shell: bash
run: | run: |
./lib/binding/osrm-datastore.exe test/data/ch/monaco.osrm mkdir build
node test/nodejs/index.js cd build
cmake -DCMAKE_BUILD_TYPE=Release -DENABLE_CONAN=ON -DENABLE_NODE_BINDINGS=ON ..
cmake --build . --config Release
# TODO: MSVC goes out of memory when building our tests
# - name: Run tests
# shell: bash
# run: |
# cd build
# cmake --build . --config Release --target tests
# # TODO: run tests
# - name: Run node tests
# shell: bash
# run: |
# ./lib/binding/osrm-extract.exe -p profiles/car.lua test/data/monaco.osm.pbf
# mkdir -p test/data/ch
# cp test/data/monaco.osrm* test/data/ch/
# ./lib/binding/osrm-contract.exe test/data/ch/monaco.osrm
# ./lib/binding/osrm-datastore.exe test/data/ch/monaco.osrm
# node test/nodejs/index.js
- name: Build Node package - name: Build Node package
shell: bash shell: bash
run: ./scripts/ci/node_package.sh run: ./scripts/ci/node_package.sh
@ -76,13 +92,13 @@ jobs:
format-taginfo-docs: format-taginfo-docs:
runs-on: ubuntu-22.04 runs-on: ubuntu-22.04
steps: steps:
- uses: actions/checkout@v3 - uses: actions/checkout@v4
- name: Use Node.js - name: Use Node.js
uses: actions/setup-node@v3 uses: actions/setup-node@v4
with: with:
node-version: 18 node-version: 18
- name: Enable Node.js cache - name: Enable Node.js cache
uses: actions/cache@v3 uses: actions/cache@v4
with: with:
path: ~/.npm path: ~/.npm
key: ${{ runner.os }}-node-${{ hashFiles('**/package-lock.json') }} key: ${{ runner.os }}-node-${{ hashFiles('**/package-lock.json') }}
@ -100,15 +116,18 @@ jobs:
npm run docs && ./scripts/error_on_dirty.sh npm run docs && ./scripts/error_on_dirty.sh
npm audit --production npm audit --production
docker-image: docker-image-matrix:
strategy:
matrix:
docker-base-image: ["debian", "alpine"]
needs: format-taginfo-docs needs: format-taginfo-docs
runs-on: ubuntu-22.04 runs-on: ubuntu-22.04
continue-on-error: false continue-on-error: false
steps: steps:
- name: Check out the repo - name: Check out the repo
uses: actions/checkout@v3 uses: actions/checkout@v4
- name: Enable osm.pbf cache - name: Enable osm.pbf cache
uses: actions/cache@v3 uses: actions/cache@v4
with: with:
path: berlin-latest.osm.pbf path: berlin-latest.osm.pbf
key: v1-berlin-osm-pbf key: v1-berlin-osm-pbf
@ -116,7 +135,7 @@ jobs:
v1-berlin-osm-pbf v1-berlin-osm-pbf
- name: Docker build - name: Docker build
run: | run: |
docker build -t osrm-backend-local -f docker/Dockerfile . docker build -t osrm-backend-local -f docker/Dockerfile-${{ matrix.docker-base-image }} .
- name: Test Docker image - name: Test Docker image
run: | run: |
if [ ! -f "${PWD}/berlin-latest.osm.pbf" ]; then if [ ! -f "${PWD}/berlin-latest.osm.pbf" ]; then
@ -133,7 +152,6 @@ jobs:
>&2 echo "No berlin-latest.geojson found" >&2 echo "No berlin-latest.geojson found"
exit 1 exit 1
fi fi
# removing `.osrm.nbg` to check that whole pipeline works without it # removing `.osrm.nbg` to check that whole pipeline works without it
rm -rf "${PWD}/berlin-latest.osrm.nbg" rm -rf "${PWD}/berlin-latest.osrm.nbg"
@ -159,91 +177,108 @@ jobs:
CXXCOMPILER: g++-13 CXXCOMPILER: g++-13
ENABLE_COVERAGE: ON ENABLE_COVERAGE: ON
- name: clang-15-debug-asan-ubsan - name: clang-18-debug-asan-ubsan
continue-on-error: false continue-on-error: false
node: 20 node: 20
runs-on: ubuntu-22.04 runs-on: ubuntu-24.04
BUILD_TOOLS: ON BUILD_TOOLS: ON
BUILD_TYPE: Debug BUILD_TYPE: Debug
CCOMPILER: clang-15 CCOMPILER: clang-18
CUCUMBER_TIMEOUT: 20000 CUCUMBER_TIMEOUT: 20000
CXXCOMPILER: clang++-15 CXXCOMPILER: clang++-18
ENABLE_SANITIZER: ON ENABLE_SANITIZER: ON
TARGET_ARCH: x86_64-asan-ubsan TARGET_ARCH: x86_64-asan-ubsan
OSRM_CONNECTION_RETRIES: 10 OSRM_CONNECTION_RETRIES: 10
OSRM_CONNECTION_EXP_BACKOFF_COEF: 1.5 OSRM_CONNECTION_EXP_BACKOFF_COEF: 1.5
- name: clang-15-release - name: clang-18-release
continue-on-error: false continue-on-error: false
node: 18 node: 18
runs-on: ubuntu-22.04 runs-on: ubuntu-24.04
BUILD_TOOLS: ON BUILD_TOOLS: ON
BUILD_TYPE: Release BUILD_TYPE: Release
CCOMPILER: clang-15 CCOMPILER: clang-18
CXXCOMPILER: clang++-15 CXXCOMPILER: clang++-18
CUCUMBER_TIMEOUT: 60000 CUCUMBER_TIMEOUT: 60000
ENABLE_LTO: OFF
- name: clang-15-debug - name: clang-18-debug
continue-on-error: false continue-on-error: false
node: 18 node: 18
runs-on: ubuntu-22.04 runs-on: ubuntu-24.04
BUILD_TOOLS: ON BUILD_TOOLS: ON
BUILD_TYPE: Debug BUILD_TYPE: Debug
CCOMPILER: clang-15 CCOMPILER: clang-18
CXXCOMPILER: clang++-15 CXXCOMPILER: clang++-18
CUCUMBER_TIMEOUT: 60000 CUCUMBER_TIMEOUT: 60000
ENABLE_LTO: OFF
- name: clang-15-debug-clang-tidy - name: clang-18-debug-clang-tidy
continue-on-error: false continue-on-error: false
node: 18 node: 18
runs-on: ubuntu-22.04 runs-on: ubuntu-24.04
BUILD_TOOLS: ON BUILD_TOOLS: ON
BUILD_TYPE: Debug BUILD_TYPE: Debug
CCOMPILER: clang-15 CCOMPILER: clang-18
CXXCOMPILER: clang++-15 CXXCOMPILER: clang++-18
CUCUMBER_TIMEOUT: 60000 CUCUMBER_TIMEOUT: 60000
ENABLE_CLANG_TIDY: ON ENABLE_CLANG_TIDY: ON
- name: clang-14-release
continue-on-error: false
node: 18
runs-on: ubuntu-22.04
BUILD_TOOLS: ON
BUILD_TYPE: Release
CCOMPILER: clang-14
CXXCOMPILER: clang++-14
CUCUMBER_TIMEOUT: 60000
- name: clang-13-release - name: clang-17-release
continue-on-error: false continue-on-error: false
node: 18 node: 18
runs-on: ubuntu-22.04 runs-on: ubuntu-24.04
BUILD_TOOLS: ON BUILD_TOOLS: ON
BUILD_TYPE: Release BUILD_TYPE: Release
CCOMPILER: clang-13 CCOMPILER: clang-17
CXXCOMPILER: clang++-13 CXXCOMPILER: clang++-17
CUCUMBER_TIMEOUT: 60000 CUCUMBER_TIMEOUT: 60000
ENABLE_LTO: OFF
- name: clang-16-release
continue-on-error: false
node: 18
runs-on: ubuntu-24.04
BUILD_TOOLS: ON
BUILD_TYPE: Release
CCOMPILER: clang-16
CXXCOMPILER: clang++-16
CUCUMBER_TIMEOUT: 60000
ENABLE_LTO: OFF
- name: conan-linux-debug-asan-ubsan - name: conan-linux-debug-asan-ubsan
continue-on-error: false continue-on-error: false
node: 18 node: 18
runs-on: ubuntu-22.04 runs-on: ubuntu-24.04
BUILD_TOOLS: ON BUILD_TOOLS: ON
BUILD_TYPE: Release BUILD_TYPE: Release
CCOMPILER: clang-15 CCOMPILER: clang-18
CXXCOMPILER: clang++-15 CXXCOMPILER: clang++-18
ENABLE_CONAN: ON ENABLE_CONAN: ON
ENABLE_SANITIZER: ON ENABLE_SANITIZER: ON
ENABLE_LTO: OFF
- name: conan-linux-release - name: conan-linux-release
continue-on-error: false continue-on-error: false
node: 18 node: 18
runs-on: ubuntu-22.04 runs-on: ubuntu-24.04
BUILD_TOOLS: ON BUILD_TOOLS: ON
BUILD_TYPE: Release BUILD_TYPE: Release
CCOMPILER: clang-15 CCOMPILER: clang-18
CXXCOMPILER: clang++-15 CXXCOMPILER: clang++-18
ENABLE_CONAN: ON ENABLE_CONAN: ON
ENABLE_LTO: OFF
- name: gcc-14-release
continue-on-error: false
node: 20
runs-on: ubuntu-24.04
BUILD_TOOLS: ON
BUILD_TYPE: Release
CCOMPILER: gcc-14
CXXCOMPILER: g++-14
CXXFLAGS: '-Wno-array-bounds -Wno-uninitialized'
- name: gcc-13-release - name: gcc-13-release
continue-on-error: false continue-on-error: false
@ -265,23 +300,14 @@ jobs:
CXXCOMPILER: g++-12 CXXCOMPILER: g++-12
CXXFLAGS: '-Wno-array-bounds -Wno-uninitialized' CXXFLAGS: '-Wno-array-bounds -Wno-uninitialized'
- name: gcc-11-release
continue-on-error: false
node: 20
runs-on: ubuntu-22.04
BUILD_TOOLS: ON
BUILD_TYPE: Release
CCOMPILER: gcc-11
CXXCOMPILER: g++-11
- name: conan-linux-release-node - name: conan-linux-release-node
build_node_package: true build_node_package: true
continue-on-error: false continue-on-error: false
node: 20 node: 20
runs-on: ubuntu-22.04 runs-on: ubuntu-24.04
BUILD_TYPE: Release BUILD_TYPE: Release
CCOMPILER: clang-13 CCOMPILER: clang-16
CXXCOMPILER: clang++-13 CXXCOMPILER: clang++-16
ENABLE_CONAN: ON ENABLE_CONAN: ON
NODE_PACKAGE_TESTS_ONLY: ON NODE_PACKAGE_TESTS_ONLY: ON
@ -289,10 +315,10 @@ jobs:
build_node_package: true build_node_package: true
continue-on-error: false continue-on-error: false
node: 20 node: 20
runs-on: ubuntu-22.04 runs-on: ubuntu-24.04
BUILD_TYPE: Debug BUILD_TYPE: Debug
CCOMPILER: clang-13 CCOMPILER: clang-16
CXXCOMPILER: clang++-13 CXXCOMPILER: clang++-16
ENABLE_CONAN: ON ENABLE_CONAN: ON
NODE_PACKAGE_TESTS_ONLY: ON NODE_PACKAGE_TESTS_ONLY: ON
@ -341,45 +367,48 @@ jobs:
TARGET_ARCH: ${{ matrix.TARGET_ARCH }} TARGET_ARCH: ${{ matrix.TARGET_ARCH }}
OSRM_CONNECTION_RETRIES: ${{ matrix.OSRM_CONNECTION_RETRIES }} OSRM_CONNECTION_RETRIES: ${{ matrix.OSRM_CONNECTION_RETRIES }}
OSRM_CONNECTION_EXP_BACKOFF_COEF: ${{ matrix.OSRM_CONNECTION_EXP_BACKOFF_COEF }} OSRM_CONNECTION_EXP_BACKOFF_COEF: ${{ matrix.OSRM_CONNECTION_EXP_BACKOFF_COEF }}
ENABLE_LTO: ${{ matrix.ENABLE_LTO }}
steps: steps:
- uses: actions/checkout@v3 - uses: actions/checkout@v4
- name: Build machine architecture - name: Build machine architecture
run: uname -m run: uname -m
- name: Use Node.js - name: Use Node.js
uses: actions/setup-node@v3 uses: actions/setup-node@v4
with: with:
node-version: ${{ matrix.node }} node-version: ${{ matrix.node }}
- name: Enable Node.js cache - name: Enable Node.js cache
uses: actions/cache@v3 uses: actions/cache@v4
with: with:
path: ~/.npm path: ~/.npm
key: ${{ runner.os }}-node-${{ hashFiles('**/package-lock.json') }} key: ${{ runner.os }}-node-${{ hashFiles('**/package-lock.json') }}
restore-keys: | restore-keys: |
${{ runner.os }}-node- ${{ runner.os }}-node-
- name: Enable compiler cache - name: Enable compiler cache
uses: actions/cache@v3 uses: actions/cache@v4
with: with:
path: ~/.ccache path: ~/.ccache
key: ccache-${{ matrix.name }}-${{ github.sha }} key: ccache-${{ matrix.name }}-${{ github.sha }}
restore-keys: | restore-keys: |
ccache-${{ matrix.name }}- ccache-${{ matrix.name }}-
- name: Enable Conan cache - name: Enable Conan cache
uses: actions/cache@v3 uses: actions/cache@v4
with: with:
path: ~/.conan path: ~/.conan
key: v9-conan-${{ matrix.name }}-${{ github.sha }} key: v9-conan-${{ matrix.name }}-${{ github.sha }}
restore-keys: | restore-keys: |
v9-conan-${{ matrix.name }}- v9-conan-${{ matrix.name }}-
- name: Enable test cache - name: Enable test cache
uses: actions/cache@v3 uses: actions/cache@v4
with: with:
path: ${{github.workspace}}/test/cache path: ${{github.workspace}}/test/cache
key: v4-test-${{ matrix.name }}-${{ github.sha }} key: v4-test-${{ matrix.name }}-${{ github.sha }}
restore-keys: | restore-keys: |
v4-test-${{ matrix.name }}- v4-test-${{ matrix.name }}-
- name: Prepare environment - name: Prepare environment
run: | run: |
echo "CCACHE_DIR=$HOME/.ccache" >> $GITHUB_ENV
mkdir -p $HOME/.ccache
PACKAGE_JSON_VERSION=$(node -e "console.log(require('./package.json').version)") PACKAGE_JSON_VERSION=$(node -e "console.log(require('./package.json').version)")
echo PUBLISH=$([[ "${GITHUB_REF:-}" == "refs/tags/v${PACKAGE_JSON_VERSION}" ]] && echo "On" || echo "Off") >> $GITHUB_ENV echo PUBLISH=$([[ "${GITHUB_REF:-}" == "refs/tags/v${PACKAGE_JSON_VERSION}" ]] && echo "On" || echo "Off") >> $GITHUB_ENV
echo "OSRM_INSTALL_DIR=${GITHUB_WORKSPACE}/install-osrm" >> $GITHUB_ENV echo "OSRM_INSTALL_DIR=${GITHUB_WORKSPACE}/install-osrm" >> $GITHUB_ENV
@ -396,6 +425,35 @@ jobs:
elif [[ "${RUNNER_OS}" == "macOS" ]]; then elif [[ "${RUNNER_OS}" == "macOS" ]]; then
echo "JOBS=$((`sysctl -n hw.ncpu` + 1))" >> $GITHUB_ENV echo "JOBS=$((`sysctl -n hw.ncpu` + 1))" >> $GITHUB_ENV
fi fi
# See: https://github.com/actions/toolkit/issues/946#issuecomment-1590016041
# We need it to be able to access system folders while restoring cached Boost below
- name: Give tar root ownership
if: runner.os == 'Linux' && matrix.ENABLE_CONAN != 'ON'
run: sudo chown root /bin/tar && sudo chmod u+s /bin/tar
- name: Cache Boost
if: runner.os == 'Linux' && matrix.ENABLE_CONAN != 'ON'
id: cache-boost
uses: actions/cache@v4
with:
path: |
/usr/local/include/boost
/usr/local/lib/libboost*
key: v1-boost-${{ runner.os }}-${{ runner.arch }}-${{ matrix.runs-on }}
restore-keys: |
v1-boost-${{ runner.os }}-${{ runner.arch }}-${{ matrix.runs-on }}
- name: Install Boost
if: steps.cache-boost.outputs.cache-hit != 'true' && runner.os == 'Linux' && matrix.ENABLE_CONAN != 'ON'
run: |
BOOST_VERSION="1.85.0"
BOOST_VERSION_FLAVOR="${BOOST_VERSION}-b2-nodocs"
wget -q https://github.com/boostorg/boost/releases/download/boost-${BOOST_VERSION}/boost-${BOOST_VERSION_FLAVOR}.tar.gz
tar xzf boost-${BOOST_VERSION_FLAVOR}.tar.gz
cd boost-${BOOST_VERSION}
sudo ./bootstrap.sh
sudo ./b2 install
cd ..
sudo rm -rf boost-${BOOST_VERSION}*
- name: Install dev dependencies - name: Install dev dependencies
run: | run: |
@ -417,7 +475,7 @@ jobs:
# Linux dev packages # Linux dev packages
if [ "${ENABLE_CONAN}" != "ON" ]; then if [ "${ENABLE_CONAN}" != "ON" ]; then
sudo apt-get update -y sudo apt-get update -y
sudo apt-get install -y libbz2-dev libxml2-dev libzip-dev liblua5.2-dev libboost-all-dev sudo apt-get install -y libbz2-dev libxml2-dev libzip-dev liblua5.2-dev
if [[ "${CCOMPILER}" != clang-* ]]; then if [[ "${CCOMPILER}" != clang-* ]]; then
sudo apt-get install -y ${CXXCOMPILER} sudo apt-get install -y ${CXXCOMPILER}
fi fi
@ -427,7 +485,7 @@ jobs:
fi fi
# TBB # TBB
TBB_VERSION=2021.3.0 TBB_VERSION=2021.12.0
if [[ "${RUNNER_OS}" == "Linux" ]]; then if [[ "${RUNNER_OS}" == "Linux" ]]; then
TBB_URL="https://github.com/oneapi-src/oneTBB/releases/download/v${TBB_VERSION}/oneapi-tbb-${TBB_VERSION}-lin.tgz" TBB_URL="https://github.com/oneapi-src/oneTBB/releases/download/v${TBB_VERSION}/oneapi-tbb-${TBB_VERSION}-lin.tgz"
elif [[ "${RUNNER_OS}" == "macOS" ]]; then elif [[ "${RUNNER_OS}" == "macOS" ]]; then
@ -437,6 +495,20 @@ jobs:
tar zxvf onetbb.tgz tar zxvf onetbb.tgz
sudo cp -a oneapi-tbb-${TBB_VERSION}/lib/. /usr/local/lib/ sudo cp -a oneapi-tbb-${TBB_VERSION}/lib/. /usr/local/lib/
sudo cp -a oneapi-tbb-${TBB_VERSION}/include/. /usr/local/include/ sudo cp -a oneapi-tbb-${TBB_VERSION}/include/. /usr/local/include/
- name: Add Clang 18 to list of Conan compilers # workaround for the issue that Conan 1.x doesn't know about Clang 18
if: ${{ matrix.ENABLE_CONAN == 'ON' && matrix.CCOMPILER == 'clang-18' }}
run: |
sudo wget https://github.com/mikefarah/yq/releases/download/v4.9.6/yq_linux_amd64 -O /usr/bin/yq && sudo chmod +x /usr/bin/yq
conan config init
yq eval '.compiler.clang.version += ["18"]' -i "$HOME/.conan/settings.yml"
- name: Add Apple-clang 16 to list of Conan compilers # workaround for the issue that Conan 1.x doesn't know about Apple-clang 16
if: ${{ matrix.ENABLE_CONAN == 'ON' && matrix.runs-on == 'macos-14' }}
run: |
sudo wget https://github.com/mikefarah/yq/releases/download/v4.9.6/yq_darwin_arm64 -O /usr/local/bin/yq && sudo chmod +x /usr/local/bin/yq
conan config init
yq eval '.compiler.apple-clang.version += ["16.0"]' -i "$HOME/.conan/settings.yml"
- name: Prepare build - name: Prepare build
run: | run: |
mkdir ${OSRM_BUILD_DIR} mkdir ${OSRM_BUILD_DIR}
@ -459,7 +531,7 @@ jobs:
echo "Using ${JOBS} jobs" echo "Using ${JOBS} jobs"
pushd ${OSRM_BUILD_DIR} pushd ${OSRM_BUILD_DIR}
ccache --zero-stats
cmake .. -DCMAKE_BUILD_TYPE=${BUILD_TYPE} \ cmake .. -DCMAKE_BUILD_TYPE=${BUILD_TYPE} \
-DENABLE_CONAN=${ENABLE_CONAN:-OFF} \ -DENABLE_CONAN=${ENABLE_CONAN:-OFF} \
-DENABLE_ASSERTIONS=${ENABLE_ASSERTIONS:-OFF} \ -DENABLE_ASSERTIONS=${ENABLE_ASSERTIONS:-OFF} \
@ -470,13 +542,14 @@ jobs:
-DENABLE_SANITIZER=${ENABLE_SANITIZER:-OFF} \ -DENABLE_SANITIZER=${ENABLE_SANITIZER:-OFF} \
-DBUILD_TOOLS=${BUILD_TOOLS:-OFF} \ -DBUILD_TOOLS=${BUILD_TOOLS:-OFF} \
-DENABLE_CCACHE=ON \ -DENABLE_CCACHE=ON \
-DENABLE_LTO=${ENABLE_LTO:-ON} \
-DCMAKE_INSTALL_PREFIX=${OSRM_INSTALL_DIR} -DCMAKE_INSTALL_PREFIX=${OSRM_INSTALL_DIR}
make --jobs=${JOBS} make --jobs=${JOBS}
if [[ "${NODE_PACKAGE_TESTS_ONLY}" != "ON" ]]; then if [[ "${NODE_PACKAGE_TESTS_ONLY}" != "ON" ]]; then
make tests --jobs=${JOBS} make tests --jobs=${JOBS}
make benchmarks --jobs=${JOBS} make benchmarks --jobs=${JOBS}
ccache -s
sudo make install sudo make install
if [[ "${RUNNER_OS}" == "Linux" ]]; then if [[ "${RUNNER_OS}" == "Linux" ]]; then
echo "LD_LIBRARY_PATH=$LD_LIBRARY_PATH:${OSRM_INSTALL_DIR}/lib" >> $GITHUB_ENV echo "LD_LIBRARY_PATH=$LD_LIBRARY_PATH:${OSRM_INSTALL_DIR}/lib" >> $GITHUB_ENV
@ -511,7 +584,7 @@ jobs:
- name: Use Node 18 - name: Use Node 18
if: ${{ matrix.NODE_PACKAGE_TESTS_ONLY == 'ON' }} if: ${{ matrix.NODE_PACKAGE_TESTS_ONLY == 'ON' }}
uses: actions/setup-node@v3 uses: actions/setup-node@v4
with: with:
node-version: 18 node-version: 18
- name: Run Node package tests on Node 18 - name: Run Node package tests on Node 18
@ -521,7 +594,7 @@ jobs:
npm run nodejs-tests npm run nodejs-tests
- name: Use Node 20 - name: Use Node 20
if: ${{ matrix.NODE_PACKAGE_TESTS_ONLY == 'ON' }} if: ${{ matrix.NODE_PACKAGE_TESTS_ONLY == 'ON' }}
uses: actions/setup-node@v3 uses: actions/setup-node@v4
with: with:
node-version: 20 node-version: 20
- name: Run Node package tests on Node 20 - name: Run Node package tests on Node 20
@ -531,7 +604,7 @@ jobs:
npm run nodejs-tests npm run nodejs-tests
- name: Use Node latest - name: Use Node latest
if: ${{ matrix.NODE_PACKAGE_TESTS_ONLY == 'ON' }} if: ${{ matrix.NODE_PACKAGE_TESTS_ONLY == 'ON' }}
uses: actions/setup-node@v3 uses: actions/setup-node@v4
with: with:
node-version: latest node-version: latest
- name: Run Node package tests on Node-latest - name: Run Node package tests on Node-latest
@ -541,7 +614,7 @@ jobs:
npm run nodejs-tests npm run nodejs-tests
- name: Upload test logs - name: Upload test logs
uses: actions/upload-artifact@v3 uses: actions/upload-artifact@v4
if: failure() if: failure()
with: with:
name: logs name: logs
@ -557,7 +630,7 @@ jobs:
# # Uploading report to CodeCov # # Uploading report to CodeCov
# - name: Upload code coverage # - name: Upload code coverage
# if: ${{ matrix.ENABLE_COVERAGE == 'ON' }} # if: ${{ matrix.ENABLE_COVERAGE == 'ON' }}
# uses: codecov/codecov-action@v1 # uses: codecov/codecov-action@v4
# with: # with:
# files: coverage.info # files: coverage.info
# name: codecov-osrm-backend # name: codecov-osrm-backend
@ -579,73 +652,135 @@ jobs:
omitNameDuringUpdate: true omitNameDuringUpdate: true
replacesArtifacts: true replacesArtifacts: true
token: ${{ secrets.GITHUB_TOKEN }} token: ${{ secrets.GITHUB_TOKEN }}
- name: Show CCache statistics
run: |
ccache -p
ccache -s
benchmarks: benchmarks:
if: github.event_name == 'pull_request' if: github.event_name == 'pull_request'
needs: [format-taginfo-docs] needs: [format-taginfo-docs]
runs-on: ubuntu-22.04 runs-on: self-hosted
env: env:
CCOMPILER: clang-13 CCOMPILER: clang-16
CXXCOMPILER: clang++-13 CXXCOMPILER: clang++-16
CC: clang-13 CC: clang-16
CXX: clang++-13 CXX: clang++-16
GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }} GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }}
PR_NUMBER: ${{ github.event.pull_request.number }} PR_NUMBER: ${{ github.event.pull_request.number }}
GITHUB_REPOSITORY: ${{ github.repository }} GITHUB_REPOSITORY: ${{ github.repository }}
RUN_BIG_BENCHMARK: ${{ contains(github.event.pull_request.labels.*.name, 'Performance') }}
steps: steps:
- name: Enable compiler cache
uses: actions/cache@v3
with:
path: ~/.ccache
key: v1-ccache-benchmarks-${{ github.sha }}
restore-keys: |
v1-ccache-benchmarks-
- name: Enable Conan cache
uses: actions/cache@v3
with:
path: ~/.conan
key: v1-conan-benchmarks-${{ github.sha }}
restore-keys: |
v1-conan-benchmarks-
- name: Checkout PR Branch - name: Checkout PR Branch
uses: actions/checkout@v3 uses: actions/checkout@v4
with: with:
ref: ${{ github.head_ref }} ref: ${{ github.head_ref }}
path: pr path: pr
- run: python3 -m pip install "conan<2.0.0" "requests==2.31.0" - name: Activate virtualenv
- name: Build PR Branch
run: | run: |
mkdir -p pr/build python3 -m venv .venv
cd pr/build source .venv/bin/activate
cmake -DENABLE_CONAN=ON -DCMAKE_BUILD_TYPE=Release .. echo PATH=$PATH >> $GITHUB_ENV
make -j$(nproc) pip install "conan<2.0.0" "requests==2.31.0" "numpy==1.26.4"
make -j$(nproc) benchmarks - name: Prepare data
cd .. run: |
make -C test/data if [ "$RUN_BIG_BENCHMARK" = "true" ]; then
rm -rf ~/data.osm.pbf
wget http://download.geofabrik.de/europe/poland-latest.osm.pbf -O ~/data.osm.pbf --quiet
gunzip -c ./pr/test/data/poland_gps_traces.csv.gz > ~/gps_traces.csv
else
if [ ! -f "~/data.osm.pbf" ]; then
wget http://download.geofabrik.de/europe/germany/berlin-latest.osm.pbf -O ~/data.osm.pbf
else
echo "Using cached data.osm.pbf"
fi
gunzip -c ./pr/test/data/berlin_gps_traces.csv.gz > ~/gps_traces.csv
fi
- name: Prepare environment
run: |
echo "CCACHE_DIR=$HOME/.ccache" >> $GITHUB_ENV
mkdir -p $HOME/.ccache
ccache --zero-stats
ccache --max-size=256M
- name: Checkout Base Branch - name: Checkout Base Branch
uses: actions/checkout@v3 uses: actions/checkout@v4
with: with:
ref: ${{ github.event.pull_request.base.ref }} ref: ${{ github.event.pull_request.base.ref }}
path: base path: base
- name: Build Base Branch - name: Build Base Branch
run: | run: |
cd base
npm ci --ignore-scripts
cd ..
mkdir base/build mkdir base/build
cd base/build cd base/build
cmake -DENABLE_CONAN=ON -DCMAKE_BUILD_TYPE=Release .. cmake -DENABLE_CONAN=ON -DCMAKE_BUILD_TYPE=Release -DENABLE_NODE_BINDINGS=ON ..
make -j$(nproc) make -j$(nproc)
make -j$(nproc) benchmarks make -j$(nproc) benchmarks
cd .. cd ..
make -C test/data make -C test/data
- name: Run Benchmarks - name: Build PR Branch
run: | run: |
./pr/scripts/ci/run_benchmarks.sh base pr cd pr
npm ci --ignore-scripts
cd ..
mkdir -p pr/build
cd pr/build
cmake -DENABLE_CONAN=ON -DCMAKE_BUILD_TYPE=Release -DENABLE_NODE_BINDINGS=ON ..
make -j$(nproc)
make -j$(nproc) benchmarks
cd ..
make -C test/data
# we run benchmarks in tmpfs to avoid impact of disk IO
- name: Create folder for tmpfs
run: |
# if by any chance it was mounted before(e.g. due to previous job failed), unmount it
sudo umount ~/benchmarks | true
rm -rf ~/benchmarks
mkdir -p ~/benchmarks
# see https://llvm.org/docs/Benchmarking.html
- name: Run PR Benchmarks
run: |
sudo cset shield -c 2-3 -k on
sudo mount -t tmpfs -o size=4g none ~/benchmarks
cp -rf pr/build ~/benchmarks/build
cp -rf pr/lib ~/benchmarks/lib
mkdir -p ~/benchmarks/test
cp -rf pr/test/data ~/benchmarks/test/data
cp -rf pr/profiles ~/benchmarks/profiles
sudo cset shield --exec -- ./pr/scripts/ci/run_benchmarks.sh -f ~/benchmarks -r $(pwd)/pr_results -s $(pwd)/pr -b ~/benchmarks/build -o ~/data.osm.pbf -g ~/gps_traces.csv
sudo umount ~/benchmarks
sudo cset shield --reset
- name: Run Base Benchmarks
run: |
sudo cset shield -c 2-3 -k on
sudo mount -t tmpfs -o size=4g none ~/benchmarks
cp -rf base/build ~/benchmarks/build
cp -rf base/lib ~/benchmarks/lib
mkdir -p ~/benchmarks/test
cp -rf base/test/data ~/benchmarks/test/data
cp -rf base/profiles ~/benchmarks/profiles
# TODO: remove it when base branch will have this file at needed location
if [ ! -f ~/benchmarks/test/data/portugal_to_korea.json ]; then
cp base/src/benchmarks/portugal_to_korea.json ~/benchmarks/test/data/portugal_to_korea.json
fi
# we intentionally use scripts from PR branch to be able to update them and see results in the same PR
sudo cset shield --exec -- cset shield --exec -- ./pr/scripts/ci/run_benchmarks.sh -f ~/benchmarks -r $(pwd)/base_results -s $(pwd)/pr -b ~/benchmarks/build -o ~/data.osm.pbf -g ~/gps_traces.csv
sudo umount ~/benchmarks
sudo cset shield --reset
- name: Post Benchmark Results - name: Post Benchmark Results
run: | run: |
python3 pr/scripts/ci/post_benchmark_results.py base_results pr_results python3 pr/scripts/ci/post_benchmark_results.py base_results pr_results
- name: Show CCache statistics
run: |
ccache -p
ccache -s
ci-complete: ci-complete:
runs-on: ubuntu-22.04 runs-on: ubuntu-22.04
needs: [build-test-publish, docker-image, windows-release-node, benchmarks] needs: [build-test-publish, docker-image-matrix, windows-release-node, benchmarks]
steps: steps:
- run: echo "CI complete" - run: echo "CI complete"

29
.github/workflows/stale.yml vendored Normal file
View File

@ -0,0 +1,29 @@
name: 'Close stale issues'
on:
# NOTE: uncomment if you want to test changes to this file in PRs CI
# pull_request:
# branches:
# - master
schedule:
- cron: '30 1 * * *' # every day at 1:30am
permissions:
issues: write
pull-requests: write
jobs:
stale:
runs-on: ubuntu-24.04
steps:
- uses: actions/stale@v9
with:
operations-per-run: 3000
stale-issue-message: 'This issue seems to be stale. It will be closed in 30 days if no further activity occurs.'
stale-pr-message: 'This PR seems to be stale. Is it still relevant?'
days-before-issue-stale: 180 # 6 months
days-before-issue-close: 30 # 1 month
days-before-pr-stale: 180 # 6 months
days-before-pr-close: -1 # never close PRs
exempt-issue-labels: 'Do Not Stale,Feature Request,Performance,Bug Report,CI,Starter Task,Refactor,Guidance'

1
.gitignore vendored
View File

@ -46,7 +46,6 @@ Thumbs.db
/example/build/ /example/build/
/test/data/monaco.osrm* /test/data/monaco.osrm*
/test/data/ch /test/data/ch
/test/data/corech
/test/data/mld /test/data/mld
/cmake/postinst /cmake/postinst

View File

@ -1,12 +1,18 @@
# Unreleased # Unreleased
- Changes from 5.27.1 - Changes from 5.27.1
- Features - Features
- ADDED: Route pedestrians over highway=platform [#6993](https://github.com/Project-OSRM/osrm-backend/pull/6993)
- REMOVED: Remove all core-CH left-overs [#6920](https://github.com/Project-OSRM/osrm-backend/pull/6920)
- ADDED: Add support for a keepalive_timeout flag. [#6674](https://github.com/Project-OSRM/osrm-backend/pull/6674) - ADDED: Add support for a keepalive_timeout flag. [#6674](https://github.com/Project-OSRM/osrm-backend/pull/6674)
- ADDED: Add support for a default_radius flag. [#6575](https://github.com/Project-OSRM/osrm-backend/pull/6575) - ADDED: Add support for a default_radius flag. [#6575](https://github.com/Project-OSRM/osrm-backend/pull/6575)
- ADDED: Add support for disabling feature datasets. [#6666](https://github.com/Project-OSRM/osrm-backend/pull/6666) - ADDED: Add support for disabling feature datasets. [#6666](https://github.com/Project-OSRM/osrm-backend/pull/6666)
- ADDED: Add support for opposite approach request parameter. [#6842](https://github.com/Project-OSRM/osrm-backend/pull/6842) - ADDED: Add support for opposite approach request parameter. [#6842](https://github.com/Project-OSRM/osrm-backend/pull/6842)
- ADDED: Add support for accessing edge flags in `process_segment` [#6658](https://github.com/Project-OSRM/osrm-backend/pull/6658) - ADDED: Add support for accessing edge flags in `process_segment` [#6658](https://github.com/Project-OSRM/osrm-backend/pull/6658)
- Build: - Build:
- CHANGED: Upgrade clang-format to version 15. [#6919](https://github.com/Project-OSRM/osrm-backend/pull/6919)
- CHANGED: Use Debian Bookworm as base Docker image [#6904](https://github.com/Project-OSRM/osrm-backend/pull/6904)
- CHANGED: Upgrade CI actions to latest versions [#6893](https://github.com/Project-OSRM/osrm-backend/pull/6893)
- CHANGED: Remove outdated warnings #6894 [#6894](https://github.com/Project-OSRM/osrm-backend/pull/6894)
- ADDED: Add CI job which builds OSRM with gcc 12. [#6455](https://github.com/Project-OSRM/osrm-backend/pull/6455) - ADDED: Add CI job which builds OSRM with gcc 12. [#6455](https://github.com/Project-OSRM/osrm-backend/pull/6455)
- CHANGED: Upgrade to clang-tidy 15. [#6439](https://github.com/Project-OSRM/osrm-backend/pull/6439) - CHANGED: Upgrade to clang-tidy 15. [#6439](https://github.com/Project-OSRM/osrm-backend/pull/6439)
- CHANGED: Update actions/cache to v3. [#6420](https://github.com/Project-OSRM/osrm-backend/pull/6420) - CHANGED: Update actions/cache to v3. [#6420](https://github.com/Project-OSRM/osrm-backend/pull/6420)
@ -19,6 +25,39 @@
- NodeJS: - NodeJS:
- CHANGED: Use node-api instead of NAN. [#6452](https://github.com/Project-OSRM/osrm-backend/pull/6452) - CHANGED: Use node-api instead of NAN. [#6452](https://github.com/Project-OSRM/osrm-backend/pull/6452)
- Misc: - Misc:
- CHANGED: Use std::string_view for key type in json::Object. [#7062](https://github.com/Project-OSRM/osrm-backend/pull/7062)
- CHANGED: Use thread_local instead of boost::thread_specific_ptr. [#6991](https://github.com/Project-OSRM/osrm-backend/pull/6991)
- CHANGED: Bump flatbuffers to v24.3.25 version. [#6988](https://github.com/Project-OSRM/osrm-backend/pull/6988)
- CHANGED: Add .reserve(...) to assembleGeometry function. [#6983](https://github.com/Project-OSRM/osrm-backend/pull/6983)
- CHANGED: Get rid of boost::optional leftovers. [#6977](https://github.com/Project-OSRM/osrm-backend/pull/6977)
- CHANGED: Use Link Time Optimisation whenever possible. [#6967](https://github.com/Project-OSRM/osrm-backend/pull/6967)
- CHANGED: Use struct instead of tuple to define UnpackedPath. [#6974](https://github.com/Project-OSRM/osrm-backend/pull/6974)
- CHANGED: Micro performance optimisation in map matching. [#6976](https://github.com/Project-OSRM/osrm-backend/pull/6976)
- CHANGED: Re-use priority queue in StaticRTree. [#6952](https://github.com/Project-OSRM/osrm-backend/pull/6952)
- CHANGED: Optimise encodePolyline function. [#6940](https://github.com/Project-OSRM/osrm-backend/pull/6940)
- CHANGED: Avoid reallocations in base64 encoding. [#6951](https://github.com/Project-OSRM/osrm-backend/pull/6951)
- CHANGED: Get rid of unused Boost dependencies. [#6960](https://github.com/Project-OSRM/osrm-backend/pull/6960)
- CHANGED: Apply micro-optimisation for Table & Trip APIs. [#6949](https://github.com/Project-OSRM/osrm-backend/pull/6949)
- CHANGED: Apply micro-optimisation for Route API. [#6948](https://github.com/Project-OSRM/osrm-backend/pull/6948)
- CHANGED: Apply micro-optimisation for Match API. [#6945](https://github.com/Project-OSRM/osrm-backend/pull/6945)
- CHANGED: Apply micro-optimisation for Nearest API. [#6944](https://github.com/Project-OSRM/osrm-backend/pull/6944)
- CHANGED: Avoid copy of intersection in totalTurnAngle. [#6938](https://github.com/Project-OSRM/osrm-backend/pull/6938)
- CHANGED: Use std::unordered_map::emplace instead of operator[] when producing JSONs. [#6936](https://github.com/Project-OSRM/osrm-backend/pull/6936)
- CHANGED: Avoid copy of vectors in MakeRoute function. [#6939](https://github.com/Project-OSRM/osrm-backend/pull/6939)
- FIXED: Fix bugprone-unused-return-value clang-tidy warning. [#6934](https://github.com/Project-OSRM/osrm-backend/pull/6934)
- FIXED: Fix performance-noexcept-move-constructor clang-tidy warning. [#6931](https://github.com/Project-OSRM/osrm-backend/pull/6933)
- FIXED: Fix performance-noexcept-swap clang-tidy warning. [#6931](https://github.com/Project-OSRM/osrm-backend/pull/6931)
- CHANGED: Use custom struct instead of std::pair in QueryHeap. [#6921](https://github.com/Project-OSRM/osrm-backend/pull/6921)
- CHANGED: Use std::string_view::starts_with instead of boost::starts_with. [#6918](https://github.com/Project-OSRM/osrm-backend/pull/6918)
- CHANGED: Get rid of boost::math::constants::* and M_PI in favor of std::numbers. [#6916](https://github.com/Project-OSRM/osrm-backend/pull/6916)
- CHANGED: Make constants in PackedVector constexpr. [#6917](https://github.com/Project-OSRM/osrm-backend/pull/6917)
- CHANGED: Use std::variant instead of mapbox::util::variant. [#6903](https://github.com/Project-OSRM/osrm-backend/pull/6903)
- CHANGED: Bump rapidjson to version f9d53419e912910fd8fa57d5705fa41425428c35 [#6906](https://github.com/Project-OSRM/osrm-backend/pull/6906)
- CHANGED: Bump mapbox/variant to version 1.2.0 [#6898](https://github.com/Project-OSRM/osrm-backend/pull/6898)
- CHANGED: Avoid copy of std::function-based callback in path unpacking [#6895](https://github.com/Project-OSRM/osrm-backend/pull/6895)
- CHANGED: Replace boost::hash by std::hash [#6892](https://github.com/Project-OSRM/osrm-backend/pull/6892)
- CHANGED: Partial fix migration from boost::optional to std::optional [#6551](https://github.com/Project-OSRM/osrm-backend/issues/6551)
- CHANGED: Replace boost::filesystem with std::filesystem [#6432](https://github.com/Project-OSRM/osrm-backend/pull/6432)
- CHANGED: Update Conan Boost version to 1.85.0. [#6868](https://github.com/Project-OSRM/osrm-backend/pull/6868) - CHANGED: Update Conan Boost version to 1.85.0. [#6868](https://github.com/Project-OSRM/osrm-backend/pull/6868)
- FIXED: Fix an error in a RouteParameters AnnotationsType operator overload. [#6646](https://github.com/Project-OSRM/osrm-backend/pull/6646) - FIXED: Fix an error in a RouteParameters AnnotationsType operator overload. [#6646](https://github.com/Project-OSRM/osrm-backend/pull/6646)
- ADDED: Add support for "unlimited" to be passed as a value for the default-radius and max-matching-radius flags. [#6599](https://github.com/Project-OSRM/osrm-backend/pull/6599) - ADDED: Add support for "unlimited" to be passed as a value for the default-radius and max-matching-radius flags. [#6599](https://github.com/Project-OSRM/osrm-backend/pull/6599)
@ -41,6 +80,7 @@
- ADDED: Extract prerelease/build information from package semver [#6839](https://github.com/Project-OSRM/osrm-backend/pull/6839) - ADDED: Extract prerelease/build information from package semver [#6839](https://github.com/Project-OSRM/osrm-backend/pull/6839)
- Profiles: - Profiles:
- FIXED: Bicycle and foot profiles now don't route on proposed ways [#6615](https://github.com/Project-OSRM/osrm-backend/pull/6615) - FIXED: Bicycle and foot profiles now don't route on proposed ways [#6615](https://github.com/Project-OSRM/osrm-backend/pull/6615)
- ADDED: Add optional support of cargo bike exclusion and width to bicyle profile [#7044](https://github.com/Project-OSRM/osrm-backend/pull/7044)
- Routing: - Routing:
- FIXED: Fix adding traffic signal penalties during compression [#6419](https://github.com/Project-OSRM/osrm-backend/pull/6419) - FIXED: Fix adding traffic signal penalties during compression [#6419](https://github.com/Project-OSRM/osrm-backend/pull/6419)
- FIXED: Correctly handle compressed traffic signals. [#6724](https://github.com/Project-OSRM/osrm-backend/pull/6724) - FIXED: Correctly handle compressed traffic signals. [#6724](https://github.com/Project-OSRM/osrm-backend/pull/6724)
@ -48,6 +88,7 @@
- FIXED: Remove force-loop checks for routes with u-turns [#6858](https://github.com/Project-OSRM/osrm-backend/pull/6858) - FIXED: Remove force-loop checks for routes with u-turns [#6858](https://github.com/Project-OSRM/osrm-backend/pull/6858)
- FIXED: Correctly check runtime search conditions for forcing routing steps [#6866](https://github.com/Project-OSRM/osrm-backend/pull/6866) - FIXED: Correctly check runtime search conditions for forcing routing steps [#6866](https://github.com/Project-OSRM/osrm-backend/pull/6866)
- Map Matching: - Map Matching:
- CHANGED: Optimise path distance calculation in MLD map matching even more. [#6884](https://github.com/Project-OSRM/osrm-backend/pull/6884)
- CHANGED: Optimise path distance calculation in MLD map matching. [#6876](https://github.com/Project-OSRM/osrm-backend/pull/6876) - CHANGED: Optimise path distance calculation in MLD map matching. [#6876](https://github.com/Project-OSRM/osrm-backend/pull/6876)
- CHANGED: Optimise R-tree queries in the case of map matching. [#6881](https://github.com/Project-OSRM/osrm-backend/pull/6876) - CHANGED: Optimise R-tree queries in the case of map matching. [#6881](https://github.com/Project-OSRM/osrm-backend/pull/6876)
- Debug tiles: - Debug tiles:

View File

@ -1,6 +1,6 @@
cmake_minimum_required(VERSION 3.18) cmake_minimum_required(VERSION 3.18)
set(CMAKE_CXX_STANDARD 17) set(CMAKE_CXX_STANDARD 20)
set(CMAKE_CXX_STANDARD_REQUIRED ON) set(CMAKE_CXX_STANDARD_REQUIRED ON)
set(CMAKE_CXX_EXTENSIONS OFF) set(CMAKE_CXX_EXTENSIONS OFF)
@ -31,11 +31,12 @@ option(ENABLE_ASSERTIONS "Use assertions in release mode" OFF)
option(ENABLE_DEBUG_LOGGING "Use debug logging in release mode" OFF) option(ENABLE_DEBUG_LOGGING "Use debug logging in release mode" OFF)
option(ENABLE_COVERAGE "Build with coverage instrumentalisation" OFF) option(ENABLE_COVERAGE "Build with coverage instrumentalisation" OFF)
option(ENABLE_SANITIZER "Use memory sanitizer for Debug build" OFF) option(ENABLE_SANITIZER "Use memory sanitizer for Debug build" OFF)
option(ENABLE_LTO "Use LTO if available" OFF) option(ENABLE_LTO "Use Link Time Optimisation" ON)
option(ENABLE_FUZZING "Fuzz testing using LLVM's libFuzzer" OFF) option(ENABLE_FUZZING "Fuzz testing using LLVM's libFuzzer" OFF)
option(ENABLE_NODE_BINDINGS "Build NodeJs bindings" OFF) option(ENABLE_NODE_BINDINGS "Build NodeJs bindings" OFF)
option(ENABLE_CLANG_TIDY "Enables clang-tidy checks" OFF) option(ENABLE_CLANG_TIDY "Enables clang-tidy checks" OFF)
if (ENABLE_CLANG_TIDY) if (ENABLE_CLANG_TIDY)
find_program(CLANG_TIDY_COMMAND NAMES clang-tidy) find_program(CLANG_TIDY_COMMAND NAMES clang-tidy)
if(NOT CLANG_TIDY_COMMAND) if(NOT CLANG_TIDY_COMMAND)
@ -55,8 +56,23 @@ endif()
if (POLICY CMP0074) if (POLICY CMP0074)
cmake_policy(SET CMP0074 NEW) cmake_policy(SET CMP0074 NEW)
endif() endif()
if (POLICY CMP0167)
cmake_policy(SET CMP0167 NEW)
endif()
project(OSRM C CXX) project(OSRM C CXX)
if(ENABLE_LTO AND (CMAKE_BUILD_TYPE MATCHES Release OR CMAKE_BUILD_TYPE MATCHES MinRelSize OR CMAKE_BUILD_TYPE MATCHES RelWithDebInfo))
include(CheckIPOSupported)
check_ipo_supported(RESULT LTO_SUPPORTED OUTPUT error)
if(LTO_SUPPORTED)
message(STATUS "IPO / LTO enabled")
set(CMAKE_INTERPROCEDURAL_OPTIMIZATION TRUE)
else()
message(FATAL_ERROR "IPO / LTO not supported: <${error}>")
endif()
endif()
# add @loader_path/$ORIGIN to rpath to make binaries relocatable # add @loader_path/$ORIGIN to rpath to make binaries relocatable
if (APPLE) if (APPLE)
set(CMAKE_BUILD_RPATH "@loader_path") set(CMAKE_BUILD_RPATH "@loader_path")
@ -120,10 +136,10 @@ endif()
include_directories(BEFORE ${CMAKE_CURRENT_BINARY_DIR}/include/) include_directories(BEFORE ${CMAKE_CURRENT_BINARY_DIR}/include/)
include_directories(BEFORE ${CMAKE_CURRENT_SOURCE_DIR}/include/) include_directories(BEFORE ${CMAKE_CURRENT_SOURCE_DIR}/include/)
include_directories(SYSTEM ${CMAKE_CURRENT_SOURCE_DIR}/third_party/sol2-3.3.0/include) include_directories(SYSTEM ${CMAKE_CURRENT_SOURCE_DIR}/generated/include/)
include_directories(SYSTEM ${CMAKE_CURRENT_SOURCE_DIR}/third_party/variant/include) include_directories(SYSTEM ${CMAKE_CURRENT_SOURCE_DIR}/third_party/sol2/include)
set(BOOST_COMPONENTS date_time chrono filesystem iostreams program_options regex system thread unit_test_framework) set(BOOST_COMPONENTS date_time iostreams program_options thread unit_test_framework)
configure_file( configure_file(
${CMAKE_CURRENT_SOURCE_DIR}/include/util/version.hpp.in ${CMAKE_CURRENT_SOURCE_DIR}/include/util/version.hpp.in
@ -209,17 +225,6 @@ if(CMAKE_CXX_COMPILER_ID MATCHES "GNU")
set(CMAKE_CXX_FLAGS_DEBUG "${CMAKE_CXX_FLAGS_DEBUG} -Og -ggdb") set(CMAKE_CXX_FLAGS_DEBUG "${CMAKE_CXX_FLAGS_DEBUG} -Og -ggdb")
endif() endif()
if(ENABLE_LTO AND (CMAKE_BUILD_TYPE MATCHES Release OR CMAKE_BUILD_TYPE MATCHES MinRelSize OR CMAKE_BUILD_TYPE MATCHES RelWithDebInfo))
include(CheckIPOSupported)
check_ipo_supported(RESULT LTO_SUPPORTED OUTPUT error)
if(LTO_SUPPORTED)
message(STATUS "IPO / LTO enabled")
set(CMAKE_INTERPROCEDURAL_OPTIMIZATION TRUE)
else()
message(WARNING "IPO / LTO not supported: <${error}>")
endif()
endif()
set(MAYBE_COVERAGE_LIBRARIES "") set(MAYBE_COVERAGE_LIBRARIES "")
if (ENABLE_COVERAGE) if (ENABLE_COVERAGE)
if (NOT CMAKE_BUILD_TYPE MATCHES "Debug") if (NOT CMAKE_BUILD_TYPE MATCHES "Debug")
@ -267,7 +272,6 @@ elseif(CMAKE_CXX_COMPILER_ID MATCHES "MSVC")
add_dependency_defines(-DBOOST_LIB_DIAGNOSTIC) add_dependency_defines(-DBOOST_LIB_DIAGNOSTIC)
add_dependency_defines(-D_CRT_SECURE_NO_WARNINGS) add_dependency_defines(-D_CRT_SECURE_NO_WARNINGS)
add_dependency_defines(-DNOMINMAX) # avoid min and max macros that can break compilation add_dependency_defines(-DNOMINMAX) # avoid min and max macros that can break compilation
add_dependency_defines(-D_USE_MATH_DEFINES) #needed for M_PI with cmath.h
add_dependency_defines(-D_WIN32_WINNT=0x0501) add_dependency_defines(-D_WIN32_WINNT=0x0501)
add_dependency_defines(-DXML_STATIC) add_dependency_defines(-DXML_STATIC)
find_library(ws2_32_LIBRARY_PATH ws2_32) find_library(ws2_32_LIBRARY_PATH ws2_32)
@ -292,6 +296,7 @@ include_directories(SYSTEM ${MICROTAR_INCLUDE_DIR})
add_library(MICROTAR OBJECT "${CMAKE_CURRENT_SOURCE_DIR}/third_party/microtar/src/microtar.c") add_library(MICROTAR OBJECT "${CMAKE_CURRENT_SOURCE_DIR}/third_party/microtar/src/microtar.c")
set_property(TARGET MICROTAR PROPERTY POSITION_INDEPENDENT_CODE ON) set_property(TARGET MICROTAR PROPERTY POSITION_INDEPENDENT_CODE ON)
target_no_warning(MICROTAR unused-variable) target_no_warning(MICROTAR unused-variable)
target_no_warning(MICROTAR format) target_no_warning(MICROTAR format)
@ -332,20 +337,12 @@ if(ENABLE_CONAN)
set(CONAN_BOOST_VERSION "1.85.0@#14265ec82b25d91305bbb3b30d3357f8") set(CONAN_BOOST_VERSION "1.85.0@#14265ec82b25d91305bbb3b30d3357f8")
set(CONAN_BZIP2_VERSION "1.0.8@#d1b2d5816f25865acf978501dff1f897") set(CONAN_BZIP2_VERSION "1.0.8@#d1b2d5816f25865acf978501dff1f897")
set(CONAN_EXPAT_VERSION "2.2.10@#916908d4a570ad839edd25322c3268cd") set(CONAN_EXPAT_VERSION "2.6.2@#2d385d0d50eb5561006a7ff9e356656b")
set(CONAN_LUA_VERSION "5.4.4@#3ec62efc37cd0a5d80b9e5cb35277360") set(CONAN_LUA_VERSION "5.4.6@#658d6089093cf01992c2737ab2e96763")
set(CONAN_TBB_VERSION "2021.3.0@#507ec17cbd51a84167e143b20d170eea") set(CONAN_TBB_VERSION "2021.12.0@#e56e5b44be8d690530585dd3634c0106")
set(CONAN_SYSTEM_INCLUDES ON) set(CONAN_SYSTEM_INCLUDES ON)
# TODO:
# if we link TBB dynamically osrm-extract.exe finishes on the first access to any TBB symbol
# with exit code = -1073741515, which means that program cannot load required DLL.
if (MSVC)
set(TBB_SHARED False)
else()
set(TBB_SHARED True)
endif()
set(CONAN_ARGS set(CONAN_ARGS
REQUIRES REQUIRES
@ -358,9 +355,7 @@ if(ENABLE_CONAN)
GENERATORS cmake_find_package json # json generator generates a conanbuildinfo.json in the build folder so (non-CMake) projects can easily parse OSRM's dependencies GENERATORS cmake_find_package json # json generator generates a conanbuildinfo.json in the build folder so (non-CMake) projects can easily parse OSRM's dependencies
KEEP_RPATHS KEEP_RPATHS
NO_OUTPUT_DIRS NO_OUTPUT_DIRS
OPTIONS boost:filesystem_version=3 # https://stackoverflow.com/questions/73392648/error-with-boost-filesystem-version-in-cmake OPTIONS boost:without_stacktrace=True # Apple Silicon cross-compilation fails without it
onetbb:shared=${TBB_SHARED}
boost:without_stacktrace=True # Apple Silicon cross-compilation fails without it
BUILD missing BUILD missing
) )
@ -389,14 +384,10 @@ if(ENABLE_CONAN)
set(Boost_USE_STATIC_LIBS ON) set(Boost_USE_STATIC_LIBS ON)
find_package(Boost REQUIRED COMPONENTS ${BOOST_COMPONENTS}) find_package(Boost REQUIRED COMPONENTS ${BOOST_COMPONENTS})
set(Boost_DATE_TIME_LIBRARY "${Boost_date_time_LIB_TARGETS}") set(Boost_DATE_TIME_LIBRARY "${Boost_date_time_LIB_TARGETS}")
set(Boost_CHRONO_LIBRARY "${Boost_chrono_LIB_TARGETS}")
set(Boost_PROGRAM_OPTIONS_LIBRARY "${Boost_program_options_LIB_TARGETS}") set(Boost_PROGRAM_OPTIONS_LIBRARY "${Boost_program_options_LIB_TARGETS}")
set(Boost_FILESYSTEM_LIBRARY "${Boost_filesystem_LIB_TARGETS}")
set(Boost_IOSTREAMS_LIBRARY "${Boost_iostreams_LIB_TARGETS}") set(Boost_IOSTREAMS_LIBRARY "${Boost_iostreams_LIB_TARGETS}")
set(Boost_THREAD_LIBRARY "${Boost_thread_LIB_TARGETS}") set(Boost_THREAD_LIBRARY "${Boost_thread_LIB_TARGETS}")
set(Boost_SYSTEM_LIBRARY "${Boost_system_LIB_TARGETS}")
set(Boost_ZLIB_LIBRARY "${Boost_zlib_LIB_TARGETS}") set(Boost_ZLIB_LIBRARY "${Boost_zlib_LIB_TARGETS}")
set(Boost_REGEX_LIBRARY "${Boost_regex_LIB_TARGETS}")
set(Boost_UNIT_TEST_FRAMEWORK_LIBRARY "${Boost_unit_test_framework_LIB_TARGETS}") set(Boost_UNIT_TEST_FRAMEWORK_LIBRARY "${Boost_unit_test_framework_LIB_TARGETS}")
@ -469,7 +460,6 @@ add_dependency_includes(${ZLIB_INCLUDE_DIRS})
add_dependency_defines(-DBOOST_SPIRIT_USE_PHOENIX_V3) add_dependency_defines(-DBOOST_SPIRIT_USE_PHOENIX_V3)
add_dependency_defines(-DBOOST_RESULT_OF_USE_DECLTYPE) add_dependency_defines(-DBOOST_RESULT_OF_USE_DECLTYPE)
add_dependency_defines(-DBOOST_FILESYSTEM_NO_DEPRECATED)
# Workaround for https://github.com/boostorg/phoenix/issues/111 # Workaround for https://github.com/boostorg/phoenix/issues/111
add_dependency_defines(-DBOOST_PHOENIX_STL_TUPLE_H_) add_dependency_defines(-DBOOST_PHOENIX_STL_TUPLE_H_)
@ -479,11 +469,8 @@ include_directories(SYSTEM ${DEPENDENCIES_INCLUDE_DIRS})
set(BOOST_BASE_LIBRARIES set(BOOST_BASE_LIBRARIES
${Boost_DATE_TIME_LIBRARY} ${Boost_DATE_TIME_LIBRARY}
${Boost_CHRONO_LIBRARY}
${Boost_FILESYSTEM_LIBRARY}
${Boost_IOSTREAMS_LIBRARY} ${Boost_IOSTREAMS_LIBRARY}
${Boost_THREAD_LIBRARY} ${Boost_THREAD_LIBRARY})
${Boost_SYSTEM_LIBRARY})
set(BOOST_ENGINE_LIBRARIES set(BOOST_ENGINE_LIBRARIES
${Boost_ZLIB_LIBRARY} ${Boost_ZLIB_LIBRARY}
@ -502,7 +489,6 @@ endif()
set(EXTRACTOR_LIBRARIES set(EXTRACTOR_LIBRARIES
${BZIP2_LIBRARIES} ${BZIP2_LIBRARIES}
${Boost_REGEX_LIBRARY}
${BOOST_BASE_LIBRARIES} ${BOOST_BASE_LIBRARIES}
${CMAKE_THREAD_LIBS_INIT} ${CMAKE_THREAD_LIBS_INIT}
${EXPAT_LIBRARIES} ${EXPAT_LIBRARIES}
@ -607,7 +593,6 @@ if (BUILD_ROUTED)
set_property(TARGET osrm-routed PROPERTY INSTALL_RPATH_USE_LINK_PATH TRUE) set_property(TARGET osrm-routed PROPERTY INSTALL_RPATH_USE_LINK_PATH TRUE)
endif() endif()
file(GLOB VariantGlob third_party/variant/include/mapbox/*.hpp)
file(GLOB FlatbuffersGlob third_party/flatbuffers/include/flatbuffers/*.h) file(GLOB FlatbuffersGlob third_party/flatbuffers/include/flatbuffers/*.h)
file(GLOB LibraryGlob include/osrm/*.hpp) file(GLOB LibraryGlob include/osrm/*.hpp)
file(GLOB ParametersGlob include/engine/api/*_parameters.hpp) file(GLOB ParametersGlob include/engine/api/*_parameters.hpp)
@ -627,7 +612,6 @@ install(FILES ${ContractorHeader} DESTINATION include/osrm/contractor)
install(FILES ${LibraryGlob} DESTINATION include/osrm) install(FILES ${LibraryGlob} DESTINATION include/osrm)
install(FILES ${ParametersGlob} DESTINATION include/osrm/engine/api) install(FILES ${ParametersGlob} DESTINATION include/osrm/engine/api)
install(FILES ${ApiHeader} DESTINATION include/osrm/engine/api) install(FILES ${ApiHeader} DESTINATION include/osrm/engine/api)
install(FILES ${VariantGlob} DESTINATION include/mapbox)
install(FILES ${FlatbuffersGlob} DESTINATION include/flatbuffers) install(FILES ${FlatbuffersGlob} DESTINATION include/flatbuffers)
install(TARGETS osrm-extract DESTINATION bin) install(TARGETS osrm-extract DESTINATION bin)
install(TARGETS osrm-partition DESTINATION bin) install(TARGETS osrm-partition DESTINATION bin)

View File

@ -55,7 +55,7 @@ function(_get_msvc_ide_version result)
set(${result} 15 PARENT_SCOPE) set(${result} 15 PARENT_SCOPE)
elseif(NOT MSVC_VERSION VERSION_LESS 1920 AND MSVC_VERSION VERSION_LESS 1930) elseif(NOT MSVC_VERSION VERSION_LESS 1920 AND MSVC_VERSION VERSION_LESS 1930)
set(${result} 16 PARENT_SCOPE) set(${result} 16 PARENT_SCOPE)
elseif(NOT MSVC_VERSION VERSION_LESS 1930 AND MSVC_VERSION VERSION_LESS 1940) elseif(NOT MSVC_VERSION VERSION_LESS 1930 AND MSVC_VERSION VERSION_LESS 1950)
set(${result} 17 PARENT_SCOPE) set(${result} 17 PARENT_SCOPE)
else() else()
message(FATAL_ERROR "Conan: Unknown MSVC compiler version [${MSVC_VERSION}]") message(FATAL_ERROR "Conan: Unknown MSVC compiler version [${MSVC_VERSION}]")

View File

@ -50,9 +50,7 @@ add_warning(all)
add_warning(extra) add_warning(extra)
add_warning(pedantic) add_warning(pedantic)
add_warning(error) # treat all warnings as errors add_warning(error) # treat all warnings as errors
if(CMAKE_CXX_COMPILER_ID MATCHES "Clang") if(CMAKE_CXX_COMPILER_ID MATCHES "GNU")
add_warning(strict-overflow=2)
elseif(CMAKE_CXX_COMPILER_ID MATCHES "GNU")
add_warning(strict-overflow=1) add_warning(strict-overflow=1)
endif() endif()
add_warning(suggest-override) add_warning(suggest-override)
@ -66,7 +64,6 @@ add_warning(init-self)
add_warning(bool-compare) add_warning(bool-compare)
add_warning(logical-not-parentheses) add_warning(logical-not-parentheses)
add_warning(logical-op) add_warning(logical-op)
add_warning(maybe-uninitialized)
add_warning(misleading-indentation) add_warning(misleading-indentation)
# `no-` prefix is part of warning name(i.e. doesn't mean we are disabling it) # `no-` prefix is part of warning name(i.e. doesn't mean we are disabling it)
add_warning(no-return-local-addr) add_warning(no-return-local-addr)
@ -79,15 +76,13 @@ add_warning(sizeof-array-argument)
add_warning(switch-bool) add_warning(switch-bool)
add_warning(tautological-compare) add_warning(tautological-compare)
add_warning(trampolines) add_warning(trampolines)
no_warning(c++17-extensions) # these warnings are not enabled by default
# TODO: these warnings are not enabled by default, but we consider them as useful and good to enable in the future # no_warning(name-of-warning)
no_warning(implicit-int-conversion) no_warning(deprecated-comma-subscript)
no_warning(implicit-float-conversion) no_warning(comma-subscript)
no_warning(unused-member-function) no_warning(ambiguous-reversed-operator)
no_warning(old-style-cast) no_warning(restrict)
no_warning(non-virtual-dtor) no_warning(free-nonheap-object)
no_warning(float-conversion) if(CMAKE_CXX_COMPILER_ID MATCHES "GNU")
no_warning(sign-conversion) no_warning(stringop-overflow)
no_warning(shorten-64-to-32) endif()
no_warning(padded)
no_warning(missing-noreturn)

View File

@ -1,67 +0,0 @@
FROM debian:bullseye-slim as builder
ARG DOCKER_TAG
ARG BUILD_CONCURRENCY
RUN mkdir -p /src && mkdir -p /opt
RUN apt-get update && \
apt-get -y --no-install-recommends install ca-certificates cmake make git gcc g++ libbz2-dev libxml2-dev wget \
libzip-dev libboost1.74-all-dev lua5.4 liblua5.4-dev pkg-config -o APT::Install-Suggests=0 -o APT::Install-Recommends=0
RUN NPROC=${BUILD_CONCURRENCY:-$(nproc)} && \
ldconfig /usr/local/lib && \
git clone --branch v2021.3.0 --single-branch https://github.com/oneapi-src/oneTBB.git && \
cd oneTBB && \
mkdir build && \
cd build && \
cmake -DTBB_TEST=OFF -DCMAKE_BUILD_TYPE=Release .. && \
cmake --build . && \
cmake --install .
COPY . /src
WORKDIR /src
RUN NPROC=${BUILD_CONCURRENCY:-$(nproc)} && \
echo "Building OSRM ${DOCKER_TAG}" && \
git show --format="%H" | head -n1 > /opt/OSRM_GITSHA && \
echo "Building OSRM gitsha $(cat /opt/OSRM_GITSHA)" && \
mkdir -p build && \
cd build && \
BUILD_TYPE="Release" && \
ENABLE_ASSERTIONS="Off" && \
BUILD_TOOLS="Off" && \
case ${DOCKER_TAG} in *"-debug"*) BUILD_TYPE="Debug";; esac && \
case ${DOCKER_TAG} in *"-assertions"*) BUILD_TYPE="RelWithDebInfo" && ENABLE_ASSERTIONS="On" && BUILD_TOOLS="On";; esac && \
echo "Building ${BUILD_TYPE} with ENABLE_ASSERTIONS=${ENABLE_ASSERTIONS} BUILD_TOOLS=${BUILD_TOOLS}" && \
cmake .. -DCMAKE_BUILD_TYPE=${BUILD_TYPE} -DENABLE_ASSERTIONS=${ENABLE_ASSERTIONS} -DBUILD_TOOLS=${BUILD_TOOLS} -DENABLE_LTO=On && \
make -j${NPROC} install && \
cd ../profiles && \
cp -r * /opt && \
strip /usr/local/bin/* && \
rm -rf /src
# Multistage build to reduce image size - https://docs.docker.com/engine/userguide/eng-image/multistage-build/#use-multi-stage-builds
# Only the content below ends up in the image, this helps remove /src from the image (which is large)
FROM debian:bullseye-slim as runstage
COPY --from=builder /usr/local /usr/local
COPY --from=builder /opt /opt
RUN apt-get update && \
apt-get install -y --no-install-recommends libboost-program-options1.74.0 libboost-regex1.74.0 \
libboost-date-time1.74.0 libboost-chrono1.74.0 libboost-filesystem1.74.0 \
libboost-iostreams1.74.0 libboost-system1.74.0 libboost-thread1.74.0 \
expat liblua5.4-0 && \
rm -rf /var/lib/apt/lists/* && \
# add /usr/local/lib to ldconfig to allow loading libraries from there
ldconfig /usr/local/lib
RUN /usr/local/bin/osrm-extract --help && \
/usr/local/bin/osrm-routed --help && \
/usr/local/bin/osrm-contract --help && \
/usr/local/bin/osrm-partition --help && \
/usr/local/bin/osrm-customize --help
WORKDIR /opt
EXPOSE 5000

1
docker/Dockerfile Symbolic link
View File

@ -0,0 +1 @@
Dockerfile-debian

79
docker/Dockerfile-alpine Normal file
View File

@ -0,0 +1,79 @@
FROM alpine:3.21.2 AS alpine-mimalloc
RUN apk update && \
apk upgrade && \
apk add --no-cache \
boost-iostreams \
boost-program_options \
boost-thread \
mimalloc
ENV LD_PRELOAD=/usr/lib/libmimalloc.so.2
ENV MIMALLOC_LARGE_OS_PAGES=1
FROM alpine-mimalloc AS builder
ARG DOCKER_TAG
ARG BUILD_CONCURRENCY
RUN mkdir -p /src /opt && \
apk add --no-cache \
boost-dev \
boost-filesystem \
clang \
cmake \
expat-dev \
git \
libbz2 \
libxml2 \
lua5.4-dev \
make \
onetbb-dev
COPY . /src
WORKDIR /src
RUN NPROC=${BUILD_CONCURRENCY:-$(nproc)} && \
echo "Building OSRM ${DOCKER_TAG}" && \
git show --format="%H" | head -n1 > /opt/OSRM_GITSHA && \
echo "Building OSRM gitsha $(cat /opt/OSRM_GITSHA)" && \
mkdir -p build && \
cd build && \
BUILD_TYPE="Release" && \
ENABLE_ASSERTIONS="Off" && \
BUILD_TOOLS="Off" && \
case ${DOCKER_TAG} in *"-debug"*) BUILD_TYPE="Debug";; esac && \
case ${DOCKER_TAG} in *"-assertions"*) BUILD_TYPE="RelWithDebInfo" && ENABLE_ASSERTIONS="On" && BUILD_TOOLS="On";; esac && \
echo "Building ${BUILD_TYPE} with ENABLE_ASSERTIONS=${ENABLE_ASSERTIONS} BUILD_TOOLS=${BUILD_TOOLS}" && \
cmake .. -DCMAKE_BUILD_TYPE=${BUILD_TYPE} -DENABLE_ASSERTIONS=${ENABLE_ASSERTIONS} -DBUILD_TOOLS=${BUILD_TOOLS} -DENABLE_LTO=OFF && \
make -j${NPROC} install && \
cd ../profiles && \
cp -r * /opt && \
strip /usr/local/bin/* && \
rm -rf /src
# Multistage build to reduce image size - https://docs.docker.com/build/building/multi-stage/#use-multi-stage-builds
# Only the content below ends up in the image, this helps remove /src from the image (which is large)
FROM alpine-mimalloc AS runstage
COPY --from=builder /usr/local /usr/local
COPY --from=builder /opt /opt
RUN apk add --no-cache \
boost-date_time \
expat \
lua5.4 \
onetbb && \
ldconfig /usr/local/lib
RUN /usr/local/bin/osrm-extract --help && \
/usr/local/bin/osrm-routed --help && \
/usr/local/bin/osrm-contract --help && \
/usr/local/bin/osrm-partition --help && \
/usr/local/bin/osrm-customize --help
WORKDIR /opt
EXPOSE 5000

76
docker/Dockerfile-debian Normal file
View File

@ -0,0 +1,76 @@
FROM debian:bookworm-slim AS builder
ARG DOCKER_TAG
ARG BUILD_CONCURRENCY
RUN mkdir -p /src /opt && \
apt-get update && \
apt-get -y --no-install-recommends --no-install-suggests install \
ca-certificates \
cmake \
g++ \
gcc \
git \
libboost1.81-all-dev \
libbz2-dev \
liblua5.4-dev \
libtbb-dev \
libxml2-dev \
libzip-dev \
lua5.4 \
make \
pkg-config
COPY . /src
WORKDIR /src
RUN NPROC=${BUILD_CONCURRENCY:-$(nproc)} && \
export CXXFLAGS="-Wno-array-bounds -Wno-uninitialized -Wno-stringop-overflow" && \
echo "Building OSRM ${DOCKER_TAG}" && \
git show --format="%H" | head -n1 > /opt/OSRM_GITSHA && \
echo "Building OSRM gitsha $(cat /opt/OSRM_GITSHA)" && \
mkdir -p build && \
cd build && \
BUILD_TYPE="Release" && \
ENABLE_ASSERTIONS="Off" && \
BUILD_TOOLS="Off" && \
case ${DOCKER_TAG} in *"-debug"*) BUILD_TYPE="Debug";; esac && \
case ${DOCKER_TAG} in *"-assertions"*) BUILD_TYPE="RelWithDebInfo" && ENABLE_ASSERTIONS="On" && BUILD_TOOLS="On";; esac && \
echo "Building ${BUILD_TYPE} with ENABLE_ASSERTIONS=${ENABLE_ASSERTIONS} BUILD_TOOLS=${BUILD_TOOLS}" && \
cmake .. -DCMAKE_BUILD_TYPE=${BUILD_TYPE} -DENABLE_ASSERTIONS=${ENABLE_ASSERTIONS} -DBUILD_TOOLS=${BUILD_TOOLS} -DENABLE_LTO=On && \
make -j${NPROC} install && \
cd ../profiles && \
cp -r * /opt && \
strip /usr/local/bin/* && \
rm -rf /src
# Multistage build to reduce image size - https://docs.docker.com/build/building/multi-stage/#use-multi-stage-builds
# Only the content below ends up in the image, this helps remove /src from the image (which is large)
FROM debian:bookworm-slim AS runstage
COPY --from=builder /usr/local /usr/local
COPY --from=builder /opt /opt
RUN apt-get update && \
apt-get install -y --no-install-recommends --no-install-suggests \
expat \
libboost-date-time1.81.0 \
libboost-iostreams1.81.0 \
libboost-program-options1.81.0 \
libboost-thread1.81.0 \
liblua5.4-0 \
libtbb12 && \
rm -rf /var/lib/apt/lists/* && \
# Add /usr/local/lib to ldconfig to allow loading libraries from there
ldconfig /usr/local/lib
RUN /usr/local/bin/osrm-extract --help && \
/usr/local/bin/osrm-routed --help && \
/usr/local/bin/osrm-contract --help && \
/usr/local/bin/osrm-partition --help && \
/usr/local/bin/osrm-customize --help
WORKDIR /opt
EXPOSE 5000

6
docker/hooks/build Normal file → Executable file
View File

@ -6,4 +6,8 @@
# ensure that "COPY . /src" is referring to the repo root, not the directory # ensure that "COPY . /src" is referring to the repo root, not the directory
# that contains the Dockerfile. # that contains the Dockerfile.
# This script gets executed with a pwd of wherever the Dockerfile is. # This script gets executed with a pwd of wherever the Dockerfile is.
docker build --build-arg BUILD_CONCURRENCY=${CONCURRENCY:-1} --build-arg DOCKER_TAG=${DOCKER_TAG} -t $IMAGE_NAME -f Dockerfile ..
DOCKER_BUILD="docker build --build-arg BUILD_CONCURRENCY=${CONCURRENCY} --build-arg DOCKER_TAG=${DOCKER_TAG:?unset} -t ${IMAGE_NAME:?unset} -f"
$DOCKER_BUILD Dockerfile ..
$DOCKER_BUILD Dockerfile-alpine ..

View File

@ -21,7 +21,7 @@ var osrm = new OSRM('network.osrm');
**Parameters** **Parameters**
- `options` **([Object](https://developer.mozilla.org/docs/Web/JavaScript/Reference/Global_Objects/Object) \| [String](https://developer.mozilla.org/docs/Web/JavaScript/Reference/Global_Objects/String))** Options for creating an OSRM object or string to the `.osrm` file. (optional, default `{shared_memory:true}`) - `options` **([Object](https://developer.mozilla.org/docs/Web/JavaScript/Reference/Global_Objects/Object) \| [String](https://developer.mozilla.org/docs/Web/JavaScript/Reference/Global_Objects/String))** Options for creating an OSRM object or string to the `.osrm` file. (optional, default `{shared_memory:true}`)
- `options.algorithm` **[String](https://developer.mozilla.org/docs/Web/JavaScript/Reference/Global_Objects/String)?** The algorithm to use for routing. Can be 'CH', 'CoreCH' or 'MLD'. Default is 'CH'. - `options.algorithm` **[String](https://developer.mozilla.org/docs/Web/JavaScript/Reference/Global_Objects/String)?** The algorithm to use for routing. Can be 'CH', or 'MLD'. Default is 'CH'.
Make sure you prepared the dataset with the correct toolchain. Make sure you prepared the dataset with the correct toolchain.
- `options.shared_memory` **[Boolean](https://developer.mozilla.org/docs/Web/JavaScript/Reference/Global_Objects/Boolean)?** Connects to the persistent shared memory datastore. - `options.shared_memory` **[Boolean](https://developer.mozilla.org/docs/Web/JavaScript/Reference/Global_Objects/Boolean)?** Connects to the persistent shared memory datastore.
This requires you to run `osrm-datastore` prior to creating an `OSRM` object. This requires you to run `osrm-datastore` prior to creating an `OSRM` object.

View File

@ -57,15 +57,15 @@ int main(int argc, const char *argv[])
// Execute routing request, this does the heavy lifting // Execute routing request, this does the heavy lifting
const auto status = osrm.Route(params, result); const auto status = osrm.Route(params, result);
auto &json_result = result.get<json::Object>(); auto &json_result = std::get<json::Object>(result);
if (status == Status::Ok) if (status == Status::Ok)
{ {
auto &routes = json_result.values["routes"].get<json::Array>(); auto &routes = std::get<json::Array>(json_result.values["routes"]);
// Let's just use the first route // Let's just use the first route
auto &route = routes.values.at(0).get<json::Object>(); auto &route = std::get<json::Object>(routes.values.at(0));
const auto distance = route.values["distance"].get<json::Number>().value; const auto distance = std::get<json::Number>(route.values["distance"]).value;
const auto duration = route.values["duration"].get<json::Number>().value; const auto duration = std::get<json::Number>(route.values["duration"]).value;
// Warn users if extract does not contain the default coordinates from above // Warn users if extract does not contain the default coordinates from above
if (distance == 0 || duration == 0) if (distance == 0 || duration == 0)
@ -80,8 +80,8 @@ int main(int argc, const char *argv[])
} }
else if (status == Status::Error) else if (status == Status::Error)
{ {
const auto code = json_result.values["code"].get<json::String>().value; const auto code = std::get<json::String>(json_result.values["code"]).value;
const auto message = json_result.values["message"].get<json::String>().value; const auto message = std::get<json::String>(json_result.values["message"]).value;
std::cout << "Code: " << code << "\n"; std::cout << "Code: " << code << "\n";
std::cout << "Message: " << code << "\n"; std::cout << "Message: " << code << "\n";

View File

@ -26,7 +26,15 @@ Feature: Foot - Access tags on ways
| motorway | no | | | | motorway | no | | |
| motorway | no | yes | x | | motorway | no | yes | x |
| motorway | no | no | | | motorway | no | no | |
| platform | | | x |
| platform | | yes | x |
| platform | | no | |
| platform | yes | | x |
| platform | yes | yes | x |
| platform | yes | no | |
| platform | no | | |
| platform | no | yes | x |
| platform | no | no | |
Scenario: Foot - Overwriting implied acccess on ways Scenario: Foot - Overwriting implied acccess on ways
Then routability should be Then routability should be

View File

@ -1061,7 +1061,7 @@ Feature: Collapse
# i # i
# """ # """
And the node locations Given the node locations
| node | lat | lon | #id | | node | lat | lon | #id |
| a | -33.9644254 | 151.1378673 | 33226063 | | a | -33.9644254 | 151.1378673 | 33226063 |
| b | -33.9644373 | 151.1377172 | 1072787030 | | b | -33.9644373 | 151.1377172 | 1072787030 |

View File

@ -9,7 +9,7 @@ Feature: Basic Roundabout
""" """
Scenario: Roundabout exit counting for left sided driving Scenario: Roundabout exit counting for left sided driving
And a grid size of 10 meters Given a grid size of 10 meters
And the node map And the node map
""" """
a a
@ -33,7 +33,7 @@ Feature: Basic Roundabout
| a,h | ab,gh,gh | depart,roundabout turn right exit-3,arrive | | a,h | ab,gh,gh | depart,roundabout turn right exit-3,arrive |
Scenario: Mixed Entry and Exit Scenario: Mixed Entry and Exit
And a grid size of 10 meters Given a grid size of 10 meters
And the node map And the node map
""" """
c a c a

View File

@ -1,44 +0,0 @@
@prepare @options @help
Feature: osrm-contract command line options: help
Scenario: osrm-contract - Help should be shown when no options are passed
When I try to run "osrm-contract"
Then stderr should be empty
And stdout should contain /osrm-contract(.exe)? <input.osrm> \[options\]:/
And stdout should contain "Options:"
And stdout should contain "--version"
And stdout should contain "--help"
And stdout should contain "--verbosity"
And stdout should contain "Configuration:"
And stdout should contain "--threads"
And stdout should contain "--core"
And stdout should contain "--segment-speed-file"
And it should exit with an error
Scenario: osrm-contract - Help, short
When I run "osrm-contract -h"
Then stderr should be empty
And stdout should contain /osrm-contract(.exe)? <input.osrm> \[options\]:/
And stdout should contain "Options:"
And stdout should contain "--version"
And stdout should contain "--help"
And stdout should contain "--verbosity"
And stdout should contain "Configuration:"
And stdout should contain "--threads"
And stdout should contain "--core"
And stdout should contain "--segment-speed-file"
And it should exit successfully
Scenario: osrm-contract - Help, long
When I run "osrm-contract --help"
Then stderr should be empty
And stdout should contain /osrm-contract(.exe)? <input.osrm> \[options\]:/
And stdout should contain "Options:"
And stdout should contain "--version"
And stdout should contain "--help"
And stdout should contain "--verbosity"
And stdout should contain "Configuration:"
And stdout should contain "--threads"
And stdout should contain "--core"
And stdout should contain "--segment-speed-file"
And it should exit successfully

View File

@ -1,38 +0,0 @@
@contract @options @help
Feature: osrm-customize command line options: help
Scenario: osrm-customize - Help should be shown when no options are passed
When I try to run "osrm-customize"
Then stderr should be empty
And stdout should contain /osrm-customize(.exe)? <input.osrm> \[options\]:/
And stdout should contain "Options:"
And stdout should contain "--version"
And stdout should contain "--help"
And stdout should contain "--verbosity"
And stdout should contain "Configuration:"
And stdout should contain "--threads"
And it should exit with an error
Scenario: osrm-customize - Help, short
When I run "osrm-customize -h"
Then stderr should be empty
And stdout should contain /osrm-customize(.exe)? <input.osrm> \[options\]:/
And stdout should contain "Options:"
And stdout should contain "--version"
And stdout should contain "--help"
And stdout should contain "--verbosity"
And stdout should contain "Configuration:"
And stdout should contain "--threads"
And it should exit successfully
Scenario: osrm-customize - Help, long
When I run "osrm-customize --help"
Then stderr should be empty
And stdout should contain /osrm-customize(.exe)? <input.osrm> \[options\]:/
And stdout should contain "Options:"
And stdout should contain "--version"
And stdout should contain "--help"
And stdout should contain "--verbosity"
And stdout should contain "Configuration:"
And stdout should contain "--threads"
And it should exit successfully

View File

@ -33,10 +33,6 @@ Feature: osrm-datastore command line options
When I try to run "osrm-datastore {processed_file} --dataset-name cucumber/only_metric_test --only-metric" When I try to run "osrm-datastore {processed_file} --dataset-name cucumber/only_metric_test --only-metric"
Then it should exit successfully Then it should exit successfully
Scenario: osrm-datastore - Displaying help should work
When I try to run "osrm-datastore {processed_file} --help"
Then it should exit successfully
Scenario: osrm-datastore - Errors on invalid path Scenario: osrm-datastore - Errors on invalid path
When I try to run "osrm-datastore invalid_path.osrm" When I try to run "osrm-datastore invalid_path.osrm"
Then stderr should contain "[error] Config contains invalid file paths." Then stderr should contain "[error] Config contains invalid file paths."

View File

@ -1,47 +0,0 @@
@extract @options @help
Feature: osrm-extract command line options: help
Background:
Given the profile "testbot"
Scenario: osrm-extract - Help should be shown when no options are passed
When I run "osrm-extract"
Then stderr should be empty
And stdout should contain /osrm-extract(.exe)? <input.osm/.osm.bz2/.osm.pbf> \[options\]:/
And stdout should contain "Options:"
And stdout should contain "--version"
And stdout should contain "--help"
And stdout should contain "--verbosity"
And stdout should contain "Configuration:"
And stdout should contain "--profile"
And stdout should contain "--threads"
And stdout should contain "--small-component-size"
And it should exit successfully
Scenario: osrm-extract - Help, short
When I run "osrm-extract -h"
Then stderr should be empty
And stdout should contain /osrm-extract(.exe)? <input.osm/.osm.bz2/.osm.pbf> \[options\]:/
And stdout should contain "Options:"
And stdout should contain "--version"
And stdout should contain "--help"
And stdout should contain "--verbosity"
And stdout should contain "Configuration:"
And stdout should contain "--profile"
And stdout should contain "--threads"
And stdout should contain "--small-component-size"
And it should exit successfully
Scenario: osrm-extract - Help, long
When I run "osrm-extract --help"
Then stderr should be empty
And stdout should contain /osrm-extract(.exe)? <input.osm/.osm.bz2/.osm.pbf> \[options\]:/
And stdout should contain "Options:"
And stdout should contain "--version"
And stdout should contain "--help"
And stdout should contain "--verbosity"
And stdout should contain "Configuration:"
And stdout should contain "--profile"
And stdout should contain "--threads"
And stdout should contain "--small-component-size"
And it should exit successfully

View File

@ -1,53 +0,0 @@
@partition @options @help
Feature: osrm-partition command line options: help
Scenario: osrm-partition - Help should be shown when no options are passed
When I try to run "osrm-partition"
Then stderr should be empty
And stdout should contain /osrm-partition(.exe)? <input.osrm> \[options\]:/
And stdout should contain "Options:"
And stdout should contain "--version"
And stdout should contain "--help"
And stdout should contain "--verbosity"
And stdout should contain "Configuration:"
And stdout should contain "--threads"
And stdout should contain "--balance"
And stdout should contain "--boundary"
And stdout should contain "--optimizing-cuts"
And stdout should contain "--small-component-size"
And stdout should contain "--max-cell-sizes"
And it should exit with an error
Scenario: osrm-partition - Help, short
When I run "osrm-partition -h"
Then stderr should be empty
And stdout should contain /osrm-partition(.exe)? <input.osrm> \[options\]:/
And stdout should contain "Options:"
And stdout should contain "--version"
And stdout should contain "--help"
And stdout should contain "--verbosity"
And stdout should contain "Configuration:"
And stdout should contain "--threads"
And stdout should contain "--balance"
And stdout should contain "--boundary"
And stdout should contain "--optimizing-cuts"
And stdout should contain "--small-component-size"
And stdout should contain "--max-cell-sizes"
And it should exit successfully
Scenario: osrm-partition - Help, long
When I run "osrm-partition --help"
Then stderr should be empty
And stdout should contain /osrm-partition(.exe)? <input.osrm> \[options\]:/
And stdout should contain "Options:"
And stdout should contain "--version"
And stdout should contain "--help"
And stdout should contain "--verbosity"
And stdout should contain "Configuration:"
And stdout should contain "--threads"
And stdout should contain "--balance"
And stdout should contain "--boundary"
And stdout should contain "--optimizing-cuts"
And stdout should contain "--small-component-size"
And stdout should contain "--max-cell-sizes"
And it should exit successfully

View File

@ -1,71 +0,0 @@
@routed @options @help
Feature: osrm-routed command line options: help
Background:
Given the profile "testbot"
Scenario: osrm-routed - Help should be shown when no options are passed
When I run "osrm-routed"
Then stderr should be empty
And stdout should contain /osrm-routed(.exe)? <base.osrm> \[<options>\]:/
And stdout should contain "Options:"
And stdout should contain "--version"
And stdout should contain "--help"
And stdout should contain "--verbosity"
And stdout should contain "--trial"
And stdout should contain "Configuration:"
And stdout should contain "--ip"
And stdout should contain "--port"
And stdout should contain "--threads"
And stdout should contain "--shared-memory"
And stdout should contain "--max-viaroute-size"
And stdout should contain "--max-trip-size"
And stdout should contain "--max-table-size"
And stdout should contain "--max-matching-size"
And stdout should contain "--default-radius"
And stdout should contain "--keepalive-timeout"
And it should exit successfully
Scenario: osrm-routed - Help, short
When I run "osrm-routed -h"
Then stderr should be empty
And stdout should contain /osrm-routed(.exe)? <base.osrm> \[<options>\]:/
And stdout should contain "Options:"
And stdout should contain "--version"
And stdout should contain "--help"
And stdout should contain "--verbosity"
And stdout should contain "--trial"
And stdout should contain "Configuration:"
And stdout should contain "--ip"
And stdout should contain "--port"
And stdout should contain "--threads"
And stdout should contain "--shared-memory"
And stdout should contain "--max-viaroute-size"
And stdout should contain "--max-trip-size"
And stdout should contain "--max-table-size"
And stdout should contain "--max-matching-size"
And stdout should contain "--default-radius"
And stdout should contain "--keepalive-timeout"
And it should exit successfully
Scenario: osrm-routed - Help, long
When I run "osrm-routed --help"
Then stderr should be empty
And stdout should contain /osrm-routed(.exe)? <base.osrm> \[<options>\]:/
And stdout should contain "Options:"
And stdout should contain "--version"
And stdout should contain "--help"
And stdout should contain "--verbosity"
And stdout should contain "--trial"
And stdout should contain "Configuration:"
And stdout should contain "--ip"
And stdout should contain "--port"
And stdout should contain "--threads"
And stdout should contain "--shared-memory"
And stdout should contain "--max-trip-size"
And stdout should contain "--max-table-size"
And stdout should contain "--max-table-size"
And stdout should contain "--max-matching-size"
And stdout should contain "--default-radius"
And stdout should contain "--keepalive-timeout"
And it should exit successfully

View File

@ -42,7 +42,7 @@ module.exports = function () {
this.OSRM_PORT = process.env.OSRM_PORT && parseInt(process.env.OSRM_PORT) || 5000; this.OSRM_PORT = process.env.OSRM_PORT && parseInt(process.env.OSRM_PORT) || 5000;
this.OSRM_IP = process.env.OSRM_IP || '127.0.0.1'; this.OSRM_IP = process.env.OSRM_IP || '127.0.0.1';
this.OSRM_CONNECTION_RETRIES = process.env.OSRM_CONNECTION_RETRIES && parseInt(process.env.OSRM_CONNECTION_RETRIES) || 10; this.OSRM_CONNECTION_RETRIES = process.env.OSRM_CONNECTION_RETRIES && parseInt(process.env.OSRM_CONNECTION_RETRIES) || 10;
this.OSRM_CONNECTION_EXP_BACKOFF_COEF = process.env.OSRM_CONNECTION_EXP_BACKOFF_COEF && parseFloat(process.env.OSRM_CONNECTION_EXP_BACKOFF_COEF) || 1.0; this.OSRM_CONNECTION_EXP_BACKOFF_COEF = process.env.OSRM_CONNECTION_EXP_BACKOFF_COEF && parseFloat(process.env.OSRM_CONNECTION_EXP_BACKOFF_COEF) || 1.1;
this.HOST = `http://${this.OSRM_IP}:${this.OSRM_PORT}`; this.HOST = `http://${this.OSRM_IP}:${this.OSRM_PORT}`;

View File

@ -75,7 +75,7 @@ Feature: Avoid weird loops caused by rounding errors
@412 @via @412 @via
Scenario: Avoid weird loops 3 Scenario: Avoid weird loops 3
And the node map Given the node map
""" """
a a
b e b e

View File

@ -136,22 +136,6 @@ Feature: Basic Map Matching
| trace | matchings | | trace | matchings |
| abcbd | abbd | | abcbd | abbd |
Scenario: Testbot - Map matching with core factor
Given the contract extra arguments "--core 0.8"
Given the node map
"""
a b c d
e
"""
And the ways
| nodes | oneway |
| abcd | no |
When I match I should get
| trace | timestamps | matchings |
| abcd | 0 1 2 3 | abcd |
Scenario: Testbot - Map matching with small distortion Scenario: Testbot - Map matching with small distortion
Given the node map Given the node map
""" """

View File

@ -401,12 +401,12 @@ Feature: Snapping at intersections
Given the extract extra arguments "--small-component-size=4" Given the extract extra arguments "--small-component-size=4"
And the ways And the ways
| nodes | oneway | | nodes | oneway | # comment |
| ab | no | | ab | no | |
| bc | no | | bc | no | |
| cd | no | | cd | no | |
| fed | no | | fed | no | |
| bg | yes | # small SCC | bg | yes | small SCC |
And the relations And the relations
| type | way:from | way:to | node:via | restriction | | type | way:from | way:to | node:via | restriction |
@ -437,14 +437,14 @@ Feature: Snapping at intersections
Given the extract extra arguments "--small-component-size=4" Given the extract extra arguments "--small-component-size=4"
And the ways And the ways
| nodes | oneway | | nodes | oneway | # comment |
| ab | no | | ab | no | |
| bc | no | | bc | no | |
| cd | no | | cd | no | |
| fed | no | | fed | no | |
| ghi | no | | ghi | no | |
| jkl | no | | jkl | no | |
| bm | yes | # small SCC | bm | yes | small SCC |
And the relations And the relations
| type | way:from | way:to | node:via | restriction | | type | way:from | way:to | node:via | restriction |

View File

@ -65,32 +65,6 @@ Feature: Via points
| waypoints | route | turns | | waypoints | route | turns |
| 1,2,3 | cd,ac,ab,bd,cd | depart,new name right,new name right,new name right,arrive | | 1,2,3 | cd,ac,ab,bd,cd | depart,new name right,new name right,new name right,arrive |
Scenario: Simple via point with core factor
Given the contract extra arguments "--core 0.8"
Given the node map
"""
a b c d
e f g
h i
j
"""
And the ways
| nodes |
| abcd |
| efg |
| hi |
| be |
| cfh |
| dgij |
When I route I should get
| waypoints | route |
| a,b,c | abcd,abcd,abcd,abcd |
| c,b,a | abcd,abcd,abcd,abcd |
| a,d,j | abcd,abcd,dgij,dgij |
| j,d,a | dgij,dgij,abcd,abcd |
Scenario: Via point at a dead end Scenario: Via point at a dead end
Given the node map Given the node map
""" """

View File

@ -0,0 +1,249 @@
// automatically generated by the FlatBuffers compiler, do not modify
#ifndef FLATBUFFERS_GENERATED_FBRESULT_OSRM_ENGINE_API_FBRESULT_H_
#define FLATBUFFERS_GENERATED_FBRESULT_OSRM_ENGINE_API_FBRESULT_H_
#include "flatbuffers/flatbuffers.h"
// Ensure the included flatbuffers.h is the same version as when this file was
// generated, otherwise it may not be compatible.
static_assert(FLATBUFFERS_VERSION_MAJOR == 24 &&
FLATBUFFERS_VERSION_MINOR == 3 &&
FLATBUFFERS_VERSION_REVISION == 25,
"Non-compatible flatbuffers version included");
#include "route_generated.h"
#include "table_generated.h"
namespace osrm {
namespace engine {
namespace api {
namespace fbresult {
struct Error;
struct ErrorBuilder;
struct FBResult;
struct FBResultBuilder;
struct Error FLATBUFFERS_FINAL_CLASS : private ::flatbuffers::Table {
typedef ErrorBuilder Builder;
enum FlatBuffersVTableOffset FLATBUFFERS_VTABLE_UNDERLYING_TYPE {
VT_CODE = 4,
VT_MESSAGE = 6
};
const ::flatbuffers::String *code() const {
return GetPointer<const ::flatbuffers::String *>(VT_CODE);
}
const ::flatbuffers::String *message() const {
return GetPointer<const ::flatbuffers::String *>(VT_MESSAGE);
}
bool Verify(::flatbuffers::Verifier &verifier) const {
return VerifyTableStart(verifier) &&
VerifyOffset(verifier, VT_CODE) &&
verifier.VerifyString(code()) &&
VerifyOffset(verifier, VT_MESSAGE) &&
verifier.VerifyString(message()) &&
verifier.EndTable();
}
};
struct ErrorBuilder {
typedef Error Table;
::flatbuffers::FlatBufferBuilder &fbb_;
::flatbuffers::uoffset_t start_;
void add_code(::flatbuffers::Offset<::flatbuffers::String> code) {
fbb_.AddOffset(Error::VT_CODE, code);
}
void add_message(::flatbuffers::Offset<::flatbuffers::String> message) {
fbb_.AddOffset(Error::VT_MESSAGE, message);
}
explicit ErrorBuilder(::flatbuffers::FlatBufferBuilder &_fbb)
: fbb_(_fbb) {
start_ = fbb_.StartTable();
}
::flatbuffers::Offset<Error> Finish() {
const auto end = fbb_.EndTable(start_);
auto o = ::flatbuffers::Offset<Error>(end);
return o;
}
};
inline ::flatbuffers::Offset<Error> CreateError(
::flatbuffers::FlatBufferBuilder &_fbb,
::flatbuffers::Offset<::flatbuffers::String> code = 0,
::flatbuffers::Offset<::flatbuffers::String> message = 0) {
ErrorBuilder builder_(_fbb);
builder_.add_message(message);
builder_.add_code(code);
return builder_.Finish();
}
inline ::flatbuffers::Offset<Error> CreateErrorDirect(
::flatbuffers::FlatBufferBuilder &_fbb,
const char *code = nullptr,
const char *message = nullptr) {
auto code__ = code ? _fbb.CreateString(code) : 0;
auto message__ = message ? _fbb.CreateString(message) : 0;
return osrm::engine::api::fbresult::CreateError(
_fbb,
code__,
message__);
}
struct FBResult FLATBUFFERS_FINAL_CLASS : private ::flatbuffers::Table {
typedef FBResultBuilder Builder;
enum FlatBuffersVTableOffset FLATBUFFERS_VTABLE_UNDERLYING_TYPE {
VT_ERROR = 4,
VT_CODE = 6,
VT_DATA_VERSION = 8,
VT_WAYPOINTS = 10,
VT_ROUTES = 12,
VT_TABLE = 14
};
bool error() const {
return GetField<uint8_t>(VT_ERROR, 0) != 0;
}
const osrm::engine::api::fbresult::Error *code() const {
return GetPointer<const osrm::engine::api::fbresult::Error *>(VT_CODE);
}
const ::flatbuffers::String *data_version() const {
return GetPointer<const ::flatbuffers::String *>(VT_DATA_VERSION);
}
const ::flatbuffers::Vector<::flatbuffers::Offset<osrm::engine::api::fbresult::Waypoint>> *waypoints() const {
return GetPointer<const ::flatbuffers::Vector<::flatbuffers::Offset<osrm::engine::api::fbresult::Waypoint>> *>(VT_WAYPOINTS);
}
const ::flatbuffers::Vector<::flatbuffers::Offset<osrm::engine::api::fbresult::RouteObject>> *routes() const {
return GetPointer<const ::flatbuffers::Vector<::flatbuffers::Offset<osrm::engine::api::fbresult::RouteObject>> *>(VT_ROUTES);
}
const osrm::engine::api::fbresult::TableResult *table() const {
return GetPointer<const osrm::engine::api::fbresult::TableResult *>(VT_TABLE);
}
bool Verify(::flatbuffers::Verifier &verifier) const {
return VerifyTableStart(verifier) &&
VerifyField<uint8_t>(verifier, VT_ERROR, 1) &&
VerifyOffset(verifier, VT_CODE) &&
verifier.VerifyTable(code()) &&
VerifyOffset(verifier, VT_DATA_VERSION) &&
verifier.VerifyString(data_version()) &&
VerifyOffset(verifier, VT_WAYPOINTS) &&
verifier.VerifyVector(waypoints()) &&
verifier.VerifyVectorOfTables(waypoints()) &&
VerifyOffset(verifier, VT_ROUTES) &&
verifier.VerifyVector(routes()) &&
verifier.VerifyVectorOfTables(routes()) &&
VerifyOffset(verifier, VT_TABLE) &&
verifier.VerifyTable(table()) &&
verifier.EndTable();
}
};
struct FBResultBuilder {
typedef FBResult Table;
::flatbuffers::FlatBufferBuilder &fbb_;
::flatbuffers::uoffset_t start_;
void add_error(bool error) {
fbb_.AddElement<uint8_t>(FBResult::VT_ERROR, static_cast<uint8_t>(error), 0);
}
void add_code(::flatbuffers::Offset<osrm::engine::api::fbresult::Error> code) {
fbb_.AddOffset(FBResult::VT_CODE, code);
}
void add_data_version(::flatbuffers::Offset<::flatbuffers::String> data_version) {
fbb_.AddOffset(FBResult::VT_DATA_VERSION, data_version);
}
void add_waypoints(::flatbuffers::Offset<::flatbuffers::Vector<::flatbuffers::Offset<osrm::engine::api::fbresult::Waypoint>>> waypoints) {
fbb_.AddOffset(FBResult::VT_WAYPOINTS, waypoints);
}
void add_routes(::flatbuffers::Offset<::flatbuffers::Vector<::flatbuffers::Offset<osrm::engine::api::fbresult::RouteObject>>> routes) {
fbb_.AddOffset(FBResult::VT_ROUTES, routes);
}
void add_table(::flatbuffers::Offset<osrm::engine::api::fbresult::TableResult> table) {
fbb_.AddOffset(FBResult::VT_TABLE, table);
}
explicit FBResultBuilder(::flatbuffers::FlatBufferBuilder &_fbb)
: fbb_(_fbb) {
start_ = fbb_.StartTable();
}
::flatbuffers::Offset<FBResult> Finish() {
const auto end = fbb_.EndTable(start_);
auto o = ::flatbuffers::Offset<FBResult>(end);
return o;
}
};
inline ::flatbuffers::Offset<FBResult> CreateFBResult(
::flatbuffers::FlatBufferBuilder &_fbb,
bool error = false,
::flatbuffers::Offset<osrm::engine::api::fbresult::Error> code = 0,
::flatbuffers::Offset<::flatbuffers::String> data_version = 0,
::flatbuffers::Offset<::flatbuffers::Vector<::flatbuffers::Offset<osrm::engine::api::fbresult::Waypoint>>> waypoints = 0,
::flatbuffers::Offset<::flatbuffers::Vector<::flatbuffers::Offset<osrm::engine::api::fbresult::RouteObject>>> routes = 0,
::flatbuffers::Offset<osrm::engine::api::fbresult::TableResult> table = 0) {
FBResultBuilder builder_(_fbb);
builder_.add_table(table);
builder_.add_routes(routes);
builder_.add_waypoints(waypoints);
builder_.add_data_version(data_version);
builder_.add_code(code);
builder_.add_error(error);
return builder_.Finish();
}
inline ::flatbuffers::Offset<FBResult> CreateFBResultDirect(
::flatbuffers::FlatBufferBuilder &_fbb,
bool error = false,
::flatbuffers::Offset<osrm::engine::api::fbresult::Error> code = 0,
const char *data_version = nullptr,
const std::vector<::flatbuffers::Offset<osrm::engine::api::fbresult::Waypoint>> *waypoints = nullptr,
const std::vector<::flatbuffers::Offset<osrm::engine::api::fbresult::RouteObject>> *routes = nullptr,
::flatbuffers::Offset<osrm::engine::api::fbresult::TableResult> table = 0) {
auto data_version__ = data_version ? _fbb.CreateString(data_version) : 0;
auto waypoints__ = waypoints ? _fbb.CreateVector<::flatbuffers::Offset<osrm::engine::api::fbresult::Waypoint>>(*waypoints) : 0;
auto routes__ = routes ? _fbb.CreateVector<::flatbuffers::Offset<osrm::engine::api::fbresult::RouteObject>>(*routes) : 0;
return osrm::engine::api::fbresult::CreateFBResult(
_fbb,
error,
code,
data_version__,
waypoints__,
routes__,
table);
}
inline const osrm::engine::api::fbresult::FBResult *GetFBResult(const void *buf) {
return ::flatbuffers::GetRoot<osrm::engine::api::fbresult::FBResult>(buf);
}
inline const osrm::engine::api::fbresult::FBResult *GetSizePrefixedFBResult(const void *buf) {
return ::flatbuffers::GetSizePrefixedRoot<osrm::engine::api::fbresult::FBResult>(buf);
}
inline bool VerifyFBResultBuffer(
::flatbuffers::Verifier &verifier) {
return verifier.VerifyBuffer<osrm::engine::api::fbresult::FBResult>(nullptr);
}
inline bool VerifySizePrefixedFBResultBuffer(
::flatbuffers::Verifier &verifier) {
return verifier.VerifySizePrefixedBuffer<osrm::engine::api::fbresult::FBResult>(nullptr);
}
inline void FinishFBResultBuffer(
::flatbuffers::FlatBufferBuilder &fbb,
::flatbuffers::Offset<osrm::engine::api::fbresult::FBResult> root) {
fbb.Finish(root);
}
inline void FinishSizePrefixedFBResultBuffer(
::flatbuffers::FlatBufferBuilder &fbb,
::flatbuffers::Offset<osrm::engine::api::fbresult::FBResult> root) {
fbb.FinishSizePrefixed(root);
}
} // namespace fbresult
} // namespace api
} // namespace engine
} // namespace osrm
#endif // FLATBUFFERS_GENERATED_FBRESULT_OSRM_ENGINE_API_FBRESULT_H_

View File

@ -0,0 +1,51 @@
// automatically generated by the FlatBuffers compiler, do not modify
#ifndef FLATBUFFERS_GENERATED_POSITION_OSRM_ENGINE_API_FBRESULT_H_
#define FLATBUFFERS_GENERATED_POSITION_OSRM_ENGINE_API_FBRESULT_H_
#include "flatbuffers/flatbuffers.h"
// Ensure the included flatbuffers.h is the same version as when this file was
// generated, otherwise it may not be compatible.
static_assert(FLATBUFFERS_VERSION_MAJOR == 24 &&
FLATBUFFERS_VERSION_MINOR == 3 &&
FLATBUFFERS_VERSION_REVISION == 25,
"Non-compatible flatbuffers version included");
namespace osrm {
namespace engine {
namespace api {
namespace fbresult {
struct Position;
FLATBUFFERS_MANUALLY_ALIGNED_STRUCT(4) Position FLATBUFFERS_FINAL_CLASS {
private:
float longitude_;
float latitude_;
public:
Position()
: longitude_(0),
latitude_(0) {
}
Position(float _longitude, float _latitude)
: longitude_(::flatbuffers::EndianScalar(_longitude)),
latitude_(::flatbuffers::EndianScalar(_latitude)) {
}
float longitude() const {
return ::flatbuffers::EndianScalar(longitude_);
}
float latitude() const {
return ::flatbuffers::EndianScalar(latitude_);
}
};
FLATBUFFERS_STRUCT_END(Position, 8);
} // namespace fbresult
} // namespace api
} // namespace engine
} // namespace osrm
#endif // FLATBUFFERS_GENERATED_POSITION_OSRM_ENGINE_API_FBRESULT_H_

File diff suppressed because it is too large Load Diff

View File

@ -0,0 +1,149 @@
// automatically generated by the FlatBuffers compiler, do not modify
#ifndef FLATBUFFERS_GENERATED_TABLE_OSRM_ENGINE_API_FBRESULT_H_
#define FLATBUFFERS_GENERATED_TABLE_OSRM_ENGINE_API_FBRESULT_H_
#include "flatbuffers/flatbuffers.h"
// Ensure the included flatbuffers.h is the same version as when this file was
// generated, otherwise it may not be compatible.
static_assert(FLATBUFFERS_VERSION_MAJOR == 24 &&
FLATBUFFERS_VERSION_MINOR == 3 &&
FLATBUFFERS_VERSION_REVISION == 25,
"Non-compatible flatbuffers version included");
#include "waypoint_generated.h"
namespace osrm {
namespace engine {
namespace api {
namespace fbresult {
struct TableResult;
struct TableResultBuilder;
struct TableResult FLATBUFFERS_FINAL_CLASS : private ::flatbuffers::Table {
typedef TableResultBuilder Builder;
enum FlatBuffersVTableOffset FLATBUFFERS_VTABLE_UNDERLYING_TYPE {
VT_DURATIONS = 4,
VT_ROWS = 6,
VT_COLS = 8,
VT_DISTANCES = 10,
VT_DESTINATIONS = 12,
VT_FALLBACK_SPEED_CELLS = 14
};
const ::flatbuffers::Vector<float> *durations() const {
return GetPointer<const ::flatbuffers::Vector<float> *>(VT_DURATIONS);
}
uint16_t rows() const {
return GetField<uint16_t>(VT_ROWS, 0);
}
uint16_t cols() const {
return GetField<uint16_t>(VT_COLS, 0);
}
const ::flatbuffers::Vector<float> *distances() const {
return GetPointer<const ::flatbuffers::Vector<float> *>(VT_DISTANCES);
}
const ::flatbuffers::Vector<::flatbuffers::Offset<osrm::engine::api::fbresult::Waypoint>> *destinations() const {
return GetPointer<const ::flatbuffers::Vector<::flatbuffers::Offset<osrm::engine::api::fbresult::Waypoint>> *>(VT_DESTINATIONS);
}
const ::flatbuffers::Vector<uint32_t> *fallback_speed_cells() const {
return GetPointer<const ::flatbuffers::Vector<uint32_t> *>(VT_FALLBACK_SPEED_CELLS);
}
bool Verify(::flatbuffers::Verifier &verifier) const {
return VerifyTableStart(verifier) &&
VerifyOffset(verifier, VT_DURATIONS) &&
verifier.VerifyVector(durations()) &&
VerifyField<uint16_t>(verifier, VT_ROWS, 2) &&
VerifyField<uint16_t>(verifier, VT_COLS, 2) &&
VerifyOffset(verifier, VT_DISTANCES) &&
verifier.VerifyVector(distances()) &&
VerifyOffset(verifier, VT_DESTINATIONS) &&
verifier.VerifyVector(destinations()) &&
verifier.VerifyVectorOfTables(destinations()) &&
VerifyOffset(verifier, VT_FALLBACK_SPEED_CELLS) &&
verifier.VerifyVector(fallback_speed_cells()) &&
verifier.EndTable();
}
};
struct TableResultBuilder {
typedef TableResult Table;
::flatbuffers::FlatBufferBuilder &fbb_;
::flatbuffers::uoffset_t start_;
void add_durations(::flatbuffers::Offset<::flatbuffers::Vector<float>> durations) {
fbb_.AddOffset(TableResult::VT_DURATIONS, durations);
}
void add_rows(uint16_t rows) {
fbb_.AddElement<uint16_t>(TableResult::VT_ROWS, rows, 0);
}
void add_cols(uint16_t cols) {
fbb_.AddElement<uint16_t>(TableResult::VT_COLS, cols, 0);
}
void add_distances(::flatbuffers::Offset<::flatbuffers::Vector<float>> distances) {
fbb_.AddOffset(TableResult::VT_DISTANCES, distances);
}
void add_destinations(::flatbuffers::Offset<::flatbuffers::Vector<::flatbuffers::Offset<osrm::engine::api::fbresult::Waypoint>>> destinations) {
fbb_.AddOffset(TableResult::VT_DESTINATIONS, destinations);
}
void add_fallback_speed_cells(::flatbuffers::Offset<::flatbuffers::Vector<uint32_t>> fallback_speed_cells) {
fbb_.AddOffset(TableResult::VT_FALLBACK_SPEED_CELLS, fallback_speed_cells);
}
explicit TableResultBuilder(::flatbuffers::FlatBufferBuilder &_fbb)
: fbb_(_fbb) {
start_ = fbb_.StartTable();
}
::flatbuffers::Offset<TableResult> Finish() {
const auto end = fbb_.EndTable(start_);
auto o = ::flatbuffers::Offset<TableResult>(end);
return o;
}
};
inline ::flatbuffers::Offset<TableResult> CreateTableResult(
::flatbuffers::FlatBufferBuilder &_fbb,
::flatbuffers::Offset<::flatbuffers::Vector<float>> durations = 0,
uint16_t rows = 0,
uint16_t cols = 0,
::flatbuffers::Offset<::flatbuffers::Vector<float>> distances = 0,
::flatbuffers::Offset<::flatbuffers::Vector<::flatbuffers::Offset<osrm::engine::api::fbresult::Waypoint>>> destinations = 0,
::flatbuffers::Offset<::flatbuffers::Vector<uint32_t>> fallback_speed_cells = 0) {
TableResultBuilder builder_(_fbb);
builder_.add_fallback_speed_cells(fallback_speed_cells);
builder_.add_destinations(destinations);
builder_.add_distances(distances);
builder_.add_durations(durations);
builder_.add_cols(cols);
builder_.add_rows(rows);
return builder_.Finish();
}
inline ::flatbuffers::Offset<TableResult> CreateTableResultDirect(
::flatbuffers::FlatBufferBuilder &_fbb,
const std::vector<float> *durations = nullptr,
uint16_t rows = 0,
uint16_t cols = 0,
const std::vector<float> *distances = nullptr,
const std::vector<::flatbuffers::Offset<osrm::engine::api::fbresult::Waypoint>> *destinations = nullptr,
const std::vector<uint32_t> *fallback_speed_cells = nullptr) {
auto durations__ = durations ? _fbb.CreateVector<float>(*durations) : 0;
auto distances__ = distances ? _fbb.CreateVector<float>(*distances) : 0;
auto destinations__ = destinations ? _fbb.CreateVector<::flatbuffers::Offset<osrm::engine::api::fbresult::Waypoint>>(*destinations) : 0;
auto fallback_speed_cells__ = fallback_speed_cells ? _fbb.CreateVector<uint32_t>(*fallback_speed_cells) : 0;
return osrm::engine::api::fbresult::CreateTableResult(
_fbb,
durations__,
rows,
cols,
distances__,
destinations__,
fallback_speed_cells__);
}
} // namespace fbresult
} // namespace api
} // namespace engine
} // namespace osrm
#endif // FLATBUFFERS_GENERATED_TABLE_OSRM_ENGINE_API_FBRESULT_H_

View File

@ -0,0 +1,205 @@
// automatically generated by the FlatBuffers compiler, do not modify
#ifndef FLATBUFFERS_GENERATED_WAYPOINT_OSRM_ENGINE_API_FBRESULT_H_
#define FLATBUFFERS_GENERATED_WAYPOINT_OSRM_ENGINE_API_FBRESULT_H_
#include "flatbuffers/flatbuffers.h"
// Ensure the included flatbuffers.h is the same version as when this file was
// generated, otherwise it may not be compatible.
static_assert(FLATBUFFERS_VERSION_MAJOR == 24 &&
FLATBUFFERS_VERSION_MINOR == 3 &&
FLATBUFFERS_VERSION_REVISION == 25,
"Non-compatible flatbuffers version included");
#include "position_generated.h"
namespace osrm {
namespace engine {
namespace api {
namespace fbresult {
struct Uint64Pair;
struct Waypoint;
struct WaypointBuilder;
FLATBUFFERS_MANUALLY_ALIGNED_STRUCT(8) Uint64Pair FLATBUFFERS_FINAL_CLASS {
private:
uint64_t first_;
uint64_t second_;
public:
Uint64Pair()
: first_(0),
second_(0) {
}
Uint64Pair(uint64_t _first, uint64_t _second)
: first_(::flatbuffers::EndianScalar(_first)),
second_(::flatbuffers::EndianScalar(_second)) {
}
uint64_t first() const {
return ::flatbuffers::EndianScalar(first_);
}
uint64_t second() const {
return ::flatbuffers::EndianScalar(second_);
}
};
FLATBUFFERS_STRUCT_END(Uint64Pair, 16);
struct Waypoint FLATBUFFERS_FINAL_CLASS : private ::flatbuffers::Table {
typedef WaypointBuilder Builder;
enum FlatBuffersVTableOffset FLATBUFFERS_VTABLE_UNDERLYING_TYPE {
VT_HINT = 4,
VT_DISTANCE = 6,
VT_NAME = 8,
VT_LOCATION = 10,
VT_NODES = 12,
VT_MATCHINGS_INDEX = 14,
VT_WAYPOINT_INDEX = 16,
VT_ALTERNATIVES_COUNT = 18,
VT_TRIPS_INDEX = 20
};
const ::flatbuffers::String *hint() const {
return GetPointer<const ::flatbuffers::String *>(VT_HINT);
}
float distance() const {
return GetField<float>(VT_DISTANCE, 0.0f);
}
const ::flatbuffers::String *name() const {
return GetPointer<const ::flatbuffers::String *>(VT_NAME);
}
const osrm::engine::api::fbresult::Position *location() const {
return GetStruct<const osrm::engine::api::fbresult::Position *>(VT_LOCATION);
}
const osrm::engine::api::fbresult::Uint64Pair *nodes() const {
return GetStruct<const osrm::engine::api::fbresult::Uint64Pair *>(VT_NODES);
}
uint32_t matchings_index() const {
return GetField<uint32_t>(VT_MATCHINGS_INDEX, 0);
}
uint32_t waypoint_index() const {
return GetField<uint32_t>(VT_WAYPOINT_INDEX, 0);
}
uint32_t alternatives_count() const {
return GetField<uint32_t>(VT_ALTERNATIVES_COUNT, 0);
}
uint32_t trips_index() const {
return GetField<uint32_t>(VT_TRIPS_INDEX, 0);
}
bool Verify(::flatbuffers::Verifier &verifier) const {
return VerifyTableStart(verifier) &&
VerifyOffset(verifier, VT_HINT) &&
verifier.VerifyString(hint()) &&
VerifyField<float>(verifier, VT_DISTANCE, 4) &&
VerifyOffset(verifier, VT_NAME) &&
verifier.VerifyString(name()) &&
VerifyField<osrm::engine::api::fbresult::Position>(verifier, VT_LOCATION, 4) &&
VerifyField<osrm::engine::api::fbresult::Uint64Pair>(verifier, VT_NODES, 8) &&
VerifyField<uint32_t>(verifier, VT_MATCHINGS_INDEX, 4) &&
VerifyField<uint32_t>(verifier, VT_WAYPOINT_INDEX, 4) &&
VerifyField<uint32_t>(verifier, VT_ALTERNATIVES_COUNT, 4) &&
VerifyField<uint32_t>(verifier, VT_TRIPS_INDEX, 4) &&
verifier.EndTable();
}
};
struct WaypointBuilder {
typedef Waypoint Table;
::flatbuffers::FlatBufferBuilder &fbb_;
::flatbuffers::uoffset_t start_;
void add_hint(::flatbuffers::Offset<::flatbuffers::String> hint) {
fbb_.AddOffset(Waypoint::VT_HINT, hint);
}
void add_distance(float distance) {
fbb_.AddElement<float>(Waypoint::VT_DISTANCE, distance, 0.0f);
}
void add_name(::flatbuffers::Offset<::flatbuffers::String> name) {
fbb_.AddOffset(Waypoint::VT_NAME, name);
}
void add_location(const osrm::engine::api::fbresult::Position *location) {
fbb_.AddStruct(Waypoint::VT_LOCATION, location);
}
void add_nodes(const osrm::engine::api::fbresult::Uint64Pair *nodes) {
fbb_.AddStruct(Waypoint::VT_NODES, nodes);
}
void add_matchings_index(uint32_t matchings_index) {
fbb_.AddElement<uint32_t>(Waypoint::VT_MATCHINGS_INDEX, matchings_index, 0);
}
void add_waypoint_index(uint32_t waypoint_index) {
fbb_.AddElement<uint32_t>(Waypoint::VT_WAYPOINT_INDEX, waypoint_index, 0);
}
void add_alternatives_count(uint32_t alternatives_count) {
fbb_.AddElement<uint32_t>(Waypoint::VT_ALTERNATIVES_COUNT, alternatives_count, 0);
}
void add_trips_index(uint32_t trips_index) {
fbb_.AddElement<uint32_t>(Waypoint::VT_TRIPS_INDEX, trips_index, 0);
}
explicit WaypointBuilder(::flatbuffers::FlatBufferBuilder &_fbb)
: fbb_(_fbb) {
start_ = fbb_.StartTable();
}
::flatbuffers::Offset<Waypoint> Finish() {
const auto end = fbb_.EndTable(start_);
auto o = ::flatbuffers::Offset<Waypoint>(end);
return o;
}
};
inline ::flatbuffers::Offset<Waypoint> CreateWaypoint(
::flatbuffers::FlatBufferBuilder &_fbb,
::flatbuffers::Offset<::flatbuffers::String> hint = 0,
float distance = 0.0f,
::flatbuffers::Offset<::flatbuffers::String> name = 0,
const osrm::engine::api::fbresult::Position *location = nullptr,
const osrm::engine::api::fbresult::Uint64Pair *nodes = nullptr,
uint32_t matchings_index = 0,
uint32_t waypoint_index = 0,
uint32_t alternatives_count = 0,
uint32_t trips_index = 0) {
WaypointBuilder builder_(_fbb);
builder_.add_trips_index(trips_index);
builder_.add_alternatives_count(alternatives_count);
builder_.add_waypoint_index(waypoint_index);
builder_.add_matchings_index(matchings_index);
builder_.add_nodes(nodes);
builder_.add_location(location);
builder_.add_name(name);
builder_.add_distance(distance);
builder_.add_hint(hint);
return builder_.Finish();
}
inline ::flatbuffers::Offset<Waypoint> CreateWaypointDirect(
::flatbuffers::FlatBufferBuilder &_fbb,
const char *hint = nullptr,
float distance = 0.0f,
const char *name = nullptr,
const osrm::engine::api::fbresult::Position *location = nullptr,
const osrm::engine::api::fbresult::Uint64Pair *nodes = nullptr,
uint32_t matchings_index = 0,
uint32_t waypoint_index = 0,
uint32_t alternatives_count = 0,
uint32_t trips_index = 0) {
auto hint__ = hint ? _fbb.CreateString(hint) : 0;
auto name__ = name ? _fbb.CreateString(name) : 0;
return osrm::engine::api::fbresult::CreateWaypoint(
_fbb,
hint__,
distance,
name__,
location,
nodes,
matchings_index,
waypoint_index,
alternatives_count,
trips_index);
}
} // namespace fbresult
} // namespace api
} // namespace engine
} // namespace osrm
#endif // FLATBUFFERS_GENERATED_WAYPOINT_OSRM_ENGINE_API_FBRESULT_H_

View File

@ -31,8 +31,7 @@ SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
#include "storage/io_config.hpp" #include "storage/io_config.hpp"
#include "updater/updater_config.hpp" #include "updater/updater_config.hpp"
#include <boost/filesystem/path.hpp> #include <filesystem>
#include <string> #include <string>
namespace osrm::contractor namespace osrm::contractor
@ -47,7 +46,7 @@ struct ContractorConfig final : storage::IOConfig
} }
// Infer the output names from the path of the .osrm file // Infer the output names from the path of the .osrm file
void UseDefaultOutputNames(const boost::filesystem::path &base) void UseDefaultOutputNames(const std::filesystem::path &base)
{ {
IOConfig::UseDefaultOutputNames(base); IOConfig::UseDefaultOutputNames(base);
updater_config.UseDefaultOutputNames(base); updater_config.UseDefaultOutputNames(base);

View File

@ -1,128 +0,0 @@
#ifndef ITERATOR_BASED_CRC32_H
#define ITERATOR_BASED_CRC32_H
#if defined(__x86_64__) && !defined(__MINGW64__)
#include <cpuid.h>
#endif
#include <boost/crc.hpp> // for boost::crc_32_type
#include <iterator>
namespace osrm::contractor
{
class IteratorbasedCRC32
{
public:
bool UsingHardware() const { return use_hardware_implementation; }
IteratorbasedCRC32() : crc(0) { use_hardware_implementation = DetectHardwareSupport(); }
template <class Iterator> unsigned operator()(Iterator iter, const Iterator end)
{
unsigned crc = 0;
while (iter != end)
{
using value_type = typename std::iterator_traits<Iterator>::value_type;
const char *data = reinterpret_cast<const char *>(&(*iter));
if (use_hardware_implementation)
{
crc = ComputeInHardware(data, sizeof(value_type));
}
else
{
crc = ComputeInSoftware(data, sizeof(value_type));
}
++iter;
}
return crc;
}
private:
bool DetectHardwareSupport() const
{
static const int sse42_bit = 0x00100000;
const unsigned ecx = cpuid();
const bool sse42_found = (ecx & sse42_bit) != 0;
return sse42_found;
}
unsigned ComputeInSoftware(const char *str, unsigned len)
{
crc_processor.process_bytes(str, len);
return crc_processor.checksum();
}
// adapted from http://byteworm.com/2010/10/13/crc32/
unsigned ComputeInHardware(const char *str, unsigned len)
{
#if defined(__x86_64__)
unsigned q = len / sizeof(unsigned);
unsigned r = len % sizeof(unsigned);
unsigned *p = (unsigned *)str;
// crc=0;
while (q--)
{
__asm__ __volatile__(".byte 0xf2, 0xf, 0x38, 0xf1, 0xf1;"
: "=S"(crc)
: "0"(crc), "c"(*p));
++p;
}
str = reinterpret_cast<char *>(p);
while (r--)
{
__asm__ __volatile__(".byte 0xf2, 0xf, 0x38, 0xf1, 0xf1;"
: "=S"(crc)
: "0"(crc), "c"(*str));
++str;
}
#else
(void)str;
(void)len;
#endif
return crc;
}
inline unsigned cpuid() const
{
unsigned eax = 0, ebx = 0, ecx = 0, edx = 0;
// on X64 this calls hardware cpuid(.) instr. otherwise a dummy impl.
__get_cpuid(1, &eax, &ebx, &ecx, &edx);
return ecx;
}
#if defined(__MINGW64__) || defined(_MSC_VER) || !defined(__x86_64__)
inline void __get_cpuid(int /*param*/,
unsigned * /*eax*/,
unsigned * /*ebx*/,
unsigned *ecx,
unsigned * /*edx*/) const
{
*ecx = 0;
}
#endif
boost::crc_optimal<32, 0x1EDC6F41, 0x0, 0x0, true, true> crc_processor;
unsigned crc;
bool use_hardware_implementation;
};
struct RangebasedCRC32
{
template <typename Iteratable> unsigned operator()(const Iteratable &iterable)
{
return crc32(std::begin(iterable), std::end(iterable));
}
bool UsingHardware() const { return crc32.UsingHardware(); }
private:
IteratorbasedCRC32 crc32;
};
} // namespace osrm::contractor
#endif /* ITERATOR_BASED_CRC32_H */

View File

@ -9,7 +9,7 @@ namespace osrm::contractor::files
{ {
// reads .osrm.hsgr file // reads .osrm.hsgr file
template <typename ContractedMetricT> template <typename ContractedMetricT>
inline void readGraph(const boost::filesystem::path &path, inline void readGraph(const std::filesystem::path &path,
std::unordered_map<std::string, ContractedMetricT> &metrics, std::unordered_map<std::string, ContractedMetricT> &metrics,
std::uint32_t &connectivity_checksum) std::uint32_t &connectivity_checksum)
{ {
@ -30,7 +30,7 @@ inline void readGraph(const boost::filesystem::path &path,
// writes .osrm.hsgr file // writes .osrm.hsgr file
template <typename ContractedMetricT> template <typename ContractedMetricT>
inline void writeGraph(const boost::filesystem::path &path, inline void writeGraph(const std::filesystem::path &path,
const std::unordered_map<std::string, ContractedMetricT> &metrics, const std::unordered_map<std::string, ContractedMetricT> &metrics,
const std::uint32_t connectivity_checksum) const std::uint32_t connectivity_checksum)
{ {

View File

@ -1,9 +1,8 @@
#ifndef OSRM_CUSTOMIZE_CUSTOMIZER_CONFIG_HPP #ifndef OSRM_CUSTOMIZE_CUSTOMIZER_CONFIG_HPP
#define OSRM_CUSTOMIZE_CUSTOMIZER_CONFIG_HPP #define OSRM_CUSTOMIZE_CUSTOMIZER_CONFIG_HPP
#include <boost/filesystem/path.hpp>
#include <array> #include <array>
#include <filesystem>
#include <string> #include <string>
#include "storage/io_config.hpp" #include "storage/io_config.hpp"
@ -27,7 +26,7 @@ struct CustomizationConfig final : storage::IOConfig
{ {
} }
void UseDefaultOutputNames(const boost::filesystem::path &base) void UseDefaultOutputNames(const std::filesystem::path &base)
{ {
IOConfig::UseDefaultOutputNames(base); IOConfig::UseDefaultOutputNames(base);
updater_config.UseDefaultOutputNames(base); updater_config.UseDefaultOutputNames(base);

View File

@ -9,7 +9,7 @@
#include "storage/shared_memory_ownership.hpp" #include "storage/shared_memory_ownership.hpp"
#include <boost/filesystem/path.hpp> #include <filesystem>
namespace osrm::customizer namespace osrm::customizer
{ {

View File

@ -14,7 +14,7 @@ namespace osrm::customizer::files
// reads .osrm.cell_metrics file // reads .osrm.cell_metrics file
template <typename CellMetricT> template <typename CellMetricT>
inline void readCellMetrics(const boost::filesystem::path &path, inline void readCellMetrics(const std::filesystem::path &path,
std::unordered_map<std::string, std::vector<CellMetricT>> &metrics) std::unordered_map<std::string, std::vector<CellMetricT>> &metrics)
{ {
static_assert(std::is_same<CellMetricView, CellMetricT>::value || static_assert(std::is_same<CellMetricView, CellMetricT>::value ||
@ -44,7 +44,7 @@ inline void readCellMetrics(const boost::filesystem::path &path,
// writes .osrm.cell_metrics file // writes .osrm.cell_metrics file
template <typename CellMetricT> template <typename CellMetricT>
inline void inline void
writeCellMetrics(const boost::filesystem::path &path, writeCellMetrics(const std::filesystem::path &path,
const std::unordered_map<std::string, std::vector<CellMetricT>> &metrics) const std::unordered_map<std::string, std::vector<CellMetricT>> &metrics)
{ {
static_assert(std::is_same<CellMetricView, CellMetricT>::value || static_assert(std::is_same<CellMetricView, CellMetricT>::value ||
@ -72,7 +72,7 @@ writeCellMetrics(const boost::filesystem::path &path,
// reads .osrm.mldgr file // reads .osrm.mldgr file
template <typename MultiLevelGraphT> template <typename MultiLevelGraphT>
inline void readGraph(const boost::filesystem::path &path, inline void readGraph(const std::filesystem::path &path,
MultiLevelGraphT &graph, MultiLevelGraphT &graph,
std::uint32_t &connectivity_checksum) std::uint32_t &connectivity_checksum)
{ {
@ -88,7 +88,7 @@ inline void readGraph(const boost::filesystem::path &path,
// writes .osrm.mldgr file // writes .osrm.mldgr file
template <typename MultiLevelGraphT> template <typename MultiLevelGraphT>
inline void writeGraph(const boost::filesystem::path &path, inline void writeGraph(const std::filesystem::path &path,
const MultiLevelGraphT &graph, const MultiLevelGraphT &graph,
const std::uint32_t connectivity_checksum) const std::uint32_t connectivity_checksum)
{ {

View File

@ -33,7 +33,7 @@ SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
#include "engine/hint.hpp" #include "engine/hint.hpp"
#include "util/coordinate.hpp" #include "util/coordinate.hpp"
#include <boost/optional.hpp> #include <optional>
#include <algorithm> #include <algorithm>
#include <vector> #include <vector>
@ -74,12 +74,12 @@ struct BaseParameters
}; };
std::vector<util::Coordinate> coordinates; std::vector<util::Coordinate> coordinates;
std::vector<boost::optional<Hint>> hints; std::vector<std::optional<Hint>> hints;
std::vector<boost::optional<double>> radiuses; std::vector<std::optional<double>> radiuses;
std::vector<boost::optional<Bearing>> bearings; std::vector<std::optional<Bearing>> bearings;
std::vector<boost::optional<Approach>> approaches; std::vector<std::optional<Approach>> approaches;
std::vector<std::string> exclude; std::vector<std::string> exclude;
boost::optional<OutputFormatType> format = OutputFormatType::JSON; std::optional<OutputFormatType> format = OutputFormatType::JSON;
// Adds hints to response which can be included in subsequent requests, see `hints` above. // Adds hints to response which can be included in subsequent requests, see `hints` above.
bool generate_hints = true; bool generate_hints = true;
@ -90,10 +90,10 @@ struct BaseParameters
SnappingType snapping = SnappingType::Default; SnappingType snapping = SnappingType::Default;
BaseParameters(std::vector<util::Coordinate> coordinates_ = {}, BaseParameters(std::vector<util::Coordinate> coordinates_ = {},
std::vector<boost::optional<Hint>> hints_ = {}, std::vector<std::optional<Hint>> hints_ = {},
std::vector<boost::optional<double>> radiuses_ = {}, std::vector<std::optional<double>> radiuses_ = {},
std::vector<boost::optional<Bearing>> bearings_ = {}, std::vector<std::optional<Bearing>> bearings_ = {},
std::vector<boost::optional<Approach>> approaches_ = {}, std::vector<std::optional<Approach>> approaches_ = {},
bool generate_hints_ = true, bool generate_hints_ = true,
std::vector<std::string> exclude = {}, std::vector<std::string> exclude = {},
const SnappingType snapping_ = SnappingType::Default) const SnappingType snapping_ = SnappingType::Default)
@ -112,7 +112,7 @@ struct BaseParameters
(approaches.empty() || approaches.size() == coordinates.size()) && (approaches.empty() || approaches.size() == coordinates.size()) &&
std::all_of(bearings.begin(), std::all_of(bearings.begin(),
bearings.end(), bearings.end(),
[](const boost::optional<Bearing> &bearing_and_range) [](const std::optional<Bearing> &bearing_and_range)
{ {
if (bearing_and_range) if (bearing_and_range)
{ {

View File

@ -2,7 +2,7 @@
#define ENGINE_API_BASE_RESULT_HPP #define ENGINE_API_BASE_RESULT_HPP
#include <flatbuffers/flatbuffers.h> #include <flatbuffers/flatbuffers.h>
#include <mapbox/variant.hpp> #include <variant>
#include <string> #include <string>
@ -10,8 +10,7 @@
namespace osrm::engine::api namespace osrm::engine::api
{ {
using ResultT = using ResultT = std::variant<util::json::Object, std::string, flatbuffers::FlatBufferBuilder>;
mapbox::util::variant<util::json::Object, std::string, flatbuffers::FlatBufferBuilder>;
} // namespace osrm::engine::api } // namespace osrm::engine::api
#endif #endif

View File

@ -14,7 +14,7 @@ table FBResult {
data_version: string; data_version: string;
waypoints: [Waypoint]; //Used as 'sources' waypoints for a 'Table' service waypoints: [Waypoint]; //Used as 'sources' waypoints for a 'Table' service
routes: [RouteObject]; routes: [RouteObject];
table: Table; table: TableResult;
} }
root_type FBResult; root_type FBResult;

File diff suppressed because it is too large Load Diff

View File

@ -1,7 +1,7 @@
include "waypoint.fbs"; include "waypoint.fbs";
namespace osrm.engine.api.fbresult; namespace osrm.engine.api.fbresult;
table Table { table TableResult {
durations: [float]; durations: [float];
rows: ushort; rows: ushort;
cols: ushort; cols: ushort;

View File

@ -12,7 +12,7 @@
#include "util/coordinate.hpp" #include "util/coordinate.hpp"
#include "util/json_container.hpp" #include "util/json_container.hpp"
#include <boost/optional.hpp> #include <optional>
#include <algorithm> #include <algorithm>
#include <iterator> #include <iterator>
@ -41,7 +41,7 @@ inline bool hasValidLanes(const guidance::IntermediateIntersection &intersection
return intersection.lanes.lanes_in_turn > 0; return intersection.lanes.lanes_in_turn > 0;
} }
util::json::Array coordinateToLonLat(const util::Coordinate &coordinate); util::json::Value coordinateToLonLat(const util::Coordinate &coordinate);
/** /**
* Ensures that a bearing value is a whole number, and clamped to the range 0-359 * Ensures that a bearing value is a whole number, and clamped to the range 0-359
@ -79,7 +79,7 @@ util::json::Object makeGeoJSONGeometry(ForwardIter begin, ForwardIter end)
coordinates.values.push_back(location); coordinates.values.push_back(location);
coordinates.values.push_back(location); coordinates.values.push_back(location);
} }
geojson.values["coordinates"] = std::move(coordinates); geojson.values["coordinates"] = util::json::Value{std::move(coordinates)};
return geojson; return geojson;
} }
@ -90,7 +90,7 @@ util::json::Object makeRouteStep(guidance::RouteStep step, util::json::Value geo
util::json::Object makeRoute(const guidance::Route &route, util::json::Object makeRoute(const guidance::Route &route,
util::json::Array legs, util::json::Array legs,
boost::optional<util::json::Value> geometry, std::optional<util::json::Value> geometry,
const char *weight_name); const char *weight_name);
// Creates a Waypoint without Hint, see the Hint overload below // Creates a Waypoint without Hint, see the Hint overload below

View File

@ -30,14 +30,14 @@ class MatchAPI final : public RouteAPI
osrm::engine::api::ResultT &response) const osrm::engine::api::ResultT &response) const
{ {
BOOST_ASSERT(sub_matchings.size() == sub_routes.size()); BOOST_ASSERT(sub_matchings.size() == sub_routes.size());
if (response.is<flatbuffers::FlatBufferBuilder>()) if (std::holds_alternative<flatbuffers::FlatBufferBuilder>(response))
{ {
auto &fb_result = response.get<flatbuffers::FlatBufferBuilder>(); auto &fb_result = std::get<flatbuffers::FlatBufferBuilder>(response);
MakeResponse(sub_matchings, sub_routes, fb_result); MakeResponse(sub_matchings, sub_routes, fb_result);
} }
else else
{ {
auto &json_result = response.get<util::json::Object>(); auto &json_result = std::get<util::json::Object>(response);
MakeResponse(sub_matchings, sub_routes, json_result); MakeResponse(sub_matchings, sub_routes, json_result);
} }
} }
@ -77,19 +77,19 @@ class MatchAPI final : public RouteAPI
sub_routes[index].unpacked_path_segments, sub_routes[index].unpacked_path_segments,
sub_routes[index].source_traversed_in_reverse, sub_routes[index].source_traversed_in_reverse,
sub_routes[index].target_traversed_in_reverse); sub_routes[index].target_traversed_in_reverse);
route.values["confidence"] = sub_matchings[index].confidence; route.values.emplace("confidence", sub_matchings[index].confidence);
routes.values.push_back(std::move(route)); routes.values.emplace_back(std::move(route));
} }
if (!parameters.skip_waypoints) if (!parameters.skip_waypoints)
{ {
response.values["tracepoints"] = MakeTracepoints(sub_matchings); response.values.emplace("tracepoints", MakeTracepoints(sub_matchings));
} }
response.values["matchings"] = std::move(routes); response.values.emplace("matchings", std::move(routes));
response.values["code"] = "Ok"; response.values.emplace("code", "Ok");
auto data_timestamp = facade.GetTimestamp(); auto data_timestamp = facade.GetTimestamp();
if (!data_timestamp.empty()) if (!data_timestamp.empty())
{ {
response.values["data_version"] = data_timestamp; response.values.emplace("data_version", data_timestamp);
} }
} }
@ -132,13 +132,13 @@ class MatchAPI final : public RouteAPI
if (tidy_result.can_be_removed[trace_index]) if (tidy_result.can_be_removed[trace_index])
{ {
waypoints.push_back(fbresult::WaypointBuilder(fb_result).Finish()); waypoints.emplace_back(fbresult::WaypointBuilder(fb_result).Finish());
continue; continue;
} }
auto matching_index = trace_idx_to_matching_idx[trace_index]; auto matching_index = trace_idx_to_matching_idx[trace_index];
if (matching_index.NotMatched()) if (matching_index.NotMatched())
{ {
waypoints.push_back(fbresult::WaypointBuilder(fb_result).Finish()); waypoints.emplace_back(fbresult::WaypointBuilder(fb_result).Finish());
continue; continue;
} }
const auto &phantom = const auto &phantom =
@ -165,7 +165,7 @@ class MatchAPI final : public RouteAPI
{ {
waypoint->add_waypoint_index(matching_index.point_index); waypoint->add_waypoint_index(matching_index.point_index);
} }
waypoints.push_back(waypoint->Finish()); waypoints.emplace_back(waypoint->Finish());
} }
return fb_result.CreateVector(waypoints); return fb_result.CreateVector(waypoints);
@ -186,23 +186,23 @@ class MatchAPI final : public RouteAPI
{ {
if (tidy_result.can_be_removed[trace_index]) if (tidy_result.can_be_removed[trace_index])
{ {
waypoints.values.push_back(util::json::Null()); waypoints.values.emplace_back(util::json::Null());
continue; continue;
} }
auto matching_index = trace_idx_to_matching_idx[trace_index]; auto matching_index = trace_idx_to_matching_idx[trace_index];
if (matching_index.NotMatched()) if (matching_index.NotMatched())
{ {
waypoints.values.push_back(util::json::Null()); waypoints.values.emplace_back(util::json::Null());
continue; continue;
} }
const auto &phantom = const auto &phantom =
sub_matchings[matching_index.sub_matching_index].nodes[matching_index.point_index]; sub_matchings[matching_index.sub_matching_index].nodes[matching_index.point_index];
auto waypoint = BaseAPI::MakeWaypoint({phantom}); auto waypoint = BaseAPI::MakeWaypoint({phantom});
waypoint.values["matchings_index"] = matching_index.sub_matching_index; waypoint.values.emplace("matchings_index", matching_index.sub_matching_index);
waypoint.values["waypoint_index"] = matching_index.point_index; waypoint.values.emplace("waypoint_index", matching_index.point_index);
waypoint.values["alternatives_count"] = waypoint.values.emplace("alternatives_count",
sub_matchings[matching_index.sub_matching_index] sub_matchings[matching_index.sub_matching_index]
.alternatives_count[matching_index.point_index]; .alternatives_count[matching_index.point_index]);
// waypoint indices need to be adjusted if route legs were collapsed // waypoint indices need to be adjusted if route legs were collapsed
// waypoint parameter assumes there is only one match object // waypoint parameter assumes there is only one match object
if (!parameters.waypoints.empty()) if (!parameters.waypoints.empty())
@ -217,7 +217,7 @@ class MatchAPI final : public RouteAPI
waypoint.values["waypoint_index"] = util::json::Null(); waypoint.values["waypoint_index"] = util::json::Null();
} }
} }
waypoints.values.push_back(std::move(waypoint)); waypoints.values.emplace_back(std::move(waypoint));
} }
return waypoints; return waypoints;

View File

@ -29,14 +29,14 @@ class NearestAPI final : public BaseAPI
BOOST_ASSERT(phantom_nodes.size() == 1); BOOST_ASSERT(phantom_nodes.size() == 1);
BOOST_ASSERT(parameters.coordinates.size() == 1); BOOST_ASSERT(parameters.coordinates.size() == 1);
if (response.is<flatbuffers::FlatBufferBuilder>()) if (std::holds_alternative<flatbuffers::FlatBufferBuilder>(response))
{ {
auto &fb_result = response.get<flatbuffers::FlatBufferBuilder>(); auto &fb_result = std::get<flatbuffers::FlatBufferBuilder>(response);
MakeResponse(phantom_nodes, fb_result); MakeResponse(phantom_nodes, fb_result);
} }
else else
{ {
auto &json_result = response.get<util::json::Object>(); auto &json_result = std::get<util::json::Object>(response);
MakeResponse(phantom_nodes, json_result); MakeResponse(phantom_nodes, json_result);
} }
} }
@ -45,7 +45,7 @@ class NearestAPI final : public BaseAPI
flatbuffers::FlatBufferBuilder &fb_result) const flatbuffers::FlatBufferBuilder &fb_result) const
{ {
auto data_timestamp = facade.GetTimestamp(); auto data_timestamp = facade.GetTimestamp();
boost::optional<flatbuffers::Offset<flatbuffers::String>> data_version_string = boost::none; std::optional<flatbuffers::Offset<flatbuffers::String>> data_version_string = std::nullopt;
if (!data_timestamp.empty()) if (!data_timestamp.empty())
{ {
data_version_string = fb_result.CreateString(data_timestamp); data_version_string = fb_result.CreateString(data_timestamp);
@ -100,23 +100,23 @@ class NearestAPI final : public BaseAPI
auto waypoint = MakeWaypoint({phantom_node}); auto waypoint = MakeWaypoint({phantom_node});
util::json::Array nodes; util::json::Array nodes;
nodes.values.reserve(2);
auto node_values = MakeNodes(phantom_node); auto node_values = MakeNodes(phantom_node);
nodes.values.push_back(node_values.first); nodes.values.emplace_back(node_values.first);
nodes.values.push_back(node_values.second); nodes.values.emplace_back(node_values.second);
waypoint.values["nodes"] = std::move(nodes); waypoint.values.emplace("nodes", std::move(nodes));
return waypoint; return waypoint;
}); });
response.values["waypoints"] = std::move(waypoints); response.values.emplace("waypoints", std::move(waypoints));
} }
response.values["code"] = "Ok"; response.values.emplace("code", "Ok");
auto data_timestamp = facade.GetTimestamp(); auto data_timestamp = facade.GetTimestamp();
if (!data_timestamp.empty()) if (!data_timestamp.empty())
{ {
response.values["data_version"] = data_timestamp; response.values.emplace("data_version", data_timestamp);
} }
} }

View File

@ -50,14 +50,14 @@ class RouteAPI : public BaseAPI
{ {
BOOST_ASSERT(!raw_routes.routes.empty()); BOOST_ASSERT(!raw_routes.routes.empty());
if (response.is<flatbuffers::FlatBufferBuilder>()) if (std::holds_alternative<flatbuffers::FlatBufferBuilder>(response))
{ {
auto &fb_result = response.get<flatbuffers::FlatBufferBuilder>(); auto &fb_result = std::get<flatbuffers::FlatBufferBuilder>(response);
MakeResponse(raw_routes, waypoint_candidates, fb_result); MakeResponse(raw_routes, waypoint_candidates, fb_result);
} }
else else
{ {
auto &json_result = response.get<util::json::Object>(); auto &json_result = std::get<util::json::Object>(response);
MakeResponse(raw_routes, waypoint_candidates, json_result); MakeResponse(raw_routes, waypoint_candidates, json_result);
} }
} }
@ -110,14 +110,14 @@ class RouteAPI : public BaseAPI
if (!parameters.skip_waypoints) if (!parameters.skip_waypoints)
{ {
response.values["waypoints"] = BaseAPI::MakeWaypoints(waypoint_candidates); response.values.emplace("waypoints", BaseAPI::MakeWaypoints(waypoint_candidates));
} }
response.values["routes"] = std::move(jsRoutes); response.values.emplace("routes", std::move(jsRoutes));
response.values["code"] = "Ok"; response.values.emplace("code", "Ok");
auto data_timestamp = facade.GetTimestamp(); auto data_timestamp = facade.GetTimestamp();
if (!data_timestamp.empty()) if (!data_timestamp.empty())
{ {
response.values["data_version"] = data_timestamp; response.values.emplace("data_version", data_timestamp);
} }
} }
@ -158,7 +158,7 @@ class RouteAPI : public BaseAPI
} }
template <typename ForwardIter> template <typename ForwardIter>
mapbox::util::variant<flatbuffers::Offset<flatbuffers::String>, std::variant<flatbuffers::Offset<flatbuffers::String>,
flatbuffers::Offset<flatbuffers::Vector<const fbresult::Position *>>> flatbuffers::Offset<flatbuffers::Vector<const fbresult::Position *>>>
MakeGeometry(flatbuffers::FlatBufferBuilder &builder, ForwardIter begin, ForwardIter end) const MakeGeometry(flatbuffers::FlatBufferBuilder &builder, ForwardIter begin, ForwardIter end) const
{ {
@ -184,10 +184,10 @@ class RouteAPI : public BaseAPI
return builder.CreateVectorOfStructs(coordinates); return builder.CreateVectorOfStructs(coordinates);
} }
boost::optional<util::json::Value> std::optional<util::json::Value>
MakeGeometry(boost::optional<std::vector<Coordinate>> &&annotations) const MakeGeometry(std::optional<std::vector<Coordinate>> &&annotations) const
{ {
boost::optional<util::json::Value> json_geometry; std::optional<util::json::Value> json_geometry;
if (annotations) if (annotations)
{ {
auto begin = annotations->begin(); auto begin = annotations->begin();
@ -340,8 +340,8 @@ class RouteAPI : public BaseAPI
unpacked_path_segments, unpacked_path_segments,
source_traversed_in_reverse, source_traversed_in_reverse,
target_traversed_in_reverse); target_traversed_in_reverse);
std::vector<guidance::RouteLeg> legs = legs_info.first; std::vector<guidance::RouteLeg> &legs = legs_info.first;
std::vector<guidance::LegGeometry> leg_geometries = legs_info.second; std::vector<guidance::LegGeometry> &leg_geometries = legs_info.second;
auto route = guidance::assembleRoute(legs); auto route = guidance::assembleRoute(legs);
// Fill legs // Fill legs
@ -408,7 +408,7 @@ class RouteAPI : public BaseAPI
// Fill geometry // Fill geometry
auto overview = MakeOverview(leg_geometries); auto overview = MakeOverview(leg_geometries);
mapbox::util::variant<flatbuffers::Offset<flatbuffers::String>, std::variant<flatbuffers::Offset<flatbuffers::String>,
flatbuffers::Offset<flatbuffers::Vector<const fbresult::Position *>>> flatbuffers::Offset<flatbuffers::Vector<const fbresult::Position *>>>
geometry; geometry;
if (overview) if (overview)
@ -426,8 +426,7 @@ class RouteAPI : public BaseAPI
routeObject.add_legs(legs_vector); routeObject.add_legs(legs_vector);
if (overview) if (overview)
{ {
mapbox::util::apply_visitor(GeometryVisitor<fbresult::RouteObjectBuilder>(routeObject), std::visit(GeometryVisitor<fbresult::RouteObjectBuilder>(routeObject), geometry);
geometry);
} }
return routeObject.Finish(); return routeObject.Finish();
@ -443,8 +442,8 @@ class RouteAPI : public BaseAPI
if (requested_annotations & RouteParameters::AnnotationsType::Speed) if (requested_annotations & RouteParameters::AnnotationsType::Speed)
{ {
double prev_speed = 0; double prev_speed = 0;
speed = speed = GetAnnotations<float>(
GetAnnotations<float>(fb_result, fb_result,
leg_geometry, leg_geometry,
[&prev_speed](const guidance::LegGeometry::Annotation &anno) [&prev_speed](const guidance::LegGeometry::Annotation &anno)
{ {
@ -454,8 +453,7 @@ class RouteAPI : public BaseAPI
} }
else else
{ {
auto speed = auto speed = std::round(anno.distance / anno.duration * 10.) / 10.;
round(anno.distance / anno.duration * 10.) / 10.;
prev_speed = speed; prev_speed = speed;
return util::json::clamp_float(speed); return util::json::clamp_float(speed);
} }
@ -645,7 +643,7 @@ class RouteAPI : public BaseAPI
stepBuilder.add_rotary_pronunciation(rotary_pronunciation_string); stepBuilder.add_rotary_pronunciation(rotary_pronunciation_string);
stepBuilder.add_intersections(intersections_vector); stepBuilder.add_intersections(intersections_vector);
stepBuilder.add_maneuver(maneuver_buffer); stepBuilder.add_maneuver(maneuver_buffer);
mapbox::util::apply_visitor(GeometryVisitor<fbresult::StepBuilder>(stepBuilder), geometry); std::visit(GeometryVisitor<fbresult::StepBuilder>(stepBuilder), geometry);
return stepBuilder.Finish(); return stepBuilder.Finish();
}; };
@ -718,12 +716,11 @@ class RouteAPI : public BaseAPI
unpacked_path_segments, unpacked_path_segments,
source_traversed_in_reverse, source_traversed_in_reverse,
target_traversed_in_reverse); target_traversed_in_reverse);
std::vector<guidance::RouteLeg> legs = legs_info.first; std::vector<guidance::RouteLeg> &legs = legs_info.first;
std::vector<guidance::LegGeometry> leg_geometries = legs_info.second; std::vector<guidance::LegGeometry> &leg_geometries = legs_info.second;
auto route = guidance::assembleRoute(legs); auto route = guidance::assembleRoute(legs);
boost::optional<util::json::Value> json_overview = std::optional<util::json::Value> json_overview = MakeGeometry(MakeOverview(leg_geometries));
MakeGeometry(MakeOverview(leg_geometries));
std::vector<util::json::Value> step_geometries; std::vector<util::json::Value> step_geometries;
const auto total_step_count = const auto total_step_count =
@ -786,8 +783,9 @@ class RouteAPI : public BaseAPI
if (requested_annotations & RouteParameters::AnnotationsType::Speed) if (requested_annotations & RouteParameters::AnnotationsType::Speed)
{ {
double prev_speed = 0; double prev_speed = 0;
annotation.values["speed"] = GetAnnotations( annotation.values.emplace(
leg_geometry, "speed",
GetAnnotations(leg_geometry,
[&prev_speed](const guidance::LegGeometry::Annotation &anno) [&prev_speed](const guidance::LegGeometry::Annotation &anno)
{ {
if (anno.duration < std::numeric_limits<double>::min()) if (anno.duration < std::numeric_limits<double>::min())
@ -796,39 +794,46 @@ class RouteAPI : public BaseAPI
} }
else else
{ {
auto speed = std::round(anno.distance / anno.duration * 10.) / 10.; auto speed =
std::round(anno.distance / anno.duration * 10.) /
10.;
prev_speed = speed; prev_speed = speed;
return util::json::clamp_float(speed); return util::json::clamp_float(speed);
} }
}); }));
} }
if (requested_annotations & RouteParameters::AnnotationsType::Duration) if (requested_annotations & RouteParameters::AnnotationsType::Duration)
{ {
annotation.values["duration"] = annotation.values.emplace(
"duration",
GetAnnotations(leg_geometry, GetAnnotations(leg_geometry,
[](const guidance::LegGeometry::Annotation &anno) [](const guidance::LegGeometry::Annotation &anno)
{ return anno.duration; }); { return anno.duration; }));
} }
if (requested_annotations & RouteParameters::AnnotationsType::Distance) if (requested_annotations & RouteParameters::AnnotationsType::Distance)
{ {
annotation.values["distance"] = annotation.values.emplace(
"distance",
GetAnnotations(leg_geometry, GetAnnotations(leg_geometry,
[](const guidance::LegGeometry::Annotation &anno) [](const guidance::LegGeometry::Annotation &anno)
{ return anno.distance; }); { return anno.distance; }));
} }
if (requested_annotations & RouteParameters::AnnotationsType::Weight) if (requested_annotations & RouteParameters::AnnotationsType::Weight)
{ {
annotation.values["weight"] = GetAnnotations( annotation.values.emplace(
leg_geometry, "weight",
[](const guidance::LegGeometry::Annotation &anno) { return anno.weight; }); GetAnnotations(leg_geometry,
[](const guidance::LegGeometry::Annotation &anno)
{ return anno.weight; }));
} }
if (requested_annotations & RouteParameters::AnnotationsType::Datasources) if (requested_annotations & RouteParameters::AnnotationsType::Datasources)
{ {
annotation.values["datasources"] = annotation.values.emplace(
"datasources",
GetAnnotations(leg_geometry, GetAnnotations(leg_geometry,
[](const guidance::LegGeometry::Annotation &anno) [](const guidance::LegGeometry::Annotation &anno)
{ return anno.datasource; }); { return anno.datasource; }));
} }
if (requested_annotations & RouteParameters::AnnotationsType::Nodes) if (requested_annotations & RouteParameters::AnnotationsType::Nodes)
{ {
@ -839,7 +844,7 @@ class RouteAPI : public BaseAPI
nodes.values.push_back( nodes.values.push_back(
static_cast<std::uint64_t>(facade.GetOSMNodeIDOfNode(node_id))); static_cast<std::uint64_t>(facade.GetOSMNodeIDOfNode(node_id)));
} }
annotation.values["nodes"] = std::move(nodes); annotation.values.emplace("nodes", std::move(nodes));
} }
// Add any supporting metadata, if needed // Add any supporting metadata, if needed
if (requested_annotations & RouteParameters::AnnotationsType::Datasources) if (requested_annotations & RouteParameters::AnnotationsType::Datasources)
@ -855,8 +860,8 @@ class RouteAPI : public BaseAPI
break; break;
datasource_names.values.push_back(std::string(facade.GetDatasourceName(i))); datasource_names.values.push_back(std::string(facade.GetDatasourceName(i)));
} }
metadata.values["datasource_names"] = datasource_names; metadata.values.emplace("datasource_names", datasource_names);
annotation.values["metadata"] = metadata; annotation.values.emplace("metadata", metadata);
} }
annotations.push_back(std::move(annotation)); annotations.push_back(std::move(annotation));
@ -991,10 +996,10 @@ class RouteAPI : public BaseAPI
return result; return result;
} }
boost::optional<std::vector<Coordinate>> std::optional<std::vector<Coordinate>>
MakeOverview(const std::vector<guidance::LegGeometry> &leg_geometries) const MakeOverview(const std::vector<guidance::LegGeometry> &leg_geometries) const
{ {
boost::optional<std::vector<Coordinate>> overview; std::optional<std::vector<Coordinate>> overview;
if (parameters.overview != RouteParameters::OverviewType::False) if (parameters.overview != RouteParameters::OverviewType::False)
{ {
const auto use_simplification = const auto use_simplification =

View File

@ -82,7 +82,7 @@ struct RouteParameters : public BaseParameters
const bool alternatives_, const bool alternatives_,
const GeometriesType geometries_, const GeometriesType geometries_,
const OverviewType overview_, const OverviewType overview_,
const boost::optional<bool> continue_straight_, const std::optional<bool> continue_straight_,
Args &&...args_) Args &&...args_)
// Once we perfectly-forward `args` (see #2990) this constructor can delegate to the one // Once we perfectly-forward `args` (see #2990) this constructor can delegate to the one
// below. // below.
@ -100,7 +100,7 @@ struct RouteParameters : public BaseParameters
const bool annotations_, const bool annotations_,
const GeometriesType geometries_, const GeometriesType geometries_,
const OverviewType overview_, const OverviewType overview_,
const boost::optional<bool> continue_straight_, const std::optional<bool> continue_straight_,
Args &&...args_) Args &&...args_)
: BaseParameters{std::forward<Args>(args_)...}, steps{steps_}, alternatives{alternatives_}, : BaseParameters{std::forward<Args>(args_)...}, steps{steps_}, alternatives{alternatives_},
number_of_alternatives{alternatives_ ? 1u : 0u}, annotations{annotations_}, number_of_alternatives{alternatives_ ? 1u : 0u}, annotations{annotations_},
@ -118,7 +118,7 @@ struct RouteParameters : public BaseParameters
const AnnotationsType annotations_, const AnnotationsType annotations_,
const GeometriesType geometries_, const GeometriesType geometries_,
const OverviewType overview_, const OverviewType overview_,
const boost::optional<bool> continue_straight_, const std::optional<bool> continue_straight_,
Args &&...args_) Args &&...args_)
: BaseParameters{std::forward<Args>(args_)...}, steps{steps_}, alternatives{alternatives_}, : BaseParameters{std::forward<Args>(args_)...}, steps{steps_}, alternatives{alternatives_},
number_of_alternatives{alternatives_ ? 1u : 0u}, number_of_alternatives{alternatives_ ? 1u : 0u},
@ -135,7 +135,7 @@ struct RouteParameters : public BaseParameters
const bool annotations_, const bool annotations_,
const GeometriesType geometries_, const GeometriesType geometries_,
const OverviewType overview_, const OverviewType overview_,
const boost::optional<bool> continue_straight_, const std::optional<bool> continue_straight_,
std::vector<std::size_t> waypoints_, std::vector<std::size_t> waypoints_,
const Args &&...args_) const Args &&...args_)
: BaseParameters{std::forward<Args>(args_)...}, steps{steps_}, alternatives{alternatives_}, : BaseParameters{std::forward<Args>(args_)...}, steps{steps_}, alternatives{alternatives_},
@ -153,7 +153,7 @@ struct RouteParameters : public BaseParameters
const AnnotationsType annotations_, const AnnotationsType annotations_,
const GeometriesType geometries_, const GeometriesType geometries_,
const OverviewType overview_, const OverviewType overview_,
const boost::optional<bool> continue_straight_, const std::optional<bool> continue_straight_,
std::vector<std::size_t> waypoints_, std::vector<std::size_t> waypoints_,
Args &&...args_) Args &&...args_)
: BaseParameters{std::forward<Args>(args_)...}, steps{steps_}, alternatives{alternatives_}, : BaseParameters{std::forward<Args>(args_)...}, steps{steps_}, alternatives{alternatives_},
@ -172,7 +172,7 @@ struct RouteParameters : public BaseParameters
AnnotationsType annotations_type = AnnotationsType::None; AnnotationsType annotations_type = AnnotationsType::None;
GeometriesType geometries = GeometriesType::Polyline; GeometriesType geometries = GeometriesType::Polyline;
OverviewType overview = OverviewType::Simplified; OverviewType overview = OverviewType::Simplified;
boost::optional<bool> continue_straight; std::optional<bool> continue_straight;
std::vector<std::size_t> waypoints; std::vector<std::size_t> waypoints;
bool IsValid() const bool IsValid() const

View File

@ -50,14 +50,14 @@ class TableAPI final : public BaseAPI
const std::vector<TableCellRef> &fallback_speed_cells, const std::vector<TableCellRef> &fallback_speed_cells,
osrm::engine::api::ResultT &response) const osrm::engine::api::ResultT &response) const
{ {
if (response.is<flatbuffers::FlatBufferBuilder>()) if (std::holds_alternative<flatbuffers::FlatBufferBuilder>(response))
{ {
auto &fb_result = response.get<flatbuffers::FlatBufferBuilder>(); auto &fb_result = std::get<flatbuffers::FlatBufferBuilder>(response);
MakeResponse(tables, candidates, fallback_speed_cells, fb_result); MakeResponse(tables, candidates, fallback_speed_cells, fb_result);
} }
else else
{ {
auto &json_result = response.get<util::json::Object>(); auto &json_result = std::get<util::json::Object>(response);
MakeResponse(tables, candidates, fallback_speed_cells, json_result); MakeResponse(tables, candidates, fallback_speed_cells, json_result);
} }
} }
@ -137,7 +137,7 @@ class TableAPI final : public BaseAPI
speed_cells = MakeEstimatesTable(fb_result, fallback_speed_cells); speed_cells = MakeEstimatesTable(fb_result, fallback_speed_cells);
} }
fbresult::TableBuilder table(fb_result); fbresult::TableResultBuilder table(fb_result);
table.add_destinations(destinations); table.add_destinations(destinations);
table.add_rows(number_of_sources); table.add_rows(number_of_sources);
table.add_cols(number_of_destinations); table.add_cols(number_of_destinations);
@ -179,7 +179,7 @@ class TableAPI final : public BaseAPI
{ {
if (!parameters.skip_waypoints) if (!parameters.skip_waypoints)
{ {
response.values["sources"] = MakeWaypoints(candidates); response.values.emplace("sources", MakeWaypoints(candidates));
} }
number_of_sources = candidates.size(); number_of_sources = candidates.size();
} }
@ -187,7 +187,7 @@ class TableAPI final : public BaseAPI
{ {
if (!parameters.skip_waypoints) if (!parameters.skip_waypoints)
{ {
response.values["sources"] = MakeWaypoints(candidates, parameters.sources); response.values.emplace("sources", MakeWaypoints(candidates, parameters.sources));
} }
} }
@ -195,7 +195,7 @@ class TableAPI final : public BaseAPI
{ {
if (!parameters.skip_waypoints) if (!parameters.skip_waypoints)
{ {
response.values["destinations"] = MakeWaypoints(candidates); response.values.emplace("destinations", MakeWaypoints(candidates));
} }
number_of_destinations = candidates.size(); number_of_destinations = candidates.size();
} }
@ -203,34 +203,37 @@ class TableAPI final : public BaseAPI
{ {
if (!parameters.skip_waypoints) if (!parameters.skip_waypoints)
{ {
response.values["destinations"] = response.values.emplace("destinations",
MakeWaypoints(candidates, parameters.destinations); MakeWaypoints(candidates, parameters.destinations));
} }
} }
if (parameters.annotations & TableParameters::AnnotationsType::Duration) if (parameters.annotations & TableParameters::AnnotationsType::Duration)
{ {
response.values["durations"] = response.values.emplace(
MakeDurationTable(tables.first, number_of_sources, number_of_destinations); "durations",
MakeDurationTable(tables.first, number_of_sources, number_of_destinations));
} }
if (parameters.annotations & TableParameters::AnnotationsType::Distance) if (parameters.annotations & TableParameters::AnnotationsType::Distance)
{ {
response.values["distances"] = response.values.emplace(
MakeDistanceTable(tables.second, number_of_sources, number_of_destinations); "distances",
MakeDistanceTable(tables.second, number_of_sources, number_of_destinations));
} }
if (parameters.fallback_speed != from_alias<double>(INVALID_FALLBACK_SPEED) && if (parameters.fallback_speed != from_alias<double>(INVALID_FALLBACK_SPEED) &&
parameters.fallback_speed > 0) parameters.fallback_speed > 0)
{ {
response.values["fallback_speed_cells"] = MakeEstimatesTable(fallback_speed_cells); response.values.emplace("fallback_speed_cells",
MakeEstimatesTable(fallback_speed_cells));
} }
response.values["code"] = "Ok"; response.values.emplace("code", "Ok");
auto data_timestamp = facade.GetTimestamp(); auto data_timestamp = facade.GetTimestamp();
if (!data_timestamp.empty()) if (!data_timestamp.empty())
{ {
response.values["data_version"] = data_timestamp; response.values.emplace("data_version", data_timestamp);
} }
} }
@ -377,7 +380,8 @@ class TableAPI final : public BaseAPI
return util::json::Value( return util::json::Value(
util::json::Number(from_alias<double>(duration) / 10.)); util::json::Number(from_alias<double>(duration) / 10.));
}); });
json_table.values.push_back(std::move(json_row));
json_table.values.push_back(util::json::Value{json_row});
} }
return json_table; return json_table;
} }
@ -406,7 +410,7 @@ class TableAPI final : public BaseAPI
return util::json::Value(util::json::Number( return util::json::Value(util::json::Number(
std::round(from_alias<double>(distance) * 10) / 10.)); std::round(from_alias<double>(distance) * 10) / 10.));
}); });
json_table.values.push_back(std::move(json_row)); json_table.values.push_back(util::json::Value{json_row});
} }
return json_table; return json_table;
} }
@ -415,14 +419,17 @@ class TableAPI final : public BaseAPI
MakeEstimatesTable(const std::vector<TableCellRef> &fallback_speed_cells) const MakeEstimatesTable(const std::vector<TableCellRef> &fallback_speed_cells) const
{ {
util::json::Array json_table; util::json::Array json_table;
std::for_each(fallback_speed_cells.begin(), std::for_each(
fallback_speed_cells.begin(),
fallback_speed_cells.end(), fallback_speed_cells.end(),
[&](const auto &cell) [&](const auto &cell)
{ {
util::json::Array row; util::json::Array row;
row.values.push_back(util::json::Number(cell.row)); util::json::Value jCellRow{util::json::Number(static_cast<double>(cell.row))};
row.values.push_back(util::json::Number(cell.column)); util::json::Value jCellColumn{util::json::Number(static_cast<double>(cell.column))};
json_table.values.push_back(std::move(row)); row.values.push_back(jCellRow);
row.values.push_back(jCellColumn);
json_table.values.push_back(util::json::Value{row});
}); });
return json_table; return json_table;
} }

View File

@ -27,14 +27,14 @@ class TripAPI final : public RouteAPI
{ {
BOOST_ASSERT(sub_trips.size() == sub_routes.size()); BOOST_ASSERT(sub_trips.size() == sub_routes.size());
if (response.is<flatbuffers::FlatBufferBuilder>()) if (std::holds_alternative<flatbuffers::FlatBufferBuilder>(response))
{ {
auto &fb_result = response.get<flatbuffers::FlatBufferBuilder>(); auto &fb_result = std::get<flatbuffers::FlatBufferBuilder>(response);
MakeResponse(sub_trips, sub_routes, candidates, fb_result); MakeResponse(sub_trips, sub_routes, candidates, fb_result);
} }
else else
{ {
auto &json_result = response.get<util::json::Object>(); auto &json_result = std::get<util::json::Object>(response);
MakeResponse(sub_trips, sub_routes, candidates, json_result); MakeResponse(sub_trips, sub_routes, candidates, json_result);
} }
} }
@ -79,14 +79,14 @@ class TripAPI final : public RouteAPI
} }
if (!parameters.skip_waypoints) if (!parameters.skip_waypoints)
{ {
response.values["waypoints"] = MakeWaypoints(sub_trips, candidates); response.values.emplace("waypoints", MakeWaypoints(sub_trips, candidates));
} }
response.values["trips"] = std::move(routes); response.values.emplace("trips", std::move(routes));
response.values["code"] = "Ok"; response.values.emplace("code", "Ok");
auto data_timestamp = facade.GetTimestamp(); auto data_timestamp = facade.GetTimestamp();
if (!data_timestamp.empty()) if (!data_timestamp.empty())
{ {
response.values["data_version"] = data_timestamp; response.values.emplace("data_version", data_timestamp);
} }
} }
@ -151,8 +151,8 @@ class TripAPI final : public RouteAPI
BOOST_ASSERT(!trip_index.NotUsed()); BOOST_ASSERT(!trip_index.NotUsed());
auto waypoint = BaseAPI::MakeWaypoint(candidates[input_index]); auto waypoint = BaseAPI::MakeWaypoint(candidates[input_index]);
waypoint.values["trips_index"] = trip_index.sub_trip_index; waypoint.values.emplace("trips_index", trip_index.sub_trip_index);
waypoint.values["waypoint_index"] = trip_index.point_index; waypoint.values.emplace("waypoint_index", trip_index.point_index);
waypoints.values.push_back(std::move(waypoint)); waypoints.values.push_back(std::move(waypoint));
} }

View File

@ -30,7 +30,7 @@ SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
#include "engine/api/route_parameters.hpp" #include "engine/api/route_parameters.hpp"
#include <boost/optional.hpp> #include <optional>
#include <vector> #include <vector>
namespace osrm::engine::api namespace osrm::engine::api

View File

@ -47,24 +47,29 @@ namespace engine
// Encodes a chunk of memory to Base64. // Encodes a chunk of memory to Base64.
inline std::string encodeBase64(const unsigned char *first, std::size_t size) inline std::string encodeBase64(const unsigned char *first, std::size_t size)
{ {
std::vector<unsigned char> bytes{first, first + size}; BOOST_ASSERT(size > 0);
BOOST_ASSERT(!bytes.empty());
std::size_t bytes_to_pad{0}; std::string encoded;
encoded.reserve(((size + 2) / 3) * 4);
while (bytes.size() % 3 != 0) auto padding = (3 - size % 3) % 3;
BOOST_ASSERT(padding == 0 || padding == 1 || padding == 2);
for (auto itr = detail::Base64FromBinary(first); itr != detail::Base64FromBinary(first + size);
++itr)
{ {
bytes_to_pad += 1; encoded.push_back(*itr);
bytes.push_back(0);
} }
BOOST_ASSERT(bytes_to_pad == 0 || bytes_to_pad == 1 || bytes_to_pad == 2); for (size_t index = 0; index < padding; ++index)
BOOST_ASSERT_MSG(0 == bytes.size() % 3, "base64 input data size is not a multiple of 3"); {
encoded.push_back('=');
}
std::string encoded{detail::Base64FromBinary{bytes.data()}, BOOST_ASSERT(encoded.size() == (size + 2) / 3 * 4);
detail::Base64FromBinary{bytes.data() + (bytes.size() - bytes_to_pad)}};
return encoded.append(bytes_to_pad, '='); return encoded;
} }
// C++11 standard 3.9.1/1: Plain char, signed char, and unsigned char are three distinct types // C++11 standard 3.9.1/1: Plain char, signed char, and unsigned char are three distinct types

View File

@ -55,7 +55,7 @@ template <> class AlgorithmDataFacade<CH>
virtual EdgeID FindSmallestEdge(const NodeID edge_based_node_from, virtual EdgeID FindSmallestEdge(const NodeID edge_based_node_from,
const NodeID edge_based_node_to, const NodeID edge_based_node_to,
const std::function<bool(EdgeData)> filter) const = 0; const std::function<bool(const EdgeData &)> &filter) const = 0;
}; };
template <> class AlgorithmDataFacade<MLD> template <> class AlgorithmDataFacade<MLD>

View File

@ -130,9 +130,10 @@ class ContiguousInternalMemoryAlgorithmDataFacade<CH> : public datafacade::Algor
edge_based_node_from, edge_based_node_to, result); edge_based_node_from, edge_based_node_to, result);
} }
EdgeID FindSmallestEdge(const NodeID edge_based_node_from, EdgeID
FindSmallestEdge(const NodeID edge_based_node_from,
const NodeID edge_based_node_to, const NodeID edge_based_node_to,
std::function<bool(EdgeData)> filter) const override final const std::function<bool(const EdgeData &)> &filter) const override final
{ {
return m_query_graph.FindSmallestEdge(edge_based_node_from, edge_based_node_to, filter); return m_query_graph.FindSmallestEdge(edge_based_node_from, edge_based_node_to, filter);
} }
@ -176,7 +177,7 @@ class ContiguousInternalMemoryDataFacadeBase : public BaseDataFacade
SharedRTree m_static_rtree; SharedRTree m_static_rtree;
std::unique_ptr<SharedGeospatialQuery> m_geospatial_query; std::unique_ptr<SharedGeospatialQuery> m_geospatial_query;
boost::filesystem::path file_index_path; std::filesystem::path file_index_path;
std::optional<extractor::IntersectionBearingsView> intersection_bearings_view; std::optional<extractor::IntersectionBearingsView> intersection_bearings_view;
@ -368,7 +369,7 @@ class ContiguousInternalMemoryDataFacadeBase : public BaseDataFacade
std::vector<PhantomNodeWithDistance> std::vector<PhantomNodeWithDistance>
NearestPhantomNodesInRange(const util::Coordinate input_coordinate, NearestPhantomNodesInRange(const util::Coordinate input_coordinate,
const double max_distance, const double max_distance,
const boost::optional<Bearing> bearing, const std::optional<Bearing> bearing,
const Approach approach, const Approach approach,
const bool use_all_edges) const override final const bool use_all_edges) const override final
{ {
@ -381,20 +382,20 @@ class ContiguousInternalMemoryDataFacadeBase : public BaseDataFacade
std::vector<PhantomNodeWithDistance> std::vector<PhantomNodeWithDistance>
NearestPhantomNodes(const util::Coordinate input_coordinate, NearestPhantomNodes(const util::Coordinate input_coordinate,
const size_t max_results, const size_t max_results,
const boost::optional<double> max_distance, const std::optional<double> max_distance,
const boost::optional<Bearing> bearing, const std::optional<Bearing> bearing,
const Approach approach) const override final const Approach approach) const override final
{ {
BOOST_ASSERT(m_geospatial_query.get()); BOOST_ASSERT(m_geospatial_query.get());
return m_geospatial_query->NearestPhantomNodes( return m_geospatial_query->NearestPhantomNodes(
input_coordinate, approach, max_results, max_distance, bearing, boost::none); input_coordinate, approach, max_results, max_distance, bearing, std::nullopt);
} }
PhantomCandidateAlternatives PhantomCandidateAlternatives
NearestCandidatesWithAlternativeFromBigComponent(const util::Coordinate input_coordinate, NearestCandidatesWithAlternativeFromBigComponent(const util::Coordinate input_coordinate,
const boost::optional<double> max_distance, const std::optional<double> max_distance,
const boost::optional<Bearing> bearing, const std::optional<Bearing> bearing,
const Approach approach, const Approach approach,
const bool use_all_edges) const override final const bool use_all_edges) const override final
{ {
@ -602,6 +603,8 @@ class ContiguousInternalMemoryDataFacadeBase : public BaseDataFacade
auto found_range = std::equal_range( auto found_range = std::equal_range(
m_maneuver_overrides.begin(), m_maneuver_overrides.end(), edge_based_node_id, Comp{}); m_maneuver_overrides.begin(), m_maneuver_overrides.end(), edge_based_node_id, Comp{});
results.reserve(std::distance(found_range.first, found_range.second));
std::for_each(found_range.first, std::for_each(found_range.first,
found_range.second, found_range.second,
[&](const auto &override) [&](const auto &override)

View File

@ -35,6 +35,7 @@
#include <cstddef> #include <cstddef>
#include <engine/bearing.hpp> #include <engine/bearing.hpp>
#include <optional>
#include <string> #include <string>
#include <string_view> #include <string_view>
#include <utility> #include <utility>
@ -126,21 +127,21 @@ class BaseDataFacade
virtual std::vector<PhantomNodeWithDistance> virtual std::vector<PhantomNodeWithDistance>
NearestPhantomNodesInRange(const util::Coordinate input_coordinate, NearestPhantomNodesInRange(const util::Coordinate input_coordinate,
const double max_distance, const double max_distance,
const boost::optional<Bearing> bearing, const std::optional<Bearing> bearing,
const Approach approach, const Approach approach,
const bool use_all_edges) const = 0; const bool use_all_edges) const = 0;
virtual std::vector<PhantomNodeWithDistance> virtual std::vector<PhantomNodeWithDistance>
NearestPhantomNodes(const util::Coordinate input_coordinate, NearestPhantomNodes(const util::Coordinate input_coordinate,
const size_t max_results, const size_t max_results,
const boost::optional<double> max_distance, const std::optional<double> max_distance,
const boost::optional<Bearing> bearing, const std::optional<Bearing> bearing,
const Approach approach) const = 0; const Approach approach) const = 0;
virtual PhantomCandidateAlternatives virtual PhantomCandidateAlternatives
NearestCandidatesWithAlternativeFromBigComponent(const util::Coordinate input_coordinate, NearestCandidatesWithAlternativeFromBigComponent(const util::Coordinate input_coordinate,
const boost::optional<double> max_distance, const std::optional<double> max_distance,
const boost::optional<Bearing> bearing, const std::optional<Bearing> bearing,
const Approach approach, const Approach approach,
const bool use_all_edges) const = 0; const bool use_all_edges) const = 0;

View File

@ -31,8 +31,7 @@ SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
#include "storage/storage_config.hpp" #include "storage/storage_config.hpp"
#include "osrm/datasets.hpp" #include "osrm/datasets.hpp"
#include <boost/filesystem/path.hpp> #include <filesystem>
#include <set> #include <set>
#include <string> #include <string>
@ -54,14 +53,10 @@ namespace osrm::engine
* *
* In addition, shared memory can be used for datasets loaded with osrm-datastore. * In addition, shared memory can be used for datasets loaded with osrm-datastore.
* *
* You can chose between three algorithms: * You can chose between two algorithms:
* - Algorithm::CH * - Algorithm::CH
* Contraction Hierarchies, extremely fast queries but slow pre-processing. The default right * Contraction Hierarchies, extremely fast queries but slow pre-processing. The default right
* now. * now.
* - Algorithm::CoreCH
* Deprecated, to be removed in v6.0
* Contraction Hierachies with partial contraction for faster pre-processing but slower
* queries.
* - Algorithm::MLD * - Algorithm::MLD
* Multi Level Dijkstra, moderately fast in both pre-processing and query. * Multi Level Dijkstra, moderately fast in both pre-processing and query.
* *
@ -74,7 +69,6 @@ struct EngineConfig final
enum class Algorithm enum class Algorithm
{ {
CH, CH,
CoreCH, // Deprecated, will be removed in v6.0
MLD MLD
}; };
@ -85,10 +79,10 @@ struct EngineConfig final
int max_locations_map_matching = -1; int max_locations_map_matching = -1;
double max_radius_map_matching = -1.0; double max_radius_map_matching = -1.0;
int max_results_nearest = -1; int max_results_nearest = -1;
boost::optional<double> default_radius = -1.0; double default_radius = -1.0;
int max_alternatives = 3; // set an arbitrary upper bound; can be adjusted by user int max_alternatives = 3; // set an arbitrary upper bound; can be adjusted by user
bool use_shared_memory = true; bool use_shared_memory = true;
boost::filesystem::path memory_file; std::filesystem::path memory_file;
bool use_mmap = true; bool use_mmap = true;
Algorithm algorithm = Algorithm::CH; Algorithm algorithm = Algorithm::CH;
std::vector<storage::FeatureDataset> disable_feature_dataset; std::vector<storage::FeatureDataset> disable_feature_dataset;

View File

@ -12,6 +12,8 @@
#include "osrm/coordinate.hpp" #include "osrm/coordinate.hpp"
#include <optional>
#include <algorithm> #include <algorithm>
#include <cmath> #include <cmath>
#include <iterator> #include <iterator>
@ -51,8 +53,8 @@ template <typename RTreeT, typename DataFacadeT> class GeospatialQuery
NearestPhantomNodes(const util::Coordinate input_coordinate, NearestPhantomNodes(const util::Coordinate input_coordinate,
const Approach approach, const Approach approach,
const double max_distance, const double max_distance,
const boost::optional<Bearing> bearing_with_range, const std::optional<Bearing> bearing_with_range,
const boost::optional<bool> use_all_edges) const const std::optional<bool> use_all_edges) const
{ {
auto results = rtree.SearchInRange( auto results = rtree.SearchInRange(
input_coordinate, input_coordinate,
@ -83,9 +85,9 @@ template <typename RTreeT, typename DataFacadeT> class GeospatialQuery
NearestPhantomNodes(const util::Coordinate input_coordinate, NearestPhantomNodes(const util::Coordinate input_coordinate,
const Approach approach, const Approach approach,
const size_t max_results, const size_t max_results,
const boost::optional<double> max_distance, const std::optional<double> max_distance,
const boost::optional<Bearing> bearing_with_range, const std::optional<Bearing> bearing_with_range,
const boost::optional<bool> use_all_edges) const const std::optional<bool> use_all_edges) const
{ {
auto results = rtree.Nearest( auto results = rtree.Nearest(
input_coordinate, input_coordinate,
@ -119,9 +121,9 @@ template <typename RTreeT, typename DataFacadeT> class GeospatialQuery
PhantomCandidateAlternatives NearestCandidatesWithAlternativeFromBigComponent( PhantomCandidateAlternatives NearestCandidatesWithAlternativeFromBigComponent(
const util::Coordinate input_coordinate, const util::Coordinate input_coordinate,
const Approach approach, const Approach approach,
const boost::optional<double> max_distance, const std::optional<double> max_distance,
const boost::optional<Bearing> bearing_with_range, const std::optional<Bearing> bearing_with_range,
const boost::optional<bool> use_all_edges) const const std::optional<bool> use_all_edges) const
{ {
bool has_nearest = false; bool has_nearest = false;
bool has_big_component = false; bool has_big_component = false;

View File

@ -37,6 +37,14 @@ inline LegGeometry assembleGeometry(const datafacade::BaseDataFacade &facade,
{ {
LegGeometry geometry; LegGeometry geometry;
// each container will at most have `leg_data.size()` + 1/2 elements in it
// these additional 1/2 elements come from processing of very first and very last segment
geometry.locations.reserve(leg_data.size() + 2);
geometry.segment_distances.reserve(leg_data.size() + 1);
geometry.segment_offsets.reserve(leg_data.size() + 1);
geometry.annotations.reserve(leg_data.size() + 1);
geometry.node_ids.reserve(leg_data.size() + 2);
// segment 0 first and last // segment 0 first and last
geometry.segment_offsets.push_back(0); geometry.segment_offsets.push_back(0);
geometry.locations.push_back(source_node.location); geometry.locations.push_back(source_node.location);

View File

@ -17,9 +17,9 @@
#include "util/guidance/turn_lanes.hpp" #include "util/guidance/turn_lanes.hpp"
#include "util/typedefs.hpp" #include "util/typedefs.hpp"
#include <boost/optional.hpp>
#include <cstddef> #include <cstddef>
#include <guidance/turn_bearing.hpp> #include <guidance/turn_bearing.hpp>
#include <optional>
#include <vector> #include <vector>
namespace osrm::engine::guidance namespace osrm::engine::guidance

View File

@ -1,7 +1,6 @@
#ifndef OSRM_ENGINE_GUIDANCE_COLLAPSE_HPP #ifndef OSRM_ENGINE_GUIDANCE_COLLAPSE_HPP
#include "engine/guidance/route_step.hpp" #include "engine/guidance/route_step.hpp"
#include "util/attributes.hpp"
#include <type_traits> #include <type_traits>
#include <vector> #include <vector>
@ -12,16 +11,15 @@ namespace osrm::engine::guidance
// Multiple possible reasons can result in unnecessary/confusing instructions // Multiple possible reasons can result in unnecessary/confusing instructions
// Collapsing such turns into a single turn instruction, we give a clearer // Collapsing such turns into a single turn instruction, we give a clearer
// set of instructions that is not cluttered by unnecessary turns/name changes. // set of instructions that is not cluttered by unnecessary turns/name changes.
OSRM_ATTR_WARN_UNUSED [[nodiscard]] std::vector<RouteStep> collapseTurnInstructions(std::vector<RouteStep> steps);
std::vector<RouteStep> collapseTurnInstructions(std::vector<RouteStep> steps);
// Multiple possible reasons can result in unnecessary/confusing instructions // Multiple possible reasons can result in unnecessary/confusing instructions
// A prime example would be a segregated intersection. Turning around at this // A prime example would be a segregated intersection. Turning around at this
// intersection would result in two instructions to turn left. // intersection would result in two instructions to turn left.
// Collapsing such turns into a single turn instruction, we give a clearer // Collapsing such turns into a single turn instruction, we give a clearer
// set of instructions that is not cluttered by unnecessary turns/name changes. // set of instructions that is not cluttered by unnecessary turns/name changes.
OSRM_ATTR_WARN_UNUSED [[nodiscard]] std::vector<RouteStep>
std::vector<RouteStep> collapseSegregatedTurnInstructions(std::vector<RouteStep> steps); collapseSegregatedTurnInstructions(std::vector<RouteStep> steps);
// A combined turn is a set of two instructions that actually form a single turn, as far as we // A combined turn is a set of two instructions that actually form a single turn, as far as we
// perceive it. A u-turn consisting of two left turns is one such example. But there are also lots // perceive it. A u-turn consisting of two left turns is one such example. But there are also lots

View File

@ -3,7 +3,6 @@
#include "guidance/turn_instruction.hpp" #include "guidance/turn_instruction.hpp"
#include "engine/guidance/route_step.hpp" #include "engine/guidance/route_step.hpp"
#include "util/attributes.hpp"
#include "util/bearing.hpp" #include "util/bearing.hpp"
#include "util/guidance/name_announcements.hpp" #include "util/guidance/name_announcements.hpp"
@ -166,8 +165,7 @@ inline bool areSameSide(const RouteStep &lhs, const RouteStep &rhs)
} }
// do this after invalidating any steps to compress the step array again // do this after invalidating any steps to compress the step array again
OSRM_ATTR_WARN_UNUSED [[nodiscard]] inline std::vector<RouteStep> removeNoTurnInstructions(std::vector<RouteStep> steps)
inline std::vector<RouteStep> removeNoTurnInstructions(std::vector<RouteStep> steps)
{ {
// finally clean up the post-processed instructions. // finally clean up the post-processed instructions.
// Remove all invalid instructions from the set of instructions. // Remove all invalid instructions from the set of instructions.
@ -204,8 +202,8 @@ inline double totalTurnAngle(const RouteStep &entry_step, const RouteStep &exit_
if (entry_step.geometry_begin > exit_step.geometry_begin) if (entry_step.geometry_begin > exit_step.geometry_begin)
return totalTurnAngle(exit_step, entry_step); return totalTurnAngle(exit_step, entry_step);
const auto exit_intersection = exit_step.intersections.front(); const auto &exit_intersection = exit_step.intersections.front();
const auto entry_intersection = entry_step.intersections.front(); const auto &entry_intersection = entry_step.intersections.front();
if ((exit_intersection.out >= exit_intersection.bearings.size()) || if ((exit_intersection.out >= exit_intersection.bearings.size()) ||
(entry_intersection.in >= entry_intersection.bearings.size())) (entry_intersection.in >= entry_intersection.bearings.size()))
return entry_intersection.bearings[entry_intersection.out]; return entry_intersection.bearings[entry_intersection.out];

View File

@ -1,10 +1,9 @@
#ifndef OSRM_ENGINE_GUIDANCE_LANE_PROCESSING_HPP_ #ifndef OSRM_ENGINE_GUIDANCE_LANE_PROCESSING_HPP_
#define OSRM_ENGINE_GUIDANCE_LANE_PROCESSING_HPP_ #define OSRM_ENGINE_GUIDANCE_LANE_PROCESSING_HPP_
#include <vector>
#include "engine/guidance/route_step.hpp" #include "engine/guidance/route_step.hpp"
#include "util/attributes.hpp"
#include <vector>
namespace osrm::engine::guidance namespace osrm::engine::guidance
{ {
@ -14,8 +13,8 @@ namespace osrm::engine::guidance
// we anticipate lane changes emitting only matching lanes early on. // we anticipate lane changes emitting only matching lanes early on.
// the second parameter describes the duration that we feel two segments need to be apart to count // the second parameter describes the duration that we feel two segments need to be apart to count
// as separate maneuvers. // as separate maneuvers.
OSRM_ATTR_WARN_UNUSED [[nodiscard]] std::vector<RouteStep>
std::vector<RouteStep> anticipateLaneChange(std::vector<RouteStep> steps, anticipateLaneChange(std::vector<RouteStep> steps,
const double min_distance_needed_for_lane_change = 200); const double min_distance_needed_for_lane_change = 200);
} // namespace osrm::engine::guidance } // namespace osrm::engine::guidance

View File

@ -5,7 +5,6 @@
#include "engine/guidance/leg_geometry.hpp" #include "engine/guidance/leg_geometry.hpp"
#include "engine/guidance/route_step.hpp" #include "engine/guidance/route_step.hpp"
#include "engine/phantom_node.hpp" #include "engine/phantom_node.hpp"
#include "util/attributes.hpp"
#include <vector> #include <vector>
@ -13,8 +12,7 @@ namespace osrm::engine::guidance
{ {
// passed as none-reference to modify in-place and move out again // passed as none-reference to modify in-place and move out again
OSRM_ATTR_WARN_UNUSED [[nodiscard]] std::vector<RouteStep> handleRoundabouts(std::vector<RouteStep> steps);
std::vector<RouteStep> handleRoundabouts(std::vector<RouteStep> steps);
// trim initial/final segment of very short length. // trim initial/final segment of very short length.
// This function uses in/out parameter passing to modify both steps and geometry in place. // This function uses in/out parameter passing to modify both steps and geometry in place.
@ -24,23 +22,21 @@ std::vector<RouteStep> handleRoundabouts(std::vector<RouteStep> steps);
void trimShortSegments(std::vector<RouteStep> &steps, LegGeometry &geometry); void trimShortSegments(std::vector<RouteStep> &steps, LegGeometry &geometry);
// assign relative locations to depart/arrive instructions // assign relative locations to depart/arrive instructions
OSRM_ATTR_WARN_UNUSED [[nodiscard]] std::vector<RouteStep> assignRelativeLocations(std::vector<RouteStep> steps,
std::vector<RouteStep> assignRelativeLocations(std::vector<RouteStep> steps,
const LegGeometry &geometry, const LegGeometry &geometry,
const PhantomNode &source_node, const PhantomNode &source_node,
const PhantomNode &target_node); const PhantomNode &target_node);
// collapse suppressed instructions remaining into intersections array // collapse suppressed instructions remaining into intersections array
OSRM_ATTR_WARN_UNUSED [[nodiscard]] std::vector<RouteStep> buildIntersections(std::vector<RouteStep> steps);
std::vector<RouteStep> buildIntersections(std::vector<RouteStep> steps);
// postProcess will break the connection between the leg geometry // postProcess will break the connection between the leg geometry
// for which a segment is supposed to represent exactly the coordinates // for which a segment is supposed to represent exactly the coordinates
// between routing maneuvers and the route steps itself. // between routing maneuvers and the route steps itself.
// If required, we can get both in sync again using this function. // If required, we can get both in sync again using this function.
// Move in LegGeometry for modification in place. // Move in LegGeometry for modification in place.
OSRM_ATTR_WARN_UNUSED [[nodiscard]] LegGeometry resyncGeometry(LegGeometry leg_geometry,
LegGeometry resyncGeometry(LegGeometry leg_geometry, const std::vector<RouteStep> &steps); const std::vector<RouteStep> &steps);
/** /**
* Apply maneuver override relations to the selected route. * Apply maneuver override relations to the selected route.

View File

@ -3,7 +3,7 @@
#include "engine/guidance/route_step.hpp" #include "engine/guidance/route_step.hpp"
#include <boost/optional.hpp> #include <optional>
#include <string> #include <string>
#include <vector> #include <vector>

View File

@ -2,7 +2,6 @@
#define OSRM_ENGINE_GUIDANCE_VERBOSITY_REDUCTION_HPP_ #define OSRM_ENGINE_GUIDANCE_VERBOSITY_REDUCTION_HPP_
#include "engine/guidance/route_step.hpp" #include "engine/guidance/route_step.hpp"
#include "util/attributes.hpp"
#include <vector> #include <vector>
@ -13,8 +12,7 @@ namespace osrm::engine::guidance
// to announce them. All these that are not collapsed into a single turn (think segregated // to announce them. All these that are not collapsed into a single turn (think segregated
// intersection) have to be checked for the length they are active in. If they are active for a // intersection) have to be checked for the length they are active in. If they are active for a
// short distance only, we don't announce them // short distance only, we don't announce them
OSRM_ATTR_WARN_UNUSED [[nodiscard]] std::vector<RouteStep> suppressShortNameSegments(std::vector<RouteStep> steps);
std::vector<RouteStep> suppressShortNameSegments(std::vector<RouteStep> steps);
} // namespace osrm::engine::guidance } // namespace osrm::engine::guidance

View File

@ -15,7 +15,7 @@
#include "util/integer_range.hpp" #include "util/integer_range.hpp"
#include "util/typedefs.hpp" #include "util/typedefs.hpp"
#include <boost/optional.hpp> #include <optional>
#include <vector> #include <vector>
namespace osrm::engine namespace osrm::engine
@ -42,7 +42,7 @@ struct PathData
// Source of the speed value on this road segment // Source of the speed value on this road segment
DatasourceID datasource_id; DatasourceID datasource_id;
// If segment precedes a turn, ID of the turn itself // If segment precedes a turn, ID of the turn itself
boost::optional<EdgeID> turn_edge; std::optional<EdgeID> turn_edge;
}; };
struct InternalRouteResult struct InternalRouteResult

View File

@ -6,7 +6,7 @@
#include <utility> #include <utility>
#include <vector> #include <vector>
#include <boost/math/constants/constants.hpp> #include <numbers>
namespace osrm::engine::map_matching namespace osrm::engine::map_matching
{ {
@ -21,10 +21,8 @@ struct NormalDistribution
// FIXME implement log-probability version since it's faster // FIXME implement log-probability version since it's faster
double Density(const double val) const double Density(const double val) const
{ {
using namespace boost::math::constants;
const double x = val - mean; const double x = val - mean;
return 1.0 / (std::sqrt(two_pi<double>()) * standard_deviation) * return 1.0 / (std::sqrt(2 * std::numbers::pi) * standard_deviation) *
std::exp(-x * x / (standard_deviation * standard_deviation)); std::exp(-x * x / (standard_deviation * standard_deviation));
} }

View File

@ -4,7 +4,7 @@
#include "util/integer_range.hpp" #include "util/integer_range.hpp"
#include <boost/assert.hpp> #include <boost/assert.hpp>
#include <boost/math/constants/constants.hpp> #include <numbers>
#include <cmath> #include <cmath>
@ -14,7 +14,7 @@
namespace osrm::engine::map_matching namespace osrm::engine::map_matching
{ {
static const double log_2_pi = std::log(2. * boost::math::constants::pi<double>()); static const double log_2_pi = std::log(2. * std::numbers::pi);
static const double IMPOSSIBLE_LOG_PROB = -std::numeric_limits<double>::infinity(); static const double IMPOSSIBLE_LOG_PROB = -std::numeric_limits<double>::infinity();
static const double MINIMAL_LOG_PROB = std::numeric_limits<double>::lowest(); static const double MINIMAL_LOG_PROB = std::numeric_limits<double>::lowest();
static const std::size_t INVALID_STATE = std::numeric_limits<std::size_t>::max(); static const std::size_t INVALID_STATE = std::numeric_limits<std::size_t>::max();

View File

@ -2,7 +2,7 @@
#define ENGINE_MAP_MATCHING_CONFIDENCE_HPP #define ENGINE_MAP_MATCHING_CONFIDENCE_HPP
#include "engine/map_matching/bayes_classifier.hpp" #include "engine/map_matching/bayes_classifier.hpp"
#include <boost/assert.hpp>
#include <cmath> #include <cmath>
namespace osrm::engine::map_matching namespace osrm::engine::map_matching

View File

@ -22,7 +22,7 @@ class MatchPlugin : public BasePlugin
MatchPlugin(const int max_locations_map_matching, MatchPlugin(const int max_locations_map_matching,
const double max_radius_map_matching, const double max_radius_map_matching,
const boost::optional<double> default_radius) const std::optional<double> default_radius)
: BasePlugin(default_radius), max_locations_map_matching(max_locations_map_matching), : BasePlugin(default_radius), max_locations_map_matching(max_locations_map_matching),
max_radius_map_matching(max_radius_map_matching) max_radius_map_matching(max_radius_map_matching)
{ {

View File

@ -13,7 +13,7 @@ namespace osrm::engine::plugins
class NearestPlugin final : public BasePlugin class NearestPlugin final : public BasePlugin
{ {
public: public:
explicit NearestPlugin(const int max_results, const boost::optional<double> default_radius); explicit NearestPlugin(const int max_results, const std::optional<double> default_radius);
Status HandleRequest(const RoutingAlgorithmsInterface &algorithms, Status HandleRequest(const RoutingAlgorithmsInterface &algorithms,
const api::NearestParameters &params, const api::NearestParameters &params,

View File

@ -29,7 +29,7 @@ class BasePlugin
protected: protected:
BasePlugin() = default; BasePlugin() = default;
BasePlugin(const boost::optional<double> default_radius_) : default_radius(default_radius_) {} BasePlugin(const std::optional<double> default_radius_) : default_radius(default_radius_) {}
bool CheckAllCoordinates(const std::vector<util::Coordinate> &coordinates) const bool CheckAllCoordinates(const std::vector<util::Coordinate> &coordinates) const
{ {
@ -95,7 +95,7 @@ class BasePlugin
const std::string &message, const std::string &message,
osrm::engine::api::ResultT &result) const osrm::engine::api::ResultT &result) const
{ {
mapbox::util::apply_visitor(ErrorRenderer(code, message), result); std::visit(ErrorRenderer(code, message), result);
return Status::Error; return Status::Error;
} }
@ -200,8 +200,8 @@ class BasePlugin
phantom_nodes[i] = facade.NearestPhantomNodesInRange( phantom_nodes[i] = facade.NearestPhantomNodesInRange(
parameters.coordinates[i], parameters.coordinates[i],
radiuses[i], radiuses[i],
use_bearings ? parameters.bearings[i] : boost::none, use_bearings ? parameters.bearings[i] : std::nullopt,
use_approaches && parameters.approaches[i] ? parameters.approaches[i].get() use_approaches && parameters.approaches[i] ? parameters.approaches[i].value()
: engine::Approach::UNRESTRICTED, : engine::Approach::UNRESTRICTED,
use_all_edges); use_all_edges);
} }
@ -242,8 +242,8 @@ class BasePlugin
parameters.coordinates[i], parameters.coordinates[i],
number_of_results, number_of_results,
use_radiuses ? parameters.radiuses[i] : default_radius, use_radiuses ? parameters.radiuses[i] : default_radius,
use_bearings ? parameters.bearings[i] : boost::none, use_bearings ? parameters.bearings[i] : std::nullopt,
use_approaches && parameters.approaches[i] ? parameters.approaches[i].get() use_approaches && parameters.approaches[i] ? parameters.approaches[i].value()
: engine::Approach::UNRESTRICTED); : engine::Approach::UNRESTRICTED);
// we didn't find a fitting node, return error // we didn't find a fitting node, return error
@ -284,8 +284,8 @@ class BasePlugin
alternatives[i] = facade.NearestCandidatesWithAlternativeFromBigComponent( alternatives[i] = facade.NearestCandidatesWithAlternativeFromBigComponent(
parameters.coordinates[i], parameters.coordinates[i],
use_radiuses ? parameters.radiuses[i] : default_radius, use_radiuses ? parameters.radiuses[i] : default_radius,
use_bearings ? parameters.bearings[i] : boost::none, use_bearings ? parameters.bearings[i] : std::nullopt,
use_approaches && parameters.approaches[i] ? parameters.approaches[i].get() use_approaches && parameters.approaches[i] ? parameters.approaches[i].value()
: engine::Approach::UNRESTRICTED, : engine::Approach::UNRESTRICTED,
use_all_edges); use_all_edges);
@ -325,7 +325,7 @@ class BasePlugin
std::to_string(missing_index); std::to_string(missing_index);
} }
const boost::optional<double> default_radius; const std::optional<double> default_radius;
}; };
} // namespace osrm::engine::plugins } // namespace osrm::engine::plugins

View File

@ -15,7 +15,7 @@ class TablePlugin final : public BasePlugin
{ {
public: public:
explicit TablePlugin(const int max_locations_distance_table, explicit TablePlugin(const int max_locations_distance_table,
const boost::optional<double> default_radius); const std::optional<double> default_radius);
Status HandleRequest(const RoutingAlgorithmsInterface &algorithms, Status HandleRequest(const RoutingAlgorithmsInterface &algorithms,
const api::TableParameters &params, const api::TableParameters &params,

View File

@ -32,7 +32,7 @@ class TripPlugin final : public BasePlugin
const bool roundtrip) const; const bool roundtrip) const;
public: public:
explicit TripPlugin(const int max_locations_trip_, boost::optional<double> default_radius) explicit TripPlugin(const int max_locations_trip_, std::optional<double> default_radius)
: BasePlugin(default_radius), max_locations_trip(max_locations_trip_) : BasePlugin(default_radius), max_locations_trip(max_locations_trip_)
{ {
} }

View File

@ -27,7 +27,7 @@ class ViaRoutePlugin final : public BasePlugin
public: public:
explicit ViaRoutePlugin(int max_locations_viaroute, explicit ViaRoutePlugin(int max_locations_viaroute,
int max_alternatives, int max_alternatives,
boost::optional<double> default_radius); std::optional<double> default_radius);
Status HandleRequest(const RoutingAlgorithmsInterface &algorithms, Status HandleRequest(const RoutingAlgorithmsInterface &algorithms,
const api::RouteParameters &route_parameters, const api::RouteParameters &route_parameters,

View File

@ -12,7 +12,7 @@ namespace osrm::engine
{ {
namespace detail namespace detail
{ {
std::string encode(std::vector<int> &numbers); void encode(int number_to_encode, std::string &output);
std::int32_t decode_polyline_integer(std::string::const_iterator &first, std::int32_t decode_polyline_integer(std::string::const_iterator &first,
std::string::const_iterator last); std::string::const_iterator last);
} // namespace detail } // namespace detail
@ -30,27 +30,24 @@ std::string encodePolyline(CoordVectorForwardIter begin, CoordVectorForwardIter
return {}; return {};
} }
std::vector<int> delta_numbers; std::string output;
BOOST_ASSERT(size > 0); // just a guess that we will need ~4 bytes per coordinate to avoid reallocations
delta_numbers.reserve((size - 1) * 2); output.reserve(size * 4);
int current_lat = 0; int current_lat = 0;
int current_lon = 0; int current_lon = 0;
std::for_each( for (auto it = begin; it != end; ++it)
begin,
end,
[&delta_numbers, &current_lat, &current_lon, coordinate_to_polyline](
const util::Coordinate loc)
{ {
const int lat_diff = const int lat_diff =
std::round(static_cast<int>(loc.lat) * coordinate_to_polyline) - current_lat; std::round(static_cast<int>(it->lat) * coordinate_to_polyline) - current_lat;
const int lon_diff = const int lon_diff =
std::round(static_cast<int>(loc.lon) * coordinate_to_polyline) - current_lon; std::round(static_cast<int>(it->lon) * coordinate_to_polyline) - current_lon;
delta_numbers.emplace_back(lat_diff); detail::encode(lat_diff, output);
delta_numbers.emplace_back(lon_diff); detail::encode(lon_diff, output);
current_lat += lat_diff; current_lat += lat_diff;
current_lon += lon_diff; current_lon += lon_diff;
}); }
return detail::encode(delta_numbers); return output;
} }
// Decodes geometry from polyline format // Decodes geometry from polyline format

View File

@ -25,7 +25,7 @@ class RoutingAlgorithmsInterface
virtual InternalRouteResult virtual InternalRouteResult
ShortestPathSearch(const std::vector<PhantomNodeCandidates> &waypoint_candidates, ShortestPathSearch(const std::vector<PhantomNodeCandidates> &waypoint_candidates,
const boost::optional<bool> continue_straight_at_waypoint) const = 0; const std::optional<bool> continue_straight_at_waypoint) const = 0;
virtual InternalRouteResult virtual InternalRouteResult
DirectShortestPathSearch(const PhantomEndpointCandidates &endpoint_candidates) const = 0; DirectShortestPathSearch(const PhantomEndpointCandidates &endpoint_candidates) const = 0;
@ -40,7 +40,7 @@ class RoutingAlgorithmsInterface
MapMatching(const routing_algorithms::CandidateLists &candidates_list, MapMatching(const routing_algorithms::CandidateLists &candidates_list,
const std::vector<util::Coordinate> &trace_coordinates, const std::vector<util::Coordinate> &trace_coordinates,
const std::vector<unsigned> &trace_timestamps, const std::vector<unsigned> &trace_timestamps,
const std::vector<boost::optional<double>> &trace_gps_precision, const std::vector<std::optional<double>> &trace_gps_precision,
const bool allow_splitting) const = 0; const bool allow_splitting) const = 0;
virtual std::vector<routing_algorithms::TurnData> virtual std::vector<routing_algorithms::TurnData>
@ -78,7 +78,7 @@ template <typename Algorithm> class RoutingAlgorithms final : public RoutingAlgo
InternalRouteResult ShortestPathSearch( InternalRouteResult ShortestPathSearch(
const std::vector<PhantomNodeCandidates> &waypoint_candidates, const std::vector<PhantomNodeCandidates> &waypoint_candidates,
const boost::optional<bool> continue_straight_at_waypoint) const final override; const std::optional<bool> continue_straight_at_waypoint) const final override;
InternalRouteResult DirectShortestPathSearch( InternalRouteResult DirectShortestPathSearch(
const PhantomEndpointCandidates &endpoint_candidates) const final override; const PhantomEndpointCandidates &endpoint_candidates) const final override;
@ -93,7 +93,7 @@ template <typename Algorithm> class RoutingAlgorithms final : public RoutingAlgo
MapMatching(const routing_algorithms::CandidateLists &candidates_list, MapMatching(const routing_algorithms::CandidateLists &candidates_list,
const std::vector<util::Coordinate> &trace_coordinates, const std::vector<util::Coordinate> &trace_coordinates,
const std::vector<unsigned> &trace_timestamps, const std::vector<unsigned> &trace_timestamps,
const std::vector<boost::optional<double>> &trace_gps_precision, const std::vector<std::optional<double>> &trace_gps_precision,
const bool allow_splitting) const final override; const bool allow_splitting) const final override;
std::vector<routing_algorithms::TurnData> std::vector<routing_algorithms::TurnData>
@ -160,7 +160,7 @@ InternalManyRoutesResult RoutingAlgorithms<Algorithm>::AlternativePathSearch(
template <typename Algorithm> template <typename Algorithm>
InternalRouteResult RoutingAlgorithms<Algorithm>::ShortestPathSearch( InternalRouteResult RoutingAlgorithms<Algorithm>::ShortestPathSearch(
const std::vector<PhantomNodeCandidates> &waypoint_candidates, const std::vector<PhantomNodeCandidates> &waypoint_candidates,
const boost::optional<bool> continue_straight_at_waypoint) const const std::optional<bool> continue_straight_at_waypoint) const
{ {
return routing_algorithms::shortestPathSearch( return routing_algorithms::shortestPathSearch(
heaps, *facade, waypoint_candidates, continue_straight_at_waypoint); heaps, *facade, waypoint_candidates, continue_straight_at_waypoint);
@ -178,7 +178,7 @@ inline routing_algorithms::SubMatchingList RoutingAlgorithms<Algorithm>::MapMatc
const routing_algorithms::CandidateLists &candidates_list, const routing_algorithms::CandidateLists &candidates_list,
const std::vector<util::Coordinate> &trace_coordinates, const std::vector<util::Coordinate> &trace_coordinates,
const std::vector<unsigned> &trace_timestamps, const std::vector<unsigned> &trace_timestamps,
const std::vector<boost::optional<double>> &trace_gps_precision, const std::vector<std::optional<double>> &trace_gps_precision,
const bool allow_splitting) const const bool allow_splitting) const
{ {
return routing_algorithms::mapMatching(heaps, return routing_algorithms::mapMatching(heaps,

View File

@ -24,7 +24,7 @@ SubMatchingList mapMatching(SearchEngineData<Algorithm> &engine_working_data,
const CandidateLists &candidates_list, const CandidateLists &candidates_list,
const std::vector<util::Coordinate> &trace_coordinates, const std::vector<util::Coordinate> &trace_coordinates,
const std::vector<unsigned> &trace_timestamps, const std::vector<unsigned> &trace_timestamps,
const std::vector<boost::optional<double>> &trace_gps_precision, const std::vector<std::optional<double>> &trace_gps_precision,
const bool allow_splitting); const bool allow_splitting);
} // namespace osrm::engine::routing_algorithms } // namespace osrm::engine::routing_algorithms

View File

@ -258,7 +258,7 @@ void annotatePath(const FacadeT &facade,
alias_cast<EdgeDuration>(duration_vector[segment_idx]), alias_cast<EdgeDuration>(duration_vector[segment_idx]),
{0}, {0},
datasource_vector[segment_idx], datasource_vector[segment_idx],
boost::none}); std::nullopt});
} }
BOOST_ASSERT(!unpacked_path.empty()); BOOST_ASSERT(!unpacked_path.empty());
@ -315,7 +315,7 @@ void annotatePath(const FacadeT &facade,
alias_cast<EdgeDuration>(duration_vector[segment_idx]), alias_cast<EdgeDuration>(duration_vector[segment_idx]),
{0}, {0},
datasource_vector[segment_idx], datasource_vector[segment_idx],
boost::none}); std::nullopt});
} }
if (!unpacked_path.empty()) if (!unpacked_path.empty())

View File

@ -122,7 +122,7 @@ void routingStep(const DataFacade<Algorithm> &facade,
const EdgeWeight new_weight = reverseHeapNode->weight + heapNode.weight; const EdgeWeight new_weight = reverseHeapNode->weight + heapNode.weight;
if (new_weight < upper_bound) if (new_weight < upper_bound)
{ {
if (shouldForceStep(force_step_nodes, heapNode, reverseHeapNode.get()) || if (shouldForceStep(force_step_nodes, heapNode, *reverseHeapNode) ||
// in this case we are looking at a bi-directional way where the source // in this case we are looking at a bi-directional way where the source
// and target phantom are on the same edge based node // and target phantom are on the same edge based node
new_weight < EdgeWeight{0}) new_weight < EdgeWeight{0})

View File

@ -11,6 +11,7 @@
#include <boost/assert.hpp> #include <boost/assert.hpp>
#include <algorithm> #include <algorithm>
#include <boost/core/ignore_unused.hpp>
#include <iterator> #include <iterator>
#include <limits> #include <limits>
#include <tuple> #include <tuple>
@ -269,10 +270,29 @@ retrievePackedPathFromHeap(const SearchEngineData<Algorithm>::QueryHeap &forward
return packed_path; return packed_path;
} }
template <bool DIRECTION, typename Algorithm, typename... Args> template <typename Heap>
void insertOrUpdate(Heap &heap,
const NodeID node,
const EdgeWeight weight,
const typename Heap::DataType &data)
{
const auto heapNode = heap.GetHeapNodeIfWasInserted(node);
if (!heapNode)
{
heap.Insert(node, weight, data);
}
else if (weight < heapNode->weight)
{
heapNode->data = data;
heapNode->weight = weight;
heap.DecreaseKey(*heapNode);
}
}
template <bool DIRECTION, typename Algorithm, typename Heap, typename... Args>
void relaxOutgoingEdges(const DataFacade<Algorithm> &facade, void relaxOutgoingEdges(const DataFacade<Algorithm> &facade,
typename SearchEngineData<Algorithm>::QueryHeap &forward_heap, Heap &forward_heap,
const typename SearchEngineData<Algorithm>::QueryHeap::HeapNode &heapNode, const typename Heap::HeapNode &heapNode,
const Args &...args) const Args &...args)
{ {
const auto &partition = facade.GetMultiLevelPartition(); const auto &partition = facade.GetMultiLevelPartition();
@ -281,14 +301,31 @@ void relaxOutgoingEdges(const DataFacade<Algorithm> &facade,
const auto level = getNodeQueryLevel(partition, heapNode.node, args...); const auto level = getNodeQueryLevel(partition, heapNode.node, args...);
static constexpr auto IS_MAP_MATCHING =
std::is_same_v<typename SearchEngineData<mld::Algorithm>::MapMatchingQueryHeap, Heap>;
if (level >= 1 && !heapNode.data.from_clique_arc) if (level >= 1 && !heapNode.data.from_clique_arc)
{ {
if (DIRECTION == FORWARD_DIRECTION) if constexpr (DIRECTION == FORWARD_DIRECTION)
{ {
// Shortcuts in forward direction // Shortcuts in forward direction
const auto &cell = const auto &cell =
cells.GetCell(metric, level, partition.GetCell(level, heapNode.node)); cells.GetCell(metric, level, partition.GetCell(level, heapNode.node));
auto destination = cell.GetDestinationNodes().begin(); auto destination = cell.GetDestinationNodes().begin();
auto distance = [&cell, node = heapNode.node ]() -> auto
{
if constexpr (IS_MAP_MATCHING)
{
return cell.GetOutDistance(node).begin();
}
else
{
boost::ignore_unused(cell, node);
return 0;
}
}
();
for (auto shortcut_weight : cell.GetOutWeight(heapNode.node)) for (auto shortcut_weight : cell.GetOutWeight(heapNode.node))
{ {
BOOST_ASSERT(destination != cell.GetDestinationNodes().end()); BOOST_ASSERT(destination != cell.GetDestinationNodes().end());
@ -298,19 +335,23 @@ void relaxOutgoingEdges(const DataFacade<Algorithm> &facade,
{ {
const EdgeWeight to_weight = heapNode.weight + shortcut_weight; const EdgeWeight to_weight = heapNode.weight + shortcut_weight;
BOOST_ASSERT(to_weight >= heapNode.weight); BOOST_ASSERT(to_weight >= heapNode.weight);
const auto toHeapNode = forward_heap.GetHeapNodeIfWasInserted(to);
if (!toHeapNode) if constexpr (IS_MAP_MATCHING)
{ {
forward_heap.Insert(to, to_weight, {heapNode.node, true}); const EdgeDistance to_distance = heapNode.data.distance + *distance;
insertOrUpdate(
forward_heap, to, to_weight, {heapNode.node, true, to_distance});
} }
else if (to_weight < toHeapNode->weight) else
{ {
toHeapNode->data = {heapNode.node, true}; insertOrUpdate(forward_heap, to, to_weight, {heapNode.node, true});
toHeapNode->weight = to_weight;
forward_heap.DecreaseKey(*toHeapNode);
} }
} }
++destination; ++destination;
if constexpr (IS_MAP_MATCHING)
{
++distance;
}
} }
} }
else else
@ -319,6 +360,20 @@ void relaxOutgoingEdges(const DataFacade<Algorithm> &facade,
const auto &cell = const auto &cell =
cells.GetCell(metric, level, partition.GetCell(level, heapNode.node)); cells.GetCell(metric, level, partition.GetCell(level, heapNode.node));
auto source = cell.GetSourceNodes().begin(); auto source = cell.GetSourceNodes().begin();
auto distance = [&cell, node = heapNode.node ]() -> auto
{
if constexpr (IS_MAP_MATCHING)
{
return cell.GetInDistance(node).begin();
}
else
{
boost::ignore_unused(cell, node);
return 0;
}
}
();
for (auto shortcut_weight : cell.GetInWeight(heapNode.node)) for (auto shortcut_weight : cell.GetInWeight(heapNode.node))
{ {
BOOST_ASSERT(source != cell.GetSourceNodes().end()); BOOST_ASSERT(source != cell.GetSourceNodes().end());
@ -328,19 +383,22 @@ void relaxOutgoingEdges(const DataFacade<Algorithm> &facade,
{ {
const EdgeWeight to_weight = heapNode.weight + shortcut_weight; const EdgeWeight to_weight = heapNode.weight + shortcut_weight;
BOOST_ASSERT(to_weight >= heapNode.weight); BOOST_ASSERT(to_weight >= heapNode.weight);
const auto toHeapNode = forward_heap.GetHeapNodeIfWasInserted(to); if constexpr (IS_MAP_MATCHING)
if (!toHeapNode)
{ {
forward_heap.Insert(to, to_weight, {heapNode.node, true}); const EdgeDistance to_distance = heapNode.data.distance + *distance;
insertOrUpdate(
forward_heap, to, to_weight, {heapNode.node, true, to_distance});
} }
else if (to_weight < toHeapNode->weight) else
{ {
toHeapNode->data = {heapNode.node, true}; insertOrUpdate(forward_heap, to, to_weight, {heapNode.node, true});
toHeapNode->weight = to_weight;
forward_heap.DecreaseKey(*toHeapNode);
} }
} }
++source; ++source;
if constexpr (IS_MAP_MATCHING)
{
++distance;
}
} }
} }
} }
@ -367,26 +425,28 @@ void relaxOutgoingEdges(const DataFacade<Algorithm> &facade,
const EdgeWeight to_weight = const EdgeWeight to_weight =
heapNode.weight + node_weight + alias_cast<EdgeWeight>(turn_penalty); heapNode.weight + node_weight + alias_cast<EdgeWeight>(turn_penalty);
const auto toHeapNode = forward_heap.GetHeapNodeIfWasInserted(to); if constexpr (IS_MAP_MATCHING)
if (!toHeapNode)
{ {
forward_heap.Insert(to, to_weight, {heapNode.node, false}); const auto node_distance =
facade.GetNodeDistance(DIRECTION == FORWARD_DIRECTION ? heapNode.node : to);
const EdgeDistance to_distance = heapNode.data.distance + node_distance;
insertOrUpdate(
forward_heap, to, to_weight, {heapNode.node, false, to_distance});
} }
else if (to_weight < toHeapNode->weight) else
{ {
toHeapNode->data = {heapNode.node, false}; insertOrUpdate(forward_heap, to, to_weight, {heapNode.node, false});
toHeapNode->weight = to_weight;
forward_heap.DecreaseKey(*toHeapNode);
} }
} }
} }
} }
} }
template <bool DIRECTION, typename Algorithm, typename... Args> template <bool DIRECTION, typename Algorithm, typename Heap, typename... Args>
void routingStep(const DataFacade<Algorithm> &facade, void routingStep(const DataFacade<Algorithm> &facade,
typename SearchEngineData<Algorithm>::QueryHeap &forward_heap, Heap &forward_heap,
typename SearchEngineData<Algorithm>::QueryHeap &reverse_heap, Heap &reverse_heap,
NodeID &middle_node, NodeID &middle_node,
EdgeWeight &path_upper_bound, EdgeWeight &path_upper_bound,
const std::vector<NodeID> &force_step_nodes, const std::vector<NodeID> &force_step_nodes,
@ -408,7 +468,7 @@ void routingStep(const DataFacade<Algorithm> &facade,
auto reverse_weight = reverseHeapNode->weight; auto reverse_weight = reverseHeapNode->weight;
auto path_weight = weight + reverse_weight; auto path_weight = weight + reverse_weight;
if (!shouldForceStep(force_step_nodes, heapNode, reverseHeapNode.get()) && if (!shouldForceStep(force_step_nodes, heapNode, *reverseHeapNode) &&
(path_weight >= EdgeWeight{0}) && (path_weight < path_upper_bound)) (path_weight >= EdgeWeight{0}) && (path_weight < path_upper_bound))
{ {
middle_node = heapNode.node; middle_node = heapNode.node;
@ -427,24 +487,27 @@ void routingStep(const DataFacade<Algorithm> &facade,
using UnpackedNodes = std::vector<NodeID>; using UnpackedNodes = std::vector<NodeID>;
using UnpackedEdges = std::vector<EdgeID>; using UnpackedEdges = std::vector<EdgeID>;
using UnpackedPath = std::tuple<EdgeWeight, UnpackedNodes, UnpackedEdges>;
template <typename Algorithm, typename... Args> struct UnpackedPath
UnpackedPath search(SearchEngineData<Algorithm> &engine_working_data, {
const DataFacade<Algorithm> &facade, EdgeWeight weight;
typename SearchEngineData<Algorithm>::QueryHeap &forward_heap, UnpackedNodes nodes;
typename SearchEngineData<Algorithm>::QueryHeap &reverse_heap, UnpackedEdges edges;
};
template <typename Algorithm, typename Heap, typename... Args>
std::optional<std::pair<NodeID, EdgeWeight>> runSearch(const DataFacade<Algorithm> &facade,
Heap &forward_heap,
Heap &reverse_heap,
const std::vector<NodeID> &force_step_nodes, const std::vector<NodeID> &force_step_nodes,
EdgeWeight weight_upper_bound, EdgeWeight weight_upper_bound,
const Args &...args) const Args &...args)
{ {
if (forward_heap.Empty() || reverse_heap.Empty()) if (forward_heap.Empty() || reverse_heap.Empty())
{ {
return std::make_tuple(INVALID_EDGE_WEIGHT, std::vector<NodeID>(), std::vector<EdgeID>()); return {};
} }
const auto &partition = facade.GetMultiLevelPartition();
BOOST_ASSERT(!forward_heap.Empty() && forward_heap.MinKey() < INVALID_EDGE_WEIGHT); BOOST_ASSERT(!forward_heap.Empty() && forward_heap.MinKey() < INVALID_EDGE_WEIGHT);
BOOST_ASSERT(!reverse_heap.Empty() && reverse_heap.MinKey() < INVALID_EDGE_WEIGHT); BOOST_ASSERT(!reverse_heap.Empty() && reverse_heap.MinKey() < INVALID_EDGE_WEIGHT);
@ -475,9 +538,32 @@ UnpackedPath search(SearchEngineData<Algorithm> &engine_working_data,
// No path found for both target nodes? // No path found for both target nodes?
if (weight >= weight_upper_bound || SPECIAL_NODEID == middle) if (weight >= weight_upper_bound || SPECIAL_NODEID == middle)
{ {
return std::make_tuple(INVALID_EDGE_WEIGHT, std::vector<NodeID>(), std::vector<EdgeID>()); return {};
} }
return {{middle, weight}};
}
template <typename Algorithm, typename... Args>
UnpackedPath search(SearchEngineData<Algorithm> &engine_working_data,
const DataFacade<Algorithm> &facade,
typename SearchEngineData<Algorithm>::QueryHeap &forward_heap,
typename SearchEngineData<Algorithm>::QueryHeap &reverse_heap,
const std::vector<NodeID> &force_step_nodes,
EdgeWeight weight_upper_bound,
const Args &...args)
{
auto searchResult = runSearch(
facade, forward_heap, reverse_heap, force_step_nodes, weight_upper_bound, args...);
if (!searchResult)
{
return {INVALID_EDGE_WEIGHT, std::vector<NodeID>(), std::vector<EdgeID>()};
}
auto [middle, weight] = *searchResult;
const auto &partition = facade.GetMultiLevelPartition();
// Get packed path as edges {from node ID, to node ID, from_clique_arc} // Get packed path as edges {from node ID, to node ID, from_clique_arc}
auto packed_path = retrievePackedPathFromHeap(forward_heap, reverse_heap, middle); auto packed_path = retrievePackedPathFromHeap(forward_heap, reverse_heap, middle);
@ -515,7 +601,7 @@ UnpackedPath search(SearchEngineData<Algorithm> &engine_working_data,
forward_heap.Insert(source, {0}, {source}); forward_heap.Insert(source, {0}, {source});
reverse_heap.Insert(target, {0}, {target}); reverse_heap.Insert(target, {0}, {target});
auto [subpath_weight, subpath_nodes, subpath_edges] = search(engine_working_data, auto unpacked_subpath = search(engine_working_data,
facade, facade,
forward_heap, forward_heap,
reverse_heap, reverse_heap,
@ -523,17 +609,44 @@ UnpackedPath search(SearchEngineData<Algorithm> &engine_working_data,
INVALID_EDGE_WEIGHT, INVALID_EDGE_WEIGHT,
sublevel, sublevel,
parent_cell_id); parent_cell_id);
BOOST_ASSERT(!subpath_edges.empty()); BOOST_ASSERT(!unpacked_subpath.edges.empty());
BOOST_ASSERT(subpath_nodes.size() > 1); BOOST_ASSERT(unpacked_subpath.nodes.size() > 1);
BOOST_ASSERT(subpath_nodes.front() == source); BOOST_ASSERT(unpacked_subpath.nodes.front() == source);
BOOST_ASSERT(subpath_nodes.back() == target); BOOST_ASSERT(unpacked_subpath.nodes.back() == target);
unpacked_nodes.insert( unpacked_nodes.insert(unpacked_nodes.end(),
unpacked_nodes.end(), std::next(subpath_nodes.begin()), subpath_nodes.end()); std::next(unpacked_subpath.nodes.begin()),
unpacked_edges.insert(unpacked_edges.end(), subpath_edges.begin(), subpath_edges.end()); unpacked_subpath.nodes.end());
unpacked_edges.insert(
unpacked_edges.end(), unpacked_subpath.edges.begin(), unpacked_subpath.edges.end());
} }
} }
return std::make_tuple(weight, std::move(unpacked_nodes), std::move(unpacked_edges)); return {weight, std::move(unpacked_nodes), std::move(unpacked_edges)};
}
template <typename Algorithm, typename... Args>
EdgeDistance
searchDistance(SearchEngineData<Algorithm> &,
const DataFacade<Algorithm> &facade,
typename SearchEngineData<Algorithm>::MapMatchingQueryHeap &forward_heap,
typename SearchEngineData<Algorithm>::MapMatchingQueryHeap &reverse_heap,
const std::vector<NodeID> &force_step_nodes,
EdgeWeight weight_upper_bound,
const Args &...args)
{
auto searchResult = runSearch(
facade, forward_heap, reverse_heap, force_step_nodes, weight_upper_bound, args...);
if (!searchResult)
{
return INVALID_EDGE_DISTANCE;
}
auto [middle, _] = *searchResult;
auto distance = forward_heap.GetData(middle).distance + reverse_heap.GetData(middle).distance;
return distance;
} }
// Alias to be compatible with the CH-based search // Alias to be compatible with the CH-based search
@ -549,13 +662,15 @@ inline void search(SearchEngineData<Algorithm> &engine_working_data,
const EdgeWeight weight_upper_bound = INVALID_EDGE_WEIGHT) const EdgeWeight weight_upper_bound = INVALID_EDGE_WEIGHT)
{ {
// TODO: change search calling interface to use unpacked_edges result // TODO: change search calling interface to use unpacked_edges result
std::tie(weight, unpacked_nodes, std::ignore) = search(engine_working_data, auto unpacked_path = search(engine_working_data,
facade, facade,
forward_heap, forward_heap,
reverse_heap, reverse_heap,
force_step_nodes, force_step_nodes,
weight_upper_bound, weight_upper_bound,
endpoints); endpoints);
weight = unpacked_path.weight;
unpacked_nodes = std::move(unpacked_path.nodes);
} }
// TODO: refactor CH-related stub to use unpacked_edges // TODO: refactor CH-related stub to use unpacked_edges
@ -593,8 +708,8 @@ void unpackPath(const FacadeT &facade,
template <typename Algorithm> template <typename Algorithm>
double getNetworkDistance(SearchEngineData<Algorithm> &engine_working_data, double getNetworkDistance(SearchEngineData<Algorithm> &engine_working_data,
const DataFacade<Algorithm> &facade, const DataFacade<Algorithm> &facade,
typename SearchEngineData<Algorithm>::QueryHeap &forward_heap, typename SearchEngineData<Algorithm>::MapMatchingQueryHeap &forward_heap,
typename SearchEngineData<Algorithm>::QueryHeap &reverse_heap, typename SearchEngineData<Algorithm>::MapMatchingQueryHeap &reverse_heap,
const PhantomNode &source_phantom, const PhantomNode &source_phantom,
const PhantomNode &target_phantom, const PhantomNode &target_phantom,
EdgeWeight weight_upper_bound = INVALID_EDGE_WEIGHT) EdgeWeight weight_upper_bound = INVALID_EDGE_WEIGHT)
@ -602,48 +717,49 @@ double getNetworkDistance(SearchEngineData<Algorithm> &engine_working_data,
forward_heap.Clear(); forward_heap.Clear();
reverse_heap.Clear(); reverse_heap.Clear();
const PhantomEndpoints endpoints{source_phantom, target_phantom}; if (source_phantom.IsValidForwardSource())
insertNodesInHeaps(forward_heap, reverse_heap, endpoints); {
forward_heap.Insert(source_phantom.forward_segment_id.id,
EdgeWeight{0} - source_phantom.GetForwardWeightPlusOffset(),
{source_phantom.forward_segment_id.id,
false,
EdgeDistance{0} - source_phantom.GetForwardDistance()});
}
auto [weight, unpacked_nodes, unpacked_edges] = search( if (source_phantom.IsValidReverseSource())
{
forward_heap.Insert(source_phantom.reverse_segment_id.id,
EdgeWeight{0} - source_phantom.GetReverseWeightPlusOffset(),
{source_phantom.reverse_segment_id.id,
false,
EdgeDistance{0} - source_phantom.GetReverseDistance()});
}
if (target_phantom.IsValidForwardTarget())
{
reverse_heap.Insert(
target_phantom.forward_segment_id.id,
target_phantom.GetForwardWeightPlusOffset(),
{target_phantom.forward_segment_id.id, false, target_phantom.GetForwardDistance()});
}
if (target_phantom.IsValidReverseTarget())
{
reverse_heap.Insert(
target_phantom.reverse_segment_id.id,
target_phantom.GetReverseWeightPlusOffset(),
{target_phantom.reverse_segment_id.id, false, target_phantom.GetReverseDistance()});
}
const PhantomEndpoints endpoints{source_phantom, target_phantom};
auto distance = searchDistance(
engine_working_data, facade, forward_heap, reverse_heap, {}, weight_upper_bound, endpoints); engine_working_data, facade, forward_heap, reverse_heap, {}, weight_upper_bound, endpoints);
if (weight == INVALID_EDGE_WEIGHT) if (distance == INVALID_EDGE_DISTANCE)
{ {
return std::numeric_limits<double>::max(); return std::numeric_limits<double>::max();
} }
BOOST_ASSERT(unpacked_nodes.size() >= 1);
EdgeDistance distance = {0.0};
if (source_phantom.forward_segment_id.id == unpacked_nodes.front())
{
BOOST_ASSERT(source_phantom.forward_segment_id.enabled);
distance = EdgeDistance{0} - source_phantom.GetForwardDistance();
}
else if (source_phantom.reverse_segment_id.id == unpacked_nodes.front())
{
BOOST_ASSERT(source_phantom.reverse_segment_id.enabled);
distance = EdgeDistance{0} - source_phantom.GetReverseDistance();
}
for (size_t index = 0; index < unpacked_nodes.size() - 1; ++index)
{
distance += facade.GetNodeDistance(unpacked_nodes[index]);
}
if (target_phantom.forward_segment_id.id == unpacked_nodes.back())
{
BOOST_ASSERT(target_phantom.forward_segment_id.enabled);
distance += target_phantom.GetForwardDistance();
}
else if (target_phantom.reverse_segment_id.id == unpacked_nodes.back())
{
BOOST_ASSERT(target_phantom.reverse_segment_id.enabled);
distance += target_phantom.GetReverseDistance();
}
return from_alias<double>(distance); return from_alias<double>(distance);
} }

View File

@ -14,7 +14,7 @@ InternalRouteResult
shortestPathSearch(SearchEngineData<Algorithm> &engine_working_data, shortestPathSearch(SearchEngineData<Algorithm> &engine_working_data,
const DataFacade<Algorithm> &facade, const DataFacade<Algorithm> &facade,
const std::vector<PhantomNodeCandidates> &waypoint_candidates, const std::vector<PhantomNodeCandidates> &waypoint_candidates,
const boost::optional<bool> continue_straight_at_waypoint); const std::optional<bool> continue_straight_at_waypoint);
} // namespace osrm::engine::routing_algorithms } // namespace osrm::engine::routing_algorithms

View File

@ -4,7 +4,7 @@
#include "engine/routing_algorithms/shortest_path.hpp" #include "engine/routing_algorithms/shortest_path.hpp"
#include <boost/assert.hpp> #include <boost/assert.hpp>
#include <boost/optional.hpp> #include <optional>
namespace osrm::engine::routing_algorithms namespace osrm::engine::routing_algorithms
{ {
@ -339,10 +339,10 @@ struct leg_connections
{ {
// X_to_Y = i can be read as // X_to_Y = i can be read as
// sources[i].X is the source of the shortest leg path to target.Y // sources[i].X is the source of the shortest leg path to target.Y
boost::optional<size_t> forward_to_forward; std::optional<size_t> forward_to_forward;
boost::optional<size_t> reverse_to_forward; std::optional<size_t> reverse_to_forward;
boost::optional<size_t> forward_to_reverse; std::optional<size_t> forward_to_reverse;
boost::optional<size_t> reverse_to_reverse; std::optional<size_t> reverse_to_reverse;
}; };
// Identify which of the source candidates segments is being used for paths to the // Identify which of the source candidates segments is being used for paths to the
@ -771,7 +771,7 @@ InternalRouteResult
shortestPathSearch(SearchEngineData<Algorithm> &engine_working_data, shortestPathSearch(SearchEngineData<Algorithm> &engine_working_data,
const DataFacade<Algorithm> &facade, const DataFacade<Algorithm> &facade,
const std::vector<PhantomNodeCandidates> &waypoint_candidates, const std::vector<PhantomNodeCandidates> &waypoint_candidates,
const boost::optional<bool> continue_straight_at_waypoint) const std::optional<bool> continue_straight_at_waypoint)
{ {
const bool allow_uturn_at_waypoint = const bool allow_uturn_at_waypoint =
!(continue_straight_at_waypoint ? *continue_straight_at_waypoint !(continue_straight_at_waypoint ? *continue_straight_at_waypoint

View File

@ -5,14 +5,11 @@
#include "util/query_heap.hpp" #include "util/query_heap.hpp"
#include "util/typedefs.hpp" #include "util/typedefs.hpp"
#include <boost/thread/tss.hpp>
namespace osrm::engine namespace osrm::engine
{ {
// Algorithm-dependent heaps // Algorithm-dependent heaps
// - CH algorithms use CH heaps // - CH algorithms use CH heaps
// - CoreCH algorithms use CH
// - MLD algorithms use MLD heaps // - MLD algorithms use MLD heaps
template <typename Algorithm> struct SearchEngineData template <typename Algorithm> struct SearchEngineData
@ -46,16 +43,21 @@ template <> struct SearchEngineData<routing_algorithms::ch::Algorithm>
ManyToManyHeapData, ManyToManyHeapData,
util::UnorderedMapStorage<NodeID, int>>; util::UnorderedMapStorage<NodeID, int>>;
using SearchEngineHeapPtr = boost::thread_specific_ptr<QueryHeap>; using SearchEngineHeapPtr = std::unique_ptr<QueryHeap>;
using ManyToManyHeapPtr = boost::thread_specific_ptr<ManyToManyQueryHeap>;
static SearchEngineHeapPtr forward_heap_1; using ManyToManyHeapPtr = std::unique_ptr<ManyToManyQueryHeap>;
static SearchEngineHeapPtr reverse_heap_1;
static SearchEngineHeapPtr forward_heap_2; static thread_local SearchEngineHeapPtr forward_heap_1;
static SearchEngineHeapPtr reverse_heap_2; static thread_local SearchEngineHeapPtr reverse_heap_1;
static SearchEngineHeapPtr forward_heap_3; static thread_local SearchEngineHeapPtr forward_heap_2;
static SearchEngineHeapPtr reverse_heap_3; static thread_local SearchEngineHeapPtr reverse_heap_2;
static ManyToManyHeapPtr many_to_many_heap; static thread_local SearchEngineHeapPtr forward_heap_3;
static thread_local SearchEngineHeapPtr reverse_heap_3;
static thread_local ManyToManyHeapPtr many_to_many_heap;
static thread_local SearchEngineHeapPtr map_matching_forward_heap_1;
static thread_local SearchEngineHeapPtr map_matching_reverse_heap_1;
void InitializeOrClearMapMatchingThreadLocalStorage(unsigned number_of_nodes);
void InitializeOrClearFirstThreadLocalStorage(unsigned number_of_nodes); void InitializeOrClearFirstThreadLocalStorage(unsigned number_of_nodes);
@ -74,6 +76,19 @@ struct MultiLayerDijkstraHeapData
MultiLayerDijkstraHeapData(NodeID p, bool from) : parent(p), from_clique_arc(from) {} MultiLayerDijkstraHeapData(NodeID p, bool from) : parent(p), from_clique_arc(from) {}
}; };
struct MapMatchingMultiLayerDijkstraHeapData
{
NodeID parent;
bool from_clique_arc;
EdgeDistance distance = {0};
MapMatchingMultiLayerDijkstraHeapData(NodeID p) : parent(p), from_clique_arc(false) {}
MapMatchingMultiLayerDijkstraHeapData(NodeID p, bool from) : parent(p), from_clique_arc(from) {}
MapMatchingMultiLayerDijkstraHeapData(NodeID p, bool from, EdgeDistance d)
: parent(p), from_clique_arc(from), distance(d)
{
}
};
struct ManyToManyMultiLayerDijkstraHeapData : MultiLayerDijkstraHeapData struct ManyToManyMultiLayerDijkstraHeapData : MultiLayerDijkstraHeapData
{ {
EdgeDuration duration; EdgeDuration duration;
@ -104,16 +119,27 @@ template <> struct SearchEngineData<routing_algorithms::mld::Algorithm>
EdgeWeight, EdgeWeight,
ManyToManyMultiLayerDijkstraHeapData, ManyToManyMultiLayerDijkstraHeapData,
util::TwoLevelStorage<NodeID, int>>; util::TwoLevelStorage<NodeID, int>>;
using MapMatchingQueryHeap = util::QueryHeap<NodeID,
NodeID,
EdgeWeight,
MapMatchingMultiLayerDijkstraHeapData,
util::TwoLevelStorage<NodeID, int>>;
using SearchEngineHeapPtr = boost::thread_specific_ptr<QueryHeap>; using SearchEngineHeapPtr = std::unique_ptr<QueryHeap>;
using ManyToManyHeapPtr = boost::thread_specific_ptr<ManyToManyQueryHeap>; using ManyToManyHeapPtr = std::unique_ptr<ManyToManyQueryHeap>;
using MapMatchingHeapPtr = std::unique_ptr<MapMatchingQueryHeap>;
static SearchEngineHeapPtr forward_heap_1; static thread_local SearchEngineHeapPtr forward_heap_1;
static SearchEngineHeapPtr reverse_heap_1; static thread_local SearchEngineHeapPtr reverse_heap_1;
static ManyToManyHeapPtr many_to_many_heap; static thread_local MapMatchingHeapPtr map_matching_forward_heap_1;
static thread_local MapMatchingHeapPtr map_matching_reverse_heap_1;
static thread_local ManyToManyHeapPtr many_to_many_heap;
void InitializeOrClearFirstThreadLocalStorage(unsigned number_of_nodes, void InitializeOrClearFirstThreadLocalStorage(unsigned number_of_nodes,
unsigned number_of_boundary_nodes); unsigned number_of_boundary_nodes);
void InitializeOrClearMapMatchingThreadLocalStorage(unsigned number_of_nodes,
unsigned number_of_boundary_nodes);
void InitializeOrClearManyToManyThreadLocalStorage(unsigned number_of_nodes, void InitializeOrClearManyToManyThreadLocalStorage(unsigned number_of_nodes,
unsigned number_of_boundary_nodes); unsigned number_of_boundary_nodes);

View File

@ -3,11 +3,9 @@
#include "extractor/class_data.hpp" #include "extractor/class_data.hpp"
#include "extractor/turn_lane_types.hpp" #include "extractor/turn_lane_types.hpp"
#include "util/std_hash.hpp"
#include "util/typedefs.hpp" #include "util/typedefs.hpp"
#include <boost/functional/hash.hpp>
#include <boost/optional/optional_fwd.hpp>
#include <string> #include <string>
#include <unordered_map> #include <unordered_map>
@ -18,25 +16,6 @@ class Way;
class Relation; class Relation;
} // namespace osmium } // namespace osmium
namespace std
{
template <> struct hash<std::tuple<std::string, std::string, std::string, std::string, std::string>>
{
std::size_t operator()(
const std::tuple<std::string, std::string, std::string, std::string, std::string> &mk)
const noexcept
{
std::size_t seed = 0;
boost::hash_combine(seed, std::get<0>(mk));
boost::hash_combine(seed, std::get<1>(mk));
boost::hash_combine(seed, std::get<2>(mk));
boost::hash_combine(seed, std::get<3>(mk));
boost::hash_combine(seed, std::get<4>(mk));
return seed;
}
};
} // namespace std
namespace osrm::extractor namespace osrm::extractor
{ {

View File

@ -28,13 +28,12 @@ SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
#ifndef EXTRACTOR_CONFIG_HPP #ifndef EXTRACTOR_CONFIG_HPP
#define EXTRACTOR_CONFIG_HPP #define EXTRACTOR_CONFIG_HPP
#include <boost/filesystem/path.hpp> #include "storage/io_config.hpp"
#include <array> #include <array>
#include <filesystem>
#include <string> #include <string>
#include "storage/io_config.hpp"
namespace osrm::extractor namespace osrm::extractor
{ {
@ -71,14 +70,14 @@ struct ExtractorConfig final : storage::IOConfig
{ {
} }
void UseDefaultOutputNames(const boost::filesystem::path &base) void UseDefaultOutputNames(const std::filesystem::path &base)
{ {
IOConfig::UseDefaultOutputNames(base); IOConfig::UseDefaultOutputNames(base);
} }
boost::filesystem::path input_path; std::filesystem::path input_path;
boost::filesystem::path profile_path; std::filesystem::path profile_path;
std::vector<boost::filesystem::path> location_dependent_data_paths; std::vector<std::filesystem::path> location_dependent_data_paths;
std::string data_version; std::string data_version;
unsigned requested_num_threads = 0; unsigned requested_num_threads = 0;

View File

@ -23,7 +23,7 @@ namespace osrm::extractor::files
// writes the .osrm.icd file // writes the .osrm.icd file
template <typename IntersectionBearingsT, typename EntryClassVectorT> template <typename IntersectionBearingsT, typename EntryClassVectorT>
inline void writeIntersections(const boost::filesystem::path &path, void writeIntersections(const std::filesystem::path &path,
const IntersectionBearingsT &intersection_bearings, const IntersectionBearingsT &intersection_bearings,
const EntryClassVectorT &entry_classes) const EntryClassVectorT &entry_classes)
{ {
@ -39,7 +39,7 @@ inline void writeIntersections(const boost::filesystem::path &path,
// read the .osrm.icd file // read the .osrm.icd file
template <typename IntersectionBearingsT, typename EntryClassVectorT> template <typename IntersectionBearingsT, typename EntryClassVectorT>
inline void readIntersections(const boost::filesystem::path &path, void readIntersections(const std::filesystem::path &path,
IntersectionBearingsT &intersection_bearings, IntersectionBearingsT &intersection_bearings,
EntryClassVectorT &entry_classes) EntryClassVectorT &entry_classes)
{ {
@ -54,8 +54,7 @@ inline void readIntersections(const boost::filesystem::path &path,
} }
// reads .osrm.properties // reads .osrm.properties
inline void readProfileProperties(const boost::filesystem::path &path, inline void readProfileProperties(const std::filesystem::path &path, ProfileProperties &properties)
ProfileProperties &properties)
{ {
const auto fingerprint = storage::tar::FileReader::VerifyFingerprint; const auto fingerprint = storage::tar::FileReader::VerifyFingerprint;
storage::tar::FileReader reader{path, fingerprint}; storage::tar::FileReader reader{path, fingerprint};
@ -64,7 +63,7 @@ inline void readProfileProperties(const boost::filesystem::path &path,
} }
// writes .osrm.properties // writes .osrm.properties
inline void writeProfileProperties(const boost::filesystem::path &path, inline void writeProfileProperties(const std::filesystem::path &path,
const ProfileProperties &properties) const ProfileProperties &properties)
{ {
const auto fingerprint = storage::tar::FileWriter::GenerateFingerprint; const auto fingerprint = storage::tar::FileWriter::GenerateFingerprint;
@ -74,7 +73,7 @@ inline void writeProfileProperties(const boost::filesystem::path &path,
} }
template <typename EdgeBasedEdgeVector> template <typename EdgeBasedEdgeVector>
void writeEdgeBasedGraph(const boost::filesystem::path &path, void writeEdgeBasedGraph(const std::filesystem::path &path,
EdgeID const number_of_edge_based_nodes, EdgeID const number_of_edge_based_nodes,
const EdgeBasedEdgeVector &edge_based_edge_list, const EdgeBasedEdgeVector &edge_based_edge_list,
const std::uint32_t connectivity_checksum) const std::uint32_t connectivity_checksum)
@ -92,7 +91,7 @@ void writeEdgeBasedGraph(const boost::filesystem::path &path,
// reads .osrm.ebg file // reads .osrm.ebg file
template <typename EdgeBasedEdgeVector> template <typename EdgeBasedEdgeVector>
void readEdgeBasedGraph(const boost::filesystem::path &path, void readEdgeBasedGraph(const std::filesystem::path &path,
EdgeID &number_of_edge_based_nodes, EdgeID &number_of_edge_based_nodes,
EdgeBasedEdgeVector &edge_based_edge_list, EdgeBasedEdgeVector &edge_based_edge_list,
std::uint32_t &connectivity_checksum) std::uint32_t &connectivity_checksum)
@ -108,7 +107,7 @@ void readEdgeBasedGraph(const boost::filesystem::path &path,
// reads .osrm.nbg_nodes // reads .osrm.nbg_nodes
template <typename CoordinatesT, typename PackedOSMIDsT> template <typename CoordinatesT, typename PackedOSMIDsT>
inline void readNodes(const boost::filesystem::path &path, void readNodes(const std::filesystem::path &path,
CoordinatesT &coordinates, CoordinatesT &coordinates,
PackedOSMIDsT &osm_node_ids) PackedOSMIDsT &osm_node_ids)
{ {
@ -124,7 +123,7 @@ inline void readNodes(const boost::filesystem::path &path,
// reads only coordinates from .osrm.nbg_nodes // reads only coordinates from .osrm.nbg_nodes
template <typename CoordinatesT> template <typename CoordinatesT>
inline void readNodeCoordinates(const boost::filesystem::path &path, CoordinatesT &coordinates) void readNodeCoordinates(const std::filesystem::path &path, CoordinatesT &coordinates)
{ {
static_assert(std::is_same<typename CoordinatesT::value_type, util::Coordinate>::value, ""); static_assert(std::is_same<typename CoordinatesT::value_type, util::Coordinate>::value, "");
@ -136,7 +135,7 @@ inline void readNodeCoordinates(const boost::filesystem::path &path, Coordinates
// writes .osrm.nbg_nodes // writes .osrm.nbg_nodes
template <typename CoordinatesT, typename PackedOSMIDsT> template <typename CoordinatesT, typename PackedOSMIDsT>
inline void writeNodes(const boost::filesystem::path &path, void writeNodes(const std::filesystem::path &path,
const CoordinatesT &coordinates, const CoordinatesT &coordinates,
const PackedOSMIDsT &osm_node_ids) const PackedOSMIDsT &osm_node_ids)
{ {
@ -151,7 +150,7 @@ inline void writeNodes(const boost::filesystem::path &path,
} }
// reads .osrm.cnbg_to_ebg // reads .osrm.cnbg_to_ebg
inline void readNBGMapping(const boost::filesystem::path &path, std::vector<NBGToEBG> &mapping) inline void readNBGMapping(const std::filesystem::path &path, std::vector<NBGToEBG> &mapping)
{ {
const auto fingerprint = storage::tar::FileReader::VerifyFingerprint; const auto fingerprint = storage::tar::FileReader::VerifyFingerprint;
storage::tar::FileReader reader{path, fingerprint}; storage::tar::FileReader reader{path, fingerprint};
@ -160,8 +159,7 @@ inline void readNBGMapping(const boost::filesystem::path &path, std::vector<NBGT
} }
// writes .osrm.cnbg_to_ebg // writes .osrm.cnbg_to_ebg
inline void writeNBGMapping(const boost::filesystem::path &path, inline void writeNBGMapping(const std::filesystem::path &path, const std::vector<NBGToEBG> &mapping)
const std::vector<NBGToEBG> &mapping)
{ {
const auto fingerprint = storage::tar::FileWriter::GenerateFingerprint; const auto fingerprint = storage::tar::FileWriter::GenerateFingerprint;
storage::tar::FileWriter writer{path, fingerprint}; storage::tar::FileWriter writer{path, fingerprint};
@ -170,7 +168,7 @@ inline void writeNBGMapping(const boost::filesystem::path &path,
} }
// reads .osrm.datasource_names // reads .osrm.datasource_names
inline void readDatasources(const boost::filesystem::path &path, Datasources &sources) inline void readDatasources(const std::filesystem::path &path, Datasources &sources)
{ {
const auto fingerprint = storage::tar::FileReader::VerifyFingerprint; const auto fingerprint = storage::tar::FileReader::VerifyFingerprint;
storage::tar::FileReader reader{path, fingerprint}; storage::tar::FileReader reader{path, fingerprint};
@ -179,7 +177,7 @@ inline void readDatasources(const boost::filesystem::path &path, Datasources &so
} }
// writes .osrm.datasource_names // writes .osrm.datasource_names
inline void writeDatasources(const boost::filesystem::path &path, Datasources &sources) inline void writeDatasources(const std::filesystem::path &path, Datasources &sources)
{ {
const auto fingerprint = storage::tar::FileWriter::GenerateFingerprint; const auto fingerprint = storage::tar::FileWriter::GenerateFingerprint;
storage::tar::FileWriter writer{path, fingerprint}; storage::tar::FileWriter writer{path, fingerprint};
@ -189,7 +187,7 @@ inline void writeDatasources(const boost::filesystem::path &path, Datasources &s
// reads .osrm.geometry // reads .osrm.geometry
template <typename SegmentDataT> template <typename SegmentDataT>
inline void readSegmentData(const boost::filesystem::path &path, SegmentDataT &segment_data) void readSegmentData(const std::filesystem::path &path, SegmentDataT &segment_data)
{ {
static_assert(std::is_same<SegmentDataContainer, SegmentDataT>::value || static_assert(std::is_same<SegmentDataContainer, SegmentDataT>::value ||
std::is_same<SegmentDataView, SegmentDataT>::value, std::is_same<SegmentDataView, SegmentDataT>::value,
@ -202,7 +200,7 @@ inline void readSegmentData(const boost::filesystem::path &path, SegmentDataT &s
// writes .osrm.geometry // writes .osrm.geometry
template <typename SegmentDataT> template <typename SegmentDataT>
inline void writeSegmentData(const boost::filesystem::path &path, const SegmentDataT &segment_data) void writeSegmentData(const std::filesystem::path &path, const SegmentDataT &segment_data)
{ {
static_assert(std::is_same<SegmentDataContainer, SegmentDataT>::value || static_assert(std::is_same<SegmentDataContainer, SegmentDataT>::value ||
std::is_same<SegmentDataView, SegmentDataT>::value, std::is_same<SegmentDataView, SegmentDataT>::value,
@ -215,7 +213,7 @@ inline void writeSegmentData(const boost::filesystem::path &path, const SegmentD
// reads .osrm.ebg_nodes // reads .osrm.ebg_nodes
template <typename NodeDataT> template <typename NodeDataT>
inline void readNodeData(const boost::filesystem::path &path, NodeDataT &node_data) inline void readNodeData(const std::filesystem::path &path, NodeDataT &node_data)
{ {
static_assert(std::is_same<EdgeBasedNodeDataContainer, NodeDataT>::value || static_assert(std::is_same<EdgeBasedNodeDataContainer, NodeDataT>::value ||
std::is_same<EdgeBasedNodeDataView, NodeDataT>::value || std::is_same<EdgeBasedNodeDataView, NodeDataT>::value ||
@ -229,7 +227,7 @@ inline void readNodeData(const boost::filesystem::path &path, NodeDataT &node_da
// writes .osrm.ebg_nodes // writes .osrm.ebg_nodes
template <typename NodeDataT> template <typename NodeDataT>
inline void writeNodeData(const boost::filesystem::path &path, const NodeDataT &node_data) inline void writeNodeData(const std::filesystem::path &path, const NodeDataT &node_data)
{ {
static_assert(std::is_same<EdgeBasedNodeDataContainer, NodeDataT>::value || static_assert(std::is_same<EdgeBasedNodeDataContainer, NodeDataT>::value ||
std::is_same<EdgeBasedNodeDataView, NodeDataT>::value || std::is_same<EdgeBasedNodeDataView, NodeDataT>::value ||
@ -243,7 +241,7 @@ inline void writeNodeData(const boost::filesystem::path &path, const NodeDataT &
// reads .osrm.tls // reads .osrm.tls
template <typename OffsetsT, typename MaskT> template <typename OffsetsT, typename MaskT>
inline void readTurnLaneDescriptions(const boost::filesystem::path &path, inline void readTurnLaneDescriptions(const std::filesystem::path &path,
OffsetsT &turn_offsets, OffsetsT &turn_offsets,
MaskT &turn_masks) MaskT &turn_masks)
{ {
@ -260,7 +258,7 @@ inline void readTurnLaneDescriptions(const boost::filesystem::path &path,
// writes .osrm.tls // writes .osrm.tls
template <typename OffsetsT, typename MaskT> template <typename OffsetsT, typename MaskT>
inline void writeTurnLaneDescriptions(const boost::filesystem::path &path, inline void writeTurnLaneDescriptions(const std::filesystem::path &path,
const OffsetsT &turn_offsets, const OffsetsT &turn_offsets,
const MaskT &turn_masks) const MaskT &turn_masks)
{ {
@ -277,7 +275,7 @@ inline void writeTurnLaneDescriptions(const boost::filesystem::path &path,
// reads .osrm.tld // reads .osrm.tld
template <typename TurnLaneDataT> template <typename TurnLaneDataT>
inline void readTurnLaneData(const boost::filesystem::path &path, TurnLaneDataT &turn_lane_data) inline void readTurnLaneData(const std::filesystem::path &path, TurnLaneDataT &turn_lane_data)
{ {
static_assert( static_assert(
std::is_same<typename TurnLaneDataT::value_type, util::guidance::LaneTupleIdPair>::value, std::is_same<typename TurnLaneDataT::value_type, util::guidance::LaneTupleIdPair>::value,
@ -291,7 +289,7 @@ inline void readTurnLaneData(const boost::filesystem::path &path, TurnLaneDataT
// writes .osrm.tld // writes .osrm.tld
template <typename TurnLaneDataT> template <typename TurnLaneDataT>
inline void writeTurnLaneData(const boost::filesystem::path &path, inline void writeTurnLaneData(const std::filesystem::path &path,
const TurnLaneDataT &turn_lane_data) const TurnLaneDataT &turn_lane_data)
{ {
static_assert( static_assert(
@ -306,7 +304,7 @@ inline void writeTurnLaneData(const boost::filesystem::path &path,
// reads .osrm.timestamp // reads .osrm.timestamp
template <typename TimestampDataT> template <typename TimestampDataT>
inline void readTimestamp(const boost::filesystem::path &path, TimestampDataT &timestamp) inline void readTimestamp(const std::filesystem::path &path, TimestampDataT &timestamp)
{ {
const auto fingerprint = storage::tar::FileReader::VerifyFingerprint; const auto fingerprint = storage::tar::FileReader::VerifyFingerprint;
storage::tar::FileReader reader{path, fingerprint}; storage::tar::FileReader reader{path, fingerprint};
@ -316,7 +314,7 @@ inline void readTimestamp(const boost::filesystem::path &path, TimestampDataT &t
// writes .osrm.timestamp // writes .osrm.timestamp
template <typename TimestampDataT> template <typename TimestampDataT>
inline void writeTimestamp(const boost::filesystem::path &path, const TimestampDataT &timestamp) inline void writeTimestamp(const std::filesystem::path &path, const TimestampDataT &timestamp)
{ {
const auto fingerprint = storage::tar::FileWriter::GenerateFingerprint; const auto fingerprint = storage::tar::FileWriter::GenerateFingerprint;
storage::tar::FileWriter writer{path, fingerprint}; storage::tar::FileWriter writer{path, fingerprint};
@ -326,7 +324,7 @@ inline void writeTimestamp(const boost::filesystem::path &path, const TimestampD
// reads .osrm.maneuver_overrides // reads .osrm.maneuver_overrides
template <typename StorageManeuverOverrideT, typename NodeSequencesT> template <typename StorageManeuverOverrideT, typename NodeSequencesT>
inline void readManeuverOverrides(const boost::filesystem::path &path, inline void readManeuverOverrides(const std::filesystem::path &path,
StorageManeuverOverrideT &maneuver_overrides, StorageManeuverOverrideT &maneuver_overrides,
NodeSequencesT &node_sequences) NodeSequencesT &node_sequences)
{ {
@ -340,7 +338,7 @@ inline void readManeuverOverrides(const boost::filesystem::path &path,
} }
// writes .osrm.maneuver_overrides // writes .osrm.maneuver_overrides
inline void writeManeuverOverrides(const boost::filesystem::path &path, inline void writeManeuverOverrides(const std::filesystem::path &path,
const std::vector<StorageManeuverOverride> &maneuver_overrides, const std::vector<StorageManeuverOverride> &maneuver_overrides,
const std::vector<NodeID> &node_sequences) const std::vector<NodeID> &node_sequences)
{ {
@ -355,7 +353,7 @@ inline void writeManeuverOverrides(const boost::filesystem::path &path,
// writes .osrm.turn_weight_penalties // writes .osrm.turn_weight_penalties
template <typename TurnPenaltyT> template <typename TurnPenaltyT>
inline void writeTurnWeightPenalty(const boost::filesystem::path &path, inline void writeTurnWeightPenalty(const std::filesystem::path &path,
const TurnPenaltyT &turn_penalty) const TurnPenaltyT &turn_penalty)
{ {
const auto fingerprint = storage::tar::FileWriter::GenerateFingerprint; const auto fingerprint = storage::tar::FileWriter::GenerateFingerprint;
@ -366,7 +364,7 @@ inline void writeTurnWeightPenalty(const boost::filesystem::path &path,
// read .osrm.turn_weight_penalties // read .osrm.turn_weight_penalties
template <typename TurnPenaltyT> template <typename TurnPenaltyT>
inline void readTurnWeightPenalty(const boost::filesystem::path &path, TurnPenaltyT &turn_penalty) inline void readTurnWeightPenalty(const std::filesystem::path &path, TurnPenaltyT &turn_penalty)
{ {
const auto fingerprint = storage::tar::FileReader::VerifyFingerprint; const auto fingerprint = storage::tar::FileReader::VerifyFingerprint;
storage::tar::FileReader reader{path, fingerprint}; storage::tar::FileReader reader{path, fingerprint};
@ -376,7 +374,7 @@ inline void readTurnWeightPenalty(const boost::filesystem::path &path, TurnPenal
// writes .osrm.turn_duration_penalties // writes .osrm.turn_duration_penalties
template <typename TurnPenaltyT> template <typename TurnPenaltyT>
inline void writeTurnDurationPenalty(const boost::filesystem::path &path, inline void writeTurnDurationPenalty(const std::filesystem::path &path,
const TurnPenaltyT &turn_penalty) const TurnPenaltyT &turn_penalty)
{ {
const auto fingerprint = storage::tar::FileWriter::GenerateFingerprint; const auto fingerprint = storage::tar::FileWriter::GenerateFingerprint;
@ -387,7 +385,7 @@ inline void writeTurnDurationPenalty(const boost::filesystem::path &path,
// read .osrm.turn_weight_penalties // read .osrm.turn_weight_penalties
template <typename TurnPenaltyT> template <typename TurnPenaltyT>
inline void readTurnDurationPenalty(const boost::filesystem::path &path, TurnPenaltyT &turn_penalty) inline void readTurnDurationPenalty(const std::filesystem::path &path, TurnPenaltyT &turn_penalty)
{ {
const auto fingerprint = storage::tar::FileReader::VerifyFingerprint; const auto fingerprint = storage::tar::FileReader::VerifyFingerprint;
storage::tar::FileReader reader{path, fingerprint}; storage::tar::FileReader reader{path, fingerprint};
@ -397,7 +395,7 @@ inline void readTurnDurationPenalty(const boost::filesystem::path &path, TurnPen
// writes .osrm.turn_penalties_index // writes .osrm.turn_penalties_index
template <typename TurnIndexT> template <typename TurnIndexT>
inline void writeTurnPenaltiesIndex(const boost::filesystem::path &path, inline void writeTurnPenaltiesIndex(const std::filesystem::path &path,
const TurnIndexT &turn_penalties_index) const TurnIndexT &turn_penalties_index)
{ {
const auto fingerprint = storage::tar::FileWriter::GenerateFingerprint; const auto fingerprint = storage::tar::FileWriter::GenerateFingerprint;
@ -408,7 +406,7 @@ inline void writeTurnPenaltiesIndex(const boost::filesystem::path &path,
// read .osrm.turn_penalties_index // read .osrm.turn_penalties_index
template <typename TurnIndexT> template <typename TurnIndexT>
inline void readTurnPenaltiesIndex(const boost::filesystem::path &path, inline void readTurnPenaltiesIndex(const std::filesystem::path &path,
TurnIndexT &turn_penalties_index) TurnIndexT &turn_penalties_index)
{ {
const auto fingerprint = storage::tar::FileReader::VerifyFingerprint; const auto fingerprint = storage::tar::FileReader::VerifyFingerprint;
@ -419,7 +417,7 @@ inline void readTurnPenaltiesIndex(const boost::filesystem::path &path,
// writes .osrm.restrictions // writes .osrm.restrictions
template <typename ConditionalRestrictionsT> template <typename ConditionalRestrictionsT>
inline void writeConditionalRestrictions(const boost::filesystem::path &path, inline void writeConditionalRestrictions(const std::filesystem::path &path,
const ConditionalRestrictionsT &conditional_restrictions) const ConditionalRestrictionsT &conditional_restrictions)
{ {
const auto fingerprint = storage::tar::FileWriter::GenerateFingerprint; const auto fingerprint = storage::tar::FileWriter::GenerateFingerprint;
@ -430,7 +428,7 @@ inline void writeConditionalRestrictions(const boost::filesystem::path &path,
// read .osrm.restrictions // read .osrm.restrictions
template <typename ConditionalRestrictionsT> template <typename ConditionalRestrictionsT>
inline void readConditionalRestrictions(const boost::filesystem::path &path, inline void readConditionalRestrictions(const std::filesystem::path &path,
ConditionalRestrictionsT &conditional_restrictions) ConditionalRestrictionsT &conditional_restrictions)
{ {
const auto fingerprint = storage::tar::FileReader::VerifyFingerprint; const auto fingerprint = storage::tar::FileReader::VerifyFingerprint;
@ -441,7 +439,7 @@ inline void readConditionalRestrictions(const boost::filesystem::path &path,
// reads .osrm file which is a temporary file of osrm-extract // reads .osrm file which is a temporary file of osrm-extract
template <typename PackedOSMIDsT> template <typename PackedOSMIDsT>
void readRawNBGraph(const boost::filesystem::path &path, void readRawNBGraph(const std::filesystem::path &path,
std::vector<util::Coordinate> &coordinates, std::vector<util::Coordinate> &coordinates,
PackedOSMIDsT &osm_node_ids, PackedOSMIDsT &osm_node_ids,
std::vector<extractor::NodeBasedEdge> &edge_list) std::vector<extractor::NodeBasedEdge> &edge_list)
@ -466,8 +464,7 @@ void readRawNBGraph(const boost::filesystem::path &path,
storage::serialization::read(reader, "/extractor/edges", edge_list); storage::serialization::read(reader, "/extractor/edges", edge_list);
} }
template <typename NameTableT> template <typename NameTableT> void readNames(const std::filesystem::path &path, NameTableT &table)
void readNames(const boost::filesystem::path &path, NameTableT &table)
{ {
const auto fingerprint = storage::tar::FileReader::VerifyFingerprint; const auto fingerprint = storage::tar::FileReader::VerifyFingerprint;
storage::tar::FileReader reader{path, fingerprint}; storage::tar::FileReader reader{path, fingerprint};
@ -476,7 +473,7 @@ void readNames(const boost::filesystem::path &path, NameTableT &table)
} }
template <typename NameTableT> template <typename NameTableT>
void writeNames(const boost::filesystem::path &path, const NameTableT &table) void writeNames(const std::filesystem::path &path, const NameTableT &table)
{ {
const auto fingerprint = storage::tar::FileWriter::GenerateFingerprint; const auto fingerprint = storage::tar::FileWriter::GenerateFingerprint;
storage::tar::FileWriter writer{path, fingerprint}; storage::tar::FileWriter writer{path, fingerprint};
@ -485,7 +482,7 @@ void writeNames(const boost::filesystem::path &path, const NameTableT &table)
} }
template <typename NodeWeightsVectorT> template <typename NodeWeightsVectorT>
void readEdgeBasedNodeWeights(const boost::filesystem::path &path, NodeWeightsVectorT &weights) void readEdgeBasedNodeWeights(const std::filesystem::path &path, NodeWeightsVectorT &weights)
{ {
const auto fingerprint = storage::tar::FileReader::VerifyFingerprint; const auto fingerprint = storage::tar::FileReader::VerifyFingerprint;
storage::tar::FileReader reader{path, fingerprint}; storage::tar::FileReader reader{path, fingerprint};
@ -494,8 +491,7 @@ void readEdgeBasedNodeWeights(const boost::filesystem::path &path, NodeWeightsVe
} }
template <typename NodeDistancesVectorT> template <typename NodeDistancesVectorT>
void readEdgeBasedNodeDistances(const boost::filesystem::path &path, void readEdgeBasedNodeDistances(const std::filesystem::path &path, NodeDistancesVectorT &distances)
NodeDistancesVectorT &distances)
{ {
const auto fingerprint = storage::tar::FileReader::VerifyFingerprint; const auto fingerprint = storage::tar::FileReader::VerifyFingerprint;
storage::tar::FileReader reader{path, fingerprint}; storage::tar::FileReader reader{path, fingerprint};
@ -504,7 +500,7 @@ void readEdgeBasedNodeDistances(const boost::filesystem::path &path,
} }
template <typename NodeWeightsVectorT, typename NodeDurationsVectorT, typename NodeDistancesVectorT> template <typename NodeWeightsVectorT, typename NodeDurationsVectorT, typename NodeDistancesVectorT>
void writeEdgeBasedNodeWeightsDurationsDistances(const boost::filesystem::path &path, void writeEdgeBasedNodeWeightsDurationsDistances(const std::filesystem::path &path,
const NodeWeightsVectorT &weights, const NodeWeightsVectorT &weights,
const NodeDurationsVectorT &durations, const NodeDurationsVectorT &durations,
const NodeDistancesVectorT &distances) const NodeDistancesVectorT &distances)
@ -518,7 +514,7 @@ void writeEdgeBasedNodeWeightsDurationsDistances(const boost::filesystem::path &
} }
template <typename NodeWeightsVectorT, typename NodeDurationsVectorT> template <typename NodeWeightsVectorT, typename NodeDurationsVectorT>
void readEdgeBasedNodeWeightsDurations(const boost::filesystem::path &path, void readEdgeBasedNodeWeightsDurations(const std::filesystem::path &path,
NodeWeightsVectorT &weights, NodeWeightsVectorT &weights,
NodeDurationsVectorT &durations) NodeDurationsVectorT &durations)
{ {
@ -530,7 +526,7 @@ void readEdgeBasedNodeWeightsDurations(const boost::filesystem::path &path,
} }
template <typename NodeWeightsVectorT, typename NodeDurationsVectorT> template <typename NodeWeightsVectorT, typename NodeDurationsVectorT>
void writeEdgeBasedNodeWeightsDurations(const boost::filesystem::path &path, void writeEdgeBasedNodeWeightsDurations(const std::filesystem::path &path,
const NodeWeightsVectorT &weights, const NodeWeightsVectorT &weights,
const NodeDurationsVectorT &durations) const NodeDurationsVectorT &durations)
{ {
@ -542,7 +538,7 @@ void writeEdgeBasedNodeWeightsDurations(const boost::filesystem::path &path,
} }
template <typename RTreeT> template <typename RTreeT>
void writeRamIndex(const boost::filesystem::path &path, const RTreeT &rtree) void writeRamIndex(const std::filesystem::path &path, const RTreeT &rtree)
{ {
const auto fingerprint = storage::tar::FileWriter::GenerateFingerprint; const auto fingerprint = storage::tar::FileWriter::GenerateFingerprint;
storage::tar::FileWriter writer{path, fingerprint}; storage::tar::FileWriter writer{path, fingerprint};
@ -550,7 +546,7 @@ void writeRamIndex(const boost::filesystem::path &path, const RTreeT &rtree)
util::serialization::write(writer, "/common/rtree", rtree); util::serialization::write(writer, "/common/rtree", rtree);
} }
template <typename RTreeT> void readRamIndex(const boost::filesystem::path &path, RTreeT &rtree) template <typename RTreeT> void readRamIndex(const std::filesystem::path &path, RTreeT &rtree)
{ {
const auto fingerprint = storage::tar::FileReader::VerifyFingerprint; const auto fingerprint = storage::tar::FileReader::VerifyFingerprint;
storage::tar::FileReader reader{path, fingerprint}; storage::tar::FileReader reader{path, fingerprint};
@ -559,7 +555,7 @@ template <typename RTreeT> void readRamIndex(const boost::filesystem::path &path
} }
template <typename EdgeListT> template <typename EdgeListT>
void writeCompressedNodeBasedGraph(const boost::filesystem::path &path, const EdgeListT &edge_list) void writeCompressedNodeBasedGraph(const std::filesystem::path &path, const EdgeListT &edge_list)
{ {
const auto fingerprint = storage::tar::FileWriter::GenerateFingerprint; const auto fingerprint = storage::tar::FileWriter::GenerateFingerprint;
storage::tar::FileWriter writer{path, fingerprint}; storage::tar::FileWriter writer{path, fingerprint};
@ -568,7 +564,7 @@ void writeCompressedNodeBasedGraph(const boost::filesystem::path &path, const Ed
} }
template <typename EdgeListT> template <typename EdgeListT>
void readCompressedNodeBasedGraph(const boost::filesystem::path &path, EdgeListT &edge_list) void readCompressedNodeBasedGraph(const std::filesystem::path &path, EdgeListT &edge_list)
{ {
const auto fingerprint = storage::tar::FileReader::VerifyFingerprint; const auto fingerprint = storage::tar::FileReader::VerifyFingerprint;
storage::tar::FileReader reader{path, fingerprint}; storage::tar::FileReader reader{path, fingerprint};

View File

@ -7,8 +7,8 @@
#include "util/typedefs.hpp" #include "util/typedefs.hpp"
#include <boost/assert.hpp> #include <boost/assert.hpp>
#include <mapbox/variant.hpp>
#include <utility> #include <utility>
#include <variant>
namespace osrm::extractor namespace osrm::extractor
{ {

View File

@ -1,16 +1,15 @@
#ifndef OSRM_EXTRACTOR_INTERSECTION_COORDINATE_EXTRACTOR_HPP_ #ifndef OSRM_EXTRACTOR_INTERSECTION_COORDINATE_EXTRACTOR_HPP_
#define OSRM_EXTRACTOR_INTERSECTION_COORDINATE_EXTRACTOR_HPP_ #define OSRM_EXTRACTOR_INTERSECTION_COORDINATE_EXTRACTOR_HPP_
#include <utility>
#include <vector>
#include "extractor/compressed_edge_container.hpp" #include "extractor/compressed_edge_container.hpp"
#include "extractor/query_node.hpp" #include "extractor/query_node.hpp"
#include "util/attributes.hpp"
#include "util/coordinate.hpp" #include "util/coordinate.hpp"
#include "util/node_based_graph.hpp" #include "util/node_based_graph.hpp"
#include <utility>
#include <vector>
namespace osrm::extractor::intersection namespace osrm::extractor::intersection
{ {
@ -27,8 +26,8 @@ class CoordinateExtractor
* Note: The segment between intersection and turn coordinate can be zero, if the OSM modelling * Note: The segment between intersection and turn coordinate can be zero, if the OSM modelling
* is unfortunate. See https://github.com/Project-OSRM/osrm-backend/issues/3470 * is unfortunate. See https://github.com/Project-OSRM/osrm-backend/issues/3470
*/ */
OSRM_ATTR_WARN_UNUSED [[nodiscard]] util::Coordinate
util::Coordinate GetCoordinateAlongRoad(const NodeID intersection_node, GetCoordinateAlongRoad(const NodeID intersection_node,
const EdgeID turn_edge, const EdgeID turn_edge,
const bool traversed_in_reverse, const bool traversed_in_reverse,
const NodeID to_node, const NodeID to_node,
@ -36,8 +35,7 @@ class CoordinateExtractor
// Given a set of precomputed coordinates, select the representative coordinate along the road // Given a set of precomputed coordinates, select the representative coordinate along the road
// that best describes the turn // that best describes the turn
OSRM_ATTR_WARN_UNUSED [[nodiscard]] util::Coordinate
util::Coordinate
ExtractRepresentativeCoordinate(const NodeID intersection_node, ExtractRepresentativeCoordinate(const NodeID intersection_node,
const EdgeID turn_edge, const EdgeID turn_edge,
const bool traversed_in_reverse, const bool traversed_in_reverse,
@ -47,7 +45,7 @@ class CoordinateExtractor
// instead of finding only a single coordinate, we can also list all coordinates along a // instead of finding only a single coordinate, we can also list all coordinates along a
// road. // road.
OSRM_ATTR_WARN_UNUSED std::vector<util::Coordinate> [[nodiscard]] std::vector<util::Coordinate>
GetCoordinatesAlongRoad(const NodeID intersection_node, GetCoordinatesAlongRoad(const NodeID intersection_node,
const EdgeID turn_edge, const EdgeID turn_edge,
const bool traversed_in_reverse, const bool traversed_in_reverse,
@ -55,17 +53,15 @@ class CoordinateExtractor
// wrapper in case of normal forward edges (traversed_in_reverse = false, to_node = // wrapper in case of normal forward edges (traversed_in_reverse = false, to_node =
// node_based_graph.GetTarget(turn_edge) // node_based_graph.GetTarget(turn_edge)
OSRM_ATTR_WARN_UNUSED [[nodiscard]] std::vector<util::Coordinate>
std::vector<util::Coordinate> GetForwardCoordinatesAlongRoad(const NodeID from, GetForwardCoordinatesAlongRoad(const NodeID from, const EdgeID turn_edge) const;
const EdgeID turn_edge) const;
// a less precise way to compute coordinates along a route. Due to the heavy interaction of // a less precise way to compute coordinates along a route. Due to the heavy interaction of
// graph traversal and turn instructions, we often don't care for high precision. We only want // graph traversal and turn instructions, we often don't care for high precision. We only want
// to check for available connections in order, or find (with room for error) the straightmost // to check for available connections in order, or find (with room for error) the straightmost
// turn. This function will offer a bit more error potential but allow for much higher // turn. This function will offer a bit more error potential but allow for much higher
// performance // performance
OSRM_ATTR_WARN_UNUSED [[nodiscard]] util::Coordinate GetCoordinateCloseToTurn(const NodeID from_node,
util::Coordinate GetCoordinateCloseToTurn(const NodeID from_node,
const EdgeID turn_edge, const EdgeID turn_edge,
const bool traversed_in_reverse, const bool traversed_in_reverse,
const NodeID to_node) const; const NodeID to_node) const;
@ -90,22 +86,19 @@ class CoordinateExtractor
* The optional length cache needs to store the accumulated distance up to the respective * The optional length cache needs to store the accumulated distance up to the respective
* coordinate index [0,d(0,1),...] * coordinate index [0,d(0,1),...]
*/ */
OSRM_ATTR_WARN_UNUSED [[nodiscard]] std::vector<util::Coordinate>
std::vector<util::Coordinate>
TrimCoordinatesToLength(std::vector<util::Coordinate> coordinates, TrimCoordinatesToLength(std::vector<util::Coordinate> coordinates,
const double desired_length, const double desired_length,
const std::vector<double> &length_cache = {}) const; const std::vector<double> &length_cache = {}) const;
OSRM_ATTR_WARN_UNUSED [[nodiscard]] std::vector<double>
std::vector<double> PrepareLengthCache(const std::vector<util::Coordinate> &coordinates, PrepareLengthCache(const std::vector<util::Coordinate> &coordinates, const double limit) const;
const double limit) const;
/* when looking at a set of coordinates, this function allows trimming the vector to a smaller, /* when looking at a set of coordinates, this function allows trimming the vector to a smaller,
* only containing coordinates up to a given distance along the path. The last coordinate might * only containing coordinates up to a given distance along the path. The last coordinate might
* be interpolated * be interpolated
*/ */
OSRM_ATTR_WARN_UNUSED [[nodiscard]] std::vector<util::Coordinate>
std::vector<util::Coordinate>
TrimCoordinatesByLengthFront(std::vector<util::Coordinate> coordinates, TrimCoordinatesByLengthFront(std::vector<util::Coordinate> coordinates,
const double desired_length) const; const double desired_length) const;
@ -130,8 +123,7 @@ class CoordinateExtractor
* *
* for fixpoint `b`, vector_base `d` and vector_head `e` * for fixpoint `b`, vector_base `d` and vector_head `e`
*/ */
OSRM_ATTR_WARN_UNUSED [[nodiscard]] util::Coordinate GetCorrectedCoordinate(const util::Coordinate fixpoint,
util::Coordinate GetCorrectedCoordinate(const util::Coordinate fixpoint,
const util::Coordinate vector_base, const util::Coordinate vector_base,
const util::Coordinate vector_head) const; const util::Coordinate vector_head) const;
@ -143,8 +135,7 @@ class CoordinateExtractor
* Into: * Into:
* x -- x -- x -- x -- x - x * x -- x -- x -- x -- x - x
*/ */
OSRM_ATTR_WARN_UNUSED [[nodiscard]] std::vector<util::Coordinate>
std::vector<util::Coordinate>
SampleCoordinates(const std::vector<util::Coordinate> &coordinates, SampleCoordinates(const std::vector<util::Coordinate> &coordinates,
const double length, const double length,
const double rate) const; const double rate) const;

View File

@ -11,8 +11,8 @@
#include "util/typedefs.hpp" #include "util/typedefs.hpp"
#include <boost/assert.hpp> #include <boost/assert.hpp>
#include <boost/optional.hpp>
#include <cstdint> #include <cstdint>
#include <optional>
#include <utility> #include <utility>
namespace osrm::extractor::intersection namespace osrm::extractor::intersection
@ -42,7 +42,7 @@ class NodeBasedGraphWalker
* selector not provinding any further edge to traverse) * selector not provinding any further edge to traverse)
*/ */
template <class accumulator_type, class selector_type> template <class accumulator_type, class selector_type>
boost::optional<std::pair<NodeID, EdgeID>> TraverseRoad(NodeID starting_at_node_id, std::optional<std::pair<NodeID, EdgeID>> TraverseRoad(NodeID starting_at_node_id,
EdgeID following_edge_id, EdgeID following_edge_id,
accumulator_type &accumulator, accumulator_type &accumulator,
const selector_type &selector) const; const selector_type &selector) const;
@ -111,7 +111,7 @@ struct SelectRoadByNameOnlyChoiceAndStraightness
* traversal. If no such edge is found, return {} is allowed. Usually you want to choose some * traversal. If no such edge is found, return {} is allowed. Usually you want to choose some
* form of obious turn to follow. * form of obious turn to follow.
*/ */
boost::optional<EdgeID> operator()(const NodeID nid, std::optional<EdgeID> operator()(const NodeID nid,
const EdgeID via_edge_id, const EdgeID via_edge_id,
const IntersectionView &intersection, const IntersectionView &intersection,
const util::NodeBasedDynamicGraph &node_based_graph, const util::NodeBasedDynamicGraph &node_based_graph,
@ -138,7 +138,7 @@ struct SelectStraightmostRoadByNameAndOnlyChoice
* traversal. If no such edge is found, return {} is allowed. Usually you want to choose some * traversal. If no such edge is found, return {} is allowed. Usually you want to choose some
* form of obious turn to follow. * form of obious turn to follow.
*/ */
boost::optional<EdgeID> operator()(const NodeID nid, std::optional<EdgeID> operator()(const NodeID nid,
const EdgeID via_edge_id, const EdgeID via_edge_id,
const IntersectionView &intersection, const IntersectionView &intersection,
const util::NodeBasedDynamicGraph &node_based_graph, const util::NodeBasedDynamicGraph &node_based_graph,
@ -187,7 +187,7 @@ struct IntersectionFinderAccumulator
}; };
template <class accumulator_type, class selector_type> template <class accumulator_type, class selector_type>
boost::optional<std::pair<NodeID, EdgeID>> std::optional<std::pair<NodeID, EdgeID>>
NodeBasedGraphWalker::TraverseRoad(NodeID current_node_id, NodeBasedGraphWalker::TraverseRoad(NodeID current_node_id,
EdgeID current_edge_id, EdgeID current_edge_id,
accumulator_type &accumulator, accumulator_type &accumulator,
@ -254,7 +254,7 @@ NodeBasedGraphWalker::TraverseRoad(NodeID current_node_id,
struct SkipTrafficSignalBarrierRoadSelector struct SkipTrafficSignalBarrierRoadSelector
{ {
boost::optional<EdgeID> operator()(const NodeID, std::optional<EdgeID> operator()(const NodeID,
const EdgeID, const EdgeID,
const IntersectionView &intersection, const IntersectionView &intersection,
const util::NodeBasedDynamicGraph &, const util::NodeBasedDynamicGraph &,
@ -262,11 +262,11 @@ struct SkipTrafficSignalBarrierRoadSelector
{ {
if (intersection.isTrafficSignalOrBarrier()) if (intersection.isTrafficSignalOrBarrier())
{ {
return boost::make_optional(intersection[1].eid); return std::make_optional(intersection[1].eid);
} }
else else
{ {
return boost::none; return std::nullopt;
} }
} }
}; };

View File

@ -1,13 +1,13 @@
#ifndef OSRM_LOCATION_DEPENDENT_DATA_HPP #ifndef OSRM_LOCATION_DEPENDENT_DATA_HPP
#define OSRM_LOCATION_DEPENDENT_DATA_HPP #define OSRM_LOCATION_DEPENDENT_DATA_HPP
#include <boost/filesystem/path.hpp>
#include <boost/geometry.hpp> #include <boost/geometry.hpp>
#include <boost/geometry/geometries/point_xy.hpp> #include <boost/geometry/geometries/point_xy.hpp>
#include <boost/geometry/index/rtree.hpp> #include <boost/geometry/index/rtree.hpp>
#include <osmium/osm/way.hpp> #include <osmium/osm/way.hpp>
#include <filesystem>
#include <string> #include <string>
#include <unordered_map> #include <unordered_map>
@ -30,7 +30,7 @@ struct LocationDependentData
using property_t = boost::variant<boost::blank, double, std::string, bool>; using property_t = boost::variant<boost::blank, double, std::string, bool>;
using properties_t = std::unordered_map<std::string, property_t>; using properties_t = std::unordered_map<std::string, property_t>;
LocationDependentData(const std::vector<boost::filesystem::path> &file_paths); LocationDependentData(const std::vector<std::filesystem::path> &file_paths);
bool empty() const { return rtree.empty(); } bool empty() const { return rtree.empty(); }
@ -39,7 +39,7 @@ struct LocationDependentData
property_t FindByKey(const std::vector<std::size_t> &property_indexes, const char *key) const; property_t FindByKey(const std::vector<std::size_t> &property_indexes, const char *key) const;
private: private:
void loadLocationDependentData(const boost::filesystem::path &file_path, void loadLocationDependentData(const std::filesystem::path &file_path,
std::vector<rtree_t::value_type> &bounding_boxes); std::vector<rtree_t::value_type> &bounding_boxes);
rtree_t rtree; rtree_t rtree;

View File

@ -8,10 +8,12 @@
#include "turn_path.hpp" #include "turn_path.hpp"
#include "util/integer_range.hpp" #include "util/integer_range.hpp"
#include "util/log.hpp" #include "util/log.hpp"
#include "util/std_hash.hpp"
#include "util/vector_view.hpp" #include "util/vector_view.hpp"
#include <variant>
#include <algorithm> #include <algorithm>
#include <boost/functional/hash.hpp>
#include <mapbox/variant.hpp>
namespace osrm::extractor namespace osrm::extractor
{ {
@ -147,7 +149,6 @@ struct UnresolvedManeuverOverride
namespace std namespace std
{ {
template <> struct hash<osrm::extractor::NodeBasedTurn> template <> struct hash<osrm::extractor::NodeBasedTurn>
{ {
using argument_type = osrm::extractor::NodeBasedTurn; using argument_type = osrm::extractor::NodeBasedTurn;
using result_type = std::size_t; using result_type = std::size_t;
@ -155,9 +156,9 @@ template <> struct hash<osrm::extractor::NodeBasedTurn>
{ {
std::size_t seed = 0; std::size_t seed = 0;
boost::hash_combine(seed, s.from); hash_combine(seed, s.from);
boost::hash_combine(seed, s.via); hash_combine(seed, s.via);
boost::hash_combine(seed, s.to); hash_combine(seed, s.to);
return seed; return seed;
} }

View File

@ -3,7 +3,7 @@
#include "maneuver_override.hpp" #include "maneuver_override.hpp"
#include <boost/optional.hpp> #include <optional>
#include <string> #include <string>
#include <vector> #include <vector>
@ -55,7 +55,7 @@ class ManeuverOverrideRelationParser
{ {
public: public:
ManeuverOverrideRelationParser(); ManeuverOverrideRelationParser();
boost::optional<InputManeuverOverride> TryParse(const osmium::Relation &relation) const; std::optional<InputManeuverOverride> TryParse(const osmium::Relation &relation) const;
}; };
} // namespace osrm::extractor } // namespace osrm::extractor

View File

@ -12,8 +12,7 @@
#include "util/coordinate.hpp" #include "util/coordinate.hpp"
#include "util/node_based_graph.hpp" #include "util/node_based_graph.hpp"
#include <boost/filesystem/path.hpp> #include <filesystem>
#include <memory> #include <memory>
#include <string> #include <string>
#include <unordered_set> #include <unordered_set>

View File

@ -7,11 +7,11 @@
#include <boost/assert.hpp> #include <boost/assert.hpp>
#include <boost/numeric/conversion/cast.hpp> #include <boost/numeric/conversion/cast.hpp>
#include <boost/optional.hpp>
#include <algorithm> #include <algorithm>
#include <array> #include <array>
#include <cstdint> #include <cstdint>
#include <optional>
namespace osrm::extractor namespace osrm::extractor
{ {
@ -80,7 +80,7 @@ struct ProfileProperties
} }
// Check if this classes are excludable // Check if this classes are excludable
boost::optional<std::size_t> ClassesAreExcludable(ClassData classes) const std::optional<std::size_t> ClassesAreExcludable(ClassData classes) const
{ {
auto iter = std::find(excludable_classes.begin(), excludable_classes.end(), classes); auto iter = std::find(excludable_classes.begin(), excludable_classes.end(), classes);
if (iter != excludable_classes.end()) if (iter != excludable_classes.end())

View File

@ -7,14 +7,13 @@
#include <boost/algorithm/string.hpp> #include <boost/algorithm/string.hpp>
#include <boost/algorithm/string/trim.hpp> #include <boost/algorithm/string/trim.hpp>
#include <boost/assert.hpp> #include <boost/assert.hpp>
#include <boost/filesystem.hpp>
#include <boost/filesystem/fstream.hpp>
#include <boost/foreach.hpp> #include <boost/foreach.hpp>
#include <boost/spirit/include/qi.hpp> #include <boost/spirit/include/qi.hpp>
#include <boost/spirit/include/qi_int.hpp> #include <boost/spirit/include/qi_int.hpp>
#include <storage/io.hpp> #include <storage/io.hpp>
#include <filesystem>
#include <iterator> #include <iterator>
#include <string> #include <string>
#include <unordered_map> #include <unordered_map>
@ -40,7 +39,7 @@ struct RasterDatum
class RasterGrid class RasterGrid
{ {
public: public:
RasterGrid(const boost::filesystem::path &filepath, std::size_t _xdim, std::size_t _ydim) RasterGrid(const std::filesystem::path &filepath, std::size_t _xdim, std::size_t _ydim)
{ {
xdim = _xdim; xdim = _xdim;
ydim = _ydim; ydim = _ydim;

Some files were not shown because too many files have changed in this diff Show More