Compare commits
7 Commits
| Author | SHA1 | Date | |
|---|---|---|---|
| 5ec2712fe1 | |||
| 8b806cb7bd | |||
| 56d2d4dacd | |||
| 1107a14a2c | |||
| 5b23b11129 | |||
| 23fb96c4f2 | |||
| 45bfe937aa |
+1
-12
@@ -13,11 +13,6 @@ 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,
|
||||||
@@ -54,13 +49,11 @@ 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,
|
||||||
@@ -89,10 +82,6 @@ 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: '*'
|
||||||
|
|||||||
@@ -6,9 +6,6 @@ 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
|
||||||
@@ -56,10 +53,10 @@ jobs:
|
|||||||
with:
|
with:
|
||||||
push: true
|
push: true
|
||||||
platforms: linux/amd64,linux/arm64
|
platforms: linux/amd64,linux/arm64
|
||||||
file: ./docker/Dockerfile-${{ matrix.docker-base-image }}
|
file: ./docker/Dockerfile
|
||||||
tags: ${{ steps.metadebug.outputs.tags }}
|
tags: ${{ steps.metadebug.outputs.tags }}
|
||||||
build-args: |
|
build-args: |
|
||||||
DOCKER_TAG=${{ join(steps.metadebug.outputs.tags ) }}-${{ matrix.docker-base-image }}
|
DOCKER_TAG=${{ join(steps.metadebug.outputs.tags ) }}
|
||||||
|
|
||||||
|
|
||||||
- name: Build container image - assertions
|
- name: Build container image - assertions
|
||||||
@@ -67,10 +64,10 @@ jobs:
|
|||||||
with:
|
with:
|
||||||
push: true
|
push: true
|
||||||
platforms: linux/amd64,linux/arm64
|
platforms: linux/amd64,linux/arm64
|
||||||
file: ./docker/Dockerfile-${{ matrix.docker-base-image }}
|
file: ./docker/Dockerfile
|
||||||
tags: ${{ steps.metaassertions.outputs.tags }}
|
tags: ${{ steps.metaassertions.outputs.tags }}
|
||||||
build-args: |
|
build-args: |
|
||||||
DOCKER_TAG=${{ join(steps.metaassertions.outputs.tags ) }}-${{ matrix.docker-base-image }}
|
DOCKER_TAG=${{ join(steps.metaassertions.outputs.tags ) }}
|
||||||
|
|
||||||
# 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
|
||||||
@@ -78,7 +75,10 @@ jobs:
|
|||||||
with:
|
with:
|
||||||
push: true
|
push: true
|
||||||
platforms: linux/amd64,linux/arm64
|
platforms: linux/amd64,linux/arm64
|
||||||
file: ./docker/Dockerfile-${{ matrix.docker-base-image }}
|
file: ./docker/Dockerfile
|
||||||
tags: ${{ steps.meta.outputs.tags }}
|
tags: ${{ steps.meta.outputs.tags }}
|
||||||
build-args: |
|
build-args: |
|
||||||
DOCKER_TAG=${{ join(steps.meta.outputs.tags ) }}-${{ matrix.docker-base-image }}
|
DOCKER_TAG=${{ join(steps.meta.outputs.tags ) }}
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|||||||
+121
-230
@@ -15,6 +15,7 @@ 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"
|
||||||
|
|
||||||
@@ -30,11 +31,11 @@ jobs:
|
|||||||
env:
|
env:
|
||||||
BUILD_TYPE: Release
|
BUILD_TYPE: Release
|
||||||
steps:
|
steps:
|
||||||
- uses: actions/checkout@v4
|
- uses: actions/checkout@v3
|
||||||
- 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@v4
|
- uses: actions/setup-node@v3
|
||||||
with:
|
with:
|
||||||
node-version: 18
|
node-version: 18
|
||||||
- run: node --version
|
- run: node --version
|
||||||
@@ -46,32 +47,15 @@ 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: |
|
||||||
mkdir build
|
./lib/binding/osrm-datastore.exe test/data/ch/monaco.osrm
|
||||||
cd build
|
node test/nodejs/index.js
|
||||||
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
|
||||||
@@ -92,13 +76,13 @@ jobs:
|
|||||||
format-taginfo-docs:
|
format-taginfo-docs:
|
||||||
runs-on: ubuntu-22.04
|
runs-on: ubuntu-22.04
|
||||||
steps:
|
steps:
|
||||||
- uses: actions/checkout@v4
|
- uses: actions/checkout@v3
|
||||||
- name: Use Node.js
|
- name: Use Node.js
|
||||||
uses: actions/setup-node@v4
|
uses: actions/setup-node@v3
|
||||||
with:
|
with:
|
||||||
node-version: 18
|
node-version: 18
|
||||||
- name: Enable Node.js cache
|
- name: Enable Node.js cache
|
||||||
uses: actions/cache@v4
|
uses: actions/cache@v3
|
||||||
with:
|
with:
|
||||||
path: ~/.npm
|
path: ~/.npm
|
||||||
key: ${{ runner.os }}-node-${{ hashFiles('**/package-lock.json') }}
|
key: ${{ runner.os }}-node-${{ hashFiles('**/package-lock.json') }}
|
||||||
@@ -116,18 +100,15 @@ 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-matrix:
|
docker-image:
|
||||||
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@v4
|
uses: actions/checkout@v3
|
||||||
- name: Enable osm.pbf cache
|
- name: Enable osm.pbf cache
|
||||||
uses: actions/cache@v4
|
uses: actions/cache@v3
|
||||||
with:
|
with:
|
||||||
path: berlin-latest.osm.pbf
|
path: berlin-latest.osm.pbf
|
||||||
key: v1-berlin-osm-pbf
|
key: v1-berlin-osm-pbf
|
||||||
@@ -135,7 +116,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-${{ matrix.docker-base-image }} .
|
docker build -t osrm-backend-local -f docker/Dockerfile .
|
||||||
- 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
|
||||||
@@ -152,6 +133,7 @@ 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"
|
||||||
|
|
||||||
@@ -170,110 +152,104 @@ jobs:
|
|||||||
continue-on-error: false
|
continue-on-error: false
|
||||||
node: 20
|
node: 20
|
||||||
runs-on: ubuntu-24.04
|
runs-on: ubuntu-24.04
|
||||||
|
BUILD_TOOLS: ON
|
||||||
BUILD_TYPE: Debug
|
BUILD_TYPE: Debug
|
||||||
CCOMPILER: gcc-13
|
CCOMPILER: gcc-13
|
||||||
CUCUMBER_TIMEOUT: 20000
|
CUCUMBER_TIMEOUT: 20000
|
||||||
CXXCOMPILER: g++-13
|
CXXCOMPILER: g++-13
|
||||||
ENABLE_COVERAGE: ON
|
ENABLE_COVERAGE: ON
|
||||||
|
|
||||||
- name: clang-18-debug-asan-ubsan
|
- name: clang-15-debug-asan-ubsan
|
||||||
continue-on-error: false
|
continue-on-error: false
|
||||||
node: 20
|
node: 20
|
||||||
runs-on: ubuntu-24.04
|
runs-on: ubuntu-22.04
|
||||||
|
BUILD_TOOLS: ON
|
||||||
BUILD_TYPE: Debug
|
BUILD_TYPE: Debug
|
||||||
CCOMPILER: clang-18
|
CCOMPILER: clang-15
|
||||||
CUCUMBER_TIMEOUT: 20000
|
CUCUMBER_TIMEOUT: 20000
|
||||||
CXXCOMPILER: clang++-18
|
CXXCOMPILER: clang++-15
|
||||||
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-18-release
|
- name: clang-15-release
|
||||||
continue-on-error: false
|
continue-on-error: false
|
||||||
node: 18
|
node: 18
|
||||||
runs-on: ubuntu-24.04
|
runs-on: ubuntu-22.04
|
||||||
|
BUILD_TOOLS: ON
|
||||||
BUILD_TYPE: Release
|
BUILD_TYPE: Release
|
||||||
CCOMPILER: clang-18
|
CCOMPILER: clang-15
|
||||||
CXXCOMPILER: clang++-18
|
CXXCOMPILER: clang++-15
|
||||||
CUCUMBER_TIMEOUT: 60000
|
CUCUMBER_TIMEOUT: 60000
|
||||||
ENABLE_LTO: OFF
|
|
||||||
|
|
||||||
- name: clang-18-debug
|
- name: clang-15-debug
|
||||||
continue-on-error: false
|
continue-on-error: false
|
||||||
node: 18
|
node: 18
|
||||||
runs-on: ubuntu-24.04
|
runs-on: ubuntu-22.04
|
||||||
|
BUILD_TOOLS: ON
|
||||||
BUILD_TYPE: Debug
|
BUILD_TYPE: Debug
|
||||||
CCOMPILER: clang-18
|
CCOMPILER: clang-15
|
||||||
CXXCOMPILER: clang++-18
|
CXXCOMPILER: clang++-15
|
||||||
CUCUMBER_TIMEOUT: 60000
|
CUCUMBER_TIMEOUT: 60000
|
||||||
ENABLE_LTO: OFF
|
|
||||||
|
|
||||||
- name: clang-18-debug-clang-tidy
|
- name: clang-15-debug-clang-tidy
|
||||||
continue-on-error: false
|
continue-on-error: false
|
||||||
node: 18
|
node: 18
|
||||||
runs-on: ubuntu-24.04
|
runs-on: ubuntu-22.04
|
||||||
|
BUILD_TOOLS: ON
|
||||||
BUILD_TYPE: Debug
|
BUILD_TYPE: Debug
|
||||||
CCOMPILER: clang-18
|
CCOMPILER: clang-15
|
||||||
CXXCOMPILER: clang++-18
|
CXXCOMPILER: clang++-15
|
||||||
CUCUMBER_TIMEOUT: 60000
|
CUCUMBER_TIMEOUT: 60000
|
||||||
ENABLE_CLANG_TIDY: ON
|
ENABLE_CLANG_TIDY: ON
|
||||||
|
|
||||||
|
- name: clang-14-release
|
||||||
- name: clang-17-release
|
|
||||||
continue-on-error: false
|
continue-on-error: false
|
||||||
node: 18
|
node: 18
|
||||||
runs-on: ubuntu-24.04
|
runs-on: ubuntu-22.04
|
||||||
|
BUILD_TOOLS: ON
|
||||||
BUILD_TYPE: Release
|
BUILD_TYPE: Release
|
||||||
CCOMPILER: clang-17
|
CCOMPILER: clang-14
|
||||||
CXXCOMPILER: clang++-17
|
CXXCOMPILER: clang++-14
|
||||||
CUCUMBER_TIMEOUT: 60000
|
CUCUMBER_TIMEOUT: 60000
|
||||||
ENABLE_LTO: OFF
|
|
||||||
|
|
||||||
- name: clang-16-release
|
- name: clang-13-release
|
||||||
continue-on-error: false
|
continue-on-error: false
|
||||||
node: 18
|
node: 18
|
||||||
runs-on: ubuntu-24.04
|
runs-on: ubuntu-22.04
|
||||||
|
BUILD_TOOLS: ON
|
||||||
BUILD_TYPE: Release
|
BUILD_TYPE: Release
|
||||||
CCOMPILER: clang-16
|
CCOMPILER: clang-13
|
||||||
CXXCOMPILER: clang++-16
|
CXXCOMPILER: clang++-13
|
||||||
CUCUMBER_TIMEOUT: 60000
|
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-24.04
|
runs-on: ubuntu-22.04
|
||||||
|
BUILD_TOOLS: ON
|
||||||
BUILD_TYPE: Release
|
BUILD_TYPE: Release
|
||||||
CCOMPILER: clang-18
|
CCOMPILER: clang-15
|
||||||
CXXCOMPILER: clang++-18
|
CXXCOMPILER: clang++-15
|
||||||
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-24.04
|
runs-on: ubuntu-22.04
|
||||||
|
BUILD_TOOLS: ON
|
||||||
BUILD_TYPE: Release
|
BUILD_TYPE: Release
|
||||||
CCOMPILER: clang-18
|
CCOMPILER: clang-15
|
||||||
CXXCOMPILER: clang++-18
|
CXXCOMPILER: clang++-15
|
||||||
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_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
|
||||||
node: 20
|
node: 20
|
||||||
runs-on: ubuntu-24.04
|
runs-on: ubuntu-24.04
|
||||||
|
BUILD_TOOLS: ON
|
||||||
BUILD_TYPE: Release
|
BUILD_TYPE: Release
|
||||||
CCOMPILER: gcc-13
|
CCOMPILER: gcc-13
|
||||||
CXXCOMPILER: g++-13
|
CXXCOMPILER: g++-13
|
||||||
@@ -283,19 +259,29 @@ jobs:
|
|||||||
continue-on-error: false
|
continue-on-error: false
|
||||||
node: 20
|
node: 20
|
||||||
runs-on: ubuntu-22.04
|
runs-on: ubuntu-22.04
|
||||||
|
BUILD_TOOLS: ON
|
||||||
BUILD_TYPE: Release
|
BUILD_TYPE: Release
|
||||||
CCOMPILER: gcc-12
|
CCOMPILER: gcc-12
|
||||||
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-24.04
|
runs-on: ubuntu-22.04
|
||||||
BUILD_TYPE: Release
|
BUILD_TYPE: Release
|
||||||
CCOMPILER: clang-16
|
CCOMPILER: clang-13
|
||||||
CXXCOMPILER: clang++-16
|
CXXCOMPILER: clang++-13
|
||||||
ENABLE_CONAN: ON
|
ENABLE_CONAN: ON
|
||||||
NODE_PACKAGE_TESTS_ONLY: ON
|
NODE_PACKAGE_TESTS_ONLY: ON
|
||||||
|
|
||||||
@@ -303,10 +289,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-24.04
|
runs-on: ubuntu-22.04
|
||||||
BUILD_TYPE: Debug
|
BUILD_TYPE: Debug
|
||||||
CCOMPILER: clang-16
|
CCOMPILER: clang-13
|
||||||
CXXCOMPILER: clang++-16
|
CXXCOMPILER: clang++-13
|
||||||
ENABLE_CONAN: ON
|
ENABLE_CONAN: ON
|
||||||
NODE_PACKAGE_TESTS_ONLY: ON
|
NODE_PACKAGE_TESTS_ONLY: ON
|
||||||
|
|
||||||
@@ -338,6 +324,7 @@ jobs:
|
|||||||
continue-on-error: ${{ matrix.continue-on-error }}
|
continue-on-error: ${{ matrix.continue-on-error }}
|
||||||
runs-on: ${{ matrix.runs-on }}
|
runs-on: ${{ matrix.runs-on }}
|
||||||
env:
|
env:
|
||||||
|
BUILD_TOOLS: ${{ matrix.BUILD_TOOLS }}
|
||||||
BUILD_TYPE: ${{ matrix.BUILD_TYPE }}
|
BUILD_TYPE: ${{ matrix.BUILD_TYPE }}
|
||||||
BUILD_SHARED_LIBS: ${{ matrix.BUILD_SHARED_LIBS }}
|
BUILD_SHARED_LIBS: ${{ matrix.BUILD_SHARED_LIBS }}
|
||||||
CCOMPILER: ${{ matrix.CCOMPILER }}
|
CCOMPILER: ${{ matrix.CCOMPILER }}
|
||||||
@@ -354,48 +341,45 @@ 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@v4
|
- uses: actions/checkout@v3
|
||||||
- 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@v4
|
uses: actions/setup-node@v3
|
||||||
with:
|
with:
|
||||||
node-version: ${{ matrix.node }}
|
node-version: ${{ matrix.node }}
|
||||||
- name: Enable Node.js cache
|
- name: Enable Node.js cache
|
||||||
uses: actions/cache@v4
|
uses: actions/cache@v3
|
||||||
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@v4
|
uses: actions/cache@v3
|
||||||
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@v4
|
uses: actions/cache@v3
|
||||||
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@v4
|
uses: actions/cache@v3
|
||||||
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
|
||||||
@@ -412,35 +396,6 @@ 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_UNDERSCORE="${BOOST_VERSION//./_}"
|
|
||||||
wget -q https://boostorg.jfrog.io/artifactory/main/release/${BOOST_VERSION}/source/boost_${BOOST_VERSION_UNDERSCORE}.tar.gz
|
|
||||||
tar xzf boost_${BOOST_VERSION_UNDERSCORE}.tar.gz
|
|
||||||
cd boost_${BOOST_VERSION_UNDERSCORE}
|
|
||||||
sudo ./bootstrap.sh
|
|
||||||
sudo ./b2 install
|
|
||||||
cd ..
|
|
||||||
sudo rm -rf boost_${BOOST_VERSION_UNDERSCORE}*
|
|
||||||
|
|
||||||
- name: Install dev dependencies
|
- name: Install dev dependencies
|
||||||
run: |
|
run: |
|
||||||
@@ -462,7 +417,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
|
sudo apt-get install -y libbz2-dev libxml2-dev libzip-dev liblua5.2-dev libboost-all-dev
|
||||||
if [[ "${CCOMPILER}" != clang-* ]]; then
|
if [[ "${CCOMPILER}" != clang-* ]]; then
|
||||||
sudo apt-get install -y ${CXXCOMPILER}
|
sudo apt-get install -y ${CXXCOMPILER}
|
||||||
fi
|
fi
|
||||||
@@ -472,7 +427,7 @@ jobs:
|
|||||||
fi
|
fi
|
||||||
|
|
||||||
# TBB
|
# TBB
|
||||||
TBB_VERSION=2021.12.0
|
TBB_VERSION=2021.3.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
|
||||||
@@ -482,13 +437,6 @@ 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: Prepare build
|
- name: Prepare build
|
||||||
run: |
|
run: |
|
||||||
mkdir ${OSRM_BUILD_DIR}
|
mkdir ${OSRM_BUILD_DIR}
|
||||||
@@ -511,7 +459,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} \
|
||||||
@@ -520,15 +468,15 @@ jobs:
|
|||||||
-DENABLE_COVERAGE=${ENABLE_COVERAGE:-OFF} \
|
-DENABLE_COVERAGE=${ENABLE_COVERAGE:-OFF} \
|
||||||
-DENABLE_NODE_BINDINGS=${ENABLE_NODE_BINDINGS:-OFF} \
|
-DENABLE_NODE_BINDINGS=${ENABLE_NODE_BINDINGS:-OFF} \
|
||||||
-DENABLE_SANITIZER=${ENABLE_SANITIZER:-OFF} \
|
-DENABLE_SANITIZER=${ENABLE_SANITIZER:-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
|
||||||
@@ -536,6 +484,13 @@ jobs:
|
|||||||
echo "PKG_CONFIG_PATH=${OSRM_INSTALL_DIR}/lib/pkgconfig" >> $GITHUB_ENV
|
echo "PKG_CONFIG_PATH=${OSRM_INSTALL_DIR}/lib/pkgconfig" >> $GITHUB_ENV
|
||||||
fi
|
fi
|
||||||
popd
|
popd
|
||||||
|
- name: Build example
|
||||||
|
if: ${{ matrix.NODE_PACKAGE_TESTS_ONLY != 'ON' }}
|
||||||
|
run: |
|
||||||
|
mkdir example/build && pushd example/build
|
||||||
|
cmake .. -DCMAKE_BUILD_TYPE=${BUILD_TYPE}
|
||||||
|
make --jobs=${JOBS}
|
||||||
|
popd
|
||||||
- name: Run all tests
|
- name: Run all tests
|
||||||
if: ${{ matrix.NODE_PACKAGE_TESTS_ONLY != 'ON' }}
|
if: ${{ matrix.NODE_PACKAGE_TESTS_ONLY != 'ON' }}
|
||||||
run: |
|
run: |
|
||||||
@@ -543,6 +498,7 @@ jobs:
|
|||||||
|
|
||||||
# macOS SIP strips the linker path. Reset this inside the running shell
|
# macOS SIP strips the linker path. Reset this inside the running shell
|
||||||
export LD_LIBRARY_PATH=${{ env.LD_LIBRARY_PATH }}
|
export LD_LIBRARY_PATH=${{ env.LD_LIBRARY_PATH }}
|
||||||
|
./example/build/osrm-example test/data/mld/monaco.osrm
|
||||||
|
|
||||||
# All tests assume to be run from the build directory
|
# All tests assume to be run from the build directory
|
||||||
pushd ${OSRM_BUILD_DIR}
|
pushd ${OSRM_BUILD_DIR}
|
||||||
@@ -555,7 +511,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@v4
|
uses: actions/setup-node@v3
|
||||||
with:
|
with:
|
||||||
node-version: 18
|
node-version: 18
|
||||||
- name: Run Node package tests on Node 18
|
- name: Run Node package tests on Node 18
|
||||||
@@ -565,7 +521,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@v4
|
uses: actions/setup-node@v3
|
||||||
with:
|
with:
|
||||||
node-version: 20
|
node-version: 20
|
||||||
- name: Run Node package tests on Node 20
|
- name: Run Node package tests on Node 20
|
||||||
@@ -575,7 +531,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@v4
|
uses: actions/setup-node@v3
|
||||||
with:
|
with:
|
||||||
node-version: latest
|
node-version: latest
|
||||||
- name: Run Node package tests on Node-latest
|
- name: Run Node package tests on Node-latest
|
||||||
@@ -585,7 +541,7 @@ jobs:
|
|||||||
npm run nodejs-tests
|
npm run nodejs-tests
|
||||||
|
|
||||||
- name: Upload test logs
|
- name: Upload test logs
|
||||||
uses: actions/upload-artifact@v4
|
uses: actions/upload-artifact@v3
|
||||||
if: failure()
|
if: failure()
|
||||||
with:
|
with:
|
||||||
name: logs
|
name: logs
|
||||||
@@ -601,7 +557,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@v4
|
# uses: codecov/codecov-action@v1
|
||||||
# with:
|
# with:
|
||||||
# files: coverage.info
|
# files: coverage.info
|
||||||
# name: codecov-osrm-backend
|
# name: codecov-osrm-backend
|
||||||
@@ -623,78 +579,52 @@ 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-24.04
|
runs-on: ubuntu-22.04
|
||||||
env:
|
env:
|
||||||
CCOMPILER: clang-16
|
CCOMPILER: clang-13
|
||||||
CXXCOMPILER: clang++-16
|
CXXCOMPILER: clang++-13
|
||||||
CC: clang-16
|
CC: clang-13
|
||||||
CXX: clang++-16
|
CXX: clang++-13
|
||||||
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 data.osm.pbf cache
|
|
||||||
if: ${{ ! env.RUN_BIG_BENCHMARK }}
|
|
||||||
uses: actions/cache@v4
|
|
||||||
with:
|
|
||||||
path: ~/data.osm.pbf
|
|
||||||
key: v1-data-osm-pbf
|
|
||||||
restore-keys: |
|
|
||||||
v1-data-osm-pbf
|
|
||||||
- name: Enable compiler cache
|
- name: Enable compiler cache
|
||||||
uses: actions/cache@v4
|
uses: actions/cache@v3
|
||||||
with:
|
with:
|
||||||
path: ~/.ccache
|
path: ~/.ccache
|
||||||
key: v1-ccache-benchmarks-${{ github.sha }}
|
key: v1-ccache-benchmarks-${{ github.sha }}
|
||||||
restore-keys: |
|
restore-keys: |
|
||||||
v1-ccache-benchmarks-
|
v1-ccache-benchmarks-
|
||||||
- name: Enable Conan cache
|
- name: Enable Conan cache
|
||||||
uses: actions/cache@v4
|
uses: actions/cache@v3
|
||||||
with:
|
with:
|
||||||
path: ~/.conan
|
path: ~/.conan
|
||||||
key: v1-conan-benchmarks-${{ github.sha }}
|
key: v1-conan-benchmarks-${{ github.sha }}
|
||||||
restore-keys: |
|
restore-keys: |
|
||||||
v1-conan-benchmarks-
|
v1-conan-benchmarks-
|
||||||
- name: Checkout PR Branch
|
- name: Checkout PR Branch
|
||||||
uses: actions/checkout@v4
|
uses: actions/checkout@v3
|
||||||
with:
|
with:
|
||||||
ref: ${{ github.head_ref }}
|
ref: ${{ github.head_ref }}
|
||||||
path: pr
|
path: pr
|
||||||
- name: Install dependencies
|
- run: python3 -m pip install "conan<2.0.0" "requests==2.31.0"
|
||||||
|
- name: Build PR Branch
|
||||||
run: |
|
run: |
|
||||||
python3 -m pip install "conan<2.0.0" "requests==2.31.0" "numpy==1.26.4" --break-system-packages
|
mkdir -p pr/build
|
||||||
sudo apt-get update -y && sudo apt-get install ccache
|
cd pr/build
|
||||||
- name: Prepare data
|
cmake -DENABLE_CONAN=ON -DCMAKE_BUILD_TYPE=Release ..
|
||||||
run: |
|
make -j$(nproc)
|
||||||
if [ "$RUN_BIG_BENCHMARK" = "true" ]; then
|
make -j$(nproc) benchmarks
|
||||||
rm -rf ~/data.osm.pbf
|
cd ..
|
||||||
wget http://download.geofabrik.de/europe/poland-latest.osm.pbf -O ~/data.osm.pbf --quiet
|
make -C test/data
|
||||||
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@v4
|
uses: actions/checkout@v3
|
||||||
with:
|
with:
|
||||||
ref: ${{ github.event.pull_request.base.ref }}
|
ref: ${{ github.event.pull_request.base.ref }}
|
||||||
path: base
|
path: base
|
||||||
@@ -707,54 +637,15 @@ jobs:
|
|||||||
make -j$(nproc) benchmarks
|
make -j$(nproc) benchmarks
|
||||||
cd ..
|
cd ..
|
||||||
make -C test/data
|
make -C test/data
|
||||||
- name: Build PR Branch
|
- name: Run Benchmarks
|
||||||
run: |
|
run: |
|
||||||
mkdir -p pr/build
|
./pr/scripts/ci/run_benchmarks.sh base pr
|
||||||
cd pr/build
|
|
||||||
cmake -DENABLE_CONAN=ON -DCMAKE_BUILD_TYPE=Release ..
|
|
||||||
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: mkdir -p /opt/benchmarks
|
|
||||||
- name: Run PR Benchmarks
|
|
||||||
run: |
|
|
||||||
sudo mount -t tmpfs -o size=4g none /opt/benchmarks
|
|
||||||
cp -rf pr/build /opt/benchmarks/build
|
|
||||||
mkdir -p /opt/benchmarks/test
|
|
||||||
cp -rf pr/test/data /opt/benchmarks/test/data
|
|
||||||
cp -rf pr/profiles /opt/benchmarks/profiles
|
|
||||||
|
|
||||||
./pr/scripts/ci/run_benchmarks.sh -f /opt/benchmarks -r $(pwd)/pr_results -s $(pwd)/pr -b /opt/benchmarks/build -o ~/data.osm.pbf -g ~/gps_traces.csv
|
|
||||||
sudo umount /opt/benchmarks
|
|
||||||
- name: Run Base Benchmarks
|
|
||||||
run: |
|
|
||||||
sudo mount -t tmpfs -o size=4g none /opt/benchmarks
|
|
||||||
cp -rf base/build /opt/benchmarks/build
|
|
||||||
mkdir -p /opt/benchmarks/test
|
|
||||||
cp -rf base/test/data /opt/benchmarks/test/data
|
|
||||||
cp -rf base/profiles /opt/benchmarks/profiles
|
|
||||||
|
|
||||||
# TODO: remove it when base branch will have this file at needed location
|
|
||||||
if [ ! -f /opt/benchmarks/test/data/portugal_to_korea.json ]; then
|
|
||||||
cp base/src/benchmarks/portugal_to_korea.json /opt/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
|
|
||||||
./pr/scripts/ci/run_benchmarks.sh -f /opt/benchmarks -r $(pwd)/base_results -s $(pwd)/pr -b /opt/benchmarks/build -o ~/data.osm.pbf -g ~/gps_traces.csv
|
|
||||||
sudo umount /opt/benchmarks
|
|
||||||
- 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-matrix, windows-release-node, benchmarks]
|
needs: [build-test-publish, docker-image, windows-release-node, benchmarks]
|
||||||
steps:
|
steps:
|
||||||
- run: echo "CI complete"
|
- run: echo "CI complete"
|
||||||
|
|
||||||
|
|||||||
@@ -1,29 +0,0 @@
|
|||||||
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'
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
@@ -43,6 +43,7 @@ Thumbs.db
|
|||||||
#######################
|
#######################
|
||||||
/_build*
|
/_build*
|
||||||
/build/
|
/build/
|
||||||
|
/example/build/
|
||||||
/test/data/monaco.osrm*
|
/test/data/monaco.osrm*
|
||||||
/test/data/ch
|
/test/data/ch
|
||||||
/test/data/corech
|
/test/data/corech
|
||||||
|
|||||||
+1
-36
@@ -1,17 +1,12 @@
|
|||||||
# Unreleased
|
# Unreleased
|
||||||
- Changes from 5.27.1
|
- Changes from 5.27.1
|
||||||
- Features
|
- Features
|
||||||
- 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)
|
||||||
@@ -24,36 +19,7 @@
|
|||||||
- 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: Add .reserve(...) to assembleGeometry function. [#6983](https://github.com/Project-OSRM/osrm-backend/pull/6983)
|
- CHANGED: Partial fix migration from boost::optional to std::optional [#6551](https://github.com/Project-OSRM/osrm-backend/issues/6551), see also [#6592](https://github.com/Project-OSRM/osrm-backend/issues/6592)
|
||||||
- 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)
|
||||||
@@ -83,7 +49,6 @@
|
|||||||
- 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:
|
||||||
|
|||||||
+137
-52
@@ -1,6 +1,6 @@
|
|||||||
cmake_minimum_required(VERSION 3.18)
|
cmake_minimum_required(VERSION 3.18)
|
||||||
project(OSRM C CXX)
|
|
||||||
set(CMAKE_CXX_STANDARD 20)
|
set(CMAKE_CXX_STANDARD 17)
|
||||||
set(CMAKE_CXX_STANDARD_REQUIRED ON)
|
set(CMAKE_CXX_STANDARD_REQUIRED ON)
|
||||||
set(CMAKE_CXX_EXTENSIONS OFF)
|
set(CMAKE_CXX_EXTENSIONS OFF)
|
||||||
|
|
||||||
@@ -10,12 +10,6 @@ Please create a directory and run cmake from there, passing the path to this sou
|
|||||||
This process created the file `CMakeCache.txt' and the directory `CMakeFiles'. Please delete them.")
|
This process created the file `CMakeCache.txt' and the directory `CMakeFiles'. Please delete them.")
|
||||||
endif()
|
endif()
|
||||||
|
|
||||||
if(CMAKE_SIZEOF_VOID_P EQUAL 8)
|
|
||||||
message(STATUS "Building on a 64 bit system")
|
|
||||||
else()
|
|
||||||
message(FATAL_ERROR "Building on a 32 bit system is not supported")
|
|
||||||
endif()
|
|
||||||
|
|
||||||
# detect if this is included as subproject and if so expose
|
# detect if this is included as subproject and if so expose
|
||||||
# some variables to its parent scope
|
# some variables to its parent scope
|
||||||
get_directory_property(BUILD_AS_SUBPROJECT PARENT_DIRECTORY)
|
get_directory_property(BUILD_AS_SUBPROJECT PARENT_DIRECTORY)
|
||||||
@@ -28,37 +22,41 @@ if (NOT WIN32 AND NOT DEFINED ENV{OSRM_BUILD_DIR})
|
|||||||
set(ENV{OSRM_BUILD_DIR} ${CMAKE_CURRENT_BINARY_DIR})
|
set(ENV{OSRM_BUILD_DIR} ${CMAKE_CURRENT_BINARY_DIR})
|
||||||
endif()
|
endif()
|
||||||
|
|
||||||
list(APPEND CMAKE_MODULE_PATH "${CMAKE_CURRENT_SOURCE_DIR}/cmake")
|
|
||||||
|
|
||||||
option(BUILD_PACKAGE "Build OSRM package" OFF)
|
|
||||||
option(ENABLE_ASSERTIONS "Use assertions in release mode" OFF)
|
|
||||||
option(ENABLE_CCACHE "Speed up incremental rebuilds via ccache" ON)
|
|
||||||
option(ENABLE_CLANG_TIDY "Enables clang-tidy checks" OFF)
|
|
||||||
option(ENABLE_CONAN "Use conan for dependencies" OFF)
|
option(ENABLE_CONAN "Use conan for dependencies" OFF)
|
||||||
option(ENABLE_COVERAGE "Build with coverage instrumentalisation" OFF)
|
option(ENABLE_CCACHE "Speed up incremental rebuilds via ccache" ON)
|
||||||
|
option(BUILD_TOOLS "Build OSRM tools" OFF)
|
||||||
|
option(BUILD_PACKAGE "Build OSRM package" OFF)
|
||||||
|
option(BUILD_ROUTED "Build osrm-routed HTTP server" ON)
|
||||||
|
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_FUZZING "Fuzz testing using LLVM's libFuzzer" OFF)
|
option(ENABLE_COVERAGE "Build with coverage instrumentalisation" OFF)
|
||||||
option(ENABLE_LTO "Use Link Time Optimisation" ON)
|
|
||||||
option(ENABLE_NODE_BINDINGS "Build NodeJs bindings" 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_FUZZING "Fuzz testing using LLVM's libFuzzer" OFF)
|
||||||
|
option(ENABLE_NODE_BINDINGS "Build NodeJs bindings" 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 REQUIRED)
|
find_program(CLANG_TIDY_COMMAND NAMES clang-tidy)
|
||||||
message(STATUS "Found clang-tidy at ${CLANG_TIDY_COMMAND}")
|
if(NOT CLANG_TIDY_COMMAND)
|
||||||
set(CMAKE_CXX_CLANG_TIDY "${CLANG_TIDY_COMMAND};--warnings-as-errors=*;--header-filter=.*")
|
message(FATAL_ERROR "ENABLE_CLANG_TIDY is ON but clang-tidy is not found!")
|
||||||
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()
|
else()
|
||||||
message(FATAL_ERROR "IPO / LTO not supported: <${error}>")
|
message(STATUS "Found clang-tidy at ${CLANG_TIDY_COMMAND}")
|
||||||
|
set(CMAKE_CXX_CLANG_TIDY "${CLANG_TIDY_COMMAND};--warnings-as-errors=*;--header-filter=.*")
|
||||||
endif()
|
endif()
|
||||||
endif()
|
endif()
|
||||||
|
|
||||||
|
list(APPEND CMAKE_MODULE_PATH "${CMAKE_CURRENT_SOURCE_DIR}/cmake")
|
||||||
|
|
||||||
|
# be compatible with version handling before cmake 3.x
|
||||||
|
if (POLICY CMP0057)
|
||||||
|
cmake_policy(SET CMP0057 NEW)
|
||||||
|
endif()
|
||||||
|
if (POLICY CMP0074)
|
||||||
|
cmake_policy(SET CMP0074 NEW)
|
||||||
|
endif()
|
||||||
|
project(OSRM C CXX)
|
||||||
|
|
||||||
# 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")
|
||||||
@@ -75,14 +73,14 @@ sbeParseJson(packagejson packagejsonraw)
|
|||||||
# This regex is not strict enough, but the correct one is too complicated for cmake matching.
|
# This regex is not strict enough, but the correct one is too complicated for cmake matching.
|
||||||
# https://semver.org/#is-there-a-suggested-regular-expression-regex-to-check-a-semver-string
|
# https://semver.org/#is-there-a-suggested-regular-expression-regex-to-check-a-semver-string
|
||||||
if (packagejson.version MATCHES "^([0-9]+)\.([0-9]+)\.([0-9]+)([-+][0-9a-zA-Z.-]+)?$")
|
if (packagejson.version MATCHES "^([0-9]+)\.([0-9]+)\.([0-9]+)([-+][0-9a-zA-Z.-]+)?$")
|
||||||
set(OSRM_VERSION_MAJOR ${CMAKE_MATCH_1})
|
set(OSRM_VERSION_MAJOR ${CMAKE_MATCH_1})
|
||||||
set(OSRM_VERSION_MINOR ${CMAKE_MATCH_2})
|
set(OSRM_VERSION_MINOR ${CMAKE_MATCH_2})
|
||||||
set(OSRM_VERSION_PATCH ${CMAKE_MATCH_3})
|
set(OSRM_VERSION_PATCH ${CMAKE_MATCH_3})
|
||||||
set(OSRM_VERSION_PRERELEASE_BUILD ${CMAKE_MATCH_4})
|
set(OSRM_VERSION_PRERELEASE_BUILD ${CMAKE_MATCH_4})
|
||||||
|
|
||||||
set(OSRM_VERSION packagejson.version)
|
set(OSRM_VERSION packagejson.version)
|
||||||
else()
|
else()
|
||||||
message(FATAL_ERROR "Version from package.json cannot be parsed, expected semver compatible label, but found ${packagejson.version}")
|
message(FATAL_ERROR "Version from package.json cannot be parsed, expected semver compatible label, but found ${packagejson.version}")
|
||||||
endif()
|
endif()
|
||||||
|
|
||||||
if (MSVC)
|
if (MSVC)
|
||||||
@@ -114,11 +112,18 @@ include(CheckCXXCompilerFlag)
|
|||||||
include(FindPackageHandleStandardArgs)
|
include(FindPackageHandleStandardArgs)
|
||||||
include(GNUInstallDirs)
|
include(GNUInstallDirs)
|
||||||
|
|
||||||
|
if(CMAKE_SIZEOF_VOID_P EQUAL 8)
|
||||||
|
message(STATUS "Building on a 64 bit system")
|
||||||
|
else()
|
||||||
|
message(FATAL_ERROR "Building on a 32 bit system is not supported")
|
||||||
|
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/include)
|
include_directories(SYSTEM ${CMAKE_CURRENT_SOURCE_DIR}/third_party/sol2-3.3.0/include)
|
||||||
|
include_directories(SYSTEM ${CMAKE_CURRENT_SOURCE_DIR}/third_party/variant/include)
|
||||||
|
|
||||||
set(BOOST_COMPONENTS date_time iostreams program_options thread unit_test_framework)
|
set(BOOST_COMPONENTS date_time chrono filesystem iostreams program_options regex system 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
|
||||||
@@ -134,6 +139,7 @@ file(GLOB UpdaterGlob src/updater/*.cpp)
|
|||||||
file(GLOB StorageGlob src/storage/*.cpp)
|
file(GLOB StorageGlob src/storage/*.cpp)
|
||||||
file(GLOB ServerGlob src/server/*.cpp src/server/**/*.cpp)
|
file(GLOB ServerGlob src/server/*.cpp src/server/**/*.cpp)
|
||||||
file(GLOB EngineGlob src/engine/*.cpp src/engine/**/*.cpp)
|
file(GLOB EngineGlob src/engine/*.cpp src/engine/**/*.cpp)
|
||||||
|
file(GLOB ErrorcodesGlob src/osrm/errorcodes.cpp)
|
||||||
|
|
||||||
add_library(UTIL OBJECT ${UtilGlob})
|
add_library(UTIL OBJECT ${UtilGlob})
|
||||||
add_library(EXTRACTOR OBJECT ${ExtractorGlob})
|
add_library(EXTRACTOR OBJECT ${ExtractorGlob})
|
||||||
@@ -144,11 +150,14 @@ add_library(CONTRACTOR OBJECT ${ContractorGlob})
|
|||||||
add_library(UPDATER OBJECT ${UpdaterGlob})
|
add_library(UPDATER OBJECT ${UpdaterGlob})
|
||||||
add_library(STORAGE OBJECT ${StorageGlob})
|
add_library(STORAGE OBJECT ${StorageGlob})
|
||||||
add_library(ENGINE OBJECT ${EngineGlob})
|
add_library(ENGINE OBJECT ${EngineGlob})
|
||||||
add_library(SERVER OBJECT ${ServerGlob})
|
|
||||||
|
if (BUILD_ROUTED)
|
||||||
|
add_library(SERVER OBJECT ${ServerGlob})
|
||||||
|
add_executable(osrm-routed src/tools/routed.cpp $<TARGET_OBJECTS:SERVER> $<TARGET_OBJECTS:UTIL>)
|
||||||
|
endif()
|
||||||
|
|
||||||
set_target_properties(UTIL PROPERTIES LINKER_LANGUAGE CXX)
|
set_target_properties(UTIL PROPERTIES LINKER_LANGUAGE CXX)
|
||||||
|
|
||||||
add_executable(osrm-routed src/tools/routed.cpp $<TARGET_OBJECTS:SERVER> $<TARGET_OBJECTS:UTIL>)
|
|
||||||
add_executable(osrm-extract src/tools/extract.cpp)
|
add_executable(osrm-extract src/tools/extract.cpp)
|
||||||
add_executable(osrm-partition src/tools/partition.cpp)
|
add_executable(osrm-partition src/tools/partition.cpp)
|
||||||
add_executable(osrm-customize src/tools/customize.cpp)
|
add_executable(osrm-customize src/tools/customize.cpp)
|
||||||
@@ -200,6 +209,17 @@ 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")
|
||||||
@@ -247,6 +267,7 @@ 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)
|
||||||
@@ -271,7 +292,6 @@ 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)
|
||||||
|
|
||||||
@@ -312,12 +332,20 @@ 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.6.2@#2d385d0d50eb5561006a7ff9e356656b")
|
set(CONAN_EXPAT_VERSION "2.2.10@#916908d4a570ad839edd25322c3268cd")
|
||||||
set(CONAN_LUA_VERSION "5.4.6@#658d6089093cf01992c2737ab2e96763")
|
set(CONAN_LUA_VERSION "5.4.4@#3ec62efc37cd0a5d80b9e5cb35277360")
|
||||||
set(CONAN_TBB_VERSION "2021.12.0@#e56e5b44be8d690530585dd3634c0106")
|
set(CONAN_TBB_VERSION "2021.3.0@#507ec17cbd51a84167e143b20d170eea")
|
||||||
|
|
||||||
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
|
||||||
@@ -330,7 +358,9 @@ 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:without_stacktrace=True # Apple Silicon cross-compilation fails without it
|
OPTIONS boost:filesystem_version=3 # https://stackoverflow.com/questions/73392648/error-with-boost-filesystem-version-in-cmake
|
||||||
|
onetbb:shared=${TBB_SHARED}
|
||||||
|
boost:without_stacktrace=True # Apple Silicon cross-compilation fails without it
|
||||||
BUILD missing
|
BUILD missing
|
||||||
)
|
)
|
||||||
|
|
||||||
@@ -359,10 +389,14 @@ 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}")
|
||||||
|
|
||||||
|
|
||||||
@@ -435,6 +469,7 @@ 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_)
|
||||||
@@ -444,8 +479,11 @@ 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}
|
||||||
@@ -458,10 +496,13 @@ target_link_libraries(osrm-extract osrm_extract ${Boost_PROGRAM_OPTIONS_LIBRARY}
|
|||||||
target_link_libraries(osrm-partition osrm_partition ${Boost_PROGRAM_OPTIONS_LIBRARY})
|
target_link_libraries(osrm-partition osrm_partition ${Boost_PROGRAM_OPTIONS_LIBRARY})
|
||||||
target_link_libraries(osrm-customize osrm_customize ${Boost_PROGRAM_OPTIONS_LIBRARY})
|
target_link_libraries(osrm-customize osrm_customize ${Boost_PROGRAM_OPTIONS_LIBRARY})
|
||||||
target_link_libraries(osrm-contract osrm_contract ${Boost_PROGRAM_OPTIONS_LIBRARY})
|
target_link_libraries(osrm-contract osrm_contract ${Boost_PROGRAM_OPTIONS_LIBRARY})
|
||||||
target_link_libraries(osrm-routed osrm ${Boost_PROGRAM_OPTIONS_LIBRARY} ${OPTIONAL_SOCKET_LIBS} ${ZLIB_LIBRARY})
|
if (BUILD_ROUTED)
|
||||||
|
target_link_libraries(osrm-routed osrm ${Boost_PROGRAM_OPTIONS_LIBRARY} ${OPTIONAL_SOCKET_LIBS} ${ZLIB_LIBRARY})
|
||||||
|
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}
|
||||||
@@ -532,13 +573,18 @@ target_link_libraries(osrm_partition ${PARTITIONER_LIBRARIES})
|
|||||||
target_link_libraries(osrm_customize ${CUSTOMIZER_LIBRARIES} osrm_update osrm_store)
|
target_link_libraries(osrm_customize ${CUSTOMIZER_LIBRARIES} osrm_update osrm_store)
|
||||||
target_link_libraries(osrm_store ${STORAGE_LIBRARIES})
|
target_link_libraries(osrm_store ${STORAGE_LIBRARIES})
|
||||||
|
|
||||||
|
# BUILD_COMPONENTS
|
||||||
add_executable(osrm-components src/tools/components.cpp $<TARGET_OBJECTS:MICROTAR> $<TARGET_OBJECTS:UTIL>)
|
add_executable(osrm-components src/tools/components.cpp $<TARGET_OBJECTS:MICROTAR> $<TARGET_OBJECTS:UTIL>)
|
||||||
target_link_libraries(osrm-components ${TBB_LIBRARIES} ${BOOST_BASE_LIBRARIES} ${UTIL_LIBRARIES})
|
target_link_libraries(osrm-components ${TBB_LIBRARIES} ${BOOST_BASE_LIBRARIES} ${UTIL_LIBRARIES})
|
||||||
install(TARGETS osrm-components DESTINATION bin)
|
install(TARGETS osrm-components DESTINATION bin)
|
||||||
|
|
||||||
add_executable(osrm-io-benchmark src/tools/io-benchmark.cpp $<TARGET_OBJECTS:UTIL>)
|
if(BUILD_TOOLS)
|
||||||
target_link_libraries(osrm-io-benchmark ${BOOST_BASE_LIBRARIES} ${TBB_LIBRARIES})
|
message(STATUS "Activating OSRM internal tools")
|
||||||
install(TARGETS osrm-io-benchmark DESTINATION bin)
|
add_executable(osrm-io-benchmark src/tools/io-benchmark.cpp $<TARGET_OBJECTS:UTIL>)
|
||||||
|
target_link_libraries(osrm-io-benchmark ${BOOST_BASE_LIBRARIES} ${TBB_LIBRARIES})
|
||||||
|
|
||||||
|
install(TARGETS osrm-io-benchmark DESTINATION bin)
|
||||||
|
endif()
|
||||||
|
|
||||||
if (ENABLE_ASSERTIONS)
|
if (ENABLE_ASSERTIONS)
|
||||||
message(STATUS "Enabling assertions")
|
message(STATUS "Enabling assertions")
|
||||||
@@ -557,14 +603,49 @@ set_property(TARGET osrm-extract PROPERTY INSTALL_RPATH_USE_LINK_PATH TRUE)
|
|||||||
set_property(TARGET osrm-partition PROPERTY INSTALL_RPATH_USE_LINK_PATH TRUE)
|
set_property(TARGET osrm-partition PROPERTY INSTALL_RPATH_USE_LINK_PATH TRUE)
|
||||||
set_property(TARGET osrm-contract PROPERTY INSTALL_RPATH_USE_LINK_PATH TRUE)
|
set_property(TARGET osrm-contract PROPERTY INSTALL_RPATH_USE_LINK_PATH TRUE)
|
||||||
set_property(TARGET osrm-datastore PROPERTY INSTALL_RPATH_USE_LINK_PATH TRUE)
|
set_property(TARGET osrm-datastore PROPERTY INSTALL_RPATH_USE_LINK_PATH TRUE)
|
||||||
set_property(TARGET osrm-routed PROPERTY INSTALL_RPATH_USE_LINK_PATH TRUE)
|
if (BUILD_ROUTED)
|
||||||
|
set_property(TARGET osrm-routed PROPERTY INSTALL_RPATH_USE_LINK_PATH TRUE)
|
||||||
|
endif()
|
||||||
|
|
||||||
|
file(GLOB VariantGlob third_party/variant/include/mapbox/*.hpp)
|
||||||
|
file(GLOB FlatbuffersGlob third_party/flatbuffers/include/flatbuffers/*.h)
|
||||||
|
file(GLOB LibraryGlob include/osrm/*.hpp)
|
||||||
|
file(GLOB ParametersGlob include/engine/api/*_parameters.hpp)
|
||||||
|
set(ApiHeader include/engine/api/base_result.hpp)
|
||||||
|
set(EngineHeader include/engine/status.hpp include/engine/engine_config.hpp include/engine/hint.hpp include/engine/bearing.hpp include/engine/approach.hpp include/engine/phantom_node.hpp)
|
||||||
|
set(UtilHeader include/util/coordinate.hpp include/util/json_container.hpp include/util/typedefs.hpp include/util/alias.hpp include/util/exception.hpp include/util/bearing.hpp)
|
||||||
|
set(ExtractorHeader include/extractor/extractor.hpp include/storage/io_config.hpp include/extractor/extractor_config.hpp include/extractor/travel_mode.hpp)
|
||||||
|
set(PartitionerHeader include/partitioner/partitioner.hpp include/partitioner/partitioner_config.hpp)
|
||||||
|
set(ContractorHeader include/contractor/contractor.hpp include/contractor/contractor_config.hpp)
|
||||||
|
set(StorageHeader include/storage/storage.hpp include/storage/io_config.hpp include/storage/storage_config.hpp)
|
||||||
|
install(FILES ${EngineHeader} DESTINATION include/osrm/engine)
|
||||||
|
install(FILES ${UtilHeader} DESTINATION include/osrm/util)
|
||||||
|
install(FILES ${StorageHeader} DESTINATION include/osrm/storage)
|
||||||
|
install(FILES ${ExtractorHeader} DESTINATION include/osrm/extractor)
|
||||||
|
install(FILES ${PartitionerHeader} DESTINATION include/osrm/partitioner)
|
||||||
|
install(FILES ${ContractorHeader} DESTINATION include/osrm/contractor)
|
||||||
|
install(FILES ${LibraryGlob} DESTINATION include/osrm)
|
||||||
|
install(FILES ${ParametersGlob} 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(TARGETS osrm-extract DESTINATION bin)
|
install(TARGETS osrm-extract DESTINATION bin)
|
||||||
install(TARGETS osrm-partition DESTINATION bin)
|
install(TARGETS osrm-partition DESTINATION bin)
|
||||||
install(TARGETS osrm-customize DESTINATION bin)
|
install(TARGETS osrm-customize DESTINATION bin)
|
||||||
install(TARGETS osrm-contract DESTINATION bin)
|
install(TARGETS osrm-contract DESTINATION bin)
|
||||||
install(TARGETS osrm-datastore DESTINATION bin)
|
install(TARGETS osrm-datastore DESTINATION bin)
|
||||||
install(TARGETS osrm-routed DESTINATION bin)
|
if (BUILD_ROUTED)
|
||||||
|
install(TARGETS osrm-routed DESTINATION bin)
|
||||||
|
endif()
|
||||||
|
install(TARGETS osrm DESTINATION lib)
|
||||||
|
install(TARGETS osrm_extract DESTINATION lib)
|
||||||
|
install(TARGETS osrm_partition DESTINATION lib)
|
||||||
|
install(TARGETS osrm_customize DESTINATION lib)
|
||||||
|
install(TARGETS osrm_update DESTINATION lib)
|
||||||
|
install(TARGETS osrm_contract DESTINATION lib)
|
||||||
|
install(TARGETS osrm_store DESTINATION lib)
|
||||||
|
install(TARGETS osrm_guidance DESTINATION lib)
|
||||||
|
|
||||||
|
|
||||||
# Install profiles and support library to /usr/local/share/osrm/profiles by default
|
# Install profiles and support library to /usr/local/share/osrm/profiles by default
|
||||||
set(DefaultProfilesDir profiles)
|
set(DefaultProfilesDir profiles)
|
||||||
@@ -575,6 +656,8 @@ set(DefaultProfilesDir data)
|
|||||||
install(DIRECTORY ${DefaultProfilesDir} DESTINATION share/osrm)
|
install(DIRECTORY ${DefaultProfilesDir} DESTINATION share/osrm)
|
||||||
|
|
||||||
# Setup exporting variables for pkgconfig and subproject
|
# Setup exporting variables for pkgconfig and subproject
|
||||||
|
#
|
||||||
|
|
||||||
if(BUILD_PACKAGE)
|
if(BUILD_PACKAGE)
|
||||||
include(CPackConfig)
|
include(CPackConfig)
|
||||||
include(CPack)
|
include(CPack)
|
||||||
@@ -651,6 +734,7 @@ if (ENABLE_NODE_BINDINGS)
|
|||||||
add_subdirectory(src/nodejs)
|
add_subdirectory(src/nodejs)
|
||||||
endif()
|
endif()
|
||||||
|
|
||||||
|
|
||||||
if (ENABLE_FUZZING)
|
if (ENABLE_FUZZING)
|
||||||
# Requires libosrm being built with sanitizers; make configurable and default to ubsan
|
# Requires libosrm being built with sanitizers; make configurable and default to ubsan
|
||||||
set(FUZZ_SANITIZER "undefined" CACHE STRING "Sanitizer to be used for Fuzz testing")
|
set(FUZZ_SANITIZER "undefined" CACHE STRING "Sanitizer to be used for Fuzz testing")
|
||||||
@@ -684,3 +768,4 @@ foreach(header ${headers_to_check})
|
|||||||
endforeach()
|
endforeach()
|
||||||
add_library(check-headers STATIC EXCLUDE_FROM_ALL ${sources})
|
add_library(check-headers STATIC EXCLUDE_FROM_ALL ${sources})
|
||||||
set_target_properties(check-headers PROPERTIES ARCHIVE_OUTPUT_DIRECTORY ${check_headers_dir})
|
set_target_properties(check-headers PROPERTIES ARCHIVE_OUTPUT_DIRECTORY ${check_headers_dir})
|
||||||
|
|
||||||
|
|||||||
+1
-1
@@ -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 1950)
|
elseif(NOT MSVC_VERSION VERSION_LESS 1930 AND MSVC_VERSION VERSION_LESS 1940)
|
||||||
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}]")
|
||||||
|
|||||||
+16
-11
@@ -50,7 +50,9 @@ 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 "GNU")
|
if(CMAKE_CXX_COMPILER_ID MATCHES "Clang")
|
||||||
|
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)
|
||||||
@@ -64,6 +66,7 @@ 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)
|
||||||
@@ -76,13 +79,15 @@ 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)
|
||||||
# these warnings are not enabled by default
|
no_warning(c++17-extensions)
|
||||||
# no_warning(name-of-warning)
|
# TODO: these warnings are not enabled by default, but we consider them as useful and good to enable in the future
|
||||||
no_warning(deprecated-comma-subscript)
|
no_warning(implicit-int-conversion)
|
||||||
no_warning(comma-subscript)
|
no_warning(implicit-float-conversion)
|
||||||
no_warning(ambiguous-reversed-operator)
|
no_warning(unused-member-function)
|
||||||
no_warning(restrict)
|
no_warning(old-style-cast)
|
||||||
no_warning(free-nonheap-object)
|
no_warning(non-virtual-dtor)
|
||||||
if(CMAKE_CXX_COMPILER_ID MATCHES "GNU")
|
no_warning(float-conversion)
|
||||||
no_warning(stringop-overflow)
|
no_warning(sign-conversion)
|
||||||
endif()
|
no_warning(shorten-64-to-32)
|
||||||
|
no_warning(padded)
|
||||||
|
no_warning(missing-noreturn)
|
||||||
@@ -1 +0,0 @@
|
|||||||
Dockerfile-debian
|
|
||||||
@@ -0,0 +1,67 @@
|
|||||||
|
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,61 +0,0 @@
|
|||||||
FROM alpine:3.20.0 as alpine-mimalloc
|
|
||||||
|
|
||||||
RUN apk add --no-cache 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 && mkdir -p /opt
|
|
||||||
|
|
||||||
RUN apk add --no-cache \
|
|
||||||
cmake make git clang libbz2 libxml2 \
|
|
||||||
boost-dev boost-program_options boost-filesystem boost-iostreams boost-thread \
|
|
||||||
lua5.4-dev onetbb-dev expat-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" && \
|
|
||||||
case ${DOCKER_TAG} in *"-debug"*) BUILD_TYPE="Debug";; esac && \
|
|
||||||
case ${DOCKER_TAG} in *"-assertions"*) BUILD_TYPE="RelWithDebInfo" && ENABLE_ASSERTIONS="On";; esac && \
|
|
||||||
echo "Building ${BUILD_TYPE} with ENABLE_ASSERTIONS=${ENABLE_ASSERTIONS} && \
|
|
||||||
cmake .. -DCMAKE_BUILD_TYPE=${BUILD_TYPE} -DENABLE_ASSERTIONS=${ENABLE_ASSERTIONS} -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/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 alpine-mimalloc as runstage
|
|
||||||
|
|
||||||
COPY --from=builder /usr/local /usr/local
|
|
||||||
COPY --from=builder /opt /opt
|
|
||||||
|
|
||||||
RUN apk add --no-cache \
|
|
||||||
boost-program_options boost-date_time boost-iostreams boost-thread \
|
|
||||||
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
|
|
||||||
@@ -1,66 +0,0 @@
|
|||||||
FROM debian:bookworm-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.81-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.12.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)} && \
|
|
||||||
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" && \
|
|
||||||
case ${DOCKER_TAG} in *"-debug"*) BUILD_TYPE="Debug";; esac && \
|
|
||||||
case ${DOCKER_TAG} in *"-assertions"*) BUILD_TYPE="RelWithDebInfo" && ENABLE_ASSERTIONS="On";; esac && \
|
|
||||||
echo "Building ${BUILD_TYPE} with ENABLE_ASSERTIONS=${ENABLE_ASSERTIONS} && \
|
|
||||||
cmake .. -DCMAKE_BUILD_TYPE=${BUILD_TYPE} -DENABLE_ASSERTIONS=${ENABLE_ASSERTIONS} -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: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 \
|
|
||||||
libboost-program-options1.81.0 libboost-date-time1.81.0 libboost-iostreams1.81.0 libboost-thread1.81.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
|
|
||||||
Executable → Regular
+1
-5
@@ -6,8 +6,4 @@
|
|||||||
# 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 ..
|
|
||||||
|
|||||||
@@ -0,0 +1,33 @@
|
|||||||
|
## Introduction
|
||||||
|
|
||||||
|
OSRM can be used as a library (libosrm) via C++ instead of using it through the HTTP interface and `osrm-routed`. This allows for fine-tuning OSRM and has much less overhead. Here is a quick introduction into how to use `libosrm` in the upcoming v5 release.
|
||||||
|
|
||||||
|
Take a look at the example code that lives in the [example directory](https://github.com/Project-OSRM/osrm-backend/tree/master/example). Here is all you ever wanted to know about `libosrm`, that is a short description of what the types do and where to find documentation on it:
|
||||||
|
|
||||||
|
## Important interface objects
|
||||||
|
|
||||||
|
- [`EngineConfig`](https://github.com/Project-OSRM/osrm-backend/blob/master/include/engine/engine_config.hpp) - for initializing an OSRM instance we can configure certain properties and constraints. E.g. the storage config is the base path such as `france.osm.osrm` from which we derive and load `france.osm.osrm.*` auxiliary files. This also lets you set constraints such as the maximum number of locations allowed for specific services.
|
||||||
|
|
||||||
|
- [`OSRM`](https://github.com/Project-OSRM/osrm-backend/blob/master/include/osrm/osrm.hpp) - this is the main Routing Machine type with functions such as `Route` and `Table`. You initialize it with a `EngineConfig`. It does all the heavy lifting for you. Each function takes its own parameters, e.g. the `Route` function takes `RouteParameters`, and a out-reference to a JSON result that gets filled. The return value is a `Status`, indicating error or success.
|
||||||
|
|
||||||
|
- [`Status`](https://github.com/Project-OSRM/osrm-backend/blob/master/include/engine/status.hpp) - this is a type wrapping `Error` or `Ok` for indicating error or success, respectively.
|
||||||
|
|
||||||
|
- [`TableParameters`](https://github.com/Project-OSRM/osrm-backend/blob/master/include/engine/api/table_parameters.hpp) - this is an example of parameter types the Routing Machine functions expect. In this case `Table` expects its own parameters as `TableParameters`. You can see it wrapping two vectors, sources and destinations --- these are indices into your coordinates for the table service to construct a matrix from (empty sources or destinations means: use all of them). If you ask yourself where coordinates come from, you can see `TableParameters` inheriting from `BaseParameters`.
|
||||||
|
|
||||||
|
- [`BaseParameter`](https://github.com/Project-OSRM/osrm-backend/blob/master/include/engine/api/base_parameters.hpp) - this most importantly holds coordinates (and a few other optional properties that you don't need for basic usage); the specific parameter types inherit from `BaseParameters` to get these member attributes. That means your `TableParameters` type has `coordinates`, `sources` and `destination` member attributes (and a few other that we ignore for now).
|
||||||
|
|
||||||
|
- [`Coordinate`](https://github.com/Project-OSRM/osrm-backend/blob/master/include/util/coordinate.hpp) - this is a wrapper around a (longitude, latitude) pair. We really don't care about (lon,lat) vs (lat, lon) but we don't want you to accidentally mix them up, so both latitude and longitude are strictly typed wrappers around integers (fixed notation such as `13423240`) and floating points (floating notation such as `13.42324`).
|
||||||
|
|
||||||
|
- [Parameters for other services](https://github.com/Project-OSRM/osrm-backend/tree/master/include/engine/api) - here are all other `*Parameters` you need for other Routing Machine services.
|
||||||
|
|
||||||
|
- [JSON](https://github.com/Project-OSRM/osrm-backend/blob/master/include/util/json_container.hpp) - this is a sum type resembling JSON. The Routing Machine service functions take a out-ref to a JSON result and fill it accordingly. It is currently implemented using [mapbox/variant](https://github.com/mapbox/variant) which is similar to [Boost.Variant](http://www.boost.org/doc/libs/1_55_0/doc/html/variant.html). There are two ways to work with this sum type: either provide a visitor that acts on each type on visitation or use the `get` function in case you're sure about the structure. The JSON structure is written down in the [HTTP API](#http-api).
|
||||||
|
|
||||||
|
## Example
|
||||||
|
|
||||||
|
See [the example folder](https://github.com/Project-OSRM/osrm-backend/tree/master/example) in the OSRM repository.
|
||||||
|
|
||||||
|
## Workflow
|
||||||
|
|
||||||
|
- Create an `OSRM` instance initialized with a `EngineConfig`
|
||||||
|
- Call the service function on the `OSRM` object providing service specific `*Parameters`
|
||||||
|
- Check the return code and use the JSON result
|
||||||
+1
-1
@@ -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', 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', 'CoreCH' 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.
|
||||||
|
|||||||
@@ -0,0 +1,34 @@
|
|||||||
|
cmake_minimum_required(VERSION 3.18)
|
||||||
|
|
||||||
|
if(CMAKE_CURRENT_SOURCE_DIR STREQUAL CMAKE_CURRENT_BINARY_DIR AND NOT MSVC_IDE)
|
||||||
|
message(FATAL_ERROR "In-source builds are not allowed.
|
||||||
|
Please create a directory and run cmake from there, passing the path to this source directory as the last argument.
|
||||||
|
This process created the file `CMakeCache.txt' and the directory `CMakeFiles'. Please delete them.")
|
||||||
|
endif()
|
||||||
|
|
||||||
|
if(NOT CMAKE_BUILD_TYPE MATCHES Debug)
|
||||||
|
set(CMAKE_BUILD_TYPE Release)
|
||||||
|
endif()
|
||||||
|
|
||||||
|
project(osrm-example C CXX)
|
||||||
|
|
||||||
|
set(CMAKE_CXX_STANDARD 17)
|
||||||
|
set(CMAKE_CXX_STANDARD_REQUIRED ON)
|
||||||
|
set(CMAKE_CXX_EXTENSIONS OFF)
|
||||||
|
|
||||||
|
list(APPEND CMAKE_MODULE_PATH "${CMAKE_CURRENT_SOURCE_DIR}/cmake")
|
||||||
|
|
||||||
|
if(CMAKE_SIZEOF_VOID_P EQUAL 8)
|
||||||
|
message(STATUS "Building on a 64 bit system")
|
||||||
|
else()
|
||||||
|
message(STATUS "Building on a 32 bit system")
|
||||||
|
endif()
|
||||||
|
|
||||||
|
link_directories(${LibOSRM_LIBRARY_DIRS})
|
||||||
|
add_executable(osrm-example example.cpp)
|
||||||
|
|
||||||
|
find_package(LibOSRM REQUIRED)
|
||||||
|
|
||||||
|
target_link_libraries(osrm-example ${LibOSRM_LIBRARIES} ${LibOSRM_DEPENDENT_LIBRARIES})
|
||||||
|
include_directories(SYSTEM ${LibOSRM_INCLUDE_DIRS})
|
||||||
|
set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} ${LibOSRM_CXXFLAGS}")
|
||||||
@@ -0,0 +1,63 @@
|
|||||||
|
# - Try to find LibOSRM
|
||||||
|
# Once done this will define
|
||||||
|
# LibOSRM_FOUND - System has LibOSRM
|
||||||
|
# LibOSRM_LIBRARIES - The libraries and ldflags needed to use LibOSRM
|
||||||
|
# LibOSRM_DEPENDENT_LIBRARIES - The libraries and ldflags need to link LibOSRM dependencies
|
||||||
|
# LibOSRM_LIBRARY_DIRS - The libraries paths needed to find LibOSRM
|
||||||
|
# LibOSRM_CXXFLAGS - Compiler switches required for using LibOSRM
|
||||||
|
|
||||||
|
find_package(PkgConfig)
|
||||||
|
pkg_search_module(PC_LibOSRM QUIET libosrm)
|
||||||
|
|
||||||
|
function(JOIN VALUES GLUE OUTPUT)
|
||||||
|
string (REPLACE ";" "${GLUE}" _TMP_STR "${VALUES}")
|
||||||
|
set (${OUTPUT} "${_TMP_STR}" PARENT_SCOPE)
|
||||||
|
endfunction()
|
||||||
|
|
||||||
|
list(REMOVE_ITEM PC_LibOSRM_CFLAGS " ")
|
||||||
|
JOIN("${PC_LibOSRM_CFLAGS}" " " output)
|
||||||
|
|
||||||
|
set(LibOSRM_CXXFLAGS ${output})
|
||||||
|
set(LibOSRM_LIBRARY_DIRS ${PC_LibOSRM_LIBRARY_DIRS})
|
||||||
|
|
||||||
|
find_path(LibOSRM_INCLUDE_DIR osrm/osrm.hpp
|
||||||
|
PATH_SUFFIXES osrm include/osrm include
|
||||||
|
HINTS ${PC_LibOSRM_INCLUDEDIR} ${PC_LibOSRM_INCLUDE_DIRS}
|
||||||
|
~/Library/Frameworks
|
||||||
|
/Library/Frameworks
|
||||||
|
/usr/local
|
||||||
|
/usr
|
||||||
|
/opt/local
|
||||||
|
/opt)
|
||||||
|
|
||||||
|
find_library(TEST_LibOSRM_STATIC_LIBRARY Names osrm.lib libosrm.a
|
||||||
|
PATH_SUFFIXES osrm lib/osrm lib
|
||||||
|
HINTS ${PC_LibOSRM_LIBDIR} ${PC_LibOSRM_LIBRARY_DIRS}
|
||||||
|
~/Library/Frameworks
|
||||||
|
/Library/Frameworks
|
||||||
|
/usr/local
|
||||||
|
/usr
|
||||||
|
/opt/local
|
||||||
|
/opt)
|
||||||
|
find_library(TEST_LibOSRM_DYNAMIC_LIBRARY Names libosrm.dylib libosrm.so
|
||||||
|
PATH_SUFFIXES osrm lib/osrm lib
|
||||||
|
HINTS ${PC_LibOSRM_LIBDIR} ${PC_LibOSRM_LIBRARY_DIRS}
|
||||||
|
~/Library/Frameworks
|
||||||
|
/Library/Frameworks
|
||||||
|
/usr/local
|
||||||
|
/usr
|
||||||
|
/opt/local
|
||||||
|
/opt)
|
||||||
|
|
||||||
|
set(LibOSRM_DEPENDENT_LIBRARIES ${PC_LibOSRM_STATIC_LDFLAGS})
|
||||||
|
set(LibOSRM_LIBRARIES ${PC_LibOSRM_LDFLAGS})
|
||||||
|
|
||||||
|
include(FindPackageHandleStandardArgs)
|
||||||
|
# handle the QUIETLY and REQUIRED arguments and set LIBOSRM_FOUND to TRUE
|
||||||
|
# if all listed variables are TRUE
|
||||||
|
find_package_handle_standard_args(LibOSRM DEFAULT_MSG
|
||||||
|
LibOSRM_LIBRARY_DIRS
|
||||||
|
LibOSRM_CXXFLAGS
|
||||||
|
LibOSRM_LIBRARIES
|
||||||
|
LibOSRM_DEPENDENT_LIBRARIES
|
||||||
|
LibOSRM_INCLUDE_DIR)
|
||||||
Symlink
+1
@@ -0,0 +1 @@
|
|||||||
|
../../cmake/FindTBB.cmake
|
||||||
@@ -0,0 +1,90 @@
|
|||||||
|
#include "osrm/match_parameters.hpp"
|
||||||
|
#include "osrm/nearest_parameters.hpp"
|
||||||
|
#include "osrm/route_parameters.hpp"
|
||||||
|
#include "osrm/table_parameters.hpp"
|
||||||
|
#include "osrm/trip_parameters.hpp"
|
||||||
|
|
||||||
|
#include "osrm/coordinate.hpp"
|
||||||
|
#include "osrm/engine_config.hpp"
|
||||||
|
#include "osrm/json_container.hpp"
|
||||||
|
|
||||||
|
#include "osrm/osrm.hpp"
|
||||||
|
#include "osrm/status.hpp"
|
||||||
|
|
||||||
|
#include <exception>
|
||||||
|
#include <iostream>
|
||||||
|
#include <string>
|
||||||
|
#include <utility>
|
||||||
|
|
||||||
|
#include <cstdlib>
|
||||||
|
|
||||||
|
int main(int argc, const char *argv[])
|
||||||
|
{
|
||||||
|
if (argc < 2)
|
||||||
|
{
|
||||||
|
std::cerr << "Usage: " << argv[0] << " data.osrm\n";
|
||||||
|
return EXIT_FAILURE;
|
||||||
|
}
|
||||||
|
|
||||||
|
using namespace osrm;
|
||||||
|
|
||||||
|
// Configure based on a .osrm base path, and no datasets in shared mem from osrm-datastore
|
||||||
|
EngineConfig config;
|
||||||
|
|
||||||
|
config.storage_config = {argv[1]};
|
||||||
|
config.use_shared_memory = false;
|
||||||
|
|
||||||
|
// We support two routing speed up techniques:
|
||||||
|
// - Contraction Hierarchies (CH): requires extract+contract pre-processing
|
||||||
|
// - Multi-Level Dijkstra (MLD): requires extract+partition+customize pre-processing
|
||||||
|
//
|
||||||
|
// config.algorithm = EngineConfig::Algorithm::CH;
|
||||||
|
config.algorithm = EngineConfig::Algorithm::MLD;
|
||||||
|
|
||||||
|
// Routing machine with several services (such as Route, Table, Nearest, Trip, Match)
|
||||||
|
const OSRM osrm{config};
|
||||||
|
|
||||||
|
// The following shows how to use the Route service; configure this service
|
||||||
|
RouteParameters params;
|
||||||
|
|
||||||
|
// Route in monaco
|
||||||
|
params.coordinates.push_back({util::FloatLongitude{7.419758}, util::FloatLatitude{43.731142}});
|
||||||
|
params.coordinates.push_back({util::FloatLongitude{7.419505}, util::FloatLatitude{43.736825}});
|
||||||
|
|
||||||
|
// Response is in JSON format
|
||||||
|
engine::api::ResultT result = json::Object();
|
||||||
|
|
||||||
|
// Execute routing request, this does the heavy lifting
|
||||||
|
const auto status = osrm.Route(params, result);
|
||||||
|
|
||||||
|
auto &json_result = result.get<json::Object>();
|
||||||
|
if (status == Status::Ok)
|
||||||
|
{
|
||||||
|
auto &routes = json_result.values["routes"].get<json::Array>();
|
||||||
|
|
||||||
|
// Let's just use the first route
|
||||||
|
auto &route = routes.values.at(0).get<json::Object>();
|
||||||
|
const auto distance = route.values["distance"].get<json::Number>().value;
|
||||||
|
const auto duration = route.values["duration"].get<json::Number>().value;
|
||||||
|
|
||||||
|
// Warn users if extract does not contain the default coordinates from above
|
||||||
|
if (distance == 0 || duration == 0)
|
||||||
|
{
|
||||||
|
std::cout << "Note: distance or duration is zero. ";
|
||||||
|
std::cout << "You are probably doing a query outside of the OSM extract.\n\n";
|
||||||
|
}
|
||||||
|
|
||||||
|
std::cout << "Distance: " << distance << " meter\n";
|
||||||
|
std::cout << "Duration: " << duration << " seconds\n";
|
||||||
|
return EXIT_SUCCESS;
|
||||||
|
}
|
||||||
|
else if (status == Status::Error)
|
||||||
|
{
|
||||||
|
const auto code = json_result.values["code"].get<json::String>().value;
|
||||||
|
const auto message = json_result.values["message"].get<json::String>().value;
|
||||||
|
|
||||||
|
std::cout << "Code: " << code << "\n";
|
||||||
|
std::cout << "Message: " << code << "\n";
|
||||||
|
return EXIT_FAILURE;
|
||||||
|
}
|
||||||
|
}
|
||||||
@@ -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.1;
|
this.OSRM_CONNECTION_EXP_BACKOFF_COEF = process.env.OSRM_CONNECTION_EXP_BACKOFF_COEF && parseFloat(process.env.OSRM_CONNECTION_EXP_BACKOFF_COEF) || 1.0;
|
||||||
|
|
||||||
this.HOST = `http://${this.OSRM_IP}:${this.OSRM_PORT}`;
|
this.HOST = `http://${this.OSRM_IP}:${this.OSRM_PORT}`;
|
||||||
|
|
||||||
|
|||||||
@@ -31,7 +31,8 @@ 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 <filesystem>
|
#include <boost/filesystem/path.hpp>
|
||||||
|
|
||||||
#include <string>
|
#include <string>
|
||||||
|
|
||||||
namespace osrm::contractor
|
namespace osrm::contractor
|
||||||
@@ -46,7 +47,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 std::filesystem::path &base)
|
void UseDefaultOutputNames(const boost::filesystem::path &base)
|
||||||
{
|
{
|
||||||
IOConfig::UseDefaultOutputNames(base);
|
IOConfig::UseDefaultOutputNames(base);
|
||||||
updater_config.UseDefaultOutputNames(base);
|
updater_config.UseDefaultOutputNames(base);
|
||||||
|
|||||||
@@ -0,0 +1,128 @@
|
|||||||
|
#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 */
|
||||||
@@ -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 std::filesystem::path &path,
|
inline void readGraph(const boost::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 std::filesystem::path &path,
|
|||||||
|
|
||||||
// writes .osrm.hsgr file
|
// writes .osrm.hsgr file
|
||||||
template <typename ContractedMetricT>
|
template <typename ContractedMetricT>
|
||||||
inline void writeGraph(const std::filesystem::path &path,
|
inline void writeGraph(const boost::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)
|
||||||
{
|
{
|
||||||
|
|||||||
@@ -1,8 +1,9 @@
|
|||||||
#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"
|
||||||
@@ -26,7 +27,7 @@ struct CustomizationConfig final : storage::IOConfig
|
|||||||
{
|
{
|
||||||
}
|
}
|
||||||
|
|
||||||
void UseDefaultOutputNames(const std::filesystem::path &base)
|
void UseDefaultOutputNames(const boost::filesystem::path &base)
|
||||||
{
|
{
|
||||||
IOConfig::UseDefaultOutputNames(base);
|
IOConfig::UseDefaultOutputNames(base);
|
||||||
updater_config.UseDefaultOutputNames(base);
|
updater_config.UseDefaultOutputNames(base);
|
||||||
|
|||||||
@@ -9,7 +9,7 @@
|
|||||||
|
|
||||||
#include "storage/shared_memory_ownership.hpp"
|
#include "storage/shared_memory_ownership.hpp"
|
||||||
|
|
||||||
#include <filesystem>
|
#include <boost/filesystem/path.hpp>
|
||||||
|
|
||||||
namespace osrm::customizer
|
namespace osrm::customizer
|
||||||
{
|
{
|
||||||
|
|||||||
@@ -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 std::filesystem::path &path,
|
inline void readCellMetrics(const boost::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 std::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 std::filesystem::path &path,
|
writeCellMetrics(const boost::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 std::filesystem::path &path,
|
|||||||
|
|
||||||
// reads .osrm.mldgr file
|
// reads .osrm.mldgr file
|
||||||
template <typename MultiLevelGraphT>
|
template <typename MultiLevelGraphT>
|
||||||
inline void readGraph(const std::filesystem::path &path,
|
inline void readGraph(const boost::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 std::filesystem::path &path,
|
|||||||
|
|
||||||
// writes .osrm.mldgr file
|
// writes .osrm.mldgr file
|
||||||
template <typename MultiLevelGraphT>
|
template <typename MultiLevelGraphT>
|
||||||
inline void writeGraph(const std::filesystem::path &path,
|
inline void writeGraph(const boost::filesystem::path &path,
|
||||||
const MultiLevelGraphT &graph,
|
const MultiLevelGraphT &graph,
|
||||||
const std::uint32_t connectivity_checksum)
|
const std::uint32_t connectivity_checksum)
|
||||||
{
|
{
|
||||||
|
|||||||
@@ -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 <optional>
|
#include <boost/optional.hpp>
|
||||||
|
|
||||||
#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<std::optional<Hint>> hints;
|
std::vector<boost::optional<Hint>> hints;
|
||||||
std::vector<std::optional<double>> radiuses;
|
std::vector<boost::optional<double>> radiuses;
|
||||||
std::vector<std::optional<Bearing>> bearings;
|
std::vector<boost::optional<Bearing>> bearings;
|
||||||
std::vector<std::optional<Approach>> approaches;
|
std::vector<boost::optional<Approach>> approaches;
|
||||||
std::vector<std::string> exclude;
|
std::vector<std::string> exclude;
|
||||||
std::optional<OutputFormatType> format = OutputFormatType::JSON;
|
boost::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<std::optional<Hint>> hints_ = {},
|
std::vector<boost::optional<Hint>> hints_ = {},
|
||||||
std::vector<std::optional<double>> radiuses_ = {},
|
std::vector<boost::optional<double>> radiuses_ = {},
|
||||||
std::vector<std::optional<Bearing>> bearings_ = {},
|
std::vector<boost::optional<Bearing>> bearings_ = {},
|
||||||
std::vector<std::optional<Approach>> approaches_ = {},
|
std::vector<boost::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 std::optional<Bearing> &bearing_and_range)
|
[](const boost::optional<Bearing> &bearing_and_range)
|
||||||
{
|
{
|
||||||
if (bearing_and_range)
|
if (bearing_and_range)
|
||||||
{
|
{
|
||||||
|
|||||||
@@ -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 <variant>
|
#include <mapbox/variant.hpp>
|
||||||
|
|
||||||
#include <string>
|
#include <string>
|
||||||
|
|
||||||
@@ -10,7 +10,8 @@
|
|||||||
|
|
||||||
namespace osrm::engine::api
|
namespace osrm::engine::api
|
||||||
{
|
{
|
||||||
using ResultT = std::variant<util::json::Object, std::string, flatbuffers::FlatBufferBuilder>;
|
using ResultT =
|
||||||
|
mapbox::util::variant<util::json::Object, std::string, flatbuffers::FlatBufferBuilder>;
|
||||||
} // namespace osrm::engine::api
|
} // namespace osrm::engine::api
|
||||||
|
|
||||||
#endif
|
#endif
|
||||||
|
|||||||
@@ -12,7 +12,7 @@
|
|||||||
#include "util/coordinate.hpp"
|
#include "util/coordinate.hpp"
|
||||||
#include "util/json_container.hpp"
|
#include "util/json_container.hpp"
|
||||||
|
|
||||||
#include <optional>
|
#include <boost/optional.hpp>
|
||||||
|
|
||||||
#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::Value coordinateToLonLat(const util::Coordinate &coordinate);
|
util::json::Array 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"] = util::json::Value{std::move(coordinates)};
|
geojson.values["coordinates"] = 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,
|
||||||
std::optional<util::json::Value> geometry,
|
boost::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
|
||||||
|
|||||||
@@ -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 (std::holds_alternative<flatbuffers::FlatBufferBuilder>(response))
|
if (response.is<flatbuffers::FlatBufferBuilder>())
|
||||||
{
|
{
|
||||||
auto &fb_result = std::get<flatbuffers::FlatBufferBuilder>(response);
|
auto &fb_result = response.get<flatbuffers::FlatBufferBuilder>();
|
||||||
MakeResponse(sub_matchings, sub_routes, fb_result);
|
MakeResponse(sub_matchings, sub_routes, fb_result);
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
auto &json_result = std::get<util::json::Object>(response);
|
auto &json_result = response.get<util::json::Object>();
|
||||||
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.emplace("confidence", sub_matchings[index].confidence);
|
route.values["confidence"] = sub_matchings[index].confidence;
|
||||||
routes.values.emplace_back(std::move(route));
|
routes.values.push_back(std::move(route));
|
||||||
}
|
}
|
||||||
if (!parameters.skip_waypoints)
|
if (!parameters.skip_waypoints)
|
||||||
{
|
{
|
||||||
response.values.emplace("tracepoints", MakeTracepoints(sub_matchings));
|
response.values["tracepoints"] = MakeTracepoints(sub_matchings);
|
||||||
}
|
}
|
||||||
response.values.emplace("matchings", std::move(routes));
|
response.values["matchings"] = std::move(routes);
|
||||||
response.values.emplace("code", "Ok");
|
response.values["code"] = "Ok";
|
||||||
auto data_timestamp = facade.GetTimestamp();
|
auto data_timestamp = facade.GetTimestamp();
|
||||||
if (!data_timestamp.empty())
|
if (!data_timestamp.empty())
|
||||||
{
|
{
|
||||||
response.values.emplace("data_version", data_timestamp);
|
response.values["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.emplace_back(fbresult::WaypointBuilder(fb_result).Finish());
|
waypoints.push_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.emplace_back(fbresult::WaypointBuilder(fb_result).Finish());
|
waypoints.push_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.emplace_back(waypoint->Finish());
|
waypoints.push_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.emplace_back(util::json::Null());
|
waypoints.values.push_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.emplace_back(util::json::Null());
|
waypoints.values.push_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.emplace("matchings_index", matching_index.sub_matching_index);
|
waypoint.values["matchings_index"] = matching_index.sub_matching_index;
|
||||||
waypoint.values.emplace("waypoint_index", matching_index.point_index);
|
waypoint.values["waypoint_index"] = matching_index.point_index;
|
||||||
waypoint.values.emplace("alternatives_count",
|
waypoint.values["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.emplace_back(std::move(waypoint));
|
waypoints.values.push_back(std::move(waypoint));
|
||||||
}
|
}
|
||||||
|
|
||||||
return waypoints;
|
return waypoints;
|
||||||
|
|||||||
@@ -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 (std::holds_alternative<flatbuffers::FlatBufferBuilder>(response))
|
if (response.is<flatbuffers::FlatBufferBuilder>())
|
||||||
{
|
{
|
||||||
auto &fb_result = std::get<flatbuffers::FlatBufferBuilder>(response);
|
auto &fb_result = response.get<flatbuffers::FlatBufferBuilder>();
|
||||||
MakeResponse(phantom_nodes, fb_result);
|
MakeResponse(phantom_nodes, fb_result);
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
auto &json_result = std::get<util::json::Object>(response);
|
auto &json_result = response.get<util::json::Object>();
|
||||||
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();
|
||||||
std::optional<flatbuffers::Offset<flatbuffers::String>> data_version_string = std::nullopt;
|
boost::optional<flatbuffers::Offset<flatbuffers::String>> data_version_string = boost::none;
|
||||||
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.emplace_back(node_values.first);
|
nodes.values.push_back(node_values.first);
|
||||||
nodes.values.emplace_back(node_values.second);
|
nodes.values.push_back(node_values.second);
|
||||||
waypoint.values.emplace("nodes", std::move(nodes));
|
waypoint.values["nodes"] = std::move(nodes);
|
||||||
|
|
||||||
return waypoint;
|
return waypoint;
|
||||||
});
|
});
|
||||||
response.values.emplace("waypoints", std::move(waypoints));
|
response.values["waypoints"] = std::move(waypoints);
|
||||||
}
|
}
|
||||||
|
|
||||||
response.values.emplace("code", "Ok");
|
response.values["code"] = "Ok";
|
||||||
auto data_timestamp = facade.GetTimestamp();
|
auto data_timestamp = facade.GetTimestamp();
|
||||||
if (!data_timestamp.empty())
|
if (!data_timestamp.empty())
|
||||||
{
|
{
|
||||||
response.values.emplace("data_version", data_timestamp);
|
response.values["data_version"] = data_timestamp;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@@ -50,14 +50,14 @@ class RouteAPI : public BaseAPI
|
|||||||
{
|
{
|
||||||
BOOST_ASSERT(!raw_routes.routes.empty());
|
BOOST_ASSERT(!raw_routes.routes.empty());
|
||||||
|
|
||||||
if (std::holds_alternative<flatbuffers::FlatBufferBuilder>(response))
|
if (response.is<flatbuffers::FlatBufferBuilder>())
|
||||||
{
|
{
|
||||||
auto &fb_result = std::get<flatbuffers::FlatBufferBuilder>(response);
|
auto &fb_result = response.get<flatbuffers::FlatBufferBuilder>();
|
||||||
MakeResponse(raw_routes, waypoint_candidates, fb_result);
|
MakeResponse(raw_routes, waypoint_candidates, fb_result);
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
auto &json_result = std::get<util::json::Object>(response);
|
auto &json_result = response.get<util::json::Object>();
|
||||||
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.emplace("waypoints", BaseAPI::MakeWaypoints(waypoint_candidates));
|
response.values["waypoints"] = BaseAPI::MakeWaypoints(waypoint_candidates);
|
||||||
}
|
}
|
||||||
response.values.emplace("routes", std::move(jsRoutes));
|
response.values["routes"] = std::move(jsRoutes);
|
||||||
response.values.emplace("code", "Ok");
|
response.values["code"] = "Ok";
|
||||||
auto data_timestamp = facade.GetTimestamp();
|
auto data_timestamp = facade.GetTimestamp();
|
||||||
if (!data_timestamp.empty())
|
if (!data_timestamp.empty())
|
||||||
{
|
{
|
||||||
response.values.emplace("data_version", data_timestamp);
|
response.values["data_version"] = data_timestamp;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -158,8 +158,8 @@ class RouteAPI : public BaseAPI
|
|||||||
}
|
}
|
||||||
|
|
||||||
template <typename ForwardIter>
|
template <typename ForwardIter>
|
||||||
std::variant<flatbuffers::Offset<flatbuffers::String>,
|
mapbox::util::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
|
||||||
{
|
{
|
||||||
if (parameters.geometries == RouteParameters::GeometriesType::Polyline)
|
if (parameters.geometries == RouteParameters::GeometriesType::Polyline)
|
||||||
@@ -184,10 +184,10 @@ class RouteAPI : public BaseAPI
|
|||||||
return builder.CreateVectorOfStructs(coordinates);
|
return builder.CreateVectorOfStructs(coordinates);
|
||||||
}
|
}
|
||||||
|
|
||||||
std::optional<util::json::Value>
|
boost::optional<util::json::Value>
|
||||||
MakeGeometry(std::optional<std::vector<Coordinate>> &&annotations) const
|
MakeGeometry(boost::optional<std::vector<Coordinate>> &&annotations) const
|
||||||
{
|
{
|
||||||
std::optional<util::json::Value> json_geometry;
|
boost::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,8 +408,8 @@ class RouteAPI : public BaseAPI
|
|||||||
|
|
||||||
// Fill geometry
|
// Fill geometry
|
||||||
auto overview = MakeOverview(leg_geometries);
|
auto overview = MakeOverview(leg_geometries);
|
||||||
std::variant<flatbuffers::Offset<flatbuffers::String>,
|
mapbox::util::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,7 +426,8 @@ class RouteAPI : public BaseAPI
|
|||||||
routeObject.add_legs(legs_vector);
|
routeObject.add_legs(legs_vector);
|
||||||
if (overview)
|
if (overview)
|
||||||
{
|
{
|
||||||
std::visit(GeometryVisitor<fbresult::RouteObjectBuilder>(routeObject), geometry);
|
mapbox::util::apply_visitor(GeometryVisitor<fbresult::RouteObjectBuilder>(routeObject),
|
||||||
|
geometry);
|
||||||
}
|
}
|
||||||
|
|
||||||
return routeObject.Finish();
|
return routeObject.Finish();
|
||||||
@@ -442,22 +443,23 @@ 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 = GetAnnotations<float>(
|
speed =
|
||||||
fb_result,
|
GetAnnotations<float>(fb_result,
|
||||||
leg_geometry,
|
leg_geometry,
|
||||||
[&prev_speed](const guidance::LegGeometry::Annotation &anno)
|
[&prev_speed](const guidance::LegGeometry::Annotation &anno)
|
||||||
{
|
{
|
||||||
if (anno.duration < std::numeric_limits<float>::min())
|
if (anno.duration < std::numeric_limits<float>::min())
|
||||||
{
|
{
|
||||||
return prev_speed;
|
return prev_speed;
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
auto speed = std::round(anno.distance / anno.duration * 10.) / 10.;
|
auto speed =
|
||||||
prev_speed = speed;
|
round(anno.distance / anno.duration * 10.) / 10.;
|
||||||
return util::json::clamp_float(speed);
|
prev_speed = speed;
|
||||||
}
|
return util::json::clamp_float(speed);
|
||||||
});
|
}
|
||||||
|
});
|
||||||
}
|
}
|
||||||
|
|
||||||
flatbuffers::Offset<flatbuffers::Vector<uint32_t>> duration;
|
flatbuffers::Offset<flatbuffers::Vector<uint32_t>> duration;
|
||||||
@@ -643,7 +645,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);
|
||||||
std::visit(GeometryVisitor<fbresult::StepBuilder>(stepBuilder), geometry);
|
mapbox::util::apply_visitor(GeometryVisitor<fbresult::StepBuilder>(stepBuilder), geometry);
|
||||||
return stepBuilder.Finish();
|
return stepBuilder.Finish();
|
||||||
};
|
};
|
||||||
|
|
||||||
@@ -716,11 +718,12 @@ 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);
|
||||||
std::optional<util::json::Value> json_overview = MakeGeometry(MakeOverview(leg_geometries));
|
boost::optional<util::json::Value> json_overview =
|
||||||
|
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 =
|
||||||
@@ -783,57 +786,49 @@ 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.emplace(
|
annotation.values["speed"] = GetAnnotations(
|
||||||
"speed",
|
leg_geometry,
|
||||||
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())
|
{
|
||||||
{
|
return prev_speed;
|
||||||
return prev_speed;
|
}
|
||||||
}
|
else
|
||||||
else
|
{
|
||||||
{
|
auto speed = std::round(anno.distance / anno.duration * 10.) / 10.;
|
||||||
auto speed =
|
prev_speed = speed;
|
||||||
std::round(anno.distance / anno.duration * 10.) /
|
return util::json::clamp_float(speed);
|
||||||
10.;
|
}
|
||||||
prev_speed = speed;
|
});
|
||||||
return util::json::clamp_float(speed);
|
|
||||||
}
|
|
||||||
}));
|
|
||||||
}
|
}
|
||||||
|
|
||||||
if (requested_annotations & RouteParameters::AnnotationsType::Duration)
|
if (requested_annotations & RouteParameters::AnnotationsType::Duration)
|
||||||
{
|
{
|
||||||
annotation.values.emplace(
|
annotation.values["duration"] =
|
||||||
"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.emplace(
|
annotation.values["distance"] =
|
||||||
"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.emplace(
|
annotation.values["weight"] = GetAnnotations(
|
||||||
"weight",
|
leg_geometry,
|
||||||
GetAnnotations(leg_geometry,
|
[](const guidance::LegGeometry::Annotation &anno) { return anno.weight; });
|
||||||
[](const guidance::LegGeometry::Annotation &anno)
|
|
||||||
{ return anno.weight; }));
|
|
||||||
}
|
}
|
||||||
if (requested_annotations & RouteParameters::AnnotationsType::Datasources)
|
if (requested_annotations & RouteParameters::AnnotationsType::Datasources)
|
||||||
{
|
{
|
||||||
annotation.values.emplace(
|
annotation.values["datasources"] =
|
||||||
"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)
|
||||||
{
|
{
|
||||||
@@ -844,7 +839,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.emplace("nodes", std::move(nodes));
|
annotation.values["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)
|
||||||
@@ -860,8 +855,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.emplace("datasource_names", datasource_names);
|
metadata.values["datasource_names"] = datasource_names;
|
||||||
annotation.values.emplace("metadata", metadata);
|
annotation.values["metadata"] = metadata;
|
||||||
}
|
}
|
||||||
|
|
||||||
annotations.push_back(std::move(annotation));
|
annotations.push_back(std::move(annotation));
|
||||||
@@ -996,10 +991,10 @@ class RouteAPI : public BaseAPI
|
|||||||
return result;
|
return result;
|
||||||
}
|
}
|
||||||
|
|
||||||
std::optional<std::vector<Coordinate>>
|
boost::optional<std::vector<Coordinate>>
|
||||||
MakeOverview(const std::vector<guidance::LegGeometry> &leg_geometries) const
|
MakeOverview(const std::vector<guidance::LegGeometry> &leg_geometries) const
|
||||||
{
|
{
|
||||||
std::optional<std::vector<Coordinate>> overview;
|
boost::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 =
|
||||||
|
|||||||
@@ -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 std::optional<bool> continue_straight_,
|
const boost::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 std::optional<bool> continue_straight_,
|
const boost::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 std::optional<bool> continue_straight_,
|
const boost::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 std::optional<bool> continue_straight_,
|
const boost::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 std::optional<bool> continue_straight_,
|
const boost::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;
|
||||||
std::optional<bool> continue_straight;
|
boost::optional<bool> continue_straight;
|
||||||
std::vector<std::size_t> waypoints;
|
std::vector<std::size_t> waypoints;
|
||||||
|
|
||||||
bool IsValid() const
|
bool IsValid() const
|
||||||
|
|||||||
@@ -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 (std::holds_alternative<flatbuffers::FlatBufferBuilder>(response))
|
if (response.is<flatbuffers::FlatBufferBuilder>())
|
||||||
{
|
{
|
||||||
auto &fb_result = std::get<flatbuffers::FlatBufferBuilder>(response);
|
auto &fb_result = response.get<flatbuffers::FlatBufferBuilder>();
|
||||||
MakeResponse(tables, candidates, fallback_speed_cells, fb_result);
|
MakeResponse(tables, candidates, fallback_speed_cells, fb_result);
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
auto &json_result = std::get<util::json::Object>(response);
|
auto &json_result = response.get<util::json::Object>();
|
||||||
MakeResponse(tables, candidates, fallback_speed_cells, json_result);
|
MakeResponse(tables, candidates, fallback_speed_cells, json_result);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@@ -179,7 +179,7 @@ class TableAPI final : public BaseAPI
|
|||||||
{
|
{
|
||||||
if (!parameters.skip_waypoints)
|
if (!parameters.skip_waypoints)
|
||||||
{
|
{
|
||||||
response.values.emplace("sources", MakeWaypoints(candidates));
|
response.values["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.emplace("sources", MakeWaypoints(candidates, parameters.sources));
|
response.values["sources"] = MakeWaypoints(candidates, parameters.sources);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -195,7 +195,7 @@ class TableAPI final : public BaseAPI
|
|||||||
{
|
{
|
||||||
if (!parameters.skip_waypoints)
|
if (!parameters.skip_waypoints)
|
||||||
{
|
{
|
||||||
response.values.emplace("destinations", MakeWaypoints(candidates));
|
response.values["destinations"] = MakeWaypoints(candidates);
|
||||||
}
|
}
|
||||||
number_of_destinations = candidates.size();
|
number_of_destinations = candidates.size();
|
||||||
}
|
}
|
||||||
@@ -203,37 +203,34 @@ class TableAPI final : public BaseAPI
|
|||||||
{
|
{
|
||||||
if (!parameters.skip_waypoints)
|
if (!parameters.skip_waypoints)
|
||||||
{
|
{
|
||||||
response.values.emplace("destinations",
|
response.values["destinations"] =
|
||||||
MakeWaypoints(candidates, parameters.destinations));
|
MakeWaypoints(candidates, parameters.destinations);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
if (parameters.annotations & TableParameters::AnnotationsType::Duration)
|
if (parameters.annotations & TableParameters::AnnotationsType::Duration)
|
||||||
{
|
{
|
||||||
response.values.emplace(
|
response.values["durations"] =
|
||||||
"durations",
|
MakeDurationTable(tables.first, number_of_sources, number_of_destinations);
|
||||||
MakeDurationTable(tables.first, number_of_sources, number_of_destinations));
|
|
||||||
}
|
}
|
||||||
|
|
||||||
if (parameters.annotations & TableParameters::AnnotationsType::Distance)
|
if (parameters.annotations & TableParameters::AnnotationsType::Distance)
|
||||||
{
|
{
|
||||||
response.values.emplace(
|
response.values["distances"] =
|
||||||
"distances",
|
MakeDistanceTable(tables.second, number_of_sources, number_of_destinations);
|
||||||
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.emplace("fallback_speed_cells",
|
response.values["fallback_speed_cells"] = MakeEstimatesTable(fallback_speed_cells);
|
||||||
MakeEstimatesTable(fallback_speed_cells));
|
|
||||||
}
|
}
|
||||||
|
|
||||||
response.values.emplace("code", "Ok");
|
response.values["code"] = "Ok";
|
||||||
auto data_timestamp = facade.GetTimestamp();
|
auto data_timestamp = facade.GetTimestamp();
|
||||||
if (!data_timestamp.empty())
|
if (!data_timestamp.empty())
|
||||||
{
|
{
|
||||||
response.values.emplace("data_version", data_timestamp);
|
response.values["data_version"] = data_timestamp;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -380,8 +377,7 @@ 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;
|
||||||
}
|
}
|
||||||
@@ -410,7 +406,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(util::json::Value{json_row});
|
json_table.values.push_back(std::move(json_row));
|
||||||
}
|
}
|
||||||
return json_table;
|
return json_table;
|
||||||
}
|
}
|
||||||
@@ -419,18 +415,15 @@ 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(
|
std::for_each(fallback_speed_cells.begin(),
|
||||||
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;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@@ -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 (std::holds_alternative<flatbuffers::FlatBufferBuilder>(response))
|
if (response.is<flatbuffers::FlatBufferBuilder>())
|
||||||
{
|
{
|
||||||
auto &fb_result = std::get<flatbuffers::FlatBufferBuilder>(response);
|
auto &fb_result = response.get<flatbuffers::FlatBufferBuilder>();
|
||||||
MakeResponse(sub_trips, sub_routes, candidates, fb_result);
|
MakeResponse(sub_trips, sub_routes, candidates, fb_result);
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
auto &json_result = std::get<util::json::Object>(response);
|
auto &json_result = response.get<util::json::Object>();
|
||||||
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.emplace("waypoints", MakeWaypoints(sub_trips, candidates));
|
response.values["waypoints"] = MakeWaypoints(sub_trips, candidates);
|
||||||
}
|
}
|
||||||
response.values.emplace("trips", std::move(routes));
|
response.values["trips"] = std::move(routes);
|
||||||
response.values.emplace("code", "Ok");
|
response.values["code"] = "Ok";
|
||||||
auto data_timestamp = facade.GetTimestamp();
|
auto data_timestamp = facade.GetTimestamp();
|
||||||
if (!data_timestamp.empty())
|
if (!data_timestamp.empty())
|
||||||
{
|
{
|
||||||
response.values.emplace("data_version", data_timestamp);
|
response.values["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.emplace("trips_index", trip_index.sub_trip_index);
|
waypoint.values["trips_index"] = trip_index.sub_trip_index;
|
||||||
waypoint.values.emplace("waypoint_index", trip_index.point_index);
|
waypoint.values["waypoint_index"] = trip_index.point_index;
|
||||||
waypoints.values.push_back(std::move(waypoint));
|
waypoints.values.push_back(std::move(waypoint));
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@@ -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 <optional>
|
#include <boost/optional.hpp>
|
||||||
#include <vector>
|
#include <vector>
|
||||||
|
|
||||||
namespace osrm::engine::api
|
namespace osrm::engine::api
|
||||||
|
|||||||
+11
-16
@@ -47,29 +47,24 @@ 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)
|
||||||
{
|
{
|
||||||
BOOST_ASSERT(size > 0);
|
std::vector<unsigned char> bytes{first, first + size};
|
||||||
|
BOOST_ASSERT(!bytes.empty());
|
||||||
|
|
||||||
std::string encoded;
|
std::size_t bytes_to_pad{0};
|
||||||
encoded.reserve(((size + 2) / 3) * 4);
|
|
||||||
|
|
||||||
auto padding = (3 - size % 3) % 3;
|
while (bytes.size() % 3 != 0)
|
||||||
|
|
||||||
BOOST_ASSERT(padding == 0 || padding == 1 || padding == 2);
|
|
||||||
|
|
||||||
for (auto itr = detail::Base64FromBinary(first); itr != detail::Base64FromBinary(first + size);
|
|
||||||
++itr)
|
|
||||||
{
|
{
|
||||||
encoded.push_back(*itr);
|
bytes_to_pad += 1;
|
||||||
|
bytes.push_back(0);
|
||||||
}
|
}
|
||||||
|
|
||||||
for (size_t index = 0; index < padding; ++index)
|
BOOST_ASSERT(bytes_to_pad == 0 || bytes_to_pad == 1 || bytes_to_pad == 2);
|
||||||
{
|
BOOST_ASSERT_MSG(0 == bytes.size() % 3, "base64 input data size is not a multiple of 3");
|
||||||
encoded.push_back('=');
|
|
||||||
}
|
|
||||||
|
|
||||||
BOOST_ASSERT(encoded.size() == (size + 2) / 3 * 4);
|
std::string encoded{detail::Base64FromBinary{bytes.data()},
|
||||||
|
detail::Base64FromBinary{bytes.data() + (bytes.size() - bytes_to_pad)}};
|
||||||
|
|
||||||
return encoded;
|
return encoded.append(bytes_to_pad, '=');
|
||||||
}
|
}
|
||||||
|
|
||||||
// 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
|
||||||
|
|||||||
@@ -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(const EdgeData &)> &filter) const = 0;
|
const std::function<bool(EdgeData)> filter) const = 0;
|
||||||
};
|
};
|
||||||
|
|
||||||
template <> class AlgorithmDataFacade<MLD>
|
template <> class AlgorithmDataFacade<MLD>
|
||||||
|
|||||||
@@ -130,10 +130,9 @@ 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
|
EdgeID FindSmallestEdge(const NodeID edge_based_node_from,
|
||||||
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);
|
||||||
}
|
}
|
||||||
@@ -177,7 +176,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;
|
||||||
std::filesystem::path file_index_path;
|
boost::filesystem::path file_index_path;
|
||||||
|
|
||||||
std::optional<extractor::IntersectionBearingsView> intersection_bearings_view;
|
std::optional<extractor::IntersectionBearingsView> intersection_bearings_view;
|
||||||
|
|
||||||
@@ -369,7 +368,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 std::optional<Bearing> bearing,
|
const boost::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
|
||||||
{
|
{
|
||||||
@@ -382,20 +381,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 std::optional<double> max_distance,
|
const boost::optional<double> max_distance,
|
||||||
const std::optional<Bearing> bearing,
|
const boost::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, std::nullopt);
|
input_coordinate, approach, max_results, max_distance, bearing, boost::none);
|
||||||
}
|
}
|
||||||
|
|
||||||
PhantomCandidateAlternatives
|
PhantomCandidateAlternatives
|
||||||
NearestCandidatesWithAlternativeFromBigComponent(const util::Coordinate input_coordinate,
|
NearestCandidatesWithAlternativeFromBigComponent(const util::Coordinate input_coordinate,
|
||||||
const std::optional<double> max_distance,
|
const boost::optional<double> max_distance,
|
||||||
const std::optional<Bearing> bearing,
|
const boost::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
|
||||||
{
|
{
|
||||||
|
|||||||
@@ -35,7 +35,6 @@
|
|||||||
#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>
|
||||||
@@ -127,21 +126,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 std::optional<Bearing> bearing,
|
const boost::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 std::optional<double> max_distance,
|
const boost::optional<double> max_distance,
|
||||||
const std::optional<Bearing> bearing,
|
const boost::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 std::optional<double> max_distance,
|
const boost::optional<double> max_distance,
|
||||||
const std::optional<Bearing> bearing,
|
const boost::optional<Bearing> bearing,
|
||||||
const Approach approach,
|
const Approach approach,
|
||||||
const bool use_all_edges) const = 0;
|
const bool use_all_edges) const = 0;
|
||||||
|
|
||||||
|
|||||||
@@ -31,7 +31,8 @@ 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 <filesystem>
|
#include <boost/filesystem/path.hpp>
|
||||||
|
|
||||||
#include <set>
|
#include <set>
|
||||||
#include <string>
|
#include <string>
|
||||||
|
|
||||||
@@ -53,10 +54,14 @@ 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 two algorithms:
|
* You can chose between three 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.
|
||||||
*
|
*
|
||||||
@@ -69,6 +74,7 @@ struct EngineConfig final
|
|||||||
enum class Algorithm
|
enum class Algorithm
|
||||||
{
|
{
|
||||||
CH,
|
CH,
|
||||||
|
CoreCH, // Deprecated, will be removed in v6.0
|
||||||
MLD
|
MLD
|
||||||
};
|
};
|
||||||
|
|
||||||
@@ -79,10 +85,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;
|
||||||
double default_radius = -1.0;
|
boost::optional<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;
|
||||||
std::filesystem::path memory_file;
|
boost::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;
|
||||||
|
|||||||
@@ -12,8 +12,6 @@
|
|||||||
|
|
||||||
#include "osrm/coordinate.hpp"
|
#include "osrm/coordinate.hpp"
|
||||||
|
|
||||||
#include <optional>
|
|
||||||
|
|
||||||
#include <algorithm>
|
#include <algorithm>
|
||||||
#include <cmath>
|
#include <cmath>
|
||||||
#include <iterator>
|
#include <iterator>
|
||||||
@@ -53,8 +51,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 std::optional<Bearing> bearing_with_range,
|
const boost::optional<Bearing> bearing_with_range,
|
||||||
const std::optional<bool> use_all_edges) const
|
const boost::optional<bool> use_all_edges) const
|
||||||
{
|
{
|
||||||
auto results = rtree.SearchInRange(
|
auto results = rtree.SearchInRange(
|
||||||
input_coordinate,
|
input_coordinate,
|
||||||
@@ -85,9 +83,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 std::optional<double> max_distance,
|
const boost::optional<double> max_distance,
|
||||||
const std::optional<Bearing> bearing_with_range,
|
const boost::optional<Bearing> bearing_with_range,
|
||||||
const std::optional<bool> use_all_edges) const
|
const boost::optional<bool> use_all_edges) const
|
||||||
{
|
{
|
||||||
auto results = rtree.Nearest(
|
auto results = rtree.Nearest(
|
||||||
input_coordinate,
|
input_coordinate,
|
||||||
@@ -121,9 +119,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 std::optional<double> max_distance,
|
const boost::optional<double> max_distance,
|
||||||
const std::optional<Bearing> bearing_with_range,
|
const boost::optional<Bearing> bearing_with_range,
|
||||||
const std::optional<bool> use_all_edges) const
|
const boost::optional<bool> use_all_edges) const
|
||||||
{
|
{
|
||||||
bool has_nearest = false;
|
bool has_nearest = false;
|
||||||
bool has_big_component = false;
|
bool has_big_component = false;
|
||||||
|
|||||||
@@ -37,14 +37,6 @@ 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);
|
||||||
|
|||||||
@@ -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
|
||||||
|
|||||||
@@ -1,6 +1,7 @@
|
|||||||
#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>
|
||||||
@@ -11,15 +12,16 @@ 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.
|
||||||
[[nodiscard]] std::vector<RouteStep> collapseTurnInstructions(std::vector<RouteStep> steps);
|
OSRM_ATTR_WARN_UNUSED
|
||||||
|
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.
|
||||||
[[nodiscard]] std::vector<RouteStep>
|
OSRM_ATTR_WARN_UNUSED
|
||||||
collapseSegregatedTurnInstructions(std::vector<RouteStep> steps);
|
std::vector<RouteStep> 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
|
||||||
|
|||||||
@@ -3,6 +3,7 @@
|
|||||||
|
|
||||||
#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"
|
||||||
|
|
||||||
@@ -165,7 +166,8 @@ 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
|
||||||
[[nodiscard]] inline std::vector<RouteStep> removeNoTurnInstructions(std::vector<RouteStep> steps)
|
OSRM_ATTR_WARN_UNUSED
|
||||||
|
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.
|
||||||
@@ -202,8 +204,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];
|
||||||
|
|||||||
@@ -1,10 +1,11 @@
|
|||||||
#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 "engine/guidance/route_step.hpp"
|
|
||||||
|
|
||||||
#include <vector>
|
#include <vector>
|
||||||
|
|
||||||
|
#include "engine/guidance/route_step.hpp"
|
||||||
|
#include "util/attributes.hpp"
|
||||||
|
|
||||||
namespace osrm::engine::guidance
|
namespace osrm::engine::guidance
|
||||||
{
|
{
|
||||||
|
|
||||||
@@ -13,9 +14,9 @@ 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.
|
||||||
[[nodiscard]] std::vector<RouteStep>
|
OSRM_ATTR_WARN_UNUSED
|
||||||
anticipateLaneChange(std::vector<RouteStep> steps,
|
std::vector<RouteStep> 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
|
||||||
|
|
||||||
|
|||||||
@@ -5,6 +5,7 @@
|
|||||||
#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>
|
||||||
|
|
||||||
@@ -12,7 +13,8 @@ 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
|
||||||
[[nodiscard]] std::vector<RouteStep> handleRoundabouts(std::vector<RouteStep> steps);
|
OSRM_ATTR_WARN_UNUSED
|
||||||
|
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.
|
||||||
@@ -22,21 +24,23 @@ namespace osrm::engine::guidance
|
|||||||
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
|
||||||
[[nodiscard]] std::vector<RouteStep> assignRelativeLocations(std::vector<RouteStep> steps,
|
OSRM_ATTR_WARN_UNUSED
|
||||||
const LegGeometry &geometry,
|
std::vector<RouteStep> assignRelativeLocations(std::vector<RouteStep> steps,
|
||||||
const PhantomNode &source_node,
|
const LegGeometry &geometry,
|
||||||
const PhantomNode &target_node);
|
const PhantomNode &source_node,
|
||||||
|
const PhantomNode &target_node);
|
||||||
|
|
||||||
// collapse suppressed instructions remaining into intersections array
|
// collapse suppressed instructions remaining into intersections array
|
||||||
[[nodiscard]] std::vector<RouteStep> buildIntersections(std::vector<RouteStep> steps);
|
OSRM_ATTR_WARN_UNUSED
|
||||||
|
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.
|
||||||
[[nodiscard]] LegGeometry resyncGeometry(LegGeometry leg_geometry,
|
OSRM_ATTR_WARN_UNUSED
|
||||||
const std::vector<RouteStep> &steps);
|
LegGeometry resyncGeometry(LegGeometry leg_geometry, const std::vector<RouteStep> &steps);
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Apply maneuver override relations to the selected route.
|
* Apply maneuver override relations to the selected route.
|
||||||
|
|||||||
@@ -3,7 +3,7 @@
|
|||||||
|
|
||||||
#include "engine/guidance/route_step.hpp"
|
#include "engine/guidance/route_step.hpp"
|
||||||
|
|
||||||
#include <optional>
|
#include <boost/optional.hpp>
|
||||||
|
|
||||||
#include <string>
|
#include <string>
|
||||||
#include <vector>
|
#include <vector>
|
||||||
|
|||||||
@@ -2,6 +2,7 @@
|
|||||||
#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>
|
||||||
|
|
||||||
@@ -12,7 +13,8 @@ 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
|
||||||
[[nodiscard]] std::vector<RouteStep> suppressShortNameSegments(std::vector<RouteStep> steps);
|
OSRM_ATTR_WARN_UNUSED
|
||||||
|
std::vector<RouteStep> suppressShortNameSegments(std::vector<RouteStep> steps);
|
||||||
|
|
||||||
} // namespace osrm::engine::guidance
|
} // namespace osrm::engine::guidance
|
||||||
|
|
||||||
|
|||||||
@@ -15,7 +15,7 @@
|
|||||||
#include "util/integer_range.hpp"
|
#include "util/integer_range.hpp"
|
||||||
#include "util/typedefs.hpp"
|
#include "util/typedefs.hpp"
|
||||||
|
|
||||||
#include <optional>
|
#include <boost/optional.hpp>
|
||||||
#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
|
||||||
std::optional<EdgeID> turn_edge;
|
boost::optional<EdgeID> turn_edge;
|
||||||
};
|
};
|
||||||
|
|
||||||
struct InternalRouteResult
|
struct InternalRouteResult
|
||||||
|
|||||||
@@ -6,7 +6,7 @@
|
|||||||
#include <utility>
|
#include <utility>
|
||||||
#include <vector>
|
#include <vector>
|
||||||
|
|
||||||
#include <numbers>
|
#include <boost/math/constants/constants.hpp>
|
||||||
|
|
||||||
namespace osrm::engine::map_matching
|
namespace osrm::engine::map_matching
|
||||||
{
|
{
|
||||||
@@ -21,8 +21,10 @@ 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(2 * std::numbers::pi) * standard_deviation) *
|
return 1.0 / (std::sqrt(two_pi<double>()) * standard_deviation) *
|
||||||
std::exp(-x * x / (standard_deviation * standard_deviation));
|
std::exp(-x * x / (standard_deviation * standard_deviation));
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@@ -4,7 +4,7 @@
|
|||||||
#include "util/integer_range.hpp"
|
#include "util/integer_range.hpp"
|
||||||
|
|
||||||
#include <boost/assert.hpp>
|
#include <boost/assert.hpp>
|
||||||
#include <numbers>
|
#include <boost/math/constants/constants.hpp>
|
||||||
|
|
||||||
#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. * std::numbers::pi);
|
static const double log_2_pi = std::log(2. * boost::math::constants::pi<double>());
|
||||||
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();
|
||||||
|
|||||||
@@ -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
|
||||||
|
|||||||
@@ -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 std::optional<double> default_radius)
|
const boost::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)
|
||||||
{
|
{
|
||||||
|
|||||||
@@ -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 std::optional<double> default_radius);
|
explicit NearestPlugin(const int max_results, const boost::optional<double> default_radius);
|
||||||
|
|
||||||
Status HandleRequest(const RoutingAlgorithmsInterface &algorithms,
|
Status HandleRequest(const RoutingAlgorithmsInterface &algorithms,
|
||||||
const api::NearestParameters ¶ms,
|
const api::NearestParameters ¶ms,
|
||||||
|
|||||||
@@ -29,7 +29,7 @@ class BasePlugin
|
|||||||
protected:
|
protected:
|
||||||
BasePlugin() = default;
|
BasePlugin() = default;
|
||||||
|
|
||||||
BasePlugin(const std::optional<double> default_radius_) : default_radius(default_radius_) {}
|
BasePlugin(const boost::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
|
||||||
{
|
{
|
||||||
std::visit(ErrorRenderer(code, message), result);
|
mapbox::util::apply_visitor(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] : std::nullopt,
|
use_bearings ? parameters.bearings[i] : boost::none,
|
||||||
use_approaches && parameters.approaches[i] ? parameters.approaches[i].value()
|
use_approaches && parameters.approaches[i] ? parameters.approaches[i].get()
|
||||||
: 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] : std::nullopt,
|
use_bearings ? parameters.bearings[i] : boost::none,
|
||||||
use_approaches && parameters.approaches[i] ? parameters.approaches[i].value()
|
use_approaches && parameters.approaches[i] ? parameters.approaches[i].get()
|
||||||
: 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] : std::nullopt,
|
use_bearings ? parameters.bearings[i] : boost::none,
|
||||||
use_approaches && parameters.approaches[i] ? parameters.approaches[i].value()
|
use_approaches && parameters.approaches[i] ? parameters.approaches[i].get()
|
||||||
: 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 std::optional<double> default_radius;
|
const boost::optional<double> default_radius;
|
||||||
};
|
};
|
||||||
} // namespace osrm::engine::plugins
|
} // namespace osrm::engine::plugins
|
||||||
|
|
||||||
|
|||||||
@@ -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 std::optional<double> default_radius);
|
const boost::optional<double> default_radius);
|
||||||
|
|
||||||
Status HandleRequest(const RoutingAlgorithmsInterface &algorithms,
|
Status HandleRequest(const RoutingAlgorithmsInterface &algorithms,
|
||||||
const api::TableParameters ¶ms,
|
const api::TableParameters ¶ms,
|
||||||
|
|||||||
@@ -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_, std::optional<double> default_radius)
|
explicit TripPlugin(const int max_locations_trip_, boost::optional<double> default_radius)
|
||||||
: BasePlugin(default_radius), max_locations_trip(max_locations_trip_)
|
: BasePlugin(default_radius), max_locations_trip(max_locations_trip_)
|
||||||
{
|
{
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -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,
|
||||||
std::optional<double> default_radius);
|
boost::optional<double> default_radius);
|
||||||
|
|
||||||
Status HandleRequest(const RoutingAlgorithmsInterface &algorithms,
|
Status HandleRequest(const RoutingAlgorithmsInterface &algorithms,
|
||||||
const api::RouteParameters &route_parameters,
|
const api::RouteParameters &route_parameters,
|
||||||
|
|||||||
@@ -12,7 +12,7 @@ namespace osrm::engine
|
|||||||
{
|
{
|
||||||
namespace detail
|
namespace detail
|
||||||
{
|
{
|
||||||
void encode(int number_to_encode, std::string &output);
|
std::string encode(std::vector<int> &numbers);
|
||||||
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,24 +30,27 @@ std::string encodePolyline(CoordVectorForwardIter begin, CoordVectorForwardIter
|
|||||||
return {};
|
return {};
|
||||||
}
|
}
|
||||||
|
|
||||||
std::string output;
|
std::vector<int> delta_numbers;
|
||||||
// just a guess that we will need ~4 bytes per coordinate to avoid reallocations
|
BOOST_ASSERT(size > 0);
|
||||||
output.reserve(size * 4);
|
delta_numbers.reserve((size - 1) * 2);
|
||||||
|
|
||||||
int current_lat = 0;
|
int current_lat = 0;
|
||||||
int current_lon = 0;
|
int current_lon = 0;
|
||||||
for (auto it = begin; it != end; ++it)
|
std::for_each(
|
||||||
{
|
begin,
|
||||||
const int lat_diff =
|
end,
|
||||||
std::round(static_cast<int>(it->lat) * coordinate_to_polyline) - current_lat;
|
[&delta_numbers, ¤t_lat, ¤t_lon, coordinate_to_polyline](
|
||||||
const int lon_diff =
|
const util::Coordinate loc)
|
||||||
std::round(static_cast<int>(it->lon) * coordinate_to_polyline) - current_lon;
|
{
|
||||||
detail::encode(lat_diff, output);
|
const int lat_diff =
|
||||||
detail::encode(lon_diff, output);
|
std::round(static_cast<int>(loc.lat) * coordinate_to_polyline) - current_lat;
|
||||||
current_lat += lat_diff;
|
const int lon_diff =
|
||||||
current_lon += lon_diff;
|
std::round(static_cast<int>(loc.lon) * coordinate_to_polyline) - current_lon;
|
||||||
}
|
delta_numbers.emplace_back(lat_diff);
|
||||||
return output;
|
delta_numbers.emplace_back(lon_diff);
|
||||||
|
current_lat += lat_diff;
|
||||||
|
current_lon += lon_diff;
|
||||||
|
});
|
||||||
|
return detail::encode(delta_numbers);
|
||||||
}
|
}
|
||||||
|
|
||||||
// Decodes geometry from polyline format
|
// Decodes geometry from polyline format
|
||||||
|
|||||||
@@ -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 std::optional<bool> continue_straight_at_waypoint) const = 0;
|
const boost::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<std::optional<double>> &trace_gps_precision,
|
const std::vector<boost::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 std::optional<bool> continue_straight_at_waypoint) const final override;
|
const boost::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<std::optional<double>> &trace_gps_precision,
|
const std::vector<boost::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 std::optional<bool> continue_straight_at_waypoint) const
|
const boost::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<std::optional<double>> &trace_gps_precision,
|
const std::vector<boost::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,
|
||||||
|
|||||||
@@ -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<std::optional<double>> &trace_gps_precision,
|
const std::vector<boost::optional<double>> &trace_gps_precision,
|
||||||
const bool allow_splitting);
|
const bool allow_splitting);
|
||||||
|
|
||||||
} // namespace osrm::engine::routing_algorithms
|
} // namespace osrm::engine::routing_algorithms
|
||||||
|
|||||||
@@ -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],
|
||||||
std::nullopt});
|
boost::none});
|
||||||
}
|
}
|
||||||
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],
|
||||||
std::nullopt});
|
boost::none});
|
||||||
}
|
}
|
||||||
|
|
||||||
if (!unpacked_path.empty())
|
if (!unpacked_path.empty())
|
||||||
|
|||||||
@@ -11,7 +11,6 @@
|
|||||||
#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>
|
||||||
@@ -270,29 +269,10 @@ retrievePackedPathFromHeap(const SearchEngineData<Algorithm>::QueryHeap &forward
|
|||||||
return packed_path;
|
return packed_path;
|
||||||
}
|
}
|
||||||
|
|
||||||
template <typename Heap>
|
template <bool DIRECTION, typename Algorithm, typename... Args>
|
||||||
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,
|
||||||
Heap &forward_heap,
|
typename SearchEngineData<Algorithm>::QueryHeap &forward_heap,
|
||||||
const typename Heap::HeapNode &heapNode,
|
const typename SearchEngineData<Algorithm>::QueryHeap::HeapNode &heapNode,
|
||||||
const Args &...args)
|
const Args &...args)
|
||||||
{
|
{
|
||||||
const auto &partition = facade.GetMultiLevelPartition();
|
const auto &partition = facade.GetMultiLevelPartition();
|
||||||
@@ -301,31 +281,14 @@ 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 constexpr (DIRECTION == FORWARD_DIRECTION)
|
if (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());
|
||||||
@@ -335,23 +298,19 @@ 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)
|
||||||
{
|
{
|
||||||
const EdgeDistance to_distance = heapNode.data.distance + *distance;
|
forward_heap.Insert(to, to_weight, {heapNode.node, true});
|
||||||
insertOrUpdate(
|
|
||||||
forward_heap, to, to_weight, {heapNode.node, true, to_distance});
|
|
||||||
}
|
}
|
||||||
else
|
else if (to_weight < toHeapNode->weight)
|
||||||
{
|
{
|
||||||
insertOrUpdate(forward_heap, to, to_weight, {heapNode.node, true});
|
toHeapNode->data = {heapNode.node, true};
|
||||||
|
toHeapNode->weight = to_weight;
|
||||||
|
forward_heap.DecreaseKey(*toHeapNode);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
++destination;
|
++destination;
|
||||||
if constexpr (IS_MAP_MATCHING)
|
|
||||||
{
|
|
||||||
++distance;
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
@@ -360,20 +319,6 @@ 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());
|
||||||
@@ -383,22 +328,19 @@ 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);
|
||||||
if constexpr (IS_MAP_MATCHING)
|
const auto toHeapNode = forward_heap.GetHeapNodeIfWasInserted(to);
|
||||||
|
if (!toHeapNode)
|
||||||
{
|
{
|
||||||
const EdgeDistance to_distance = heapNode.data.distance + *distance;
|
forward_heap.Insert(to, to_weight, {heapNode.node, true});
|
||||||
insertOrUpdate(
|
|
||||||
forward_heap, to, to_weight, {heapNode.node, true, to_distance});
|
|
||||||
}
|
}
|
||||||
else
|
else if (to_weight < toHeapNode->weight)
|
||||||
{
|
{
|
||||||
insertOrUpdate(forward_heap, to, to_weight, {heapNode.node, true});
|
toHeapNode->data = {heapNode.node, true};
|
||||||
|
toHeapNode->weight = to_weight;
|
||||||
|
forward_heap.DecreaseKey(*toHeapNode);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
++source;
|
++source;
|
||||||
if constexpr (IS_MAP_MATCHING)
|
|
||||||
{
|
|
||||||
++distance;
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@@ -425,28 +367,26 @@ 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);
|
||||||
|
|
||||||
if constexpr (IS_MAP_MATCHING)
|
const auto toHeapNode = forward_heap.GetHeapNodeIfWasInserted(to);
|
||||||
|
if (!toHeapNode)
|
||||||
{
|
{
|
||||||
const auto node_distance =
|
forward_heap.Insert(to, to_weight, {heapNode.node, false});
|
||||||
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
|
else if (to_weight < toHeapNode->weight)
|
||||||
{
|
{
|
||||||
insertOrUpdate(forward_heap, to, to_weight, {heapNode.node, false});
|
toHeapNode->data = {heapNode.node, false};
|
||||||
|
toHeapNode->weight = to_weight;
|
||||||
|
forward_heap.DecreaseKey(*toHeapNode);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
template <bool DIRECTION, typename Algorithm, typename Heap, typename... Args>
|
template <bool DIRECTION, typename Algorithm, typename... Args>
|
||||||
void routingStep(const DataFacade<Algorithm> &facade,
|
void routingStep(const DataFacade<Algorithm> &facade,
|
||||||
Heap &forward_heap,
|
typename SearchEngineData<Algorithm>::QueryHeap &forward_heap,
|
||||||
Heap &reverse_heap,
|
typename SearchEngineData<Algorithm>::QueryHeap &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,
|
||||||
@@ -487,27 +427,24 @@ 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>;
|
||||||
|
|
||||||
struct UnpackedPath
|
template <typename Algorithm, typename... Args>
|
||||||
{
|
UnpackedPath search(SearchEngineData<Algorithm> &engine_working_data,
|
||||||
EdgeWeight weight;
|
const DataFacade<Algorithm> &facade,
|
||||||
UnpackedNodes nodes;
|
typename SearchEngineData<Algorithm>::QueryHeap &forward_heap,
|
||||||
UnpackedEdges edges;
|
typename SearchEngineData<Algorithm>::QueryHeap &reverse_heap,
|
||||||
};
|
const std::vector<NodeID> &force_step_nodes,
|
||||||
|
EdgeWeight weight_upper_bound,
|
||||||
template <typename Algorithm, typename Heap, typename... Args>
|
const Args &...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,
|
|
||||||
EdgeWeight weight_upper_bound,
|
|
||||||
const Args &...args)
|
|
||||||
{
|
{
|
||||||
if (forward_heap.Empty() || reverse_heap.Empty())
|
if (forward_heap.Empty() || reverse_heap.Empty())
|
||||||
{
|
{
|
||||||
return {};
|
return std::make_tuple(INVALID_EDGE_WEIGHT, std::vector<NodeID>(), std::vector<EdgeID>());
|
||||||
}
|
}
|
||||||
|
|
||||||
|
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);
|
||||||
|
|
||||||
@@ -538,32 +475,9 @@ std::optional<std::pair<NodeID, EdgeWeight>> runSearch(const DataFacade<Algorith
|
|||||||
// 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 {};
|
return std::make_tuple(INVALID_EDGE_WEIGHT, std::vector<NodeID>(), std::vector<EdgeID>());
|
||||||
}
|
}
|
||||||
|
|
||||||
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);
|
||||||
|
|
||||||
@@ -601,52 +515,25 @@ 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 unpacked_subpath = search(engine_working_data,
|
auto [subpath_weight, subpath_nodes, subpath_edges] = search(engine_working_data,
|
||||||
facade,
|
facade,
|
||||||
forward_heap,
|
forward_heap,
|
||||||
reverse_heap,
|
reverse_heap,
|
||||||
force_step_nodes,
|
force_step_nodes,
|
||||||
INVALID_EDGE_WEIGHT,
|
INVALID_EDGE_WEIGHT,
|
||||||
sublevel,
|
sublevel,
|
||||||
parent_cell_id);
|
parent_cell_id);
|
||||||
BOOST_ASSERT(!unpacked_subpath.edges.empty());
|
BOOST_ASSERT(!subpath_edges.empty());
|
||||||
BOOST_ASSERT(unpacked_subpath.nodes.size() > 1);
|
BOOST_ASSERT(subpath_nodes.size() > 1);
|
||||||
BOOST_ASSERT(unpacked_subpath.nodes.front() == source);
|
BOOST_ASSERT(subpath_nodes.front() == source);
|
||||||
BOOST_ASSERT(unpacked_subpath.nodes.back() == target);
|
BOOST_ASSERT(subpath_nodes.back() == target);
|
||||||
unpacked_nodes.insert(unpacked_nodes.end(),
|
unpacked_nodes.insert(
|
||||||
std::next(unpacked_subpath.nodes.begin()),
|
unpacked_nodes.end(), std::next(subpath_nodes.begin()), subpath_nodes.end());
|
||||||
unpacked_subpath.nodes.end());
|
unpacked_edges.insert(unpacked_edges.end(), subpath_edges.begin(), subpath_edges.end());
|
||||||
unpacked_edges.insert(
|
|
||||||
unpacked_edges.end(), unpacked_subpath.edges.begin(), unpacked_subpath.edges.end());
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
return {weight, std::move(unpacked_nodes), std::move(unpacked_edges)};
|
return std::make_tuple(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
|
||||||
@@ -662,15 +549,13 @@ 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
|
||||||
auto unpacked_path = search(engine_working_data,
|
std::tie(weight, unpacked_nodes, std::ignore) = 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
|
||||||
@@ -708,8 +593,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>::MapMatchingQueryHeap &forward_heap,
|
typename SearchEngineData<Algorithm>::QueryHeap &forward_heap,
|
||||||
typename SearchEngineData<Algorithm>::MapMatchingQueryHeap &reverse_heap,
|
typename SearchEngineData<Algorithm>::QueryHeap &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)
|
||||||
@@ -717,49 +602,48 @@ double getNetworkDistance(SearchEngineData<Algorithm> &engine_working_data,
|
|||||||
forward_heap.Clear();
|
forward_heap.Clear();
|
||||||
reverse_heap.Clear();
|
reverse_heap.Clear();
|
||||||
|
|
||||||
if (source_phantom.IsValidForwardSource())
|
|
||||||
{
|
|
||||||
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()});
|
|
||||||
}
|
|
||||||
|
|
||||||
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};
|
const PhantomEndpoints endpoints{source_phantom, target_phantom};
|
||||||
|
insertNodesInHeaps(forward_heap, reverse_heap, endpoints);
|
||||||
|
|
||||||
auto distance = searchDistance(
|
auto [weight, unpacked_nodes, unpacked_edges] = search(
|
||||||
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 (distance == INVALID_EDGE_DISTANCE)
|
if (weight == INVALID_EDGE_WEIGHT)
|
||||||
{
|
{
|
||||||
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);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@@ -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 std::optional<bool> continue_straight_at_waypoint);
|
const boost::optional<bool> continue_straight_at_waypoint);
|
||||||
|
|
||||||
} // namespace osrm::engine::routing_algorithms
|
} // namespace osrm::engine::routing_algorithms
|
||||||
|
|
||||||
|
|||||||
@@ -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 <optional>
|
#include <boost/optional.hpp>
|
||||||
|
|
||||||
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
|
||||||
std::optional<size_t> forward_to_forward;
|
boost::optional<size_t> forward_to_forward;
|
||||||
std::optional<size_t> reverse_to_forward;
|
boost::optional<size_t> reverse_to_forward;
|
||||||
std::optional<size_t> forward_to_reverse;
|
boost::optional<size_t> forward_to_reverse;
|
||||||
std::optional<size_t> reverse_to_reverse;
|
boost::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 std::optional<bool> continue_straight_at_waypoint)
|
const boost::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
|
||||||
|
|||||||
@@ -12,6 +12,7 @@ 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,7 +47,6 @@ template <> struct SearchEngineData<routing_algorithms::ch::Algorithm>
|
|||||||
util::UnorderedMapStorage<NodeID, int>>;
|
util::UnorderedMapStorage<NodeID, int>>;
|
||||||
|
|
||||||
using SearchEngineHeapPtr = boost::thread_specific_ptr<QueryHeap>;
|
using SearchEngineHeapPtr = boost::thread_specific_ptr<QueryHeap>;
|
||||||
|
|
||||||
using ManyToManyHeapPtr = boost::thread_specific_ptr<ManyToManyQueryHeap>;
|
using ManyToManyHeapPtr = boost::thread_specific_ptr<ManyToManyQueryHeap>;
|
||||||
|
|
||||||
static SearchEngineHeapPtr forward_heap_1;
|
static SearchEngineHeapPtr forward_heap_1;
|
||||||
@@ -56,10 +56,6 @@ template <> struct SearchEngineData<routing_algorithms::ch::Algorithm>
|
|||||||
static SearchEngineHeapPtr forward_heap_3;
|
static SearchEngineHeapPtr forward_heap_3;
|
||||||
static SearchEngineHeapPtr reverse_heap_3;
|
static SearchEngineHeapPtr reverse_heap_3;
|
||||||
static ManyToManyHeapPtr many_to_many_heap;
|
static ManyToManyHeapPtr many_to_many_heap;
|
||||||
static SearchEngineHeapPtr map_matching_forward_heap_1;
|
|
||||||
static SearchEngineHeapPtr map_matching_reverse_heap_1;
|
|
||||||
|
|
||||||
void InitializeOrClearMapMatchingThreadLocalStorage(unsigned number_of_nodes);
|
|
||||||
|
|
||||||
void InitializeOrClearFirstThreadLocalStorage(unsigned number_of_nodes);
|
void InitializeOrClearFirstThreadLocalStorage(unsigned number_of_nodes);
|
||||||
|
|
||||||
@@ -78,19 +74,6 @@ 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;
|
||||||
@@ -121,27 +104,16 @@ 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 = boost::thread_specific_ptr<QueryHeap>;
|
||||||
using ManyToManyHeapPtr = boost::thread_specific_ptr<ManyToManyQueryHeap>;
|
using ManyToManyHeapPtr = boost::thread_specific_ptr<ManyToManyQueryHeap>;
|
||||||
using MapMatchingHeapPtr = boost::thread_specific_ptr<MapMatchingQueryHeap>;
|
|
||||||
|
|
||||||
static SearchEngineHeapPtr forward_heap_1;
|
static SearchEngineHeapPtr forward_heap_1;
|
||||||
static SearchEngineHeapPtr reverse_heap_1;
|
static SearchEngineHeapPtr reverse_heap_1;
|
||||||
static MapMatchingHeapPtr map_matching_forward_heap_1;
|
|
||||||
static MapMatchingHeapPtr map_matching_reverse_heap_1;
|
|
||||||
|
|
||||||
static ManyToManyHeapPtr many_to_many_heap;
|
static 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);
|
||||||
|
|||||||
@@ -3,9 +3,11 @@
|
|||||||
|
|
||||||
#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>
|
||||||
|
|
||||||
@@ -16,6 +18,25 @@ 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
|
||||||
{
|
{
|
||||||
|
|
||||||
|
|||||||
@@ -28,12 +28,13 @@ 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 "storage/io_config.hpp"
|
#include <boost/filesystem/path.hpp>
|
||||||
|
|
||||||
#include <array>
|
#include <array>
|
||||||
#include <filesystem>
|
|
||||||
#include <string>
|
#include <string>
|
||||||
|
|
||||||
|
#include "storage/io_config.hpp"
|
||||||
|
|
||||||
namespace osrm::extractor
|
namespace osrm::extractor
|
||||||
{
|
{
|
||||||
|
|
||||||
@@ -70,14 +71,14 @@ struct ExtractorConfig final : storage::IOConfig
|
|||||||
{
|
{
|
||||||
}
|
}
|
||||||
|
|
||||||
void UseDefaultOutputNames(const std::filesystem::path &base)
|
void UseDefaultOutputNames(const boost::filesystem::path &base)
|
||||||
{
|
{
|
||||||
IOConfig::UseDefaultOutputNames(base);
|
IOConfig::UseDefaultOutputNames(base);
|
||||||
}
|
}
|
||||||
|
|
||||||
std::filesystem::path input_path;
|
boost::filesystem::path input_path;
|
||||||
std::filesystem::path profile_path;
|
boost::filesystem::path profile_path;
|
||||||
std::vector<std::filesystem::path> location_dependent_data_paths;
|
std::vector<boost::filesystem::path> location_dependent_data_paths;
|
||||||
std::string data_version;
|
std::string data_version;
|
||||||
|
|
||||||
unsigned requested_num_threads = 0;
|
unsigned requested_num_threads = 0;
|
||||||
|
|||||||
+57
-53
@@ -23,9 +23,9 @@ namespace osrm::extractor::files
|
|||||||
|
|
||||||
// writes the .osrm.icd file
|
// writes the .osrm.icd file
|
||||||
template <typename IntersectionBearingsT, typename EntryClassVectorT>
|
template <typename IntersectionBearingsT, typename EntryClassVectorT>
|
||||||
void writeIntersections(const std::filesystem::path &path,
|
inline void writeIntersections(const boost::filesystem::path &path,
|
||||||
const IntersectionBearingsT &intersection_bearings,
|
const IntersectionBearingsT &intersection_bearings,
|
||||||
const EntryClassVectorT &entry_classes)
|
const EntryClassVectorT &entry_classes)
|
||||||
{
|
{
|
||||||
static_assert(std::is_same<IntersectionBearingsContainer, IntersectionBearingsT>::value ||
|
static_assert(std::is_same<IntersectionBearingsContainer, IntersectionBearingsT>::value ||
|
||||||
std::is_same<IntersectionBearingsView, IntersectionBearingsT>::value,
|
std::is_same<IntersectionBearingsView, IntersectionBearingsT>::value,
|
||||||
@@ -39,9 +39,9 @@ void writeIntersections(const std::filesystem::path &path,
|
|||||||
|
|
||||||
// read the .osrm.icd file
|
// read the .osrm.icd file
|
||||||
template <typename IntersectionBearingsT, typename EntryClassVectorT>
|
template <typename IntersectionBearingsT, typename EntryClassVectorT>
|
||||||
void readIntersections(const std::filesystem::path &path,
|
inline void readIntersections(const boost::filesystem::path &path,
|
||||||
IntersectionBearingsT &intersection_bearings,
|
IntersectionBearingsT &intersection_bearings,
|
||||||
EntryClassVectorT &entry_classes)
|
EntryClassVectorT &entry_classes)
|
||||||
{
|
{
|
||||||
static_assert(std::is_same<IntersectionBearingsContainer, IntersectionBearingsT>::value ||
|
static_assert(std::is_same<IntersectionBearingsContainer, IntersectionBearingsT>::value ||
|
||||||
std::is_same<IntersectionBearingsView, IntersectionBearingsT>::value,
|
std::is_same<IntersectionBearingsView, IntersectionBearingsT>::value,
|
||||||
@@ -54,7 +54,8 @@ void readIntersections(const std::filesystem::path &path,
|
|||||||
}
|
}
|
||||||
|
|
||||||
// reads .osrm.properties
|
// reads .osrm.properties
|
||||||
inline void readProfileProperties(const std::filesystem::path &path, ProfileProperties &properties)
|
inline void readProfileProperties(const boost::filesystem::path &path,
|
||||||
|
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};
|
||||||
@@ -63,7 +64,7 @@ inline void readProfileProperties(const std::filesystem::path &path, ProfileProp
|
|||||||
}
|
}
|
||||||
|
|
||||||
// writes .osrm.properties
|
// writes .osrm.properties
|
||||||
inline void writeProfileProperties(const std::filesystem::path &path,
|
inline void writeProfileProperties(const boost::filesystem::path &path,
|
||||||
const ProfileProperties &properties)
|
const ProfileProperties &properties)
|
||||||
{
|
{
|
||||||
const auto fingerprint = storage::tar::FileWriter::GenerateFingerprint;
|
const auto fingerprint = storage::tar::FileWriter::GenerateFingerprint;
|
||||||
@@ -73,7 +74,7 @@ inline void writeProfileProperties(const std::filesystem::path &path,
|
|||||||
}
|
}
|
||||||
|
|
||||||
template <typename EdgeBasedEdgeVector>
|
template <typename EdgeBasedEdgeVector>
|
||||||
void writeEdgeBasedGraph(const std::filesystem::path &path,
|
void writeEdgeBasedGraph(const boost::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)
|
||||||
@@ -91,7 +92,7 @@ void writeEdgeBasedGraph(const std::filesystem::path &path,
|
|||||||
|
|
||||||
// reads .osrm.ebg file
|
// reads .osrm.ebg file
|
||||||
template <typename EdgeBasedEdgeVector>
|
template <typename EdgeBasedEdgeVector>
|
||||||
void readEdgeBasedGraph(const std::filesystem::path &path,
|
void readEdgeBasedGraph(const boost::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)
|
||||||
@@ -107,9 +108,9 @@ void readEdgeBasedGraph(const std::filesystem::path &path,
|
|||||||
|
|
||||||
// reads .osrm.nbg_nodes
|
// reads .osrm.nbg_nodes
|
||||||
template <typename CoordinatesT, typename PackedOSMIDsT>
|
template <typename CoordinatesT, typename PackedOSMIDsT>
|
||||||
void readNodes(const std::filesystem::path &path,
|
inline void readNodes(const boost::filesystem::path &path,
|
||||||
CoordinatesT &coordinates,
|
CoordinatesT &coordinates,
|
||||||
PackedOSMIDsT &osm_node_ids)
|
PackedOSMIDsT &osm_node_ids)
|
||||||
{
|
{
|
||||||
static_assert(std::is_same<typename CoordinatesT::value_type, util::Coordinate>::value, "");
|
static_assert(std::is_same<typename CoordinatesT::value_type, util::Coordinate>::value, "");
|
||||||
static_assert(std::is_same<typename PackedOSMIDsT::value_type, OSMNodeID>::value, "");
|
static_assert(std::is_same<typename PackedOSMIDsT::value_type, OSMNodeID>::value, "");
|
||||||
@@ -123,7 +124,7 @@ void readNodes(const std::filesystem::path &path,
|
|||||||
|
|
||||||
// reads only coordinates from .osrm.nbg_nodes
|
// reads only coordinates from .osrm.nbg_nodes
|
||||||
template <typename CoordinatesT>
|
template <typename CoordinatesT>
|
||||||
void readNodeCoordinates(const std::filesystem::path &path, CoordinatesT &coordinates)
|
inline void readNodeCoordinates(const boost::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, "");
|
||||||
|
|
||||||
@@ -135,9 +136,9 @@ void readNodeCoordinates(const std::filesystem::path &path, CoordinatesT &coordi
|
|||||||
|
|
||||||
// writes .osrm.nbg_nodes
|
// writes .osrm.nbg_nodes
|
||||||
template <typename CoordinatesT, typename PackedOSMIDsT>
|
template <typename CoordinatesT, typename PackedOSMIDsT>
|
||||||
void writeNodes(const std::filesystem::path &path,
|
inline void writeNodes(const boost::filesystem::path &path,
|
||||||
const CoordinatesT &coordinates,
|
const CoordinatesT &coordinates,
|
||||||
const PackedOSMIDsT &osm_node_ids)
|
const PackedOSMIDsT &osm_node_ids)
|
||||||
{
|
{
|
||||||
static_assert(std::is_same<typename CoordinatesT::value_type, util::Coordinate>::value, "");
|
static_assert(std::is_same<typename CoordinatesT::value_type, util::Coordinate>::value, "");
|
||||||
static_assert(std::is_same<typename PackedOSMIDsT::value_type, OSMNodeID>::value, "");
|
static_assert(std::is_same<typename PackedOSMIDsT::value_type, OSMNodeID>::value, "");
|
||||||
@@ -150,7 +151,7 @@ void writeNodes(const std::filesystem::path &path,
|
|||||||
}
|
}
|
||||||
|
|
||||||
// reads .osrm.cnbg_to_ebg
|
// reads .osrm.cnbg_to_ebg
|
||||||
inline void readNBGMapping(const std::filesystem::path &path, std::vector<NBGToEBG> &mapping)
|
inline void readNBGMapping(const boost::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};
|
||||||
@@ -159,7 +160,8 @@ inline void readNBGMapping(const std::filesystem::path &path, std::vector<NBGToE
|
|||||||
}
|
}
|
||||||
|
|
||||||
// writes .osrm.cnbg_to_ebg
|
// writes .osrm.cnbg_to_ebg
|
||||||
inline void writeNBGMapping(const std::filesystem::path &path, const std::vector<NBGToEBG> &mapping)
|
inline void writeNBGMapping(const boost::filesystem::path &path,
|
||||||
|
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};
|
||||||
@@ -168,7 +170,7 @@ inline void writeNBGMapping(const std::filesystem::path &path, const std::vector
|
|||||||
}
|
}
|
||||||
|
|
||||||
// reads .osrm.datasource_names
|
// reads .osrm.datasource_names
|
||||||
inline void readDatasources(const std::filesystem::path &path, Datasources &sources)
|
inline void readDatasources(const boost::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};
|
||||||
@@ -177,7 +179,7 @@ inline void readDatasources(const std::filesystem::path &path, Datasources &sour
|
|||||||
}
|
}
|
||||||
|
|
||||||
// writes .osrm.datasource_names
|
// writes .osrm.datasource_names
|
||||||
inline void writeDatasources(const std::filesystem::path &path, Datasources &sources)
|
inline void writeDatasources(const boost::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};
|
||||||
@@ -187,7 +189,7 @@ inline void writeDatasources(const std::filesystem::path &path, Datasources &sou
|
|||||||
|
|
||||||
// reads .osrm.geometry
|
// reads .osrm.geometry
|
||||||
template <typename SegmentDataT>
|
template <typename SegmentDataT>
|
||||||
void readSegmentData(const std::filesystem::path &path, SegmentDataT &segment_data)
|
inline void readSegmentData(const boost::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,
|
||||||
@@ -200,7 +202,7 @@ void readSegmentData(const std::filesystem::path &path, SegmentDataT &segment_da
|
|||||||
|
|
||||||
// writes .osrm.geometry
|
// writes .osrm.geometry
|
||||||
template <typename SegmentDataT>
|
template <typename SegmentDataT>
|
||||||
void writeSegmentData(const std::filesystem::path &path, const SegmentDataT &segment_data)
|
inline void writeSegmentData(const boost::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,
|
||||||
@@ -213,7 +215,7 @@ void writeSegmentData(const std::filesystem::path &path, const SegmentDataT &seg
|
|||||||
|
|
||||||
// reads .osrm.ebg_nodes
|
// reads .osrm.ebg_nodes
|
||||||
template <typename NodeDataT>
|
template <typename NodeDataT>
|
||||||
inline void readNodeData(const std::filesystem::path &path, NodeDataT &node_data)
|
inline void readNodeData(const boost::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 ||
|
||||||
@@ -227,7 +229,7 @@ inline void readNodeData(const std::filesystem::path &path, NodeDataT &node_data
|
|||||||
|
|
||||||
// writes .osrm.ebg_nodes
|
// writes .osrm.ebg_nodes
|
||||||
template <typename NodeDataT>
|
template <typename NodeDataT>
|
||||||
inline void writeNodeData(const std::filesystem::path &path, const NodeDataT &node_data)
|
inline void writeNodeData(const boost::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 ||
|
||||||
@@ -241,7 +243,7 @@ inline void writeNodeData(const std::filesystem::path &path, const NodeDataT &no
|
|||||||
|
|
||||||
// reads .osrm.tls
|
// reads .osrm.tls
|
||||||
template <typename OffsetsT, typename MaskT>
|
template <typename OffsetsT, typename MaskT>
|
||||||
inline void readTurnLaneDescriptions(const std::filesystem::path &path,
|
inline void readTurnLaneDescriptions(const boost::filesystem::path &path,
|
||||||
OffsetsT &turn_offsets,
|
OffsetsT &turn_offsets,
|
||||||
MaskT &turn_masks)
|
MaskT &turn_masks)
|
||||||
{
|
{
|
||||||
@@ -258,7 +260,7 @@ inline void readTurnLaneDescriptions(const std::filesystem::path &path,
|
|||||||
|
|
||||||
// writes .osrm.tls
|
// writes .osrm.tls
|
||||||
template <typename OffsetsT, typename MaskT>
|
template <typename OffsetsT, typename MaskT>
|
||||||
inline void writeTurnLaneDescriptions(const std::filesystem::path &path,
|
inline void writeTurnLaneDescriptions(const boost::filesystem::path &path,
|
||||||
const OffsetsT &turn_offsets,
|
const OffsetsT &turn_offsets,
|
||||||
const MaskT &turn_masks)
|
const MaskT &turn_masks)
|
||||||
{
|
{
|
||||||
@@ -275,7 +277,7 @@ inline void writeTurnLaneDescriptions(const std::filesystem::path &path,
|
|||||||
|
|
||||||
// reads .osrm.tld
|
// reads .osrm.tld
|
||||||
template <typename TurnLaneDataT>
|
template <typename TurnLaneDataT>
|
||||||
inline void readTurnLaneData(const std::filesystem::path &path, TurnLaneDataT &turn_lane_data)
|
inline void readTurnLaneData(const boost::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,
|
||||||
@@ -289,7 +291,7 @@ inline void readTurnLaneData(const std::filesystem::path &path, TurnLaneDataT &t
|
|||||||
|
|
||||||
// writes .osrm.tld
|
// writes .osrm.tld
|
||||||
template <typename TurnLaneDataT>
|
template <typename TurnLaneDataT>
|
||||||
inline void writeTurnLaneData(const std::filesystem::path &path,
|
inline void writeTurnLaneData(const boost::filesystem::path &path,
|
||||||
const TurnLaneDataT &turn_lane_data)
|
const TurnLaneDataT &turn_lane_data)
|
||||||
{
|
{
|
||||||
static_assert(
|
static_assert(
|
||||||
@@ -304,7 +306,7 @@ inline void writeTurnLaneData(const std::filesystem::path &path,
|
|||||||
|
|
||||||
// reads .osrm.timestamp
|
// reads .osrm.timestamp
|
||||||
template <typename TimestampDataT>
|
template <typename TimestampDataT>
|
||||||
inline void readTimestamp(const std::filesystem::path &path, TimestampDataT ×tamp)
|
inline void readTimestamp(const boost::filesystem::path &path, TimestampDataT ×tamp)
|
||||||
{
|
{
|
||||||
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};
|
||||||
@@ -314,7 +316,7 @@ inline void readTimestamp(const std::filesystem::path &path, TimestampDataT &tim
|
|||||||
|
|
||||||
// writes .osrm.timestamp
|
// writes .osrm.timestamp
|
||||||
template <typename TimestampDataT>
|
template <typename TimestampDataT>
|
||||||
inline void writeTimestamp(const std::filesystem::path &path, const TimestampDataT ×tamp)
|
inline void writeTimestamp(const boost::filesystem::path &path, const TimestampDataT ×tamp)
|
||||||
{
|
{
|
||||||
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};
|
||||||
@@ -324,7 +326,7 @@ inline void writeTimestamp(const std::filesystem::path &path, const TimestampDat
|
|||||||
|
|
||||||
// reads .osrm.maneuver_overrides
|
// reads .osrm.maneuver_overrides
|
||||||
template <typename StorageManeuverOverrideT, typename NodeSequencesT>
|
template <typename StorageManeuverOverrideT, typename NodeSequencesT>
|
||||||
inline void readManeuverOverrides(const std::filesystem::path &path,
|
inline void readManeuverOverrides(const boost::filesystem::path &path,
|
||||||
StorageManeuverOverrideT &maneuver_overrides,
|
StorageManeuverOverrideT &maneuver_overrides,
|
||||||
NodeSequencesT &node_sequences)
|
NodeSequencesT &node_sequences)
|
||||||
{
|
{
|
||||||
@@ -338,7 +340,7 @@ inline void readManeuverOverrides(const std::filesystem::path &path,
|
|||||||
}
|
}
|
||||||
|
|
||||||
// writes .osrm.maneuver_overrides
|
// writes .osrm.maneuver_overrides
|
||||||
inline void writeManeuverOverrides(const std::filesystem::path &path,
|
inline void writeManeuverOverrides(const boost::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)
|
||||||
{
|
{
|
||||||
@@ -353,7 +355,7 @@ inline void writeManeuverOverrides(const std::filesystem::path &path,
|
|||||||
|
|
||||||
// writes .osrm.turn_weight_penalties
|
// writes .osrm.turn_weight_penalties
|
||||||
template <typename TurnPenaltyT>
|
template <typename TurnPenaltyT>
|
||||||
inline void writeTurnWeightPenalty(const std::filesystem::path &path,
|
inline void writeTurnWeightPenalty(const boost::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;
|
||||||
@@ -364,7 +366,7 @@ inline void writeTurnWeightPenalty(const std::filesystem::path &path,
|
|||||||
|
|
||||||
// read .osrm.turn_weight_penalties
|
// read .osrm.turn_weight_penalties
|
||||||
template <typename TurnPenaltyT>
|
template <typename TurnPenaltyT>
|
||||||
inline void readTurnWeightPenalty(const std::filesystem::path &path, TurnPenaltyT &turn_penalty)
|
inline void readTurnWeightPenalty(const boost::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};
|
||||||
@@ -374,7 +376,7 @@ inline void readTurnWeightPenalty(const std::filesystem::path &path, TurnPenalty
|
|||||||
|
|
||||||
// writes .osrm.turn_duration_penalties
|
// writes .osrm.turn_duration_penalties
|
||||||
template <typename TurnPenaltyT>
|
template <typename TurnPenaltyT>
|
||||||
inline void writeTurnDurationPenalty(const std::filesystem::path &path,
|
inline void writeTurnDurationPenalty(const boost::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;
|
||||||
@@ -385,7 +387,7 @@ inline void writeTurnDurationPenalty(const std::filesystem::path &path,
|
|||||||
|
|
||||||
// read .osrm.turn_weight_penalties
|
// read .osrm.turn_weight_penalties
|
||||||
template <typename TurnPenaltyT>
|
template <typename TurnPenaltyT>
|
||||||
inline void readTurnDurationPenalty(const std::filesystem::path &path, TurnPenaltyT &turn_penalty)
|
inline void readTurnDurationPenalty(const boost::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};
|
||||||
@@ -395,7 +397,7 @@ inline void readTurnDurationPenalty(const std::filesystem::path &path, TurnPenal
|
|||||||
|
|
||||||
// writes .osrm.turn_penalties_index
|
// writes .osrm.turn_penalties_index
|
||||||
template <typename TurnIndexT>
|
template <typename TurnIndexT>
|
||||||
inline void writeTurnPenaltiesIndex(const std::filesystem::path &path,
|
inline void writeTurnPenaltiesIndex(const boost::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;
|
||||||
@@ -406,7 +408,7 @@ inline void writeTurnPenaltiesIndex(const std::filesystem::path &path,
|
|||||||
|
|
||||||
// read .osrm.turn_penalties_index
|
// read .osrm.turn_penalties_index
|
||||||
template <typename TurnIndexT>
|
template <typename TurnIndexT>
|
||||||
inline void readTurnPenaltiesIndex(const std::filesystem::path &path,
|
inline void readTurnPenaltiesIndex(const boost::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;
|
||||||
@@ -417,7 +419,7 @@ inline void readTurnPenaltiesIndex(const std::filesystem::path &path,
|
|||||||
|
|
||||||
// writes .osrm.restrictions
|
// writes .osrm.restrictions
|
||||||
template <typename ConditionalRestrictionsT>
|
template <typename ConditionalRestrictionsT>
|
||||||
inline void writeConditionalRestrictions(const std::filesystem::path &path,
|
inline void writeConditionalRestrictions(const boost::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;
|
||||||
@@ -428,7 +430,7 @@ inline void writeConditionalRestrictions(const std::filesystem::path &path,
|
|||||||
|
|
||||||
// read .osrm.restrictions
|
// read .osrm.restrictions
|
||||||
template <typename ConditionalRestrictionsT>
|
template <typename ConditionalRestrictionsT>
|
||||||
inline void readConditionalRestrictions(const std::filesystem::path &path,
|
inline void readConditionalRestrictions(const boost::filesystem::path &path,
|
||||||
ConditionalRestrictionsT &conditional_restrictions)
|
ConditionalRestrictionsT &conditional_restrictions)
|
||||||
{
|
{
|
||||||
const auto fingerprint = storage::tar::FileReader::VerifyFingerprint;
|
const auto fingerprint = storage::tar::FileReader::VerifyFingerprint;
|
||||||
@@ -439,7 +441,7 @@ inline void readConditionalRestrictions(const std::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 std::filesystem::path &path,
|
void readRawNBGraph(const boost::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)
|
||||||
@@ -464,7 +466,8 @@ void readRawNBGraph(const std::filesystem::path &path,
|
|||||||
storage::serialization::read(reader, "/extractor/edges", edge_list);
|
storage::serialization::read(reader, "/extractor/edges", edge_list);
|
||||||
}
|
}
|
||||||
|
|
||||||
template <typename NameTableT> void readNames(const std::filesystem::path &path, NameTableT &table)
|
template <typename NameTableT>
|
||||||
|
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};
|
||||||
@@ -473,7 +476,7 @@ template <typename NameTableT> void readNames(const std::filesystem::path &path,
|
|||||||
}
|
}
|
||||||
|
|
||||||
template <typename NameTableT>
|
template <typename NameTableT>
|
||||||
void writeNames(const std::filesystem::path &path, const NameTableT &table)
|
void writeNames(const boost::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};
|
||||||
@@ -482,7 +485,7 @@ void writeNames(const std::filesystem::path &path, const NameTableT &table)
|
|||||||
}
|
}
|
||||||
|
|
||||||
template <typename NodeWeightsVectorT>
|
template <typename NodeWeightsVectorT>
|
||||||
void readEdgeBasedNodeWeights(const std::filesystem::path &path, NodeWeightsVectorT &weights)
|
void readEdgeBasedNodeWeights(const boost::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};
|
||||||
@@ -491,7 +494,8 @@ void readEdgeBasedNodeWeights(const std::filesystem::path &path, NodeWeightsVect
|
|||||||
}
|
}
|
||||||
|
|
||||||
template <typename NodeDistancesVectorT>
|
template <typename NodeDistancesVectorT>
|
||||||
void readEdgeBasedNodeDistances(const std::filesystem::path &path, NodeDistancesVectorT &distances)
|
void readEdgeBasedNodeDistances(const boost::filesystem::path &path,
|
||||||
|
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};
|
||||||
@@ -500,7 +504,7 @@ void readEdgeBasedNodeDistances(const std::filesystem::path &path, NodeDistances
|
|||||||
}
|
}
|
||||||
|
|
||||||
template <typename NodeWeightsVectorT, typename NodeDurationsVectorT, typename NodeDistancesVectorT>
|
template <typename NodeWeightsVectorT, typename NodeDurationsVectorT, typename NodeDistancesVectorT>
|
||||||
void writeEdgeBasedNodeWeightsDurationsDistances(const std::filesystem::path &path,
|
void writeEdgeBasedNodeWeightsDurationsDistances(const boost::filesystem::path &path,
|
||||||
const NodeWeightsVectorT &weights,
|
const NodeWeightsVectorT &weights,
|
||||||
const NodeDurationsVectorT &durations,
|
const NodeDurationsVectorT &durations,
|
||||||
const NodeDistancesVectorT &distances)
|
const NodeDistancesVectorT &distances)
|
||||||
@@ -514,7 +518,7 @@ void writeEdgeBasedNodeWeightsDurationsDistances(const std::filesystem::path &pa
|
|||||||
}
|
}
|
||||||
|
|
||||||
template <typename NodeWeightsVectorT, typename NodeDurationsVectorT>
|
template <typename NodeWeightsVectorT, typename NodeDurationsVectorT>
|
||||||
void readEdgeBasedNodeWeightsDurations(const std::filesystem::path &path,
|
void readEdgeBasedNodeWeightsDurations(const boost::filesystem::path &path,
|
||||||
NodeWeightsVectorT &weights,
|
NodeWeightsVectorT &weights,
|
||||||
NodeDurationsVectorT &durations)
|
NodeDurationsVectorT &durations)
|
||||||
{
|
{
|
||||||
@@ -526,7 +530,7 @@ void readEdgeBasedNodeWeightsDurations(const std::filesystem::path &path,
|
|||||||
}
|
}
|
||||||
|
|
||||||
template <typename NodeWeightsVectorT, typename NodeDurationsVectorT>
|
template <typename NodeWeightsVectorT, typename NodeDurationsVectorT>
|
||||||
void writeEdgeBasedNodeWeightsDurations(const std::filesystem::path &path,
|
void writeEdgeBasedNodeWeightsDurations(const boost::filesystem::path &path,
|
||||||
const NodeWeightsVectorT &weights,
|
const NodeWeightsVectorT &weights,
|
||||||
const NodeDurationsVectorT &durations)
|
const NodeDurationsVectorT &durations)
|
||||||
{
|
{
|
||||||
@@ -538,7 +542,7 @@ void writeEdgeBasedNodeWeightsDurations(const std::filesystem::path &path,
|
|||||||
}
|
}
|
||||||
|
|
||||||
template <typename RTreeT>
|
template <typename RTreeT>
|
||||||
void writeRamIndex(const std::filesystem::path &path, const RTreeT &rtree)
|
void writeRamIndex(const boost::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};
|
||||||
@@ -546,7 +550,7 @@ void writeRamIndex(const std::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 std::filesystem::path &path, RTreeT &rtree)
|
template <typename RTreeT> void readRamIndex(const boost::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};
|
||||||
@@ -555,7 +559,7 @@ template <typename RTreeT> void readRamIndex(const std::filesystem::path &path,
|
|||||||
}
|
}
|
||||||
|
|
||||||
template <typename EdgeListT>
|
template <typename EdgeListT>
|
||||||
void writeCompressedNodeBasedGraph(const std::filesystem::path &path, const EdgeListT &edge_list)
|
void writeCompressedNodeBasedGraph(const boost::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};
|
||||||
@@ -564,7 +568,7 @@ void writeCompressedNodeBasedGraph(const std::filesystem::path &path, const Edge
|
|||||||
}
|
}
|
||||||
|
|
||||||
template <typename EdgeListT>
|
template <typename EdgeListT>
|
||||||
void readCompressedNodeBasedGraph(const std::filesystem::path &path, EdgeListT &edge_list)
|
void readCompressedNodeBasedGraph(const boost::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};
|
||||||
|
|||||||
@@ -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
|
||||||
{
|
{
|
||||||
|
|||||||
@@ -1,15 +1,16 @@
|
|||||||
#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
|
||||||
{
|
{
|
||||||
|
|
||||||
@@ -26,16 +27,17 @@ 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
|
||||||
*/
|
*/
|
||||||
[[nodiscard]] util::Coordinate
|
OSRM_ATTR_WARN_UNUSED
|
||||||
GetCoordinateAlongRoad(const NodeID intersection_node,
|
util::Coordinate 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,
|
||||||
const std::uint8_t number_of_in_lanes) const;
|
const std::uint8_t number_of_in_lanes) const;
|
||||||
|
|
||||||
// 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
|
||||||
[[nodiscard]] util::Coordinate
|
OSRM_ATTR_WARN_UNUSED
|
||||||
|
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,
|
||||||
@@ -45,7 +47,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.
|
||||||
[[nodiscard]] std::vector<util::Coordinate>
|
OSRM_ATTR_WARN_UNUSED 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,
|
||||||
@@ -53,18 +55,20 @@ 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)
|
||||||
[[nodiscard]] std::vector<util::Coordinate>
|
OSRM_ATTR_WARN_UNUSED
|
||||||
GetForwardCoordinatesAlongRoad(const NodeID from, const EdgeID turn_edge) const;
|
std::vector<util::Coordinate> GetForwardCoordinatesAlongRoad(const NodeID from,
|
||||||
|
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
|
||||||
[[nodiscard]] util::Coordinate GetCoordinateCloseToTurn(const NodeID from_node,
|
OSRM_ATTR_WARN_UNUSED
|
||||||
const EdgeID turn_edge,
|
util::Coordinate GetCoordinateCloseToTurn(const NodeID from_node,
|
||||||
const bool traversed_in_reverse,
|
const EdgeID turn_edge,
|
||||||
const NodeID to_node) const;
|
const bool traversed_in_reverse,
|
||||||
|
const NodeID to_node) const;
|
||||||
|
|
||||||
/* When extracting the coordinates, we first extract all coordinates. We don't care about most
|
/* When extracting the coordinates, we first extract all coordinates. We don't care about most
|
||||||
* of them, though.
|
* of them, though.
|
||||||
@@ -86,19 +90,22 @@ 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),...]
|
||||||
*/
|
*/
|
||||||
[[nodiscard]] std::vector<util::Coordinate>
|
OSRM_ATTR_WARN_UNUSED
|
||||||
|
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;
|
||||||
|
|
||||||
[[nodiscard]] std::vector<double>
|
OSRM_ATTR_WARN_UNUSED
|
||||||
PrepareLengthCache(const std::vector<util::Coordinate> &coordinates, const double limit) const;
|
std::vector<double> PrepareLengthCache(const std::vector<util::Coordinate> &coordinates,
|
||||||
|
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
|
||||||
*/
|
*/
|
||||||
[[nodiscard]] std::vector<util::Coordinate>
|
OSRM_ATTR_WARN_UNUSED
|
||||||
|
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;
|
||||||
|
|
||||||
@@ -123,9 +130,10 @@ class CoordinateExtractor
|
|||||||
*
|
*
|
||||||
* for fixpoint `b`, vector_base `d` and vector_head `e`
|
* for fixpoint `b`, vector_base `d` and vector_head `e`
|
||||||
*/
|
*/
|
||||||
[[nodiscard]] util::Coordinate GetCorrectedCoordinate(const util::Coordinate fixpoint,
|
OSRM_ATTR_WARN_UNUSED
|
||||||
const util::Coordinate vector_base,
|
util::Coordinate GetCorrectedCoordinate(const util::Coordinate fixpoint,
|
||||||
const util::Coordinate vector_head) const;
|
const util::Coordinate vector_base,
|
||||||
|
const util::Coordinate vector_head) const;
|
||||||
|
|
||||||
/* generate a uniform vector of coordinates in same range distances
|
/* generate a uniform vector of coordinates in same range distances
|
||||||
*
|
*
|
||||||
@@ -135,7 +143,8 @@ class CoordinateExtractor
|
|||||||
* Into:
|
* Into:
|
||||||
* x -- x -- x -- x -- x - x
|
* x -- x -- x -- x -- x - x
|
||||||
*/
|
*/
|
||||||
[[nodiscard]] std::vector<util::Coordinate>
|
OSRM_ATTR_WARN_UNUSED
|
||||||
|
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;
|
||||||
|
|||||||
@@ -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<std::filesystem::path> &file_paths);
|
LocationDependentData(const std::vector<boost::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 std::filesystem::path &file_path,
|
void loadLocationDependentData(const boost::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;
|
||||||
|
|||||||
@@ -8,12 +8,10 @@
|
|||||||
#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
|
||||||
{
|
{
|
||||||
@@ -149,6 +147,7 @@ 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;
|
||||||
@@ -156,9 +155,9 @@ template <> struct hash<osrm::extractor::NodeBasedTurn>
|
|||||||
{
|
{
|
||||||
|
|
||||||
std::size_t seed = 0;
|
std::size_t seed = 0;
|
||||||
hash_combine(seed, s.from);
|
boost::hash_combine(seed, s.from);
|
||||||
hash_combine(seed, s.via);
|
boost::hash_combine(seed, s.via);
|
||||||
hash_combine(seed, s.to);
|
boost::hash_combine(seed, s.to);
|
||||||
|
|
||||||
return seed;
|
return seed;
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -12,7 +12,8 @@
|
|||||||
#include "util/coordinate.hpp"
|
#include "util/coordinate.hpp"
|
||||||
#include "util/node_based_graph.hpp"
|
#include "util/node_based_graph.hpp"
|
||||||
|
|
||||||
#include <filesystem>
|
#include <boost/filesystem/path.hpp>
|
||||||
|
|
||||||
#include <memory>
|
#include <memory>
|
||||||
#include <string>
|
#include <string>
|
||||||
#include <unordered_set>
|
#include <unordered_set>
|
||||||
|
|||||||
@@ -7,13 +7,14 @@
|
|||||||
#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>
|
||||||
@@ -39,7 +40,7 @@ struct RasterDatum
|
|||||||
class RasterGrid
|
class RasterGrid
|
||||||
{
|
{
|
||||||
public:
|
public:
|
||||||
RasterGrid(const std::filesystem::path &filepath, std::size_t _xdim, std::size_t _ydim)
|
RasterGrid(const boost::filesystem::path &filepath, std::size_t _xdim, std::size_t _ydim)
|
||||||
{
|
{
|
||||||
xdim = _xdim;
|
xdim = _xdim;
|
||||||
ydim = _ydim;
|
ydim = _ydim;
|
||||||
|
|||||||
@@ -1,10 +1,12 @@
|
|||||||
#ifndef RESTRICTION_HPP
|
#ifndef RESTRICTION_HPP
|
||||||
#define RESTRICTION_HPP
|
#define RESTRICTION_HPP
|
||||||
|
|
||||||
#include "turn_path.hpp"
|
|
||||||
#include "util/coordinate.hpp"
|
#include "util/coordinate.hpp"
|
||||||
#include "util/opening_hours.hpp"
|
#include "util/opening_hours.hpp"
|
||||||
#include "util/typedefs.hpp"
|
#include "util/typedefs.hpp"
|
||||||
|
|
||||||
|
#include "mapbox/variant.hpp"
|
||||||
|
#include "turn_path.hpp"
|
||||||
#include <limits>
|
#include <limits>
|
||||||
|
|
||||||
namespace osrm::extractor
|
namespace osrm::extractor
|
||||||
|
|||||||
@@ -70,7 +70,7 @@ class Sol2ScriptingEnvironment final : public ScriptingEnvironment
|
|||||||
|
|
||||||
explicit Sol2ScriptingEnvironment(
|
explicit Sol2ScriptingEnvironment(
|
||||||
const std::string &file_name,
|
const std::string &file_name,
|
||||||
const std::vector<std::filesystem::path> &location_dependent_data_paths);
|
const std::vector<boost::filesystem::path> &location_dependent_data_paths);
|
||||||
~Sol2ScriptingEnvironment() override = default;
|
~Sol2ScriptingEnvironment() override = default;
|
||||||
|
|
||||||
const ProfileProperties &GetProfileProperties() override;
|
const ProfileProperties &GetProfileProperties() override;
|
||||||
|
|||||||
@@ -8,12 +8,13 @@
|
|||||||
#include "storage/shared_memory_ownership.hpp"
|
#include "storage/shared_memory_ownership.hpp"
|
||||||
#include "storage/tar_fwd.hpp"
|
#include "storage/tar_fwd.hpp"
|
||||||
|
|
||||||
|
#include <boost/filesystem/path.hpp>
|
||||||
#include <boost/range/adaptor/reversed.hpp>
|
#include <boost/range/adaptor/reversed.hpp>
|
||||||
#include <boost/range/iterator_range.hpp>
|
#include <boost/range/iterator_range.hpp>
|
||||||
|
|
||||||
#include <filesystem>
|
|
||||||
#include <string>
|
|
||||||
#include <unordered_map>
|
#include <unordered_map>
|
||||||
|
|
||||||
|
#include <string>
|
||||||
#include <vector>
|
#include <vector>
|
||||||
|
|
||||||
namespace osrm::extractor
|
namespace osrm::extractor
|
||||||
|
|||||||
@@ -215,6 +215,7 @@ inline void read(storage::tar::FileReader &reader,
|
|||||||
const std::string &name,
|
const std::string &name,
|
||||||
detail::NameTableImpl<Ownership> &name_table)
|
detail::NameTableImpl<Ownership> &name_table)
|
||||||
{
|
{
|
||||||
|
std::string buffer;
|
||||||
util::serialization::read(reader, name, name_table.indexed_data);
|
util::serialization::read(reader, name, name_table.indexed_data);
|
||||||
}
|
}
|
||||||
} // namespace osrm::extractor::serialization
|
} // namespace osrm::extractor::serialization
|
||||||
|
|||||||
@@ -1,11 +1,10 @@
|
|||||||
#ifndef OSRM_EXTRACTOR_TRAFFIC_SIGNALS_HPP
|
#ifndef OSRM_EXTRACTOR_TRAFFIC_SIGNALS_HPP
|
||||||
#define OSRM_EXTRACTOR_TRAFFIC_SIGNALS_HPP
|
#define OSRM_EXTRACTOR_TRAFFIC_SIGNALS_HPP
|
||||||
|
|
||||||
#include "util/std_hash.hpp"
|
|
||||||
#include "util/typedefs.hpp"
|
#include "util/typedefs.hpp"
|
||||||
|
|
||||||
|
#include <boost/functional/hash.hpp>
|
||||||
#include <unordered_set>
|
#include <unordered_set>
|
||||||
#include <utility>
|
|
||||||
|
|
||||||
namespace osrm::extractor
|
namespace osrm::extractor
|
||||||
{
|
{
|
||||||
@@ -13,22 +12,23 @@ namespace osrm::extractor
|
|||||||
struct TrafficSignals
|
struct TrafficSignals
|
||||||
{
|
{
|
||||||
std::unordered_set<NodeID> bidirectional_nodes;
|
std::unordered_set<NodeID> bidirectional_nodes;
|
||||||
std::unordered_set<std::pair<NodeID, NodeID>> unidirectional_segments;
|
std::unordered_set<std::pair<NodeID, NodeID>, boost::hash<std::pair<NodeID, NodeID>>>
|
||||||
|
unidirectional_segments;
|
||||||
|
|
||||||
inline bool HasSignal(NodeID from, NodeID to) const
|
inline bool HasSignal(NodeID from, NodeID to) const
|
||||||
{
|
{
|
||||||
return bidirectional_nodes.contains(to) || unidirectional_segments.contains({from, to});
|
return bidirectional_nodes.count(to) > 0 || unidirectional_segments.count({from, to}) > 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
void Compress(NodeID from, NodeID via, NodeID to)
|
void Compress(NodeID from, NodeID via, NodeID to)
|
||||||
{
|
{
|
||||||
bidirectional_nodes.erase(via);
|
bidirectional_nodes.erase(via);
|
||||||
if (unidirectional_segments.contains({via, to}))
|
if (unidirectional_segments.count({via, to}))
|
||||||
{
|
{
|
||||||
unidirectional_segments.erase({via, to});
|
unidirectional_segments.erase({via, to});
|
||||||
unidirectional_segments.insert({from, to});
|
unidirectional_segments.insert({from, to});
|
||||||
}
|
}
|
||||||
if (unidirectional_segments.contains({via, from}))
|
if (unidirectional_segments.count({via, from}))
|
||||||
{
|
{
|
||||||
unidirectional_segments.erase({via, from});
|
unidirectional_segments.erase({via, from});
|
||||||
unidirectional_segments.insert({to, from});
|
unidirectional_segments.insert({to, from});
|
||||||
|
|||||||
@@ -3,9 +3,10 @@
|
|||||||
|
|
||||||
#include "util/concurrent_id_map.hpp"
|
#include "util/concurrent_id_map.hpp"
|
||||||
#include "util/integer_range.hpp"
|
#include "util/integer_range.hpp"
|
||||||
#include "util/std_hash.hpp"
|
|
||||||
#include "util/typedefs.hpp"
|
#include "util/typedefs.hpp"
|
||||||
|
|
||||||
|
#include <boost/functional/hash.hpp>
|
||||||
|
|
||||||
#include <bitset>
|
#include <bitset>
|
||||||
#include <cstddef>
|
#include <cstddef>
|
||||||
#include <cstdint>
|
#include <cstdint>
|
||||||
@@ -53,7 +54,19 @@ const constexpr Mask merge_to_right = 1u << 10u;
|
|||||||
|
|
||||||
using TurnLaneDescription = std::vector<TurnLaneType::Mask>;
|
using TurnLaneDescription = std::vector<TurnLaneType::Mask>;
|
||||||
|
|
||||||
using LaneDescriptionMap = util::ConcurrentIDMap<TurnLaneDescription, LaneDescriptionID>;
|
// hash function for TurnLaneDescription
|
||||||
|
struct TurnLaneDescription_hash
|
||||||
|
{
|
||||||
|
std::size_t operator()(const TurnLaneDescription &lane_description) const
|
||||||
|
{
|
||||||
|
std::size_t seed = 0;
|
||||||
|
boost::hash_range(seed, lane_description.begin(), lane_description.end());
|
||||||
|
return seed;
|
||||||
|
}
|
||||||
|
};
|
||||||
|
|
||||||
|
using LaneDescriptionMap =
|
||||||
|
util::ConcurrentIDMap<TurnLaneDescription, LaneDescriptionID, TurnLaneDescription_hash>;
|
||||||
|
|
||||||
using TurnLanesIndexedArray =
|
using TurnLanesIndexedArray =
|
||||||
std::tuple<std::vector<std::uint32_t>, std::vector<TurnLaneType::Mask>>;
|
std::tuple<std::vector<std::uint32_t>, std::vector<TurnLaneType::Mask>>;
|
||||||
|
|||||||
@@ -4,7 +4,7 @@
|
|||||||
#include "util/typedefs.hpp"
|
#include "util/typedefs.hpp"
|
||||||
|
|
||||||
#include <algorithm>
|
#include <algorithm>
|
||||||
#include <variant>
|
#include <mapbox/variant.hpp>
|
||||||
#include <vector>
|
#include <vector>
|
||||||
|
|
||||||
namespace osrm::extractor
|
namespace osrm::extractor
|
||||||
@@ -61,50 +61,50 @@ struct InputViaWayPath
|
|||||||
|
|
||||||
struct InputTurnPath
|
struct InputTurnPath
|
||||||
{
|
{
|
||||||
std::variant<InputViaNodePath, InputViaWayPath> node_or_way;
|
mapbox::util::variant<InputViaNodePath, InputViaWayPath> node_or_way;
|
||||||
|
|
||||||
TurnPathType Type() const
|
TurnPathType Type() const
|
||||||
{
|
{
|
||||||
BOOST_ASSERT(node_or_way.index() < TurnPathType::NUM_TURN_PATH_TYPES);
|
BOOST_ASSERT(node_or_way.which() < TurnPathType::NUM_TURN_PATH_TYPES);
|
||||||
return static_cast<TurnPathType>(node_or_way.index());
|
return static_cast<TurnPathType>(node_or_way.which());
|
||||||
}
|
}
|
||||||
|
|
||||||
OSMWayID From() const
|
OSMWayID From() const
|
||||||
{
|
{
|
||||||
return node_or_way.index() == TurnPathType::VIA_NODE_TURN_PATH
|
return node_or_way.which() == TurnPathType::VIA_NODE_TURN_PATH
|
||||||
? std::get<InputViaNodePath>(node_or_way).from
|
? mapbox::util::get<InputViaNodePath>(node_or_way).from
|
||||||
: std::get<InputViaWayPath>(node_or_way).from;
|
: mapbox::util::get<InputViaWayPath>(node_or_way).from;
|
||||||
}
|
}
|
||||||
|
|
||||||
OSMWayID To() const
|
OSMWayID To() const
|
||||||
{
|
{
|
||||||
return node_or_way.index() == TurnPathType::VIA_NODE_TURN_PATH
|
return node_or_way.which() == TurnPathType::VIA_NODE_TURN_PATH
|
||||||
? std::get<InputViaNodePath>(node_or_way).to
|
? mapbox::util::get<InputViaNodePath>(node_or_way).to
|
||||||
: std::get<InputViaWayPath>(node_or_way).to;
|
: mapbox::util::get<InputViaWayPath>(node_or_way).to;
|
||||||
}
|
}
|
||||||
|
|
||||||
InputViaWayPath &AsViaWayPath()
|
InputViaWayPath &AsViaWayPath()
|
||||||
{
|
{
|
||||||
BOOST_ASSERT(node_or_way.index() == TurnPathType::VIA_WAY_TURN_PATH);
|
BOOST_ASSERT(node_or_way.which() == TurnPathType::VIA_WAY_TURN_PATH);
|
||||||
return std::get<InputViaWayPath>(node_or_way);
|
return mapbox::util::get<InputViaWayPath>(node_or_way);
|
||||||
}
|
}
|
||||||
|
|
||||||
const InputViaWayPath &AsViaWayPath() const
|
const InputViaWayPath &AsViaWayPath() const
|
||||||
{
|
{
|
||||||
BOOST_ASSERT(node_or_way.index() == TurnPathType::VIA_WAY_TURN_PATH);
|
BOOST_ASSERT(node_or_way.which() == TurnPathType::VIA_WAY_TURN_PATH);
|
||||||
return std::get<InputViaWayPath>(node_or_way);
|
return mapbox::util::get<InputViaWayPath>(node_or_way);
|
||||||
}
|
}
|
||||||
|
|
||||||
InputViaNodePath &AsViaNodePath()
|
InputViaNodePath &AsViaNodePath()
|
||||||
{
|
{
|
||||||
BOOST_ASSERT(node_or_way.index() == TurnPathType::VIA_NODE_TURN_PATH);
|
BOOST_ASSERT(node_or_way.which() == TurnPathType::VIA_NODE_TURN_PATH);
|
||||||
return std::get<InputViaNodePath>(node_or_way);
|
return mapbox::util::get<InputViaNodePath>(node_or_way);
|
||||||
}
|
}
|
||||||
|
|
||||||
const InputViaNodePath &AsViaNodePath() const
|
const InputViaNodePath &AsViaNodePath() const
|
||||||
{
|
{
|
||||||
BOOST_ASSERT(node_or_way.index() == TurnPathType::VIA_NODE_TURN_PATH);
|
BOOST_ASSERT(node_or_way.which() == TurnPathType::VIA_NODE_TURN_PATH);
|
||||||
return std::get<InputViaNodePath>(node_or_way);
|
return mapbox::util::get<InputViaNodePath>(node_or_way);
|
||||||
}
|
}
|
||||||
};
|
};
|
||||||
|
|
||||||
@@ -175,63 +175,63 @@ struct ViaWayPath
|
|||||||
// between node/way paths
|
// between node/way paths
|
||||||
struct TurnPath
|
struct TurnPath
|
||||||
{
|
{
|
||||||
std::variant<ViaNodePath, ViaWayPath> node_or_way;
|
mapbox::util::variant<ViaNodePath, ViaWayPath> node_or_way;
|
||||||
|
|
||||||
NodeID To() const
|
NodeID To() const
|
||||||
{
|
{
|
||||||
return node_or_way.index() == TurnPathType::VIA_NODE_TURN_PATH
|
return node_or_way.which() == TurnPathType::VIA_NODE_TURN_PATH
|
||||||
? std::get<ViaNodePath>(node_or_way).to
|
? mapbox::util::get<ViaNodePath>(node_or_way).to
|
||||||
: std::get<ViaWayPath>(node_or_way).to;
|
: mapbox::util::get<ViaWayPath>(node_or_way).to;
|
||||||
}
|
}
|
||||||
|
|
||||||
NodeID From() const
|
NodeID From() const
|
||||||
{
|
{
|
||||||
return node_or_way.index() == TurnPathType::VIA_NODE_TURN_PATH
|
return node_or_way.which() == TurnPathType::VIA_NODE_TURN_PATH
|
||||||
? std::get<ViaNodePath>(node_or_way).from
|
? mapbox::util::get<ViaNodePath>(node_or_way).from
|
||||||
: std::get<ViaWayPath>(node_or_way).from;
|
: mapbox::util::get<ViaWayPath>(node_or_way).from;
|
||||||
}
|
}
|
||||||
|
|
||||||
NodeID FirstVia() const
|
NodeID FirstVia() const
|
||||||
{
|
{
|
||||||
if (node_or_way.index() == TurnPathType::VIA_NODE_TURN_PATH)
|
if (node_or_way.which() == TurnPathType::VIA_NODE_TURN_PATH)
|
||||||
{
|
{
|
||||||
return std::get<ViaNodePath>(node_or_way).via;
|
return mapbox::util::get<ViaNodePath>(node_or_way).via;
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
BOOST_ASSERT(!std::get<ViaWayPath>(node_or_way).via.empty());
|
BOOST_ASSERT(!mapbox::util::get<ViaWayPath>(node_or_way).via.empty());
|
||||||
return std::get<ViaWayPath>(node_or_way).via[0];
|
return mapbox::util::get<ViaWayPath>(node_or_way).via[0];
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
ViaWayPath &AsViaWayPath()
|
ViaWayPath &AsViaWayPath()
|
||||||
{
|
{
|
||||||
BOOST_ASSERT(node_or_way.index() == TurnPathType::VIA_WAY_TURN_PATH);
|
BOOST_ASSERT(node_or_way.which() == TurnPathType::VIA_WAY_TURN_PATH);
|
||||||
return std::get<ViaWayPath>(node_or_way);
|
return mapbox::util::get<ViaWayPath>(node_or_way);
|
||||||
}
|
}
|
||||||
|
|
||||||
const ViaWayPath &AsViaWayPath() const
|
const ViaWayPath &AsViaWayPath() const
|
||||||
{
|
{
|
||||||
BOOST_ASSERT(node_or_way.index() == TurnPathType::VIA_WAY_TURN_PATH);
|
BOOST_ASSERT(node_or_way.which() == TurnPathType::VIA_WAY_TURN_PATH);
|
||||||
return std::get<ViaWayPath>(node_or_way);
|
return mapbox::util::get<ViaWayPath>(node_or_way);
|
||||||
}
|
}
|
||||||
|
|
||||||
ViaNodePath &AsViaNodePath()
|
ViaNodePath &AsViaNodePath()
|
||||||
{
|
{
|
||||||
BOOST_ASSERT(node_or_way.index() == TurnPathType::VIA_NODE_TURN_PATH);
|
BOOST_ASSERT(node_or_way.which() == TurnPathType::VIA_NODE_TURN_PATH);
|
||||||
return std::get<ViaNodePath>(node_or_way);
|
return mapbox::util::get<ViaNodePath>(node_or_way);
|
||||||
}
|
}
|
||||||
|
|
||||||
const ViaNodePath &AsViaNodePath() const
|
const ViaNodePath &AsViaNodePath() const
|
||||||
{
|
{
|
||||||
BOOST_ASSERT(node_or_way.index() == TurnPathType::VIA_NODE_TURN_PATH);
|
BOOST_ASSERT(node_or_way.which() == TurnPathType::VIA_NODE_TURN_PATH);
|
||||||
return std::get<ViaNodePath>(node_or_way);
|
return mapbox::util::get<ViaNodePath>(node_or_way);
|
||||||
}
|
}
|
||||||
|
|
||||||
TurnPathType Type() const
|
TurnPathType Type() const
|
||||||
{
|
{
|
||||||
BOOST_ASSERT(node_or_way.index() < TurnPathType::NUM_TURN_PATH_TYPES);
|
BOOST_ASSERT(node_or_way.which() < TurnPathType::NUM_TURN_PATH_TYPES);
|
||||||
return static_cast<TurnPathType>(node_or_way.index());
|
return static_cast<TurnPathType>(node_or_way.which());
|
||||||
}
|
}
|
||||||
|
|
||||||
bool operator==(const TurnPath &other) const
|
bool operator==(const TurnPath &other) const
|
||||||
|
|||||||
@@ -10,16 +10,12 @@
|
|||||||
|
|
||||||
#include <boost/assert.hpp>
|
#include <boost/assert.hpp>
|
||||||
|
|
||||||
#include <cstdint>
|
|
||||||
#include <filesystem>
|
|
||||||
#include <type_traits>
|
|
||||||
|
|
||||||
namespace osrm::guidance::files
|
namespace osrm::guidance::files
|
||||||
{
|
{
|
||||||
|
|
||||||
// reads .osrm.edges
|
// reads .osrm.edges
|
||||||
template <typename TurnDataT>
|
template <typename TurnDataT>
|
||||||
inline void readTurnData(const std::filesystem::path &path,
|
inline void readTurnData(const boost::filesystem::path &path,
|
||||||
TurnDataT &turn_data,
|
TurnDataT &turn_data,
|
||||||
std::uint32_t &connectivity_checksum)
|
std::uint32_t &connectivity_checksum)
|
||||||
{
|
{
|
||||||
@@ -36,7 +32,7 @@ inline void readTurnData(const std::filesystem::path &path,
|
|||||||
|
|
||||||
// writes .osrm.edges
|
// writes .osrm.edges
|
||||||
template <typename TurnDataT>
|
template <typename TurnDataT>
|
||||||
inline void writeTurnData(const std::filesystem::path &path,
|
inline void writeTurnData(const boost::filesystem::path &path,
|
||||||
const TurnDataT &turn_data,
|
const TurnDataT &turn_data,
|
||||||
const std::uint32_t connectivity_checksum)
|
const std::uint32_t connectivity_checksum)
|
||||||
{
|
{
|
||||||
|
|||||||
@@ -7,6 +7,7 @@
|
|||||||
#include "guidance/intersection_handler.hpp"
|
#include "guidance/intersection_handler.hpp"
|
||||||
#include "guidance/is_through_street.hpp"
|
#include "guidance/is_through_street.hpp"
|
||||||
|
|
||||||
|
#include "util/attributes.hpp"
|
||||||
#include "util/node_based_graph.hpp"
|
#include "util/node_based_graph.hpp"
|
||||||
|
|
||||||
#include <vector>
|
#include <vector>
|
||||||
@@ -41,14 +42,18 @@ class MotorwayHandler final : public IntersectionHandler
|
|||||||
Intersection intersection) const override final;
|
Intersection intersection) const override final;
|
||||||
|
|
||||||
private:
|
private:
|
||||||
[[nodiscard]] Intersection handleSliproads(const NodeID intersection_node_id,
|
OSRM_ATTR_WARN_UNUSED
|
||||||
Intersection intersection) const;
|
Intersection handleSliproads(const NodeID intersection_node_id,
|
||||||
|
Intersection intersection) const;
|
||||||
|
|
||||||
[[nodiscard]] Intersection fromMotorway(const EdgeID via_edge, Intersection intersection) const;
|
OSRM_ATTR_WARN_UNUSED
|
||||||
|
Intersection fromMotorway(const EdgeID via_edge, Intersection intersection) const;
|
||||||
|
|
||||||
[[nodiscard]] Intersection fromRamp(const EdgeID via_edge, Intersection intersection) const;
|
OSRM_ATTR_WARN_UNUSED
|
||||||
|
Intersection fromRamp(const EdgeID via_edge, Intersection intersection) const;
|
||||||
|
|
||||||
[[nodiscard]] Intersection fallback(Intersection intersection) const;
|
OSRM_ATTR_WARN_UNUSED
|
||||||
|
Intersection fallback(Intersection intersection) const;
|
||||||
};
|
};
|
||||||
|
|
||||||
} // namespace osrm::guidance
|
} // namespace osrm::guidance
|
||||||
|
|||||||
@@ -7,6 +7,8 @@
|
|||||||
#include <boost/algorithm/string.hpp>
|
#include <boost/algorithm/string.hpp>
|
||||||
#include <boost/tokenizer.hpp>
|
#include <boost/tokenizer.hpp>
|
||||||
|
|
||||||
|
#include "util/attributes.hpp"
|
||||||
|
|
||||||
namespace osrm::extractor::guidance
|
namespace osrm::extractor::guidance
|
||||||
{
|
{
|
||||||
|
|
||||||
@@ -19,7 +21,8 @@ namespace osrm::extractor::guidance
|
|||||||
// will be corrected to left|throught, since the final lane is not drivable.
|
// will be corrected to left|throught, since the final lane is not drivable.
|
||||||
// This is in contrast to a situation with lanes:psv:forward=0 (or not set) where left|through|
|
// This is in contrast to a situation with lanes:psv:forward=0 (or not set) where left|through|
|
||||||
// represents left|through|through
|
// represents left|through|through
|
||||||
[[nodiscard]] inline std::string
|
OSRM_ATTR_WARN_UNUSED
|
||||||
|
inline std::string
|
||||||
trimLaneString(std::string lane_string, std::int32_t count_left, std::int32_t count_right)
|
trimLaneString(std::string lane_string, std::int32_t count_left, std::int32_t count_right)
|
||||||
{
|
{
|
||||||
if (count_left)
|
if (count_left)
|
||||||
@@ -65,8 +68,8 @@ trimLaneString(std::string lane_string, std::int32_t count_left, std::int32_t co
|
|||||||
// turn:lanes=left|through|through|right
|
// turn:lanes=left|through|through|right
|
||||||
// vehicle:lanes=yes|yes|no|yes
|
// vehicle:lanes=yes|yes|no|yes
|
||||||
// bicycle:lanes=yes|no|designated|yes
|
// bicycle:lanes=yes|no|designated|yes
|
||||||
[[nodiscard]] inline std::string applyAccessTokens(std::string lane_string,
|
OSRM_ATTR_WARN_UNUSED
|
||||||
const std::string &access_tokens)
|
inline std::string applyAccessTokens(std::string lane_string, const std::string &access_tokens)
|
||||||
{
|
{
|
||||||
using tokenizer = boost::tokenizer<boost::char_separator<char>>;
|
using tokenizer = boost::tokenizer<boost::char_separator<char>>;
|
||||||
boost::char_separator<char> sep("|", "", boost::keep_empty_tokens);
|
boost::char_separator<char> sep("|", "", boost::keep_empty_tokens);
|
||||||
|
|||||||
@@ -17,6 +17,7 @@
|
|||||||
#include "guidance/turn_classification.hpp"
|
#include "guidance/turn_classification.hpp"
|
||||||
#include "guidance/turn_handler.hpp"
|
#include "guidance/turn_handler.hpp"
|
||||||
|
|
||||||
|
#include "util/attributes.hpp"
|
||||||
#include "util/node_based_graph.hpp"
|
#include "util/node_based_graph.hpp"
|
||||||
|
|
||||||
#include <cstdint>
|
#include <cstdint>
|
||||||
@@ -46,11 +47,13 @@ class TurnAnalysis
|
|||||||
|
|
||||||
/* Full Analysis Process for a single node/edge combination. Use with caution, as the process is
|
/* Full Analysis Process for a single node/edge combination. Use with caution, as the process is
|
||||||
* relatively expensive */
|
* relatively expensive */
|
||||||
[[nodiscard]] Intersection operator()(const NodeID node_prior_to_intersection,
|
OSRM_ATTR_WARN_UNUSED
|
||||||
const EdgeID entering_via_edge) const;
|
Intersection operator()(const NodeID node_prior_to_intersection,
|
||||||
|
const EdgeID entering_via_edge) const;
|
||||||
|
|
||||||
// Select turn types based on the intersection shape
|
// Select turn types based on the intersection shape
|
||||||
[[nodiscard]] Intersection
|
OSRM_ATTR_WARN_UNUSED
|
||||||
|
Intersection
|
||||||
AssignTurnTypes(const NodeID from_node,
|
AssignTurnTypes(const NodeID from_node,
|
||||||
const EdgeID via_eid,
|
const EdgeID via_eid,
|
||||||
const extractor::intersection::IntersectionView &intersection) const;
|
const extractor::intersection::IntersectionView &intersection) const;
|
||||||
|
|||||||
@@ -8,6 +8,7 @@
|
|||||||
#include "guidance/intersection_handler.hpp"
|
#include "guidance/intersection_handler.hpp"
|
||||||
#include "guidance/is_through_street.hpp"
|
#include "guidance/is_through_street.hpp"
|
||||||
|
|
||||||
|
#include "util/attributes.hpp"
|
||||||
#include "util/node_based_graph.hpp"
|
#include "util/node_based_graph.hpp"
|
||||||
|
|
||||||
#include <cstddef>
|
#include <cstddef>
|
||||||
@@ -75,19 +76,20 @@ class TurnHandler final : public IntersectionHandler
|
|||||||
bool isCompatibleByRoadClass(const Intersection &intersection, const Fork fork) const;
|
bool isCompatibleByRoadClass(const Intersection &intersection, const Fork fork) const;
|
||||||
|
|
||||||
// Dead end.
|
// Dead end.
|
||||||
[[nodiscard]] Intersection handleOneWayTurn(Intersection intersection) const;
|
OSRM_ATTR_WARN_UNUSED
|
||||||
|
Intersection handleOneWayTurn(Intersection intersection) const;
|
||||||
|
|
||||||
// Mode Changes, new names...
|
// Mode Changes, new names...
|
||||||
[[nodiscard]] Intersection handleTwoWayTurn(const EdgeID via_edge,
|
OSRM_ATTR_WARN_UNUSED
|
||||||
Intersection intersection) const;
|
Intersection handleTwoWayTurn(const EdgeID via_edge, Intersection intersection) const;
|
||||||
|
|
||||||
// Forks, T intersections and similar
|
// Forks, T intersections and similar
|
||||||
[[nodiscard]] Intersection handleThreeWayTurn(const EdgeID via_edge,
|
OSRM_ATTR_WARN_UNUSED
|
||||||
Intersection intersection) const;
|
Intersection handleThreeWayTurn(const EdgeID via_edge, Intersection intersection) const;
|
||||||
|
|
||||||
// Handling of turns larger then degree three
|
// Handling of turns larger then degree three
|
||||||
[[nodiscard]] Intersection handleComplexTurn(const EdgeID via_edge,
|
OSRM_ATTR_WARN_UNUSED
|
||||||
Intersection intersection) const;
|
Intersection handleComplexTurn(const EdgeID via_edge, Intersection intersection) const;
|
||||||
|
|
||||||
void
|
void
|
||||||
handleDistinctConflict(const EdgeID via_edge, ConnectedRoad &left, ConnectedRoad &right) const;
|
handleDistinctConflict(const EdgeID via_edge, ConnectedRoad &left, ConnectedRoad &right) const;
|
||||||
@@ -95,13 +97,15 @@ class TurnHandler final : public IntersectionHandler
|
|||||||
// Classification
|
// Classification
|
||||||
std::optional<Fork> findFork(const EdgeID via_edge, Intersection &intersection) const;
|
std::optional<Fork> findFork(const EdgeID via_edge, Intersection &intersection) const;
|
||||||
|
|
||||||
[[nodiscard]] Intersection assignLeftTurns(const EdgeID via_edge,
|
OSRM_ATTR_WARN_UNUSED
|
||||||
Intersection intersection,
|
Intersection assignLeftTurns(const EdgeID via_edge,
|
||||||
const std::size_t starting_at) const;
|
Intersection intersection,
|
||||||
|
const std::size_t starting_at) const;
|
||||||
|
|
||||||
[[nodiscard]] Intersection assignRightTurns(const EdgeID via_edge,
|
OSRM_ATTR_WARN_UNUSED
|
||||||
Intersection intersection,
|
Intersection assignRightTurns(const EdgeID via_edge,
|
||||||
const std::size_t up_to) const;
|
Intersection intersection,
|
||||||
|
const std::size_t up_to) const;
|
||||||
};
|
};
|
||||||
|
|
||||||
} // namespace osrm::guidance
|
} // namespace osrm::guidance
|
||||||
|
|||||||
@@ -2,6 +2,7 @@
|
|||||||
#define OSRM_GUIDANCE_TURN_INSTRUCTION_HPP_
|
#define OSRM_GUIDANCE_TURN_INSTRUCTION_HPP_
|
||||||
|
|
||||||
#include "guidance/roundabout_type.hpp"
|
#include "guidance/roundabout_type.hpp"
|
||||||
|
#include "util/attributes.hpp"
|
||||||
#include "util/typedefs.hpp"
|
#include "util/typedefs.hpp"
|
||||||
|
|
||||||
#include <algorithm>
|
#include <algorithm>
|
||||||
@@ -242,7 +243,8 @@ inline guidance::DirectionModifier::Enum getTurnDirection(const double angle)
|
|||||||
}
|
}
|
||||||
|
|
||||||
// swaps left <-> right modifier types
|
// swaps left <-> right modifier types
|
||||||
[[nodiscard]] inline guidance::DirectionModifier::Enum
|
OSRM_ATTR_WARN_UNUSED
|
||||||
|
inline guidance::DirectionModifier::Enum
|
||||||
mirrorDirectionModifier(const guidance::DirectionModifier::Enum modifier)
|
mirrorDirectionModifier(const guidance::DirectionModifier::Enum modifier)
|
||||||
{
|
{
|
||||||
const constexpr guidance::DirectionModifier::Enum results[] = {
|
const constexpr guidance::DirectionModifier::Enum results[] = {
|
||||||
|
|||||||
@@ -3,12 +3,14 @@
|
|||||||
|
|
||||||
#include "guidance/intersection.hpp"
|
#include "guidance/intersection.hpp"
|
||||||
#include "guidance/turn_lane_data.hpp"
|
#include "guidance/turn_lane_data.hpp"
|
||||||
|
#include "util/attributes.hpp"
|
||||||
|
|
||||||
namespace osrm::guidance::lanes
|
namespace osrm::guidance::lanes
|
||||||
{
|
{
|
||||||
|
|
||||||
[[nodiscard]] LaneDataVector handleNoneValueAtSimpleTurn(LaneDataVector lane_data,
|
OSRM_ATTR_WARN_UNUSED
|
||||||
const Intersection &intersection);
|
LaneDataVector handleNoneValueAtSimpleTurn(LaneDataVector lane_data,
|
||||||
|
const Intersection &intersection);
|
||||||
|
|
||||||
} // namespace osrm::guidance::lanes
|
} // namespace osrm::guidance::lanes
|
||||||
|
|
||||||
|
|||||||
@@ -2,6 +2,7 @@
|
|||||||
#define OSRM_GUIDANCE_TURN_LANE_DATA_HPP_
|
#define OSRM_GUIDANCE_TURN_LANE_DATA_HPP_
|
||||||
|
|
||||||
#include "extractor/turn_lane_types.hpp"
|
#include "extractor/turn_lane_types.hpp"
|
||||||
|
#include "util/attributes.hpp"
|
||||||
#include "util/typedefs.hpp"
|
#include "util/typedefs.hpp"
|
||||||
#include <vector>
|
#include <vector>
|
||||||
|
|
||||||
@@ -22,8 +23,8 @@ struct TurnLaneData
|
|||||||
using LaneDataVector = std::vector<TurnLaneData>;
|
using LaneDataVector = std::vector<TurnLaneData>;
|
||||||
|
|
||||||
// convertes a string given in the OSM format into a TurnLaneData vector
|
// convertes a string given in the OSM format into a TurnLaneData vector
|
||||||
[[nodiscard]] LaneDataVector
|
OSRM_ATTR_WARN_UNUSED
|
||||||
laneDataFromDescription(const extractor::TurnLaneDescription &turn_lane_description);
|
LaneDataVector laneDataFromDescription(const extractor::TurnLaneDescription &turn_lane_description);
|
||||||
|
|
||||||
// Locate A Tag in a lane data vector (if multiple tags are set, the first one found is returned)
|
// Locate A Tag in a lane data vector (if multiple tags are set, the first one found is returned)
|
||||||
LaneDataVector::const_iterator findTag(const extractor::TurnLaneType::Mask tag,
|
LaneDataVector::const_iterator findTag(const extractor::TurnLaneType::Mask tag,
|
||||||
|
|||||||
@@ -9,6 +9,7 @@
|
|||||||
#include "guidance/turn_analysis.hpp"
|
#include "guidance/turn_analysis.hpp"
|
||||||
#include "guidance/turn_lane_data.hpp"
|
#include "guidance/turn_lane_data.hpp"
|
||||||
|
|
||||||
|
#include "util/attributes.hpp"
|
||||||
#include "util/guidance/turn_lanes.hpp"
|
#include "util/guidance/turn_lanes.hpp"
|
||||||
#include "util/node_based_graph.hpp"
|
#include "util/node_based_graph.hpp"
|
||||||
#include "util/typedefs.hpp"
|
#include "util/typedefs.hpp"
|
||||||
@@ -67,8 +68,8 @@ class TurnLaneHandler
|
|||||||
|
|
||||||
~TurnLaneHandler();
|
~TurnLaneHandler();
|
||||||
|
|
||||||
[[nodiscard]] Intersection
|
OSRM_ATTR_WARN_UNUSED
|
||||||
assignTurnLanes(const NodeID at, const EdgeID via_edge, Intersection intersection);
|
Intersection assignTurnLanes(const NodeID at, const EdgeID via_edge, Intersection intersection);
|
||||||
|
|
||||||
private:
|
private:
|
||||||
mutable std::atomic<std::size_t> count_handled;
|
mutable std::atomic<std::size_t> count_handled;
|
||||||
@@ -107,23 +108,24 @@ class TurnLaneHandler
|
|||||||
const Intersection &intersection) const;
|
const Intersection &intersection) const;
|
||||||
|
|
||||||
// in case of a simple intersection, assign the lane entries
|
// in case of a simple intersection, assign the lane entries
|
||||||
[[nodiscard]] Intersection simpleMatchTuplesToTurns(Intersection intersection,
|
OSRM_ATTR_WARN_UNUSED
|
||||||
const LaneDataVector &lane_data,
|
Intersection simpleMatchTuplesToTurns(Intersection intersection,
|
||||||
const LaneDescriptionID lane_string_id);
|
const LaneDataVector &lane_data,
|
||||||
|
const LaneDescriptionID lane_string_id);
|
||||||
|
|
||||||
// partition lane data into lane data relevant at current turn and at next turn
|
// partition lane data into lane data relevant at current turn and at next turn
|
||||||
[[nodiscard]] std::pair<TurnLaneHandler::LaneDataVector, TurnLaneHandler::LaneDataVector>
|
OSRM_ATTR_WARN_UNUSED
|
||||||
partitionLaneData(const NodeID at,
|
std::pair<TurnLaneHandler::LaneDataVector, TurnLaneHandler::LaneDataVector> partitionLaneData(
|
||||||
LaneDataVector turn_lane_data,
|
const NodeID at, LaneDataVector turn_lane_data, const Intersection &intersection) const;
|
||||||
const Intersection &intersection) const;
|
|
||||||
|
|
||||||
// Sliproad turns have a separated lane to the right/left of other depicted lanes. These lanes
|
// Sliproad turns have a separated lane to the right/left of other depicted lanes. These lanes
|
||||||
// are not necessarily separated clearly from the rest of the way. As a result, we combine both
|
// are not necessarily separated clearly from the rest of the way. As a result, we combine both
|
||||||
// lane entries for our output, while performing the matching with the separated lanes only.
|
// lane entries for our output, while performing the matching with the separated lanes only.
|
||||||
[[nodiscard]] Intersection handleSliproadTurn(Intersection intersection,
|
OSRM_ATTR_WARN_UNUSED
|
||||||
const LaneDescriptionID lane_description_id,
|
Intersection handleSliproadTurn(Intersection intersection,
|
||||||
LaneDataVector lane_data,
|
const LaneDescriptionID lane_description_id,
|
||||||
const Intersection &previous_intersection);
|
LaneDataVector lane_data,
|
||||||
|
const Intersection &previous_intersection);
|
||||||
|
|
||||||
// get the lane data for an intersection
|
// get the lane data for an intersection
|
||||||
void extractLaneData(const EdgeID via_edge,
|
void extractLaneData(const EdgeID via_edge,
|
||||||
|
|||||||
@@ -5,6 +5,7 @@
|
|||||||
#include "guidance/turn_instruction.hpp"
|
#include "guidance/turn_instruction.hpp"
|
||||||
#include "guidance/turn_lane_data.hpp"
|
#include "guidance/turn_lane_data.hpp"
|
||||||
|
|
||||||
|
#include "util/attributes.hpp"
|
||||||
#include "util/guidance/turn_lanes.hpp"
|
#include "util/guidance/turn_lanes.hpp"
|
||||||
#include "util/node_based_graph.hpp"
|
#include "util/node_based_graph.hpp"
|
||||||
|
|
||||||
@@ -33,12 +34,12 @@ findBestMatchForReverse(const extractor::TurnLaneType::Mask leftmost_tag,
|
|||||||
bool canMatchTrivially(const Intersection &intersection, const LaneDataVector &lane_data);
|
bool canMatchTrivially(const Intersection &intersection, const LaneDataVector &lane_data);
|
||||||
|
|
||||||
// perform a trivial match on the turn lanes
|
// perform a trivial match on the turn lanes
|
||||||
[[nodiscard]] Intersection
|
OSRM_ATTR_WARN_UNUSED
|
||||||
triviallyMatchLanesToTurns(Intersection intersection,
|
Intersection triviallyMatchLanesToTurns(Intersection intersection,
|
||||||
const LaneDataVector &lane_data,
|
const LaneDataVector &lane_data,
|
||||||
const util::NodeBasedDynamicGraph &node_based_graph,
|
const util::NodeBasedDynamicGraph &node_based_graph,
|
||||||
const LaneDescriptionID lane_string_id,
|
const LaneDescriptionID lane_string_id,
|
||||||
util::guidance::LaneDataIdMap &lane_data_to_id);
|
util::guidance::LaneDataIdMap &lane_data_to_id);
|
||||||
|
|
||||||
} // namespace osrm::guidance::lanes
|
} // namespace osrm::guidance::lanes
|
||||||
|
|
||||||
|
|||||||
@@ -29,7 +29,7 @@ struct V8Renderer
|
|||||||
for (const auto &keyValue : object.values)
|
for (const auto &keyValue : object.values)
|
||||||
{
|
{
|
||||||
Napi::Value child;
|
Napi::Value child;
|
||||||
std::visit(V8Renderer(env, child), keyValue.second);
|
mapbox::util::apply_visitor(V8Renderer(env, child), keyValue.second);
|
||||||
obj.Set(keyValue.first, child);
|
obj.Set(keyValue.first, child);
|
||||||
}
|
}
|
||||||
out = obj;
|
out = obj;
|
||||||
@@ -41,7 +41,7 @@ struct V8Renderer
|
|||||||
for (auto i = 0u; i < array.values.size(); ++i)
|
for (auto i = 0u; i < array.values.size(); ++i)
|
||||||
{
|
{
|
||||||
Napi::Value child;
|
Napi::Value child;
|
||||||
std::visit(V8Renderer(env, child), array.values[i]);
|
mapbox::util::apply_visitor(V8Renderer(env, child), array.values[i]);
|
||||||
a.Set(i, child);
|
a.Set(i, child);
|
||||||
}
|
}
|
||||||
out = a;
|
out = a;
|
||||||
|
|||||||
@@ -21,14 +21,14 @@
|
|||||||
#include <napi.h>
|
#include <napi.h>
|
||||||
|
|
||||||
#include <boost/assert.hpp>
|
#include <boost/assert.hpp>
|
||||||
#include <optional>
|
#include <boost/optional.hpp>
|
||||||
|
|
||||||
#include <algorithm>
|
#include <algorithm>
|
||||||
|
#include <iostream>
|
||||||
#include <iterator>
|
#include <iterator>
|
||||||
#include <sstream>
|
#include <sstream>
|
||||||
#include <stdexcept>
|
#include <stdexcept>
|
||||||
#include <string>
|
#include <string>
|
||||||
#include <variant>
|
|
||||||
#include <vector>
|
#include <vector>
|
||||||
|
|
||||||
#include <exception>
|
#include <exception>
|
||||||
@@ -51,7 +51,7 @@ struct PluginParameters
|
|||||||
bool renderToBuffer = false;
|
bool renderToBuffer = false;
|
||||||
};
|
};
|
||||||
|
|
||||||
using ObjectOrString = typename std::variant<osrm::json::Object, std::string>;
|
using ObjectOrString = typename mapbox::util::variant<osrm::json::Object, std::string>;
|
||||||
|
|
||||||
template <typename ResultT> inline Napi::Value render(const Napi::Env &env, const ResultT &result);
|
template <typename ResultT> inline Napi::Value render(const Napi::Env &env, const ResultT &result);
|
||||||
|
|
||||||
@@ -62,18 +62,18 @@ template <> Napi::Value inline render(const Napi::Env &env, const std::string &r
|
|||||||
|
|
||||||
template <> Napi::Value inline render(const Napi::Env &env, const ObjectOrString &result)
|
template <> Napi::Value inline render(const Napi::Env &env, const ObjectOrString &result)
|
||||||
{
|
{
|
||||||
if (std::holds_alternative<osrm::json::Object>(result))
|
if (result.is<osrm::json::Object>())
|
||||||
{
|
{
|
||||||
// Convert osrm::json object tree into matching v8 object tree
|
// Convert osrm::json object tree into matching v8 object tree
|
||||||
Napi::Value value;
|
Napi::Value value;
|
||||||
renderToV8(env, value, std::get<osrm::json::Object>(result));
|
renderToV8(env, value, result.get<osrm::json::Object>());
|
||||||
return value;
|
return value;
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
// Return the string object as a node Buffer
|
// Return the string object as a node Buffer
|
||||||
return Napi::Buffer<char>::Copy(
|
return Napi::Buffer<char>::Copy(
|
||||||
env, std::get<std::string>(result).data(), std::get<std::string>(result).size());
|
env, result.get<std::string>().data(), result.get<std::string>().size());
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -96,7 +96,7 @@ inline void ParseResult(const osrm::Status &result_status, osrm::json::Object &r
|
|||||||
|
|
||||||
if (result_status == osrm::Status::Error)
|
if (result_status == osrm::Status::Error)
|
||||||
{
|
{
|
||||||
throw std::logic_error(std::get<osrm::json::String>(code_iter->second).value.c_str());
|
throw std::logic_error(code_iter->second.get<osrm::json::String>().value.c_str());
|
||||||
}
|
}
|
||||||
|
|
||||||
result.values.erase(code_iter);
|
result.values.erase(code_iter);
|
||||||
@@ -296,19 +296,24 @@ inline engine_config_ptr argumentsToEngineConfig(const Napi::CallbackInfo &args)
|
|||||||
{
|
{
|
||||||
engine_config->algorithm = osrm::EngineConfig::Algorithm::CH;
|
engine_config->algorithm = osrm::EngineConfig::Algorithm::CH;
|
||||||
}
|
}
|
||||||
|
else if (algorithm_str == "CoreCH")
|
||||||
|
{
|
||||||
|
engine_config->algorithm = osrm::EngineConfig::Algorithm::CH;
|
||||||
|
}
|
||||||
else if (algorithm_str == "MLD")
|
else if (algorithm_str == "MLD")
|
||||||
{
|
{
|
||||||
engine_config->algorithm = osrm::EngineConfig::Algorithm::MLD;
|
engine_config->algorithm = osrm::EngineConfig::Algorithm::MLD;
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
ThrowError(args.Env(), "algorithm option must be one of 'CH', or 'MLD'.");
|
ThrowError(args.Env(), "algorithm option must be one of 'CH', 'CoreCH', or 'MLD'.");
|
||||||
return engine_config_ptr();
|
return engine_config_ptr();
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
else if (!algorithm.IsUndefined())
|
else if (!algorithm.IsUndefined())
|
||||||
{
|
{
|
||||||
ThrowError(args.Env(), "algorithm option must be a string and one of 'CH', or 'MLD'.");
|
ThrowError(args.Env(),
|
||||||
|
"algorithm option must be a string and one of 'CH', 'CoreCH', or 'MLD'.");
|
||||||
return engine_config_ptr();
|
return engine_config_ptr();
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -395,11 +400,11 @@ inline engine_config_ptr argumentsToEngineConfig(const Napi::CallbackInfo &args)
|
|||||||
return engine_config;
|
return engine_config;
|
||||||
}
|
}
|
||||||
|
|
||||||
inline std::optional<std::vector<osrm::Coordinate>>
|
inline boost::optional<std::vector<osrm::Coordinate>>
|
||||||
parseCoordinateArray(const Napi::Array &coordinates_array)
|
parseCoordinateArray(const Napi::Array &coordinates_array)
|
||||||
{
|
{
|
||||||
Napi::HandleScope scope(coordinates_array.Env());
|
Napi::HandleScope scope(coordinates_array.Env());
|
||||||
std::optional<std::vector<osrm::Coordinate>> resulting_coordinates;
|
boost::optional<std::vector<osrm::Coordinate>> resulting_coordinates;
|
||||||
std::vector<osrm::Coordinate> temp_coordinates;
|
std::vector<osrm::Coordinate> temp_coordinates;
|
||||||
|
|
||||||
for (uint32_t i = 0; i < coordinates_array.Length(); ++i)
|
for (uint32_t i = 0; i < coordinates_array.Length(); ++i)
|
||||||
@@ -450,7 +455,7 @@ parseCoordinateArray(const Napi::Array &coordinates_array)
|
|||||||
osrm::util::FloatLatitude{std::move(lat)});
|
osrm::util::FloatLatitude{std::move(lat)});
|
||||||
}
|
}
|
||||||
|
|
||||||
resulting_coordinates = std::make_optional(std::move(temp_coordinates));
|
resulting_coordinates = boost::make_optional(std::move(temp_coordinates));
|
||||||
return resulting_coordinates;
|
return resulting_coordinates;
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -1023,7 +1028,7 @@ inline bool parseCommonParameters(const Napi::Object &obj, ParamType ¶ms)
|
|||||||
|
|
||||||
inline PluginParameters argumentsToPluginParameters(
|
inline PluginParameters argumentsToPluginParameters(
|
||||||
const Napi::CallbackInfo &args,
|
const Napi::CallbackInfo &args,
|
||||||
const std::optional<osrm::engine::api::BaseParameters::OutputFormatType> &output_format = {})
|
const boost::optional<osrm::engine::api::BaseParameters::OutputFormatType> &output_format = {})
|
||||||
{
|
{
|
||||||
if (args.Length() < 3 || !args[1].IsObject())
|
if (args.Length() < 3 || !args[1].IsObject())
|
||||||
{
|
{
|
||||||
|
|||||||
@@ -173,8 +173,8 @@ graphToEdges(const DynamicEdgeBasedGraph &edge_based_graph)
|
|||||||
for (auto edge : edge_based_graph.GetAdjacentEdgeRange(node))
|
for (auto edge : edge_based_graph.GetAdjacentEdgeRange(node))
|
||||||
{
|
{
|
||||||
const auto &data = edge_based_graph.GetEdgeData(edge);
|
const auto &data = edge_based_graph.GetEdgeData(edge);
|
||||||
// we only need to save the forward edges, since the read method
|
// we only need to save the forward edges, since the read method will
|
||||||
// will convert from forward to bi-directional edges again
|
// convert from forward to bi-directional edges again
|
||||||
if (data.forward)
|
if (data.forward)
|
||||||
{
|
{
|
||||||
auto target = edge_based_graph.GetTarget(edge);
|
auto target = edge_based_graph.GetTarget(edge);
|
||||||
@@ -191,7 +191,7 @@ graphToEdges(const DynamicEdgeBasedGraph &edge_based_graph)
|
|||||||
return edges;
|
return edges;
|
||||||
}
|
}
|
||||||
|
|
||||||
inline DynamicEdgeBasedGraph LoadEdgeBasedGraph(const std::filesystem::path &path)
|
inline DynamicEdgeBasedGraph LoadEdgeBasedGraph(const boost::filesystem::path &path)
|
||||||
{
|
{
|
||||||
EdgeID number_of_edge_based_nodes;
|
EdgeID number_of_edge_based_nodes;
|
||||||
std::vector<extractor::EdgeBasedEdge> edges;
|
std::vector<extractor::EdgeBasedEdge> edges;
|
||||||
|
|||||||
@@ -10,7 +10,7 @@ namespace osrm::partitioner::files
|
|||||||
|
|
||||||
// read .osrm.partition file
|
// read .osrm.partition file
|
||||||
template <typename MultiLevelPartitionT>
|
template <typename MultiLevelPartitionT>
|
||||||
inline void readPartition(const std::filesystem::path &path, MultiLevelPartitionT &mlp)
|
inline void readPartition(const boost::filesystem::path &path, MultiLevelPartitionT &mlp)
|
||||||
{
|
{
|
||||||
static_assert(std::is_same<MultiLevelPartitionView, MultiLevelPartitionT>::value ||
|
static_assert(std::is_same<MultiLevelPartitionView, MultiLevelPartitionT>::value ||
|
||||||
std::is_same<MultiLevelPartition, MultiLevelPartitionT>::value,
|
std::is_same<MultiLevelPartition, MultiLevelPartitionT>::value,
|
||||||
@@ -24,7 +24,7 @@ inline void readPartition(const std::filesystem::path &path, MultiLevelPartition
|
|||||||
|
|
||||||
// writes .osrm.partition file
|
// writes .osrm.partition file
|
||||||
template <typename MultiLevelPartitionT>
|
template <typename MultiLevelPartitionT>
|
||||||
inline void writePartition(const std::filesystem::path &path, const MultiLevelPartitionT &mlp)
|
inline void writePartition(const boost::filesystem::path &path, const MultiLevelPartitionT &mlp)
|
||||||
{
|
{
|
||||||
static_assert(std::is_same<MultiLevelPartitionView, MultiLevelPartitionT>::value ||
|
static_assert(std::is_same<MultiLevelPartitionView, MultiLevelPartitionT>::value ||
|
||||||
std::is_same<MultiLevelPartition, MultiLevelPartitionT>::value,
|
std::is_same<MultiLevelPartition, MultiLevelPartitionT>::value,
|
||||||
@@ -38,7 +38,7 @@ inline void writePartition(const std::filesystem::path &path, const MultiLevelPa
|
|||||||
|
|
||||||
// reads .osrm.cells file
|
// reads .osrm.cells file
|
||||||
template <typename CellStorageT>
|
template <typename CellStorageT>
|
||||||
inline void readCells(const std::filesystem::path &path, CellStorageT &storage)
|
inline void readCells(const boost::filesystem::path &path, CellStorageT &storage)
|
||||||
{
|
{
|
||||||
static_assert(std::is_same<CellStorageView, CellStorageT>::value ||
|
static_assert(std::is_same<CellStorageView, CellStorageT>::value ||
|
||||||
std::is_same<CellStorage, CellStorageT>::value,
|
std::is_same<CellStorage, CellStorageT>::value,
|
||||||
@@ -52,7 +52,7 @@ inline void readCells(const std::filesystem::path &path, CellStorageT &storage)
|
|||||||
|
|
||||||
// writes .osrm.cells file
|
// writes .osrm.cells file
|
||||||
template <typename CellStorageT>
|
template <typename CellStorageT>
|
||||||
inline void writeCells(const std::filesystem::path &path, CellStorageT &storage)
|
inline void writeCells(const boost::filesystem::path &path, CellStorageT &storage)
|
||||||
{
|
{
|
||||||
static_assert(std::is_same<CellStorageView, CellStorageT>::value ||
|
static_assert(std::is_same<CellStorageView, CellStorageT>::value ||
|
||||||
std::is_same<CellStorage, CellStorageT>::value,
|
std::is_same<CellStorage, CellStorageT>::value,
|
||||||
@@ -66,7 +66,7 @@ inline void writeCells(const std::filesystem::path &path, CellStorageT &storage)
|
|||||||
|
|
||||||
// reads .osrm.mldgr file
|
// reads .osrm.mldgr file
|
||||||
template <typename MultiLevelGraphT>
|
template <typename MultiLevelGraphT>
|
||||||
inline void readGraph(const std::filesystem::path &path,
|
inline void readGraph(const boost::filesystem::path &path,
|
||||||
MultiLevelGraphT &graph,
|
MultiLevelGraphT &graph,
|
||||||
std::uint32_t &connectivity_checksum)
|
std::uint32_t &connectivity_checksum)
|
||||||
{
|
{
|
||||||
@@ -80,7 +80,7 @@ inline void readGraph(const std::filesystem::path &path,
|
|||||||
|
|
||||||
// writes .osrm.mldgr file
|
// writes .osrm.mldgr file
|
||||||
template <typename MultiLevelGraphT>
|
template <typename MultiLevelGraphT>
|
||||||
inline void writeGraph(const std::filesystem::path &path,
|
inline void writeGraph(const boost::filesystem::path &path,
|
||||||
const MultiLevelGraphT &graph,
|
const MultiLevelGraphT &graph,
|
||||||
const std::uint32_t connectivity_checksum)
|
const std::uint32_t connectivity_checksum)
|
||||||
{
|
{
|
||||||
|
|||||||
@@ -1,8 +1,9 @@
|
|||||||
#ifndef OSRM_PARTITIONER_CONFIG_HPP
|
#ifndef OSRM_PARTITIONER_CONFIG_HPP
|
||||||
#define OSRM_PARTITIONER_CONFIG_HPP
|
#define OSRM_PARTITIONER_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"
|
||||||
@@ -28,7 +29,7 @@ struct PartitionerConfig final : storage::IOConfig
|
|||||||
{
|
{
|
||||||
}
|
}
|
||||||
|
|
||||||
void UseDefaultOutputNames(const std::filesystem::path &base)
|
void UseDefaultOutputNames(const boost::filesystem::path &base)
|
||||||
{
|
{
|
||||||
IOConfig::UseDefaultOutputNames(base);
|
IOConfig::UseDefaultOutputNames(base);
|
||||||
}
|
}
|
||||||
|
|||||||
Some files were not shown because too many files have changed in this diff Show More
Reference in New Issue
Block a user