Merge remote-tracking branch 'origin/master' into oxidize_cucumber
This commit is contained in:
commit
eb15e5bde4
13
.clang-tidy
13
.clang-tidy
@ -13,6 +13,11 @@ Checks: >
|
|||||||
-bugprone-forward-declaration-namespace,
|
-bugprone-forward-declaration-namespace,
|
||||||
-bugprone-sizeof-expression,
|
-bugprone-sizeof-expression,
|
||||||
-bugprone-throw-keyword-missing,
|
-bugprone-throw-keyword-missing,
|
||||||
|
-bugprone-chained-comparison,
|
||||||
|
-bugprone-incorrect-enable-if,
|
||||||
|
-bugprone-switch-missing-default-case,
|
||||||
|
-bugprone-empty-catch,
|
||||||
|
-bugprone-unchecked-optional-access,
|
||||||
-clang-analyzer-*,
|
-clang-analyzer-*,
|
||||||
-clang-diagnostic-deprecated-declarations,
|
-clang-diagnostic-deprecated-declarations,
|
||||||
-clang-diagnostic-constant-conversion,
|
-clang-diagnostic-constant-conversion,
|
||||||
@ -49,11 +54,13 @@ Checks: >
|
|||||||
-misc-misplaced-const,
|
-misc-misplaced-const,
|
||||||
-misc-definitions-in-headers,
|
-misc-definitions-in-headers,
|
||||||
-misc-unused-parameters,
|
-misc-unused-parameters,
|
||||||
|
-misc-include-cleaner,
|
||||||
modernize-concat-nested-namespaces,
|
modernize-concat-nested-namespaces,
|
||||||
modernize-use-using,
|
modernize-use-using,
|
||||||
performance-*,
|
performance-*,
|
||||||
-performance-noexcept-move-constructor,
|
|
||||||
-performance-no-int-to-ptr,
|
-performance-no-int-to-ptr,
|
||||||
|
-performance-enum-size,
|
||||||
|
-performance-avoid-endl,
|
||||||
readability-*,
|
readability-*,
|
||||||
-readability-avoid-const-params-in-decls,
|
-readability-avoid-const-params-in-decls,
|
||||||
-readability-braces-around-statements,
|
-readability-braces-around-statements,
|
||||||
@ -82,6 +89,10 @@ Checks: >
|
|||||||
-readability-make-member-function-const,
|
-readability-make-member-function-const,
|
||||||
-readability-redundant-string-init,
|
-readability-redundant-string-init,
|
||||||
-readability-non-const-parameter,
|
-readability-non-const-parameter,
|
||||||
|
-readability-redundant-inline-specifier,
|
||||||
|
-readability-avoid-nested-conditional-operator,
|
||||||
|
-readability-avoid-return-with-void-value,
|
||||||
|
-readability-redundant-casting,
|
||||||
-readability-static-accessed-through-instance
|
-readability-static-accessed-through-instance
|
||||||
|
|
||||||
WarningsAsErrors: '*'
|
WarningsAsErrors: '*'
|
||||||
|
20
.github/workflows/osrm-backend-docker.yml
vendored
20
.github/workflows/osrm-backend-docker.yml
vendored
@ -6,6 +6,9 @@ on:
|
|||||||
|
|
||||||
jobs:
|
jobs:
|
||||||
publish:
|
publish:
|
||||||
|
strategy:
|
||||||
|
matrix:
|
||||||
|
docker-base-image: ["debian", "alpine"]
|
||||||
runs-on: ubuntu-latest
|
runs-on: ubuntu-latest
|
||||||
steps:
|
steps:
|
||||||
- name: Check out the repo
|
- name: Check out the repo
|
||||||
@ -53,10 +56,10 @@ jobs:
|
|||||||
with:
|
with:
|
||||||
push: true
|
push: true
|
||||||
platforms: linux/amd64,linux/arm64
|
platforms: linux/amd64,linux/arm64
|
||||||
file: ./docker/Dockerfile
|
file: ./docker/Dockerfile-${{ matrix.docker-base-image }}
|
||||||
tags: ${{ steps.metadebug.outputs.tags }}
|
tags: ${{ steps.metadebug.outputs.tags }}
|
||||||
build-args: |
|
build-args: |
|
||||||
DOCKER_TAG=${{ join(steps.metadebug.outputs.tags ) }}
|
DOCKER_TAG=${{ join(steps.metadebug.outputs.tags ) }}-${{ matrix.docker-base-image }}
|
||||||
|
|
||||||
|
|
||||||
- name: Build container image - assertions
|
- name: Build container image - assertions
|
||||||
@ -64,10 +67,10 @@ jobs:
|
|||||||
with:
|
with:
|
||||||
push: true
|
push: true
|
||||||
platforms: linux/amd64,linux/arm64
|
platforms: linux/amd64,linux/arm64
|
||||||
file: ./docker/Dockerfile
|
file: ./docker/Dockerfile-${{ matrix.docker-base-image }}
|
||||||
tags: ${{ steps.metaassertions.outputs.tags }}
|
tags: ${{ steps.metaassertions.outputs.tags }}
|
||||||
build-args: |
|
build-args: |
|
||||||
DOCKER_TAG=${{ join(steps.metaassertions.outputs.tags ) }}
|
DOCKER_TAG=${{ join(steps.metaassertions.outputs.tags ) }}-${{ matrix.docker-base-image }}
|
||||||
|
|
||||||
# build and publish "normal" image as last to get it listed on top
|
# build and publish "normal" image as last to get it listed on top
|
||||||
- name: Build container image - normal
|
- name: Build container image - normal
|
||||||
@ -75,10 +78,7 @@ jobs:
|
|||||||
with:
|
with:
|
||||||
push: true
|
push: true
|
||||||
platforms: linux/amd64,linux/arm64
|
platforms: linux/amd64,linux/arm64
|
||||||
file: ./docker/Dockerfile
|
file: ./docker/Dockerfile-${{ matrix.docker-base-image }}
|
||||||
tags: ${{ steps.meta.outputs.tags }}
|
tags: ${{ steps.meta.outputs.tags }}
|
||||||
build-args: |
|
build-args: |
|
||||||
DOCKER_TAG=${{ join(steps.meta.outputs.tags ) }}
|
DOCKER_TAG=${{ join(steps.meta.outputs.tags ) }}-${{ matrix.docker-base-image }}
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
228
.github/workflows/osrm-backend.yml
vendored
228
.github/workflows/osrm-backend.yml
vendored
@ -46,15 +46,32 @@ jobs:
|
|||||||
echo PUBLISH=$([[ "${GITHUB_REF:-}" == "refs/tags/v${PACKAGE_JSON_VERSION}" ]] && echo "On" || echo "Off") >> $GITHUB_ENV
|
echo PUBLISH=$([[ "${GITHUB_REF:-}" == "refs/tags/v${PACKAGE_JSON_VERSION}" ]] && echo "On" || echo "Off") >> $GITHUB_ENV
|
||||||
- run: npm install --ignore-scripts
|
- run: npm install --ignore-scripts
|
||||||
- run: npm link --ignore-scripts
|
- run: npm link --ignore-scripts
|
||||||
- uses: microsoft/setup-msbuild@v2
|
|
||||||
- name: Build
|
- name: Build
|
||||||
run: |
|
|
||||||
.\scripts\ci\windows-build.bat
|
|
||||||
- name: Run node tests
|
|
||||||
shell: bash
|
shell: bash
|
||||||
run: |
|
run: |
|
||||||
./lib/binding/osrm-datastore.exe test/data/ch/monaco.osrm
|
mkdir build
|
||||||
node test/nodejs/index.js
|
cd build
|
||||||
|
cmake -DCMAKE_BUILD_TYPE=Release -DENABLE_CONAN=ON -DENABLE_NODE_BINDINGS=ON ..
|
||||||
|
cmake --build . --config Release
|
||||||
|
|
||||||
|
# TODO: MSVC goes out of memory when building our tests
|
||||||
|
# - name: Run tests
|
||||||
|
# shell: bash
|
||||||
|
# run: |
|
||||||
|
# cd build
|
||||||
|
# cmake --build . --config Release --target tests
|
||||||
|
# # TODO: run tests
|
||||||
|
# - name: Run node tests
|
||||||
|
# shell: bash
|
||||||
|
# run: |
|
||||||
|
# ./lib/binding/osrm-extract.exe -p profiles/car.lua test/data/monaco.osm.pbf
|
||||||
|
|
||||||
|
# mkdir -p test/data/ch
|
||||||
|
# cp test/data/monaco.osrm* test/data/ch/
|
||||||
|
# ./lib/binding/osrm-contract.exe test/data/ch/monaco.osrm
|
||||||
|
|
||||||
|
# ./lib/binding/osrm-datastore.exe test/data/ch/monaco.osrm
|
||||||
|
# node test/nodejs/index.js
|
||||||
- name: Build Node package
|
- name: Build Node package
|
||||||
shell: bash
|
shell: bash
|
||||||
run: ./scripts/ci/node_package.sh
|
run: ./scripts/ci/node_package.sh
|
||||||
@ -99,7 +116,10 @@ jobs:
|
|||||||
npm run docs && ./scripts/error_on_dirty.sh
|
npm run docs && ./scripts/error_on_dirty.sh
|
||||||
npm audit --production
|
npm audit --production
|
||||||
|
|
||||||
docker-image:
|
docker-image-matrix:
|
||||||
|
strategy:
|
||||||
|
matrix:
|
||||||
|
docker-base-image: ["debian", "alpine"]
|
||||||
needs: format-taginfo-docs
|
needs: format-taginfo-docs
|
||||||
runs-on: ubuntu-22.04
|
runs-on: ubuntu-22.04
|
||||||
continue-on-error: false
|
continue-on-error: false
|
||||||
@ -115,7 +135,7 @@ jobs:
|
|||||||
v1-berlin-osm-pbf
|
v1-berlin-osm-pbf
|
||||||
- name: Docker build
|
- name: Docker build
|
||||||
run: |
|
run: |
|
||||||
docker build -t osrm-backend-local -f docker/Dockerfile .
|
docker build -t osrm-backend-local -f docker/Dockerfile-${{ matrix.docker-base-image }} .
|
||||||
- name: Test Docker image
|
- name: Test Docker image
|
||||||
run: |
|
run: |
|
||||||
if [ ! -f "${PWD}/berlin-latest.osm.pbf" ]; then
|
if [ ! -f "${PWD}/berlin-latest.osm.pbf" ]; then
|
||||||
@ -132,7 +152,6 @@ jobs:
|
|||||||
>&2 echo "No berlin-latest.geojson found"
|
>&2 echo "No berlin-latest.geojson found"
|
||||||
exit 1
|
exit 1
|
||||||
fi
|
fi
|
||||||
|
|
||||||
# removing `.osrm.nbg` to check that whole pipeline works without it
|
# removing `.osrm.nbg` to check that whole pipeline works without it
|
||||||
rm -rf "${PWD}/berlin-latest.osrm.nbg"
|
rm -rf "${PWD}/berlin-latest.osrm.nbg"
|
||||||
|
|
||||||
@ -158,91 +177,98 @@ jobs:
|
|||||||
CXXCOMPILER: g++-13
|
CXXCOMPILER: g++-13
|
||||||
ENABLE_COVERAGE: ON
|
ENABLE_COVERAGE: ON
|
||||||
|
|
||||||
- name: clang-15-debug-asan-ubsan
|
- name: clang-18-debug-asan-ubsan
|
||||||
continue-on-error: false
|
continue-on-error: false
|
||||||
node: 20
|
node: 20
|
||||||
runs-on: ubuntu-22.04
|
runs-on: ubuntu-24.04
|
||||||
BUILD_TOOLS: ON
|
BUILD_TOOLS: ON
|
||||||
BUILD_TYPE: Debug
|
BUILD_TYPE: Debug
|
||||||
CCOMPILER: clang-15
|
CCOMPILER: clang-18
|
||||||
CUCUMBER_TIMEOUT: 20000
|
CUCUMBER_TIMEOUT: 20000
|
||||||
CXXCOMPILER: clang++-15
|
CXXCOMPILER: clang++-18
|
||||||
ENABLE_SANITIZER: ON
|
ENABLE_SANITIZER: ON
|
||||||
TARGET_ARCH: x86_64-asan-ubsan
|
TARGET_ARCH: x86_64-asan-ubsan
|
||||||
OSRM_CONNECTION_RETRIES: 10
|
OSRM_CONNECTION_RETRIES: 10
|
||||||
OSRM_CONNECTION_EXP_BACKOFF_COEF: 1.5
|
OSRM_CONNECTION_EXP_BACKOFF_COEF: 1.5
|
||||||
|
|
||||||
- name: clang-15-release
|
- name: clang-18-release
|
||||||
continue-on-error: false
|
continue-on-error: false
|
||||||
node: 18
|
node: 18
|
||||||
runs-on: ubuntu-22.04
|
runs-on: ubuntu-24.04
|
||||||
BUILD_TOOLS: ON
|
BUILD_TOOLS: ON
|
||||||
BUILD_TYPE: Release
|
BUILD_TYPE: Release
|
||||||
CCOMPILER: clang-15
|
CCOMPILER: clang-18
|
||||||
CXXCOMPILER: clang++-15
|
CXXCOMPILER: clang++-18
|
||||||
CUCUMBER_TIMEOUT: 60000
|
CUCUMBER_TIMEOUT: 60000
|
||||||
|
ENABLE_LTO: OFF
|
||||||
|
|
||||||
- name: clang-15-debug
|
- name: clang-18-debug
|
||||||
continue-on-error: false
|
continue-on-error: false
|
||||||
node: 18
|
node: 18
|
||||||
runs-on: ubuntu-22.04
|
runs-on: ubuntu-24.04
|
||||||
BUILD_TOOLS: ON
|
BUILD_TOOLS: ON
|
||||||
BUILD_TYPE: Debug
|
BUILD_TYPE: Debug
|
||||||
CCOMPILER: clang-15
|
CCOMPILER: clang-18
|
||||||
CXXCOMPILER: clang++-15
|
CXXCOMPILER: clang++-18
|
||||||
CUCUMBER_TIMEOUT: 60000
|
CUCUMBER_TIMEOUT: 60000
|
||||||
|
ENABLE_LTO: OFF
|
||||||
|
|
||||||
- name: clang-15-debug-clang-tidy
|
- name: clang-18-debug-clang-tidy
|
||||||
continue-on-error: false
|
continue-on-error: false
|
||||||
node: 18
|
node: 18
|
||||||
runs-on: ubuntu-22.04
|
runs-on: ubuntu-24.04
|
||||||
BUILD_TOOLS: ON
|
BUILD_TOOLS: ON
|
||||||
BUILD_TYPE: Debug
|
BUILD_TYPE: Debug
|
||||||
CCOMPILER: clang-15
|
CCOMPILER: clang-18
|
||||||
CXXCOMPILER: clang++-15
|
CXXCOMPILER: clang++-18
|
||||||
CUCUMBER_TIMEOUT: 60000
|
CUCUMBER_TIMEOUT: 60000
|
||||||
ENABLE_CLANG_TIDY: ON
|
ENABLE_CLANG_TIDY: ON
|
||||||
|
|
||||||
- name: clang-14-release
|
|
||||||
continue-on-error: false
|
|
||||||
node: 18
|
|
||||||
runs-on: ubuntu-22.04
|
|
||||||
BUILD_TOOLS: ON
|
|
||||||
BUILD_TYPE: Release
|
|
||||||
CCOMPILER: clang-14
|
|
||||||
CXXCOMPILER: clang++-14
|
|
||||||
CUCUMBER_TIMEOUT: 60000
|
|
||||||
|
|
||||||
- name: clang-13-release
|
- name: clang-17-release
|
||||||
continue-on-error: false
|
continue-on-error: false
|
||||||
node: 18
|
node: 18
|
||||||
runs-on: ubuntu-22.04
|
runs-on: ubuntu-24.04
|
||||||
BUILD_TOOLS: ON
|
BUILD_TOOLS: ON
|
||||||
BUILD_TYPE: Release
|
BUILD_TYPE: Release
|
||||||
CCOMPILER: clang-13
|
CCOMPILER: clang-17
|
||||||
CXXCOMPILER: clang++-13
|
CXXCOMPILER: clang++-17
|
||||||
CUCUMBER_TIMEOUT: 60000
|
CUCUMBER_TIMEOUT: 60000
|
||||||
|
ENABLE_LTO: OFF
|
||||||
|
|
||||||
|
- name: clang-16-release
|
||||||
|
continue-on-error: false
|
||||||
|
node: 18
|
||||||
|
runs-on: ubuntu-24.04
|
||||||
|
BUILD_TOOLS: ON
|
||||||
|
BUILD_TYPE: Release
|
||||||
|
CCOMPILER: clang-16
|
||||||
|
CXXCOMPILER: clang++-16
|
||||||
|
CUCUMBER_TIMEOUT: 60000
|
||||||
|
ENABLE_LTO: OFF
|
||||||
|
|
||||||
- name: conan-linux-debug-asan-ubsan
|
- name: conan-linux-debug-asan-ubsan
|
||||||
continue-on-error: false
|
continue-on-error: false
|
||||||
node: 18
|
node: 18
|
||||||
runs-on: ubuntu-22.04
|
runs-on: ubuntu-24.04
|
||||||
BUILD_TOOLS: ON
|
BUILD_TOOLS: ON
|
||||||
BUILD_TYPE: Release
|
BUILD_TYPE: Release
|
||||||
CCOMPILER: clang-15
|
CCOMPILER: clang-18
|
||||||
CXXCOMPILER: clang++-15
|
CXXCOMPILER: clang++-18
|
||||||
ENABLE_CONAN: ON
|
ENABLE_CONAN: ON
|
||||||
ENABLE_SANITIZER: ON
|
ENABLE_SANITIZER: ON
|
||||||
|
ENABLE_LTO: OFF
|
||||||
|
|
||||||
- name: conan-linux-release
|
- name: conan-linux-release
|
||||||
continue-on-error: false
|
continue-on-error: false
|
||||||
node: 18
|
node: 18
|
||||||
runs-on: ubuntu-22.04
|
runs-on: ubuntu-24.04
|
||||||
BUILD_TOOLS: ON
|
BUILD_TOOLS: ON
|
||||||
BUILD_TYPE: Release
|
BUILD_TYPE: Release
|
||||||
CCOMPILER: clang-15
|
CCOMPILER: clang-18
|
||||||
CXXCOMPILER: clang++-15
|
CXXCOMPILER: clang++-18
|
||||||
ENABLE_CONAN: ON
|
ENABLE_CONAN: ON
|
||||||
|
ENABLE_LTO: OFF
|
||||||
|
|
||||||
- name: gcc-14-release
|
- name: gcc-14-release
|
||||||
continue-on-error: false
|
continue-on-error: false
|
||||||
@ -278,10 +304,10 @@ jobs:
|
|||||||
build_node_package: true
|
build_node_package: true
|
||||||
continue-on-error: false
|
continue-on-error: false
|
||||||
node: 20
|
node: 20
|
||||||
runs-on: ubuntu-22.04
|
runs-on: ubuntu-24.04
|
||||||
BUILD_TYPE: Release
|
BUILD_TYPE: Release
|
||||||
CCOMPILER: clang-13
|
CCOMPILER: clang-16
|
||||||
CXXCOMPILER: clang++-13
|
CXXCOMPILER: clang++-16
|
||||||
ENABLE_CONAN: ON
|
ENABLE_CONAN: ON
|
||||||
NODE_PACKAGE_TESTS_ONLY: ON
|
NODE_PACKAGE_TESTS_ONLY: ON
|
||||||
|
|
||||||
@ -289,10 +315,10 @@ jobs:
|
|||||||
build_node_package: true
|
build_node_package: true
|
||||||
continue-on-error: false
|
continue-on-error: false
|
||||||
node: 20
|
node: 20
|
||||||
runs-on: ubuntu-22.04
|
runs-on: ubuntu-24.04
|
||||||
BUILD_TYPE: Debug
|
BUILD_TYPE: Debug
|
||||||
CCOMPILER: clang-13
|
CCOMPILER: clang-16
|
||||||
CXXCOMPILER: clang++-13
|
CXXCOMPILER: clang++-16
|
||||||
ENABLE_CONAN: ON
|
ENABLE_CONAN: ON
|
||||||
NODE_PACKAGE_TESTS_ONLY: ON
|
NODE_PACKAGE_TESTS_ONLY: ON
|
||||||
|
|
||||||
@ -341,6 +367,7 @@ 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@v4
|
||||||
- name: Build machine architecture
|
- name: Build machine architecture
|
||||||
@ -377,12 +404,11 @@ jobs:
|
|||||||
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
|
echo "CCACHE_DIR=$HOME/.ccache" >> $GITHUB_ENV
|
||||||
mkdir -p $HOME/.ccache
|
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
|
||||||
@ -469,6 +495,13 @@ 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}
|
||||||
@ -490,7 +523,7 @@ jobs:
|
|||||||
run: |
|
run: |
|
||||||
echo "Using ${JOBS} jobs"
|
echo "Using ${JOBS} jobs"
|
||||||
pushd ${OSRM_BUILD_DIR}
|
pushd ${OSRM_BUILD_DIR}
|
||||||
|
|
||||||
ccache --zero-stats
|
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} \
|
||||||
@ -502,12 +535,14 @@ jobs:
|
|||||||
-DENABLE_SANITIZER=${ENABLE_SANITIZER:-OFF} \
|
-DENABLE_SANITIZER=${ENABLE_SANITIZER:-OFF} \
|
||||||
-DBUILD_TOOLS=${BUILD_TOOLS:-OFF} \
|
-DBUILD_TOOLS=${BUILD_TOOLS:-OFF} \
|
||||||
-DENABLE_CCACHE=ON \
|
-DENABLE_CCACHE=ON \
|
||||||
|
-DENABLE_LTO=${ENABLE_LTO:-ON} \
|
||||||
-DCMAKE_INSTALL_PREFIX=${OSRM_INSTALL_DIR}
|
-DCMAKE_INSTALL_PREFIX=${OSRM_INSTALL_DIR}
|
||||||
make --jobs=${JOBS}
|
make --jobs=${JOBS}
|
||||||
|
|
||||||
if [[ "${NODE_PACKAGE_TESTS_ONLY}" != "ON" ]]; then
|
if [[ "${NODE_PACKAGE_TESTS_ONLY}" != "ON" ]]; then
|
||||||
make tests --jobs=${JOBS}
|
make tests --jobs=${JOBS}
|
||||||
make benchmarks --jobs=${JOBS}
|
make benchmarks --jobs=${JOBS}
|
||||||
|
|
||||||
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
|
||||||
@ -618,16 +653,25 @@ jobs:
|
|||||||
benchmarks:
|
benchmarks:
|
||||||
if: github.event_name == 'pull_request'
|
if: github.event_name == 'pull_request'
|
||||||
needs: [format-taginfo-docs]
|
needs: [format-taginfo-docs]
|
||||||
runs-on: ubuntu-22.04
|
runs-on: ubuntu-24.04
|
||||||
env:
|
env:
|
||||||
CCOMPILER: clang-13
|
CCOMPILER: clang-16
|
||||||
CXXCOMPILER: clang++-13
|
CXXCOMPILER: clang++-16
|
||||||
CC: clang-13
|
CC: clang-16
|
||||||
CXX: clang++-13
|
CXX: clang++-16
|
||||||
GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }}
|
GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }}
|
||||||
PR_NUMBER: ${{ github.event.pull_request.number }}
|
PR_NUMBER: ${{ github.event.pull_request.number }}
|
||||||
GITHUB_REPOSITORY: ${{ github.repository }}
|
GITHUB_REPOSITORY: ${{ github.repository }}
|
||||||
|
RUN_BIG_BENCHMARK: ${{ contains(github.event.pull_request.labels.*.name, 'Performance') }}
|
||||||
steps:
|
steps:
|
||||||
|
- name: Enable 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@v4
|
||||||
with:
|
with:
|
||||||
@ -648,24 +692,29 @@ jobs:
|
|||||||
ref: ${{ github.head_ref }}
|
ref: ${{ github.head_ref }}
|
||||||
path: pr
|
path: pr
|
||||||
- name: Install dependencies
|
- name: Install dependencies
|
||||||
run: |
|
run: |
|
||||||
python3 -m pip install "conan<2.0.0" "requests==2.31.0"
|
python3 -m pip install "conan<2.0.0" "requests==2.31.0" "numpy==1.26.4" --break-system-packages
|
||||||
sudo apt-get update -y && sudo apt-get install ccache
|
sudo apt-get update -y && sudo apt-get install ccache
|
||||||
|
- name: Prepare data
|
||||||
|
run: |
|
||||||
|
if [ "$RUN_BIG_BENCHMARK" = "true" ]; then
|
||||||
|
rm -rf ~/data.osm.pbf
|
||||||
|
wget http://download.geofabrik.de/europe/poland-latest.osm.pbf -O ~/data.osm.pbf --quiet
|
||||||
|
gunzip -c ./pr/test/data/poland_gps_traces.csv.gz > ~/gps_traces.csv
|
||||||
|
else
|
||||||
|
if [ ! -f "~/data.osm.pbf" ]; then
|
||||||
|
wget http://download.geofabrik.de/europe/germany/berlin-latest.osm.pbf -O ~/data.osm.pbf
|
||||||
|
else
|
||||||
|
echo "Using cached data.osm.pbf"
|
||||||
|
fi
|
||||||
|
gunzip -c ./pr/test/data/berlin_gps_traces.csv.gz > ~/gps_traces.csv
|
||||||
|
fi
|
||||||
- name: Prepare environment
|
- name: Prepare environment
|
||||||
run: |
|
run: |
|
||||||
echo "CCACHE_DIR=$HOME/.ccache" >> $GITHUB_ENV
|
echo "CCACHE_DIR=$HOME/.ccache" >> $GITHUB_ENV
|
||||||
mkdir -p $HOME/.ccache
|
mkdir -p $HOME/.ccache
|
||||||
ccache --zero-stats
|
ccache --zero-stats
|
||||||
ccache --max-size=256M
|
ccache --max-size=256M
|
||||||
- name: Build PR Branch
|
|
||||||
run: |
|
|
||||||
mkdir -p pr/build
|
|
||||||
cd pr/build
|
|
||||||
cmake -DENABLE_CONAN=ON -DCMAKE_BUILD_TYPE=Release ..
|
|
||||||
make -j$(nproc)
|
|
||||||
make -j$(nproc) benchmarks
|
|
||||||
cd ..
|
|
||||||
make -C test/data
|
|
||||||
- name: Checkout Base Branch
|
- name: Checkout Base Branch
|
||||||
uses: actions/checkout@v4
|
uses: actions/checkout@v4
|
||||||
with:
|
with:
|
||||||
@ -680,9 +729,43 @@ jobs:
|
|||||||
make -j$(nproc) benchmarks
|
make -j$(nproc) benchmarks
|
||||||
cd ..
|
cd ..
|
||||||
make -C test/data
|
make -C test/data
|
||||||
- name: Run Benchmarks
|
- name: Build PR Branch
|
||||||
run: |
|
run: |
|
||||||
./pr/scripts/ci/run_benchmarks.sh base pr
|
mkdir -p pr/build
|
||||||
|
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
|
||||||
@ -693,6 +776,7 @@ jobs:
|
|||||||
|
|
||||||
ci-complete:
|
ci-complete:
|
||||||
runs-on: ubuntu-22.04
|
runs-on: ubuntu-22.04
|
||||||
needs: [build-test-publish, docker-image, windows-release-node, benchmarks]
|
needs: [build-test-publish, docker-image-matrix, windows-release-node, benchmarks]
|
||||||
steps:
|
steps:
|
||||||
- run: echo "CI complete"
|
- run: echo "CI complete"
|
||||||
|
|
||||||
|
29
.github/workflows/stale.yml
vendored
Normal file
29
.github/workflows/stale.yml
vendored
Normal file
@ -0,0 +1,29 @@
|
|||||||
|
name: 'Close stale issues'
|
||||||
|
on:
|
||||||
|
# NOTE: uncomment if you want to test changes to this file in PRs CI
|
||||||
|
# pull_request:
|
||||||
|
# branches:
|
||||||
|
# - master
|
||||||
|
schedule:
|
||||||
|
- cron: '30 1 * * *' # every day at 1:30am
|
||||||
|
permissions:
|
||||||
|
issues: write
|
||||||
|
pull-requests: write
|
||||||
|
|
||||||
|
jobs:
|
||||||
|
stale:
|
||||||
|
runs-on: ubuntu-24.04
|
||||||
|
steps:
|
||||||
|
- uses: actions/stale@v9
|
||||||
|
with:
|
||||||
|
operations-per-run: 3000
|
||||||
|
stale-issue-message: 'This issue seems to be stale. It will be closed in 30 days if no further activity occurs.'
|
||||||
|
stale-pr-message: 'This PR seems to be stale. Is it still relevant?'
|
||||||
|
days-before-issue-stale: 180 # 6 months
|
||||||
|
days-before-issue-close: 30 # 1 month
|
||||||
|
days-before-pr-stale: 180 # 6 months
|
||||||
|
days-before-pr-close: -1 # never close PRs
|
||||||
|
exempt-issue-labels: 'Do Not Stale,Feature Request,Performance,Bug Report,CI,Starter Task,Refactor,Guidance'
|
||||||
|
|
||||||
|
|
||||||
|
|
21
CHANGELOG.md
21
CHANGELOG.md
@ -8,6 +8,7 @@
|
|||||||
- 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: 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: 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)
|
- CHANGED: Remove outdated warnings #6894 [#6894](https://github.com/Project-OSRM/osrm-backend/pull/6894)
|
||||||
@ -23,6 +24,25 @@
|
|||||||
- 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: 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 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: 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: Get rid of boost::math::constants::* and M_PI in favor of std::numbers. [#6916](https://github.com/Project-OSRM/osrm-backend/pull/6916)
|
||||||
@ -33,6 +53,7 @@
|
|||||||
- CHANGED: Avoid copy of std::function-based callback in path unpacking [#6895](https://github.com/Project-OSRM/osrm-backend/pull/6895)
|
- 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: 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: 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)
|
||||||
|
@ -31,11 +31,12 @@ option(ENABLE_ASSERTIONS "Use assertions in release mode" OFF)
|
|||||||
option(ENABLE_DEBUG_LOGGING "Use debug logging in release mode" OFF)
|
option(ENABLE_DEBUG_LOGGING "Use debug logging in release mode" OFF)
|
||||||
option(ENABLE_COVERAGE "Build with coverage instrumentalisation" OFF)
|
option(ENABLE_COVERAGE "Build with coverage instrumentalisation" OFF)
|
||||||
option(ENABLE_SANITIZER "Use memory sanitizer for Debug build" OFF)
|
option(ENABLE_SANITIZER "Use memory sanitizer for Debug build" OFF)
|
||||||
option(ENABLE_LTO "Use LTO if available" OFF)
|
option(ENABLE_LTO "Use Link Time Optimisation" ON)
|
||||||
option(ENABLE_FUZZING "Fuzz testing using LLVM's libFuzzer" OFF)
|
option(ENABLE_FUZZING "Fuzz testing using LLVM's libFuzzer" OFF)
|
||||||
option(ENABLE_NODE_BINDINGS "Build NodeJs bindings" OFF)
|
option(ENABLE_NODE_BINDINGS "Build NodeJs bindings" OFF)
|
||||||
option(ENABLE_CLANG_TIDY "Enables clang-tidy checks" OFF)
|
option(ENABLE_CLANG_TIDY "Enables clang-tidy checks" OFF)
|
||||||
|
|
||||||
|
|
||||||
if (ENABLE_CLANG_TIDY)
|
if (ENABLE_CLANG_TIDY)
|
||||||
find_program(CLANG_TIDY_COMMAND NAMES clang-tidy)
|
find_program(CLANG_TIDY_COMMAND NAMES clang-tidy)
|
||||||
if(NOT CLANG_TIDY_COMMAND)
|
if(NOT CLANG_TIDY_COMMAND)
|
||||||
@ -57,6 +58,18 @@ if (POLICY CMP0074)
|
|||||||
endif()
|
endif()
|
||||||
project(OSRM C CXX)
|
project(OSRM C CXX)
|
||||||
|
|
||||||
|
|
||||||
|
if(ENABLE_LTO AND (CMAKE_BUILD_TYPE MATCHES Release OR CMAKE_BUILD_TYPE MATCHES MinRelSize OR CMAKE_BUILD_TYPE MATCHES RelWithDebInfo))
|
||||||
|
include(CheckIPOSupported)
|
||||||
|
check_ipo_supported(RESULT LTO_SUPPORTED OUTPUT error)
|
||||||
|
if(LTO_SUPPORTED)
|
||||||
|
message(STATUS "IPO / LTO enabled")
|
||||||
|
set(CMAKE_INTERPROCEDURAL_OPTIMIZATION TRUE)
|
||||||
|
else()
|
||||||
|
message(FATAL_ERROR "IPO / LTO not supported: <${error}>")
|
||||||
|
endif()
|
||||||
|
endif()
|
||||||
|
|
||||||
# add @loader_path/$ORIGIN to rpath to make binaries relocatable
|
# add @loader_path/$ORIGIN to rpath to make binaries relocatable
|
||||||
if (APPLE)
|
if (APPLE)
|
||||||
set(CMAKE_BUILD_RPATH "@loader_path")
|
set(CMAKE_BUILD_RPATH "@loader_path")
|
||||||
@ -122,7 +135,7 @@ 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/include)
|
||||||
|
|
||||||
set(BOOST_COMPONENTS date_time chrono filesystem iostreams program_options regex system thread unit_test_framework)
|
set(BOOST_COMPONENTS date_time iostreams program_options thread unit_test_framework)
|
||||||
|
|
||||||
configure_file(
|
configure_file(
|
||||||
${CMAKE_CURRENT_SOURCE_DIR}/include/util/version.hpp.in
|
${CMAKE_CURRENT_SOURCE_DIR}/include/util/version.hpp.in
|
||||||
@ -208,17 +221,6 @@ if(CMAKE_CXX_COMPILER_ID MATCHES "GNU")
|
|||||||
set(CMAKE_CXX_FLAGS_DEBUG "${CMAKE_CXX_FLAGS_DEBUG} -Og -ggdb")
|
set(CMAKE_CXX_FLAGS_DEBUG "${CMAKE_CXX_FLAGS_DEBUG} -Og -ggdb")
|
||||||
endif()
|
endif()
|
||||||
|
|
||||||
if(ENABLE_LTO AND (CMAKE_BUILD_TYPE MATCHES Release OR CMAKE_BUILD_TYPE MATCHES MinRelSize OR CMAKE_BUILD_TYPE MATCHES RelWithDebInfo))
|
|
||||||
include(CheckIPOSupported)
|
|
||||||
check_ipo_supported(RESULT LTO_SUPPORTED OUTPUT error)
|
|
||||||
if(LTO_SUPPORTED)
|
|
||||||
message(STATUS "IPO / LTO enabled")
|
|
||||||
set(CMAKE_INTERPROCEDURAL_OPTIMIZATION TRUE)
|
|
||||||
else()
|
|
||||||
message(WARNING "IPO / LTO not supported: <${error}>")
|
|
||||||
endif()
|
|
||||||
endif()
|
|
||||||
|
|
||||||
set(MAYBE_COVERAGE_LIBRARIES "")
|
set(MAYBE_COVERAGE_LIBRARIES "")
|
||||||
if (ENABLE_COVERAGE)
|
if (ENABLE_COVERAGE)
|
||||||
if (NOT CMAKE_BUILD_TYPE MATCHES "Debug")
|
if (NOT CMAKE_BUILD_TYPE MATCHES "Debug")
|
||||||
@ -290,6 +292,7 @@ include_directories(SYSTEM ${MICROTAR_INCLUDE_DIR})
|
|||||||
|
|
||||||
add_library(MICROTAR OBJECT "${CMAKE_CURRENT_SOURCE_DIR}/third_party/microtar/src/microtar.c")
|
add_library(MICROTAR OBJECT "${CMAKE_CURRENT_SOURCE_DIR}/third_party/microtar/src/microtar.c")
|
||||||
set_property(TARGET MICROTAR PROPERTY POSITION_INDEPENDENT_CODE ON)
|
set_property(TARGET MICROTAR PROPERTY POSITION_INDEPENDENT_CODE ON)
|
||||||
|
|
||||||
target_no_warning(MICROTAR unused-variable)
|
target_no_warning(MICROTAR unused-variable)
|
||||||
target_no_warning(MICROTAR format)
|
target_no_warning(MICROTAR format)
|
||||||
|
|
||||||
@ -330,20 +333,12 @@ if(ENABLE_CONAN)
|
|||||||
|
|
||||||
set(CONAN_BOOST_VERSION "1.85.0@#14265ec82b25d91305bbb3b30d3357f8")
|
set(CONAN_BOOST_VERSION "1.85.0@#14265ec82b25d91305bbb3b30d3357f8")
|
||||||
set(CONAN_BZIP2_VERSION "1.0.8@#d1b2d5816f25865acf978501dff1f897")
|
set(CONAN_BZIP2_VERSION "1.0.8@#d1b2d5816f25865acf978501dff1f897")
|
||||||
set(CONAN_EXPAT_VERSION "2.2.10@#916908d4a570ad839edd25322c3268cd")
|
set(CONAN_EXPAT_VERSION "2.6.2@#2d385d0d50eb5561006a7ff9e356656b")
|
||||||
set(CONAN_LUA_VERSION "5.4.4@#3ec62efc37cd0a5d80b9e5cb35277360")
|
set(CONAN_LUA_VERSION "5.4.6@#658d6089093cf01992c2737ab2e96763")
|
||||||
set(CONAN_TBB_VERSION "2021.3.0@#507ec17cbd51a84167e143b20d170eea")
|
set(CONAN_TBB_VERSION "2021.12.0@#e56e5b44be8d690530585dd3634c0106")
|
||||||
|
|
||||||
set(CONAN_SYSTEM_INCLUDES ON)
|
set(CONAN_SYSTEM_INCLUDES ON)
|
||||||
|
|
||||||
# TODO:
|
|
||||||
# if we link TBB dynamically osrm-extract.exe finishes on the first access to any TBB symbol
|
|
||||||
# with exit code = -1073741515, which means that program cannot load required DLL.
|
|
||||||
if (MSVC)
|
|
||||||
set(TBB_SHARED False)
|
|
||||||
else()
|
|
||||||
set(TBB_SHARED True)
|
|
||||||
endif()
|
|
||||||
|
|
||||||
set(CONAN_ARGS
|
set(CONAN_ARGS
|
||||||
REQUIRES
|
REQUIRES
|
||||||
@ -356,9 +351,7 @@ if(ENABLE_CONAN)
|
|||||||
GENERATORS cmake_find_package json # json generator generates a conanbuildinfo.json in the build folder so (non-CMake) projects can easily parse OSRM's dependencies
|
GENERATORS cmake_find_package json # json generator generates a conanbuildinfo.json in the build folder so (non-CMake) projects can easily parse OSRM's dependencies
|
||||||
KEEP_RPATHS
|
KEEP_RPATHS
|
||||||
NO_OUTPUT_DIRS
|
NO_OUTPUT_DIRS
|
||||||
OPTIONS boost:filesystem_version=3 # https://stackoverflow.com/questions/73392648/error-with-boost-filesystem-version-in-cmake
|
OPTIONS boost:without_stacktrace=True # Apple Silicon cross-compilation fails without it
|
||||||
onetbb:shared=${TBB_SHARED}
|
|
||||||
boost:without_stacktrace=True # Apple Silicon cross-compilation fails without it
|
|
||||||
BUILD missing
|
BUILD missing
|
||||||
)
|
)
|
||||||
|
|
||||||
@ -387,14 +380,10 @@ if(ENABLE_CONAN)
|
|||||||
set(Boost_USE_STATIC_LIBS ON)
|
set(Boost_USE_STATIC_LIBS ON)
|
||||||
find_package(Boost REQUIRED COMPONENTS ${BOOST_COMPONENTS})
|
find_package(Boost REQUIRED COMPONENTS ${BOOST_COMPONENTS})
|
||||||
set(Boost_DATE_TIME_LIBRARY "${Boost_date_time_LIB_TARGETS}")
|
set(Boost_DATE_TIME_LIBRARY "${Boost_date_time_LIB_TARGETS}")
|
||||||
set(Boost_CHRONO_LIBRARY "${Boost_chrono_LIB_TARGETS}")
|
|
||||||
set(Boost_PROGRAM_OPTIONS_LIBRARY "${Boost_program_options_LIB_TARGETS}")
|
set(Boost_PROGRAM_OPTIONS_LIBRARY "${Boost_program_options_LIB_TARGETS}")
|
||||||
set(Boost_FILESYSTEM_LIBRARY "${Boost_filesystem_LIB_TARGETS}")
|
|
||||||
set(Boost_IOSTREAMS_LIBRARY "${Boost_iostreams_LIB_TARGETS}")
|
set(Boost_IOSTREAMS_LIBRARY "${Boost_iostreams_LIB_TARGETS}")
|
||||||
set(Boost_THREAD_LIBRARY "${Boost_thread_LIB_TARGETS}")
|
set(Boost_THREAD_LIBRARY "${Boost_thread_LIB_TARGETS}")
|
||||||
set(Boost_SYSTEM_LIBRARY "${Boost_system_LIB_TARGETS}")
|
|
||||||
set(Boost_ZLIB_LIBRARY "${Boost_zlib_LIB_TARGETS}")
|
set(Boost_ZLIB_LIBRARY "${Boost_zlib_LIB_TARGETS}")
|
||||||
set(Boost_REGEX_LIBRARY "${Boost_regex_LIB_TARGETS}")
|
|
||||||
set(Boost_UNIT_TEST_FRAMEWORK_LIBRARY "${Boost_unit_test_framework_LIB_TARGETS}")
|
set(Boost_UNIT_TEST_FRAMEWORK_LIBRARY "${Boost_unit_test_framework_LIB_TARGETS}")
|
||||||
|
|
||||||
|
|
||||||
@ -467,7 +456,6 @@ add_dependency_includes(${ZLIB_INCLUDE_DIRS})
|
|||||||
|
|
||||||
add_dependency_defines(-DBOOST_SPIRIT_USE_PHOENIX_V3)
|
add_dependency_defines(-DBOOST_SPIRIT_USE_PHOENIX_V3)
|
||||||
add_dependency_defines(-DBOOST_RESULT_OF_USE_DECLTYPE)
|
add_dependency_defines(-DBOOST_RESULT_OF_USE_DECLTYPE)
|
||||||
add_dependency_defines(-DBOOST_FILESYSTEM_NO_DEPRECATED)
|
|
||||||
|
|
||||||
# Workaround for https://github.com/boostorg/phoenix/issues/111
|
# Workaround for https://github.com/boostorg/phoenix/issues/111
|
||||||
add_dependency_defines(-DBOOST_PHOENIX_STL_TUPLE_H_)
|
add_dependency_defines(-DBOOST_PHOENIX_STL_TUPLE_H_)
|
||||||
@ -477,11 +465,8 @@ include_directories(SYSTEM ${DEPENDENCIES_INCLUDE_DIRS})
|
|||||||
|
|
||||||
set(BOOST_BASE_LIBRARIES
|
set(BOOST_BASE_LIBRARIES
|
||||||
${Boost_DATE_TIME_LIBRARY}
|
${Boost_DATE_TIME_LIBRARY}
|
||||||
${Boost_CHRONO_LIBRARY}
|
|
||||||
${Boost_FILESYSTEM_LIBRARY}
|
|
||||||
${Boost_IOSTREAMS_LIBRARY}
|
${Boost_IOSTREAMS_LIBRARY}
|
||||||
${Boost_THREAD_LIBRARY}
|
${Boost_THREAD_LIBRARY})
|
||||||
${Boost_SYSTEM_LIBRARY})
|
|
||||||
|
|
||||||
set(BOOST_ENGINE_LIBRARIES
|
set(BOOST_ENGINE_LIBRARIES
|
||||||
${Boost_ZLIB_LIBRARY}
|
${Boost_ZLIB_LIBRARY}
|
||||||
@ -500,7 +485,6 @@ endif()
|
|||||||
|
|
||||||
set(EXTRACTOR_LIBRARIES
|
set(EXTRACTOR_LIBRARIES
|
||||||
${BZIP2_LIBRARIES}
|
${BZIP2_LIBRARIES}
|
||||||
${Boost_REGEX_LIBRARY}
|
|
||||||
${BOOST_BASE_LIBRARIES}
|
${BOOST_BASE_LIBRARIES}
|
||||||
${CMAKE_THREAD_LIBS_INIT}
|
${CMAKE_THREAD_LIBS_INIT}
|
||||||
${EXPAT_LIBRARIES}
|
${EXPAT_LIBRARIES}
|
||||||
|
@ -55,7 +55,7 @@ function(_get_msvc_ide_version result)
|
|||||||
set(${result} 15 PARENT_SCOPE)
|
set(${result} 15 PARENT_SCOPE)
|
||||||
elseif(NOT MSVC_VERSION VERSION_LESS 1920 AND MSVC_VERSION VERSION_LESS 1930)
|
elseif(NOT MSVC_VERSION VERSION_LESS 1920 AND MSVC_VERSION VERSION_LESS 1930)
|
||||||
set(${result} 16 PARENT_SCOPE)
|
set(${result} 16 PARENT_SCOPE)
|
||||||
elseif(NOT MSVC_VERSION VERSION_LESS 1930 AND MSVC_VERSION VERSION_LESS 1940)
|
elseif(NOT MSVC_VERSION VERSION_LESS 1930 AND MSVC_VERSION VERSION_LESS 1950)
|
||||||
set(${result} 17 PARENT_SCOPE)
|
set(${result} 17 PARENT_SCOPE)
|
||||||
else()
|
else()
|
||||||
message(FATAL_ERROR "Conan: Unknown MSVC compiler version [${MSVC_VERSION}]")
|
message(FATAL_ERROR "Conan: Unknown MSVC compiler version [${MSVC_VERSION}]")
|
||||||
|
@ -64,7 +64,6 @@ add_warning(init-self)
|
|||||||
add_warning(bool-compare)
|
add_warning(bool-compare)
|
||||||
add_warning(logical-not-parentheses)
|
add_warning(logical-not-parentheses)
|
||||||
add_warning(logical-op)
|
add_warning(logical-op)
|
||||||
add_warning(maybe-uninitialized)
|
|
||||||
add_warning(misleading-indentation)
|
add_warning(misleading-indentation)
|
||||||
# `no-` prefix is part of warning name(i.e. doesn't mean we are disabling it)
|
# `no-` prefix is part of warning name(i.e. doesn't mean we are disabling it)
|
||||||
add_warning(no-return-local-addr)
|
add_warning(no-return-local-addr)
|
||||||
@ -84,3 +83,6 @@ no_warning(comma-subscript)
|
|||||||
no_warning(ambiguous-reversed-operator)
|
no_warning(ambiguous-reversed-operator)
|
||||||
no_warning(restrict)
|
no_warning(restrict)
|
||||||
no_warning(free-nonheap-object)
|
no_warning(free-nonheap-object)
|
||||||
|
if(CMAKE_CXX_COMPILER_ID MATCHES "GNU")
|
||||||
|
no_warning(stringop-overflow)
|
||||||
|
endif()
|
@ -1,68 +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" && \
|
|
||||||
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: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-regex1.81.0 \
|
|
||||||
libboost-date-time1.81.0 libboost-chrono1.81.0 libboost-filesystem1.81.0 \
|
|
||||||
libboost-iostreams1.81.0 libboost-system1.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
|
|
1
docker/Dockerfile
Symbolic link
1
docker/Dockerfile
Symbolic link
@ -0,0 +1 @@
|
|||||||
|
Dockerfile-debian
|
62
docker/Dockerfile-alpine
Normal file
62
docker/Dockerfile-alpine
Normal file
@ -0,0 +1,62 @@
|
|||||||
|
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" && \
|
||||||
|
BUILD_TOOLS="Off" && \
|
||||||
|
case ${DOCKER_TAG} in *"-debug"*) BUILD_TYPE="Debug";; esac && \
|
||||||
|
case ${DOCKER_TAG} in *"-assertions"*) BUILD_TYPE="RelWithDebInfo" && ENABLE_ASSERTIONS="On" && BUILD_TOOLS="On";; esac && \
|
||||||
|
echo "Building ${BUILD_TYPE} with ENABLE_ASSERTIONS=${ENABLE_ASSERTIONS} BUILD_TOOLS=${BUILD_TOOLS}" && \
|
||||||
|
cmake .. -DCMAKE_BUILD_TYPE=${BUILD_TYPE} -DENABLE_ASSERTIONS=${ENABLE_ASSERTIONS} -DBUILD_TOOLS=${BUILD_TOOLS} -DENABLE_LTO=OFF && \
|
||||||
|
make -j${NPROC} install && \
|
||||||
|
cd ../profiles && \
|
||||||
|
cp -r * /opt && \
|
||||||
|
strip /usr/local/bin/* && \
|
||||||
|
rm -rf /src
|
||||||
|
|
||||||
|
|
||||||
|
# Multistage build to reduce image size - https://docs.docker.com/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
|
67
docker/Dockerfile-debian
Normal file
67
docker/Dockerfile-debian
Normal file
@ -0,0 +1,67 @@
|
|||||||
|
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" && \
|
||||||
|
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: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
|
6
docker/hooks/build
Normal file → Executable file
6
docker/hooks/build
Normal file → Executable file
@ -6,4 +6,8 @@
|
|||||||
# ensure that "COPY . /src" is referring to the repo root, not the directory
|
# ensure that "COPY . /src" is referring to the repo root, not the directory
|
||||||
# that contains the Dockerfile.
|
# that contains the Dockerfile.
|
||||||
# This script gets executed with a pwd of wherever the Dockerfile is.
|
# This script gets executed with a pwd of wherever the Dockerfile is.
|
||||||
docker build --build-arg BUILD_CONCURRENCY=${CONCURRENCY:-1} --build-arg DOCKER_TAG=${DOCKER_TAG} -t $IMAGE_NAME -f Dockerfile ..
|
|
||||||
|
DOCKER_BUILD="docker build --build-arg BUILD_CONCURRENCY=${CONCURRENCY} --build-arg DOCKER_TAG=${DOCKER_TAG:?unset} -t ${IMAGE_NAME:?unset} -f"
|
||||||
|
|
||||||
|
$DOCKER_BUILD Dockerfile ..
|
||||||
|
$DOCKER_BUILD Dockerfile-alpine ..
|
||||||
|
@ -42,7 +42,7 @@ module.exports = function () {
|
|||||||
this.OSRM_PORT = process.env.OSRM_PORT && parseInt(process.env.OSRM_PORT) || 5000;
|
this.OSRM_PORT = process.env.OSRM_PORT && parseInt(process.env.OSRM_PORT) || 5000;
|
||||||
this.OSRM_IP = process.env.OSRM_IP || '127.0.0.1';
|
this.OSRM_IP = process.env.OSRM_IP || '127.0.0.1';
|
||||||
this.OSRM_CONNECTION_RETRIES = process.env.OSRM_CONNECTION_RETRIES && parseInt(process.env.OSRM_CONNECTION_RETRIES) || 10;
|
this.OSRM_CONNECTION_RETRIES = process.env.OSRM_CONNECTION_RETRIES && parseInt(process.env.OSRM_CONNECTION_RETRIES) || 10;
|
||||||
this.OSRM_CONNECTION_EXP_BACKOFF_COEF = process.env.OSRM_CONNECTION_EXP_BACKOFF_COEF && parseFloat(process.env.OSRM_CONNECTION_EXP_BACKOFF_COEF) || 1.0;
|
this.OSRM_CONNECTION_EXP_BACKOFF_COEF = process.env.OSRM_CONNECTION_EXP_BACKOFF_COEF && parseFloat(process.env.OSRM_CONNECTION_EXP_BACKOFF_COEF) || 1.1;
|
||||||
|
|
||||||
this.HOST = `http://${this.OSRM_IP}:${this.OSRM_PORT}`;
|
this.HOST = `http://${this.OSRM_IP}:${this.OSRM_PORT}`;
|
||||||
|
|
||||||
|
@ -31,8 +31,7 @@ SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
|
|||||||
#include "storage/io_config.hpp"
|
#include "storage/io_config.hpp"
|
||||||
#include "updater/updater_config.hpp"
|
#include "updater/updater_config.hpp"
|
||||||
|
|
||||||
#include <boost/filesystem/path.hpp>
|
#include <filesystem>
|
||||||
|
|
||||||
#include <string>
|
#include <string>
|
||||||
|
|
||||||
namespace osrm::contractor
|
namespace osrm::contractor
|
||||||
@ -47,7 +46,7 @@ struct ContractorConfig final : storage::IOConfig
|
|||||||
}
|
}
|
||||||
|
|
||||||
// Infer the output names from the path of the .osrm file
|
// Infer the output names from the path of the .osrm file
|
||||||
void UseDefaultOutputNames(const boost::filesystem::path &base)
|
void UseDefaultOutputNames(const std::filesystem::path &base)
|
||||||
{
|
{
|
||||||
IOConfig::UseDefaultOutputNames(base);
|
IOConfig::UseDefaultOutputNames(base);
|
||||||
updater_config.UseDefaultOutputNames(base);
|
updater_config.UseDefaultOutputNames(base);
|
||||||
|
@ -9,7 +9,7 @@ namespace osrm::contractor::files
|
|||||||
{
|
{
|
||||||
// reads .osrm.hsgr file
|
// reads .osrm.hsgr file
|
||||||
template <typename ContractedMetricT>
|
template <typename ContractedMetricT>
|
||||||
inline void readGraph(const boost::filesystem::path &path,
|
inline void readGraph(const std::filesystem::path &path,
|
||||||
std::unordered_map<std::string, ContractedMetricT> &metrics,
|
std::unordered_map<std::string, ContractedMetricT> &metrics,
|
||||||
std::uint32_t &connectivity_checksum)
|
std::uint32_t &connectivity_checksum)
|
||||||
{
|
{
|
||||||
@ -30,7 +30,7 @@ inline void readGraph(const boost::filesystem::path &path,
|
|||||||
|
|
||||||
// writes .osrm.hsgr file
|
// writes .osrm.hsgr file
|
||||||
template <typename ContractedMetricT>
|
template <typename ContractedMetricT>
|
||||||
inline void writeGraph(const boost::filesystem::path &path,
|
inline void writeGraph(const std::filesystem::path &path,
|
||||||
const std::unordered_map<std::string, ContractedMetricT> &metrics,
|
const std::unordered_map<std::string, ContractedMetricT> &metrics,
|
||||||
const std::uint32_t connectivity_checksum)
|
const std::uint32_t connectivity_checksum)
|
||||||
{
|
{
|
||||||
|
@ -1,9 +1,8 @@
|
|||||||
#ifndef OSRM_CUSTOMIZE_CUSTOMIZER_CONFIG_HPP
|
#ifndef OSRM_CUSTOMIZE_CUSTOMIZER_CONFIG_HPP
|
||||||
#define OSRM_CUSTOMIZE_CUSTOMIZER_CONFIG_HPP
|
#define OSRM_CUSTOMIZE_CUSTOMIZER_CONFIG_HPP
|
||||||
|
|
||||||
#include <boost/filesystem/path.hpp>
|
|
||||||
|
|
||||||
#include <array>
|
#include <array>
|
||||||
|
#include <filesystem>
|
||||||
#include <string>
|
#include <string>
|
||||||
|
|
||||||
#include "storage/io_config.hpp"
|
#include "storage/io_config.hpp"
|
||||||
@ -27,7 +26,7 @@ struct CustomizationConfig final : storage::IOConfig
|
|||||||
{
|
{
|
||||||
}
|
}
|
||||||
|
|
||||||
void UseDefaultOutputNames(const boost::filesystem::path &base)
|
void UseDefaultOutputNames(const std::filesystem::path &base)
|
||||||
{
|
{
|
||||||
IOConfig::UseDefaultOutputNames(base);
|
IOConfig::UseDefaultOutputNames(base);
|
||||||
updater_config.UseDefaultOutputNames(base);
|
updater_config.UseDefaultOutputNames(base);
|
||||||
|
@ -9,7 +9,7 @@
|
|||||||
|
|
||||||
#include "storage/shared_memory_ownership.hpp"
|
#include "storage/shared_memory_ownership.hpp"
|
||||||
|
|
||||||
#include <boost/filesystem/path.hpp>
|
#include <filesystem>
|
||||||
|
|
||||||
namespace osrm::customizer
|
namespace osrm::customizer
|
||||||
{
|
{
|
||||||
|
@ -14,7 +14,7 @@ namespace osrm::customizer::files
|
|||||||
|
|
||||||
// reads .osrm.cell_metrics file
|
// reads .osrm.cell_metrics file
|
||||||
template <typename CellMetricT>
|
template <typename CellMetricT>
|
||||||
inline void readCellMetrics(const boost::filesystem::path &path,
|
inline void readCellMetrics(const std::filesystem::path &path,
|
||||||
std::unordered_map<std::string, std::vector<CellMetricT>> &metrics)
|
std::unordered_map<std::string, std::vector<CellMetricT>> &metrics)
|
||||||
{
|
{
|
||||||
static_assert(std::is_same<CellMetricView, CellMetricT>::value ||
|
static_assert(std::is_same<CellMetricView, CellMetricT>::value ||
|
||||||
@ -44,7 +44,7 @@ inline void readCellMetrics(const boost::filesystem::path &path,
|
|||||||
// writes .osrm.cell_metrics file
|
// writes .osrm.cell_metrics file
|
||||||
template <typename CellMetricT>
|
template <typename CellMetricT>
|
||||||
inline void
|
inline void
|
||||||
writeCellMetrics(const boost::filesystem::path &path,
|
writeCellMetrics(const std::filesystem::path &path,
|
||||||
const std::unordered_map<std::string, std::vector<CellMetricT>> &metrics)
|
const std::unordered_map<std::string, std::vector<CellMetricT>> &metrics)
|
||||||
{
|
{
|
||||||
static_assert(std::is_same<CellMetricView, CellMetricT>::value ||
|
static_assert(std::is_same<CellMetricView, CellMetricT>::value ||
|
||||||
@ -72,7 +72,7 @@ writeCellMetrics(const boost::filesystem::path &path,
|
|||||||
|
|
||||||
// reads .osrm.mldgr file
|
// reads .osrm.mldgr file
|
||||||
template <typename MultiLevelGraphT>
|
template <typename MultiLevelGraphT>
|
||||||
inline void readGraph(const boost::filesystem::path &path,
|
inline void readGraph(const std::filesystem::path &path,
|
||||||
MultiLevelGraphT &graph,
|
MultiLevelGraphT &graph,
|
||||||
std::uint32_t &connectivity_checksum)
|
std::uint32_t &connectivity_checksum)
|
||||||
{
|
{
|
||||||
@ -88,7 +88,7 @@ inline void readGraph(const boost::filesystem::path &path,
|
|||||||
|
|
||||||
// writes .osrm.mldgr file
|
// writes .osrm.mldgr file
|
||||||
template <typename MultiLevelGraphT>
|
template <typename MultiLevelGraphT>
|
||||||
inline void writeGraph(const boost::filesystem::path &path,
|
inline void writeGraph(const std::filesystem::path &path,
|
||||||
const MultiLevelGraphT &graph,
|
const MultiLevelGraphT &graph,
|
||||||
const std::uint32_t connectivity_checksum)
|
const std::uint32_t connectivity_checksum)
|
||||||
{
|
{
|
||||||
|
@ -33,7 +33,7 @@ SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
|
|||||||
#include "engine/hint.hpp"
|
#include "engine/hint.hpp"
|
||||||
#include "util/coordinate.hpp"
|
#include "util/coordinate.hpp"
|
||||||
|
|
||||||
#include <boost/optional.hpp>
|
#include <optional>
|
||||||
|
|
||||||
#include <algorithm>
|
#include <algorithm>
|
||||||
#include <vector>
|
#include <vector>
|
||||||
@ -74,12 +74,12 @@ struct BaseParameters
|
|||||||
};
|
};
|
||||||
|
|
||||||
std::vector<util::Coordinate> coordinates;
|
std::vector<util::Coordinate> coordinates;
|
||||||
std::vector<boost::optional<Hint>> hints;
|
std::vector<std::optional<Hint>> hints;
|
||||||
std::vector<boost::optional<double>> radiuses;
|
std::vector<std::optional<double>> radiuses;
|
||||||
std::vector<boost::optional<Bearing>> bearings;
|
std::vector<std::optional<Bearing>> bearings;
|
||||||
std::vector<boost::optional<Approach>> approaches;
|
std::vector<std::optional<Approach>> approaches;
|
||||||
std::vector<std::string> exclude;
|
std::vector<std::string> exclude;
|
||||||
boost::optional<OutputFormatType> format = OutputFormatType::JSON;
|
std::optional<OutputFormatType> format = OutputFormatType::JSON;
|
||||||
|
|
||||||
// Adds hints to response which can be included in subsequent requests, see `hints` above.
|
// Adds hints to response which can be included in subsequent requests, see `hints` above.
|
||||||
bool generate_hints = true;
|
bool generate_hints = true;
|
||||||
@ -90,10 +90,10 @@ struct BaseParameters
|
|||||||
SnappingType snapping = SnappingType::Default;
|
SnappingType snapping = SnappingType::Default;
|
||||||
|
|
||||||
BaseParameters(std::vector<util::Coordinate> coordinates_ = {},
|
BaseParameters(std::vector<util::Coordinate> coordinates_ = {},
|
||||||
std::vector<boost::optional<Hint>> hints_ = {},
|
std::vector<std::optional<Hint>> hints_ = {},
|
||||||
std::vector<boost::optional<double>> radiuses_ = {},
|
std::vector<std::optional<double>> radiuses_ = {},
|
||||||
std::vector<boost::optional<Bearing>> bearings_ = {},
|
std::vector<std::optional<Bearing>> bearings_ = {},
|
||||||
std::vector<boost::optional<Approach>> approaches_ = {},
|
std::vector<std::optional<Approach>> approaches_ = {},
|
||||||
bool generate_hints_ = true,
|
bool generate_hints_ = true,
|
||||||
std::vector<std::string> exclude = {},
|
std::vector<std::string> exclude = {},
|
||||||
const SnappingType snapping_ = SnappingType::Default)
|
const SnappingType snapping_ = SnappingType::Default)
|
||||||
@ -112,7 +112,7 @@ struct BaseParameters
|
|||||||
(approaches.empty() || approaches.size() == coordinates.size()) &&
|
(approaches.empty() || approaches.size() == coordinates.size()) &&
|
||||||
std::all_of(bearings.begin(),
|
std::all_of(bearings.begin(),
|
||||||
bearings.end(),
|
bearings.end(),
|
||||||
[](const boost::optional<Bearing> &bearing_and_range)
|
[](const std::optional<Bearing> &bearing_and_range)
|
||||||
{
|
{
|
||||||
if (bearing_and_range)
|
if (bearing_and_range)
|
||||||
{
|
{
|
||||||
|
@ -12,7 +12,7 @@
|
|||||||
#include "util/coordinate.hpp"
|
#include "util/coordinate.hpp"
|
||||||
#include "util/json_container.hpp"
|
#include "util/json_container.hpp"
|
||||||
|
|
||||||
#include <boost/optional.hpp>
|
#include <optional>
|
||||||
|
|
||||||
#include <algorithm>
|
#include <algorithm>
|
||||||
#include <iterator>
|
#include <iterator>
|
||||||
@ -90,7 +90,7 @@ util::json::Object makeRouteStep(guidance::RouteStep step, util::json::Value geo
|
|||||||
|
|
||||||
util::json::Object makeRoute(const guidance::Route &route,
|
util::json::Object makeRoute(const guidance::Route &route,
|
||||||
util::json::Array legs,
|
util::json::Array legs,
|
||||||
boost::optional<util::json::Value> geometry,
|
std::optional<util::json::Value> geometry,
|
||||||
const char *weight_name);
|
const char *weight_name);
|
||||||
|
|
||||||
// Creates a Waypoint without Hint, see the Hint overload below
|
// Creates a Waypoint without Hint, see the Hint overload below
|
||||||
|
@ -77,19 +77,19 @@ class MatchAPI final : public RouteAPI
|
|||||||
sub_routes[index].unpacked_path_segments,
|
sub_routes[index].unpacked_path_segments,
|
||||||
sub_routes[index].source_traversed_in_reverse,
|
sub_routes[index].source_traversed_in_reverse,
|
||||||
sub_routes[index].target_traversed_in_reverse);
|
sub_routes[index].target_traversed_in_reverse);
|
||||||
route.values["confidence"] = sub_matchings[index].confidence;
|
route.values.emplace("confidence", sub_matchings[index].confidence);
|
||||||
routes.values.push_back(std::move(route));
|
routes.values.emplace_back(std::move(route));
|
||||||
}
|
}
|
||||||
if (!parameters.skip_waypoints)
|
if (!parameters.skip_waypoints)
|
||||||
{
|
{
|
||||||
response.values["tracepoints"] = MakeTracepoints(sub_matchings);
|
response.values.emplace("tracepoints", MakeTracepoints(sub_matchings));
|
||||||
}
|
}
|
||||||
response.values["matchings"] = std::move(routes);
|
response.values.emplace("matchings", std::move(routes));
|
||||||
response.values["code"] = "Ok";
|
response.values.emplace("code", "Ok");
|
||||||
auto data_timestamp = facade.GetTimestamp();
|
auto data_timestamp = facade.GetTimestamp();
|
||||||
if (!data_timestamp.empty())
|
if (!data_timestamp.empty())
|
||||||
{
|
{
|
||||||
response.values["data_version"] = data_timestamp;
|
response.values.emplace("data_version", data_timestamp);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -132,13 +132,13 @@ class MatchAPI final : public RouteAPI
|
|||||||
|
|
||||||
if (tidy_result.can_be_removed[trace_index])
|
if (tidy_result.can_be_removed[trace_index])
|
||||||
{
|
{
|
||||||
waypoints.push_back(fbresult::WaypointBuilder(fb_result).Finish());
|
waypoints.emplace_back(fbresult::WaypointBuilder(fb_result).Finish());
|
||||||
continue;
|
continue;
|
||||||
}
|
}
|
||||||
auto matching_index = trace_idx_to_matching_idx[trace_index];
|
auto matching_index = trace_idx_to_matching_idx[trace_index];
|
||||||
if (matching_index.NotMatched())
|
if (matching_index.NotMatched())
|
||||||
{
|
{
|
||||||
waypoints.push_back(fbresult::WaypointBuilder(fb_result).Finish());
|
waypoints.emplace_back(fbresult::WaypointBuilder(fb_result).Finish());
|
||||||
continue;
|
continue;
|
||||||
}
|
}
|
||||||
const auto &phantom =
|
const auto &phantom =
|
||||||
@ -165,7 +165,7 @@ class MatchAPI final : public RouteAPI
|
|||||||
{
|
{
|
||||||
waypoint->add_waypoint_index(matching_index.point_index);
|
waypoint->add_waypoint_index(matching_index.point_index);
|
||||||
}
|
}
|
||||||
waypoints.push_back(waypoint->Finish());
|
waypoints.emplace_back(waypoint->Finish());
|
||||||
}
|
}
|
||||||
|
|
||||||
return fb_result.CreateVector(waypoints);
|
return fb_result.CreateVector(waypoints);
|
||||||
@ -186,23 +186,23 @@ class MatchAPI final : public RouteAPI
|
|||||||
{
|
{
|
||||||
if (tidy_result.can_be_removed[trace_index])
|
if (tidy_result.can_be_removed[trace_index])
|
||||||
{
|
{
|
||||||
waypoints.values.push_back(util::json::Null());
|
waypoints.values.emplace_back(util::json::Null());
|
||||||
continue;
|
continue;
|
||||||
}
|
}
|
||||||
auto matching_index = trace_idx_to_matching_idx[trace_index];
|
auto matching_index = trace_idx_to_matching_idx[trace_index];
|
||||||
if (matching_index.NotMatched())
|
if (matching_index.NotMatched())
|
||||||
{
|
{
|
||||||
waypoints.values.push_back(util::json::Null());
|
waypoints.values.emplace_back(util::json::Null());
|
||||||
continue;
|
continue;
|
||||||
}
|
}
|
||||||
const auto &phantom =
|
const auto &phantom =
|
||||||
sub_matchings[matching_index.sub_matching_index].nodes[matching_index.point_index];
|
sub_matchings[matching_index.sub_matching_index].nodes[matching_index.point_index];
|
||||||
auto waypoint = BaseAPI::MakeWaypoint({phantom});
|
auto waypoint = BaseAPI::MakeWaypoint({phantom});
|
||||||
waypoint.values["matchings_index"] = matching_index.sub_matching_index;
|
waypoint.values.emplace("matchings_index", matching_index.sub_matching_index);
|
||||||
waypoint.values["waypoint_index"] = matching_index.point_index;
|
waypoint.values.emplace("waypoint_index", matching_index.point_index);
|
||||||
waypoint.values["alternatives_count"] =
|
waypoint.values.emplace("alternatives_count",
|
||||||
sub_matchings[matching_index.sub_matching_index]
|
sub_matchings[matching_index.sub_matching_index]
|
||||||
.alternatives_count[matching_index.point_index];
|
.alternatives_count[matching_index.point_index]);
|
||||||
// waypoint indices need to be adjusted if route legs were collapsed
|
// waypoint indices need to be adjusted if route legs were collapsed
|
||||||
// waypoint parameter assumes there is only one match object
|
// waypoint parameter assumes there is only one match object
|
||||||
if (!parameters.waypoints.empty())
|
if (!parameters.waypoints.empty())
|
||||||
@ -217,7 +217,7 @@ class MatchAPI final : public RouteAPI
|
|||||||
waypoint.values["waypoint_index"] = util::json::Null();
|
waypoint.values["waypoint_index"] = util::json::Null();
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
waypoints.values.push_back(std::move(waypoint));
|
waypoints.values.emplace_back(std::move(waypoint));
|
||||||
}
|
}
|
||||||
|
|
||||||
return waypoints;
|
return waypoints;
|
||||||
|
@ -45,7 +45,7 @@ class NearestAPI final : public BaseAPI
|
|||||||
flatbuffers::FlatBufferBuilder &fb_result) const
|
flatbuffers::FlatBufferBuilder &fb_result) const
|
||||||
{
|
{
|
||||||
auto data_timestamp = facade.GetTimestamp();
|
auto data_timestamp = facade.GetTimestamp();
|
||||||
boost::optional<flatbuffers::Offset<flatbuffers::String>> data_version_string = boost::none;
|
std::optional<flatbuffers::Offset<flatbuffers::String>> data_version_string = std::nullopt;
|
||||||
if (!data_timestamp.empty())
|
if (!data_timestamp.empty())
|
||||||
{
|
{
|
||||||
data_version_string = fb_result.CreateString(data_timestamp);
|
data_version_string = fb_result.CreateString(data_timestamp);
|
||||||
@ -100,23 +100,23 @@ class NearestAPI final : public BaseAPI
|
|||||||
auto waypoint = MakeWaypoint({phantom_node});
|
auto waypoint = MakeWaypoint({phantom_node});
|
||||||
|
|
||||||
util::json::Array nodes;
|
util::json::Array nodes;
|
||||||
|
nodes.values.reserve(2);
|
||||||
|
|
||||||
auto node_values = MakeNodes(phantom_node);
|
auto node_values = MakeNodes(phantom_node);
|
||||||
|
|
||||||
nodes.values.push_back(node_values.first);
|
nodes.values.emplace_back(node_values.first);
|
||||||
nodes.values.push_back(node_values.second);
|
nodes.values.emplace_back(node_values.second);
|
||||||
waypoint.values["nodes"] = std::move(nodes);
|
waypoint.values.emplace("nodes", std::move(nodes));
|
||||||
|
|
||||||
return waypoint;
|
return waypoint;
|
||||||
});
|
});
|
||||||
response.values["waypoints"] = std::move(waypoints);
|
response.values.emplace("waypoints", std::move(waypoints));
|
||||||
}
|
}
|
||||||
|
|
||||||
response.values["code"] = "Ok";
|
response.values.emplace("code", "Ok");
|
||||||
auto data_timestamp = facade.GetTimestamp();
|
auto data_timestamp = facade.GetTimestamp();
|
||||||
if (!data_timestamp.empty())
|
if (!data_timestamp.empty())
|
||||||
{
|
{
|
||||||
response.values["data_version"] = data_timestamp;
|
response.values.emplace("data_version", data_timestamp);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -110,14 +110,14 @@ class RouteAPI : public BaseAPI
|
|||||||
|
|
||||||
if (!parameters.skip_waypoints)
|
if (!parameters.skip_waypoints)
|
||||||
{
|
{
|
||||||
response.values["waypoints"] = BaseAPI::MakeWaypoints(waypoint_candidates);
|
response.values.emplace("waypoints", BaseAPI::MakeWaypoints(waypoint_candidates));
|
||||||
}
|
}
|
||||||
response.values["routes"] = std::move(jsRoutes);
|
response.values.emplace("routes", std::move(jsRoutes));
|
||||||
response.values["code"] = "Ok";
|
response.values.emplace("code", "Ok");
|
||||||
auto data_timestamp = facade.GetTimestamp();
|
auto data_timestamp = facade.GetTimestamp();
|
||||||
if (!data_timestamp.empty())
|
if (!data_timestamp.empty())
|
||||||
{
|
{
|
||||||
response.values["data_version"] = data_timestamp;
|
response.values.emplace("data_version", data_timestamp);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -184,10 +184,10 @@ class RouteAPI : public BaseAPI
|
|||||||
return builder.CreateVectorOfStructs(coordinates);
|
return builder.CreateVectorOfStructs(coordinates);
|
||||||
}
|
}
|
||||||
|
|
||||||
boost::optional<util::json::Value>
|
std::optional<util::json::Value>
|
||||||
MakeGeometry(boost::optional<std::vector<Coordinate>> &&annotations) const
|
MakeGeometry(std::optional<std::vector<Coordinate>> &&annotations) const
|
||||||
{
|
{
|
||||||
boost::optional<util::json::Value> json_geometry;
|
std::optional<util::json::Value> json_geometry;
|
||||||
if (annotations)
|
if (annotations)
|
||||||
{
|
{
|
||||||
auto begin = annotations->begin();
|
auto begin = annotations->begin();
|
||||||
@ -340,8 +340,8 @@ class RouteAPI : public BaseAPI
|
|||||||
unpacked_path_segments,
|
unpacked_path_segments,
|
||||||
source_traversed_in_reverse,
|
source_traversed_in_reverse,
|
||||||
target_traversed_in_reverse);
|
target_traversed_in_reverse);
|
||||||
std::vector<guidance::RouteLeg> legs = legs_info.first;
|
std::vector<guidance::RouteLeg> &legs = legs_info.first;
|
||||||
std::vector<guidance::LegGeometry> leg_geometries = legs_info.second;
|
std::vector<guidance::LegGeometry> &leg_geometries = legs_info.second;
|
||||||
auto route = guidance::assembleRoute(legs);
|
auto route = guidance::assembleRoute(legs);
|
||||||
|
|
||||||
// Fill legs
|
// Fill legs
|
||||||
@ -716,12 +716,11 @@ class RouteAPI : public BaseAPI
|
|||||||
unpacked_path_segments,
|
unpacked_path_segments,
|
||||||
source_traversed_in_reverse,
|
source_traversed_in_reverse,
|
||||||
target_traversed_in_reverse);
|
target_traversed_in_reverse);
|
||||||
std::vector<guidance::RouteLeg> legs = legs_info.first;
|
std::vector<guidance::RouteLeg> &legs = legs_info.first;
|
||||||
std::vector<guidance::LegGeometry> leg_geometries = legs_info.second;
|
std::vector<guidance::LegGeometry> &leg_geometries = legs_info.second;
|
||||||
|
|
||||||
auto route = guidance::assembleRoute(legs);
|
auto route = guidance::assembleRoute(legs);
|
||||||
boost::optional<util::json::Value> json_overview =
|
std::optional<util::json::Value> json_overview = MakeGeometry(MakeOverview(leg_geometries));
|
||||||
MakeGeometry(MakeOverview(leg_geometries));
|
|
||||||
|
|
||||||
std::vector<util::json::Value> step_geometries;
|
std::vector<util::json::Value> step_geometries;
|
||||||
const auto total_step_count =
|
const auto total_step_count =
|
||||||
@ -784,49 +783,57 @@ class RouteAPI : public BaseAPI
|
|||||||
if (requested_annotations & RouteParameters::AnnotationsType::Speed)
|
if (requested_annotations & RouteParameters::AnnotationsType::Speed)
|
||||||
{
|
{
|
||||||
double prev_speed = 0;
|
double prev_speed = 0;
|
||||||
annotation.values["speed"] = GetAnnotations(
|
annotation.values.emplace(
|
||||||
leg_geometry,
|
"speed",
|
||||||
[&prev_speed](const guidance::LegGeometry::Annotation &anno)
|
GetAnnotations(leg_geometry,
|
||||||
{
|
[&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.;
|
{
|
||||||
prev_speed = speed;
|
auto speed =
|
||||||
return util::json::clamp_float(speed);
|
std::round(anno.distance / anno.duration * 10.) /
|
||||||
}
|
10.;
|
||||||
});
|
prev_speed = speed;
|
||||||
|
return util::json::clamp_float(speed);
|
||||||
|
}
|
||||||
|
}));
|
||||||
}
|
}
|
||||||
|
|
||||||
if (requested_annotations & RouteParameters::AnnotationsType::Duration)
|
if (requested_annotations & RouteParameters::AnnotationsType::Duration)
|
||||||
{
|
{
|
||||||
annotation.values["duration"] =
|
annotation.values.emplace(
|
||||||
|
"duration",
|
||||||
GetAnnotations(leg_geometry,
|
GetAnnotations(leg_geometry,
|
||||||
[](const guidance::LegGeometry::Annotation &anno)
|
[](const guidance::LegGeometry::Annotation &anno)
|
||||||
{ return anno.duration; });
|
{ return anno.duration; }));
|
||||||
}
|
}
|
||||||
if (requested_annotations & RouteParameters::AnnotationsType::Distance)
|
if (requested_annotations & RouteParameters::AnnotationsType::Distance)
|
||||||
{
|
{
|
||||||
annotation.values["distance"] =
|
annotation.values.emplace(
|
||||||
|
"distance",
|
||||||
GetAnnotations(leg_geometry,
|
GetAnnotations(leg_geometry,
|
||||||
[](const guidance::LegGeometry::Annotation &anno)
|
[](const guidance::LegGeometry::Annotation &anno)
|
||||||
{ return anno.distance; });
|
{ return anno.distance; }));
|
||||||
}
|
}
|
||||||
if (requested_annotations & RouteParameters::AnnotationsType::Weight)
|
if (requested_annotations & RouteParameters::AnnotationsType::Weight)
|
||||||
{
|
{
|
||||||
annotation.values["weight"] = GetAnnotations(
|
annotation.values.emplace(
|
||||||
leg_geometry,
|
"weight",
|
||||||
[](const guidance::LegGeometry::Annotation &anno) { return anno.weight; });
|
GetAnnotations(leg_geometry,
|
||||||
|
[](const guidance::LegGeometry::Annotation &anno)
|
||||||
|
{ return anno.weight; }));
|
||||||
}
|
}
|
||||||
if (requested_annotations & RouteParameters::AnnotationsType::Datasources)
|
if (requested_annotations & RouteParameters::AnnotationsType::Datasources)
|
||||||
{
|
{
|
||||||
annotation.values["datasources"] =
|
annotation.values.emplace(
|
||||||
|
"datasources",
|
||||||
GetAnnotations(leg_geometry,
|
GetAnnotations(leg_geometry,
|
||||||
[](const guidance::LegGeometry::Annotation &anno)
|
[](const guidance::LegGeometry::Annotation &anno)
|
||||||
{ return anno.datasource; });
|
{ return anno.datasource; }));
|
||||||
}
|
}
|
||||||
if (requested_annotations & RouteParameters::AnnotationsType::Nodes)
|
if (requested_annotations & RouteParameters::AnnotationsType::Nodes)
|
||||||
{
|
{
|
||||||
@ -837,7 +844,7 @@ class RouteAPI : public BaseAPI
|
|||||||
nodes.values.push_back(
|
nodes.values.push_back(
|
||||||
static_cast<std::uint64_t>(facade.GetOSMNodeIDOfNode(node_id)));
|
static_cast<std::uint64_t>(facade.GetOSMNodeIDOfNode(node_id)));
|
||||||
}
|
}
|
||||||
annotation.values["nodes"] = std::move(nodes);
|
annotation.values.emplace("nodes", std::move(nodes));
|
||||||
}
|
}
|
||||||
// Add any supporting metadata, if needed
|
// Add any supporting metadata, if needed
|
||||||
if (requested_annotations & RouteParameters::AnnotationsType::Datasources)
|
if (requested_annotations & RouteParameters::AnnotationsType::Datasources)
|
||||||
@ -853,8 +860,8 @@ class RouteAPI : public BaseAPI
|
|||||||
break;
|
break;
|
||||||
datasource_names.values.push_back(std::string(facade.GetDatasourceName(i)));
|
datasource_names.values.push_back(std::string(facade.GetDatasourceName(i)));
|
||||||
}
|
}
|
||||||
metadata.values["datasource_names"] = datasource_names;
|
metadata.values.emplace("datasource_names", datasource_names);
|
||||||
annotation.values["metadata"] = metadata;
|
annotation.values.emplace("metadata", metadata);
|
||||||
}
|
}
|
||||||
|
|
||||||
annotations.push_back(std::move(annotation));
|
annotations.push_back(std::move(annotation));
|
||||||
@ -989,10 +996,10 @@ class RouteAPI : public BaseAPI
|
|||||||
return result;
|
return result;
|
||||||
}
|
}
|
||||||
|
|
||||||
boost::optional<std::vector<Coordinate>>
|
std::optional<std::vector<Coordinate>>
|
||||||
MakeOverview(const std::vector<guidance::LegGeometry> &leg_geometries) const
|
MakeOverview(const std::vector<guidance::LegGeometry> &leg_geometries) const
|
||||||
{
|
{
|
||||||
boost::optional<std::vector<Coordinate>> overview;
|
std::optional<std::vector<Coordinate>> overview;
|
||||||
if (parameters.overview != RouteParameters::OverviewType::False)
|
if (parameters.overview != RouteParameters::OverviewType::False)
|
||||||
{
|
{
|
||||||
const auto use_simplification =
|
const auto use_simplification =
|
||||||
|
@ -82,7 +82,7 @@ struct RouteParameters : public BaseParameters
|
|||||||
const bool alternatives_,
|
const bool alternatives_,
|
||||||
const GeometriesType geometries_,
|
const GeometriesType geometries_,
|
||||||
const OverviewType overview_,
|
const OverviewType overview_,
|
||||||
const boost::optional<bool> continue_straight_,
|
const std::optional<bool> continue_straight_,
|
||||||
Args &&...args_)
|
Args &&...args_)
|
||||||
// Once we perfectly-forward `args` (see #2990) this constructor can delegate to the one
|
// Once we perfectly-forward `args` (see #2990) this constructor can delegate to the one
|
||||||
// below.
|
// below.
|
||||||
@ -100,7 +100,7 @@ struct RouteParameters : public BaseParameters
|
|||||||
const bool annotations_,
|
const bool annotations_,
|
||||||
const GeometriesType geometries_,
|
const GeometriesType geometries_,
|
||||||
const OverviewType overview_,
|
const OverviewType overview_,
|
||||||
const boost::optional<bool> continue_straight_,
|
const std::optional<bool> continue_straight_,
|
||||||
Args &&...args_)
|
Args &&...args_)
|
||||||
: BaseParameters{std::forward<Args>(args_)...}, steps{steps_}, alternatives{alternatives_},
|
: BaseParameters{std::forward<Args>(args_)...}, steps{steps_}, alternatives{alternatives_},
|
||||||
number_of_alternatives{alternatives_ ? 1u : 0u}, annotations{annotations_},
|
number_of_alternatives{alternatives_ ? 1u : 0u}, annotations{annotations_},
|
||||||
@ -118,7 +118,7 @@ struct RouteParameters : public BaseParameters
|
|||||||
const AnnotationsType annotations_,
|
const AnnotationsType annotations_,
|
||||||
const GeometriesType geometries_,
|
const GeometriesType geometries_,
|
||||||
const OverviewType overview_,
|
const OverviewType overview_,
|
||||||
const boost::optional<bool> continue_straight_,
|
const std::optional<bool> continue_straight_,
|
||||||
Args &&...args_)
|
Args &&...args_)
|
||||||
: BaseParameters{std::forward<Args>(args_)...}, steps{steps_}, alternatives{alternatives_},
|
: BaseParameters{std::forward<Args>(args_)...}, steps{steps_}, alternatives{alternatives_},
|
||||||
number_of_alternatives{alternatives_ ? 1u : 0u},
|
number_of_alternatives{alternatives_ ? 1u : 0u},
|
||||||
@ -135,7 +135,7 @@ struct RouteParameters : public BaseParameters
|
|||||||
const bool annotations_,
|
const bool annotations_,
|
||||||
const GeometriesType geometries_,
|
const GeometriesType geometries_,
|
||||||
const OverviewType overview_,
|
const OverviewType overview_,
|
||||||
const boost::optional<bool> continue_straight_,
|
const std::optional<bool> continue_straight_,
|
||||||
std::vector<std::size_t> waypoints_,
|
std::vector<std::size_t> waypoints_,
|
||||||
const Args &&...args_)
|
const Args &&...args_)
|
||||||
: BaseParameters{std::forward<Args>(args_)...}, steps{steps_}, alternatives{alternatives_},
|
: BaseParameters{std::forward<Args>(args_)...}, steps{steps_}, alternatives{alternatives_},
|
||||||
@ -153,7 +153,7 @@ struct RouteParameters : public BaseParameters
|
|||||||
const AnnotationsType annotations_,
|
const AnnotationsType annotations_,
|
||||||
const GeometriesType geometries_,
|
const GeometriesType geometries_,
|
||||||
const OverviewType overview_,
|
const OverviewType overview_,
|
||||||
const boost::optional<bool> continue_straight_,
|
const std::optional<bool> continue_straight_,
|
||||||
std::vector<std::size_t> waypoints_,
|
std::vector<std::size_t> waypoints_,
|
||||||
Args &&...args_)
|
Args &&...args_)
|
||||||
: BaseParameters{std::forward<Args>(args_)...}, steps{steps_}, alternatives{alternatives_},
|
: BaseParameters{std::forward<Args>(args_)...}, steps{steps_}, alternatives{alternatives_},
|
||||||
@ -172,7 +172,7 @@ struct RouteParameters : public BaseParameters
|
|||||||
AnnotationsType annotations_type = AnnotationsType::None;
|
AnnotationsType annotations_type = AnnotationsType::None;
|
||||||
GeometriesType geometries = GeometriesType::Polyline;
|
GeometriesType geometries = GeometriesType::Polyline;
|
||||||
OverviewType overview = OverviewType::Simplified;
|
OverviewType overview = OverviewType::Simplified;
|
||||||
boost::optional<bool> continue_straight;
|
std::optional<bool> continue_straight;
|
||||||
std::vector<std::size_t> waypoints;
|
std::vector<std::size_t> waypoints;
|
||||||
|
|
||||||
bool IsValid() const
|
bool IsValid() const
|
||||||
|
@ -179,7 +179,7 @@ class TableAPI final : public BaseAPI
|
|||||||
{
|
{
|
||||||
if (!parameters.skip_waypoints)
|
if (!parameters.skip_waypoints)
|
||||||
{
|
{
|
||||||
response.values["sources"] = MakeWaypoints(candidates);
|
response.values.emplace("sources", MakeWaypoints(candidates));
|
||||||
}
|
}
|
||||||
number_of_sources = candidates.size();
|
number_of_sources = candidates.size();
|
||||||
}
|
}
|
||||||
@ -187,7 +187,7 @@ class TableAPI final : public BaseAPI
|
|||||||
{
|
{
|
||||||
if (!parameters.skip_waypoints)
|
if (!parameters.skip_waypoints)
|
||||||
{
|
{
|
||||||
response.values["sources"] = MakeWaypoints(candidates, parameters.sources);
|
response.values.emplace("sources", MakeWaypoints(candidates, parameters.sources));
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -195,7 +195,7 @@ class TableAPI final : public BaseAPI
|
|||||||
{
|
{
|
||||||
if (!parameters.skip_waypoints)
|
if (!parameters.skip_waypoints)
|
||||||
{
|
{
|
||||||
response.values["destinations"] = MakeWaypoints(candidates);
|
response.values.emplace("destinations", MakeWaypoints(candidates));
|
||||||
}
|
}
|
||||||
number_of_destinations = candidates.size();
|
number_of_destinations = candidates.size();
|
||||||
}
|
}
|
||||||
@ -203,34 +203,37 @@ class TableAPI final : public BaseAPI
|
|||||||
{
|
{
|
||||||
if (!parameters.skip_waypoints)
|
if (!parameters.skip_waypoints)
|
||||||
{
|
{
|
||||||
response.values["destinations"] =
|
response.values.emplace("destinations",
|
||||||
MakeWaypoints(candidates, parameters.destinations);
|
MakeWaypoints(candidates, parameters.destinations));
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
if (parameters.annotations & TableParameters::AnnotationsType::Duration)
|
if (parameters.annotations & TableParameters::AnnotationsType::Duration)
|
||||||
{
|
{
|
||||||
response.values["durations"] =
|
response.values.emplace(
|
||||||
MakeDurationTable(tables.first, number_of_sources, number_of_destinations);
|
"durations",
|
||||||
|
MakeDurationTable(tables.first, number_of_sources, number_of_destinations));
|
||||||
}
|
}
|
||||||
|
|
||||||
if (parameters.annotations & TableParameters::AnnotationsType::Distance)
|
if (parameters.annotations & TableParameters::AnnotationsType::Distance)
|
||||||
{
|
{
|
||||||
response.values["distances"] =
|
response.values.emplace(
|
||||||
MakeDistanceTable(tables.second, number_of_sources, number_of_destinations);
|
"distances",
|
||||||
|
MakeDistanceTable(tables.second, number_of_sources, number_of_destinations));
|
||||||
}
|
}
|
||||||
|
|
||||||
if (parameters.fallback_speed != from_alias<double>(INVALID_FALLBACK_SPEED) &&
|
if (parameters.fallback_speed != from_alias<double>(INVALID_FALLBACK_SPEED) &&
|
||||||
parameters.fallback_speed > 0)
|
parameters.fallback_speed > 0)
|
||||||
{
|
{
|
||||||
response.values["fallback_speed_cells"] = MakeEstimatesTable(fallback_speed_cells);
|
response.values.emplace("fallback_speed_cells",
|
||||||
|
MakeEstimatesTable(fallback_speed_cells));
|
||||||
}
|
}
|
||||||
|
|
||||||
response.values["code"] = "Ok";
|
response.values.emplace("code", "Ok");
|
||||||
auto data_timestamp = facade.GetTimestamp();
|
auto data_timestamp = facade.GetTimestamp();
|
||||||
if (!data_timestamp.empty())
|
if (!data_timestamp.empty())
|
||||||
{
|
{
|
||||||
response.values["data_version"] = data_timestamp;
|
response.values.emplace("data_version", data_timestamp);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -79,14 +79,14 @@ class TripAPI final : public RouteAPI
|
|||||||
}
|
}
|
||||||
if (!parameters.skip_waypoints)
|
if (!parameters.skip_waypoints)
|
||||||
{
|
{
|
||||||
response.values["waypoints"] = MakeWaypoints(sub_trips, candidates);
|
response.values.emplace("waypoints", MakeWaypoints(sub_trips, candidates));
|
||||||
}
|
}
|
||||||
response.values["trips"] = std::move(routes);
|
response.values.emplace("trips", std::move(routes));
|
||||||
response.values["code"] = "Ok";
|
response.values.emplace("code", "Ok");
|
||||||
auto data_timestamp = facade.GetTimestamp();
|
auto data_timestamp = facade.GetTimestamp();
|
||||||
if (!data_timestamp.empty())
|
if (!data_timestamp.empty())
|
||||||
{
|
{
|
||||||
response.values["data_version"] = data_timestamp;
|
response.values.emplace("data_version", data_timestamp);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -151,8 +151,8 @@ class TripAPI final : public RouteAPI
|
|||||||
BOOST_ASSERT(!trip_index.NotUsed());
|
BOOST_ASSERT(!trip_index.NotUsed());
|
||||||
|
|
||||||
auto waypoint = BaseAPI::MakeWaypoint(candidates[input_index]);
|
auto waypoint = BaseAPI::MakeWaypoint(candidates[input_index]);
|
||||||
waypoint.values["trips_index"] = trip_index.sub_trip_index;
|
waypoint.values.emplace("trips_index", trip_index.sub_trip_index);
|
||||||
waypoint.values["waypoint_index"] = trip_index.point_index;
|
waypoint.values.emplace("waypoint_index", trip_index.point_index);
|
||||||
waypoints.values.push_back(std::move(waypoint));
|
waypoints.values.push_back(std::move(waypoint));
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -30,7 +30,7 @@ SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
|
|||||||
|
|
||||||
#include "engine/api/route_parameters.hpp"
|
#include "engine/api/route_parameters.hpp"
|
||||||
|
|
||||||
#include <boost/optional.hpp>
|
#include <optional>
|
||||||
#include <vector>
|
#include <vector>
|
||||||
|
|
||||||
namespace osrm::engine::api
|
namespace osrm::engine::api
|
||||||
|
@ -47,24 +47,29 @@ namespace engine
|
|||||||
// Encodes a chunk of memory to Base64.
|
// Encodes a chunk of memory to Base64.
|
||||||
inline std::string encodeBase64(const unsigned char *first, std::size_t size)
|
inline std::string encodeBase64(const unsigned char *first, std::size_t size)
|
||||||
{
|
{
|
||||||
std::vector<unsigned char> bytes{first, first + size};
|
BOOST_ASSERT(size > 0);
|
||||||
BOOST_ASSERT(!bytes.empty());
|
|
||||||
|
|
||||||
std::size_t bytes_to_pad{0};
|
std::string encoded;
|
||||||
|
encoded.reserve(((size + 2) / 3) * 4);
|
||||||
|
|
||||||
while (bytes.size() % 3 != 0)
|
auto padding = (3 - size % 3) % 3;
|
||||||
|
|
||||||
|
BOOST_ASSERT(padding == 0 || padding == 1 || padding == 2);
|
||||||
|
|
||||||
|
for (auto itr = detail::Base64FromBinary(first); itr != detail::Base64FromBinary(first + size);
|
||||||
|
++itr)
|
||||||
{
|
{
|
||||||
bytes_to_pad += 1;
|
encoded.push_back(*itr);
|
||||||
bytes.push_back(0);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
BOOST_ASSERT(bytes_to_pad == 0 || bytes_to_pad == 1 || bytes_to_pad == 2);
|
for (size_t index = 0; index < padding; ++index)
|
||||||
BOOST_ASSERT_MSG(0 == bytes.size() % 3, "base64 input data size is not a multiple of 3");
|
{
|
||||||
|
encoded.push_back('=');
|
||||||
|
}
|
||||||
|
|
||||||
std::string encoded{detail::Base64FromBinary{bytes.data()},
|
BOOST_ASSERT(encoded.size() == (size + 2) / 3 * 4);
|
||||||
detail::Base64FromBinary{bytes.data() + (bytes.size() - bytes_to_pad)}};
|
|
||||||
|
|
||||||
return encoded.append(bytes_to_pad, '=');
|
return encoded;
|
||||||
}
|
}
|
||||||
|
|
||||||
// C++11 standard 3.9.1/1: Plain char, signed char, and unsigned char are three distinct types
|
// C++11 standard 3.9.1/1: Plain char, signed char, and unsigned char are three distinct types
|
||||||
|
@ -177,7 +177,7 @@ class ContiguousInternalMemoryDataFacadeBase : public BaseDataFacade
|
|||||||
|
|
||||||
SharedRTree m_static_rtree;
|
SharedRTree m_static_rtree;
|
||||||
std::unique_ptr<SharedGeospatialQuery> m_geospatial_query;
|
std::unique_ptr<SharedGeospatialQuery> m_geospatial_query;
|
||||||
boost::filesystem::path file_index_path;
|
std::filesystem::path file_index_path;
|
||||||
|
|
||||||
std::optional<extractor::IntersectionBearingsView> intersection_bearings_view;
|
std::optional<extractor::IntersectionBearingsView> intersection_bearings_view;
|
||||||
|
|
||||||
@ -369,7 +369,7 @@ class ContiguousInternalMemoryDataFacadeBase : public BaseDataFacade
|
|||||||
std::vector<PhantomNodeWithDistance>
|
std::vector<PhantomNodeWithDistance>
|
||||||
NearestPhantomNodesInRange(const util::Coordinate input_coordinate,
|
NearestPhantomNodesInRange(const util::Coordinate input_coordinate,
|
||||||
const double max_distance,
|
const double max_distance,
|
||||||
const boost::optional<Bearing> bearing,
|
const std::optional<Bearing> bearing,
|
||||||
const Approach approach,
|
const Approach approach,
|
||||||
const bool use_all_edges) const override final
|
const bool use_all_edges) const override final
|
||||||
{
|
{
|
||||||
@ -382,20 +382,20 @@ class ContiguousInternalMemoryDataFacadeBase : public BaseDataFacade
|
|||||||
std::vector<PhantomNodeWithDistance>
|
std::vector<PhantomNodeWithDistance>
|
||||||
NearestPhantomNodes(const util::Coordinate input_coordinate,
|
NearestPhantomNodes(const util::Coordinate input_coordinate,
|
||||||
const size_t max_results,
|
const size_t max_results,
|
||||||
const boost::optional<double> max_distance,
|
const std::optional<double> max_distance,
|
||||||
const boost::optional<Bearing> bearing,
|
const std::optional<Bearing> bearing,
|
||||||
const Approach approach) const override final
|
const Approach approach) const override final
|
||||||
{
|
{
|
||||||
BOOST_ASSERT(m_geospatial_query.get());
|
BOOST_ASSERT(m_geospatial_query.get());
|
||||||
|
|
||||||
return m_geospatial_query->NearestPhantomNodes(
|
return m_geospatial_query->NearestPhantomNodes(
|
||||||
input_coordinate, approach, max_results, max_distance, bearing, boost::none);
|
input_coordinate, approach, max_results, max_distance, bearing, std::nullopt);
|
||||||
}
|
}
|
||||||
|
|
||||||
PhantomCandidateAlternatives
|
PhantomCandidateAlternatives
|
||||||
NearestCandidatesWithAlternativeFromBigComponent(const util::Coordinate input_coordinate,
|
NearestCandidatesWithAlternativeFromBigComponent(const util::Coordinate input_coordinate,
|
||||||
const boost::optional<double> max_distance,
|
const std::optional<double> max_distance,
|
||||||
const boost::optional<Bearing> bearing,
|
const std::optional<Bearing> bearing,
|
||||||
const Approach approach,
|
const Approach approach,
|
||||||
const bool use_all_edges) const override final
|
const bool use_all_edges) const override final
|
||||||
{
|
{
|
||||||
|
@ -35,6 +35,7 @@
|
|||||||
#include <cstddef>
|
#include <cstddef>
|
||||||
|
|
||||||
#include <engine/bearing.hpp>
|
#include <engine/bearing.hpp>
|
||||||
|
#include <optional>
|
||||||
#include <string>
|
#include <string>
|
||||||
#include <string_view>
|
#include <string_view>
|
||||||
#include <utility>
|
#include <utility>
|
||||||
@ -126,21 +127,21 @@ class BaseDataFacade
|
|||||||
virtual std::vector<PhantomNodeWithDistance>
|
virtual std::vector<PhantomNodeWithDistance>
|
||||||
NearestPhantomNodesInRange(const util::Coordinate input_coordinate,
|
NearestPhantomNodesInRange(const util::Coordinate input_coordinate,
|
||||||
const double max_distance,
|
const double max_distance,
|
||||||
const boost::optional<Bearing> bearing,
|
const std::optional<Bearing> bearing,
|
||||||
const Approach approach,
|
const Approach approach,
|
||||||
const bool use_all_edges) const = 0;
|
const bool use_all_edges) const = 0;
|
||||||
|
|
||||||
virtual std::vector<PhantomNodeWithDistance>
|
virtual std::vector<PhantomNodeWithDistance>
|
||||||
NearestPhantomNodes(const util::Coordinate input_coordinate,
|
NearestPhantomNodes(const util::Coordinate input_coordinate,
|
||||||
const size_t max_results,
|
const size_t max_results,
|
||||||
const boost::optional<double> max_distance,
|
const std::optional<double> max_distance,
|
||||||
const boost::optional<Bearing> bearing,
|
const std::optional<Bearing> bearing,
|
||||||
const Approach approach) const = 0;
|
const Approach approach) const = 0;
|
||||||
|
|
||||||
virtual PhantomCandidateAlternatives
|
virtual PhantomCandidateAlternatives
|
||||||
NearestCandidatesWithAlternativeFromBigComponent(const util::Coordinate input_coordinate,
|
NearestCandidatesWithAlternativeFromBigComponent(const util::Coordinate input_coordinate,
|
||||||
const boost::optional<double> max_distance,
|
const std::optional<double> max_distance,
|
||||||
const boost::optional<Bearing> bearing,
|
const std::optional<Bearing> bearing,
|
||||||
const Approach approach,
|
const Approach approach,
|
||||||
const bool use_all_edges) const = 0;
|
const bool use_all_edges) const = 0;
|
||||||
|
|
||||||
|
@ -31,8 +31,7 @@ SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
|
|||||||
#include "storage/storage_config.hpp"
|
#include "storage/storage_config.hpp"
|
||||||
#include "osrm/datasets.hpp"
|
#include "osrm/datasets.hpp"
|
||||||
|
|
||||||
#include <boost/filesystem/path.hpp>
|
#include <filesystem>
|
||||||
|
|
||||||
#include <set>
|
#include <set>
|
||||||
#include <string>
|
#include <string>
|
||||||
|
|
||||||
@ -80,10 +79,10 @@ struct EngineConfig final
|
|||||||
int max_locations_map_matching = -1;
|
int max_locations_map_matching = -1;
|
||||||
double max_radius_map_matching = -1.0;
|
double max_radius_map_matching = -1.0;
|
||||||
int max_results_nearest = -1;
|
int max_results_nearest = -1;
|
||||||
boost::optional<double> default_radius = -1.0;
|
double default_radius = -1.0;
|
||||||
int max_alternatives = 3; // set an arbitrary upper bound; can be adjusted by user
|
int max_alternatives = 3; // set an arbitrary upper bound; can be adjusted by user
|
||||||
bool use_shared_memory = true;
|
bool use_shared_memory = true;
|
||||||
boost::filesystem::path memory_file;
|
std::filesystem::path memory_file;
|
||||||
bool use_mmap = true;
|
bool use_mmap = true;
|
||||||
Algorithm algorithm = Algorithm::CH;
|
Algorithm algorithm = Algorithm::CH;
|
||||||
std::vector<storage::FeatureDataset> disable_feature_dataset;
|
std::vector<storage::FeatureDataset> disable_feature_dataset;
|
||||||
|
@ -12,7 +12,7 @@
|
|||||||
|
|
||||||
#include "osrm/coordinate.hpp"
|
#include "osrm/coordinate.hpp"
|
||||||
|
|
||||||
#include <boost/optional.hpp>
|
#include <optional>
|
||||||
|
|
||||||
#include <algorithm>
|
#include <algorithm>
|
||||||
#include <cmath>
|
#include <cmath>
|
||||||
@ -53,8 +53,8 @@ template <typename RTreeT, typename DataFacadeT> class GeospatialQuery
|
|||||||
NearestPhantomNodes(const util::Coordinate input_coordinate,
|
NearestPhantomNodes(const util::Coordinate input_coordinate,
|
||||||
const Approach approach,
|
const Approach approach,
|
||||||
const double max_distance,
|
const double max_distance,
|
||||||
const boost::optional<Bearing> bearing_with_range,
|
const std::optional<Bearing> bearing_with_range,
|
||||||
const boost::optional<bool> use_all_edges) const
|
const std::optional<bool> use_all_edges) const
|
||||||
{
|
{
|
||||||
auto results = rtree.SearchInRange(
|
auto results = rtree.SearchInRange(
|
||||||
input_coordinate,
|
input_coordinate,
|
||||||
@ -85,9 +85,9 @@ template <typename RTreeT, typename DataFacadeT> class GeospatialQuery
|
|||||||
NearestPhantomNodes(const util::Coordinate input_coordinate,
|
NearestPhantomNodes(const util::Coordinate input_coordinate,
|
||||||
const Approach approach,
|
const Approach approach,
|
||||||
const size_t max_results,
|
const size_t max_results,
|
||||||
const boost::optional<double> max_distance,
|
const std::optional<double> max_distance,
|
||||||
const boost::optional<Bearing> bearing_with_range,
|
const std::optional<Bearing> bearing_with_range,
|
||||||
const boost::optional<bool> use_all_edges) const
|
const std::optional<bool> use_all_edges) const
|
||||||
{
|
{
|
||||||
auto results = rtree.Nearest(
|
auto results = rtree.Nearest(
|
||||||
input_coordinate,
|
input_coordinate,
|
||||||
@ -121,9 +121,9 @@ template <typename RTreeT, typename DataFacadeT> class GeospatialQuery
|
|||||||
PhantomCandidateAlternatives NearestCandidatesWithAlternativeFromBigComponent(
|
PhantomCandidateAlternatives NearestCandidatesWithAlternativeFromBigComponent(
|
||||||
const util::Coordinate input_coordinate,
|
const util::Coordinate input_coordinate,
|
||||||
const Approach approach,
|
const Approach approach,
|
||||||
const boost::optional<double> max_distance,
|
const std::optional<double> max_distance,
|
||||||
const boost::optional<Bearing> bearing_with_range,
|
const std::optional<Bearing> bearing_with_range,
|
||||||
const boost::optional<bool> use_all_edges) const
|
const std::optional<bool> use_all_edges) const
|
||||||
{
|
{
|
||||||
bool has_nearest = false;
|
bool has_nearest = false;
|
||||||
bool has_big_component = false;
|
bool has_big_component = false;
|
||||||
|
@ -37,6 +37,14 @@ inline LegGeometry assembleGeometry(const datafacade::BaseDataFacade &facade,
|
|||||||
{
|
{
|
||||||
LegGeometry geometry;
|
LegGeometry geometry;
|
||||||
|
|
||||||
|
// each container will at most have `leg_data.size()` + 1/2 elements in it
|
||||||
|
// these additional 1/2 elements come from processing of very first and very last segment
|
||||||
|
geometry.locations.reserve(leg_data.size() + 2);
|
||||||
|
geometry.segment_distances.reserve(leg_data.size() + 1);
|
||||||
|
geometry.segment_offsets.reserve(leg_data.size() + 1);
|
||||||
|
geometry.annotations.reserve(leg_data.size() + 1);
|
||||||
|
geometry.node_ids.reserve(leg_data.size() + 2);
|
||||||
|
|
||||||
// segment 0 first and last
|
// segment 0 first and last
|
||||||
geometry.segment_offsets.push_back(0);
|
geometry.segment_offsets.push_back(0);
|
||||||
geometry.locations.push_back(source_node.location);
|
geometry.locations.push_back(source_node.location);
|
||||||
|
@ -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
|
||||||
|
@ -202,8 +202,8 @@ inline double totalTurnAngle(const RouteStep &entry_step, const RouteStep &exit_
|
|||||||
if (entry_step.geometry_begin > exit_step.geometry_begin)
|
if (entry_step.geometry_begin > exit_step.geometry_begin)
|
||||||
return totalTurnAngle(exit_step, entry_step);
|
return totalTurnAngle(exit_step, entry_step);
|
||||||
|
|
||||||
const auto exit_intersection = exit_step.intersections.front();
|
const auto &exit_intersection = exit_step.intersections.front();
|
||||||
const auto entry_intersection = entry_step.intersections.front();
|
const auto &entry_intersection = entry_step.intersections.front();
|
||||||
if ((exit_intersection.out >= exit_intersection.bearings.size()) ||
|
if ((exit_intersection.out >= exit_intersection.bearings.size()) ||
|
||||||
(entry_intersection.in >= entry_intersection.bearings.size()))
|
(entry_intersection.in >= entry_intersection.bearings.size()))
|
||||||
return entry_intersection.bearings[entry_intersection.out];
|
return entry_intersection.bearings[entry_intersection.out];
|
||||||
|
@ -3,7 +3,7 @@
|
|||||||
|
|
||||||
#include "engine/guidance/route_step.hpp"
|
#include "engine/guidance/route_step.hpp"
|
||||||
|
|
||||||
#include <boost/optional.hpp>
|
#include <optional>
|
||||||
|
|
||||||
#include <string>
|
#include <string>
|
||||||
#include <vector>
|
#include <vector>
|
||||||
|
@ -15,7 +15,7 @@
|
|||||||
#include "util/integer_range.hpp"
|
#include "util/integer_range.hpp"
|
||||||
#include "util/typedefs.hpp"
|
#include "util/typedefs.hpp"
|
||||||
|
|
||||||
#include <boost/optional.hpp>
|
#include <optional>
|
||||||
#include <vector>
|
#include <vector>
|
||||||
|
|
||||||
namespace osrm::engine
|
namespace osrm::engine
|
||||||
@ -42,7 +42,7 @@ struct PathData
|
|||||||
// Source of the speed value on this road segment
|
// Source of the speed value on this road segment
|
||||||
DatasourceID datasource_id;
|
DatasourceID datasource_id;
|
||||||
// If segment precedes a turn, ID of the turn itself
|
// If segment precedes a turn, ID of the turn itself
|
||||||
boost::optional<EdgeID> turn_edge;
|
std::optional<EdgeID> turn_edge;
|
||||||
};
|
};
|
||||||
|
|
||||||
struct InternalRouteResult
|
struct InternalRouteResult
|
||||||
|
@ -22,7 +22,7 @@ class MatchPlugin : public BasePlugin
|
|||||||
|
|
||||||
MatchPlugin(const int max_locations_map_matching,
|
MatchPlugin(const int max_locations_map_matching,
|
||||||
const double max_radius_map_matching,
|
const double max_radius_map_matching,
|
||||||
const boost::optional<double> default_radius)
|
const std::optional<double> default_radius)
|
||||||
: BasePlugin(default_radius), max_locations_map_matching(max_locations_map_matching),
|
: BasePlugin(default_radius), max_locations_map_matching(max_locations_map_matching),
|
||||||
max_radius_map_matching(max_radius_map_matching)
|
max_radius_map_matching(max_radius_map_matching)
|
||||||
{
|
{
|
||||||
|
@ -13,7 +13,7 @@ namespace osrm::engine::plugins
|
|||||||
class NearestPlugin final : public BasePlugin
|
class NearestPlugin final : public BasePlugin
|
||||||
{
|
{
|
||||||
public:
|
public:
|
||||||
explicit NearestPlugin(const int max_results, const boost::optional<double> default_radius);
|
explicit NearestPlugin(const int max_results, const std::optional<double> default_radius);
|
||||||
|
|
||||||
Status HandleRequest(const RoutingAlgorithmsInterface &algorithms,
|
Status HandleRequest(const RoutingAlgorithmsInterface &algorithms,
|
||||||
const api::NearestParameters ¶ms,
|
const api::NearestParameters ¶ms,
|
||||||
|
@ -29,7 +29,7 @@ class BasePlugin
|
|||||||
protected:
|
protected:
|
||||||
BasePlugin() = default;
|
BasePlugin() = default;
|
||||||
|
|
||||||
BasePlugin(const boost::optional<double> default_radius_) : default_radius(default_radius_) {}
|
BasePlugin(const std::optional<double> default_radius_) : default_radius(default_radius_) {}
|
||||||
|
|
||||||
bool CheckAllCoordinates(const std::vector<util::Coordinate> &coordinates) const
|
bool CheckAllCoordinates(const std::vector<util::Coordinate> &coordinates) const
|
||||||
{
|
{
|
||||||
@ -200,8 +200,8 @@ class BasePlugin
|
|||||||
phantom_nodes[i] = facade.NearestPhantomNodesInRange(
|
phantom_nodes[i] = facade.NearestPhantomNodesInRange(
|
||||||
parameters.coordinates[i],
|
parameters.coordinates[i],
|
||||||
radiuses[i],
|
radiuses[i],
|
||||||
use_bearings ? parameters.bearings[i] : boost::none,
|
use_bearings ? parameters.bearings[i] : std::nullopt,
|
||||||
use_approaches && parameters.approaches[i] ? parameters.approaches[i].get()
|
use_approaches && parameters.approaches[i] ? parameters.approaches[i].value()
|
||||||
: engine::Approach::UNRESTRICTED,
|
: engine::Approach::UNRESTRICTED,
|
||||||
use_all_edges);
|
use_all_edges);
|
||||||
}
|
}
|
||||||
@ -242,8 +242,8 @@ class BasePlugin
|
|||||||
parameters.coordinates[i],
|
parameters.coordinates[i],
|
||||||
number_of_results,
|
number_of_results,
|
||||||
use_radiuses ? parameters.radiuses[i] : default_radius,
|
use_radiuses ? parameters.radiuses[i] : default_radius,
|
||||||
use_bearings ? parameters.bearings[i] : boost::none,
|
use_bearings ? parameters.bearings[i] : std::nullopt,
|
||||||
use_approaches && parameters.approaches[i] ? parameters.approaches[i].get()
|
use_approaches && parameters.approaches[i] ? parameters.approaches[i].value()
|
||||||
: engine::Approach::UNRESTRICTED);
|
: engine::Approach::UNRESTRICTED);
|
||||||
|
|
||||||
// we didn't find a fitting node, return error
|
// we didn't find a fitting node, return error
|
||||||
@ -284,8 +284,8 @@ class BasePlugin
|
|||||||
alternatives[i] = facade.NearestCandidatesWithAlternativeFromBigComponent(
|
alternatives[i] = facade.NearestCandidatesWithAlternativeFromBigComponent(
|
||||||
parameters.coordinates[i],
|
parameters.coordinates[i],
|
||||||
use_radiuses ? parameters.radiuses[i] : default_radius,
|
use_radiuses ? parameters.radiuses[i] : default_radius,
|
||||||
use_bearings ? parameters.bearings[i] : boost::none,
|
use_bearings ? parameters.bearings[i] : std::nullopt,
|
||||||
use_approaches && parameters.approaches[i] ? parameters.approaches[i].get()
|
use_approaches && parameters.approaches[i] ? parameters.approaches[i].value()
|
||||||
: engine::Approach::UNRESTRICTED,
|
: engine::Approach::UNRESTRICTED,
|
||||||
use_all_edges);
|
use_all_edges);
|
||||||
|
|
||||||
@ -325,7 +325,7 @@ class BasePlugin
|
|||||||
std::to_string(missing_index);
|
std::to_string(missing_index);
|
||||||
}
|
}
|
||||||
|
|
||||||
const boost::optional<double> default_radius;
|
const std::optional<double> default_radius;
|
||||||
};
|
};
|
||||||
} // namespace osrm::engine::plugins
|
} // namespace osrm::engine::plugins
|
||||||
|
|
||||||
|
@ -15,7 +15,7 @@ class TablePlugin final : public BasePlugin
|
|||||||
{
|
{
|
||||||
public:
|
public:
|
||||||
explicit TablePlugin(const int max_locations_distance_table,
|
explicit TablePlugin(const int max_locations_distance_table,
|
||||||
const boost::optional<double> default_radius);
|
const std::optional<double> default_radius);
|
||||||
|
|
||||||
Status HandleRequest(const RoutingAlgorithmsInterface &algorithms,
|
Status HandleRequest(const RoutingAlgorithmsInterface &algorithms,
|
||||||
const api::TableParameters ¶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_, boost::optional<double> default_radius)
|
explicit TripPlugin(const int max_locations_trip_, std::optional<double> default_radius)
|
||||||
: BasePlugin(default_radius), max_locations_trip(max_locations_trip_)
|
: BasePlugin(default_radius), max_locations_trip(max_locations_trip_)
|
||||||
{
|
{
|
||||||
}
|
}
|
||||||
|
@ -27,7 +27,7 @@ class ViaRoutePlugin final : public BasePlugin
|
|||||||
public:
|
public:
|
||||||
explicit ViaRoutePlugin(int max_locations_viaroute,
|
explicit ViaRoutePlugin(int max_locations_viaroute,
|
||||||
int max_alternatives,
|
int max_alternatives,
|
||||||
boost::optional<double> default_radius);
|
std::optional<double> default_radius);
|
||||||
|
|
||||||
Status HandleRequest(const RoutingAlgorithmsInterface &algorithms,
|
Status HandleRequest(const RoutingAlgorithmsInterface &algorithms,
|
||||||
const api::RouteParameters &route_parameters,
|
const api::RouteParameters &route_parameters,
|
||||||
|
@ -12,7 +12,7 @@ namespace osrm::engine
|
|||||||
{
|
{
|
||||||
namespace detail
|
namespace detail
|
||||||
{
|
{
|
||||||
std::string encode(std::vector<int> &numbers);
|
void encode(int number_to_encode, std::string &output);
|
||||||
std::int32_t decode_polyline_integer(std::string::const_iterator &first,
|
std::int32_t decode_polyline_integer(std::string::const_iterator &first,
|
||||||
std::string::const_iterator last);
|
std::string::const_iterator last);
|
||||||
} // namespace detail
|
} // namespace detail
|
||||||
@ -30,27 +30,24 @@ std::string encodePolyline(CoordVectorForwardIter begin, CoordVectorForwardIter
|
|||||||
return {};
|
return {};
|
||||||
}
|
}
|
||||||
|
|
||||||
std::vector<int> delta_numbers;
|
std::string output;
|
||||||
BOOST_ASSERT(size > 0);
|
// just a guess that we will need ~4 bytes per coordinate to avoid reallocations
|
||||||
delta_numbers.reserve((size - 1) * 2);
|
output.reserve(size * 4);
|
||||||
|
|
||||||
int current_lat = 0;
|
int current_lat = 0;
|
||||||
int current_lon = 0;
|
int current_lon = 0;
|
||||||
std::for_each(
|
for (auto it = begin; it != end; ++it)
|
||||||
begin,
|
{
|
||||||
end,
|
const int lat_diff =
|
||||||
[&delta_numbers, ¤t_lat, ¤t_lon, coordinate_to_polyline](
|
std::round(static_cast<int>(it->lat) * coordinate_to_polyline) - current_lat;
|
||||||
const util::Coordinate loc)
|
const int lon_diff =
|
||||||
{
|
std::round(static_cast<int>(it->lon) * coordinate_to_polyline) - current_lon;
|
||||||
const int lat_diff =
|
detail::encode(lat_diff, output);
|
||||||
std::round(static_cast<int>(loc.lat) * coordinate_to_polyline) - current_lat;
|
detail::encode(lon_diff, output);
|
||||||
const int lon_diff =
|
current_lat += lat_diff;
|
||||||
std::round(static_cast<int>(loc.lon) * coordinate_to_polyline) - current_lon;
|
current_lon += lon_diff;
|
||||||
delta_numbers.emplace_back(lat_diff);
|
}
|
||||||
delta_numbers.emplace_back(lon_diff);
|
return output;
|
||||||
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 boost::optional<bool> continue_straight_at_waypoint) const = 0;
|
const std::optional<bool> continue_straight_at_waypoint) const = 0;
|
||||||
|
|
||||||
virtual InternalRouteResult
|
virtual InternalRouteResult
|
||||||
DirectShortestPathSearch(const PhantomEndpointCandidates &endpoint_candidates) const = 0;
|
DirectShortestPathSearch(const PhantomEndpointCandidates &endpoint_candidates) const = 0;
|
||||||
@ -40,7 +40,7 @@ class RoutingAlgorithmsInterface
|
|||||||
MapMatching(const routing_algorithms::CandidateLists &candidates_list,
|
MapMatching(const routing_algorithms::CandidateLists &candidates_list,
|
||||||
const std::vector<util::Coordinate> &trace_coordinates,
|
const std::vector<util::Coordinate> &trace_coordinates,
|
||||||
const std::vector<unsigned> &trace_timestamps,
|
const std::vector<unsigned> &trace_timestamps,
|
||||||
const std::vector<boost::optional<double>> &trace_gps_precision,
|
const std::vector<std::optional<double>> &trace_gps_precision,
|
||||||
const bool allow_splitting) const = 0;
|
const bool allow_splitting) const = 0;
|
||||||
|
|
||||||
virtual std::vector<routing_algorithms::TurnData>
|
virtual std::vector<routing_algorithms::TurnData>
|
||||||
@ -78,7 +78,7 @@ template <typename Algorithm> class RoutingAlgorithms final : public RoutingAlgo
|
|||||||
|
|
||||||
InternalRouteResult ShortestPathSearch(
|
InternalRouteResult ShortestPathSearch(
|
||||||
const std::vector<PhantomNodeCandidates> &waypoint_candidates,
|
const std::vector<PhantomNodeCandidates> &waypoint_candidates,
|
||||||
const boost::optional<bool> continue_straight_at_waypoint) const final override;
|
const std::optional<bool> continue_straight_at_waypoint) const final override;
|
||||||
|
|
||||||
InternalRouteResult DirectShortestPathSearch(
|
InternalRouteResult DirectShortestPathSearch(
|
||||||
const PhantomEndpointCandidates &endpoint_candidates) const final override;
|
const PhantomEndpointCandidates &endpoint_candidates) const final override;
|
||||||
@ -93,7 +93,7 @@ template <typename Algorithm> class RoutingAlgorithms final : public RoutingAlgo
|
|||||||
MapMatching(const routing_algorithms::CandidateLists &candidates_list,
|
MapMatching(const routing_algorithms::CandidateLists &candidates_list,
|
||||||
const std::vector<util::Coordinate> &trace_coordinates,
|
const std::vector<util::Coordinate> &trace_coordinates,
|
||||||
const std::vector<unsigned> &trace_timestamps,
|
const std::vector<unsigned> &trace_timestamps,
|
||||||
const std::vector<boost::optional<double>> &trace_gps_precision,
|
const std::vector<std::optional<double>> &trace_gps_precision,
|
||||||
const bool allow_splitting) const final override;
|
const bool allow_splitting) const final override;
|
||||||
|
|
||||||
std::vector<routing_algorithms::TurnData>
|
std::vector<routing_algorithms::TurnData>
|
||||||
@ -160,7 +160,7 @@ InternalManyRoutesResult RoutingAlgorithms<Algorithm>::AlternativePathSearch(
|
|||||||
template <typename Algorithm>
|
template <typename Algorithm>
|
||||||
InternalRouteResult RoutingAlgorithms<Algorithm>::ShortestPathSearch(
|
InternalRouteResult RoutingAlgorithms<Algorithm>::ShortestPathSearch(
|
||||||
const std::vector<PhantomNodeCandidates> &waypoint_candidates,
|
const std::vector<PhantomNodeCandidates> &waypoint_candidates,
|
||||||
const boost::optional<bool> continue_straight_at_waypoint) const
|
const std::optional<bool> continue_straight_at_waypoint) const
|
||||||
{
|
{
|
||||||
return routing_algorithms::shortestPathSearch(
|
return routing_algorithms::shortestPathSearch(
|
||||||
heaps, *facade, waypoint_candidates, continue_straight_at_waypoint);
|
heaps, *facade, waypoint_candidates, continue_straight_at_waypoint);
|
||||||
@ -178,7 +178,7 @@ inline routing_algorithms::SubMatchingList RoutingAlgorithms<Algorithm>::MapMatc
|
|||||||
const routing_algorithms::CandidateLists &candidates_list,
|
const routing_algorithms::CandidateLists &candidates_list,
|
||||||
const std::vector<util::Coordinate> &trace_coordinates,
|
const std::vector<util::Coordinate> &trace_coordinates,
|
||||||
const std::vector<unsigned> &trace_timestamps,
|
const std::vector<unsigned> &trace_timestamps,
|
||||||
const std::vector<boost::optional<double>> &trace_gps_precision,
|
const std::vector<std::optional<double>> &trace_gps_precision,
|
||||||
const bool allow_splitting) const
|
const bool allow_splitting) const
|
||||||
{
|
{
|
||||||
return routing_algorithms::mapMatching(heaps,
|
return routing_algorithms::mapMatching(heaps,
|
||||||
|
@ -24,7 +24,7 @@ SubMatchingList mapMatching(SearchEngineData<Algorithm> &engine_working_data,
|
|||||||
const CandidateLists &candidates_list,
|
const CandidateLists &candidates_list,
|
||||||
const std::vector<util::Coordinate> &trace_coordinates,
|
const std::vector<util::Coordinate> &trace_coordinates,
|
||||||
const std::vector<unsigned> &trace_timestamps,
|
const std::vector<unsigned> &trace_timestamps,
|
||||||
const std::vector<boost::optional<double>> &trace_gps_precision,
|
const std::vector<std::optional<double>> &trace_gps_precision,
|
||||||
const bool allow_splitting);
|
const bool allow_splitting);
|
||||||
|
|
||||||
} // namespace osrm::engine::routing_algorithms
|
} // namespace osrm::engine::routing_algorithms
|
||||||
|
@ -258,7 +258,7 @@ void annotatePath(const FacadeT &facade,
|
|||||||
alias_cast<EdgeDuration>(duration_vector[segment_idx]),
|
alias_cast<EdgeDuration>(duration_vector[segment_idx]),
|
||||||
{0},
|
{0},
|
||||||
datasource_vector[segment_idx],
|
datasource_vector[segment_idx],
|
||||||
boost::none});
|
std::nullopt});
|
||||||
}
|
}
|
||||||
BOOST_ASSERT(!unpacked_path.empty());
|
BOOST_ASSERT(!unpacked_path.empty());
|
||||||
|
|
||||||
@ -315,7 +315,7 @@ void annotatePath(const FacadeT &facade,
|
|||||||
alias_cast<EdgeDuration>(duration_vector[segment_idx]),
|
alias_cast<EdgeDuration>(duration_vector[segment_idx]),
|
||||||
{0},
|
{0},
|
||||||
datasource_vector[segment_idx],
|
datasource_vector[segment_idx],
|
||||||
boost::none});
|
std::nullopt});
|
||||||
}
|
}
|
||||||
|
|
||||||
if (!unpacked_path.empty())
|
if (!unpacked_path.empty())
|
||||||
|
@ -487,7 +487,13 @@ 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
|
||||||
|
{
|
||||||
|
EdgeWeight weight;
|
||||||
|
UnpackedNodes nodes;
|
||||||
|
UnpackedEdges edges;
|
||||||
|
};
|
||||||
|
|
||||||
template <typename Algorithm, typename Heap, typename... Args>
|
template <typename Algorithm, typename Heap, typename... Args>
|
||||||
std::optional<std::pair<NodeID, EdgeWeight>> runSearch(const DataFacade<Algorithm> &facade,
|
std::optional<std::pair<NodeID, EdgeWeight>> runSearch(const DataFacade<Algorithm> &facade,
|
||||||
@ -551,7 +557,7 @@ UnpackedPath search(SearchEngineData<Algorithm> &engine_working_data,
|
|||||||
facade, forward_heap, reverse_heap, force_step_nodes, weight_upper_bound, args...);
|
facade, forward_heap, reverse_heap, force_step_nodes, weight_upper_bound, args...);
|
||||||
if (!searchResult)
|
if (!searchResult)
|
||||||
{
|
{
|
||||||
return std::make_tuple(INVALID_EDGE_WEIGHT, std::vector<NodeID>(), std::vector<EdgeID>());
|
return {INVALID_EDGE_WEIGHT, std::vector<NodeID>(), std::vector<EdgeID>()};
|
||||||
}
|
}
|
||||||
|
|
||||||
auto [middle, weight] = *searchResult;
|
auto [middle, weight] = *searchResult;
|
||||||
@ -595,25 +601,27 @@ UnpackedPath search(SearchEngineData<Algorithm> &engine_working_data,
|
|||||||
forward_heap.Insert(source, {0}, {source});
|
forward_heap.Insert(source, {0}, {source});
|
||||||
reverse_heap.Insert(target, {0}, {target});
|
reverse_heap.Insert(target, {0}, {target});
|
||||||
|
|
||||||
auto [subpath_weight, subpath_nodes, subpath_edges] = search(engine_working_data,
|
auto unpacked_subpath = search(engine_working_data,
|
||||||
facade,
|
facade,
|
||||||
forward_heap,
|
forward_heap,
|
||||||
reverse_heap,
|
reverse_heap,
|
||||||
force_step_nodes,
|
force_step_nodes,
|
||||||
INVALID_EDGE_WEIGHT,
|
INVALID_EDGE_WEIGHT,
|
||||||
sublevel,
|
sublevel,
|
||||||
parent_cell_id);
|
parent_cell_id);
|
||||||
BOOST_ASSERT(!subpath_edges.empty());
|
BOOST_ASSERT(!unpacked_subpath.edges.empty());
|
||||||
BOOST_ASSERT(subpath_nodes.size() > 1);
|
BOOST_ASSERT(unpacked_subpath.nodes.size() > 1);
|
||||||
BOOST_ASSERT(subpath_nodes.front() == source);
|
BOOST_ASSERT(unpacked_subpath.nodes.front() == source);
|
||||||
BOOST_ASSERT(subpath_nodes.back() == target);
|
BOOST_ASSERT(unpacked_subpath.nodes.back() == target);
|
||||||
unpacked_nodes.insert(
|
unpacked_nodes.insert(unpacked_nodes.end(),
|
||||||
unpacked_nodes.end(), std::next(subpath_nodes.begin()), subpath_nodes.end());
|
std::next(unpacked_subpath.nodes.begin()),
|
||||||
unpacked_edges.insert(unpacked_edges.end(), subpath_edges.begin(), subpath_edges.end());
|
unpacked_subpath.nodes.end());
|
||||||
|
unpacked_edges.insert(
|
||||||
|
unpacked_edges.end(), unpacked_subpath.edges.begin(), unpacked_subpath.edges.end());
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
return std::make_tuple(weight, std::move(unpacked_nodes), std::move(unpacked_edges));
|
return {weight, std::move(unpacked_nodes), std::move(unpacked_edges)};
|
||||||
}
|
}
|
||||||
|
|
||||||
template <typename Algorithm, typename... Args>
|
template <typename Algorithm, typename... Args>
|
||||||
@ -654,13 +662,15 @@ inline void search(SearchEngineData<Algorithm> &engine_working_data,
|
|||||||
const EdgeWeight weight_upper_bound = INVALID_EDGE_WEIGHT)
|
const EdgeWeight weight_upper_bound = INVALID_EDGE_WEIGHT)
|
||||||
{
|
{
|
||||||
// TODO: change search calling interface to use unpacked_edges result
|
// TODO: change search calling interface to use unpacked_edges result
|
||||||
std::tie(weight, unpacked_nodes, std::ignore) = search(engine_working_data,
|
auto unpacked_path = search(engine_working_data,
|
||||||
facade,
|
facade,
|
||||||
forward_heap,
|
forward_heap,
|
||||||
reverse_heap,
|
reverse_heap,
|
||||||
force_step_nodes,
|
force_step_nodes,
|
||||||
weight_upper_bound,
|
weight_upper_bound,
|
||||||
endpoints);
|
endpoints);
|
||||||
|
weight = unpacked_path.weight;
|
||||||
|
unpacked_nodes = std::move(unpacked_path.nodes);
|
||||||
}
|
}
|
||||||
|
|
||||||
// TODO: refactor CH-related stub to use unpacked_edges
|
// TODO: refactor CH-related stub to use unpacked_edges
|
||||||
|
@ -14,7 +14,7 @@ InternalRouteResult
|
|||||||
shortestPathSearch(SearchEngineData<Algorithm> &engine_working_data,
|
shortestPathSearch(SearchEngineData<Algorithm> &engine_working_data,
|
||||||
const DataFacade<Algorithm> &facade,
|
const DataFacade<Algorithm> &facade,
|
||||||
const std::vector<PhantomNodeCandidates> &waypoint_candidates,
|
const std::vector<PhantomNodeCandidates> &waypoint_candidates,
|
||||||
const boost::optional<bool> continue_straight_at_waypoint);
|
const std::optional<bool> continue_straight_at_waypoint);
|
||||||
|
|
||||||
} // namespace osrm::engine::routing_algorithms
|
} // namespace osrm::engine::routing_algorithms
|
||||||
|
|
||||||
|
@ -4,7 +4,7 @@
|
|||||||
#include "engine/routing_algorithms/shortest_path.hpp"
|
#include "engine/routing_algorithms/shortest_path.hpp"
|
||||||
|
|
||||||
#include <boost/assert.hpp>
|
#include <boost/assert.hpp>
|
||||||
#include <boost/optional.hpp>
|
#include <optional>
|
||||||
|
|
||||||
namespace osrm::engine::routing_algorithms
|
namespace osrm::engine::routing_algorithms
|
||||||
{
|
{
|
||||||
@ -339,10 +339,10 @@ struct leg_connections
|
|||||||
{
|
{
|
||||||
// X_to_Y = i can be read as
|
// X_to_Y = i can be read as
|
||||||
// sources[i].X is the source of the shortest leg path to target.Y
|
// sources[i].X is the source of the shortest leg path to target.Y
|
||||||
boost::optional<size_t> forward_to_forward;
|
std::optional<size_t> forward_to_forward;
|
||||||
boost::optional<size_t> reverse_to_forward;
|
std::optional<size_t> reverse_to_forward;
|
||||||
boost::optional<size_t> forward_to_reverse;
|
std::optional<size_t> forward_to_reverse;
|
||||||
boost::optional<size_t> reverse_to_reverse;
|
std::optional<size_t> reverse_to_reverse;
|
||||||
};
|
};
|
||||||
|
|
||||||
// Identify which of the source candidates segments is being used for paths to the
|
// Identify which of the source candidates segments is being used for paths to the
|
||||||
@ -771,7 +771,7 @@ InternalRouteResult
|
|||||||
shortestPathSearch(SearchEngineData<Algorithm> &engine_working_data,
|
shortestPathSearch(SearchEngineData<Algorithm> &engine_working_data,
|
||||||
const DataFacade<Algorithm> &facade,
|
const DataFacade<Algorithm> &facade,
|
||||||
const std::vector<PhantomNodeCandidates> &waypoint_candidates,
|
const std::vector<PhantomNodeCandidates> &waypoint_candidates,
|
||||||
const boost::optional<bool> continue_straight_at_waypoint)
|
const std::optional<bool> continue_straight_at_waypoint)
|
||||||
{
|
{
|
||||||
const bool allow_uturn_at_waypoint =
|
const bool allow_uturn_at_waypoint =
|
||||||
!(continue_straight_at_waypoint ? *continue_straight_at_waypoint
|
!(continue_straight_at_waypoint ? *continue_straight_at_waypoint
|
||||||
|
@ -28,13 +28,12 @@ SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
|
|||||||
#ifndef EXTRACTOR_CONFIG_HPP
|
#ifndef EXTRACTOR_CONFIG_HPP
|
||||||
#define EXTRACTOR_CONFIG_HPP
|
#define EXTRACTOR_CONFIG_HPP
|
||||||
|
|
||||||
#include <boost/filesystem/path.hpp>
|
#include "storage/io_config.hpp"
|
||||||
|
|
||||||
#include <array>
|
#include <array>
|
||||||
|
#include <filesystem>
|
||||||
#include <string>
|
#include <string>
|
||||||
|
|
||||||
#include "storage/io_config.hpp"
|
|
||||||
|
|
||||||
namespace osrm::extractor
|
namespace osrm::extractor
|
||||||
{
|
{
|
||||||
|
|
||||||
@ -71,14 +70,14 @@ struct ExtractorConfig final : storage::IOConfig
|
|||||||
{
|
{
|
||||||
}
|
}
|
||||||
|
|
||||||
void UseDefaultOutputNames(const boost::filesystem::path &base)
|
void UseDefaultOutputNames(const std::filesystem::path &base)
|
||||||
{
|
{
|
||||||
IOConfig::UseDefaultOutputNames(base);
|
IOConfig::UseDefaultOutputNames(base);
|
||||||
}
|
}
|
||||||
|
|
||||||
boost::filesystem::path input_path;
|
std::filesystem::path input_path;
|
||||||
boost::filesystem::path profile_path;
|
std::filesystem::path profile_path;
|
||||||
std::vector<boost::filesystem::path> location_dependent_data_paths;
|
std::vector<std::filesystem::path> location_dependent_data_paths;
|
||||||
std::string data_version;
|
std::string data_version;
|
||||||
|
|
||||||
unsigned requested_num_threads = 0;
|
unsigned requested_num_threads = 0;
|
||||||
|
@ -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>
|
||||||
inline void writeIntersections(const boost::filesystem::path &path,
|
void writeIntersections(const std::filesystem::path &path,
|
||||||
const IntersectionBearingsT &intersection_bearings,
|
const IntersectionBearingsT &intersection_bearings,
|
||||||
const EntryClassVectorT &entry_classes)
|
const EntryClassVectorT &entry_classes)
|
||||||
{
|
{
|
||||||
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 @@ inline void writeIntersections(const boost::filesystem::path &path,
|
|||||||
|
|
||||||
// read the .osrm.icd file
|
// read the .osrm.icd file
|
||||||
template <typename IntersectionBearingsT, typename EntryClassVectorT>
|
template <typename IntersectionBearingsT, typename EntryClassVectorT>
|
||||||
inline void readIntersections(const boost::filesystem::path &path,
|
void readIntersections(const std::filesystem::path &path,
|
||||||
IntersectionBearingsT &intersection_bearings,
|
IntersectionBearingsT &intersection_bearings,
|
||||||
EntryClassVectorT &entry_classes)
|
EntryClassVectorT &entry_classes)
|
||||||
{
|
{
|
||||||
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,8 +54,7 @@ inline void readIntersections(const boost::filesystem::path &path,
|
|||||||
}
|
}
|
||||||
|
|
||||||
// reads .osrm.properties
|
// reads .osrm.properties
|
||||||
inline void readProfileProperties(const boost::filesystem::path &path,
|
inline void readProfileProperties(const std::filesystem::path &path, ProfileProperties &properties)
|
||||||
ProfileProperties &properties)
|
|
||||||
{
|
{
|
||||||
const auto fingerprint = storage::tar::FileReader::VerifyFingerprint;
|
const auto fingerprint = storage::tar::FileReader::VerifyFingerprint;
|
||||||
storage::tar::FileReader reader{path, fingerprint};
|
storage::tar::FileReader reader{path, fingerprint};
|
||||||
@ -64,7 +63,7 @@ inline void readProfileProperties(const boost::filesystem::path &path,
|
|||||||
}
|
}
|
||||||
|
|
||||||
// writes .osrm.properties
|
// writes .osrm.properties
|
||||||
inline void writeProfileProperties(const boost::filesystem::path &path,
|
inline void writeProfileProperties(const std::filesystem::path &path,
|
||||||
const ProfileProperties &properties)
|
const ProfileProperties &properties)
|
||||||
{
|
{
|
||||||
const auto fingerprint = storage::tar::FileWriter::GenerateFingerprint;
|
const auto fingerprint = storage::tar::FileWriter::GenerateFingerprint;
|
||||||
@ -74,7 +73,7 @@ inline void writeProfileProperties(const boost::filesystem::path &path,
|
|||||||
}
|
}
|
||||||
|
|
||||||
template <typename EdgeBasedEdgeVector>
|
template <typename EdgeBasedEdgeVector>
|
||||||
void writeEdgeBasedGraph(const boost::filesystem::path &path,
|
void writeEdgeBasedGraph(const std::filesystem::path &path,
|
||||||
EdgeID const number_of_edge_based_nodes,
|
EdgeID const number_of_edge_based_nodes,
|
||||||
const EdgeBasedEdgeVector &edge_based_edge_list,
|
const EdgeBasedEdgeVector &edge_based_edge_list,
|
||||||
const std::uint32_t connectivity_checksum)
|
const std::uint32_t connectivity_checksum)
|
||||||
@ -92,7 +91,7 @@ void writeEdgeBasedGraph(const boost::filesystem::path &path,
|
|||||||
|
|
||||||
// reads .osrm.ebg file
|
// reads .osrm.ebg file
|
||||||
template <typename EdgeBasedEdgeVector>
|
template <typename EdgeBasedEdgeVector>
|
||||||
void readEdgeBasedGraph(const boost::filesystem::path &path,
|
void readEdgeBasedGraph(const std::filesystem::path &path,
|
||||||
EdgeID &number_of_edge_based_nodes,
|
EdgeID &number_of_edge_based_nodes,
|
||||||
EdgeBasedEdgeVector &edge_based_edge_list,
|
EdgeBasedEdgeVector &edge_based_edge_list,
|
||||||
std::uint32_t &connectivity_checksum)
|
std::uint32_t &connectivity_checksum)
|
||||||
@ -108,9 +107,9 @@ void readEdgeBasedGraph(const boost::filesystem::path &path,
|
|||||||
|
|
||||||
// reads .osrm.nbg_nodes
|
// reads .osrm.nbg_nodes
|
||||||
template <typename CoordinatesT, typename PackedOSMIDsT>
|
template <typename CoordinatesT, typename PackedOSMIDsT>
|
||||||
inline void readNodes(const boost::filesystem::path &path,
|
void readNodes(const std::filesystem::path &path,
|
||||||
CoordinatesT &coordinates,
|
CoordinatesT &coordinates,
|
||||||
PackedOSMIDsT &osm_node_ids)
|
PackedOSMIDsT &osm_node_ids)
|
||||||
{
|
{
|
||||||
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, "");
|
||||||
@ -124,7 +123,7 @@ inline void readNodes(const boost::filesystem::path &path,
|
|||||||
|
|
||||||
// reads only coordinates from .osrm.nbg_nodes
|
// reads only coordinates from .osrm.nbg_nodes
|
||||||
template <typename CoordinatesT>
|
template <typename CoordinatesT>
|
||||||
inline void readNodeCoordinates(const boost::filesystem::path &path, CoordinatesT &coordinates)
|
void readNodeCoordinates(const std::filesystem::path &path, CoordinatesT &coordinates)
|
||||||
{
|
{
|
||||||
static_assert(std::is_same<typename CoordinatesT::value_type, util::Coordinate>::value, "");
|
static_assert(std::is_same<typename CoordinatesT::value_type, util::Coordinate>::value, "");
|
||||||
|
|
||||||
@ -136,9 +135,9 @@ inline void readNodeCoordinates(const boost::filesystem::path &path, Coordinates
|
|||||||
|
|
||||||
// writes .osrm.nbg_nodes
|
// writes .osrm.nbg_nodes
|
||||||
template <typename CoordinatesT, typename PackedOSMIDsT>
|
template <typename CoordinatesT, typename PackedOSMIDsT>
|
||||||
inline void writeNodes(const boost::filesystem::path &path,
|
void writeNodes(const std::filesystem::path &path,
|
||||||
const CoordinatesT &coordinates,
|
const CoordinatesT &coordinates,
|
||||||
const PackedOSMIDsT &osm_node_ids)
|
const PackedOSMIDsT &osm_node_ids)
|
||||||
{
|
{
|
||||||
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, "");
|
||||||
@ -151,7 +150,7 @@ inline void writeNodes(const boost::filesystem::path &path,
|
|||||||
}
|
}
|
||||||
|
|
||||||
// reads .osrm.cnbg_to_ebg
|
// reads .osrm.cnbg_to_ebg
|
||||||
inline void readNBGMapping(const boost::filesystem::path &path, std::vector<NBGToEBG> &mapping)
|
inline void readNBGMapping(const std::filesystem::path &path, std::vector<NBGToEBG> &mapping)
|
||||||
{
|
{
|
||||||
const auto fingerprint = storage::tar::FileReader::VerifyFingerprint;
|
const auto fingerprint = storage::tar::FileReader::VerifyFingerprint;
|
||||||
storage::tar::FileReader reader{path, fingerprint};
|
storage::tar::FileReader reader{path, fingerprint};
|
||||||
@ -160,8 +159,7 @@ inline void readNBGMapping(const boost::filesystem::path &path, std::vector<NBGT
|
|||||||
}
|
}
|
||||||
|
|
||||||
// writes .osrm.cnbg_to_ebg
|
// writes .osrm.cnbg_to_ebg
|
||||||
inline void writeNBGMapping(const boost::filesystem::path &path,
|
inline void writeNBGMapping(const std::filesystem::path &path, const std::vector<NBGToEBG> &mapping)
|
||||||
const std::vector<NBGToEBG> &mapping)
|
|
||||||
{
|
{
|
||||||
const auto fingerprint = storage::tar::FileWriter::GenerateFingerprint;
|
const auto fingerprint = storage::tar::FileWriter::GenerateFingerprint;
|
||||||
storage::tar::FileWriter writer{path, fingerprint};
|
storage::tar::FileWriter writer{path, fingerprint};
|
||||||
@ -170,7 +168,7 @@ inline void writeNBGMapping(const boost::filesystem::path &path,
|
|||||||
}
|
}
|
||||||
|
|
||||||
// reads .osrm.datasource_names
|
// reads .osrm.datasource_names
|
||||||
inline void readDatasources(const boost::filesystem::path &path, Datasources &sources)
|
inline void readDatasources(const std::filesystem::path &path, Datasources &sources)
|
||||||
{
|
{
|
||||||
const auto fingerprint = storage::tar::FileReader::VerifyFingerprint;
|
const auto fingerprint = storage::tar::FileReader::VerifyFingerprint;
|
||||||
storage::tar::FileReader reader{path, fingerprint};
|
storage::tar::FileReader reader{path, fingerprint};
|
||||||
@ -179,7 +177,7 @@ inline void readDatasources(const boost::filesystem::path &path, Datasources &so
|
|||||||
}
|
}
|
||||||
|
|
||||||
// writes .osrm.datasource_names
|
// writes .osrm.datasource_names
|
||||||
inline void writeDatasources(const boost::filesystem::path &path, Datasources &sources)
|
inline void writeDatasources(const std::filesystem::path &path, Datasources &sources)
|
||||||
{
|
{
|
||||||
const auto fingerprint = storage::tar::FileWriter::GenerateFingerprint;
|
const auto fingerprint = storage::tar::FileWriter::GenerateFingerprint;
|
||||||
storage::tar::FileWriter writer{path, fingerprint};
|
storage::tar::FileWriter writer{path, fingerprint};
|
||||||
@ -189,7 +187,7 @@ inline void writeDatasources(const boost::filesystem::path &path, Datasources &s
|
|||||||
|
|
||||||
// reads .osrm.geometry
|
// reads .osrm.geometry
|
||||||
template <typename SegmentDataT>
|
template <typename SegmentDataT>
|
||||||
inline void readSegmentData(const boost::filesystem::path &path, SegmentDataT &segment_data)
|
void readSegmentData(const std::filesystem::path &path, SegmentDataT &segment_data)
|
||||||
{
|
{
|
||||||
static_assert(std::is_same<SegmentDataContainer, SegmentDataT>::value ||
|
static_assert(std::is_same<SegmentDataContainer, SegmentDataT>::value ||
|
||||||
std::is_same<SegmentDataView, SegmentDataT>::value,
|
std::is_same<SegmentDataView, SegmentDataT>::value,
|
||||||
@ -202,7 +200,7 @@ inline void readSegmentData(const boost::filesystem::path &path, SegmentDataT &s
|
|||||||
|
|
||||||
// writes .osrm.geometry
|
// writes .osrm.geometry
|
||||||
template <typename SegmentDataT>
|
template <typename SegmentDataT>
|
||||||
inline void writeSegmentData(const boost::filesystem::path &path, const SegmentDataT &segment_data)
|
void writeSegmentData(const std::filesystem::path &path, const SegmentDataT &segment_data)
|
||||||
{
|
{
|
||||||
static_assert(std::is_same<SegmentDataContainer, SegmentDataT>::value ||
|
static_assert(std::is_same<SegmentDataContainer, SegmentDataT>::value ||
|
||||||
std::is_same<SegmentDataView, SegmentDataT>::value,
|
std::is_same<SegmentDataView, SegmentDataT>::value,
|
||||||
@ -215,7 +213,7 @@ inline void writeSegmentData(const boost::filesystem::path &path, const SegmentD
|
|||||||
|
|
||||||
// reads .osrm.ebg_nodes
|
// reads .osrm.ebg_nodes
|
||||||
template <typename NodeDataT>
|
template <typename NodeDataT>
|
||||||
inline void readNodeData(const boost::filesystem::path &path, NodeDataT &node_data)
|
inline void readNodeData(const std::filesystem::path &path, NodeDataT &node_data)
|
||||||
{
|
{
|
||||||
static_assert(std::is_same<EdgeBasedNodeDataContainer, NodeDataT>::value ||
|
static_assert(std::is_same<EdgeBasedNodeDataContainer, NodeDataT>::value ||
|
||||||
std::is_same<EdgeBasedNodeDataView, NodeDataT>::value ||
|
std::is_same<EdgeBasedNodeDataView, NodeDataT>::value ||
|
||||||
@ -229,7 +227,7 @@ inline void readNodeData(const boost::filesystem::path &path, NodeDataT &node_da
|
|||||||
|
|
||||||
// writes .osrm.ebg_nodes
|
// writes .osrm.ebg_nodes
|
||||||
template <typename NodeDataT>
|
template <typename NodeDataT>
|
||||||
inline void writeNodeData(const boost::filesystem::path &path, const NodeDataT &node_data)
|
inline void writeNodeData(const std::filesystem::path &path, const NodeDataT &node_data)
|
||||||
{
|
{
|
||||||
static_assert(std::is_same<EdgeBasedNodeDataContainer, NodeDataT>::value ||
|
static_assert(std::is_same<EdgeBasedNodeDataContainer, NodeDataT>::value ||
|
||||||
std::is_same<EdgeBasedNodeDataView, NodeDataT>::value ||
|
std::is_same<EdgeBasedNodeDataView, NodeDataT>::value ||
|
||||||
@ -243,7 +241,7 @@ inline void writeNodeData(const boost::filesystem::path &path, const NodeDataT &
|
|||||||
|
|
||||||
// reads .osrm.tls
|
// reads .osrm.tls
|
||||||
template <typename OffsetsT, typename MaskT>
|
template <typename OffsetsT, typename MaskT>
|
||||||
inline void readTurnLaneDescriptions(const boost::filesystem::path &path,
|
inline void readTurnLaneDescriptions(const std::filesystem::path &path,
|
||||||
OffsetsT &turn_offsets,
|
OffsetsT &turn_offsets,
|
||||||
MaskT &turn_masks)
|
MaskT &turn_masks)
|
||||||
{
|
{
|
||||||
@ -260,7 +258,7 @@ inline void readTurnLaneDescriptions(const boost::filesystem::path &path,
|
|||||||
|
|
||||||
// writes .osrm.tls
|
// writes .osrm.tls
|
||||||
template <typename OffsetsT, typename MaskT>
|
template <typename OffsetsT, typename MaskT>
|
||||||
inline void writeTurnLaneDescriptions(const boost::filesystem::path &path,
|
inline void writeTurnLaneDescriptions(const std::filesystem::path &path,
|
||||||
const OffsetsT &turn_offsets,
|
const OffsetsT &turn_offsets,
|
||||||
const MaskT &turn_masks)
|
const MaskT &turn_masks)
|
||||||
{
|
{
|
||||||
@ -277,7 +275,7 @@ inline void writeTurnLaneDescriptions(const boost::filesystem::path &path,
|
|||||||
|
|
||||||
// reads .osrm.tld
|
// reads .osrm.tld
|
||||||
template <typename TurnLaneDataT>
|
template <typename TurnLaneDataT>
|
||||||
inline void readTurnLaneData(const boost::filesystem::path &path, TurnLaneDataT &turn_lane_data)
|
inline void readTurnLaneData(const std::filesystem::path &path, TurnLaneDataT &turn_lane_data)
|
||||||
{
|
{
|
||||||
static_assert(
|
static_assert(
|
||||||
std::is_same<typename TurnLaneDataT::value_type, util::guidance::LaneTupleIdPair>::value,
|
std::is_same<typename TurnLaneDataT::value_type, util::guidance::LaneTupleIdPair>::value,
|
||||||
@ -291,7 +289,7 @@ inline void readTurnLaneData(const boost::filesystem::path &path, TurnLaneDataT
|
|||||||
|
|
||||||
// writes .osrm.tld
|
// writes .osrm.tld
|
||||||
template <typename TurnLaneDataT>
|
template <typename TurnLaneDataT>
|
||||||
inline void writeTurnLaneData(const boost::filesystem::path &path,
|
inline void writeTurnLaneData(const std::filesystem::path &path,
|
||||||
const TurnLaneDataT &turn_lane_data)
|
const TurnLaneDataT &turn_lane_data)
|
||||||
{
|
{
|
||||||
static_assert(
|
static_assert(
|
||||||
@ -306,7 +304,7 @@ inline void writeTurnLaneData(const boost::filesystem::path &path,
|
|||||||
|
|
||||||
// reads .osrm.timestamp
|
// reads .osrm.timestamp
|
||||||
template <typename TimestampDataT>
|
template <typename TimestampDataT>
|
||||||
inline void readTimestamp(const boost::filesystem::path &path, TimestampDataT ×tamp)
|
inline void readTimestamp(const std::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};
|
||||||
@ -316,7 +314,7 @@ inline void readTimestamp(const boost::filesystem::path &path, TimestampDataT &t
|
|||||||
|
|
||||||
// writes .osrm.timestamp
|
// writes .osrm.timestamp
|
||||||
template <typename TimestampDataT>
|
template <typename TimestampDataT>
|
||||||
inline void writeTimestamp(const boost::filesystem::path &path, const TimestampDataT ×tamp)
|
inline void writeTimestamp(const std::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};
|
||||||
@ -326,7 +324,7 @@ inline void writeTimestamp(const boost::filesystem::path &path, const TimestampD
|
|||||||
|
|
||||||
// reads .osrm.maneuver_overrides
|
// reads .osrm.maneuver_overrides
|
||||||
template <typename StorageManeuverOverrideT, typename NodeSequencesT>
|
template <typename StorageManeuverOverrideT, typename NodeSequencesT>
|
||||||
inline void readManeuverOverrides(const boost::filesystem::path &path,
|
inline void readManeuverOverrides(const std::filesystem::path &path,
|
||||||
StorageManeuverOverrideT &maneuver_overrides,
|
StorageManeuverOverrideT &maneuver_overrides,
|
||||||
NodeSequencesT &node_sequences)
|
NodeSequencesT &node_sequences)
|
||||||
{
|
{
|
||||||
@ -340,7 +338,7 @@ inline void readManeuverOverrides(const boost::filesystem::path &path,
|
|||||||
}
|
}
|
||||||
|
|
||||||
// writes .osrm.maneuver_overrides
|
// writes .osrm.maneuver_overrides
|
||||||
inline void writeManeuverOverrides(const boost::filesystem::path &path,
|
inline void writeManeuverOverrides(const std::filesystem::path &path,
|
||||||
const std::vector<StorageManeuverOverride> &maneuver_overrides,
|
const std::vector<StorageManeuverOverride> &maneuver_overrides,
|
||||||
const std::vector<NodeID> &node_sequences)
|
const std::vector<NodeID> &node_sequences)
|
||||||
{
|
{
|
||||||
@ -355,7 +353,7 @@ inline void writeManeuverOverrides(const boost::filesystem::path &path,
|
|||||||
|
|
||||||
// writes .osrm.turn_weight_penalties
|
// writes .osrm.turn_weight_penalties
|
||||||
template <typename TurnPenaltyT>
|
template <typename TurnPenaltyT>
|
||||||
inline void writeTurnWeightPenalty(const boost::filesystem::path &path,
|
inline void writeTurnWeightPenalty(const std::filesystem::path &path,
|
||||||
const TurnPenaltyT &turn_penalty)
|
const TurnPenaltyT &turn_penalty)
|
||||||
{
|
{
|
||||||
const auto fingerprint = storage::tar::FileWriter::GenerateFingerprint;
|
const auto fingerprint = storage::tar::FileWriter::GenerateFingerprint;
|
||||||
@ -366,7 +364,7 @@ inline void writeTurnWeightPenalty(const boost::filesystem::path &path,
|
|||||||
|
|
||||||
// read .osrm.turn_weight_penalties
|
// read .osrm.turn_weight_penalties
|
||||||
template <typename TurnPenaltyT>
|
template <typename TurnPenaltyT>
|
||||||
inline void readTurnWeightPenalty(const boost::filesystem::path &path, TurnPenaltyT &turn_penalty)
|
inline void readTurnWeightPenalty(const std::filesystem::path &path, TurnPenaltyT &turn_penalty)
|
||||||
{
|
{
|
||||||
const auto fingerprint = storage::tar::FileReader::VerifyFingerprint;
|
const auto fingerprint = storage::tar::FileReader::VerifyFingerprint;
|
||||||
storage::tar::FileReader reader{path, fingerprint};
|
storage::tar::FileReader reader{path, fingerprint};
|
||||||
@ -376,7 +374,7 @@ inline void readTurnWeightPenalty(const boost::filesystem::path &path, TurnPenal
|
|||||||
|
|
||||||
// writes .osrm.turn_duration_penalties
|
// writes .osrm.turn_duration_penalties
|
||||||
template <typename TurnPenaltyT>
|
template <typename TurnPenaltyT>
|
||||||
inline void writeTurnDurationPenalty(const boost::filesystem::path &path,
|
inline void writeTurnDurationPenalty(const std::filesystem::path &path,
|
||||||
const TurnPenaltyT &turn_penalty)
|
const TurnPenaltyT &turn_penalty)
|
||||||
{
|
{
|
||||||
const auto fingerprint = storage::tar::FileWriter::GenerateFingerprint;
|
const auto fingerprint = storage::tar::FileWriter::GenerateFingerprint;
|
||||||
@ -387,7 +385,7 @@ inline void writeTurnDurationPenalty(const boost::filesystem::path &path,
|
|||||||
|
|
||||||
// read .osrm.turn_weight_penalties
|
// read .osrm.turn_weight_penalties
|
||||||
template <typename TurnPenaltyT>
|
template <typename TurnPenaltyT>
|
||||||
inline void readTurnDurationPenalty(const boost::filesystem::path &path, TurnPenaltyT &turn_penalty)
|
inline void readTurnDurationPenalty(const std::filesystem::path &path, TurnPenaltyT &turn_penalty)
|
||||||
{
|
{
|
||||||
const auto fingerprint = storage::tar::FileReader::VerifyFingerprint;
|
const auto fingerprint = storage::tar::FileReader::VerifyFingerprint;
|
||||||
storage::tar::FileReader reader{path, fingerprint};
|
storage::tar::FileReader reader{path, fingerprint};
|
||||||
@ -397,7 +395,7 @@ inline void readTurnDurationPenalty(const boost::filesystem::path &path, TurnPen
|
|||||||
|
|
||||||
// writes .osrm.turn_penalties_index
|
// writes .osrm.turn_penalties_index
|
||||||
template <typename TurnIndexT>
|
template <typename TurnIndexT>
|
||||||
inline void writeTurnPenaltiesIndex(const boost::filesystem::path &path,
|
inline void writeTurnPenaltiesIndex(const std::filesystem::path &path,
|
||||||
const TurnIndexT &turn_penalties_index)
|
const TurnIndexT &turn_penalties_index)
|
||||||
{
|
{
|
||||||
const auto fingerprint = storage::tar::FileWriter::GenerateFingerprint;
|
const auto fingerprint = storage::tar::FileWriter::GenerateFingerprint;
|
||||||
@ -408,7 +406,7 @@ inline void writeTurnPenaltiesIndex(const boost::filesystem::path &path,
|
|||||||
|
|
||||||
// read .osrm.turn_penalties_index
|
// read .osrm.turn_penalties_index
|
||||||
template <typename TurnIndexT>
|
template <typename TurnIndexT>
|
||||||
inline void readTurnPenaltiesIndex(const boost::filesystem::path &path,
|
inline void readTurnPenaltiesIndex(const std::filesystem::path &path,
|
||||||
TurnIndexT &turn_penalties_index)
|
TurnIndexT &turn_penalties_index)
|
||||||
{
|
{
|
||||||
const auto fingerprint = storage::tar::FileReader::VerifyFingerprint;
|
const auto fingerprint = storage::tar::FileReader::VerifyFingerprint;
|
||||||
@ -419,7 +417,7 @@ inline void readTurnPenaltiesIndex(const boost::filesystem::path &path,
|
|||||||
|
|
||||||
// writes .osrm.restrictions
|
// writes .osrm.restrictions
|
||||||
template <typename ConditionalRestrictionsT>
|
template <typename ConditionalRestrictionsT>
|
||||||
inline void writeConditionalRestrictions(const boost::filesystem::path &path,
|
inline void writeConditionalRestrictions(const std::filesystem::path &path,
|
||||||
const ConditionalRestrictionsT &conditional_restrictions)
|
const ConditionalRestrictionsT &conditional_restrictions)
|
||||||
{
|
{
|
||||||
const auto fingerprint = storage::tar::FileWriter::GenerateFingerprint;
|
const auto fingerprint = storage::tar::FileWriter::GenerateFingerprint;
|
||||||
@ -430,7 +428,7 @@ inline void writeConditionalRestrictions(const boost::filesystem::path &path,
|
|||||||
|
|
||||||
// read .osrm.restrictions
|
// read .osrm.restrictions
|
||||||
template <typename ConditionalRestrictionsT>
|
template <typename ConditionalRestrictionsT>
|
||||||
inline void readConditionalRestrictions(const boost::filesystem::path &path,
|
inline void readConditionalRestrictions(const std::filesystem::path &path,
|
||||||
ConditionalRestrictionsT &conditional_restrictions)
|
ConditionalRestrictionsT &conditional_restrictions)
|
||||||
{
|
{
|
||||||
const auto fingerprint = storage::tar::FileReader::VerifyFingerprint;
|
const auto fingerprint = storage::tar::FileReader::VerifyFingerprint;
|
||||||
@ -441,7 +439,7 @@ inline void readConditionalRestrictions(const boost::filesystem::path &path,
|
|||||||
|
|
||||||
// reads .osrm file which is a temporary file of osrm-extract
|
// reads .osrm file which is a temporary file of osrm-extract
|
||||||
template <typename PackedOSMIDsT>
|
template <typename PackedOSMIDsT>
|
||||||
void readRawNBGraph(const boost::filesystem::path &path,
|
void readRawNBGraph(const std::filesystem::path &path,
|
||||||
std::vector<util::Coordinate> &coordinates,
|
std::vector<util::Coordinate> &coordinates,
|
||||||
PackedOSMIDsT &osm_node_ids,
|
PackedOSMIDsT &osm_node_ids,
|
||||||
std::vector<extractor::NodeBasedEdge> &edge_list)
|
std::vector<extractor::NodeBasedEdge> &edge_list)
|
||||||
@ -466,8 +464,7 @@ void readRawNBGraph(const boost::filesystem::path &path,
|
|||||||
storage::serialization::read(reader, "/extractor/edges", edge_list);
|
storage::serialization::read(reader, "/extractor/edges", edge_list);
|
||||||
}
|
}
|
||||||
|
|
||||||
template <typename NameTableT>
|
template <typename NameTableT> void readNames(const std::filesystem::path &path, NameTableT &table)
|
||||||
void readNames(const boost::filesystem::path &path, NameTableT &table)
|
|
||||||
{
|
{
|
||||||
const auto fingerprint = storage::tar::FileReader::VerifyFingerprint;
|
const auto fingerprint = storage::tar::FileReader::VerifyFingerprint;
|
||||||
storage::tar::FileReader reader{path, fingerprint};
|
storage::tar::FileReader reader{path, fingerprint};
|
||||||
@ -476,7 +473,7 @@ void readNames(const boost::filesystem::path &path, NameTableT &table)
|
|||||||
}
|
}
|
||||||
|
|
||||||
template <typename NameTableT>
|
template <typename NameTableT>
|
||||||
void writeNames(const boost::filesystem::path &path, const NameTableT &table)
|
void writeNames(const std::filesystem::path &path, const NameTableT &table)
|
||||||
{
|
{
|
||||||
const auto fingerprint = storage::tar::FileWriter::GenerateFingerprint;
|
const auto fingerprint = storage::tar::FileWriter::GenerateFingerprint;
|
||||||
storage::tar::FileWriter writer{path, fingerprint};
|
storage::tar::FileWriter writer{path, fingerprint};
|
||||||
@ -485,7 +482,7 @@ void writeNames(const boost::filesystem::path &path, const NameTableT &table)
|
|||||||
}
|
}
|
||||||
|
|
||||||
template <typename NodeWeightsVectorT>
|
template <typename NodeWeightsVectorT>
|
||||||
void readEdgeBasedNodeWeights(const boost::filesystem::path &path, NodeWeightsVectorT &weights)
|
void readEdgeBasedNodeWeights(const std::filesystem::path &path, NodeWeightsVectorT &weights)
|
||||||
{
|
{
|
||||||
const auto fingerprint = storage::tar::FileReader::VerifyFingerprint;
|
const auto fingerprint = storage::tar::FileReader::VerifyFingerprint;
|
||||||
storage::tar::FileReader reader{path, fingerprint};
|
storage::tar::FileReader reader{path, fingerprint};
|
||||||
@ -494,8 +491,7 @@ void readEdgeBasedNodeWeights(const boost::filesystem::path &path, NodeWeightsVe
|
|||||||
}
|
}
|
||||||
|
|
||||||
template <typename NodeDistancesVectorT>
|
template <typename NodeDistancesVectorT>
|
||||||
void readEdgeBasedNodeDistances(const boost::filesystem::path &path,
|
void readEdgeBasedNodeDistances(const std::filesystem::path &path, NodeDistancesVectorT &distances)
|
||||||
NodeDistancesVectorT &distances)
|
|
||||||
{
|
{
|
||||||
const auto fingerprint = storage::tar::FileReader::VerifyFingerprint;
|
const auto fingerprint = storage::tar::FileReader::VerifyFingerprint;
|
||||||
storage::tar::FileReader reader{path, fingerprint};
|
storage::tar::FileReader reader{path, fingerprint};
|
||||||
@ -504,7 +500,7 @@ void readEdgeBasedNodeDistances(const boost::filesystem::path &path,
|
|||||||
}
|
}
|
||||||
|
|
||||||
template <typename NodeWeightsVectorT, typename NodeDurationsVectorT, typename NodeDistancesVectorT>
|
template <typename NodeWeightsVectorT, typename NodeDurationsVectorT, typename NodeDistancesVectorT>
|
||||||
void writeEdgeBasedNodeWeightsDurationsDistances(const boost::filesystem::path &path,
|
void writeEdgeBasedNodeWeightsDurationsDistances(const std::filesystem::path &path,
|
||||||
const NodeWeightsVectorT &weights,
|
const NodeWeightsVectorT &weights,
|
||||||
const NodeDurationsVectorT &durations,
|
const NodeDurationsVectorT &durations,
|
||||||
const NodeDistancesVectorT &distances)
|
const NodeDistancesVectorT &distances)
|
||||||
@ -518,7 +514,7 @@ void writeEdgeBasedNodeWeightsDurationsDistances(const boost::filesystem::path &
|
|||||||
}
|
}
|
||||||
|
|
||||||
template <typename NodeWeightsVectorT, typename NodeDurationsVectorT>
|
template <typename NodeWeightsVectorT, typename NodeDurationsVectorT>
|
||||||
void readEdgeBasedNodeWeightsDurations(const boost::filesystem::path &path,
|
void readEdgeBasedNodeWeightsDurations(const std::filesystem::path &path,
|
||||||
NodeWeightsVectorT &weights,
|
NodeWeightsVectorT &weights,
|
||||||
NodeDurationsVectorT &durations)
|
NodeDurationsVectorT &durations)
|
||||||
{
|
{
|
||||||
@ -530,7 +526,7 @@ void readEdgeBasedNodeWeightsDurations(const boost::filesystem::path &path,
|
|||||||
}
|
}
|
||||||
|
|
||||||
template <typename NodeWeightsVectorT, typename NodeDurationsVectorT>
|
template <typename NodeWeightsVectorT, typename NodeDurationsVectorT>
|
||||||
void writeEdgeBasedNodeWeightsDurations(const boost::filesystem::path &path,
|
void writeEdgeBasedNodeWeightsDurations(const std::filesystem::path &path,
|
||||||
const NodeWeightsVectorT &weights,
|
const NodeWeightsVectorT &weights,
|
||||||
const NodeDurationsVectorT &durations)
|
const NodeDurationsVectorT &durations)
|
||||||
{
|
{
|
||||||
@ -542,7 +538,7 @@ void writeEdgeBasedNodeWeightsDurations(const boost::filesystem::path &path,
|
|||||||
}
|
}
|
||||||
|
|
||||||
template <typename RTreeT>
|
template <typename RTreeT>
|
||||||
void writeRamIndex(const boost::filesystem::path &path, const RTreeT &rtree)
|
void writeRamIndex(const std::filesystem::path &path, const RTreeT &rtree)
|
||||||
{
|
{
|
||||||
const auto fingerprint = storage::tar::FileWriter::GenerateFingerprint;
|
const auto fingerprint = storage::tar::FileWriter::GenerateFingerprint;
|
||||||
storage::tar::FileWriter writer{path, fingerprint};
|
storage::tar::FileWriter writer{path, fingerprint};
|
||||||
@ -550,7 +546,7 @@ void writeRamIndex(const boost::filesystem::path &path, const RTreeT &rtree)
|
|||||||
util::serialization::write(writer, "/common/rtree", rtree);
|
util::serialization::write(writer, "/common/rtree", rtree);
|
||||||
}
|
}
|
||||||
|
|
||||||
template <typename RTreeT> void readRamIndex(const boost::filesystem::path &path, RTreeT &rtree)
|
template <typename RTreeT> void readRamIndex(const std::filesystem::path &path, RTreeT &rtree)
|
||||||
{
|
{
|
||||||
const auto fingerprint = storage::tar::FileReader::VerifyFingerprint;
|
const auto fingerprint = storage::tar::FileReader::VerifyFingerprint;
|
||||||
storage::tar::FileReader reader{path, fingerprint};
|
storage::tar::FileReader reader{path, fingerprint};
|
||||||
@ -559,7 +555,7 @@ template <typename RTreeT> void readRamIndex(const boost::filesystem::path &path
|
|||||||
}
|
}
|
||||||
|
|
||||||
template <typename EdgeListT>
|
template <typename EdgeListT>
|
||||||
void writeCompressedNodeBasedGraph(const boost::filesystem::path &path, const EdgeListT &edge_list)
|
void writeCompressedNodeBasedGraph(const std::filesystem::path &path, const EdgeListT &edge_list)
|
||||||
{
|
{
|
||||||
const auto fingerprint = storage::tar::FileWriter::GenerateFingerprint;
|
const auto fingerprint = storage::tar::FileWriter::GenerateFingerprint;
|
||||||
storage::tar::FileWriter writer{path, fingerprint};
|
storage::tar::FileWriter writer{path, fingerprint};
|
||||||
@ -568,7 +564,7 @@ void writeCompressedNodeBasedGraph(const boost::filesystem::path &path, const Ed
|
|||||||
}
|
}
|
||||||
|
|
||||||
template <typename EdgeListT>
|
template <typename EdgeListT>
|
||||||
void readCompressedNodeBasedGraph(const boost::filesystem::path &path, EdgeListT &edge_list)
|
void readCompressedNodeBasedGraph(const std::filesystem::path &path, EdgeListT &edge_list)
|
||||||
{
|
{
|
||||||
const auto fingerprint = storage::tar::FileReader::VerifyFingerprint;
|
const auto fingerprint = storage::tar::FileReader::VerifyFingerprint;
|
||||||
storage::tar::FileReader reader{path, fingerprint};
|
storage::tar::FileReader reader{path, fingerprint};
|
||||||
|
@ -1,13 +1,13 @@
|
|||||||
#ifndef OSRM_LOCATION_DEPENDENT_DATA_HPP
|
#ifndef OSRM_LOCATION_DEPENDENT_DATA_HPP
|
||||||
#define OSRM_LOCATION_DEPENDENT_DATA_HPP
|
#define OSRM_LOCATION_DEPENDENT_DATA_HPP
|
||||||
|
|
||||||
#include <boost/filesystem/path.hpp>
|
|
||||||
#include <boost/geometry.hpp>
|
#include <boost/geometry.hpp>
|
||||||
#include <boost/geometry/geometries/point_xy.hpp>
|
#include <boost/geometry/geometries/point_xy.hpp>
|
||||||
#include <boost/geometry/index/rtree.hpp>
|
#include <boost/geometry/index/rtree.hpp>
|
||||||
|
|
||||||
#include <osmium/osm/way.hpp>
|
#include <osmium/osm/way.hpp>
|
||||||
|
|
||||||
|
#include <filesystem>
|
||||||
#include <string>
|
#include <string>
|
||||||
#include <unordered_map>
|
#include <unordered_map>
|
||||||
|
|
||||||
@ -30,7 +30,7 @@ struct LocationDependentData
|
|||||||
using property_t = boost::variant<boost::blank, double, std::string, bool>;
|
using property_t = boost::variant<boost::blank, double, std::string, bool>;
|
||||||
using properties_t = std::unordered_map<std::string, property_t>;
|
using properties_t = std::unordered_map<std::string, property_t>;
|
||||||
|
|
||||||
LocationDependentData(const std::vector<boost::filesystem::path> &file_paths);
|
LocationDependentData(const std::vector<std::filesystem::path> &file_paths);
|
||||||
|
|
||||||
bool empty() const { return rtree.empty(); }
|
bool empty() const { return rtree.empty(); }
|
||||||
|
|
||||||
@ -39,7 +39,7 @@ struct LocationDependentData
|
|||||||
property_t FindByKey(const std::vector<std::size_t> &property_indexes, const char *key) const;
|
property_t FindByKey(const std::vector<std::size_t> &property_indexes, const char *key) const;
|
||||||
|
|
||||||
private:
|
private:
|
||||||
void loadLocationDependentData(const boost::filesystem::path &file_path,
|
void loadLocationDependentData(const std::filesystem::path &file_path,
|
||||||
std::vector<rtree_t::value_type> &bounding_boxes);
|
std::vector<rtree_t::value_type> &bounding_boxes);
|
||||||
|
|
||||||
rtree_t rtree;
|
rtree_t rtree;
|
||||||
|
@ -12,8 +12,7 @@
|
|||||||
#include "util/coordinate.hpp"
|
#include "util/coordinate.hpp"
|
||||||
#include "util/node_based_graph.hpp"
|
#include "util/node_based_graph.hpp"
|
||||||
|
|
||||||
#include <boost/filesystem/path.hpp>
|
#include <filesystem>
|
||||||
|
|
||||||
#include <memory>
|
#include <memory>
|
||||||
#include <string>
|
#include <string>
|
||||||
#include <unordered_set>
|
#include <unordered_set>
|
||||||
|
@ -7,14 +7,13 @@
|
|||||||
#include <boost/algorithm/string.hpp>
|
#include <boost/algorithm/string.hpp>
|
||||||
#include <boost/algorithm/string/trim.hpp>
|
#include <boost/algorithm/string/trim.hpp>
|
||||||
#include <boost/assert.hpp>
|
#include <boost/assert.hpp>
|
||||||
#include <boost/filesystem.hpp>
|
|
||||||
#include <boost/filesystem/fstream.hpp>
|
|
||||||
#include <boost/foreach.hpp>
|
#include <boost/foreach.hpp>
|
||||||
#include <boost/spirit/include/qi.hpp>
|
#include <boost/spirit/include/qi.hpp>
|
||||||
#include <boost/spirit/include/qi_int.hpp>
|
#include <boost/spirit/include/qi_int.hpp>
|
||||||
|
|
||||||
#include <storage/io.hpp>
|
#include <storage/io.hpp>
|
||||||
|
|
||||||
|
#include <filesystem>
|
||||||
#include <iterator>
|
#include <iterator>
|
||||||
#include <string>
|
#include <string>
|
||||||
#include <unordered_map>
|
#include <unordered_map>
|
||||||
@ -40,7 +39,7 @@ struct RasterDatum
|
|||||||
class RasterGrid
|
class RasterGrid
|
||||||
{
|
{
|
||||||
public:
|
public:
|
||||||
RasterGrid(const boost::filesystem::path &filepath, std::size_t _xdim, std::size_t _ydim)
|
RasterGrid(const std::filesystem::path &filepath, std::size_t _xdim, std::size_t _ydim)
|
||||||
{
|
{
|
||||||
xdim = _xdim;
|
xdim = _xdim;
|
||||||
ydim = _ydim;
|
ydim = _ydim;
|
||||||
|
@ -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<boost::filesystem::path> &location_dependent_data_paths);
|
const std::vector<std::filesystem::path> &location_dependent_data_paths);
|
||||||
~Sol2ScriptingEnvironment() override = default;
|
~Sol2ScriptingEnvironment() override = default;
|
||||||
|
|
||||||
const ProfileProperties &GetProfileProperties() override;
|
const ProfileProperties &GetProfileProperties() override;
|
||||||
|
@ -8,13 +8,12 @@
|
|||||||
#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 <unordered_map>
|
#include <filesystem>
|
||||||
|
|
||||||
#include <string>
|
#include <string>
|
||||||
|
#include <unordered_map>
|
||||||
#include <vector>
|
#include <vector>
|
||||||
|
|
||||||
namespace osrm::extractor
|
namespace osrm::extractor
|
||||||
|
@ -215,7 +215,6 @@ 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
|
||||||
|
@ -10,12 +10,16 @@
|
|||||||
|
|
||||||
#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 boost::filesystem::path &path,
|
inline void readTurnData(const std::filesystem::path &path,
|
||||||
TurnDataT &turn_data,
|
TurnDataT &turn_data,
|
||||||
std::uint32_t &connectivity_checksum)
|
std::uint32_t &connectivity_checksum)
|
||||||
{
|
{
|
||||||
@ -32,7 +36,7 @@ inline void readTurnData(const boost::filesystem::path &path,
|
|||||||
|
|
||||||
// writes .osrm.edges
|
// writes .osrm.edges
|
||||||
template <typename TurnDataT>
|
template <typename TurnDataT>
|
||||||
inline void writeTurnData(const boost::filesystem::path &path,
|
inline void writeTurnData(const std::filesystem::path &path,
|
||||||
const TurnDataT &turn_data,
|
const TurnDataT &turn_data,
|
||||||
const std::uint32_t connectivity_checksum)
|
const std::uint32_t connectivity_checksum)
|
||||||
{
|
{
|
||||||
|
@ -21,7 +21,7 @@
|
|||||||
#include <napi.h>
|
#include <napi.h>
|
||||||
|
|
||||||
#include <boost/assert.hpp>
|
#include <boost/assert.hpp>
|
||||||
#include <boost/optional.hpp>
|
#include <optional>
|
||||||
|
|
||||||
#include <algorithm>
|
#include <algorithm>
|
||||||
#include <iterator>
|
#include <iterator>
|
||||||
@ -395,11 +395,11 @@ inline engine_config_ptr argumentsToEngineConfig(const Napi::CallbackInfo &args)
|
|||||||
return engine_config;
|
return engine_config;
|
||||||
}
|
}
|
||||||
|
|
||||||
inline boost::optional<std::vector<osrm::Coordinate>>
|
inline std::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());
|
||||||
boost::optional<std::vector<osrm::Coordinate>> resulting_coordinates;
|
std::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 +450,7 @@ parseCoordinateArray(const Napi::Array &coordinates_array)
|
|||||||
osrm::util::FloatLatitude{std::move(lat)});
|
osrm::util::FloatLatitude{std::move(lat)});
|
||||||
}
|
}
|
||||||
|
|
||||||
resulting_coordinates = boost::make_optional(std::move(temp_coordinates));
|
resulting_coordinates = std::make_optional(std::move(temp_coordinates));
|
||||||
return resulting_coordinates;
|
return resulting_coordinates;
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -1023,7 +1023,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 boost::optional<osrm::engine::api::BaseParameters::OutputFormatType> &output_format = {})
|
const std::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 will
|
// we only need to save the forward edges, since the read method
|
||||||
// convert from forward to bi-directional edges again
|
// will 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 boost::filesystem::path &path)
|
inline DynamicEdgeBasedGraph LoadEdgeBasedGraph(const std::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 boost::filesystem::path &path, MultiLevelPartitionT &mlp)
|
inline void readPartition(const std::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 boost::filesystem::path &path, MultiLevelPartiti
|
|||||||
|
|
||||||
// writes .osrm.partition file
|
// writes .osrm.partition file
|
||||||
template <typename MultiLevelPartitionT>
|
template <typename MultiLevelPartitionT>
|
||||||
inline void writePartition(const boost::filesystem::path &path, const MultiLevelPartitionT &mlp)
|
inline void writePartition(const std::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 boost::filesystem::path &path, const MultiLevel
|
|||||||
|
|
||||||
// reads .osrm.cells file
|
// reads .osrm.cells file
|
||||||
template <typename CellStorageT>
|
template <typename CellStorageT>
|
||||||
inline void readCells(const boost::filesystem::path &path, CellStorageT &storage)
|
inline void readCells(const std::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 boost::filesystem::path &path, CellStorageT &storage
|
|||||||
|
|
||||||
// writes .osrm.cells file
|
// writes .osrm.cells file
|
||||||
template <typename CellStorageT>
|
template <typename CellStorageT>
|
||||||
inline void writeCells(const boost::filesystem::path &path, CellStorageT &storage)
|
inline void writeCells(const std::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 boost::filesystem::path &path, CellStorageT &storag
|
|||||||
|
|
||||||
// reads .osrm.mldgr file
|
// reads .osrm.mldgr file
|
||||||
template <typename MultiLevelGraphT>
|
template <typename MultiLevelGraphT>
|
||||||
inline void readGraph(const boost::filesystem::path &path,
|
inline void readGraph(const std::filesystem::path &path,
|
||||||
MultiLevelGraphT &graph,
|
MultiLevelGraphT &graph,
|
||||||
std::uint32_t &connectivity_checksum)
|
std::uint32_t &connectivity_checksum)
|
||||||
{
|
{
|
||||||
@ -80,7 +80,7 @@ inline void readGraph(const boost::filesystem::path &path,
|
|||||||
|
|
||||||
// writes .osrm.mldgr file
|
// writes .osrm.mldgr file
|
||||||
template <typename MultiLevelGraphT>
|
template <typename MultiLevelGraphT>
|
||||||
inline void writeGraph(const boost::filesystem::path &path,
|
inline void writeGraph(const std::filesystem::path &path,
|
||||||
const MultiLevelGraphT &graph,
|
const MultiLevelGraphT &graph,
|
||||||
const std::uint32_t connectivity_checksum)
|
const std::uint32_t connectivity_checksum)
|
||||||
{
|
{
|
||||||
|
@ -1,9 +1,8 @@
|
|||||||
#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"
|
||||||
@ -29,7 +28,7 @@ struct PartitionerConfig final : storage::IOConfig
|
|||||||
{
|
{
|
||||||
}
|
}
|
||||||
|
|
||||||
void UseDefaultOutputNames(const boost::filesystem::path &base)
|
void UseDefaultOutputNames(const std::filesystem::path &base)
|
||||||
{
|
{
|
||||||
IOConfig::UseDefaultOutputNames(base);
|
IOConfig::UseDefaultOutputNames(base);
|
||||||
}
|
}
|
||||||
|
@ -7,9 +7,9 @@
|
|||||||
#include "engine/hint.hpp"
|
#include "engine/hint.hpp"
|
||||||
#include "engine/polyline_compressor.hpp"
|
#include "engine/polyline_compressor.hpp"
|
||||||
|
|
||||||
#include <boost/optional.hpp>
|
|
||||||
#include <boost/phoenix.hpp>
|
#include <boost/phoenix.hpp>
|
||||||
#include <boost/spirit/include/qi.hpp>
|
#include <boost/spirit/include/qi.hpp>
|
||||||
|
#include <optional>
|
||||||
|
|
||||||
#include <limits>
|
#include <limits>
|
||||||
#include <string>
|
#include <string>
|
||||||
@ -88,7 +88,7 @@ struct BaseParametersGrammar : boost::spirit::qi::grammar<Iterator, Signature>
|
|||||||
}
|
}
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
base_parameters.hints.emplace_back(boost::none);
|
base_parameters.hints.emplace_back(std::nullopt);
|
||||||
}
|
}
|
||||||
};
|
};
|
||||||
|
|
||||||
@ -96,13 +96,24 @@ struct BaseParametersGrammar : boost::spirit::qi::grammar<Iterator, Signature>
|
|||||||
[](engine::api::BaseParameters &base_parameters,
|
[](engine::api::BaseParameters &base_parameters,
|
||||||
boost::optional<boost::fusion::vector2<short, short>> bearing_range)
|
boost::optional<boost::fusion::vector2<short, short>> bearing_range)
|
||||||
{
|
{
|
||||||
boost::optional<engine::Bearing> bearing;
|
std::optional<engine::Bearing> bearing;
|
||||||
if (bearing_range)
|
if (bearing_range)
|
||||||
{
|
{
|
||||||
bearing = engine::Bearing{boost::fusion::at_c<0>(*bearing_range),
|
bearing = engine::Bearing{boost::fusion::at_c<0>(*bearing_range),
|
||||||
boost::fusion::at_c<1>(*bearing_range)};
|
boost::fusion::at_c<1>(*bearing_range)};
|
||||||
}
|
}
|
||||||
base_parameters.bearings.push_back(std::move(bearing));
|
base_parameters.bearings.push_back(bearing);
|
||||||
|
};
|
||||||
|
|
||||||
|
const auto add_approach = [](engine::api::BaseParameters &base_parameters,
|
||||||
|
boost::optional<osrm::engine::Approach> approach) {
|
||||||
|
base_parameters.approaches.push_back(approach ? std::make_optional(*approach)
|
||||||
|
: std::nullopt);
|
||||||
|
};
|
||||||
|
|
||||||
|
const auto add_radius = [](engine::api::BaseParameters &base_parameters,
|
||||||
|
boost::optional<double> radius) {
|
||||||
|
base_parameters.radiuses.push_back(radius ? std::make_optional(*radius) : std::nullopt);
|
||||||
};
|
};
|
||||||
|
|
||||||
polyline_chars = qi::char_("a-zA-Z0-9_.--[]{}@?|\\%~`^");
|
polyline_chars = qi::char_("a-zA-Z0-9_.--[]{}@?|\\%~`^");
|
||||||
@ -144,9 +155,9 @@ struct BaseParametersGrammar : boost::spirit::qi::grammar<Iterator, Signature>
|
|||||||
((location_rule % ';') | polyline_rule |
|
((location_rule % ';') | polyline_rule |
|
||||||
polyline6_rule)[ph::bind(&engine::api::BaseParameters::coordinates, qi::_r1) = qi::_1];
|
polyline6_rule)[ph::bind(&engine::api::BaseParameters::coordinates, qi::_r1) = qi::_1];
|
||||||
|
|
||||||
radiuses_rule = qi::lit("radiuses=") >
|
radiuses_rule =
|
||||||
(-(qi::double_ | unlimited_rule) %
|
qi::lit("radiuses=") >
|
||||||
';')[ph::bind(&engine::api::BaseParameters::radiuses, qi::_r1) = qi::_1];
|
(-(qi::double_ | unlimited_rule))[ph::bind(add_radius, qi::_r1, qi::_1)] % ';';
|
||||||
|
|
||||||
hints_rule =
|
hints_rule =
|
||||||
qi::lit("hints=") >
|
qi::lit("hints=") >
|
||||||
@ -170,8 +181,7 @@ struct BaseParametersGrammar : boost::spirit::qi::grammar<Iterator, Signature>
|
|||||||
"curb", engine::Approach::CURB)("opposite", engine::Approach::OPPOSITE);
|
"curb", engine::Approach::CURB)("opposite", engine::Approach::OPPOSITE);
|
||||||
|
|
||||||
approach_rule = qi::lit("approaches=") >
|
approach_rule = qi::lit("approaches=") >
|
||||||
(-approach_type %
|
(-approach_type)[ph::bind(add_approach, qi::_r1, qi::_1)] % ';';
|
||||||
';')[ph::bind(&engine::api::BaseParameters::approaches, qi::_r1) = qi::_1];
|
|
||||||
|
|
||||||
snapping_type.add("default", engine::api::BaseParameters::SnappingType::Default)(
|
snapping_type.add("default", engine::api::BaseParameters::SnappingType::Default)(
|
||||||
"any", engine::api::BaseParameters::SnappingType::Any);
|
"any", engine::api::BaseParameters::SnappingType::Any);
|
||||||
|
@ -26,13 +26,13 @@ using is_parameter_t =
|
|||||||
// Starts parsing and iter and modifies it until iter == end or parsing failed
|
// Starts parsing and iter and modifies it until iter == end or parsing failed
|
||||||
template <typename ParameterT,
|
template <typename ParameterT,
|
||||||
typename std::enable_if<detail::is_parameter_t<ParameterT>::value, int>::type = 0>
|
typename std::enable_if<detail::is_parameter_t<ParameterT>::value, int>::type = 0>
|
||||||
boost::optional<ParameterT> parseParameters(std::string::iterator &iter,
|
std::optional<ParameterT> parseParameters(std::string::iterator &iter,
|
||||||
const std::string::iterator end);
|
const std::string::iterator end);
|
||||||
|
|
||||||
// Copy on purpose because we need mutability
|
// Copy on purpose because we need mutability
|
||||||
template <typename ParameterT,
|
template <typename ParameterT,
|
||||||
typename std::enable_if<detail::is_parameter_t<ParameterT>::value, int>::type = 0>
|
typename std::enable_if<detail::is_parameter_t<ParameterT>::value, int>::type = 0>
|
||||||
boost::optional<ParameterT> parseParameters(std::string options_string)
|
std::optional<ParameterT> parseParameters(std::string options_string)
|
||||||
{
|
{
|
||||||
auto first = options_string.begin();
|
auto first = options_string.begin();
|
||||||
const auto last = options_string.end();
|
const auto last = options_string.end();
|
||||||
|
@ -3,7 +3,7 @@
|
|||||||
|
|
||||||
#include "server/api/parsed_url.hpp"
|
#include "server/api/parsed_url.hpp"
|
||||||
|
|
||||||
#include <boost/optional.hpp>
|
#include <optional>
|
||||||
|
|
||||||
#include <string>
|
#include <string>
|
||||||
|
|
||||||
@ -11,9 +11,9 @@ namespace osrm::server::api
|
|||||||
{
|
{
|
||||||
|
|
||||||
// Starts parsing and iter and modifies it until iter == end or parsing failed
|
// Starts parsing and iter and modifies it until iter == end or parsing failed
|
||||||
boost::optional<ParsedURL> parseURL(std::string::iterator &iter, const std::string::iterator end);
|
std::optional<ParsedURL> parseURL(std::string::iterator &iter, const std::string::iterator end);
|
||||||
|
|
||||||
inline boost::optional<ParsedURL> parseURL(std::string url_string)
|
inline std::optional<ParsedURL> parseURL(std::string url_string)
|
||||||
{
|
{
|
||||||
auto iter = url_string.begin();
|
auto iter = url_string.begin();
|
||||||
return parseURL(iter, url_string.end());
|
return parseURL(iter, url_string.end());
|
||||||
|
@ -12,7 +12,7 @@ struct header
|
|||||||
// explicitly use default copy c'tor as adding move c'tor
|
// explicitly use default copy c'tor as adding move c'tor
|
||||||
header &operator=(const header &other) = default;
|
header &operator=(const header &other) = default;
|
||||||
header(std::string name, std::string value) : name(std::move(name)), value(std::move(value)) {}
|
header(std::string name, std::string value) : name(std::move(name)), value(std::move(value)) {}
|
||||||
header(header &&other) : name(std::move(other.name)), value(std::move(other.value)) {}
|
header(header &&other) noexcept : name(std::move(other.name)), value(std::move(other.value)) {}
|
||||||
|
|
||||||
void clear()
|
void clear()
|
||||||
{
|
{
|
||||||
|
@ -10,14 +10,13 @@
|
|||||||
#include "util/log.hpp"
|
#include "util/log.hpp"
|
||||||
#include "util/version.hpp"
|
#include "util/version.hpp"
|
||||||
|
|
||||||
#include <boost/filesystem.hpp>
|
|
||||||
#include <boost/filesystem/fstream.hpp>
|
|
||||||
#include <boost/iostreams/device/array.hpp>
|
#include <boost/iostreams/device/array.hpp>
|
||||||
#include <boost/iostreams/seek.hpp>
|
#include <boost/iostreams/seek.hpp>
|
||||||
#include <boost/iostreams/stream.hpp>
|
#include <boost/iostreams/stream.hpp>
|
||||||
|
|
||||||
#include <cerrno>
|
#include <cerrno>
|
||||||
#include <cstring>
|
#include <cstring>
|
||||||
|
#include <filesystem>
|
||||||
|
#include <fstream>
|
||||||
#include <iostream>
|
#include <iostream>
|
||||||
#include <tuple>
|
#include <tuple>
|
||||||
#include <type_traits>
|
#include <type_traits>
|
||||||
@ -35,11 +34,11 @@ class FileReader
|
|||||||
};
|
};
|
||||||
|
|
||||||
FileReader(const std::string &filename, const FingerprintFlag flag)
|
FileReader(const std::string &filename, const FingerprintFlag flag)
|
||||||
: FileReader(boost::filesystem::path(filename), flag)
|
: FileReader(std::filesystem::path(filename), flag)
|
||||||
{
|
{
|
||||||
}
|
}
|
||||||
|
|
||||||
FileReader(const boost::filesystem::path &filepath_, const FingerprintFlag flag)
|
FileReader(const std::filesystem::path &filepath_, const FingerprintFlag flag)
|
||||||
: filepath(filepath_), fingerprint(flag)
|
: filepath(filepath_), fingerprint(flag)
|
||||||
{
|
{
|
||||||
input_stream.open(filepath, std::ios::binary);
|
input_stream.open(filepath, std::ios::binary);
|
||||||
@ -58,14 +57,14 @@ class FileReader
|
|||||||
|
|
||||||
std::size_t GetSize()
|
std::size_t GetSize()
|
||||||
{
|
{
|
||||||
const boost::filesystem::path path(filepath);
|
const std::filesystem::path path(filepath);
|
||||||
try
|
try
|
||||||
{
|
{
|
||||||
return std::size_t(boost::filesystem::file_size(path)) -
|
return std::size_t(std::filesystem::file_size(path)) -
|
||||||
((fingerprint == FingerprintFlag::VerifyFingerprint) ? sizeof(util::FingerPrint)
|
((fingerprint == FingerprintFlag::VerifyFingerprint) ? sizeof(util::FingerPrint)
|
||||||
: 0);
|
: 0);
|
||||||
}
|
}
|
||||||
catch (const boost::filesystem::filesystem_error &ex)
|
catch (const std::filesystem::filesystem_error &ex)
|
||||||
{
|
{
|
||||||
std::cout << ex.what() << std::endl;
|
std::cout << ex.what() << std::endl;
|
||||||
throw;
|
throw;
|
||||||
@ -196,8 +195,8 @@ class FileReader
|
|||||||
}
|
}
|
||||||
|
|
||||||
private:
|
private:
|
||||||
const boost::filesystem::path filepath;
|
const std::filesystem::path filepath;
|
||||||
boost::filesystem::ifstream input_stream;
|
std::ifstream input_stream;
|
||||||
FingerprintFlag fingerprint;
|
FingerprintFlag fingerprint;
|
||||||
};
|
};
|
||||||
|
|
||||||
@ -211,11 +210,11 @@ class FileWriter
|
|||||||
};
|
};
|
||||||
|
|
||||||
FileWriter(const std::string &filename, const FingerprintFlag flag)
|
FileWriter(const std::string &filename, const FingerprintFlag flag)
|
||||||
: FileWriter(boost::filesystem::path(filename), flag)
|
: FileWriter(std::filesystem::path(filename), flag)
|
||||||
{
|
{
|
||||||
}
|
}
|
||||||
|
|
||||||
FileWriter(const boost::filesystem::path &filepath_, const FingerprintFlag flag)
|
FileWriter(const std::filesystem::path &filepath_, const FingerprintFlag flag)
|
||||||
: filepath(filepath_), fingerprint(flag)
|
: filepath(filepath_), fingerprint(flag)
|
||||||
{
|
{
|
||||||
output_stream.open(filepath, std::ios::binary);
|
output_stream.open(filepath, std::ios::binary);
|
||||||
@ -284,8 +283,8 @@ class FileWriter
|
|||||||
}
|
}
|
||||||
|
|
||||||
private:
|
private:
|
||||||
const boost::filesystem::path filepath;
|
const std::filesystem::path filepath;
|
||||||
boost::filesystem::ofstream output_stream;
|
std::ofstream output_stream;
|
||||||
FingerprintFlag fingerprint;
|
FingerprintFlag fingerprint;
|
||||||
};
|
};
|
||||||
|
|
||||||
|
@ -3,19 +3,19 @@
|
|||||||
|
|
||||||
#include "util/exception.hpp"
|
#include "util/exception.hpp"
|
||||||
|
|
||||||
#include <array>
|
|
||||||
#include <boost/algorithm/string/predicate.hpp>
|
#include <boost/algorithm/string/predicate.hpp>
|
||||||
#include <boost/filesystem.hpp>
|
|
||||||
#include <boost/filesystem/path.hpp>
|
#include <array>
|
||||||
|
#include <filesystem>
|
||||||
#include <string>
|
#include <string>
|
||||||
|
|
||||||
namespace osrm::storage
|
namespace osrm::storage
|
||||||
{
|
{
|
||||||
struct IOConfig
|
struct IOConfig
|
||||||
{
|
{
|
||||||
IOConfig(std::vector<boost::filesystem::path> required_input_files_,
|
IOConfig(std::vector<std::filesystem::path> required_input_files_,
|
||||||
std::vector<boost::filesystem::path> optional_input_files_,
|
std::vector<std::filesystem::path> optional_input_files_,
|
||||||
std::vector<boost::filesystem::path> output_files_)
|
std::vector<std::filesystem::path> output_files_)
|
||||||
: required_input_files(std::move(required_input_files_)),
|
: required_input_files(std::move(required_input_files_)),
|
||||||
optional_input_files(std::move(optional_input_files_)),
|
optional_input_files(std::move(optional_input_files_)),
|
||||||
output_files(std::move(output_files_))
|
output_files(std::move(output_files_))
|
||||||
@ -24,7 +24,7 @@ struct IOConfig
|
|||||||
|
|
||||||
bool IsValid() const;
|
bool IsValid() const;
|
||||||
std::vector<std::string> GetMissingFiles() const;
|
std::vector<std::string> GetMissingFiles() const;
|
||||||
boost::filesystem::path GetPath(const std::string &fileName) const
|
std::filesystem::path GetPath(const std::string &fileName) const
|
||||||
{
|
{
|
||||||
if (!IsConfigured(fileName, required_input_files) &&
|
if (!IsConfigured(fileName, required_input_files) &&
|
||||||
!IsConfigured(fileName, optional_input_files) && !IsConfigured(fileName, output_files))
|
!IsConfigured(fileName, optional_input_files) && !IsConfigured(fileName, output_files))
|
||||||
@ -40,11 +40,11 @@ struct IOConfig
|
|||||||
return IsConfigured(fileName, required_input_files);
|
return IsConfigured(fileName, required_input_files);
|
||||||
}
|
}
|
||||||
|
|
||||||
boost::filesystem::path base_path;
|
std::filesystem::path base_path;
|
||||||
|
|
||||||
protected:
|
protected:
|
||||||
// Infer the base path from the path of the .osrm file
|
// Infer the base path from the path of the .osrm file
|
||||||
void UseDefaultOutputNames(const boost::filesystem::path &base)
|
void UseDefaultOutputNames(const std::filesystem::path &base)
|
||||||
{
|
{
|
||||||
// potentially strip off the .osrm (or other) extensions for
|
// potentially strip off the .osrm (or other) extensions for
|
||||||
// determining the base path=
|
// determining the base path=
|
||||||
@ -67,7 +67,7 @@ struct IOConfig
|
|||||||
|
|
||||||
private:
|
private:
|
||||||
static bool IsConfigured(const std::string &fileName,
|
static bool IsConfigured(const std::string &fileName,
|
||||||
const std::vector<boost::filesystem::path> &paths)
|
const std::vector<std::filesystem::path> &paths)
|
||||||
{
|
{
|
||||||
for (auto &path : paths)
|
for (auto &path : paths)
|
||||||
{
|
{
|
||||||
@ -80,9 +80,9 @@ struct IOConfig
|
|||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
|
|
||||||
std::vector<boost::filesystem::path> required_input_files;
|
std::vector<std::filesystem::path> required_input_files;
|
||||||
std::vector<boost::filesystem::path> optional_input_files;
|
std::vector<std::filesystem::path> optional_input_files;
|
||||||
std::vector<boost::filesystem::path> output_files;
|
std::vector<std::filesystem::path> output_files;
|
||||||
};
|
};
|
||||||
} // namespace osrm::storage
|
} // namespace osrm::storage
|
||||||
|
|
||||||
|
@ -5,8 +5,6 @@
|
|||||||
#include "util/exception_utils.hpp"
|
#include "util/exception_utils.hpp"
|
||||||
#include "util/log.hpp"
|
#include "util/log.hpp"
|
||||||
|
|
||||||
#include <boost/filesystem.hpp>
|
|
||||||
#include <boost/filesystem/fstream.hpp>
|
|
||||||
#include <boost/interprocess/mapped_region.hpp>
|
#include <boost/interprocess/mapped_region.hpp>
|
||||||
#ifndef _WIN32
|
#ifndef _WIN32
|
||||||
#include <boost/interprocess/xsi_shared_memory.hpp>
|
#include <boost/interprocess/xsi_shared_memory.hpp>
|
||||||
@ -23,6 +21,8 @@
|
|||||||
|
|
||||||
#include <algorithm>
|
#include <algorithm>
|
||||||
#include <exception>
|
#include <exception>
|
||||||
|
#include <filesystem>
|
||||||
|
#include <fstream>
|
||||||
#include <thread>
|
#include <thread>
|
||||||
|
|
||||||
#include "storage/shared_memory_ownership.hpp"
|
#include "storage/shared_memory_ownership.hpp"
|
||||||
@ -32,10 +32,10 @@ namespace osrm::storage
|
|||||||
|
|
||||||
struct OSRMLockFile
|
struct OSRMLockFile
|
||||||
{
|
{
|
||||||
template <typename IdentifierT> boost::filesystem::path operator()(const IdentifierT &id)
|
template <typename IdentifierT> std::filesystem::path operator()(const IdentifierT &id)
|
||||||
{
|
{
|
||||||
boost::filesystem::path temp_dir = boost::filesystem::temp_directory_path();
|
std::filesystem::path temp_dir = std::filesystem::temp_directory_path();
|
||||||
boost::filesystem::path lock_file = temp_dir / ("osrm-" + std::to_string(id) + ".lock");
|
std::filesystem::path lock_file = temp_dir / ("osrm-" + std::to_string(id) + ".lock");
|
||||||
return lock_file;
|
return lock_file;
|
||||||
}
|
}
|
||||||
};
|
};
|
||||||
@ -51,7 +51,7 @@ class SharedMemory
|
|||||||
SharedMemory &operator=(const SharedMemory &) = delete;
|
SharedMemory &operator=(const SharedMemory &) = delete;
|
||||||
|
|
||||||
template <typename IdentifierT>
|
template <typename IdentifierT>
|
||||||
SharedMemory(const boost::filesystem::path &lock_file,
|
SharedMemory(const std::filesystem::path &lock_file,
|
||||||
const IdentifierT id,
|
const IdentifierT id,
|
||||||
const uint64_t size = 0)
|
const uint64_t size = 0)
|
||||||
: key(lock_file.string().c_str(), id)
|
: key(lock_file.string().c_str(), id)
|
||||||
@ -61,7 +61,7 @@ class SharedMemory
|
|||||||
{
|
{
|
||||||
shm = boost::interprocess::xsi_shared_memory(boost::interprocess::open_only, key);
|
shm = boost::interprocess::xsi_shared_memory(boost::interprocess::open_only, key);
|
||||||
|
|
||||||
util::Log(logDEBUG) << "opening " << (int)shm.get_shmid() << " from id " << (int)id;
|
util::Log(logDEBUG) << "opening " << shm.get_shmid() << " from id " << (int)id;
|
||||||
|
|
||||||
region = boost::interprocess::mapped_region(shm, boost::interprocess::read_only);
|
region = boost::interprocess::mapped_region(shm, boost::interprocess::read_only);
|
||||||
}
|
}
|
||||||
@ -202,7 +202,7 @@ class SharedMemory
|
|||||||
void *Ptr() const { return region.get_address(); }
|
void *Ptr() const { return region.get_address(); }
|
||||||
std::size_t Size() const { return region.get_size(); }
|
std::size_t Size() const { return region.get_size(); }
|
||||||
|
|
||||||
SharedMemory(const boost::filesystem::path &lock_file, const int id, const uint64_t size = 0)
|
SharedMemory(const std::filesystem::path &lock_file, const int id, const uint64_t size = 0)
|
||||||
{
|
{
|
||||||
sprintf(key, "%s.%d", "osrm.lock", id);
|
sprintf(key, "%s.%d", "osrm.lock", id);
|
||||||
if (0 == size)
|
if (0 == size)
|
||||||
@ -290,7 +290,7 @@ std::unique_ptr<SharedMemory> makeSharedMemory(const IdentifierT &id, const uint
|
|||||||
try
|
try
|
||||||
{
|
{
|
||||||
LockFileT lock_file;
|
LockFileT lock_file;
|
||||||
if (!boost::filesystem::exists(lock_file(id)))
|
if (!std::filesystem::exists(lock_file(id)))
|
||||||
{
|
{
|
||||||
if (0 == size)
|
if (0 == size)
|
||||||
{
|
{
|
||||||
@ -298,7 +298,7 @@ std::unique_ptr<SharedMemory> makeSharedMemory(const IdentifierT &id, const uint
|
|||||||
}
|
}
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
boost::filesystem::ofstream ofs(lock_file(id));
|
std::ofstream ofs(lock_file(id));
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
return std::make_unique<SharedMemory>(lock_file(id), id, size);
|
return std::make_unique<SharedMemory>(lock_file(id), id, size);
|
||||||
|
@ -32,15 +32,14 @@ SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
|
|||||||
#include "storage/shared_datatype.hpp"
|
#include "storage/shared_datatype.hpp"
|
||||||
#include "storage/storage_config.hpp"
|
#include "storage/storage_config.hpp"
|
||||||
|
|
||||||
#include <boost/filesystem/path.hpp>
|
#include <filesystem>
|
||||||
|
|
||||||
#include <string>
|
#include <string>
|
||||||
#include <vector>
|
#include <vector>
|
||||||
|
|
||||||
namespace osrm::storage
|
namespace osrm::storage
|
||||||
{
|
{
|
||||||
|
|
||||||
void populateLayoutFromFile(const boost::filesystem::path &path, storage::BaseDataLayout &layout);
|
void populateLayoutFromFile(const std::filesystem::path &path, storage::BaseDataLayout &layout);
|
||||||
|
|
||||||
class Storage
|
class Storage
|
||||||
{
|
{
|
||||||
@ -51,10 +50,10 @@ class Storage
|
|||||||
void PopulateStaticData(const SharedDataIndex &index);
|
void PopulateStaticData(const SharedDataIndex &index);
|
||||||
void PopulateUpdatableData(const SharedDataIndex &index);
|
void PopulateUpdatableData(const SharedDataIndex &index);
|
||||||
void PopulateLayout(storage::BaseDataLayout &layout,
|
void PopulateLayout(storage::BaseDataLayout &layout,
|
||||||
const std::vector<std::pair<bool, boost::filesystem::path>> &files);
|
const std::vector<std::pair<bool, std::filesystem::path>> &files);
|
||||||
std::string PopulateLayoutWithRTree(storage::BaseDataLayout &layout);
|
std::string PopulateLayoutWithRTree(storage::BaseDataLayout &layout);
|
||||||
std::vector<std::pair<bool, boost::filesystem::path>> GetUpdatableFiles();
|
std::vector<std::pair<bool, std::filesystem::path>> GetUpdatableFiles();
|
||||||
std::vector<std::pair<bool, boost::filesystem::path>> GetStaticFiles();
|
std::vector<std::pair<bool, std::filesystem::path>> GetStaticFiles();
|
||||||
|
|
||||||
private:
|
private:
|
||||||
StorageConfig config;
|
StorageConfig config;
|
||||||
|
@ -28,22 +28,23 @@ SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
|
|||||||
#ifndef STORAGE_CONFIG_HPP
|
#ifndef STORAGE_CONFIG_HPP
|
||||||
#define STORAGE_CONFIG_HPP
|
#define STORAGE_CONFIG_HPP
|
||||||
|
|
||||||
#include <boost/filesystem/path.hpp>
|
|
||||||
|
|
||||||
#include "storage/io_config.hpp"
|
#include "storage/io_config.hpp"
|
||||||
#include "osrm/datasets.hpp"
|
#include "osrm/datasets.hpp"
|
||||||
|
|
||||||
|
#include <filesystem>
|
||||||
|
#include <istream>
|
||||||
#include <set>
|
#include <set>
|
||||||
|
#include <vector>
|
||||||
|
|
||||||
namespace osrm::storage
|
namespace osrm::storage
|
||||||
{
|
{
|
||||||
|
|
||||||
std::istream &operator>>(std::istream &in, FeatureDataset &datasets);
|
std::istream &operator>>(std::istream &in, FeatureDataset &datasets);
|
||||||
|
|
||||||
static std::vector<boost::filesystem::path>
|
static std::vector<std::filesystem::path>
|
||||||
GetRequiredFiles(const std::vector<storage::FeatureDataset> &disabled_feature_dataset)
|
GetRequiredFiles(const std::vector<storage::FeatureDataset> &disabled_feature_dataset)
|
||||||
{
|
{
|
||||||
std::set<boost::filesystem::path> required{
|
std::set<std::filesystem::path> required{
|
||||||
".osrm.datasource_names",
|
".osrm.datasource_names",
|
||||||
".osrm.ebg_nodes",
|
".osrm.ebg_nodes",
|
||||||
".osrm.edges",
|
".osrm.edges",
|
||||||
@ -82,7 +83,7 @@ GetRequiredFiles(const std::vector<storage::FeatureDataset> &disabled_feature_da
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
return std::vector<boost::filesystem::path>(required.begin(), required.end());
|
return std::vector<std::filesystem::path>(required.begin(), required.end());
|
||||||
;
|
;
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -94,7 +95,7 @@ GetRequiredFiles(const std::vector<storage::FeatureDataset> &disabled_feature_da
|
|||||||
struct StorageConfig final : IOConfig
|
struct StorageConfig final : IOConfig
|
||||||
{
|
{
|
||||||
|
|
||||||
StorageConfig(const boost::filesystem::path &base,
|
StorageConfig(const std::filesystem::path &base,
|
||||||
const std::vector<storage::FeatureDataset> &disabled_feature_datasets_ = {})
|
const std::vector<storage::FeatureDataset> &disabled_feature_datasets_ = {})
|
||||||
: StorageConfig(disabled_feature_datasets_)
|
: StorageConfig(disabled_feature_datasets_)
|
||||||
{
|
{
|
||||||
|
@ -7,7 +7,7 @@
|
|||||||
#include "util/integer_range.hpp"
|
#include "util/integer_range.hpp"
|
||||||
#include "util/version.hpp"
|
#include "util/version.hpp"
|
||||||
|
|
||||||
#include <boost/filesystem/path.hpp>
|
#include <filesystem>
|
||||||
|
|
||||||
extern "C"
|
extern "C"
|
||||||
{
|
{
|
||||||
@ -19,7 +19,7 @@ namespace osrm::storage::tar
|
|||||||
namespace detail
|
namespace detail
|
||||||
{
|
{
|
||||||
inline void
|
inline void
|
||||||
checkMTarError(int error_code, const boost::filesystem::path &filepath, const std::string &name)
|
checkMTarError(int error_code, const std::filesystem::path &filepath, const std::string &name)
|
||||||
{
|
{
|
||||||
switch (error_code)
|
switch (error_code)
|
||||||
{
|
{
|
||||||
@ -78,7 +78,7 @@ class FileReader
|
|||||||
HasNoFingerprint
|
HasNoFingerprint
|
||||||
};
|
};
|
||||||
|
|
||||||
FileReader(const boost::filesystem::path &path, FingerprintFlag flag) : path(path)
|
FileReader(const std::filesystem::path &path, FingerprintFlag flag) : path(path)
|
||||||
{
|
{
|
||||||
auto ret = mtar_open(&handle, path.string().c_str(), "r");
|
auto ret = mtar_open(&handle, path.string().c_str(), "r");
|
||||||
detail::checkMTarError(ret, path, "");
|
detail::checkMTarError(ret, path, "");
|
||||||
@ -204,7 +204,7 @@ class FileReader
|
|||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
|
|
||||||
boost::filesystem::path path;
|
std::filesystem::path path;
|
||||||
mtar_t handle;
|
mtar_t handle;
|
||||||
};
|
};
|
||||||
|
|
||||||
@ -217,7 +217,7 @@ class FileWriter
|
|||||||
HasNoFingerprint
|
HasNoFingerprint
|
||||||
};
|
};
|
||||||
|
|
||||||
FileWriter(const boost::filesystem::path &path, FingerprintFlag flag) : path(path)
|
FileWriter(const std::filesystem::path &path, FingerprintFlag flag) : path(path)
|
||||||
{
|
{
|
||||||
auto ret = mtar_open(&handle, path.string().c_str(), "w");
|
auto ret = mtar_open(&handle, path.string().c_str(), "w");
|
||||||
detail::checkMTarError(ret, path, "");
|
detail::checkMTarError(ret, path, "");
|
||||||
@ -305,7 +305,7 @@ class FileWriter
|
|||||||
WriteFrom("osrm_fingerprint.meta", fingerprint);
|
WriteFrom("osrm_fingerprint.meta", fingerprint);
|
||||||
}
|
}
|
||||||
|
|
||||||
boost::filesystem::path path;
|
std::filesystem::path path;
|
||||||
mtar_t handle;
|
mtar_t handle;
|
||||||
};
|
};
|
||||||
} // namespace osrm::storage::tar
|
} // namespace osrm::storage::tar
|
||||||
|
@ -202,7 +202,7 @@ inline auto make_search_tree_view(const SharedDataIndex &index, const std::strin
|
|||||||
|
|
||||||
const char *path = index.template GetBlockPtr<char>(name + "/file_index_path");
|
const char *path = index.template GetBlockPtr<char>(name + "/file_index_path");
|
||||||
|
|
||||||
if (!boost::filesystem::exists(boost::filesystem::path{path}))
|
if (!std::filesystem::exists(std::filesystem::path{path}))
|
||||||
{
|
{
|
||||||
throw util::exception("Could not load " + std::string(path) + "Does the leaf file exist?" +
|
throw util::exception("Could not load " + std::string(path) + "Does the leaf file exist?" +
|
||||||
SOURCE_REF);
|
SOURCE_REF);
|
||||||
|
@ -12,12 +12,12 @@
|
|||||||
#include <tbb/spin_mutex.h>
|
#include <tbb/spin_mutex.h>
|
||||||
|
|
||||||
#include <boost/exception/diagnostic_information.hpp>
|
#include <boost/exception/diagnostic_information.hpp>
|
||||||
#include <boost/filesystem.hpp>
|
|
||||||
#include <boost/iostreams/device/mapped_file.hpp>
|
#include <boost/iostreams/device/mapped_file.hpp>
|
||||||
#include <boost/phoenix.hpp>
|
#include <boost/phoenix.hpp>
|
||||||
#include <boost/spirit/include/qi.hpp>
|
#include <boost/spirit/include/qi.hpp>
|
||||||
|
|
||||||
#include <exception>
|
#include <exception>
|
||||||
|
#include <filesystem>
|
||||||
#include <stdexcept>
|
#include <stdexcept>
|
||||||
#include <vector>
|
#include <vector>
|
||||||
|
|
||||||
@ -100,7 +100,7 @@ template <typename Key, typename Value> struct CSVFilesParser
|
|||||||
std::vector<std::pair<Key, Value>> result;
|
std::vector<std::pair<Key, Value>> result;
|
||||||
try
|
try
|
||||||
{
|
{
|
||||||
if (boost::filesystem::file_size(filename) == 0)
|
if (std::filesystem::file_size(filename) == 0)
|
||||||
return result;
|
return result;
|
||||||
|
|
||||||
boost::iostreams::mapped_file_source mmap(filename);
|
boost::iostreams::mapped_file_source mmap(filename);
|
||||||
|
@ -28,14 +28,13 @@ SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
|
|||||||
#ifndef OSRM_UPDATER_UPDATER_CONFIG_HPP
|
#ifndef OSRM_UPDATER_UPDATER_CONFIG_HPP
|
||||||
#define OSRM_UPDATER_UPDATER_CONFIG_HPP
|
#define OSRM_UPDATER_UPDATER_CONFIG_HPP
|
||||||
|
|
||||||
#include <boost/filesystem/path.hpp>
|
|
||||||
|
|
||||||
#include <chrono>
|
|
||||||
#include <string>
|
|
||||||
|
|
||||||
#include "storage/io_config.hpp"
|
#include "storage/io_config.hpp"
|
||||||
#include "storage/storage_config.hpp"
|
#include "storage/storage_config.hpp"
|
||||||
|
|
||||||
|
#include <chrono>
|
||||||
|
#include <filesystem>
|
||||||
|
#include <string>
|
||||||
|
|
||||||
namespace osrm::updater
|
namespace osrm::updater
|
||||||
{
|
{
|
||||||
|
|
||||||
@ -59,7 +58,7 @@ struct UpdaterConfig final : storage::IOConfig
|
|||||||
{
|
{
|
||||||
}
|
}
|
||||||
|
|
||||||
void UseDefaultOutputNames(const boost::filesystem::path &base)
|
void UseDefaultOutputNames(const std::filesystem::path &base)
|
||||||
{
|
{
|
||||||
IOConfig::UseDefaultOutputNames(base);
|
IOConfig::UseDefaultOutputNames(base);
|
||||||
}
|
}
|
||||||
|
40
include/util/binary_heap.hpp
Normal file
40
include/util/binary_heap.hpp
Normal file
@ -0,0 +1,40 @@
|
|||||||
|
#pragma once
|
||||||
|
#include <algorithm>
|
||||||
|
#include <boost/assert.hpp>
|
||||||
|
#include <vector>
|
||||||
|
|
||||||
|
namespace osrm::util
|
||||||
|
{
|
||||||
|
|
||||||
|
// in its essence it is std::priority_queue, but with `clear` method
|
||||||
|
template <typename T> class BinaryHeap
|
||||||
|
{
|
||||||
|
public:
|
||||||
|
bool empty() const { return heap_.empty(); }
|
||||||
|
|
||||||
|
const T &top() const
|
||||||
|
{
|
||||||
|
BOOST_ASSERT(!heap_.empty());
|
||||||
|
return heap_.front();
|
||||||
|
}
|
||||||
|
|
||||||
|
void pop()
|
||||||
|
{
|
||||||
|
BOOST_ASSERT(!heap_.empty());
|
||||||
|
std::pop_heap(heap_.begin(), heap_.end());
|
||||||
|
heap_.pop_back();
|
||||||
|
}
|
||||||
|
|
||||||
|
template <typename... Args> void emplace(Args &&...args)
|
||||||
|
{
|
||||||
|
heap_.emplace_back(std::forward<Args>(args)...);
|
||||||
|
std::push_heap(heap_.begin(), heap_.end());
|
||||||
|
}
|
||||||
|
|
||||||
|
void clear() { heap_.clear(); }
|
||||||
|
|
||||||
|
private:
|
||||||
|
std::vector<T> heap_;
|
||||||
|
};
|
||||||
|
|
||||||
|
} // namespace osrm::util
|
@ -26,7 +26,7 @@ struct ConcurrentIDMap
|
|||||||
mutable UpgradableMutex mutex;
|
mutable UpgradableMutex mutex;
|
||||||
|
|
||||||
ConcurrentIDMap() = default;
|
ConcurrentIDMap() = default;
|
||||||
ConcurrentIDMap(ConcurrentIDMap &&other)
|
ConcurrentIDMap(ConcurrentIDMap &&other) noexcept
|
||||||
{
|
{
|
||||||
if (this != &other)
|
if (this != &other)
|
||||||
{
|
{
|
||||||
@ -36,7 +36,7 @@ struct ConcurrentIDMap
|
|||||||
data = std::move(other.data);
|
data = std::move(other.data);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
ConcurrentIDMap &operator=(ConcurrentIDMap &&other)
|
ConcurrentIDMap &operator=(ConcurrentIDMap &&other) noexcept
|
||||||
{
|
{
|
||||||
if (this != &other)
|
if (this != &other)
|
||||||
{
|
{
|
||||||
|
@ -166,7 +166,7 @@ class DeallocatingVectorIterator
|
|||||||
|
|
||||||
template <typename ElementT> class DeallocatingVector;
|
template <typename ElementT> class DeallocatingVector;
|
||||||
|
|
||||||
template <typename T> void swap(DeallocatingVector<T> &lhs, DeallocatingVector<T> &rhs);
|
template <typename T> void swap(DeallocatingVector<T> &lhs, DeallocatingVector<T> &rhs) noexcept;
|
||||||
|
|
||||||
template <typename ElementT> class DeallocatingVector
|
template <typename ElementT> class DeallocatingVector
|
||||||
{
|
{
|
||||||
@ -204,8 +204,8 @@ template <typename ElementT> class DeallocatingVector
|
|||||||
}
|
}
|
||||||
|
|
||||||
// moving is fine
|
// moving is fine
|
||||||
DeallocatingVector(DeallocatingVector &&other) { swap(other); }
|
DeallocatingVector(DeallocatingVector &&other) noexcept { swap(other); }
|
||||||
DeallocatingVector &operator=(DeallocatingVector &&other)
|
DeallocatingVector &operator=(DeallocatingVector &&other) noexcept
|
||||||
{
|
{
|
||||||
swap(other);
|
swap(other);
|
||||||
return *this;
|
return *this;
|
||||||
@ -221,9 +221,10 @@ template <typename ElementT> class DeallocatingVector
|
|||||||
|
|
||||||
~DeallocatingVector() { clear(); }
|
~DeallocatingVector() { clear(); }
|
||||||
|
|
||||||
friend void swap<>(DeallocatingVector<ElementT> &lhs, DeallocatingVector<ElementT> &rhs);
|
friend void swap<>(DeallocatingVector<ElementT> &lhs,
|
||||||
|
DeallocatingVector<ElementT> &rhs) noexcept;
|
||||||
|
|
||||||
void swap(DeallocatingVector<ElementT> &other)
|
void swap(DeallocatingVector<ElementT> &other) noexcept
|
||||||
{
|
{
|
||||||
std::swap(current_size, other.current_size);
|
std::swap(current_size, other.current_size);
|
||||||
bucket_list.swap(other.bucket_list);
|
bucket_list.swap(other.bucket_list);
|
||||||
@ -342,7 +343,7 @@ template <typename ElementT> class DeallocatingVector
|
|||||||
}
|
}
|
||||||
};
|
};
|
||||||
|
|
||||||
template <typename T> void swap(DeallocatingVector<T> &lhs, DeallocatingVector<T> &rhs)
|
template <typename T> void swap(DeallocatingVector<T> &lhs, DeallocatingVector<T> &rhs) noexcept
|
||||||
{
|
{
|
||||||
lhs.swap(rhs);
|
lhs.swap(rhs);
|
||||||
}
|
}
|
||||||
|
@ -154,7 +154,7 @@ template <typename EdgeDataT> class DynamicGraph
|
|||||||
return *this;
|
return *this;
|
||||||
}
|
}
|
||||||
|
|
||||||
DynamicGraph(DynamicGraph &&other)
|
DynamicGraph(DynamicGraph &&other) noexcept
|
||||||
{
|
{
|
||||||
number_of_nodes = other.number_of_nodes;
|
number_of_nodes = other.number_of_nodes;
|
||||||
// atomics can't be moved this is why we need an own constructor
|
// atomics can't be moved this is why we need an own constructor
|
||||||
@ -164,7 +164,7 @@ template <typename EdgeDataT> class DynamicGraph
|
|||||||
edge_list = std::move(other.edge_list);
|
edge_list = std::move(other.edge_list);
|
||||||
}
|
}
|
||||||
|
|
||||||
DynamicGraph &operator=(DynamicGraph &&other)
|
DynamicGraph &operator=(DynamicGraph &&other) noexcept
|
||||||
{
|
{
|
||||||
number_of_nodes = other.number_of_nodes;
|
number_of_nodes = other.number_of_nodes;
|
||||||
// atomics can't be moved this is why we need an own constructor
|
// atomics can't be moved this is why we need an own constructor
|
||||||
|
@ -8,7 +8,7 @@ extern "C"
|
|||||||
#include <lualib.h>
|
#include <lualib.h>
|
||||||
}
|
}
|
||||||
|
|
||||||
#include <boost/filesystem.hpp>
|
#include <filesystem>
|
||||||
|
|
||||||
#include <string>
|
#include <string>
|
||||||
|
|
||||||
@ -20,7 +20,7 @@ namespace osrm::util
|
|||||||
// See http://lua-users.org/wiki/PackagePath for details on the package.path syntax.
|
// See http://lua-users.org/wiki/PackagePath for details on the package.path syntax.
|
||||||
inline void luaAddScriptFolderToLoadPath(lua_State *lua_state, const char *file_name)
|
inline void luaAddScriptFolderToLoadPath(lua_State *lua_state, const char *file_name)
|
||||||
{
|
{
|
||||||
boost::filesystem::path profile_path = boost::filesystem::canonical(file_name);
|
std::filesystem::path profile_path = std::filesystem::canonical(file_name);
|
||||||
std::string folder = profile_path.parent_path().generic_string();
|
std::string folder = profile_path.parent_path().generic_string();
|
||||||
const std::string lua_code = "package.path = \"" + folder + "/?.lua;\" .. package.path";
|
const std::string lua_code = "package.path = \"" + folder + "/?.lua;\" .. package.path";
|
||||||
luaL_dostring(lua_state, lua_code.c_str());
|
luaL_dostring(lua_state, lua_code.c_str());
|
||||||
|
@ -5,20 +5,22 @@
|
|||||||
#include "util/exception_utils.hpp"
|
#include "util/exception_utils.hpp"
|
||||||
#include "util/vector_view.hpp"
|
#include "util/vector_view.hpp"
|
||||||
|
|
||||||
#include <boost/filesystem/path.hpp>
|
|
||||||
#include <boost/iostreams/device/mapped_file.hpp>
|
#include <boost/iostreams/device/mapped_file.hpp>
|
||||||
|
|
||||||
|
#include <filesystem>
|
||||||
|
|
||||||
namespace osrm::util
|
namespace osrm::util
|
||||||
{
|
{
|
||||||
|
|
||||||
namespace detail
|
namespace detail
|
||||||
{
|
{
|
||||||
template <typename T, typename MmapContainerT>
|
template <typename T, typename MmapContainerT>
|
||||||
util::vector_view<T> mmapFile(const boost::filesystem::path &file, MmapContainerT &mmap_container)
|
util::vector_view<T> mmapFile(const std::filesystem::path &file, MmapContainerT &mmap_container)
|
||||||
{
|
{
|
||||||
try
|
try
|
||||||
{
|
{
|
||||||
mmap_container.open(file);
|
auto path_string = file.string();
|
||||||
|
mmap_container.open(path_string);
|
||||||
std::size_t num_objects = mmap_container.size() / sizeof(T);
|
std::size_t num_objects = mmap_container.size() / sizeof(T);
|
||||||
auto data_ptr = mmap_container.data();
|
auto data_ptr = mmap_container.data();
|
||||||
BOOST_ASSERT(reinterpret_cast<uintptr_t>(data_ptr) % alignof(T) == 0);
|
BOOST_ASSERT(reinterpret_cast<uintptr_t>(data_ptr) % alignof(T) == 0);
|
||||||
@ -33,9 +35,8 @@ util::vector_view<T> mmapFile(const boost::filesystem::path &file, MmapContainer
|
|||||||
}
|
}
|
||||||
|
|
||||||
template <typename T, typename MmapContainerT>
|
template <typename T, typename MmapContainerT>
|
||||||
util::vector_view<T> mmapFile(const boost::filesystem::path &file,
|
util::vector_view<T>
|
||||||
MmapContainerT &mmap_container,
|
mmapFile(const std::filesystem::path &file, MmapContainerT &mmap_container, const std::size_t size)
|
||||||
const std::size_t size)
|
|
||||||
{
|
{
|
||||||
try
|
try
|
||||||
{
|
{
|
||||||
@ -61,21 +62,21 @@ util::vector_view<T> mmapFile(const boost::filesystem::path &file,
|
|||||||
} // namespace detail
|
} // namespace detail
|
||||||
|
|
||||||
template <typename T>
|
template <typename T>
|
||||||
util::vector_view<const T> mmapFile(const boost::filesystem::path &file,
|
util::vector_view<const T> mmapFile(const std::filesystem::path &file,
|
||||||
boost::iostreams::mapped_file_source &mmap_container)
|
boost::iostreams::mapped_file_source &mmap_container)
|
||||||
{
|
{
|
||||||
return detail::mmapFile<const T>(file, mmap_container);
|
return detail::mmapFile<const T>(file, mmap_container);
|
||||||
}
|
}
|
||||||
|
|
||||||
template <typename T>
|
template <typename T>
|
||||||
util::vector_view<T> mmapFile(const boost::filesystem::path &file,
|
util::vector_view<T> mmapFile(const std::filesystem::path &file,
|
||||||
boost::iostreams::mapped_file &mmap_container)
|
boost::iostreams::mapped_file &mmap_container)
|
||||||
{
|
{
|
||||||
return detail::mmapFile<T>(file, mmap_container);
|
return detail::mmapFile<T>(file, mmap_container);
|
||||||
}
|
}
|
||||||
|
|
||||||
template <typename T>
|
template <typename T>
|
||||||
util::vector_view<T> mmapFile(const boost::filesystem::path &file,
|
util::vector_view<T> mmapFile(const std::filesystem::path &file,
|
||||||
boost::iostreams::mapped_file &mmap_container,
|
boost::iostreams::mapped_file &mmap_container,
|
||||||
std::size_t size)
|
std::size_t size)
|
||||||
{
|
{
|
||||||
|
@ -15,7 +15,7 @@ namespace osrm::util
|
|||||||
using DataRange = std::pair<const char *, const char *>;
|
using DataRange = std::pair<const char *, const char *>;
|
||||||
using DataMap = std::unordered_map<std::string, DataRange>;
|
using DataMap = std::unordered_map<std::string, DataRange>;
|
||||||
|
|
||||||
inline DataMap mmapTarFile(const boost::filesystem::path &path,
|
inline DataMap mmapTarFile(const std::filesystem::path &path,
|
||||||
boost::iostreams::mapped_file_source ®ion)
|
boost::iostreams::mapped_file_source ®ion)
|
||||||
{
|
{
|
||||||
DataMap map;
|
DataMap map;
|
||||||
|
@ -10,9 +10,9 @@ namespace osrm::util
|
|||||||
|
|
||||||
namespace permutation_detail
|
namespace permutation_detail
|
||||||
{
|
{
|
||||||
template <typename T> static inline void swap(T &a, T &b) { std::swap(a, b); }
|
template <typename T> static inline void swap(T &a, T &b) noexcept { std::swap(a, b); }
|
||||||
|
|
||||||
static inline void swap(std::vector<bool>::reference a, std::vector<bool>::reference b)
|
static inline void swap(std::vector<bool>::reference a, std::vector<bool>::reference b) noexcept
|
||||||
{
|
{
|
||||||
std::vector<bool>::swap(a, b);
|
std::vector<bool>::swap(a, b);
|
||||||
}
|
}
|
||||||
|
@ -2,7 +2,9 @@
|
|||||||
#define STATIC_RTREE_HPP
|
#define STATIC_RTREE_HPP
|
||||||
|
|
||||||
#include "storage/tar_fwd.hpp"
|
#include "storage/tar_fwd.hpp"
|
||||||
|
#include "osrm/coordinate.hpp"
|
||||||
#include "util/bearing.hpp"
|
#include "util/bearing.hpp"
|
||||||
|
#include "util/binary_heap.hpp"
|
||||||
#include "util/coordinate_calculation.hpp"
|
#include "util/coordinate_calculation.hpp"
|
||||||
#include "util/deallocating_vector.hpp"
|
#include "util/deallocating_vector.hpp"
|
||||||
#include "util/exception.hpp"
|
#include "util/exception.hpp"
|
||||||
@ -15,12 +17,9 @@
|
|||||||
#include "util/vector_view.hpp"
|
#include "util/vector_view.hpp"
|
||||||
#include "util/web_mercator.hpp"
|
#include "util/web_mercator.hpp"
|
||||||
|
|
||||||
#include "osrm/coordinate.hpp"
|
|
||||||
|
|
||||||
#include "storage/shared_memory_ownership.hpp"
|
#include "storage/shared_memory_ownership.hpp"
|
||||||
|
|
||||||
#include <boost/assert.hpp>
|
#include <boost/assert.hpp>
|
||||||
#include <boost/filesystem.hpp>
|
|
||||||
#include <boost/format.hpp>
|
#include <boost/format.hpp>
|
||||||
#include <boost/iostreams/device/mapped_file.hpp>
|
#include <boost/iostreams/device/mapped_file.hpp>
|
||||||
|
|
||||||
@ -30,6 +29,7 @@
|
|||||||
|
|
||||||
#include <algorithm>
|
#include <algorithm>
|
||||||
#include <array>
|
#include <array>
|
||||||
|
#include <filesystem>
|
||||||
#include <limits>
|
#include <limits>
|
||||||
#include <memory>
|
#include <memory>
|
||||||
#include <queue>
|
#include <queue>
|
||||||
@ -271,7 +271,7 @@ class StaticRTree
|
|||||||
// Construct a packed Hilbert-R-Tree with Kamel-Faloutsos algorithm [1]
|
// Construct a packed Hilbert-R-Tree with Kamel-Faloutsos algorithm [1]
|
||||||
explicit StaticRTree(const std::vector<EdgeDataT> &input_data_vector,
|
explicit StaticRTree(const std::vector<EdgeDataT> &input_data_vector,
|
||||||
const Vector<Coordinate> &coordinate_list,
|
const Vector<Coordinate> &coordinate_list,
|
||||||
const boost::filesystem::path &on_disk_file_name)
|
const std::filesystem::path &on_disk_file_name)
|
||||||
: m_coordinate_list(coordinate_list.data(), coordinate_list.size())
|
: m_coordinate_list(coordinate_list.data(), coordinate_list.size())
|
||||||
{
|
{
|
||||||
const auto element_count = input_data_vector.size();
|
const auto element_count = input_data_vector.size();
|
||||||
@ -458,7 +458,7 @@ class StaticRTree
|
|||||||
* Constructs an empty RTree for de-serialization.
|
* Constructs an empty RTree for de-serialization.
|
||||||
*/
|
*/
|
||||||
template <typename = std::enable_if<Ownership == storage::Ownership::Container>>
|
template <typename = std::enable_if<Ownership == storage::Ownership::Container>>
|
||||||
explicit StaticRTree(const boost::filesystem::path &on_disk_file_name,
|
explicit StaticRTree(const std::filesystem::path &on_disk_file_name,
|
||||||
const Vector<Coordinate> &coordinate_list)
|
const Vector<Coordinate> &coordinate_list)
|
||||||
: m_coordinate_list(coordinate_list.data(), coordinate_list.size()),
|
: m_coordinate_list(coordinate_list.data(), coordinate_list.size()),
|
||||||
m_objects(mmapFile<EdgeDataT>(on_disk_file_name, m_objects_region))
|
m_objects(mmapFile<EdgeDataT>(on_disk_file_name, m_objects_region))
|
||||||
@ -473,7 +473,7 @@ class StaticRTree
|
|||||||
*/
|
*/
|
||||||
explicit StaticRTree(Vector<TreeNode> search_tree_,
|
explicit StaticRTree(Vector<TreeNode> search_tree_,
|
||||||
Vector<std::uint64_t> tree_level_starts,
|
Vector<std::uint64_t> tree_level_starts,
|
||||||
const boost::filesystem::path &on_disk_file_name,
|
const std::filesystem::path &on_disk_file_name,
|
||||||
const Vector<Coordinate> &coordinate_list)
|
const Vector<Coordinate> &coordinate_list)
|
||||||
: m_search_tree(std::move(search_tree_)),
|
: m_search_tree(std::move(search_tree_)),
|
||||||
m_coordinate_list(coordinate_list.data(), coordinate_list.size()),
|
m_coordinate_list(coordinate_list.data(), coordinate_list.size()),
|
||||||
@ -554,9 +554,12 @@ class StaticRTree
|
|||||||
auto projected_coordinate = web_mercator::fromWGS84(input_coordinate);
|
auto projected_coordinate = web_mercator::fromWGS84(input_coordinate);
|
||||||
Coordinate fixed_projected_coordinate{projected_coordinate};
|
Coordinate fixed_projected_coordinate{projected_coordinate};
|
||||||
|
|
||||||
|
// we re-use queue for each query to avoid re-allocating memory
|
||||||
|
static thread_local util::BinaryHeap<QueryCandidate> traversal_queue;
|
||||||
|
|
||||||
|
traversal_queue.clear();
|
||||||
// initialize queue with root element
|
// initialize queue with root element
|
||||||
std::priority_queue<QueryCandidate> traversal_queue;
|
traversal_queue.emplace(QueryCandidate{0, TreeIndex{}});
|
||||||
traversal_queue.push(QueryCandidate{0, TreeIndex{}});
|
|
||||||
|
|
||||||
while (!traversal_queue.empty())
|
while (!traversal_queue.empty())
|
||||||
{
|
{
|
||||||
@ -710,10 +713,11 @@ class StaticRTree
|
|||||||
// distance must be non-negative
|
// distance must be non-negative
|
||||||
BOOST_ASSERT(0. <= squared_distance);
|
BOOST_ASSERT(0. <= squared_distance);
|
||||||
BOOST_ASSERT(i < std::numeric_limits<std::uint32_t>::max());
|
BOOST_ASSERT(i < std::numeric_limits<std::uint32_t>::max());
|
||||||
traversal_queue.push(QueryCandidate{squared_distance,
|
|
||||||
leaf_id,
|
traversal_queue.emplace(QueryCandidate{squared_distance,
|
||||||
static_cast<std::uint32_t>(i),
|
leaf_id,
|
||||||
Coordinate{projected_nearest}});
|
static_cast<std::uint32_t>(i),
|
||||||
|
Coordinate{projected_nearest}});
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -742,7 +746,7 @@ class StaticRTree
|
|||||||
child.minimum_bounding_rectangle.GetMinSquaredDist(
|
child.minimum_bounding_rectangle.GetMinSquaredDist(
|
||||||
fixed_projected_input_coordinate);
|
fixed_projected_input_coordinate);
|
||||||
|
|
||||||
traversal_queue.push(QueryCandidate{
|
traversal_queue.emplace(QueryCandidate{
|
||||||
squared_lower_bound_to_element,
|
squared_lower_bound_to_element,
|
||||||
TreeIndex(parent.level + 1, child_index - m_tree_level_starts[parent.level + 1])});
|
TreeIndex(parent.level + 1, child_index - m_tree_level_starts[parent.level + 1])});
|
||||||
}
|
}
|
||||||
|
@ -1,8 +1,9 @@
|
|||||||
#ifndef STRING_UTIL_HPP
|
#ifndef STRING_UTIL_HPP
|
||||||
#define STRING_UTIL_HPP
|
#define STRING_UTIL_HPP
|
||||||
|
|
||||||
|
#include <array>
|
||||||
#include <cctype>
|
#include <cctype>
|
||||||
|
#include <cstddef>
|
||||||
#include <random>
|
#include <random>
|
||||||
#include <string>
|
#include <string>
|
||||||
#include <vector>
|
#include <vector>
|
||||||
@ -10,26 +11,30 @@
|
|||||||
namespace osrm::util
|
namespace osrm::util
|
||||||
{
|
{
|
||||||
|
|
||||||
|
// implements Lemire's table-based escape needs check
|
||||||
|
// cf. https://lemire.me/blog/2024/05/31/quickly-checking-whether-a-string-needs-escaping/
|
||||||
|
inline static constexpr std::array<uint8_t, 256> json_quotable_character = []() constexpr
|
||||||
|
{
|
||||||
|
std::array<uint8_t, 256> result{};
|
||||||
|
for (auto i = 0; i < 32; i++)
|
||||||
|
{
|
||||||
|
result[i] = 1;
|
||||||
|
}
|
||||||
|
for (auto i : {'"', '\\'})
|
||||||
|
{
|
||||||
|
result[i] = 1;
|
||||||
|
}
|
||||||
|
return result;
|
||||||
|
}();
|
||||||
|
|
||||||
inline bool RequiresJSONStringEscaping(const std::string &string)
|
inline bool RequiresJSONStringEscaping(const std::string &string)
|
||||||
{
|
{
|
||||||
for (const char letter : string)
|
uint8_t needs = 0;
|
||||||
|
for (uint8_t c : string)
|
||||||
{
|
{
|
||||||
switch (letter)
|
needs |= json_quotable_character[c];
|
||||||
{
|
|
||||||
case '\\':
|
|
||||||
case '"':
|
|
||||||
case '/':
|
|
||||||
case '\b':
|
|
||||||
case '\f':
|
|
||||||
case '\n':
|
|
||||||
case '\r':
|
|
||||||
case '\t':
|
|
||||||
return true;
|
|
||||||
default:
|
|
||||||
continue;
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
return false;
|
return needs;
|
||||||
}
|
}
|
||||||
|
|
||||||
inline void EscapeJSONString(const std::string &input, std::string &output)
|
inline void EscapeJSONString(const std::string &input, std::string &output)
|
||||||
|
@ -3,13 +3,13 @@
|
|||||||
|
|
||||||
#include "util/log.hpp"
|
#include "util/log.hpp"
|
||||||
|
|
||||||
#include <boost/filesystem/path.hpp>
|
|
||||||
#include <boost/geometry.hpp>
|
#include <boost/geometry.hpp>
|
||||||
#include <boost/geometry/index/rtree.hpp>
|
#include <boost/geometry/index/rtree.hpp>
|
||||||
|
|
||||||
#include <rapidjson/document.h>
|
#include <rapidjson/document.h>
|
||||||
|
|
||||||
#include <chrono>
|
#include <chrono>
|
||||||
|
#include <filesystem>
|
||||||
#include <optional>
|
#include <optional>
|
||||||
|
|
||||||
namespace osrm::updater
|
namespace osrm::updater
|
||||||
@ -32,7 +32,7 @@ class Timezoner
|
|||||||
Timezoner() = default;
|
Timezoner() = default;
|
||||||
|
|
||||||
Timezoner(const char geojson[], std::time_t utc_time_now);
|
Timezoner(const char geojson[], std::time_t utc_time_now);
|
||||||
Timezoner(const boost::filesystem::path &tz_shapes_filename, std::time_t utc_time_now);
|
Timezoner(const std::filesystem::path &tz_shapes_filename, std::time_t utc_time_now);
|
||||||
|
|
||||||
std::optional<struct tm> operator()(const point_t &point) const;
|
std::optional<struct tm> operator()(const point_t &point) const;
|
||||||
|
|
||||||
|
90
scripts/ci/download_gps_traces.py
Normal file
90
scripts/ci/download_gps_traces.py
Normal file
@ -0,0 +1,90 @@
|
|||||||
|
import requests
|
||||||
|
import xml.etree.ElementTree as ET
|
||||||
|
import csv
|
||||||
|
import sys
|
||||||
|
import argparse
|
||||||
|
|
||||||
|
def get_osm_gps_traces(bboxes):
|
||||||
|
url = 'https://api.openstreetmap.org/api/0.6/trackpoints'
|
||||||
|
traces = []
|
||||||
|
|
||||||
|
lon_step = 0.25
|
||||||
|
lat_step = 0.25
|
||||||
|
|
||||||
|
for bbox in bboxes:
|
||||||
|
min_lon, min_lat, max_lon, max_lat = map(float, bbox.split(','))
|
||||||
|
|
||||||
|
current_min_lon = min_lon
|
||||||
|
while current_min_lon < max_lon:
|
||||||
|
current_max_lon = min(current_min_lon + lon_step, max_lon)
|
||||||
|
|
||||||
|
current_min_lat = min_lat
|
||||||
|
while current_min_lat < max_lat:
|
||||||
|
current_max_lat = min(current_min_lat + lat_step, max_lat)
|
||||||
|
|
||||||
|
bbox_str = f'{current_min_lon},{current_min_lat},{current_max_lon},{current_max_lat}'
|
||||||
|
print(f"Requesting bbox: {bbox_str}", file=sys.stderr)
|
||||||
|
|
||||||
|
params = {
|
||||||
|
'bbox': bbox_str,
|
||||||
|
'page': 0
|
||||||
|
}
|
||||||
|
headers = {
|
||||||
|
'Accept': 'application/xml'
|
||||||
|
}
|
||||||
|
|
||||||
|
response = requests.get(url, params=params, headers=headers)
|
||||||
|
if response.status_code == 200:
|
||||||
|
traces.append(response.content)
|
||||||
|
else:
|
||||||
|
print(f"Error fetching data for bbox {bbox_str}: {response.status_code} {response.text}", file=sys.stderr)
|
||||||
|
|
||||||
|
current_min_lat += lat_step
|
||||||
|
current_min_lon += lon_step
|
||||||
|
|
||||||
|
return traces
|
||||||
|
|
||||||
|
def parse_gpx_data(gpx_data):
|
||||||
|
try:
|
||||||
|
root = ET.fromstring(gpx_data)
|
||||||
|
except ET.ParseError as e:
|
||||||
|
print(f"Error parsing GPX data: {e}", file=sys.stderr)
|
||||||
|
return []
|
||||||
|
namespace = {'gpx': 'http://www.topografix.com/GPX/1/0'}
|
||||||
|
|
||||||
|
tracks = []
|
||||||
|
for trk in root.findall('.//gpx:trk', namespace):
|
||||||
|
track_data = []
|
||||||
|
for trkseg in trk.findall('.//gpx:trkseg', namespace):
|
||||||
|
for trkpt in trkseg.findall('gpx:trkpt', namespace):
|
||||||
|
lat = trkpt.get('lat')
|
||||||
|
lon = trkpt.get('lon')
|
||||||
|
time = trkpt.find('time').text if trkpt.find('time') is not None else ''
|
||||||
|
track_data.append([lat, lon, time])
|
||||||
|
tracks.append(track_data)
|
||||||
|
return tracks
|
||||||
|
|
||||||
|
def save_to_csv(data, file):
|
||||||
|
writer = csv.writer(file)
|
||||||
|
writer.writerow(['TrackID', 'Latitude', 'Longitude', 'Time'])
|
||||||
|
writer.writerows(data)
|
||||||
|
|
||||||
|
if __name__ == '__main__':
|
||||||
|
parser = argparse.ArgumentParser(description='Fetch and output OSM GPS traces for given bounding boxes.')
|
||||||
|
parser.add_argument('bboxes', nargs='+', help='Bounding boxes in the format min_lon,min_lat,max_lon,max_lat')
|
||||||
|
|
||||||
|
args = parser.parse_args()
|
||||||
|
|
||||||
|
gpx_data_traces = get_osm_gps_traces(args.bboxes)
|
||||||
|
print(f"Collected {len(gpx_data_traces)} trace segments", file=sys.stderr)
|
||||||
|
|
||||||
|
all_data = []
|
||||||
|
track_id = 0
|
||||||
|
for gpx_data in gpx_data_traces:
|
||||||
|
for track in parse_gpx_data(gpx_data):
|
||||||
|
for point in track:
|
||||||
|
all_data.append([track_id] + point)
|
||||||
|
track_id += 1
|
||||||
|
|
||||||
|
# Output all data to stdout
|
||||||
|
save_to_csv(all_data, sys.stdout)
|
138
scripts/ci/e2e_benchmark.py
Normal file
138
scripts/ci/e2e_benchmark.py
Normal file
@ -0,0 +1,138 @@
|
|||||||
|
import requests
|
||||||
|
import random
|
||||||
|
from collections import defaultdict
|
||||||
|
import os
|
||||||
|
import csv
|
||||||
|
import numpy as np
|
||||||
|
import time
|
||||||
|
import argparse
|
||||||
|
|
||||||
|
|
||||||
|
class BenchmarkRunner:
|
||||||
|
def __init__(self, gps_traces_file_path):
|
||||||
|
self.coordinates = []
|
||||||
|
self.tracks = defaultdict(list)
|
||||||
|
|
||||||
|
gps_traces_file_path = os.path.expanduser(gps_traces_file_path)
|
||||||
|
with open(gps_traces_file_path, 'r') as file:
|
||||||
|
reader = csv.DictReader(file)
|
||||||
|
for row in reader:
|
||||||
|
coord = (float(row['Latitude']), float(row['Longitude']))
|
||||||
|
self.coordinates.append(coord)
|
||||||
|
self.tracks[row['TrackID']].append(coord)
|
||||||
|
self.track_ids = list(self.tracks.keys())
|
||||||
|
|
||||||
|
def run(self, benchmark_name, host, num_requests, warmup_requests=50):
|
||||||
|
for _ in range(warmup_requests):
|
||||||
|
url = self.make_url(host, benchmark_name)
|
||||||
|
_ = requests.get(url)
|
||||||
|
|
||||||
|
times = []
|
||||||
|
|
||||||
|
for _ in range(num_requests):
|
||||||
|
url = self.make_url(host, benchmark_name)
|
||||||
|
|
||||||
|
start_time = time.time()
|
||||||
|
response = requests.get(url)
|
||||||
|
end_time = time.time()
|
||||||
|
if response.status_code != 200:
|
||||||
|
code = response.json()['code']
|
||||||
|
if code in ['NoSegment', 'NoMatch', 'NoRoute', 'NoTrips']:
|
||||||
|
continue
|
||||||
|
raise Exception(f"Error: {response.status_code} {response.text}")
|
||||||
|
times.append((end_time - start_time) * 1000) # convert to ms
|
||||||
|
|
||||||
|
return times
|
||||||
|
|
||||||
|
def make_url(self, host, benchmark_name):
|
||||||
|
if benchmark_name == 'route':
|
||||||
|
start = random.choice(self.coordinates)
|
||||||
|
end = random.choice(self.coordinates)
|
||||||
|
|
||||||
|
start_coord = f"{start[1]:.6f},{start[0]:.6f}"
|
||||||
|
end_coord = f"{end[1]:.6f},{end[0]:.6f}"
|
||||||
|
return f"{host}/route/v1/driving/{start_coord};{end_coord}?overview=full&steps=true"
|
||||||
|
elif benchmark_name == 'table':
|
||||||
|
num_coords = random.randint(3, 12)
|
||||||
|
selected_coords = random.sample(self.coordinates, num_coords)
|
||||||
|
coords_str = ";".join([f"{coord[1]:.6f},{coord[0]:.6f}" for coord in selected_coords])
|
||||||
|
return f"{host}/table/v1/driving/{coords_str}"
|
||||||
|
elif benchmark_name == 'match':
|
||||||
|
num_coords = random.randint(50, 100)
|
||||||
|
track_id = random.choice(self.track_ids)
|
||||||
|
track_coords = self.tracks[track_id][:num_coords]
|
||||||
|
coords_str = ";".join([f"{coord[1]:.6f},{coord[0]:.6f}" for coord in track_coords])
|
||||||
|
radiues_str = ";".join([f"{random.randint(5, 20)}" for _ in range(len(track_coords))])
|
||||||
|
return f"{host}/match/v1/driving/{coords_str}?steps=true&radiuses={radiues_str}"
|
||||||
|
elif benchmark_name == 'nearest':
|
||||||
|
coord = random.choice(self.coordinates)
|
||||||
|
coord_str = f"{coord[1]:.6f},{coord[0]:.6f}"
|
||||||
|
return f"{host}/nearest/v1/driving/{coord_str}"
|
||||||
|
elif benchmark_name == 'trip':
|
||||||
|
num_coords = random.randint(2, 10)
|
||||||
|
selected_coords = random.sample(self.coordinates, num_coords)
|
||||||
|
coords_str = ";".join([f"{coord[1]:.6f},{coord[0]:.6f}" for coord in selected_coords])
|
||||||
|
return f"{host}/trip/v1/driving/{coords_str}?steps=true"
|
||||||
|
else:
|
||||||
|
raise Exception(f"Unknown benchmark: {benchmark_name}")
|
||||||
|
|
||||||
|
def bootstrap_confidence_interval(data, num_samples=1000, confidence_level=0.95):
|
||||||
|
means = []
|
||||||
|
for _ in range(num_samples):
|
||||||
|
sample = np.random.choice(data, size=len(data), replace=True)
|
||||||
|
means.append(np.mean(sample))
|
||||||
|
lower_bound = np.percentile(means, (1 - confidence_level) / 2 * 100)
|
||||||
|
upper_bound = np.percentile(means, (1 + confidence_level) / 2 * 100)
|
||||||
|
mean = np.mean(means)
|
||||||
|
return mean, lower_bound, upper_bound
|
||||||
|
|
||||||
|
def calculate_confidence_interval(data, min_is_best=True):
|
||||||
|
mean, lower, upper = bootstrap_confidence_interval(data)
|
||||||
|
min_value = np.min(data) if min_is_best else np.max(data)
|
||||||
|
return mean, (upper - lower) / 2, min_value
|
||||||
|
|
||||||
|
|
||||||
|
def main():
|
||||||
|
parser = argparse.ArgumentParser(description='Run GPS benchmark tests.')
|
||||||
|
parser.add_argument('--host', type=str, required=True, help='Host URL')
|
||||||
|
parser.add_argument('--method', type=str, required=True, choices=['route', 'table', 'match', 'nearest', 'trip'], help='Benchmark method')
|
||||||
|
parser.add_argument('--num_requests', type=int, required=True, help='Number of requests to perform')
|
||||||
|
parser.add_argument('--iterations', type=int, required=True, help='Number of iterations to run the benchmark')
|
||||||
|
parser.add_argument('--gps_traces_file_path', type=str, required=True, help='Path to the GPS traces file')
|
||||||
|
|
||||||
|
args = parser.parse_args()
|
||||||
|
|
||||||
|
np.random.seed(42)
|
||||||
|
|
||||||
|
runner = BenchmarkRunner(args.gps_traces_file_path)
|
||||||
|
|
||||||
|
all_times = []
|
||||||
|
for _ in range(args.iterations):
|
||||||
|
random.seed(42)
|
||||||
|
times = runner.run(args.method, args.host, args.num_requests)
|
||||||
|
all_times.append(times)
|
||||||
|
all_times = np.asarray(all_times)
|
||||||
|
|
||||||
|
assert all_times.shape == (args.iterations, all_times.shape[1])
|
||||||
|
|
||||||
|
|
||||||
|
total_time, total_ci, total_best = calculate_confidence_interval(np.sum(all_times, axis=1))
|
||||||
|
ops_per_sec, ops_per_sec_ci, ops_per_sec_best = calculate_confidence_interval(float(all_times.shape[1]) / np.sum(all_times / 1000, axis=1), min_is_best=False)
|
||||||
|
min_time, min_ci, _ = calculate_confidence_interval(np.min(all_times, axis=1))
|
||||||
|
mean_time, mean_ci, _ = calculate_confidence_interval(np.mean(all_times, axis=1))
|
||||||
|
median_time, median_ci, _ = calculate_confidence_interval(np.median(all_times, axis=1))
|
||||||
|
perc_95_time, perc_95_ci, _ = calculate_confidence_interval(np.percentile(all_times, 95, axis=1))
|
||||||
|
perc_99_time, perc_99_ci, _ = calculate_confidence_interval(np.percentile(all_times, 99, axis=1))
|
||||||
|
max_time, max_ci, _ = calculate_confidence_interval(np.max(all_times, axis=1))
|
||||||
|
|
||||||
|
print(f'Ops: {ops_per_sec:.2f} ± {ops_per_sec_ci:.2f} ops/s. Best: {ops_per_sec_best:.2f} ops/s')
|
||||||
|
print(f'Total: {total_time:.2f}ms ± {total_ci:.2f}ms. Best: {total_best:.2f}ms')
|
||||||
|
print(f"Min time: {min_time:.2f}ms ± {min_ci:.2f}ms")
|
||||||
|
print(f"Mean time: {mean_time:.2f}ms ± {mean_ci:.2f}ms")
|
||||||
|
print(f"Median time: {median_time:.2f}ms ± {median_ci:.2f}ms")
|
||||||
|
print(f"95th percentile: {perc_95_time:.2f}ms ± {perc_95_ci:.2f}ms")
|
||||||
|
print(f"99th percentile: {perc_99_time:.2f}ms ± {perc_99_ci:.2f}ms")
|
||||||
|
print(f"Max time: {max_time:.2f}ms ± {max_ci:.2f}ms")
|
||||||
|
|
||||||
|
if __name__ == '__main__':
|
||||||
|
main()
|
@ -16,8 +16,10 @@ def create_markdown_table(results):
|
|||||||
rows = []
|
rows = []
|
||||||
for result in results:
|
for result in results:
|
||||||
name = result['name']
|
name = result['name']
|
||||||
base = result['base'].replace('\n', '<br/>')
|
base = result['base'] or ''
|
||||||
pr = result['pr'].replace('\n', '<br/>')
|
base = base.replace('\n', '<br/>')
|
||||||
|
pr = result['pr'] or ''
|
||||||
|
pr = pr.replace('\n', '<br/>')
|
||||||
row = f"| {name} | {base} | {pr} |"
|
row = f"| {name} | {base} | {pr} |"
|
||||||
rows.append(row)
|
rows.append(row)
|
||||||
return f"{header}\n" + "\n".join(rows)
|
return f"{header}\n" + "\n".join(rows)
|
||||||
@ -75,7 +77,14 @@ def main():
|
|||||||
pr_body = pr_details.get('body', '') or ''
|
pr_body = pr_details.get('body', '') or ''
|
||||||
|
|
||||||
markdown_table = create_markdown_table(benchmark_results)
|
markdown_table = create_markdown_table(benchmark_results)
|
||||||
new_benchmark_section = f"<!-- BENCHMARK_RESULTS_START -->\n## Benchmark Results\n{markdown_table}\n<!-- BENCHMARK_RESULTS_END -->"
|
new_benchmark_section = f"""
|
||||||
|
<!-- BENCHMARK_RESULTS_START -->
|
||||||
|
<details><summary><h2>Benchmark Results</h2></summary>
|
||||||
|
|
||||||
|
{markdown_table}
|
||||||
|
</details>
|
||||||
|
<!-- BENCHMARK_RESULTS_END -->
|
||||||
|
"""
|
||||||
|
|
||||||
if re.search(r'<!-- BENCHMARK_RESULTS_START -->.*<!-- BENCHMARK_RESULTS_END -->', pr_body, re.DOTALL):
|
if re.search(r'<!-- BENCHMARK_RESULTS_START -->.*<!-- BENCHMARK_RESULTS_END -->', pr_body, re.DOTALL):
|
||||||
updated_body = re.sub(
|
updated_body = re.sub(
|
||||||
|
@ -1,26 +1,121 @@
|
|||||||
#!/bin/bash
|
#!/bin/bash
|
||||||
set -eou pipefail
|
set -eou pipefail
|
||||||
|
|
||||||
function run_benchmarks_for_folder {
|
function usage {
|
||||||
echo "Running benchmarks for $1"
|
echo "Usage: $0 -f <folder> -r <results_folder> -s <scripts_folder> -b <binaries_folder> -o <osm_pbf> -g <gps_traces>"
|
||||||
|
exit 1
|
||||||
FOLDER=$1
|
|
||||||
RESULTS_FOLDER=$2
|
|
||||||
|
|
||||||
mkdir -p $RESULTS_FOLDER
|
|
||||||
|
|
||||||
BENCHMARKS_FOLDER="$FOLDER/build/src/benchmarks"
|
|
||||||
|
|
||||||
./$BENCHMARKS_FOLDER/match-bench "./$FOLDER/test/data/mld/monaco.osrm" mld > "$RESULTS_FOLDER/match_mld.bench"
|
|
||||||
./$BENCHMARKS_FOLDER/match-bench "./$FOLDER/test/data/ch/monaco.osrm" ch > "$RESULTS_FOLDER/match_ch.bench"
|
|
||||||
./$BENCHMARKS_FOLDER/route-bench "./$FOLDER/test/data/mld/monaco.osrm" mld > "$RESULTS_FOLDER/route_mld.bench" || true # TODO: remove `true` when this benchmark will be merged to master
|
|
||||||
./$BENCHMARKS_FOLDER/route-bench "./$FOLDER/test/data/ch/monaco.osrm" ch > "$RESULTS_FOLDER/route_ch.bench" || true # TODO: remove `true` when this benchmark will be merged to master
|
|
||||||
./$BENCHMARKS_FOLDER/alias-bench > "$RESULTS_FOLDER/alias.bench"
|
|
||||||
./$BENCHMARKS_FOLDER/json-render-bench "./$FOLDER/src/benchmarks/portugal_to_korea.json" > "$RESULTS_FOLDER/json-render.bench"
|
|
||||||
./$BENCHMARKS_FOLDER/packedvector-bench > "$RESULTS_FOLDER/packedvector.bench"
|
|
||||||
./$BENCHMARKS_FOLDER/rtree-bench "./$FOLDER/test/data/monaco.osrm.ramIndex" "./$FOLDER/test/data/monaco.osrm.fileIndex" "./$FOLDER/test/data/monaco.osrm.nbg_nodes" > "$RESULTS_FOLDER/rtree.bench"
|
|
||||||
}
|
}
|
||||||
|
|
||||||
run_benchmarks_for_folder $1 "${1}_results"
|
while getopts ":f:r:s:b:o:g:" opt; do
|
||||||
run_benchmarks_for_folder $2 "${2}_results"
|
case $opt in
|
||||||
|
f) FOLDER="$OPTARG"
|
||||||
|
;;
|
||||||
|
r) RESULTS_FOLDER="$OPTARG"
|
||||||
|
;;
|
||||||
|
s) SCRIPTS_FOLDER="$OPTARG"
|
||||||
|
;;
|
||||||
|
b) BINARIES_FOLDER="$OPTARG"
|
||||||
|
;;
|
||||||
|
o) OSM_PBF="$OPTARG"
|
||||||
|
;;
|
||||||
|
g) GPS_TRACES="$OPTARG"
|
||||||
|
;;
|
||||||
|
\?) echo "Invalid option -$OPTARG" >&2
|
||||||
|
usage
|
||||||
|
;;
|
||||||
|
:) echo "Option -$OPTARG requires an argument." >&2
|
||||||
|
usage
|
||||||
|
;;
|
||||||
|
esac
|
||||||
|
done
|
||||||
|
|
||||||
|
if [ -z "${FOLDER:-}" ] || [ -z "${RESULTS_FOLDER:-}" ] || [ -z "${SCRIPTS_FOLDER:-}" ] || [ -z "${BINARIES_FOLDER:-}" ] || [ -z "${OSM_PBF:-}" ] || [ -z "${GPS_TRACES:-}" ]; then
|
||||||
|
usage
|
||||||
|
fi
|
||||||
|
|
||||||
|
function measure_peak_ram_and_time {
|
||||||
|
COMMAND=$1
|
||||||
|
OUTPUT_FILE=$2
|
||||||
|
if [ "$(uname)" == "Darwin" ]; then
|
||||||
|
# on macOS time has different parameters, so simply run command on macOS
|
||||||
|
$COMMAND > /dev/null 2>&1
|
||||||
|
else
|
||||||
|
OUTPUT=$(/usr/bin/time -f "%e %M" $COMMAND 2>&1 | tail -n 1)
|
||||||
|
|
||||||
|
TIME=$(echo $OUTPUT | awk '{print $1}')
|
||||||
|
PEAK_RAM_KB=$(echo $OUTPUT | awk '{print $2}')
|
||||||
|
PEAK_RAM_MB=$(echo "scale=2; $PEAK_RAM_KB / 1024" | bc)
|
||||||
|
echo "Time: ${TIME}s Peak RAM: ${PEAK_RAM_MB}MB" > $OUTPUT_FILE
|
||||||
|
fi
|
||||||
|
}
|
||||||
|
|
||||||
|
function run_benchmarks_for_folder {
|
||||||
|
mkdir -p $RESULTS_FOLDER
|
||||||
|
|
||||||
|
BENCHMARKS_FOLDER="$BINARIES_FOLDER/src/benchmarks"
|
||||||
|
echo "Running match-bench MLD"
|
||||||
|
$BENCHMARKS_FOLDER/match-bench "$FOLDER/test/data/mld/monaco.osrm" mld > "$RESULTS_FOLDER/match_mld.bench"
|
||||||
|
echo "Running match-bench CH"
|
||||||
|
$BENCHMARKS_FOLDER/match-bench "$FOLDER/test/data/ch/monaco.osrm" ch > "$RESULTS_FOLDER/match_ch.bench"
|
||||||
|
echo "Running route-bench MLD"
|
||||||
|
$BENCHMARKS_FOLDER/route-bench "$FOLDER/test/data/mld/monaco.osrm" mld > "$RESULTS_FOLDER/route_mld.bench"
|
||||||
|
echo "Running route-bench CH"
|
||||||
|
$BENCHMARKS_FOLDER/route-bench "$FOLDER/test/data/ch/monaco.osrm" ch > "$RESULTS_FOLDER/route_ch.bench"
|
||||||
|
echo "Running alias"
|
||||||
|
$BENCHMARKS_FOLDER/alias-bench > "$RESULTS_FOLDER/alias.bench"
|
||||||
|
echo "Running json-render-bench"
|
||||||
|
$BENCHMARKS_FOLDER/json-render-bench "$FOLDER/test/data/portugal_to_korea.json" > "$RESULTS_FOLDER/json-render.bench"
|
||||||
|
echo "Running packedvector-bench"
|
||||||
|
$BENCHMARKS_FOLDER/packedvector-bench > "$RESULTS_FOLDER/packedvector.bench"
|
||||||
|
echo "Running rtree-bench"
|
||||||
|
$BENCHMARKS_FOLDER/rtree-bench "$FOLDER/test/data/monaco.osrm.ramIndex" "$FOLDER/test/data/monaco.osrm.fileIndex" "$FOLDER/test/data/monaco.osrm.nbg_nodes" > "$RESULTS_FOLDER/rtree.bench"
|
||||||
|
|
||||||
|
cp -rf $OSM_PBF $FOLDER/data.osm.pbf
|
||||||
|
|
||||||
|
echo "Running osrm-extract"
|
||||||
|
measure_peak_ram_and_time "$BINARIES_FOLDER/osrm-extract -p $FOLDER/profiles/car.lua $FOLDER/data.osm.pbf" "$RESULTS_FOLDER/osrm_extract.bench"
|
||||||
|
echo "Running osrm-partition"
|
||||||
|
measure_peak_ram_and_time "$BINARIES_FOLDER/osrm-partition $FOLDER/data.osrm" "$RESULTS_FOLDER/osrm_partition.bench"
|
||||||
|
echo "Running osrm-customize"
|
||||||
|
measure_peak_ram_and_time "$BINARIES_FOLDER/osrm-customize $FOLDER/data.osrm" "$RESULTS_FOLDER/osrm_customize.bench"
|
||||||
|
echo "Running osrm-contract"
|
||||||
|
measure_peak_ram_and_time "$BINARIES_FOLDER/osrm-contract $FOLDER/data.osrm" "$RESULTS_FOLDER/osrm_contract.bench"
|
||||||
|
|
||||||
|
for ALGORITHM in ch mld; do
|
||||||
|
for BENCH in nearest table trip route match; do
|
||||||
|
echo "Running random $BENCH $ALGORITHM"
|
||||||
|
START=$(date +%s.%N)
|
||||||
|
$BENCHMARKS_FOLDER/bench "$FOLDER/data.osrm" $ALGORITHM $GPS_TRACES ${BENCH} > "$RESULTS_FOLDER/random_${BENCH}_${ALGORITHM}.bench" 5 || true
|
||||||
|
END=$(date +%s.%N)
|
||||||
|
DIFF=$(echo "$END - $START" | bc)
|
||||||
|
echo "Took: ${DIFF}s"
|
||||||
|
done
|
||||||
|
done
|
||||||
|
|
||||||
|
|
||||||
|
for ALGORITHM in ch mld; do
|
||||||
|
$BINARIES_FOLDER/osrm-routed --algorithm $ALGORITHM $FOLDER/data.osrm > /dev/null 2>&1 &
|
||||||
|
OSRM_ROUTED_PID=$!
|
||||||
|
|
||||||
|
# wait for osrm-routed to start
|
||||||
|
if ! curl --retry-delay 3 --retry 10 --retry-all-errors "http://127.0.0.1:5000/route/v1/driving/13.388860,52.517037;13.385983,52.496891?steps=true" > /dev/null 2>&1; then
|
||||||
|
echo "osrm-routed failed to start for algorithm $ALGORITHM"
|
||||||
|
kill -9 $OSRM_ROUTED_PID
|
||||||
|
continue
|
||||||
|
fi
|
||||||
|
|
||||||
|
for METHOD in route nearest trip table match; do
|
||||||
|
echo "Running e2e benchmark for $METHOD $ALGORITHM"
|
||||||
|
START=$(date +%s.%N)
|
||||||
|
python3 $SCRIPTS_FOLDER/scripts/ci/e2e_benchmark.py --host http://localhost:5000 --method $METHOD --iterations 5 --num_requests 1000 --gps_traces_file_path $GPS_TRACES > $RESULTS_FOLDER/e2e_${METHOD}_${ALGORITHM}.bench
|
||||||
|
END=$(date +%s.%N)
|
||||||
|
DIFF=$(echo "$END - $START" | bc)
|
||||||
|
echo "Took: ${DIFF}s"
|
||||||
|
done
|
||||||
|
|
||||||
|
kill -9 $OSRM_ROUTED_PID
|
||||||
|
done
|
||||||
|
}
|
||||||
|
|
||||||
|
run_benchmarks_for_folder
|
||||||
|
|
||||||
|
@ -17,6 +17,7 @@ IF %ERRORLEVEL% NEQ 0 GOTO ERROR
|
|||||||
msbuild OSRM.sln ^
|
msbuild OSRM.sln ^
|
||||||
/p:Configuration=%CONFIGURATION% ^
|
/p:Configuration=%CONFIGURATION% ^
|
||||||
/p:Platform=x64 ^
|
/p:Platform=x64 ^
|
||||||
|
/p:nowarn="4244;4267;4365;4456;4514;4625;4626;4710;4711;4820;5026;5027" ^
|
||||||
/t:rebuild ^
|
/t:rebuild ^
|
||||||
/p:BuildInParallel=true ^
|
/p:BuildInParallel=true ^
|
||||||
/m:%NUMBER_OF_PROCESSORS% ^
|
/m:%NUMBER_OF_PROCESSORS% ^
|
||||||
@ -58,22 +59,28 @@ IF %ERRORLEVEL% NEQ 0 GOTO ERROR
|
|||||||
|
|
||||||
SET test_region=monaco
|
SET test_region=monaco
|
||||||
SET test_region_ch=ch\monaco
|
SET test_region_ch=ch\monaco
|
||||||
|
SET test_region_corech=corech\monaco
|
||||||
SET test_region_mld=mld\monaco
|
SET test_region_mld=mld\monaco
|
||||||
SET test_osm=%test_region%.osm.pbf
|
SET test_osm=%test_region%.osm.pbf
|
||||||
COPY %PROJECT_DIR%\test\data\%test_region%.osm.pbf %test_osm%
|
COPY %PROJECT_DIR%\test\data\%test_region%.osm.pbf %test_osm%
|
||||||
%CONFIGURATION%\osrm-extract.exe -p %PROJECT_DIR%\profiles\car.lua %test_osm%
|
%CONFIGURATION%\osrm-extract.exe -p %PROJECT_DIR%\profiles\car.lua %test_osm%
|
||||||
IF %ERRORLEVEL% NEQ 0 GOTO ERROR
|
IF %ERRORLEVEL% NEQ 0 GOTO ERROR
|
||||||
|
|
||||||
MKDIR ch
|
MKDIR ch
|
||||||
XCOPY %test_region%.osrm.* ch\
|
XCOPY %test_region%.osrm.* ch\
|
||||||
XCOPY %test_region%.osrm ch\
|
XCOPY %test_region%.osrm ch\
|
||||||
|
MKDIR corech
|
||||||
|
XCOPY %test_region%.osrm.* corech\
|
||||||
|
XCOPY %test_region%.osrm corech\
|
||||||
MKDIR mld
|
MKDIR mld
|
||||||
XCOPY %test_region%.osrm.* mld\
|
XCOPY %test_region%.osrm.* mld\
|
||||||
XCOPY %test_region%.osrm mld\
|
XCOPY %test_region%.osrm mld\
|
||||||
%CONFIGURATION%\osrm-contract.exe %test_region_ch%.osrm
|
%CONFIGURATION%\osrm-contract.exe %test_region_ch%.osrm
|
||||||
|
%CONFIGURATION%\osrm-contract.exe --core 0.8 %test_region_corech%.osrm
|
||||||
%CONFIGURATION%\osrm-partition.exe %test_region_mld%.osrm
|
%CONFIGURATION%\osrm-partition.exe %test_region_mld%.osrm
|
||||||
%CONFIGURATION%\osrm-customize.exe %test_region_mld%.osrm
|
%CONFIGURATION%\osrm-customize.exe %test_region_mld%.osrm
|
||||||
XCOPY /Y ch\*.* ..\test\data\ch\
|
XCOPY /Y ch\*.* ..\test\data\ch\
|
||||||
|
XCOPY /Y corech\*.* ..\test\data\corech\
|
||||||
XCOPY /Y mld\*.* ..\test\data\mld\
|
XCOPY /Y mld\*.* ..\test\data\mld\
|
||||||
unit_tests\%CONFIGURATION%\library-tests.exe
|
unit_tests\%CONFIGURATION%\library-tests.exe
|
||||||
IF %ERRORLEVEL% NEQ 0 GOTO ERROR
|
IF %ERRORLEVEL% NEQ 0 GOTO ERROR
|
||||||
|
@ -18,6 +18,7 @@ target_link_libraries(rtree-bench
|
|||||||
${TBB_LIBRARIES}
|
${TBB_LIBRARIES}
|
||||||
${MAYBE_SHAPEFILE})
|
${MAYBE_SHAPEFILE})
|
||||||
|
|
||||||
|
|
||||||
add_executable(match-bench
|
add_executable(match-bench
|
||||||
EXCLUDE_FROM_ALL
|
EXCLUDE_FROM_ALL
|
||||||
${MatchBenchmarkSources}
|
${MatchBenchmarkSources}
|
||||||
@ -35,6 +36,7 @@ add_executable(route-bench
|
|||||||
route.cpp
|
route.cpp
|
||||||
$<TARGET_OBJECTS:UTIL>)
|
$<TARGET_OBJECTS:UTIL>)
|
||||||
|
|
||||||
|
|
||||||
target_link_libraries(route-bench
|
target_link_libraries(route-bench
|
||||||
osrm
|
osrm
|
||||||
${BOOST_BASE_LIBRARIES}
|
${BOOST_BASE_LIBRARIES}
|
||||||
@ -42,6 +44,18 @@ target_link_libraries(route-bench
|
|||||||
${TBB_LIBRARIES}
|
${TBB_LIBRARIES}
|
||||||
${MAYBE_SHAPEFILE})
|
${MAYBE_SHAPEFILE})
|
||||||
|
|
||||||
|
add_executable(bench
|
||||||
|
EXCLUDE_FROM_ALL
|
||||||
|
bench.cpp
|
||||||
|
$<TARGET_OBJECTS:UTIL>)
|
||||||
|
|
||||||
|
target_link_libraries(bench
|
||||||
|
osrm
|
||||||
|
${BOOST_BASE_LIBRARIES}
|
||||||
|
${CMAKE_THREAD_LIBS_INIT}
|
||||||
|
${TBB_LIBRARIES}
|
||||||
|
${MAYBE_SHAPEFILE})
|
||||||
|
|
||||||
add_executable(json-render-bench
|
add_executable(json-render-bench
|
||||||
EXCLUDE_FROM_ALL
|
EXCLUDE_FROM_ALL
|
||||||
json_render.cpp
|
json_render.cpp
|
||||||
@ -85,5 +99,6 @@ add_custom_target(benchmarks
|
|||||||
packedvector-bench
|
packedvector-bench
|
||||||
match-bench
|
match-bench
|
||||||
route-bench
|
route-bench
|
||||||
|
bench
|
||||||
json-render-bench
|
json-render-bench
|
||||||
alias-bench)
|
alias-bench)
|
||||||
|
664
src/benchmarks/bench.cpp
Normal file
664
src/benchmarks/bench.cpp
Normal file
@ -0,0 +1,664 @@
|
|||||||
|
#include "osrm/match_parameters.hpp"
|
||||||
|
#include "osrm/nearest_parameters.hpp"
|
||||||
|
#include "osrm/table_parameters.hpp"
|
||||||
|
#include "osrm/trip_parameters.hpp"
|
||||||
|
|
||||||
|
#include "engine/engine_config.hpp"
|
||||||
|
#include "util/coordinate.hpp"
|
||||||
|
#include "util/timing_util.hpp"
|
||||||
|
|
||||||
|
#include "osrm/route_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 <boost/assert.hpp>
|
||||||
|
|
||||||
|
#include <boost/optional/optional.hpp>
|
||||||
|
#include <cstdlib>
|
||||||
|
#include <exception>
|
||||||
|
#include <fstream>
|
||||||
|
#include <iomanip>
|
||||||
|
#include <iostream>
|
||||||
|
#include <optional>
|
||||||
|
#include <ostream>
|
||||||
|
#include <random>
|
||||||
|
#include <stdexcept>
|
||||||
|
#include <string>
|
||||||
|
#include <unordered_map>
|
||||||
|
#include <vector>
|
||||||
|
|
||||||
|
using namespace osrm;
|
||||||
|
|
||||||
|
namespace
|
||||||
|
{
|
||||||
|
|
||||||
|
class GPSTraces
|
||||||
|
{
|
||||||
|
private:
|
||||||
|
std::set<int> trackIDs;
|
||||||
|
std::unordered_map<int /* track id */, std::vector<osrm::util::Coordinate>> traces;
|
||||||
|
std::vector<osrm::util::Coordinate> coordinates;
|
||||||
|
mutable std::mt19937 gen;
|
||||||
|
|
||||||
|
int seed;
|
||||||
|
|
||||||
|
public:
|
||||||
|
GPSTraces(int seed) : gen(std::random_device{}()), seed(seed) { gen.seed(seed); }
|
||||||
|
|
||||||
|
void resetSeed() const { gen.seed(seed); }
|
||||||
|
|
||||||
|
bool readCSV(const std::string &filename)
|
||||||
|
{
|
||||||
|
std::ifstream file(filename);
|
||||||
|
if (!file.is_open())
|
||||||
|
{
|
||||||
|
std::cerr << "Error opening file: " << filename << std::endl;
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
|
||||||
|
std::string line;
|
||||||
|
std::getline(file, line);
|
||||||
|
|
||||||
|
while (std::getline(file, line))
|
||||||
|
{
|
||||||
|
std::istringstream ss(line);
|
||||||
|
std::string token;
|
||||||
|
|
||||||
|
int trackID;
|
||||||
|
double latitude, longitude;
|
||||||
|
std::string time;
|
||||||
|
|
||||||
|
std::getline(ss, token, ',');
|
||||||
|
trackID = std::stoi(token);
|
||||||
|
|
||||||
|
std::getline(ss, token, ',');
|
||||||
|
latitude = std::stod(token);
|
||||||
|
|
||||||
|
std::getline(ss, token, ',');
|
||||||
|
longitude = std::stod(token);
|
||||||
|
|
||||||
|
// handle empty fields
|
||||||
|
if (std::getline(ss, token, ','))
|
||||||
|
{
|
||||||
|
time = token;
|
||||||
|
}
|
||||||
|
|
||||||
|
trackIDs.insert(trackID);
|
||||||
|
traces[trackID].emplace_back(osrm::util::Coordinate{
|
||||||
|
osrm::util::FloatLongitude{longitude}, osrm::util::FloatLatitude{latitude}});
|
||||||
|
coordinates.emplace_back(osrm::util::Coordinate{osrm::util::FloatLongitude{longitude},
|
||||||
|
osrm::util::FloatLatitude{latitude}});
|
||||||
|
}
|
||||||
|
|
||||||
|
file.close();
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
|
||||||
|
const osrm::util::Coordinate &getRandomCoordinate() const
|
||||||
|
{
|
||||||
|
std::uniform_int_distribution<> dis(0, coordinates.size() - 1);
|
||||||
|
return coordinates[dis(gen)];
|
||||||
|
}
|
||||||
|
|
||||||
|
std::vector<osrm::util::Coordinate> getRandomTrace() const
|
||||||
|
{
|
||||||
|
std::uniform_int_distribution<> dis(0, trackIDs.size() - 1);
|
||||||
|
auto it = trackIDs.begin();
|
||||||
|
std::advance(it, dis(gen));
|
||||||
|
|
||||||
|
const auto &trace = traces.at(*it);
|
||||||
|
|
||||||
|
std::uniform_int_distribution<> length_dis(50, 100);
|
||||||
|
size_t length = length_dis(gen);
|
||||||
|
if (trace.size() <= length + 1)
|
||||||
|
{
|
||||||
|
return trace;
|
||||||
|
}
|
||||||
|
|
||||||
|
std::uniform_int_distribution<> start_dis(0, trace.size() - length - 1);
|
||||||
|
size_t start_index = start_dis(gen);
|
||||||
|
|
||||||
|
return std::vector<osrm::util::Coordinate>(trace.begin() + start_index,
|
||||||
|
trace.begin() + start_index + length);
|
||||||
|
}
|
||||||
|
};
|
||||||
|
|
||||||
|
// Struct to hold confidence interval data
|
||||||
|
struct ConfidenceInterval
|
||||||
|
{
|
||||||
|
double mean;
|
||||||
|
double confidence;
|
||||||
|
double min;
|
||||||
|
double max;
|
||||||
|
};
|
||||||
|
|
||||||
|
// Helper function to calculate the bootstrap confidence interval
|
||||||
|
ConfidenceInterval confidenceInterval(const std::vector<double> &data,
|
||||||
|
int num_samples = 1000,
|
||||||
|
double confidence_level = 0.95)
|
||||||
|
{
|
||||||
|
std::vector<double> means;
|
||||||
|
std::default_random_engine generator;
|
||||||
|
std::uniform_int_distribution<int> distribution(0, data.size() - 1);
|
||||||
|
|
||||||
|
for (int i = 0; i < num_samples; ++i)
|
||||||
|
{
|
||||||
|
std::vector<double> sample;
|
||||||
|
for (size_t j = 0; j < data.size(); ++j)
|
||||||
|
{
|
||||||
|
sample.push_back(data[distribution(generator)]);
|
||||||
|
}
|
||||||
|
double sample_mean = std::accumulate(sample.begin(), sample.end(), 0.0) / sample.size();
|
||||||
|
means.push_back(sample_mean);
|
||||||
|
}
|
||||||
|
|
||||||
|
std::sort(means.begin(), means.end());
|
||||||
|
double lower_bound = means[(int)((1 - confidence_level) / 2 * num_samples)];
|
||||||
|
double upper_bound = means[(int)((1 + confidence_level) / 2 * num_samples)];
|
||||||
|
double mean = std::accumulate(means.begin(), means.end(), 0.0) / means.size();
|
||||||
|
|
||||||
|
ConfidenceInterval ci = {mean,
|
||||||
|
(upper_bound - lower_bound) / 2,
|
||||||
|
*std::min_element(data.begin(), data.end()),
|
||||||
|
*std::max_element(data.begin(), data.end())};
|
||||||
|
return ci;
|
||||||
|
}
|
||||||
|
|
||||||
|
class Statistics
|
||||||
|
{
|
||||||
|
public:
|
||||||
|
explicit Statistics(int iterations) : times(iterations) {}
|
||||||
|
|
||||||
|
void push(double timeMs, int iteration) { times[iteration].push_back(timeMs); }
|
||||||
|
|
||||||
|
ConfidenceInterval mean()
|
||||||
|
{
|
||||||
|
std::vector<double> means;
|
||||||
|
means.reserve(times.size());
|
||||||
|
for (const auto &iter_times : times)
|
||||||
|
{
|
||||||
|
means.push_back(std::accumulate(iter_times.begin(), iter_times.end(), 0.0) /
|
||||||
|
iter_times.size());
|
||||||
|
}
|
||||||
|
return confidenceInterval(means);
|
||||||
|
}
|
||||||
|
|
||||||
|
ConfidenceInterval total()
|
||||||
|
{
|
||||||
|
std::vector<double> sums;
|
||||||
|
sums.reserve(times.size());
|
||||||
|
for (const auto &iter_times : times)
|
||||||
|
{
|
||||||
|
sums.push_back(std::accumulate(iter_times.begin(), iter_times.end(), 0.0));
|
||||||
|
}
|
||||||
|
return confidenceInterval(sums);
|
||||||
|
}
|
||||||
|
|
||||||
|
ConfidenceInterval min()
|
||||||
|
{
|
||||||
|
std::vector<double> mins;
|
||||||
|
mins.reserve(times.size());
|
||||||
|
for (const auto &iter_times : times)
|
||||||
|
{
|
||||||
|
mins.push_back(*std::min_element(iter_times.begin(), iter_times.end()));
|
||||||
|
}
|
||||||
|
return confidenceInterval(mins);
|
||||||
|
}
|
||||||
|
|
||||||
|
ConfidenceInterval max()
|
||||||
|
{
|
||||||
|
std::vector<double> maxs;
|
||||||
|
maxs.reserve(times.size());
|
||||||
|
for (const auto &iter_times : times)
|
||||||
|
{
|
||||||
|
maxs.push_back(*std::max_element(iter_times.begin(), iter_times.end()));
|
||||||
|
}
|
||||||
|
return confidenceInterval(maxs);
|
||||||
|
}
|
||||||
|
|
||||||
|
ConfidenceInterval percentile(double p)
|
||||||
|
{
|
||||||
|
std::vector<double> percentiles;
|
||||||
|
percentiles.reserve(times.size());
|
||||||
|
for (const auto &iter_times : times)
|
||||||
|
{
|
||||||
|
auto sorted_times = iter_times;
|
||||||
|
std::sort(sorted_times.begin(), sorted_times.end());
|
||||||
|
percentiles.push_back(sorted_times[static_cast<size_t>(p * sorted_times.size())]);
|
||||||
|
}
|
||||||
|
return confidenceInterval(percentiles);
|
||||||
|
}
|
||||||
|
|
||||||
|
ConfidenceInterval ops_per_sec()
|
||||||
|
{
|
||||||
|
std::vector<double> ops;
|
||||||
|
ops.reserve(times.size());
|
||||||
|
for (const auto &iter_times : times)
|
||||||
|
{
|
||||||
|
double total_time = std::accumulate(iter_times.begin(), iter_times.end(), 0.0) / 1000.0;
|
||||||
|
ops.push_back(iter_times.size() / total_time);
|
||||||
|
}
|
||||||
|
return confidenceInterval(ops);
|
||||||
|
}
|
||||||
|
|
||||||
|
private:
|
||||||
|
// vector of times for each iteration
|
||||||
|
std::vector<std::vector<double>> times;
|
||||||
|
};
|
||||||
|
|
||||||
|
std::ostream &operator<<(std::ostream &os, Statistics &statistics)
|
||||||
|
{
|
||||||
|
os << std::fixed << std::setprecision(2);
|
||||||
|
|
||||||
|
ConfidenceInterval mean_ci = statistics.mean();
|
||||||
|
ConfidenceInterval total_ci = statistics.total();
|
||||||
|
ConfidenceInterval min_ci = statistics.min();
|
||||||
|
ConfidenceInterval max_ci = statistics.max();
|
||||||
|
ConfidenceInterval p99_ci = statistics.percentile(0.99);
|
||||||
|
ConfidenceInterval ops_ci = statistics.ops_per_sec();
|
||||||
|
|
||||||
|
os << "ops: " << ops_ci.mean << " ± " << ops_ci.confidence << " ops/s. "
|
||||||
|
<< "best: " << ops_ci.max << "ops/s." << std::endl;
|
||||||
|
os << "total: " << total_ci.mean << " ± " << total_ci.confidence << "ms. "
|
||||||
|
<< "best: " << total_ci.min << "ms." << std::endl;
|
||||||
|
os << "avg: " << mean_ci.mean << " ± " << mean_ci.confidence << "ms" << std::endl;
|
||||||
|
os << "min: " << min_ci.mean << " ± " << min_ci.confidence << "ms" << std::endl;
|
||||||
|
os << "max: " << max_ci.mean << " ± " << max_ci.confidence << "ms" << std::endl;
|
||||||
|
os << "p99: " << p99_ci.mean << " ± " << p99_ci.confidence << "ms" << std::endl;
|
||||||
|
|
||||||
|
return os;
|
||||||
|
}
|
||||||
|
|
||||||
|
template <typename Benchmark, typename BenchmarkBody>
|
||||||
|
void runBenchmarks(const std::vector<Benchmark> &benchmarks,
|
||||||
|
int iterations,
|
||||||
|
int opsPerIteration,
|
||||||
|
const OSRM &osrm,
|
||||||
|
const GPSTraces &gpsTraces,
|
||||||
|
const BenchmarkBody &benchmarkBody)
|
||||||
|
{
|
||||||
|
for (const auto &benchmark : benchmarks)
|
||||||
|
{
|
||||||
|
Statistics statistics{iterations};
|
||||||
|
for (int iteration = 0; iteration < iterations; ++iteration)
|
||||||
|
{
|
||||||
|
gpsTraces.resetSeed();
|
||||||
|
|
||||||
|
for (int i = 0; i < opsPerIteration; ++i)
|
||||||
|
{
|
||||||
|
benchmarkBody(iteration, benchmark, osrm, gpsTraces, statistics);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
std::cout << benchmark.name << std::endl;
|
||||||
|
std::cout << statistics << std::endl;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
void runRouteBenchmark(const OSRM &osrm, const GPSTraces &gpsTraces, int iterations)
|
||||||
|
{
|
||||||
|
|
||||||
|
struct Benchmark
|
||||||
|
{
|
||||||
|
std::string name;
|
||||||
|
size_t coordinates;
|
||||||
|
RouteParameters::OverviewType overview;
|
||||||
|
bool steps = false;
|
||||||
|
std::optional<size_t> alternatives = std::nullopt;
|
||||||
|
std::optional<double> radius = std::nullopt;
|
||||||
|
};
|
||||||
|
std::vector<Benchmark> benchmarks = {
|
||||||
|
{"1000 routes, 3 coordinates, no alternatives, overview=full, steps=true",
|
||||||
|
3,
|
||||||
|
RouteParameters::OverviewType::Full,
|
||||||
|
true,
|
||||||
|
std::nullopt},
|
||||||
|
{"1000 routes, 2 coordinates, 3 alternatives, overview=full, steps=true",
|
||||||
|
2,
|
||||||
|
RouteParameters::OverviewType::Full,
|
||||||
|
true,
|
||||||
|
3},
|
||||||
|
{"1000 routes, 3 coordinates, no alternatives, overview=false, steps=false",
|
||||||
|
3,
|
||||||
|
RouteParameters::OverviewType::False,
|
||||||
|
false,
|
||||||
|
std::nullopt},
|
||||||
|
{"1000 routes, 2 coordinates, 3 alternatives, overview=false, steps=false",
|
||||||
|
2,
|
||||||
|
RouteParameters::OverviewType::False,
|
||||||
|
false,
|
||||||
|
3}};
|
||||||
|
|
||||||
|
runBenchmarks(benchmarks,
|
||||||
|
iterations,
|
||||||
|
1000,
|
||||||
|
osrm,
|
||||||
|
gpsTraces,
|
||||||
|
[](int iteration,
|
||||||
|
const Benchmark &benchmark,
|
||||||
|
const OSRM &osrm,
|
||||||
|
const GPSTraces &gpsTraces,
|
||||||
|
Statistics &statistics)
|
||||||
|
{
|
||||||
|
RouteParameters params;
|
||||||
|
params.overview = benchmark.overview;
|
||||||
|
params.steps = benchmark.steps;
|
||||||
|
|
||||||
|
for (size_t i = 0; i < benchmark.coordinates; ++i)
|
||||||
|
{
|
||||||
|
params.coordinates.push_back(gpsTraces.getRandomCoordinate());
|
||||||
|
}
|
||||||
|
|
||||||
|
if (benchmark.alternatives)
|
||||||
|
{
|
||||||
|
params.alternatives = *benchmark.alternatives;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (benchmark.radius)
|
||||||
|
{
|
||||||
|
params.radiuses = std::vector<std::optional<double>>(
|
||||||
|
params.coordinates.size(), std::make_optional(*benchmark.radius));
|
||||||
|
}
|
||||||
|
|
||||||
|
engine::api::ResultT result = json::Object();
|
||||||
|
TIMER_START(routes);
|
||||||
|
const auto rc = osrm.Route(params, result);
|
||||||
|
TIMER_STOP(routes);
|
||||||
|
|
||||||
|
auto &json_result = std::get<json::Object>(result);
|
||||||
|
if (rc != Status::Ok ||
|
||||||
|
json_result.values.find("routes") == json_result.values.end())
|
||||||
|
{
|
||||||
|
auto code = std::get<json::String>(json_result.values["code"]).value;
|
||||||
|
if (code != "NoSegment" && code != "NoRoute")
|
||||||
|
{
|
||||||
|
throw std::runtime_error{"Couldn't route: " + code};
|
||||||
|
}
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
|
||||||
|
statistics.push(TIMER_MSEC(routes), iteration);
|
||||||
|
}
|
||||||
|
});
|
||||||
|
}
|
||||||
|
|
||||||
|
void runMatchBenchmark(const OSRM &osrm, const GPSTraces &gpsTraces, int iterations)
|
||||||
|
{
|
||||||
|
struct Benchmark
|
||||||
|
{
|
||||||
|
std::string name;
|
||||||
|
std::optional<size_t> radius = std::nullopt;
|
||||||
|
};
|
||||||
|
|
||||||
|
std::vector<Benchmark> benchmarks = {{"500 matches, default radius"},
|
||||||
|
{"500 matches, radius=10", 10},
|
||||||
|
{"500 matches, radius=20", 20}};
|
||||||
|
|
||||||
|
runBenchmarks(benchmarks,
|
||||||
|
iterations,
|
||||||
|
500,
|
||||||
|
osrm,
|
||||||
|
gpsTraces,
|
||||||
|
[](int iteration,
|
||||||
|
const Benchmark &benchmark,
|
||||||
|
const OSRM &osrm,
|
||||||
|
const GPSTraces &gpsTraces,
|
||||||
|
Statistics &statistics)
|
||||||
|
{
|
||||||
|
engine::api::ResultT result = json::Object();
|
||||||
|
|
||||||
|
engine::api::MatchParameters params;
|
||||||
|
params.coordinates = gpsTraces.getRandomTrace();
|
||||||
|
params.radiuses = {};
|
||||||
|
if (benchmark.radius)
|
||||||
|
{
|
||||||
|
for (size_t index = 0; index < params.coordinates.size(); ++index)
|
||||||
|
{
|
||||||
|
params.radiuses.emplace_back(*benchmark.radius);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
TIMER_START(match);
|
||||||
|
const auto rc = osrm.Match(params, result);
|
||||||
|
TIMER_STOP(match);
|
||||||
|
|
||||||
|
auto &json_result = std::get<json::Object>(result);
|
||||||
|
if (rc != Status::Ok ||
|
||||||
|
json_result.values.find("matchings") == json_result.values.end())
|
||||||
|
{
|
||||||
|
auto code = std::get<json::String>(json_result.values["code"]).value;
|
||||||
|
if (code != "NoSegment" && code != "NoMatch")
|
||||||
|
{
|
||||||
|
throw std::runtime_error{"Couldn't route: " + code};
|
||||||
|
}
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
statistics.push(TIMER_MSEC(match), iteration);
|
||||||
|
}
|
||||||
|
});
|
||||||
|
}
|
||||||
|
|
||||||
|
void runNearestBenchmark(const OSRM &osrm, const GPSTraces &gpsTraces, int iterations)
|
||||||
|
{
|
||||||
|
struct Benchmark
|
||||||
|
{
|
||||||
|
std::string name;
|
||||||
|
std::optional<size_t> number_of_results = std::nullopt;
|
||||||
|
};
|
||||||
|
|
||||||
|
std::vector<Benchmark> benchmarks = {{"10000 nearest, number_of_results=1", 1},
|
||||||
|
{"10000 nearest, number_of_results=5", 5},
|
||||||
|
{"10000 nearest, number_of_results=10", 10}};
|
||||||
|
|
||||||
|
runBenchmarks(benchmarks,
|
||||||
|
iterations,
|
||||||
|
10000,
|
||||||
|
osrm,
|
||||||
|
gpsTraces,
|
||||||
|
[](int iteration,
|
||||||
|
const Benchmark &benchmark,
|
||||||
|
const OSRM &osrm,
|
||||||
|
const GPSTraces &gpsTraces,
|
||||||
|
Statistics &statistics)
|
||||||
|
{
|
||||||
|
engine::api::ResultT result = json::Object();
|
||||||
|
NearestParameters params;
|
||||||
|
params.coordinates.push_back(gpsTraces.getRandomCoordinate());
|
||||||
|
|
||||||
|
if (benchmark.number_of_results)
|
||||||
|
{
|
||||||
|
params.number_of_results = *benchmark.number_of_results;
|
||||||
|
}
|
||||||
|
|
||||||
|
TIMER_START(nearest);
|
||||||
|
const auto rc = osrm.Nearest(params, result);
|
||||||
|
TIMER_STOP(nearest);
|
||||||
|
|
||||||
|
auto &json_result = std::get<json::Object>(result);
|
||||||
|
if (rc != Status::Ok ||
|
||||||
|
json_result.values.find("waypoints") == json_result.values.end())
|
||||||
|
{
|
||||||
|
auto code = std::get<json::String>(json_result.values["code"]).value;
|
||||||
|
if (code != "NoSegment")
|
||||||
|
{
|
||||||
|
throw std::runtime_error{"Couldn't find nearest point"};
|
||||||
|
}
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
statistics.push(TIMER_MSEC(nearest), iteration);
|
||||||
|
}
|
||||||
|
});
|
||||||
|
}
|
||||||
|
|
||||||
|
void runTripBenchmark(const OSRM &osrm, const GPSTraces &gpsTraces, int iterations)
|
||||||
|
{
|
||||||
|
struct Benchmark
|
||||||
|
{
|
||||||
|
std::string name;
|
||||||
|
size_t coordinates;
|
||||||
|
};
|
||||||
|
|
||||||
|
std::vector<Benchmark> benchmarks = {
|
||||||
|
{"250 trips, 3 coordinates", 3},
|
||||||
|
{"250 trips, 5 coordinates", 5},
|
||||||
|
};
|
||||||
|
|
||||||
|
runBenchmarks(benchmarks,
|
||||||
|
iterations,
|
||||||
|
250,
|
||||||
|
osrm,
|
||||||
|
gpsTraces,
|
||||||
|
[](int iteration,
|
||||||
|
const Benchmark &benchmark,
|
||||||
|
const OSRM &osrm,
|
||||||
|
const GPSTraces &gpsTraces,
|
||||||
|
Statistics &statistics)
|
||||||
|
{
|
||||||
|
engine::api::ResultT result = json::Object();
|
||||||
|
TripParameters params;
|
||||||
|
params.roundtrip = true;
|
||||||
|
|
||||||
|
for (size_t i = 0; i < benchmark.coordinates; ++i)
|
||||||
|
{
|
||||||
|
params.coordinates.push_back(gpsTraces.getRandomCoordinate());
|
||||||
|
}
|
||||||
|
|
||||||
|
TIMER_START(trip);
|
||||||
|
const auto rc = osrm.Trip(params, result);
|
||||||
|
TIMER_STOP(trip);
|
||||||
|
|
||||||
|
auto &json_result = std::get<json::Object>(result);
|
||||||
|
if (rc != Status::Ok ||
|
||||||
|
json_result.values.find("trips") == json_result.values.end())
|
||||||
|
{
|
||||||
|
auto code = std::get<json::String>(json_result.values["code"]).value;
|
||||||
|
if (code != "NoSegment")
|
||||||
|
{
|
||||||
|
throw std::runtime_error{"Couldn't find trip"};
|
||||||
|
}
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
statistics.push(TIMER_MSEC(trip), iteration);
|
||||||
|
}
|
||||||
|
});
|
||||||
|
}
|
||||||
|
void runTableBenchmark(const OSRM &osrm, const GPSTraces &gpsTraces, int iterations)
|
||||||
|
{
|
||||||
|
struct Benchmark
|
||||||
|
{
|
||||||
|
std::string name;
|
||||||
|
size_t coordinates;
|
||||||
|
};
|
||||||
|
|
||||||
|
std::vector<Benchmark> benchmarks = {{"250 tables, 3 coordinates", 3},
|
||||||
|
{"250 tables, 25 coordinates", 25},
|
||||||
|
{"250 tables, 50 coordinates", 50}};
|
||||||
|
|
||||||
|
runBenchmarks(benchmarks,
|
||||||
|
iterations,
|
||||||
|
250,
|
||||||
|
osrm,
|
||||||
|
gpsTraces,
|
||||||
|
[](int iteration,
|
||||||
|
const Benchmark &benchmark,
|
||||||
|
const OSRM &osrm,
|
||||||
|
const GPSTraces &gpsTraces,
|
||||||
|
Statistics &statistics)
|
||||||
|
{
|
||||||
|
engine::api::ResultT result = json::Object();
|
||||||
|
TableParameters params;
|
||||||
|
|
||||||
|
for (size_t i = 0; i < benchmark.coordinates; ++i)
|
||||||
|
{
|
||||||
|
params.coordinates.push_back(gpsTraces.getRandomCoordinate());
|
||||||
|
}
|
||||||
|
|
||||||
|
TIMER_START(table);
|
||||||
|
const auto rc = osrm.Table(params, result);
|
||||||
|
TIMER_STOP(table);
|
||||||
|
|
||||||
|
statistics.push(TIMER_MSEC(table), iteration);
|
||||||
|
|
||||||
|
auto &json_result = std::get<json::Object>(result);
|
||||||
|
if (rc != Status::Ok ||
|
||||||
|
json_result.values.find("durations") == json_result.values.end())
|
||||||
|
{
|
||||||
|
auto code = std::get<json::String>(json_result.values["code"]).value;
|
||||||
|
if (code != "NoSegment")
|
||||||
|
{
|
||||||
|
throw std::runtime_error{"Couldn't compute table"};
|
||||||
|
}
|
||||||
|
}
|
||||||
|
});
|
||||||
|
}
|
||||||
|
|
||||||
|
} // namespace
|
||||||
|
|
||||||
|
int main(int argc, const char *argv[])
|
||||||
|
try
|
||||||
|
{
|
||||||
|
if (argc < 6)
|
||||||
|
{
|
||||||
|
std::cerr << "Usage: " << argv[0]
|
||||||
|
<< " data.osrm <mld|ch> <path to GPS traces.csv> "
|
||||||
|
"<route|match|trip|table|nearest> <number_of_iterations>\n";
|
||||||
|
return EXIT_FAILURE;
|
||||||
|
}
|
||||||
|
|
||||||
|
// Configure based on a .osrm base path, and no datasets in shared mem from osrm-datastore
|
||||||
|
EngineConfig config;
|
||||||
|
config.storage_config = {argv[1]};
|
||||||
|
config.algorithm =
|
||||||
|
std::string{argv[2]} == "mld" ? EngineConfig::Algorithm::MLD : EngineConfig::Algorithm::CH;
|
||||||
|
config.use_shared_memory = false;
|
||||||
|
|
||||||
|
// Routing machine with several services (such as Route, Table, Nearest, Trip, Match)
|
||||||
|
OSRM osrm{config};
|
||||||
|
|
||||||
|
GPSTraces gpsTraces{42};
|
||||||
|
gpsTraces.readCSV(argv[3]);
|
||||||
|
|
||||||
|
int iterations = std::stoi(argv[5]);
|
||||||
|
|
||||||
|
const auto benchmarkToRun = std::string{argv[4]};
|
||||||
|
|
||||||
|
if (benchmarkToRun == "route")
|
||||||
|
{
|
||||||
|
runRouteBenchmark(osrm, gpsTraces, iterations);
|
||||||
|
}
|
||||||
|
else if (benchmarkToRun == "match")
|
||||||
|
{
|
||||||
|
runMatchBenchmark(osrm, gpsTraces, iterations);
|
||||||
|
}
|
||||||
|
else if (benchmarkToRun == "nearest")
|
||||||
|
{
|
||||||
|
runNearestBenchmark(osrm, gpsTraces, iterations);
|
||||||
|
}
|
||||||
|
else if (benchmarkToRun == "trip")
|
||||||
|
{
|
||||||
|
runTripBenchmark(osrm, gpsTraces, iterations);
|
||||||
|
}
|
||||||
|
else if (benchmarkToRun == "table")
|
||||||
|
{
|
||||||
|
runTableBenchmark(osrm, gpsTraces, iterations);
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
std::cerr << "Unknown benchmark: " << benchmarkToRun << std::endl;
|
||||||
|
return EXIT_FAILURE;
|
||||||
|
}
|
||||||
|
return EXIT_SUCCESS;
|
||||||
|
}
|
||||||
|
catch (const std::exception &e)
|
||||||
|
{
|
||||||
|
std::cerr << "Error: " << e.what() << std::endl;
|
||||||
|
return EXIT_FAILURE;
|
||||||
|
}
|
@ -254,7 +254,7 @@ try
|
|||||||
<< std::endl;
|
<< std::endl;
|
||||||
};
|
};
|
||||||
|
|
||||||
for (auto radius : std::vector<std::optional<double>>{std::nullopt, 5.0, 10.0, 15.0, 30.0})
|
for (auto radius : std::vector<std::optional<double>>{std::nullopt, 10.0})
|
||||||
{
|
{
|
||||||
run_benchmark(radius);
|
run_benchmark(radius);
|
||||||
}
|
}
|
||||||
|
@ -66,8 +66,8 @@ try
|
|||||||
|
|
||||||
if (benchmark.radius)
|
if (benchmark.radius)
|
||||||
{
|
{
|
||||||
params.radiuses = std::vector<boost::optional<double>>(
|
params.radiuses = std::vector<std::optional<double>>(
|
||||||
params.coordinates.size(), boost::make_optional(*benchmark.radius));
|
params.coordinates.size(), std::make_optional(*benchmark.radius));
|
||||||
}
|
}
|
||||||
|
|
||||||
TIMER_START(routes);
|
TIMER_START(routes);
|
||||||
@ -96,12 +96,6 @@ try
|
|||||||
RouteParameters::OverviewType::Full,
|
RouteParameters::OverviewType::Full,
|
||||||
true,
|
true,
|
||||||
std::nullopt},
|
std::nullopt},
|
||||||
{"1000 routes, 2 coordinates, no alternatives, overview=full, steps=true",
|
|
||||||
{{FloatLongitude{7.437602352715465}, FloatLatitude{43.75030522209604}},
|
|
||||||
{FloatLongitude{7.412303912230966}, FloatLatitude{43.72851046529198}}},
|
|
||||||
RouteParameters::OverviewType::Full,
|
|
||||||
true,
|
|
||||||
std::nullopt},
|
|
||||||
{"1000 routes, 2 coordinates, 3 alternatives, overview=full, steps=true",
|
{"1000 routes, 2 coordinates, 3 alternatives, overview=full, steps=true",
|
||||||
{{FloatLongitude{7.437602352715465}, FloatLatitude{43.75030522209604}},
|
{{FloatLongitude{7.437602352715465}, FloatLatitude{43.75030522209604}},
|
||||||
{FloatLongitude{7.412303912230966}, FloatLatitude{43.72851046529198}}},
|
{FloatLongitude{7.412303912230966}, FloatLatitude{43.72851046529198}}},
|
||||||
@ -115,40 +109,12 @@ try
|
|||||||
RouteParameters::OverviewType::False,
|
RouteParameters::OverviewType::False,
|
||||||
false,
|
false,
|
||||||
std::nullopt},
|
std::nullopt},
|
||||||
{"1000 routes, 2 coordinates, no alternatives, overview=false, steps=false",
|
|
||||||
{{FloatLongitude{7.437602352715465}, FloatLatitude{43.75030522209604}},
|
|
||||||
{FloatLongitude{7.412303912230966}, FloatLatitude{43.72851046529198}}},
|
|
||||||
RouteParameters::OverviewType::False,
|
|
||||||
false,
|
|
||||||
std::nullopt},
|
|
||||||
{"1000 routes, 2 coordinates, 3 alternatives, overview=false, steps=false",
|
{"1000 routes, 2 coordinates, 3 alternatives, overview=false, steps=false",
|
||||||
{{FloatLongitude{7.437602352715465}, FloatLatitude{43.75030522209604}},
|
{{FloatLongitude{7.437602352715465}, FloatLatitude{43.75030522209604}},
|
||||||
{FloatLongitude{7.412303912230966}, FloatLatitude{43.72851046529198}}},
|
{FloatLongitude{7.412303912230966}, FloatLatitude{43.72851046529198}}},
|
||||||
RouteParameters::OverviewType::False,
|
RouteParameters::OverviewType::False,
|
||||||
false,
|
false,
|
||||||
3},
|
3},
|
||||||
{"1000 routes, 3 coordinates, no alternatives, overview=false, steps=false, radius=750",
|
|
||||||
{{FloatLongitude{7.437602352715465}, FloatLatitude{43.75030522209604}},
|
|
||||||
{FloatLongitude{7.421844922513342}, FloatLatitude{43.73690777888953}},
|
|
||||||
{FloatLongitude{7.412303912230966}, FloatLatitude{43.72851046529198}}},
|
|
||||||
RouteParameters::OverviewType::False,
|
|
||||||
false,
|
|
||||||
std::nullopt,
|
|
||||||
750},
|
|
||||||
{"1000 routes, 2 coordinates, no alternatives, overview=false, steps=false, radius=750",
|
|
||||||
{{FloatLongitude{7.437602352715465}, FloatLatitude{43.75030522209604}},
|
|
||||||
{FloatLongitude{7.412303912230966}, FloatLatitude{43.72851046529198}}},
|
|
||||||
RouteParameters::OverviewType::False,
|
|
||||||
false,
|
|
||||||
std::nullopt,
|
|
||||||
750},
|
|
||||||
{"1000 routes, 2 coordinates, 3 alternatives, overview=false, steps=false, radius=750",
|
|
||||||
{{FloatLongitude{7.437602352715465}, FloatLatitude{43.75030522209604}},
|
|
||||||
{FloatLongitude{7.412303912230966}, FloatLatitude{43.72851046529198}}},
|
|
||||||
RouteParameters::OverviewType::False,
|
|
||||||
false,
|
|
||||||
3,
|
|
||||||
750}
|
|
||||||
|
|
||||||
};
|
};
|
||||||
|
|
||||||
|
@ -11,11 +11,10 @@
|
|||||||
#include "util/serialization.hpp"
|
#include "util/serialization.hpp"
|
||||||
#include "util/timing_util.hpp"
|
#include "util/timing_util.hpp"
|
||||||
|
|
||||||
|
#include <fstream>
|
||||||
#include <iostream>
|
#include <iostream>
|
||||||
#include <random>
|
#include <random>
|
||||||
|
|
||||||
#include <boost/filesystem/fstream.hpp>
|
|
||||||
|
|
||||||
namespace osrm::benchmarks
|
namespace osrm::benchmarks
|
||||||
{
|
{
|
||||||
|
|
||||||
|
@ -11,7 +11,7 @@
|
|||||||
#include "util/typedefs.hpp"
|
#include "util/typedefs.hpp"
|
||||||
|
|
||||||
#include <boost/assert.hpp>
|
#include <boost/assert.hpp>
|
||||||
#include <boost/optional.hpp>
|
#include <optional>
|
||||||
|
|
||||||
#include <algorithm>
|
#include <algorithm>
|
||||||
#include <iterator>
|
#include <iterator>
|
||||||
@ -44,21 +44,22 @@ util::json::Array lanesFromIntersection(const guidance::IntermediateIntersection
|
|||||||
{
|
{
|
||||||
BOOST_ASSERT(intersection.lanes.lanes_in_turn >= 1);
|
BOOST_ASSERT(intersection.lanes.lanes_in_turn >= 1);
|
||||||
util::json::Array result;
|
util::json::Array result;
|
||||||
|
result.values.reserve(intersection.lane_description.size());
|
||||||
LaneID lane_id = intersection.lane_description.size();
|
LaneID lane_id = intersection.lane_description.size();
|
||||||
|
|
||||||
for (const auto &lane_desc : intersection.lane_description)
|
for (const auto &lane_desc : intersection.lane_description)
|
||||||
{
|
{
|
||||||
--lane_id;
|
--lane_id;
|
||||||
util::json::Object lane;
|
util::json::Object lane;
|
||||||
lane.values["indications"] = toJSON(lane_desc);
|
lane.values.emplace("indications", toJSON(lane_desc));
|
||||||
if (lane_id >= intersection.lanes.first_lane_from_the_right &&
|
if (lane_id >= intersection.lanes.first_lane_from_the_right &&
|
||||||
lane_id <
|
lane_id <
|
||||||
intersection.lanes.first_lane_from_the_right + intersection.lanes.lanes_in_turn)
|
intersection.lanes.first_lane_from_the_right + intersection.lanes.lanes_in_turn)
|
||||||
lane.values["valid"] = util::json::True();
|
lane.values.emplace("valid", util::json::True());
|
||||||
else
|
else
|
||||||
lane.values["valid"] = util::json::False();
|
lane.values.emplace("valid", util::json::False());
|
||||||
|
|
||||||
result.values.push_back(lane);
|
result.values.emplace_back(std::move(lane));
|
||||||
}
|
}
|
||||||
|
|
||||||
return result;
|
return result;
|
||||||
@ -77,6 +78,7 @@ std::string waypointTypeToString(const guidance::WaypointType waypoint_type)
|
|||||||
util::json::Value coordinateToLonLat(const util::Coordinate &coordinate)
|
util::json::Value coordinateToLonLat(const util::Coordinate &coordinate)
|
||||||
{
|
{
|
||||||
util::json::Array array;
|
util::json::Array array;
|
||||||
|
array.values.reserve(2);
|
||||||
array.values.push_back(static_cast<double>(util::toFloating(coordinate.lon)));
|
array.values.push_back(static_cast<double>(util::toFloating(coordinate.lon)));
|
||||||
array.values.push_back(static_cast<double>(util::toFloating(coordinate.lat)));
|
array.values.push_back(static_cast<double>(util::toFloating(coordinate.lat)));
|
||||||
return util::json::Value{std::move(array)};
|
return util::json::Value{std::move(array)};
|
||||||
@ -98,17 +100,20 @@ util::json::Object makeStepManeuver(const guidance::StepManeuver &maneuver)
|
|||||||
// These invalid responses should never happen: log if they do happen
|
// These invalid responses should never happen: log if they do happen
|
||||||
BOOST_ASSERT_MSG(maneuver_type != "invalid", "unexpected invalid maneuver type");
|
BOOST_ASSERT_MSG(maneuver_type != "invalid", "unexpected invalid maneuver type");
|
||||||
|
|
||||||
step_maneuver.values["type"] = std::move(maneuver_type);
|
step_maneuver.values.emplace("type", std::move(maneuver_type));
|
||||||
|
|
||||||
if (detail::isValidModifier(maneuver))
|
if (detail::isValidModifier(maneuver))
|
||||||
step_maneuver.values["modifier"] =
|
step_maneuver.values.emplace(
|
||||||
osrm::guidance::instructionModifierToString(maneuver.instruction.direction_modifier);
|
"modifier",
|
||||||
|
osrm::guidance::instructionModifierToString(maneuver.instruction.direction_modifier));
|
||||||
|
|
||||||
step_maneuver.values["location"] = detail::coordinateToLonLat(maneuver.location);
|
step_maneuver.values.emplace("location", detail::coordinateToLonLat(maneuver.location));
|
||||||
step_maneuver.values["bearing_before"] = detail::roundAndClampBearing(maneuver.bearing_before);
|
step_maneuver.values.emplace("bearing_before",
|
||||||
step_maneuver.values["bearing_after"] = detail::roundAndClampBearing(maneuver.bearing_after);
|
detail::roundAndClampBearing(maneuver.bearing_before));
|
||||||
|
step_maneuver.values.emplace("bearing_after",
|
||||||
|
detail::roundAndClampBearing(maneuver.bearing_after));
|
||||||
if (maneuver.exit != 0)
|
if (maneuver.exit != 0)
|
||||||
step_maneuver.values["exit"] = maneuver.exit;
|
step_maneuver.values.emplace("exit", maneuver.exit);
|
||||||
|
|
||||||
return step_maneuver;
|
return step_maneuver;
|
||||||
}
|
}
|
||||||
@ -137,16 +142,16 @@ util::json::Object makeIntersection(const guidance::IntermediateIntersection &in
|
|||||||
return util::json::False();
|
return util::json::False();
|
||||||
});
|
});
|
||||||
|
|
||||||
result.values["location"] = detail::coordinateToLonLat(intersection.location);
|
result.values.emplace("location", detail::coordinateToLonLat(intersection.location));
|
||||||
result.values["bearings"] = bearings;
|
result.values.emplace("bearings", bearings);
|
||||||
result.values["entry"] = entry;
|
result.values.emplace("entry", entry);
|
||||||
if (intersection.in != guidance::IntermediateIntersection::NO_INDEX)
|
if (intersection.in != guidance::IntermediateIntersection::NO_INDEX)
|
||||||
result.values["in"] = intersection.in;
|
result.values.emplace("in", intersection.in);
|
||||||
if (intersection.out != guidance::IntermediateIntersection::NO_INDEX)
|
if (intersection.out != guidance::IntermediateIntersection::NO_INDEX)
|
||||||
result.values["out"] = intersection.out;
|
result.values.emplace("out", intersection.out);
|
||||||
|
|
||||||
if (detail::hasValidLanes(intersection))
|
if (detail::hasValidLanes(intersection))
|
||||||
result.values["lanes"] = detail::lanesFromIntersection(intersection);
|
result.values.emplace("lanes", detail::lanesFromIntersection(intersection));
|
||||||
|
|
||||||
if (!intersection.classes.empty())
|
if (!intersection.classes.empty())
|
||||||
{
|
{
|
||||||
@ -157,7 +162,7 @@ util::json::Object makeIntersection(const guidance::IntermediateIntersection &in
|
|||||||
std::back_inserter(classes.values),
|
std::back_inserter(classes.values),
|
||||||
[](const std::string &class_name)
|
[](const std::string &class_name)
|
||||||
{ return util::json::String{class_name}; });
|
{ return util::json::String{class_name}; });
|
||||||
result.values["classes"] = std::move(classes);
|
result.values.emplace("classes", std::move(classes));
|
||||||
}
|
}
|
||||||
|
|
||||||
return result;
|
return result;
|
||||||
@ -166,57 +171,64 @@ util::json::Object makeIntersection(const guidance::IntermediateIntersection &in
|
|||||||
util::json::Object makeRouteStep(guidance::RouteStep step, util::json::Value geometry)
|
util::json::Object makeRouteStep(guidance::RouteStep step, util::json::Value geometry)
|
||||||
{
|
{
|
||||||
util::json::Object route_step;
|
util::json::Object route_step;
|
||||||
route_step.values["distance"] = std::round(step.distance * 10) / 10.;
|
route_step.values.reserve(15);
|
||||||
route_step.values["duration"] = step.duration;
|
|
||||||
route_step.values["weight"] = step.weight;
|
route_step.values.emplace("distance", std::round(step.distance * 10) / 10.);
|
||||||
route_step.values["name"] = std::move(step.name);
|
route_step.values.emplace("duration", step.duration);
|
||||||
|
route_step.values.emplace("weight", step.weight);
|
||||||
|
route_step.values.emplace("name", step.name);
|
||||||
|
|
||||||
if (!step.ref.empty())
|
if (!step.ref.empty())
|
||||||
route_step.values["ref"] = std::move(step.ref);
|
route_step.values.emplace("ref", step.ref);
|
||||||
if (!step.pronunciation.empty())
|
if (!step.pronunciation.empty())
|
||||||
route_step.values["pronunciation"] = std::move(step.pronunciation);
|
route_step.values.emplace("pronunciation", step.pronunciation);
|
||||||
if (!step.destinations.empty())
|
if (!step.destinations.empty())
|
||||||
route_step.values["destinations"] = std::move(step.destinations);
|
route_step.values.emplace("destinations", step.destinations);
|
||||||
if (!step.exits.empty())
|
if (!step.exits.empty())
|
||||||
route_step.values["exits"] = std::move(step.exits);
|
route_step.values.emplace("exits", step.exits);
|
||||||
if (!step.rotary_name.empty())
|
if (!step.rotary_name.empty())
|
||||||
{
|
{
|
||||||
route_step.values["rotary_name"] = std::move(step.rotary_name);
|
route_step.values.emplace("rotary_name", step.rotary_name);
|
||||||
if (!step.rotary_pronunciation.empty())
|
if (!step.rotary_pronunciation.empty())
|
||||||
{
|
{
|
||||||
route_step.values["rotary_pronunciation"] = std::move(step.rotary_pronunciation);
|
route_step.values.emplace("rotary_pronunciation", step.rotary_pronunciation);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
route_step.values["mode"] = extractor::travelModeToString(step.mode);
|
route_step.values.emplace("mode", extractor::travelModeToString(step.mode));
|
||||||
route_step.values["maneuver"] = makeStepManeuver(step.maneuver);
|
route_step.values.emplace("maneuver", makeStepManeuver(step.maneuver));
|
||||||
route_step.values["geometry"] = std::move(geometry);
|
route_step.values.emplace("geometry", std::move(geometry));
|
||||||
route_step.values["driving_side"] = step.is_left_hand_driving ? "left" : "right";
|
route_step.values.emplace("driving_side", step.is_left_hand_driving ? "left" : "right");
|
||||||
|
|
||||||
util::json::Array intersections;
|
util::json::Array intersections;
|
||||||
intersections.values.reserve(step.intersections.size());
|
intersections.values.reserve(step.intersections.size());
|
||||||
|
|
||||||
std::transform(step.intersections.begin(),
|
std::transform(step.intersections.begin(),
|
||||||
step.intersections.end(),
|
step.intersections.end(),
|
||||||
std::back_inserter(intersections.values),
|
std::back_inserter(intersections.values),
|
||||||
makeIntersection);
|
makeIntersection);
|
||||||
route_step.values["intersections"] = std::move(intersections);
|
|
||||||
|
route_step.values.emplace("intersections", std::move(intersections));
|
||||||
|
|
||||||
return route_step;
|
return route_step;
|
||||||
}
|
}
|
||||||
|
|
||||||
util::json::Object makeRoute(const guidance::Route &route,
|
util::json::Object makeRoute(const guidance::Route &route,
|
||||||
util::json::Array legs,
|
util::json::Array legs,
|
||||||
boost::optional<util::json::Value> geometry,
|
std::optional<util::json::Value> geometry,
|
||||||
const char *weight_name)
|
const char *weight_name)
|
||||||
{
|
{
|
||||||
util::json::Object json_route;
|
util::json::Object json_route;
|
||||||
json_route.values["distance"] = route.distance;
|
json_route.values.reserve(6);
|
||||||
json_route.values["duration"] = route.duration;
|
|
||||||
json_route.values["weight"] = route.weight;
|
json_route.values.emplace("distance", route.distance);
|
||||||
json_route.values["weight_name"] = weight_name;
|
json_route.values.emplace("duration", route.duration);
|
||||||
json_route.values["legs"] = std::move(legs);
|
json_route.values.emplace("weight", route.weight);
|
||||||
|
json_route.values.emplace("weight_name", weight_name);
|
||||||
|
json_route.values.emplace("legs", std::move(legs));
|
||||||
if (geometry)
|
if (geometry)
|
||||||
{
|
{
|
||||||
json_route.values["geometry"] = *std::move(geometry);
|
json_route.values.emplace("geometry", *std::move(geometry));
|
||||||
}
|
}
|
||||||
return json_route;
|
return json_route;
|
||||||
}
|
}
|
||||||
@ -225,9 +237,11 @@ util::json::Object
|
|||||||
makeWaypoint(const util::Coordinate &location, const double &distance, std::string name)
|
makeWaypoint(const util::Coordinate &location, const double &distance, std::string name)
|
||||||
{
|
{
|
||||||
util::json::Object waypoint;
|
util::json::Object waypoint;
|
||||||
waypoint.values["location"] = detail::coordinateToLonLat(location);
|
waypoint.values.reserve(3);
|
||||||
waypoint.values["name"] = std::move(name);
|
|
||||||
waypoint.values["distance"] = distance;
|
waypoint.values.emplace("location", detail::coordinateToLonLat(location));
|
||||||
|
waypoint.values.emplace("name", std::move(name));
|
||||||
|
waypoint.values.emplace("distance", distance);
|
||||||
return waypoint;
|
return waypoint;
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -237,26 +251,29 @@ util::json::Object makeWaypoint(const util::Coordinate &location,
|
|||||||
const Hint &location_hints)
|
const Hint &location_hints)
|
||||||
{
|
{
|
||||||
auto waypoint = makeWaypoint(location, distance, std::move(name));
|
auto waypoint = makeWaypoint(location, distance, std::move(name));
|
||||||
waypoint.values["hint"] = location_hints.ToBase64();
|
waypoint.values.reserve(1);
|
||||||
|
waypoint.values.emplace("hint", location_hints.ToBase64());
|
||||||
return waypoint;
|
return waypoint;
|
||||||
}
|
}
|
||||||
|
|
||||||
util::json::Object makeRouteLeg(guidance::RouteLeg leg, util::json::Array steps)
|
util::json::Object makeRouteLeg(guidance::RouteLeg leg, util::json::Array steps)
|
||||||
{
|
{
|
||||||
util::json::Object route_leg;
|
util::json::Object route_leg;
|
||||||
route_leg.values["distance"] = leg.distance;
|
route_leg.values.reserve(5);
|
||||||
route_leg.values["duration"] = leg.duration;
|
|
||||||
route_leg.values["weight"] = leg.weight;
|
route_leg.values.emplace("distance", leg.distance);
|
||||||
route_leg.values["summary"] = std::move(leg.summary);
|
route_leg.values.emplace("duration", leg.duration);
|
||||||
route_leg.values["steps"] = std::move(steps);
|
route_leg.values.emplace("weight", leg.weight);
|
||||||
|
route_leg.values.emplace("summary", std::move(leg.summary));
|
||||||
|
route_leg.values.emplace("steps", std::move(steps));
|
||||||
return route_leg;
|
return route_leg;
|
||||||
}
|
}
|
||||||
|
|
||||||
util::json::Object
|
util::json::Object
|
||||||
makeRouteLeg(guidance::RouteLeg leg, util::json::Array steps, util::json::Object annotation)
|
makeRouteLeg(guidance::RouteLeg leg, util::json::Array steps, util::json::Object annotation)
|
||||||
{
|
{
|
||||||
util::json::Object route_leg = makeRouteLeg(std::move(leg), std::move(steps));
|
util::json::Object route_leg = makeRouteLeg(std::move(leg), std::move(steps));
|
||||||
route_leg.values["annotation"] = std::move(annotation);
|
route_leg.values.reserve(1);
|
||||||
|
route_leg.values.emplace("annotation", std::move(annotation));
|
||||||
return route_leg;
|
return route_leg;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -44,7 +44,7 @@ MMapMemoryAllocator::MMapMemoryAllocator(const storage::StorageConfig &config)
|
|||||||
|
|
||||||
for (const auto &file : files)
|
for (const auto &file : files)
|
||||||
{
|
{
|
||||||
if (boost::filesystem::exists(file.second))
|
if (std::filesystem::exists(file.second))
|
||||||
{
|
{
|
||||||
std::unique_ptr<storage::BaseDataLayout> layout =
|
std::unique_ptr<storage::BaseDataLayout> layout =
|
||||||
std::make_unique<storage::TarDataLayout>();
|
std::make_unique<storage::TarDataLayout>();
|
||||||
|
Some files were not shown because too many files have changed in this diff Show More
Loading…
Reference in New Issue
Block a user