Compare commits

..

21 Commits

Author SHA1 Message Date
Siarhei Fedartsou 3e68237e03 Fix CI 2023-08-22 20:29:21 +02:00
Siarhei Fedartsou 2016d468bb Merge branch 'master' into sf-osrm-routed 2023-08-22 17:55:10 +02:00
Siarhei Fedartsou 38e4b0b9d6 Implement NodeJS based server fully replicating osrm-routed 2022-10-29 13:26:40 +02:00
Siarhei Fedartsou ddde7e1ea6 Implement NodeJS based server fully replicating osrm-routed 2022-10-29 13:24:48 +02:00
Siarhei Fedartsou 4dfae26be7 add cluster 2022-10-26 19:30:27 +02:00
Siarhei Fedartsou 40805f7058 Implement NodeJS based server fully replicating osrm-routed 2022-10-25 20:26:20 +02:00
Siarhei Fedartsou 8e3fa70eb0 Implement NodeJS based server fully replicating osrm-routed 2022-10-25 15:54:59 +02:00
Siarhei Fedartsou 41ff79aa1d Implement NodeJS based server fully replicating osrm-routed 2022-10-23 17:00:36 +02:00
Siarhei Fedartsou 6dfb7d4ede Implement NodeJS based server fully replicating osrm-routed 2022-10-23 16:57:01 +02:00
Siarhei Fedartsou 71a638a14f Implement NodeJS based server fully replicating osrm-routed 2022-10-23 16:42:47 +02:00
Siarhei Fedartsou 4fd4c3b563 Implement NodeJS based server fully replicating osrm-routed 2022-10-23 16:24:07 +02:00
Siarhei Fedartsou 242c07443a Implement NodeJS based server fully replicating osrm-routed 2022-10-23 16:07:34 +02:00
Siarhei Fedartsou 1047cc1bfd Implement NodeJS based server fully replicating osrm-routed 2022-10-23 16:06:13 +02:00
Siarhei Fedartsou 9c7d75d7d4 Implement NodeJS based server fully replicating osrm-routed 2022-10-23 16:01:57 +02:00
Siarhei Fedartsou 3f0ded653d Implement NodeJS based server fully replicating osrm-routed 2022-10-23 16:01:13 +02:00
Siarhei Fedartsou 61810b9205 Implement NodeJS based server fully replicating osrm-routed 2022-10-23 15:59:51 +02:00
Siarhei Fedartsou 8273e8b0e2 Implement NodeJS based server fully replicating osrm-routed 2022-10-23 15:13:42 +02:00
Siarhei Fedartsou dd04760982 Implement NodeJS based server fully replicating osrm-routed 2022-10-23 14:38:42 +02:00
Siarhei Fedartsou 768c33127a Implement NodeJS based server fully replicating osrm-routed 2022-10-23 14:26:10 +02:00
Siarhei Fedartsou 251ffe4a50 Implement NodeJS based server fully replicating osrm-routed 2022-10-23 14:18:52 +02:00
Siarhei Fedartsou 53f2da5d5e Implement NodeJS based server fully replicating osrm-routed 2022-10-23 13:56:21 +02:00
545 changed files with 55754 additions and 35390 deletions
+5
View File
@@ -0,0 +1,5 @@
---
name: Question
about: Ask a question about OSRM
labels: question
---
+192 -151
View File
@@ -19,10 +19,6 @@ env:
CMAKE_VERSION: 3.21.2 CMAKE_VERSION: 3.21.2
ENABLE_NODE_BINDINGS: "ON" ENABLE_NODE_BINDINGS: "ON"
concurrency:
group: ${{ github.workflow }}-${{ github.event.pull_request.number || github.ref }}
cancel-in-progress: true
jobs: jobs:
windows-release-node: windows-release-node:
needs: format-taginfo-docs needs: format-taginfo-docs
@@ -30,6 +26,7 @@ jobs:
continue-on-error: false continue-on-error: false
env: env:
BUILD_TYPE: Release BUILD_TYPE: Release
ENABLE_APPLE_SILICON: "OFF"
steps: steps:
- uses: actions/checkout@v3 - uses: actions/checkout@v3
- run: pip install "conan<2.0.0" - run: pip install "conan<2.0.0"
@@ -37,7 +34,7 @@ jobs:
- run: cmake --version - run: cmake --version
- uses: actions/setup-node@v3 - uses: actions/setup-node@v3
with: with:
node-version: 18 node-version: 16
- run: node --version - run: node --version
- run: npm --version - run: npm --version
- name: Prepare environment - name: Prepare environment
@@ -74,13 +71,13 @@ jobs:
token: ${{ secrets.GITHUB_TOKEN }} token: ${{ secrets.GITHUB_TOKEN }}
format-taginfo-docs: format-taginfo-docs:
runs-on: ubuntu-22.04 runs-on: ubuntu-20.04
steps: steps:
- uses: actions/checkout@v3 - uses: actions/checkout@v3
- name: Use Node.js - name: Use Node.js
uses: actions/setup-node@v3 uses: actions/setup-node@v3
with: with:
node-version: 18 node-version: 16
- name: Enable Node.js cache - name: Enable Node.js cache
uses: actions/cache@v3 uses: actions/cache@v3
with: with:
@@ -91,7 +88,7 @@ jobs:
- name: Prepare environment - name: Prepare environment
run: | run: |
npm ci --ignore-scripts npm ci --ignore-scripts
clang-format-15 --version clang-format-10 --version
- name: Run checks - name: Run checks
run: | run: |
./scripts/check_taginfo.py taginfo.json profiles/car.lua ./scripts/check_taginfo.py taginfo.json profiles/car.lua
@@ -100,6 +97,29 @@ jobs:
npm run docs && ./scripts/error_on_dirty.sh npm run docs && ./scripts/error_on_dirty.sh
npm audit --production npm audit --production
routed-js:
runs-on: ubuntu-22.04
steps:
- uses: actions/checkout@v2
- name: Use Node.js
uses: actions/setup-node@v3
with:
node-version: 14
- name: Enable Node.js cache
uses: actions/cache@v2
with:
path: ~/.npm
key: ${{ runner.os }}-node-${{ hashFiles('**/package-lock.json') }}
restore-keys: |
${{ runner.os }}-node-
- name: Compile routed-js
run: |
pushd routed-js
npm ci
npx tsc
popd
./scripts/error_on_dirty.sh
docker-image: docker-image:
needs: format-taginfo-docs needs: format-taginfo-docs
runs-on: ubuntu-22.04 runs-on: ubuntu-22.04
@@ -148,54 +168,44 @@ jobs:
strategy: strategy:
matrix: matrix:
include: include:
- name: gcc-13-debug-cov - name: gcc-9-debug-cov
continue-on-error: false continue-on-error: false
node: 20 node: 16
runs-on: ubuntu-22.04 runs-on: ubuntu-20.04
BUILD_TOOLS: ON BUILD_TOOLS: ON
BUILD_TYPE: Debug BUILD_TYPE: Debug
CCOMPILER: gcc-13 CCOMPILER: gcc-9
CUCUMBER_TIMEOUT: 20000 CUCUMBER_TIMEOUT: 20000
CXXCOMPILER: g++-13 CXXCOMPILER: g++-9
ENABLE_COVERAGE: ON ENABLE_COVERAGE: ON
- name: clang-15-debug-asan-ubsan - name: gcc-9-debug-asan-ubsan
continue-on-error: false continue-on-error: false
node: 20 node: 16
runs-on: ubuntu-22.04 runs-on: ubuntu-20.04
BUILD_TOOLS: ON BUILD_TOOLS: ON
BUILD_TYPE: Debug BUILD_TYPE: Debug
CCOMPILER: clang-15 CCOMPILER: gcc-9
CUCUMBER_TIMEOUT: 20000 CUCUMBER_TIMEOUT: 20000
CXXCOMPILER: clang++-15 CXXCOMPILER: g++-9
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-6.0-debug
continue-on-error: false continue-on-error: false
node: 18 node: 16
runs-on: ubuntu-22.04 runs-on: ubuntu-20.04
BUILD_TOOLS: ON
BUILD_TYPE: Release
CCOMPILER: clang-15
CXXCOMPILER: clang++-15
CUCUMBER_TIMEOUT: 60000
- name: clang-15-debug
continue-on-error: false
node: 18
runs-on: ubuntu-22.04
BUILD_TOOLS: ON BUILD_TOOLS: ON
BUILD_TYPE: Debug BUILD_TYPE: Debug
CCOMPILER: clang-15 CCOMPILER: clang-6.0
CXXCOMPILER: clang++-15 CXXCOMPILER: clang++-6.0
CUCUMBER_TIMEOUT: 60000 CUCUMBER_TIMEOUT: 60000
- name: clang-15-debug-clang-tidy - name: clang-15.0-debug-clang-tidy
continue-on-error: false continue-on-error: false
node: 18 node: 16
runs-on: ubuntu-22.04 runs-on: ubuntu-22.04
BUILD_TOOLS: ON BUILD_TOOLS: ON
BUILD_TYPE: Debug BUILD_TYPE: Debug
@@ -204,71 +214,30 @@ jobs:
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
continue-on-error: false
node: 18
runs-on: ubuntu-22.04
BUILD_TOOLS: ON
BUILD_TYPE: Release
CCOMPILER: clang-13
CXXCOMPILER: clang++-13
CUCUMBER_TIMEOUT: 60000
- name: conan-linux-debug-asan-ubsan - name: conan-linux-debug-asan-ubsan
continue-on-error: false continue-on-error: false
node: 18 node: 16
runs-on: ubuntu-22.04 runs-on: ubuntu-20.04
BUILD_TOOLS: ON BUILD_TOOLS: ON
BUILD_TYPE: Debug BUILD_TYPE: Release
CCOMPILER: clang-15 CCOMPILER: clang-11
CXXCOMPILER: clang++-15 CXXCOMPILER: clang++-11
ENABLE_CONAN: ON ENABLE_CONAN: ON
ENABLE_SANITIZER: ON ENABLE_SANITIZER: ON
- name: conan-linux-release - name: conan-linux-release
continue-on-error: false continue-on-error: false
node: 18 node: 16
runs-on: ubuntu-22.04 runs-on: ubuntu-20.04
BUILD_TOOLS: ON BUILD_TOOLS: ON
BUILD_TYPE: Release BUILD_TYPE: Release
CCOMPILER: clang-15 CCOMPILER: clang-6.0
CXXCOMPILER: clang++-15 CXXCOMPILER: clang++-6.0
ENABLE_CONAN: ON ENABLE_CONAN: ON
- name: conan-linux-debug
continue-on-error: false
node: 18
runs-on: ubuntu-22.04
BUILD_TOOLS: ON
BUILD_TYPE: Debug
CCOMPILER: clang-15
CXXCOMPILER: clang++-15
ENABLE_CONAN: ON
- name: gcc-13-release
continue-on-error: false
node: 20
runs-on: ubuntu-22.04
BUILD_TOOLS: ON
BUILD_TYPE: Release
CCOMPILER: gcc-13
CXXCOMPILER: g++-13
ENABLE_BENCHMARKS: ON
CXXFLAGS: '-Wno-array-bounds -Wno-uninitialized'
- name: gcc-12-release - name: gcc-12-release
continue-on-error: false continue-on-error: false
node: 20 node: 16
runs-on: ubuntu-22.04 runs-on: ubuntu-22.04
BUILD_TOOLS: ON BUILD_TOOLS: ON
BUILD_TYPE: Release BUILD_TYPE: Release
@@ -279,41 +248,83 @@ jobs:
- name: gcc-11-release - name: gcc-11-release
continue-on-error: false continue-on-error: false
node: 20 node: 16
runs-on: ubuntu-22.04 runs-on: ubuntu-20.04
BUILD_TOOLS: ON BUILD_TOOLS: ON
BUILD_TYPE: Release BUILD_TYPE: Release
CCOMPILER: gcc-11 CCOMPILER: gcc-11
CXXCOMPILER: g++-11 CXXCOMPILER: g++-11
ENABLE_BENCHMARKS: ON ENABLE_BENCHMARKS: ON
- name: gcc-10-release
continue-on-error: false
node: 16
runs-on: ubuntu-20.04
BUILD_TOOLS: ON
BUILD_TYPE: Release
CCOMPILER: gcc-10
CXXCOMPILER: g++-10
- name: gcc-9-release
continue-on-error: false
node: 16
runs-on: ubuntu-20.04
BUILD_TOOLS: ON
BUILD_TYPE: Release
CCOMPILER: gcc-9
CXXCOMPILER: g++-9
CXXFLAGS: -Wno-cast-function-type
- name: gcc-9-conan-release-i686
continue-on-error: false
node: 16
runs-on: ubuntu-20.04
BUILD_TOOLS: ON
BUILD_TYPE: Release
CCOMPILER: gcc-9
CFLAGS: "-m32 -msse2 -mfpmath=sse"
CXXCOMPILER: g++-9
CXXFLAGS: "-m32 -msse2 -mfpmath=sse"
TARGET_ARCH: i686
ENABLE_CONAN: ON
- name: gcc-8-release
continue-on-error: false
node: 16
runs-on: ubuntu-20.04
BUILD_TOOLS: ON
BUILD_TYPE: Release
CCOMPILER: gcc-8
CXXCOMPILER: g++-8
CXXFLAGS: -Wno-cast-function-type
- name: conan-linux-release-node - name: conan-linux-release-node
build_node_package: true build_node_package: true
continue-on-error: false continue-on-error: false
node: 20 node: 18
runs-on: ubuntu-22.04 runs-on: ubuntu-20.04
BUILD_TYPE: Release BUILD_TYPE: Release
CCOMPILER: clang-13 CCOMPILER: clang-6.0
CXXCOMPILER: clang++-13 CXXCOMPILER: clang++-6.0
ENABLE_CONAN: ON ENABLE_CONAN: ON
NODE_PACKAGE_TESTS_ONLY: ON NODE_PACKAGE_TESTS_ONLY: ON
- name: conan-linux-debug-node - name: conan-linux-debug-node
build_node_package: true build_node_package: true
continue-on-error: false continue-on-error: false
node: 20 node: 18
runs-on: ubuntu-22.04 runs-on: ubuntu-20.04
BUILD_TYPE: Debug BUILD_TYPE: Debug
CCOMPILER: clang-13 CCOMPILER: clang-6.0
CXXCOMPILER: clang++-13 CXXCOMPILER: clang++-6.0
ENABLE_CONAN: ON ENABLE_CONAN: ON
NODE_PACKAGE_TESTS_ONLY: ON NODE_PACKAGE_TESTS_ONLY: ON
- name: conan-macos-x64-release-node - name: conan-macos-x64-release-node
build_node_package: true build_node_package: true
continue-on-error: true continue-on-error: true
node: 20 node: 18
runs-on: macos-13 # x86_64 runs-on: macos-11
BUILD_TYPE: Release BUILD_TYPE: Release
CCOMPILER: clang CCOMPILER: clang
CXXCOMPILER: clang++ CXXCOMPILER: clang++
@@ -324,14 +335,15 @@ jobs:
- name: conan-macos-arm64-release-node - name: conan-macos-arm64-release-node
build_node_package: true build_node_package: true
continue-on-error: true continue-on-error: true
node: 20 node: 18
runs-on: macos-14 # arm64 runs-on: macos-11
BUILD_TYPE: Release BUILD_TYPE: Release
CCOMPILER: clang CCOMPILER: clang
CXXCOMPILER: clang++ CXXCOMPILER: clang++
CUCUMBER_TIMEOUT: 60000 CUCUMBER_TIMEOUT: 60000
ENABLE_ASSERTIONS: ON ENABLE_ASSERTIONS: ON
ENABLE_CONAN: ON ENABLE_CONAN: ON
ENABLE_APPLE_SILICON: ON
name: ${{ matrix.name}} name: ${{ matrix.name}}
continue-on-error: ${{ matrix.continue-on-error }} continue-on-error: ${{ matrix.continue-on-error }}
@@ -351,13 +363,13 @@ jobs:
ENABLE_CONAN: ${{ matrix.ENABLE_CONAN }} ENABLE_CONAN: ${{ matrix.ENABLE_CONAN }}
ENABLE_SANITIZER: ${{ matrix.ENABLE_SANITIZER }} ENABLE_SANITIZER: ${{ matrix.ENABLE_SANITIZER }}
NODE_PACKAGE_TESTS_ONLY: ${{ matrix.NODE_PACKAGE_TESTS_ONLY }} NODE_PACKAGE_TESTS_ONLY: ${{ matrix.NODE_PACKAGE_TESTS_ONLY }}
ENABLE_APPLE_SILICON: ${{ matrix.ENABLE_APPLE_SILICON }}
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 }}
steps: steps:
- uses: actions/checkout@v3 - uses: actions/checkout@v3
- name: Build machine architecture
run: uname -m
- name: Use Node.js - name: Use Node.js
uses: actions/setup-node@v3 uses: actions/setup-node@v3
with: with:
@@ -380,9 +392,9 @@ jobs:
uses: actions/cache@v3 uses: actions/cache@v3
with: with:
path: ~/.conan path: ~/.conan
key: v9-conan-${{ matrix.name }}-${{ github.sha }} key: v6-conan-${{ matrix.name }}-${{ github.sha }}
restore-keys: | restore-keys: |
v9-conan-${{ matrix.name }}- v6-conan-${{ matrix.name }}-
- name: Enable test cache - name: Enable test cache
uses: actions/cache@v3 uses: actions/cache@v3
with: with:
@@ -401,7 +413,6 @@ jobs:
# We can only set this after checkout once we know the workspace directory # We can only set this after checkout once we know the workspace directory
echo "LSAN_OPTIONS=print_suppressions=0:suppressions=${GITHUB_WORKSPACE}/scripts/ci/leaksanitizer.conf" >> $GITHUB_ENV echo "LSAN_OPTIONS=print_suppressions=0:suppressions=${GITHUB_WORKSPACE}/scripts/ci/leaksanitizer.conf" >> $GITHUB_ENV
echo "UBSAN_OPTIONS=symbolize=1:halt_on_error=1:print_stacktrace=1:suppressions=${GITHUB_WORKSPACE}/scripts/ci/undefinedsanitizer.conf" >> $GITHUB_ENV echo "UBSAN_OPTIONS=symbolize=1:halt_on_error=1:print_stacktrace=1:suppressions=${GITHUB_WORKSPACE}/scripts/ci/undefinedsanitizer.conf" >> $GITHUB_ENV
echo "ASAN_OPTIONS=print_suppressions=0:suppressions=${GITHUB_WORKSPACE}/scripts/ci/addresssanitizer.conf" >> $GITHUB_ENV
fi fi
if [[ "${RUNNER_OS}" == "Linux" ]]; then if [[ "${RUNNER_OS}" == "Linux" ]]; then
@@ -412,7 +423,7 @@ jobs:
- name: Install dev dependencies - name: Install dev dependencies
run: | run: |
python3 -m pip install "conan<2.0.0" || python3 -m pip install "conan<2.0.0" --break-system-packages python3 -m pip install "conan<2.0.0"
# workaround for issue that GitHub Actions seems to not adding it to PATH after https://github.com/actions/runner-images/pull/6499 # workaround for issue that GitHub Actions seems to not adding it to PATH after https://github.com/actions/runner-images/pull/6499
# and that's why CI cannot find conan executable installed above # and that's why CI cannot find conan executable installed above
@@ -427,8 +438,19 @@ jobs:
brew install ccache brew install ccache
fi fi
# clang
if [[ "${CCOMPILER}" == "clang-6.0" ]]; then
sudo apt-get update -y && sudo apt-get install clang++-6
elif [[ "${CCOMPILER}" == "clang-15" ]]; then
wget -O - https://apt.llvm.org/llvm-snapshot.gpg.key | sudo apt-key add -
sudo apt-get update -y && sudo apt-get install software-properties-common
sudo add-apt-repository 'deb http://apt.llvm.org/jammy/ llvm-toolchain-jammy-15 main'
sudo apt-get update -y && sudo apt-get install clang++-15 clang-tidy-15
sudo update-alternatives --install /usr/bin/clang-tidy clang-tidy /usr/bin/clang-tidy-15 100000
fi
# Linux dev packages # Linux dev packages
if [ "${ENABLE_CONAN}" != "ON" ]; then if [ "${TARGET_ARCH}" != "i686" ] && [ "${ENABLE_CONAN}" != "ON" ]; then
sudo apt-get update -y sudo apt-get update -y
sudo apt-get install -y libbz2-dev libxml2-dev libzip-dev liblua5.2-dev libboost-all-dev sudo apt-get install -y libbz2-dev libxml2-dev libzip-dev liblua5.2-dev libboost-all-dev
if [[ "${CCOMPILER}" != clang-* ]]; then if [[ "${CCOMPILER}" != clang-* ]]; then
@@ -437,6 +459,9 @@ jobs:
if [[ "${ENABLE_COVERAGE}" == "ON" ]]; then if [[ "${ENABLE_COVERAGE}" == "ON" ]]; then
sudo apt-get install -y lcov sudo apt-get install -y lcov
fi fi
elif [[ $TARGET_ARCH == "i686" ]]; then
source ./scripts/ci/before_install.${TARGET_ARCH}.sh
echo "PKG_CONFIG_PATH=/usr/lib/i386-linux-gnu/pkgconfig:${PKG_CONFIG_PATH}" >> $GITHUB_ENV
fi fi
# TBB # TBB
@@ -460,18 +485,22 @@ jobs:
fi fi
echo "CC=${CCOMPILER}" >> $GITHUB_ENV echo "CC=${CCOMPILER}" >> $GITHUB_ENV
echo "CXX=${CXXCOMPILER}" >> $GITHUB_ENV echo "CXX=${CXXCOMPILER}" >> $GITHUB_ENV
if [[ "${RUNNER_OS}" == "macOS" ]]; then
# missing from GCC path, needed for conan builds of libiconv, for example.
sudo xcode-select --switch /Library/Developer/CommandLineTools
echo "LIBRARY_PATH=${LIBRARY_PATH}:/Library/Developer/CommandLineTools/SDKs/MacOSX.sdk/usr/lib" >> $GITHUB_ENV
echo "CPATH=${CPATH}:/Library/Developer/CommandLineTools/SDKs/MacOSX.sdk/usr/include" >> $GITHUB_ENV
fi
- name: Build and install OSRM - name: Build and install OSRM
run: | run: |
echo "Using ${JOBS} jobs" echo "Using ${JOBS} jobs"
pushd ${OSRM_BUILD_DIR} pushd ${OSRM_BUILD_DIR}
# handle Apple Silicon cross compilation
if [[ "${ENABLE_APPLE_SILICON}" == "ON" ]]; then
ARCH=arm64
TARGET="${ARCH}-apple-darwin"
CFLAGS="$CFLAGS --target=$TARGET"
CXXFLAGS="$CXXFLAGS --target=$TARGET"
APPLE_SILICON_FLAGS=(-DCMAKE_C_COMPILER_TARGET="$TARGET" -DCMAKE_CXX_COMPILER_TARGET="$TARGET" -DCMAKE_SYSTEM_PROCESSOR="${ARCH}" -DCMAKE_SYSTEM_NAME="Darwin" -DCMAKE_C_FLAGS="$CFLAGS" -DCMAKE_CXX_FLAGS="$CXXFLAGS")
else
APPLE_SILICON_FLAGS=()
fi
cmake .. -DCMAKE_BUILD_TYPE=${BUILD_TYPE} \ cmake .. -DCMAKE_BUILD_TYPE=${BUILD_TYPE} \
-DENABLE_CONAN=${ENABLE_CONAN:-OFF} \ -DENABLE_CONAN=${ENABLE_CONAN:-OFF} \
@@ -483,10 +512,12 @@ 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 \
-DCMAKE_INSTALL_PREFIX=${OSRM_INSTALL_DIR} -DCMAKE_INSTALL_PREFIX=${OSRM_INSTALL_DIR} \
"${APPLE_SILICON_FLAGS[@]}"
make --jobs=${JOBS} make --jobs=${JOBS}
if [[ "${NODE_PACKAGE_TESTS_ONLY}" != "ON" ]]; then if [[ "${NODE_PACKAGE_TESTS_ONLY}" != "ON" && "${ENABLE_APPLE_SILICON}" != "ON" ]]; then
make tests --jobs=${JOBS} make tests --jobs=${JOBS}
make benchmarks --jobs=${JOBS} make benchmarks --jobs=${JOBS}
ccache -s ccache -s
@@ -498,14 +529,17 @@ jobs:
fi fi
popd popd
- name: Build example - name: Build example
if: ${{ matrix.NODE_PACKAGE_TESTS_ONLY != 'ON' }} if: ${{ matrix.NODE_PACKAGE_TESTS_ONLY != 'ON' && matrix.ENABLE_APPLE_SILICON != 'ON' }}
run: | run: |
mkdir example/build && pushd example/build mkdir example/build && pushd example/build
cmake .. -DCMAKE_BUILD_TYPE=${BUILD_TYPE} cmake .. -DCMAKE_BUILD_TYPE=${BUILD_TYPE}
make --jobs=${JOBS} make --jobs=${JOBS}
popd popd
- name: Install osrm-routed-js dependencies
if: ${{ matrix.node != 12 && matrix.ENABLE_APPLE_SILICON != 'ON' && matrix.TARGET_ARCH != 'i686' }}
run: cd routed-js && npm ci && npm link && osrm-routed-js --version
- name: Run all tests - name: Run all tests
if: ${{ matrix.NODE_PACKAGE_TESTS_ONLY != 'ON' }} if: ${{ matrix.NODE_PACKAGE_TESTS_ONLY != 'ON' && matrix.ENABLE_APPLE_SILICON != 'ON' }}
run: | run: |
make -C test/data benchmark make -C test/data benchmark
@@ -516,7 +550,7 @@ jobs:
# All tests assume to be run from the build directory # All tests assume to be run from the build directory
pushd ${OSRM_BUILD_DIR} pushd ${OSRM_BUILD_DIR}
for i in ./unit_tests/*-tests ; do echo Running $i ; $i ; done for i in ./unit_tests/*-tests ; do echo Running $i ; $i ; done
if [ -z "${ENABLE_SANITIZER}" ]; then if [ -z "${ENABLE_SANITIZER}" ] && [ "$TARGET_ARCH" != "i686" ]; then
npm run nodejs-tests npm run nodejs-tests
fi fi
popd popd
@@ -528,39 +562,38 @@ jobs:
make --jobs=${JOBS} benchmarks make --jobs=${JOBS} benchmarks
./src/benchmarks/alias-bench ./src/benchmarks/alias-bench
./src/benchmarks/json-render-bench ../src/benchmarks/portugal_to_korea.json ./src/benchmarks/json-render-bench ../src/benchmarks/portugal_to_korea.json
./src/benchmarks/match-bench ../test/data/ch/monaco.osrm ch ./src/benchmarks/match-bench ../test/data/ch/monaco.osrm
./src/benchmarks/match-bench ../test/data/mld/monaco.osrm mld
./src/benchmarks/packedvector-bench ./src/benchmarks/packedvector-bench
./src/benchmarks/rtree-bench ../test/data/monaco.osrm.ramIndex ../test/data/monaco.osrm.fileIndex ../test/data/monaco.osrm.nbg_nodes ./src/benchmarks/rtree-bench ../test/data/monaco.osrm.ramIndex ../test/data/monaco.osrm.fileIndex ../test/data/monaco.osrm.nbg_nodes
popd popd
- name: Use Node 16
if: ${{ matrix.NODE_PACKAGE_TESTS_ONLY == 'ON' && matrix.ENABLE_APPLE_SILICON != 'ON' }}
uses: actions/setup-node@v3
with:
node-version: 16
- name: Run Node package tests on Node 16
if: ${{ matrix.NODE_PACKAGE_TESTS_ONLY == 'ON' && matrix.ENABLE_APPLE_SILICON != 'ON' }}
run: |
node --version
npm run nodejs-tests
- name: Use Node 18 - name: Use Node 18
if: ${{ matrix.NODE_PACKAGE_TESTS_ONLY == 'ON' }} if: ${{ matrix.NODE_PACKAGE_TESTS_ONLY == 'ON' && matrix.ENABLE_APPLE_SILICON != 'ON' }}
uses: actions/setup-node@v3 uses: actions/setup-node@v3
with: with:
node-version: 18 node-version: 18
- name: Run Node package tests on Node 18 - name: Run Node package tests on Node 18
if: ${{ matrix.NODE_PACKAGE_TESTS_ONLY == 'ON' }} if: ${{ matrix.NODE_PACKAGE_TESTS_ONLY == 'ON' && matrix.ENABLE_APPLE_SILICON != 'ON' }}
run: |
node --version
npm run nodejs-tests
- name: Use Node 20
if: ${{ matrix.NODE_PACKAGE_TESTS_ONLY == 'ON' }}
uses: actions/setup-node@v3
with:
node-version: 20
- name: Run Node package tests on Node 20
if: ${{ matrix.NODE_PACKAGE_TESTS_ONLY == 'ON' }}
run: | run: |
node --version node --version
npm run nodejs-tests npm run nodejs-tests
- name: Use Node latest - name: Use Node latest
if: ${{ matrix.NODE_PACKAGE_TESTS_ONLY == 'ON' }} if: ${{ matrix.NODE_PACKAGE_TESTS_ONLY == 'ON' && matrix.ENABLE_APPLE_SILICON != 'ON' }}
uses: actions/setup-node@v3 uses: actions/setup-node@v3
with: with:
node-version: latest node-version: latest
- name: Run Node package tests on Node-latest - name: Run Node package tests on Node-latest
if: ${{ matrix.NODE_PACKAGE_TESTS_ONLY == 'ON' }} if: ${{ matrix.NODE_PACKAGE_TESTS_ONLY == 'ON' && matrix.ENABLE_APPLE_SILICON != 'ON' }}
run: | run: |
node --version node --version
npm run nodejs-tests npm run nodejs-tests
@@ -572,22 +605,30 @@ jobs:
name: logs name: logs
path: test/logs/ path: test/logs/
# - name: Generate code coverage - name: Generate code coverage
# if: ${{ matrix.ENABLE_COVERAGE == 'ON' }} if: ${{ matrix.ENABLE_COVERAGE == 'ON' }}
# run: | run: |
# lcov --directory . --capture --output-file coverage.info # capture coverage info lcov --directory . --capture --output-file coverage.info # capture coverage info
# lcov --remove coverage.info '/usr/*' --output-file coverage.info # filter out system lcov --remove coverage.info '/usr/*' --output-file coverage.info # filter out system
# lcov --list coverage.info #debug info lcov --list coverage.info #debug info
# Uploading report to CodeCov
# # Uploading report to CodeCov - name: Upload code coverage
# - name: Upload code coverage if: ${{ matrix.ENABLE_COVERAGE == 'ON' }}
# if: ${{ matrix.ENABLE_COVERAGE == 'ON' }} uses: codecov/codecov-action@v1
# uses: codecov/codecov-action@v1 with:
# with: files: coverage.info
# files: coverage.info name: codecov-osrm-backend
# name: codecov-osrm-backend fail_ci_if_error: true
# fail_ci_if_error: true verbose: true
# verbose: true - name: Check Apple Silicon binary
if: ${{ matrix.ENABLE_APPLE_SILICON == 'ON' }}
run: |
ARCH=$(file ./lib/binding/node_osrm.node | awk '{printf $NF}')
if [[ "$ARCH" != "arm64" ]]; then
file ./lib/binding/node_osrm.node
>&2 echo "Wrong architecture!"
exit 1
fi
- name: Build Node package - name: Build Node package
if: ${{ matrix.build_node_package }} if: ${{ matrix.build_node_package }}
run: ./scripts/ci/node_package.sh run: ./scripts/ci/node_package.sh
@@ -607,6 +648,6 @@ jobs:
ci-complete: ci-complete:
runs-on: ubuntu-22.04 runs-on: ubuntu-22.04
needs: [build-test-publish, docker-image, windows-release-node] needs: [build-test-publish, docker-image, routed-js, windows-release-node]
steps: steps:
- run: echo "CI complete" - run: echo "CI complete"
-18
View File
@@ -1,25 +1,17 @@
# Unreleased # Unreleased
- Changes from 5.27.1 - Changes from 5.27.1
- Features - Features
- ADDED: Add support for a keepalive_timeout flag. [#6674](https://github.com/Project-OSRM/osrm-backend/pull/6674)
- ADDED: Add support for a default_radius flag. [#6575](https://github.com/Project-OSRM/osrm-backend/pull/6575) - ADDED: Add support for a default_radius flag. [#6575](https://github.com/Project-OSRM/osrm-backend/pull/6575)
- ADDED: Add support for disabling feature datasets. [#6666](https://github.com/Project-OSRM/osrm-backend/pull/6666) - ADDED: Add support for disabling feature datasets. [#6666](https://github.com/Project-OSRM/osrm-backend/pull/6666)
- ADDED: Add support for opposite approach request parameter. [#6842](https://github.com/Project-OSRM/osrm-backend/pull/6842)
- ADDED: Add support for accessing edge flags in `process_segment` [#6658](https://github.com/Project-OSRM/osrm-backend/pull/6658)
- Build: - Build:
- ADDED: Add CI job which builds OSRM with gcc 12. [#6455](https://github.com/Project-OSRM/osrm-backend/pull/6455) - ADDED: Add CI job which builds OSRM with gcc 12. [#6455](https://github.com/Project-OSRM/osrm-backend/pull/6455)
- CHANGED: Upgrade to clang-tidy 15. [#6439](https://github.com/Project-OSRM/osrm-backend/pull/6439) - CHANGED: Upgrade to clang-tidy 15. [#6439](https://github.com/Project-OSRM/osrm-backend/pull/6439)
- CHANGED: Update actions/cache to v3. [#6420](https://github.com/Project-OSRM/osrm-backend/pull/6420) - CHANGED: Update actions/cache to v3. [#6420](https://github.com/Project-OSRM/osrm-backend/pull/6420)
- REMOVED: Drop support of Node 12 & 14. [#6431](https://github.com/Project-OSRM/osrm-backend/pull/6431) - REMOVED: Drop support of Node 12 & 14. [#6431](https://github.com/Project-OSRM/osrm-backend/pull/6431)
- ADDED: Add 'load directly' mode to default Cucumber test suite. [#6663](https://github.com/Project-OSRM/osrm-backend/pull/6663) - ADDED: Add 'load directly' mode to default Cucumber test suite. [#6663](https://github.com/Project-OSRM/osrm-backend/pull/6663)
- CHANGED: Fix compilation for Boost 1.85.0 [#6856](https://github.com/Project-OSRM/osrm-backend/pull/6856)
- CHANGED: Drop support for Node 16 [#6855](https://github.com/Project-OSRM/osrm-backend/pull/6855)
- REMOVED: Remove unused AppVeyor files [#6860](https://github.com/Project-OSRM/osrm-backend/pull/6860)
- CHANGED: Upgrade clang-format to version 15 [#6859](https://github.com/Project-OSRM/osrm-backend/pull/6859)
- 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: 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)
- CHANGED: Allow -1.0 as unlimited for default_radius value. [#6599](https://github.com/Project-OSRM/osrm-backend/pull/6599) - CHANGED: Allow -1.0 as unlimited for default_radius value. [#6599](https://github.com/Project-OSRM/osrm-backend/pull/6599)
@@ -38,20 +30,10 @@
- FIXED: Added a variable to preprocessor guard in file osrm-backend/include/util/range_table.hpp to solve build error. [#6596](https://github.com/Project-OSRM/osrm-backend/pull/6596) - FIXED: Added a variable to preprocessor guard in file osrm-backend/include/util/range_table.hpp to solve build error. [#6596](https://github.com/Project-OSRM/osrm-backend/pull/6596)
- FIXED: Ensure required file check in osrm-routed is correctly enforced. [#6655](https://github.com/Project-OSRM/osrm-backend/pull/6655) - FIXED: Ensure required file check in osrm-routed is correctly enforced. [#6655](https://github.com/Project-OSRM/osrm-backend/pull/6655)
- FIXED: Correct HTTP docs to reflect summary output dependency on steps parameter. [#6655](https://github.com/Project-OSRM/osrm-backend/pull/6655) - FIXED: Correct HTTP docs to reflect summary output dependency on steps parameter. [#6655](https://github.com/Project-OSRM/osrm-backend/pull/6655)
- ADDED: Extract prerelease/build information from package semver [#6839](https://github.com/Project-OSRM/osrm-backend/pull/6839)
- Profiles: - Profiles:
- FIXED: Bicycle and foot profiles now don't route on proposed ways [#6615](https://github.com/Project-OSRM/osrm-backend/pull/6615) - FIXED: Bicycle and foot profiles now don't route on proposed ways [#6615](https://github.com/Project-OSRM/osrm-backend/pull/6615)
- Routing: - Routing:
- FIXED: Fix adding traffic signal penalties during compression [#6419](https://github.com/Project-OSRM/osrm-backend/pull/6419) - FIXED: Fix adding traffic signal penalties during compression [#6419](https://github.com/Project-OSRM/osrm-backend/pull/6419)
- FIXED: Correctly handle compressed traffic signals. [#6724](https://github.com/Project-OSRM/osrm-backend/pull/6724)
- FIXED: Fix bug when searching for maneuver overrides [#6739](https://github.com/Project-OSRM/osrm-backend/pull/6739)
- FIXED: Remove force-loop checks for routes with u-turns [#6858](https://github.com/Project-OSRM/osrm-backend/pull/6858)
- FIXED: Correctly check runtime search conditions for forcing routing steps [#6866](https://github.com/Project-OSRM/osrm-backend/pull/6866)
- Map Matching:
- CHANGED: Optimise path distance calculation in MLD map matching. [#6876](https://github.com/Project-OSRM/osrm-backend/pull/6876)
- Debug tiles:
- FIXED: Ensure speed layer features have unique ids. [#6726](https://github.com/Project-OSRM/osrm-backend/pull/6726)
# 5.27.1 # 5.27.1
- Changes from 5.27.0 - Changes from 5.27.0
- Misc: - Misc:
+43 -59
View File
@@ -42,13 +42,16 @@ if (ENABLE_CLANG_TIDY)
message(FATAL_ERROR "ENABLE_CLANG_TIDY is ON but clang-tidy is not found!") message(FATAL_ERROR "ENABLE_CLANG_TIDY is ON but clang-tidy is not found!")
else() else()
message(STATUS "Found clang-tidy at ${CLANG_TIDY_COMMAND}") message(STATUS "Found clang-tidy at ${CLANG_TIDY_COMMAND}")
set(CMAKE_CXX_CLANG_TIDY "${CLANG_TIDY_COMMAND};--warnings-as-errors=*;--header-filter=.*") set(CMAKE_CXX_CLANG_TIDY "${CLANG_TIDY_COMMAND};--warnings-as-errors=*")
endif() endif()
endif() endif()
list(APPEND CMAKE_MODULE_PATH "${CMAKE_CURRENT_SOURCE_DIR}/cmake") list(APPEND CMAKE_MODULE_PATH "${CMAKE_CURRENT_SOURCE_DIR}/cmake")
# be compatible with version handling before cmake 3.x # be compatible with version handling before cmake 3.x
if (POLICY CMP0048)
cmake_policy(SET CMP0048 OLD)
endif()
if (POLICY CMP0057) if (POLICY CMP0057)
cmake_policy(SET CMP0057 NEW) cmake_policy(SET CMP0057 NEW)
endif() endif()
@@ -70,17 +73,14 @@ include(JSONParser)
file(READ "package.json" packagejsonraw) file(READ "package.json" packagejsonraw)
sbeParseJson(packagejson packagejsonraw) sbeParseJson(packagejson packagejsonraw)
# This regex is not strict enough, but the correct one is too complicated for cmake matching. if (packagejson.version MATCHES "^([0-9]+)\.([0-9]+)\.([0-9]+)")
# https://semver.org/#is-there-a-suggested-regular-expression-regex-to-check-a-semver-string set(OSRM_VERSION_MAJOR ${CMAKE_MATCH_1})
if (packagejson.version MATCHES "^([0-9]+)\.([0-9]+)\.([0-9]+)([-+][0-9a-zA-Z.-]+)?$") set(OSRM_VERSION_MINOR ${CMAKE_MATCH_2})
set(OSRM_VERSION_MAJOR ${CMAKE_MATCH_1}) set(OSRM_VERSION_PATCH ${CMAKE_MATCH_3})
set(OSRM_VERSION_MINOR ${CMAKE_MATCH_2})
set(OSRM_VERSION_PATCH ${CMAKE_MATCH_3})
set(OSRM_VERSION_PRERELEASE_BUILD ${CMAKE_MATCH_4})
set(OSRM_VERSION packagejson.version) set(OSRM_VERSION "${OSRM_VERSION_MAJOR}.${OSRM_VERSION_MINOR}.${OSRM_VERSION_PATCH}")
else() else()
message(FATAL_ERROR "Version from package.json cannot be parsed, expected semver compatible label, but found ${packagejson.version}") message(FATAL_ERROR "Version from package.json cannot be parsed, expected semver compatible X.Y.Z, but found ${packagejson.version}")
endif() endif()
if (MSVC) if (MSVC)
@@ -115,7 +115,7 @@ include(GNUInstallDirs)
if(CMAKE_SIZEOF_VOID_P EQUAL 8) if(CMAKE_SIZEOF_VOID_P EQUAL 8)
message(STATUS "Building on a 64 bit system") message(STATUS "Building on a 64 bit system")
else() else()
message(FATAL_ERROR "Building on a 32 bit system is not supported") message(STATUS "Building on a 32 bit system")
endif() endif()
include_directories(BEFORE ${CMAKE_CURRENT_BINARY_DIR}/include/) include_directories(BEFORE ${CMAKE_CURRENT_BINARY_DIR}/include/)
@@ -151,7 +151,7 @@ add_library(UPDATER OBJECT ${UpdaterGlob})
add_library(STORAGE OBJECT ${StorageGlob}) add_library(STORAGE OBJECT ${StorageGlob})
add_library(ENGINE OBJECT ${EngineGlob}) add_library(ENGINE OBJECT ${EngineGlob})
if (BUILD_ROUTED) if (BUILD_ROUTED)
add_library(SERVER OBJECT ${ServerGlob}) add_library(SERVER OBJECT ${ServerGlob})
add_executable(osrm-routed src/tools/routed.cpp $<TARGET_OBJECTS:SERVER> $<TARGET_OBJECTS:UTIL>) add_executable(osrm-routed src/tools/routed.cpp $<TARGET_OBJECTS:SERVER> $<TARGET_OBJECTS:UTIL>)
endif() endif()
@@ -223,7 +223,7 @@ 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")
message(ERROR "ENABLE_COVERAGE=ON only makes sense with a Debug build") message(ERROR "ENABLE_COVERAGE=ON only make sense with a Debug build")
endif() endif()
message(STATUS "Enabling coverage") message(STATUS "Enabling coverage")
set(MAYBE_COVERAGE_LIBRARIES "-lgcov") set(MAYBE_COVERAGE_LIBRARIES "-lgcov")
@@ -309,10 +309,10 @@ add_subdirectory(${FLATBUFFERS_SRC_DIR}
${CMAKE_CURRENT_BINARY_DIR}/flatbuffers-build ${CMAKE_CURRENT_BINARY_DIR}/flatbuffers-build
EXCLUDE_FROM_ALL) EXCLUDE_FROM_ALL)
set(FMT_INCLUDE_DIR "${CMAKE_CURRENT_SOURCE_DIR}/third_party/fmt/include") set(FMT_INCLUDE_DIR "${CMAKE_CURRENT_SOURCE_DIR}/third_party/fmt-9.1.0/include")
add_compile_definitions(FMT_HEADER_ONLY) add_compile_definitions(FMT_HEADER_ONLY)
include_directories(SYSTEM ${FMT_INCLUDE_DIR}) include_directories(SYSTEM ${FMT_INCLUDE_DIR})
# see https://stackoverflow.com/questions/70898030/boost-link-error-using-conan-find-package # see https://stackoverflow.com/questions/70898030/boost-link-error-using-conan-find-package
if (MSVC) if (MSVC)
@@ -322,24 +322,22 @@ endif()
if(ENABLE_CONAN) if(ENABLE_CONAN)
message(STATUS "Installing dependencies via Conan") message(STATUS "Installing dependencies via Conan")
# Conan will generate Find*.cmake files to build directory, so we use them with the highest priority # Conan will generate Find*.cmake files to build directory, so we use them with the highest priority
list(INSERT CMAKE_MODULE_PATH 0 ${CMAKE_BINARY_DIR}) list(INSERT CMAKE_MODULE_PATH 0 ${CMAKE_BINARY_DIR})
list(INSERT CMAKE_PREFIX_PATH 0 ${CMAKE_BINARY_DIR}) list(INSERT CMAKE_PREFIX_PATH 0 ${CMAKE_BINARY_DIR})
include(${CMAKE_CURRENT_LIST_DIR}/cmake/conan.cmake) include(${CMAKE_CURRENT_LIST_DIR}/cmake/conan.cmake)
conan_check(REQUIRED) set(CONAN_BOOST_VERSION "1.79.0#96e4902111a2e343a8ba0aa95391bb58")
set(CONAN_BZIP2_VERSION "1.0.8#d1b2d5816f25865acf978501dff1f897")
set(CONAN_BOOST_VERSION "1.85.0@#14265ec82b25d91305bbb3b30d3357f8") set(CONAN_EXPAT_VERSION "2.2.10#916908d4a570ad839edd25322c3268cd")
set(CONAN_BZIP2_VERSION "1.0.8@#d1b2d5816f25865acf978501dff1f897") set(CONAN_LUA_VERSION "5.4.4#3ec62efc37cd0a5d80b9e5cb35277360")
set(CONAN_EXPAT_VERSION "2.2.10@#916908d4a570ad839edd25322c3268cd") set(CONAN_TBB_VERSION "2021.3.0#507ec17cbd51a84167e143b20d170eea")
set(CONAN_LUA_VERSION "5.4.4@#3ec62efc37cd0a5d80b9e5cb35277360")
set(CONAN_TBB_VERSION "2021.3.0@#507ec17cbd51a84167e143b20d170eea")
set(CONAN_SYSTEM_INCLUDES ON) set(CONAN_SYSTEM_INCLUDES ON)
# TODO: # TODO:
# if we link TBB dynamically osrm-extract.exe finishes on the first access to any TBB symbol # 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. # with exit code = -1073741515, which means that program cannot load required DLL.
if (MSVC) if (MSVC)
set(TBB_SHARED False) set(TBB_SHARED False)
@@ -347,14 +345,14 @@ if(ENABLE_CONAN)
set(TBB_SHARED True) set(TBB_SHARED True)
endif() endif()
set(CONAN_ARGS set(CONAN_ARGS
REQUIRES REQUIRES
"boost/${CONAN_BOOST_VERSION}" "boost/${CONAN_BOOST_VERSION}"
"bzip2/${CONAN_BZIP2_VERSION}" "bzip2/${CONAN_BZIP2_VERSION}"
"expat/${CONAN_EXPAT_VERSION}" "expat/${CONAN_EXPAT_VERSION}"
"lua/${CONAN_LUA_VERSION}" "lua/${CONAN_LUA_VERSION}"
"onetbb/${CONAN_TBB_VERSION}" "onetbb/${CONAN_TBB_VERSION}"
BASIC_SETUP BASIC_SETUP
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
@@ -363,13 +361,6 @@ if(ENABLE_CONAN)
boost:without_stacktrace=True # Apple Silicon cross-compilation fails without it boost:without_stacktrace=True # Apple Silicon cross-compilation fails without it
BUILD missing BUILD missing
) )
# Enable revisions in the conan config
execute_process(COMMAND ${CONAN_CMD} config set general.revisions_enabled=1 RESULT_VARIABLE RET_CODE)
if(NOT "${RET_CODE}" STREQUAL "0")
message(FATAL_ERROR "Error setting revisions for Conan: '${RET_CODE}'")
endif()
# explicitly say Conan to use x86 dependencies if build for x86 platforms (https://github.com/conan-io/cmake-conan/issues/141) # explicitly say Conan to use x86 dependencies if build for x86 platforms (https://github.com/conan-io/cmake-conan/issues/141)
if(NOT CMAKE_SIZEOF_VOID_P EQUAL 8) if(NOT CMAKE_SIZEOF_VOID_P EQUAL 8)
conan_cmake_run("${CONAN_ARGS};ARCH;x86") conan_cmake_run("${CONAN_ARGS};ARCH;x86")
@@ -398,7 +389,7 @@ if(ENABLE_CONAN)
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_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}")
find_package(BZip2 REQUIRED) find_package(BZip2 REQUIRED)
find_package(EXPAT REQUIRED) find_package(EXPAT REQUIRED)
@@ -471,9 +462,6 @@ 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) add_dependency_defines(-DBOOST_FILESYSTEM_NO_DEPRECATED)
# Workaround for https://github.com/boostorg/phoenix/issues/111
add_dependency_defines(-DBOOST_PHOENIX_STL_TUPLE_H_)
add_definitions(${OSRM_DEFINES}) add_definitions(${OSRM_DEFINES})
include_directories(SYSTEM ${DEPENDENCIES_INCLUDE_DIRS}) include_directories(SYSTEM ${DEPENDENCIES_INCLUDE_DIRS})
@@ -651,10 +639,6 @@ install(TARGETS osrm_guidance DESTINATION lib)
set(DefaultProfilesDir profiles) set(DefaultProfilesDir profiles)
install(DIRECTORY ${DefaultProfilesDir} DESTINATION share/osrm) install(DIRECTORY ${DefaultProfilesDir} DESTINATION share/osrm)
# Install data geojson files to /usr/local/share/osrm/data by default
set(DefaultProfilesDir data)
install(DIRECTORY ${DefaultProfilesDir} DESTINATION share/osrm)
# Setup exporting variables for pkgconfig and subproject # Setup exporting variables for pkgconfig and subproject
# #
@@ -749,23 +733,23 @@ if (ENABLE_FUZZING)
add_subdirectory(fuzz) add_subdirectory(fuzz)
endif () endif ()
# add headers sanity check target that includes all headers independently # add headers sanity check target that includes all headers independently
set(check_headers_dir "${PROJECT_BINARY_DIR}/check-headers") set(check_headers_dir "${PROJECT_BINARY_DIR}/check-headers")
file(GLOB_RECURSE headers_to_check file(GLOB_RECURSE headers_to_check
${PROJECT_BINARY_DIR}/*.hpp ${PROJECT_BINARY_DIR}/*.hpp
${PROJECT_SOURCE_DIR}/include/*.hpp) ${PROJECT_SOURCE_DIR}/include/*.hpp)
foreach(header ${headers_to_check}) foreach(header ${headers_to_check})
if ("${header}" MATCHES ".*/include/nodejs/.*") if ("${header}" MATCHES ".*/include/nodejs/.*")
# we do not check NodeJS bindings headers # we do not check NodeJS bindings headers
continue() continue()
endif() endif()
get_filename_component(filename ${header} NAME_WE) get_filename_component(filename ${header} NAME_WE)
set(filename "${check_headers_dir}/${filename}.cpp") set(filename "${check_headers_dir}/${filename}.cpp")
if (NOT EXISTS ${filename}) if (NOT EXISTS ${filename})
file(WRITE ${filename} "#include \"${header}\"\n") file(WRITE ${filename} "#include \"${header}\"\n")
endif() endif()
list(APPEND sources ${filename}) list(APPEND sources ${filename})
endforeach() endforeach()
add_library(check-headers STATIC EXCLUDE_FROM_ALL ${sources}) add_library(check-headers STATIC EXCLUDE_FROM_ALL ${sources})
set_target_properties(check-headers PROPERTIES ARCHIVE_OUTPUT_DIRECTORY ${check_headers_dir}) set_target_properties(check-headers PROPERTIES ARCHIVE_OUTPUT_DIRECTORY ${check_headers_dir})
+1 -1
View File
@@ -10,7 +10,7 @@ You can add a :+1: emoji reaction to the issue if you want to express interest i
# Developer # Developer
We use `clang-format` version `15` to consistently format the code base. There is a helper script under `scripts/format.sh`. We use `clang-format` version `3.8` to consistently format the code base. There is a helper script under `scripts/format.sh`.
The format is automatically checked by the `mason-linux-release` job of a Travis CI build. The format is automatically checked by the `mason-linux-release` job of a Travis CI build.
To save development time a local hook `.git/hooks/pre-push` To save development time a local hook `.git/hooks/pre-push`
``` ```
+1 -1
View File
@@ -20,7 +20,7 @@ For a quick introduction about how the road network is represented in OpenStreet
Related [Project-OSRM](https://github.com/Project-OSRM) repositories: Related [Project-OSRM](https://github.com/Project-OSRM) repositories:
- [osrm-frontend](https://github.com/Project-OSRM/osrm-frontend) - User-facing frontend with map. The demo server runs this on top of the backend - [osrm-frontend](https://github.com/Project-OSRM/osrm-frontend) - User-facing frontend with map. The demo server runs this on top of the backend
- [osrm-text-instructions](https://github.com/Project-OSRM/osrm-text-instructions) - Text instructions from OSRM route response - [osrm-text-instructions](https://github.com/Project-OSRM/osrm-text-instructions) - Text instructions from OSRM route response
- [osrm-backend-docker](https://github.com/project-osrm/osrm-backend/pkgs/container/osrm-backend) - Ready to use Docker images - [osrm-backend-docker](https://hub.docker.com/r/osrm/osrm-backend/) - Ready to use Docker images
## Documentation ## Documentation
+15
View File
@@ -0,0 +1,15 @@
os: Visual Studio 2019
# clone directory
clone_folder: c:\projects\osrm
platform: x64
# no-op for the time being until someone with access to GitHub checks settings will remove integration with AppVeyor
# https://github.com/Project-OSRM/osrm-backend/pull/6312#issuecomment-1217237055
build_script:
- EXIT 0
branches:
only:
- master
+32
View File
@@ -0,0 +1,32 @@
@ECHO OFF
SETLOCAL
SET EL=0
ECHO ~~~~~~~~~~~~~~~~~~~~~~~~~~~~ %~f0 ~~~~~~~~~~~~~~~~~~~~~~~~~~~~
SET PLATFORM=x64
SET CONFIGURATION=Release
::SET LOCAL_DEV=1
FOR /F "tokens=*" %%i in ('git rev-parse --abbrev-ref HEAD') do SET APPVEYOR_REPO_BRANCH=%%i
ECHO APPVEYOR_REPO_BRANCH^: %APPVEYOR_REPO_BRANCH%
SET PATH=C:\Program Files\7-Zip;%PATH%
powershell Set-ExecutionPolicy -Scope CurrentUser -ExecutionPolicy Unrestricted -Force
IF %ERRORLEVEL% NEQ 0 GOTO ERROR
CALL appveyor-build.bat
IF %ERRORLEVEL% NEQ 0 GOTO ERROR
GOTO DONE
:ERROR
ECHO ~~~~~~~~~~~~~~~~~~~~~~ ERROR %~f0 ~~~~~~~~~~~~~~~~~~~~~~~~~~~~
ECHO ERRORLEVEL^: %ERRORLEVEL%
SET EL=%ERRORLEVEL%
:DONE
ECHO ~~~~~~~~~~~~~~~~~~~~~~ DONE %~f0 ~~~~~~~~~~~~~~~~~~~~~~~~~~~~
EXIT /b %EL%
+3 -1
View File
@@ -3,5 +3,7 @@ module.exports = {
ch: '--strict --tags ~@stress --tags ~@todo --tags ~@mld -f progress --require features/support --require features/step_definitions', ch: '--strict --tags ~@stress --tags ~@todo --tags ~@mld -f progress --require features/support --require features/step_definitions',
todo: '--strict --tags @todo --require features/support --require features/step_definitions', todo: '--strict --tags @todo --require features/support --require features/step_definitions',
all: '--strict --require features/support --require features/step_definitions', all: '--strict --require features/support --require features/step_definitions',
mld: '--strict --tags ~@stress --tags ~@todo --tags ~@ch --require features/support --require features/step_definitions -f progress' mld: '--strict --tags ~@stress --tags ~@todo --tags ~@ch --require features/support --require features/step_definitions -f progress',
verify_routed_js: '--strict --tags ~@skip_on_routed_js --tags ~@stress --tags ~@todo --tags ~@mld-only -f progress --require features/support --require features/step_definitions',
mld_routed_js: '--strict --tags ~@skip_on_routed_js --tags ~@stress --tags ~@todo --tags ~@ch --require features/support --require features/step_definitions -f progress',
}; };
+2 -2
View File
@@ -35,7 +35,7 @@ To pass parameters to each location some options support an array-like encoding:
|radiuses |`{radius};{radius}[;{radius} ...]` |Limits the search to given radius in meters. | |radiuses |`{radius};{radius}[;{radius} ...]` |Limits the search to given radius in meters. |
|generate\_hints |`true` (default), `false` |Adds a Hint to the response which can be used in subsequent requests, see `hints` parameter. | |generate\_hints |`true` (default), `false` |Adds a Hint to the response which can be used in subsequent requests, see `hints` parameter. |
|hints |`{hint};{hint}[;{hint} ...]` |Hint from previous request to derive position in street network. | |hints |`{hint};{hint}[;{hint} ...]` |Hint from previous request to derive position in street network. |
|approaches |`{approach};{approach}[;{approach} ...]` |Restrict the direction on the road network at a waypoint, relative to the input coordinate. | |approaches |`{approach};{approach}[;{approach} ...]` |Keep waypoints on curbside. |
|exclude |`{class}[,{class}]` |Additive list of classes to avoid, the order does not matter. | |exclude |`{class}[,{class}]` |Additive list of classes to avoid, the order does not matter. |
|snapping |`default` (default), `any` |Default snapping avoids is_startpoint (see profile) edges, `any` will snap to any edge in the graph | |snapping |`default` (default), `any` |Default snapping avoids is_startpoint (see profile) edges, `any` will snap to any edge in the graph |
|skip_waypoints |`true`, `false` (default) |Removes waypoints from the response. Waypoints are still calculated, but not serialized. Could be useful in case you are interested in some other part of the response and do not want to transfer waste data. | |skip_waypoints |`true`, `false` (default) |Removes waypoints from the response. Waypoints are still calculated, but not serialized. Could be useful in case you are interested in some other part of the response and do not want to transfer waste data. |
@@ -47,7 +47,7 @@ Where the elements follow the following format:
|bearing |`{value},{range}` `integer 0 .. 360,integer 0 .. 180` | |bearing |`{value},{range}` `integer 0 .. 360,integer 0 .. 180` |
|radius |`double >= 0` or `unlimited` (default) | |radius |`double >= 0` or `unlimited` (default) |
|hint |Base64 `string` | |hint |Base64 `string` |
|approach |`curb`, `opposite` or `unrestricted` (default) | |approach |`curb` or `unrestricted` (default) |
|class |A class name determined by the profile or `none`. | |class |A class name determined by the profile or `none`. |
``` ```
+4 -4
View File
@@ -63,7 +63,7 @@ Returns the fastest route between two or more coordinates while visiting the way
- `options.geometries` **[String](https://developer.mozilla.org/docs/Web/JavaScript/Reference/Global_Objects/String)** Returned route geometry format (influences overview and per step). Can also be `geojson`. (optional, default `polyline`) - `options.geometries` **[String](https://developer.mozilla.org/docs/Web/JavaScript/Reference/Global_Objects/String)** Returned route geometry format (influences overview and per step). Can also be `geojson`. (optional, default `polyline`)
- `options.overview` **[String](https://developer.mozilla.org/docs/Web/JavaScript/Reference/Global_Objects/String)** Add overview geometry either `full`, `simplified` according to highest zoom level it could be display on, or not at all (`false`). (optional, default `simplified`) - `options.overview` **[String](https://developer.mozilla.org/docs/Web/JavaScript/Reference/Global_Objects/String)** Add overview geometry either `full`, `simplified` according to highest zoom level it could be display on, or not at all (`false`). (optional, default `simplified`)
- `options.continue_straight` **[Boolean](https://developer.mozilla.org/docs/Web/JavaScript/Reference/Global_Objects/Boolean)?** Forces the route to keep going straight at waypoints and don't do a uturn even if it would be faster. Default value depends on the profile. - `options.continue_straight` **[Boolean](https://developer.mozilla.org/docs/Web/JavaScript/Reference/Global_Objects/Boolean)?** Forces the route to keep going straight at waypoints and don't do a uturn even if it would be faster. Default value depends on the profile.
- `options.approaches` **[Array](https://developer.mozilla.org/docs/Web/JavaScript/Reference/Global_Objects/Array)?** Restrict the direction on the road network at a waypoint, relative to the input coordinate. Can be `null` (unrestricted, default), `curb` or `opposite`. - `options.approaches` **[Array](https://developer.mozilla.org/docs/Web/JavaScript/Reference/Global_Objects/Array)?** Keep waypoints on curb side. Can be `null` (unrestricted, default) or `curb`.
`null`/`true`/`false` `null`/`true`/`false`
- `options.waypoints` **[Array](https://developer.mozilla.org/docs/Web/JavaScript/Reference/Global_Objects/Array)?** Indices to coordinates to treat as waypoints. If not supplied, all coordinates are waypoints. Must include first and last coordinate index. - `options.waypoints` **[Array](https://developer.mozilla.org/docs/Web/JavaScript/Reference/Global_Objects/Array)?** Indices to coordinates to treat as waypoints. If not supplied, all coordinates are waypoints. Must include first and last coordinate index.
- `options.format` **[String](https://developer.mozilla.org/docs/Web/JavaScript/Reference/Global_Objects/String)?** Which output format to use, either `json`, or [`flatbuffers`](https://github.com/Project-OSRM/osrm-backend/tree/master/include/engine/api/flatbuffers). - `options.format` **[String](https://developer.mozilla.org/docs/Web/JavaScript/Reference/Global_Objects/String)?** Which output format to use, either `json`, or [`flatbuffers`](https://github.com/Project-OSRM/osrm-backend/tree/master/include/engine/api/flatbuffers).
@@ -101,7 +101,7 @@ Note: `coordinates` in the general options only supports a single `{longitude},{
- `options.generate_hints` **[Boolean](https://developer.mozilla.org/docs/Web/JavaScript/Reference/Global_Objects/Boolean)** Whether or not adds a Hint to the response which can be used in subsequent requests. (optional, default `true`) - `options.generate_hints` **[Boolean](https://developer.mozilla.org/docs/Web/JavaScript/Reference/Global_Objects/Boolean)** Whether or not adds a Hint to the response which can be used in subsequent requests. (optional, default `true`)
- `options.number` **[Number](https://developer.mozilla.org/docs/Web/JavaScript/Reference/Global_Objects/Number)** Number of nearest segments that should be returned. - `options.number` **[Number](https://developer.mozilla.org/docs/Web/JavaScript/Reference/Global_Objects/Number)** Number of nearest segments that should be returned.
Must be an integer greater than or equal to `1`. (optional, default `1`) Must be an integer greater than or equal to `1`. (optional, default `1`)
- `options.approaches` **[Array](https://developer.mozilla.org/docs/Web/JavaScript/Reference/Global_Objects/Array)?** Restrict the direction on the road network at a waypoint, relative to the input coordinate. Can be `null` (unrestricted, default), `curb` or `opposite`. - `options.approaches` **[Array](https://developer.mozilla.org/docs/Web/JavaScript/Reference/Global_Objects/Array)?** Keep waypoints on curb side. Can be `null` (unrestricted, default) or `curb`.
- `options.format` **[String](https://developer.mozilla.org/docs/Web/JavaScript/Reference/Global_Objects/String)?** Which output format to use, either `json`, or [`flatbuffers`](https://github.com/Project-OSRM/osrm-backend/tree/master/include/engine/api/flatbuffers). - `options.format` **[String](https://developer.mozilla.org/docs/Web/JavaScript/Reference/Global_Objects/String)?** Which output format to use, either `json`, or [`flatbuffers`](https://github.com/Project-OSRM/osrm-backend/tree/master/include/engine/api/flatbuffers).
- `options.snapping` **[String](https://developer.mozilla.org/docs/Web/JavaScript/Reference/Global_Objects/String)?** Which edges can be snapped to, either `default`, or `any`. `default` only snaps to edges marked by the profile as `is_startpoint`, `any` will allow snapping to any edge in the routing graph. - `options.snapping` **[String](https://developer.mozilla.org/docs/Web/JavaScript/Reference/Global_Objects/String)?** Which edges can be snapped to, either `default`, or `any`. `default` only snaps to edges marked by the profile as `is_startpoint`, `any` will allow snapping to any edge in the routing graph.
- `callback` **[Function](https://developer.mozilla.org/docs/Web/JavaScript/Reference/Statements/function)** - `callback` **[Function](https://developer.mozilla.org/docs/Web/JavaScript/Reference/Statements/function)**
@@ -141,7 +141,7 @@ Optionally returns distance table.
- `options.sources` **[Array](https://developer.mozilla.org/docs/Web/JavaScript/Reference/Global_Objects/Array)?** An array of `index` elements (`0 <= integer < #coordinates`) to use - `options.sources` **[Array](https://developer.mozilla.org/docs/Web/JavaScript/Reference/Global_Objects/Array)?** An array of `index` elements (`0 <= integer < #coordinates`) to use
location with given index as source. Default is to use all. location with given index as source. Default is to use all.
- `options.destinations` **[Array](https://developer.mozilla.org/docs/Web/JavaScript/Reference/Global_Objects/Array)?** An array of `index` elements (`0 <= integer < #coordinates`) to use location with given index as destination. Default is to use all. - `options.destinations` **[Array](https://developer.mozilla.org/docs/Web/JavaScript/Reference/Global_Objects/Array)?** An array of `index` elements (`0 <= integer < #coordinates`) to use location with given index as destination. Default is to use all.
- `options.approaches` **[Array](https://developer.mozilla.org/docs/Web/JavaScript/Reference/Global_Objects/Array)?** Restrict the direction on the road network at a waypoint, relative to the input coordinate.. Can be `null` (unrestricted, default), `curb` or `opposite`. - `options.approaches` **[Array](https://developer.mozilla.org/docs/Web/JavaScript/Reference/Global_Objects/Array)?** Keep waypoints on curb side. Can be `null` (unrestricted, default) or `curb`.
- `options.fallback_speed` **[Number](https://developer.mozilla.org/docs/Web/JavaScript/Reference/Global_Objects/Number)?** Replace `null` responses in result with as-the-crow-flies estimates based on `fallback_speed`. Value is in metres/second. - `options.fallback_speed` **[Number](https://developer.mozilla.org/docs/Web/JavaScript/Reference/Global_Objects/Number)?** Replace `null` responses in result with as-the-crow-flies estimates based on `fallback_speed`. Value is in metres/second.
- `options.fallback_coordinate` **[String](https://developer.mozilla.org/docs/Web/JavaScript/Reference/Global_Objects/String)?** Either `input` (default) or `snapped`. If using a `fallback_speed`, use either the user-supplied coordinate (`input`), or the snapped coordinate (`snapped`) for calculating the as-the-crow-flies distance between two points. - `options.fallback_coordinate` **[String](https://developer.mozilla.org/docs/Web/JavaScript/Reference/Global_Objects/String)?** Either `input` (default) or `snapped`. If using a `fallback_speed`, use either the user-supplied coordinate (`input`), or the snapped coordinate (`snapped`) for calculating the as-the-crow-flies distance between two points.
- `options.scale_factor` **[Number](https://developer.mozilla.org/docs/Web/JavaScript/Reference/Global_Objects/Number)?** Multiply the table duration values in the table by this number for more controlled input into a route optimization solver. - `options.scale_factor` **[Number](https://developer.mozilla.org/docs/Web/JavaScript/Reference/Global_Objects/Number)?** Multiply the table duration values in the table by this number for more controlled input into a route optimization solver.
@@ -298,7 +298,7 @@ Right now, the following combinations are possible:
- `options.roundtrip` **[Boolean](https://developer.mozilla.org/docs/Web/JavaScript/Reference/Global_Objects/Boolean)** Return route is a roundtrip. (optional, default `true`) - `options.roundtrip` **[Boolean](https://developer.mozilla.org/docs/Web/JavaScript/Reference/Global_Objects/Boolean)** Return route is a roundtrip. (optional, default `true`)
- `options.source` **[String](https://developer.mozilla.org/docs/Web/JavaScript/Reference/Global_Objects/String)** Return route starts at `any` or `first` coordinate. (optional, default `any`) - `options.source` **[String](https://developer.mozilla.org/docs/Web/JavaScript/Reference/Global_Objects/String)** Return route starts at `any` or `first` coordinate. (optional, default `any`)
- `options.destination` **[String](https://developer.mozilla.org/docs/Web/JavaScript/Reference/Global_Objects/String)** Return route ends at `any` or `last` coordinate. (optional, default `any`) - `options.destination` **[String](https://developer.mozilla.org/docs/Web/JavaScript/Reference/Global_Objects/String)** Return route ends at `any` or `last` coordinate. (optional, default `any`)
- `options.approaches` **[Array](https://developer.mozilla.org/docs/Web/JavaScript/Reference/Global_Objects/Array)?** Restrict the direction on the road network at a waypoint, relative to the input coordinate. Can be `null` (unrestricted, default), `curb` or `opposite`. - `options.approaches` **[Array](https://developer.mozilla.org/docs/Web/JavaScript/Reference/Global_Objects/Array)?** Keep waypoints on curb side. Can be `null` (unrestricted, default) or `curb`.
- `options.snapping` **[String](https://developer.mozilla.org/docs/Web/JavaScript/Reference/Global_Objects/String)?** Which edges can be snapped to, either `default`, or `any`. `default` only snaps to edges marked by the profile as `is_startpoint`, `any` will allow snapping to any edge in the routing graph. - `options.snapping` **[String](https://developer.mozilla.org/docs/Web/JavaScript/Reference/Global_Objects/String)?** Which edges can be snapped to, either `default`, or `any`. `default` only snaps to edges marked by the profile as `is_startpoint`, `any` will allow snapping to any edge in the routing graph.
- `callback` **[Function](https://developer.mozilla.org/docs/Web/JavaScript/Reference/Statements/function)** - `callback` **[Function](https://developer.mozilla.org/docs/Web/JavaScript/Reference/Statements/function)**
+42 -162
View File
@@ -32,14 +32,14 @@ Feature: Car - Handle traffic lights
| l | traffic_signals | | l | traffic_signals |
When I route I should get When I route I should get
| from | to | time | # | | from | to | time | # |
| 1 | 2 | 11.1s | no turn with no traffic light | | 1 | 2 | 11.1s | no turn with no traffic light |
| 3 | 4 | 13.1s | no turn with traffic light | | 3 | 4 | 13.1s | no turn with traffic light |
| g | j | 18.7s | turn with no traffic light | | g | j | 18.7s | turn with no traffic light |
| k | n | 20.7s | turn with traffic light | | k | n | 20.7s | turn with traffic light |
Scenario: Car - Traffic signal direction straight Scenario: Car - Traffic signal direction
Given the node map Given the node map
""" """
a-1-b-2-c a-1-b-2-c
@@ -112,14 +112,14 @@ Feature: Car - Handle traffic lights
Scenario: Car - Encounters a traffic light direction Scenario: Car - Encounters a traffic light
Given the node map Given the node map
""" """
a f k p a f k
| | | | | | |
b-c-d h-g-i l-m-n q-r-s b-c-d h-g-i l-m-n
| | | | | | |
e j o t e j o
""" """
@@ -131,70 +131,53 @@ Feature: Car - Handle traffic lights
| fgj | primary | | fgj | primary |
| lmn | primary | | lmn | primary |
| kmo | primary | | kmo | primary |
| qrs | primary |
| prt | primary |
And the nodes And the nodes
| node | highway | traffic_signals:direction | | node | highway | traffic_signals:direction |
| g | traffic_signals | | | g | traffic_signals | forward |
| m | traffic_signals | forward | | m | traffic_signals | backward |
| r | traffic_signals | backward |
When I route I should get When I route I should get
# Base case
| from | to | time | # | | from | to | time | # |
| a | d | 21.9s | no turn with no traffic light |
| a | e | 22.2s | no turn with traffic light |
| a | b | 18.7s | turn with no traffic light | | a | b | 18.7s | turn with no traffic light |
| a | e | 22.2s | no turn with no traffic light | | e | b | 21.9s | no turn with no traffic light |
| a | d | 21.9s | turn with no traffic light | | e | a | 22.2s | no turn with traffic light |
| e | b | 21.9s | turn with no traffic light |
| e | a | 22.2s | no turn with no traffic light |
| e | d | 18.7s | turn with no traffic light | | e | d | 18.7s | turn with no traffic light |
| d | e | 21.9s | turn with no traffic light | | d | e | 21.9s | no turn with no traffic light |
| d | b | 11s | no turn with no traffic light | | d | b | 11s | no turn with traffic light |
| d | a | 18.7s | turn with no traffic light | | d | a | 18.7s | turn with no traffic light |
| b | a | 21.9s | turn with no traffic light | | b | a | 21.9s | no turn with no traffic light |
| b | d | 11s | no turn with no traffic light | | b | d | 11s | no turn with traffic light |
| b | e | 18.7s | turn with no traffic light | | b | e | 18.7s | turn with no traffic light |
# All have traffic lights - 2s penalty
| f | h | 20.7s | turn with traffic light | | f | i | 23.9s | no turn with no traffic light |
| f | j | 24.2s | no turn with traffic light | | f | j | 24.2s | no turn with traffic light |
| f | i | 23.9s | turn with traffic light | | f | h | 20.7s | turn with no traffic light |
| j | h | 23.9s | turn with traffic light | | j | h | 21.9s | no turn with no traffic light |
| j | f | 24.2s | no turn with traffic light | | j | f | 22.2s | no turn with traffic light |
| j | i | 20.7s | turn with traffic light | | j | i | 18.7s | turn with no traffic light |
| i | j | 23.9s | turn with traffic light | | i | j | 21.9s | no turn with no traffic light |
| i | h | 13s | no turn with traffic light | | i | h | 11s | no turn with traffic light |
| i | f | 20.7s | turn with traffic light | | i | f | 18.7s | turn with no traffic light |
| h | f | 23.9s | turn with traffic light | | h | f | 23.9s | no turn with no traffic light |
| h | i | 13s | no turn with traffic light | | h | i | 13s | no turn with traffic light |
| h | j | 20.7s | turn with traffic light | | h | j | 20.7s | turn with no traffic light |
# Front direction have traffic lights - 2s penalty
| k | l | 20.7s | turn with traffic light | | k | n | 21.9s | no turn with no traffic light |
| k | o | 24.2s | no turn with traffic light | | k | o | 22.2s | no turn with traffic light |
| k | n | 23.9s | turn with traffic light | | k | l | 18.7s | turn with no traffic light |
| o | l | 21.9s | turn with no traffic light | | o | l | 23.9s | no turn with no traffic light |
| o | k | 22.2s | no turn with no traffic light | | o | k | 24.2s | no turn with traffic light |
| o | n | 18.7s | turn with no traffic light | | o | n | 20.7s | turn with no traffic light |
| n | o | 21.9s | turn with no traffic light | | n | o | 23.9s | no turn with no traffic light |
| n | l | 11s | no turn with no traffic light | | n | l | 13s | no turn with traffic light |
| n | k | 18.7s | turn with no traffic light | | n | k | 20.7s | turn with no traffic light |
| l | k | 23.9s | turn with traffic light | | l | k | 21.9s | no turn with no traffic light |
| l | n | 13s | no turn with traffic light | | l | n | 11s | no turn with traffic light |
| l | o | 20.7s | turn with traffic light | | l | o | 18.7s | turn with no traffic light |
# Reverse direction have traffic lights - 2s penalty
| p | q | 18.7s | turn with no traffic light |
| p | t | 22.2s | no turn with no traffic light |
| p | s | 21.9s | turn with no traffic light |
| t | q | 23.9s | turn with traffic light |
| t | p | 24.2s | no turn with traffic light |
| t | s | 20.7s | turn with traffic light |
| s | t | 23.9s | turn with traffic light |
| s | q | 13s | no turn with traffic light |
| s | p | 20.7s | turn with traffic light |
| q | p | 21.9s | turn with no traffic light |
| q | s | 11s | no turn with no traffic light |
| q | t | 18.7s | turn with no traffic light |
Scenario: Traffic Signal Geometry Scenario: Traffic Signal Geometry
@@ -360,106 +343,3 @@ Feature: Car - Handle traffic lights
| from | to | route | speed | weights | time | distances | a:datasources | a:nodes | a:speed | a:duration | a:weight | | from | to | route | speed | weights | time | distances | a:datasources | a:nodes | a:speed | a:duration | a:weight |
| a | c | abc,abc | 65 km/h | 22.2,0 | 22.2s | 400m,0m | 1:0 | 1:2:3 | 18:18 | 11.1:11.1 | 11.1:11.1 | | a | c | abc,abc | 65 km/h | 22.2,0 | 22.2s | 400m,0m | 1:0 | 1:2:3 | 18:18 | 11.1:11.1 | 11.1:11.1 |
| c | a | abc,abc | 60 km/h | 24.2,0 | 24.2s | 400m,0m | 0:1 | 3:2:1 | 18:18 | 11.1:11.1 | 11.1:11.1 | | c | a | abc,abc | 60 km/h | 24.2,0 | 24.2s | 400m,0m | 0:1 | 3:2:1 | 18:18 | 11.1:11.1 | 11.1:11.1 |
Scenario: Car - Traffic signal straight direction with edge compression
Given the node map
"""
a-1-b - c - d-2-e
"""
And the ways
| nodes | highway |
| abcde | primary |
And the nodes
| node | highway | traffic_signals:direction |
| c | traffic_signals | forward |
When I route I should get
| from | to | time | weight | # |
| 1 | 2 | 35.3s | 35.3 | no turn with traffic light |
| 2 | 1 | 33.3s | 33.3 | no turn with no traffic light |
Scenario: Car - Traffic signal turn direction with edge compression
Given the node map
"""
d
|
2
|
a-1-b - c - f
|
e
j
|
4
|
g-3-h - i - k
|
l
"""
And the ways
| nodes | highway |
| abc | primary |
| cf | primary |
| fd | primary |
| fe | primary |
| ghi | primary |
| ik | primary |
| kj | primary |
| kl | primary |
And the nodes
| node | highway | traffic_signals:direction |
| k | traffic_signals | forward |
When I route I should get
| from | to | time | weight | # |
| 1 | 2 | 44.2s | 44.2 | turn with no traffic light |
| 2 | 1 | 41s | 41 | turn with no traffic light |
| 3 | 4 | 46.2s | 46.2 | turn with traffic light |
| 4 | 3 | 41s | 41 | turn with no traffic light |
Scenario: Car - Traffic signal turn direction with turn restriction
Given the node map
"""
d
|
2
|
a-1-b - c - f
|
e
"""
And the ways
| nodes | highway |
| abc | primary |
| cf | primary |
| fd | primary |
| fe | primary |
And the nodes
| node | highway | traffic_signals:direction |
| f | traffic_signals | forward |
And the relations
| type | way:from | way:to | way:via | restriction |
| restriction | abc | fe | cf | no_right_turn |
And the relations
| type | way:from | way:to | node:via | restriction |
| restriction | df | fc | f | right_turn_only |
When I route I should get
| from | to | time | weight | # |
| 1 | 2 | 46.2s | 46.2 | turn with traffic light |
| 2 | 1 | 41s | 41 | turn with no traffic light |
+14 -9
View File
@@ -188,11 +188,16 @@ class OSRMLoader {
this.loader = {shutdown: (cb) => cb() }; this.loader = {shutdown: (cb) => cb() };
} }
if (this.method === 'datastore') { if (this.method === 'datastore') {
this.loader.shutdown((err) => { // shutdown only if we are switching from another loader type
if (err) return callback(err); if (this.loader !== this.sharedLoader) {
this.loader = this.sharedLoader; this.loader.shutdown((err) => {
this.sharedLoader.load(inputFile, callback); if (err) return callback(err);
}); this.loader = this.sharedLoader;
this.sharedLoader.load(inputFile, callback);
});
} else {
this.sharedLoader.load(inputFile, callback);
}
} else if (this.method === 'directly') { } else if (this.method === 'directly') {
this.loader.shutdown((err) => { this.loader.shutdown((err) => {
if (err) return callback(err); if (err) return callback(err);
@@ -201,12 +206,12 @@ class OSRMLoader {
}); });
} else if (this.method === 'mmap') { } else if (this.method === 'mmap') {
this.loader.shutdown((err) => { this.loader.shutdown((err) => {
if (err) return callback(err); if (err) return callback(err);
this.loader = this.mmapLoader; this.loader = this.mmapLoader;
this.mmapLoader.load(inputFile, callback); this.mmapLoader.load(inputFile, callback);
}); });
} else { } else {
callback(new Error('*** Unknown load method ' + method)); callback(new Error('*** Unknown load method ' + this.method));
} }
} }
-24
View File
@@ -154,27 +154,3 @@ Feature: osrm-extract lua ways:get_nodes()
Then it should exit successfully Then it should exit successfully
And stdout should contain "node 42" And stdout should contain "node 42"
And stdout should contain "way 42" And stdout should contain "way 42"
Scenario: osrm-extract flags accessible in process_segment function
Given the profile file
"""
functions = require('testbot')
functions.process_segment = function (profile, segment)
print('segment forward ' .. tostring(segment.flags.forward) .. ' backward ' .. tostring(segment.flags.backward))
end
return functions
"""
And the node map
"""
a b
"""
And the ways
| nodes | oneway |
| ab | yes |
And the data has been saved to disk
When I run "osrm-extract --profile {profile_file} {osm_file}"
Then it should exit successfully
And stdout should contain "segment forward true backward false"
+4 -3
View File
@@ -4,6 +4,7 @@ Feature: osrm-routed command line options: help
Background: Background:
Given the profile "testbot" Given the profile "testbot"
@skip_on_routed_js
Scenario: osrm-routed - Help should be shown when no options are passed Scenario: osrm-routed - Help should be shown when no options are passed
When I run "osrm-routed" When I run "osrm-routed"
Then stderr should be empty Then stderr should be empty
@@ -23,9 +24,9 @@ Feature: osrm-routed command line options: help
And stdout should contain "--max-table-size" And stdout should contain "--max-table-size"
And stdout should contain "--max-matching-size" And stdout should contain "--max-matching-size"
And stdout should contain "--default-radius" And stdout should contain "--default-radius"
And stdout should contain "--keepalive-timeout"
And it should exit successfully And it should exit successfully
@skip_on_routed_js
Scenario: osrm-routed - Help, short Scenario: osrm-routed - Help, short
When I run "osrm-routed -h" When I run "osrm-routed -h"
Then stderr should be empty Then stderr should be empty
@@ -45,9 +46,10 @@ Feature: osrm-routed command line options: help
And stdout should contain "--max-table-size" And stdout should contain "--max-table-size"
And stdout should contain "--max-matching-size" And stdout should contain "--max-matching-size"
And stdout should contain "--default-radius" And stdout should contain "--default-radius"
And stdout should contain "--keepalive-timeout"
And it should exit successfully And it should exit successfully
@skip_on_routed_js
Scenario: osrm-routed - Help, long Scenario: osrm-routed - Help, long
When I run "osrm-routed --help" When I run "osrm-routed --help"
Then stderr should be empty Then stderr should be empty
@@ -67,5 +69,4 @@ Feature: osrm-routed command line options: help
And stdout should contain "--max-table-size" And stdout should contain "--max-table-size"
And stdout should contain "--max-matching-size" And stdout should contain "--max-matching-size"
And stdout should contain "--default-radius" And stdout should contain "--default-radius"
And stdout should contain "--keepalive-timeout"
And it should exit successfully And it should exit successfully
+2
View File
@@ -4,6 +4,7 @@ Feature: osrm-routed command line options: invalid options
Background: Background:
Given the profile "testbot" Given the profile "testbot"
@skip_on_routed_js
Scenario: osrm-routed - Non-existing option Scenario: osrm-routed - Non-existing option
When I try to run "osrm-routed --fly-me-to-the-moon" When I try to run "osrm-routed --fly-me-to-the-moon"
Then stdout should be empty Then stdout should be empty
@@ -11,6 +12,7 @@ Feature: osrm-routed command line options: invalid options
And stderr should contain "fly-me-to-the-moon" And stderr should contain "fly-me-to-the-moon"
And it should exit with an error And it should exit with an error
@skip_on_routed_js
Scenario: osrm-routed - Missing file Scenario: osrm-routed - Missing file
When I try to run "osrm-routed over-the-rainbow.osrm" When I try to run "osrm-routed over-the-rainbow.osrm"
Then stderr should contain "over-the-rainbow.osrm" Then stderr should contain "over-the-rainbow.osrm"
+5
View File
@@ -33,6 +33,11 @@ module.exports = function () {
callback(); callback();
}); });
this.Then(/^HTTP code should be (\d+)$/, (code, callback) => {
assert(this.response.statusCode, parseInt(code));
callback();
});
this.Then(/^status message should be "(.*?)"$/, (message, callback) => { this.Then(/^status message should be "(.*?)"$/, (message, callback) => {
try { try {
this.json = JSON.parse(this.response.body); this.json = JSON.parse(this.response.body);
+3 -1
View File
@@ -15,6 +15,8 @@ module.exports = function () {
this.setDefaultTimeout(this.TIMEOUT); this.setDefaultTimeout(this.TIMEOUT);
this.ROOT_PATH = process.cwd(); this.ROOT_PATH = process.cwd();
this.USE_ROUTED_JS = process.env.OSRM_USE_ROUTED_JS || false;
this.TEST_PATH = path.resolve(this.ROOT_PATH, 'test'); this.TEST_PATH = path.resolve(this.ROOT_PATH, 'test');
this.CACHE_PATH = path.resolve(this.TEST_PATH, 'cache'); this.CACHE_PATH = path.resolve(this.TEST_PATH, 'cache');
this.LOGS_PATH = path.resolve(this.TEST_PATH, 'logs'); this.LOGS_PATH = path.resolve(this.TEST_PATH, 'logs');
@@ -41,7 +43,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) || 100;
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.0;
this.HOST = `http://${this.OSRM_IP}:${this.OSRM_PORT}`; this.HOST = `http://${this.OSRM_IP}:${this.OSRM_PORT}`;
+4
View File
@@ -39,7 +39,11 @@ module.exports = function () {
this.runBin = (bin, options, env, callback) => { this.runBin = (bin, options, env, callback) => {
let cmd = path.resolve(util.format('%s/%s%s', this.BIN_PATH, bin, this.EXE)); let cmd = path.resolve(util.format('%s/%s%s', this.BIN_PATH, bin, this.EXE));
if (this.USE_ROUTED_JS && bin === 'osrm-routed') {
cmd = 'osrm-routed-js';
}
let opts = options.split(' ').filter((x) => { return x && x.length > 0; }); let opts = options.split(' ').filter((x) => { return x && x.length > 0; });
let log = fs.createWriteStream(this.scenarioLogFile, {'flags': 'a'}); let log = fs.createWriteStream(this.scenarioLogFile, {'flags': 'a'});
log.write(util.format('*** running %s %s\n', cmd, options)); log.write(util.format('*** running %s %s\n', cmd, options));
// we need to set a large maxbuffer here because we have long running processes like osrm-routed // we need to set a large maxbuffer here because we have long running processes like osrm-routed
+1 -1
View File
@@ -115,4 +115,4 @@ Feature: Annotations
When I route I should get When I route I should get
| from | to | route | a:speed | a:distance | a:duration | a:nodes | | from | to | route | a:speed | a:distance | a:duration | a:nodes |
| a | c | abc,abc | 10:10 | 249.9876189:299.962882 | 25:30 | 1:2:3 | | a | c | abc,abc | 10:10 | 249.9876189:299.962882 +- 1e-7 | 25:30 | 1:2:3 |
+16 -362
View File
@@ -38,41 +38,7 @@ Feature: Approach parameter
| from | to | approaches | route | | from | to | approaches | route |
| s | e | unrestricted curb | ab,bc,bc | | s | e | unrestricted curb | ab,bc,bc |
Scenario: Start End same approach, option unrestricted for Start and opposite for End Scenario: Start End opposite approach, option unrestricted for Start and End
Given the profile "testbot"
And the node map
"""
s e
a------b------c
"""
And the ways
| nodes |
| ab |
| bc |
When I route I should get
| from | to | approaches | route |
| s | e | unrestricted opposite | ab,bc |
Scenario: Start End same approach, option opposite for Start and curb for End
Given the profile "testbot"
And the node map
"""
s e
a------b------c
"""
And the ways
| nodes |
| ab |
| bc |
When I route I should get
| from | to | approaches | route |
| s | e | opposite curb | ab,bc,bc |
Scenario: Start End different approach, option unrestricted for Start and End
Given the profile "testbot" Given the profile "testbot"
And the node map And the node map
""" """
@@ -90,7 +56,7 @@ Feature: Approach parameter
| from | to | approaches | route | | from | to | approaches | route |
| s | e | unrestricted unrestricted | ab,bc | | s | e | unrestricted unrestricted | ab,bc |
Scenario: Start End different approach, option unrestricted for Start and curb for End Scenario: Start End opposite approach, option unrestricted for Start and curb for End
Given the profile "testbot" Given the profile "testbot"
And the node map And the node map
""" """
@@ -108,43 +74,6 @@ Feature: Approach parameter
| from | to | approaches | route | | from | to | approaches | route |
| s | e | unrestricted curb | ab,bc | | s | e | unrestricted curb | ab,bc |
Scenario: Start End different approach, option unrestricted for Start and opposite for End
Given the profile "testbot"
And the node map
"""
s
a------b------c
e
"""
And the ways
| nodes |
| ab |
| bc |
When I route I should get
| from | to | approaches | route |
| s | e | unrestricted opposite | ab,bc,bc |
Scenario: Start End different approach, option curb for Start and opposite for End
Given the profile "testbot"
And the node map
"""
e
a------b------c-----------d
s
"""
And the ways
| nodes |
| ab |
| bc |
| cd |
When I route I should get
| from | to | approaches | route |
| s | e | curb opposite | cd,cd,ab,ab |
############### ###############
# Oneway Test # # Oneway Test #
@@ -182,44 +111,10 @@ Feature: Approach parameter
| bc | yes | | bc | yes |
When I route I should get When I route I should get
| from | to | approaches | route | | from | to | approaches | route |
| s | e | unrestricted curb | ab,bc | | s | e | unrestricted curb | ab,bc |
Scenario: Test on oneway segment, Start End same approach, option unrestricted for Start and opposite for End Scenario: Test on oneway segment, Start End opposite approach, option unrestricted for Start and End
Given the profile "testbot"
And the node map
"""
s e
a------b------c
"""
And the ways
| nodes | oneway |
| ab | yes |
| bc | yes |
When I route I should get
| from | to | approaches | route |
| s | e | unrestricted opposite | ab,bc |
Scenario: Test on oneway segment, Start End same approach, option opposite for Start and curb for End
Given the profile "testbot"
And the node map
"""
s e
a------b------c
"""
And the ways
| nodes | oneway |
| ab | yes |
| bc | yes |
When I route I should get
| from | to | approaches | route |
| s | e | opposite curb | ab,bc |
Scenario: Test on oneway segment, Start End different approach, option unrestricted for Start and End
Given the profile "testbot" Given the profile "testbot"
And the node map And the node map
""" """
@@ -237,7 +132,7 @@ Feature: Approach parameter
| from | to | approaches | route | | from | to | approaches | route |
| s | e | unrestricted unrestricted | ab,bc | | s | e | unrestricted unrestricted | ab,bc |
Scenario: Test on oneway segment, Start End different approach, option unrestricted for Start and curb for End Scenario: Test on oneway segment, Start End opposite approach, option unrestricted for Start and curb for End
Given the profile "testbot" Given the profile "testbot"
And the node map And the node map
""" """
@@ -255,42 +150,6 @@ Feature: Approach parameter
| from | to | approaches | route | | from | to | approaches | route |
| s | e | unrestricted curb | ab,bc | | s | e | unrestricted curb | ab,bc |
Scenario: Test on oneway segment, Start End different approach, option unrestricted for Start and opposite for End
Given the profile "testbot"
And the node map
"""
s
a------b------c
e
"""
And the ways
| nodes | oneway |
| ab | yes |
| bc | yes |
When I route I should get
| from | to | approaches | route |
| s | e | unrestricted opposite | ab,bc |
Scenario: Test on oneway segment, Start End different approach, option curb for Start and opposite for End
Given the profile "testbot"
And the node map
"""
s
a------b------c
e
"""
And the ways
| nodes | oneway |
| ab | yes |
| bc | yes |
When I route I should get
| from | to | approaches | route |
| s | e | curb opposite | ab,bc |
############## ##############
# UTurn Test # # UTurn Test #
############## ##############
@@ -316,27 +175,6 @@ Feature: Approach parameter
| from | to | approaches | route | | from | to | approaches | route |
| s | e | unrestricted curb | | | s | e | unrestricted curb | |
Scenario: UTurn test, router can find a route because uturn authorized to reach opposite side
Given the profile "testbot"
And the node map
"""
e s
a------b------c
"""
And the ways
| nodes |
| ab |
| bc |
And the relations
| type | way:from | way:to | node:via | restriction |
| restriction | bc | bc | c | no_u_turn |
When I route I should get
| from | to | approaches | route |
| s | e | curb opposite | bc,ab,ab |
Scenario: UTurn test, router can find a route because he can use the roundabout Scenario: UTurn test, router can find a route because he can use the roundabout
Given the profile "testbot" Given the profile "testbot"
@@ -360,9 +198,8 @@ Feature: Approach parameter
| restriction | bc | bc | c | no_u_turn | | restriction | bc | bc | c | no_u_turn |
When I route I should get When I route I should get
| from | to | approaches | route | | from | to | approaches | route |
| s | e | unrestricted curb | ab,bc,bc | | s | e | unrestricted curb | ab,bc,bc |
| s | e | opposite curb | ab,bc,bc |
Scenario: Start End same approach, option unrestricted for Start and curb for End, left-hand driving Scenario: Start End same approach, option unrestricted for Start and curb for End, left-hand driving
@@ -391,32 +228,6 @@ Feature: Approach parameter
| from | to | approaches | route | | from | to | approaches | route |
| s | e | unrestricted curb | ab,bc | | s | e | unrestricted curb | ab,bc |
Scenario: Start End same approach, option unrestricted for Start and opposite for End, left-hand driving
Given the profile file
"""
local functions = require('testbot')
local testbot_process_way = functions.process_way
functions.process_way = function(profile, way, result)
testbot_process_way(profile, way, result)
result.is_left_hand_driving = true
end
return functions
"""
And the node map
"""
s e
a------b------c
"""
And the ways
| nodes |
| ab |
| bc |
When I route I should get
| from | to | approaches | route |
| s | e | unrestricted opposite | ab,bc,bc |
####################### #######################
# Left-side countries # # Left-side countries #
@@ -449,8 +260,9 @@ Feature: Approach parameter
""" """
And the node map And the node map
""" """
s e s
a------b------c a------b------c
e
""" """
And the ways And the ways
@@ -459,50 +271,10 @@ Feature: Approach parameter
| bc | | bc |
When I route I should get When I route I should get
| from | to | approaches | route | | from | to | approaches | route |
| s | e | unrestricted curb | ab,bc | | s | e | unrestricted curb | ab,bc,bc |
Scenario: [Left-hand-side] Start End same approach, option unrestricted for Start and opposite for End Scenario: [Left-hand-side] Start End opposite approach, option unrestricted for Start and End
Given the profile file "car" initialized with
"""
profile.properties.left_hand_driving = true
"""
And the node map
"""
s e
a------b------c
"""
And the ways
| nodes |
| ab |
| bc |
When I route I should get
| from | to | approaches | route |
| s | e | unrestricted opposite | ab,bc,bc |
Scenario: [Left-hand-side] Start End same approach, option opposite for Start and curb for End
Given the profile file "car" initialized with
"""
profile.properties.left_hand_driving = true
"""
And the node map
"""
e s
a------b------c
"""
And the ways
| nodes |
| ab |
| bc |
When I route I should get
| from | to | approaches | route |
| s | e | opposite curb | bc,ab,ab |
Scenario: [Left-hand-side] Start End different approach, option unrestricted for Start and End
Given the profile file "car" initialized with Given the profile file "car" initialized with
""" """
profile.properties.left_hand_driving = true profile.properties.left_hand_driving = true
@@ -523,16 +295,15 @@ Feature: Approach parameter
| from | to | approaches | route | | from | to | approaches | route |
| s | e | unrestricted unrestricted | ab,bc | | s | e | unrestricted unrestricted | ab,bc |
Scenario: [Left-hand-side] Start End different approach, option unrestricted for Start and curb for End Scenario: [Left-hand-side] Start End opposite approach, option unrestricted for Start and curb for End
Given the profile file "car" initialized with Given the profile file "car" initialized with
""" """
profile.properties.left_hand_driving = true profile.properties.left_hand_driving = true
""" """
And the node map And the node map
""" """
s s e
a------b------c a------b------c
e
""" """
And the ways And the ways
@@ -541,122 +312,5 @@ Feature: Approach parameter
| bc | | bc |
When I route I should get When I route I should get
| from | to | approaches | route | | from | to | approaches | route |
| s | e | unrestricted curb | ab,bc,bc | | s | e | unrestricted curb | ab,bc |
Scenario: [Left-hand-side] Start End different approach, option unrestricted for Start and opposite for End
Given the profile file "car" initialized with
"""
profile.properties.left_hand_driving = true
"""
And the node map
"""
s
a------b------c
e
"""
And the ways
| nodes |
| ab |
| bc |
When I route I should get
| from | to | approaches | route |
| s | e | unrestricted opposite | ab,bc |
Scenario: [Left-hand-side] Start End different approach, option curb for Start and opposite for End
Given the profile file "car" initialized with
"""
profile.properties.left_hand_driving = true
"""
And the node map
"""
s
a------b------c
e
"""
And the ways
| nodes |
| ab |
| bc |
When I route I should get
| from | to | approaches | route |
| s | e | curb opposite | ab,bc |
Scenario: Routes with more than two waypoints - uturns allowed
Given the profile "testbot"
And the node map
"""
2 1
a------b------c-----------d
|
3 | 4
e------f------g-----------h
|
|
i
"""
And the ways
| nodes |
| ab |
| bc |
| cd |
| bf |
| ef |
| fg |
| gh |
| ei |
And the query options
| continue_straight | false |
When I route I should get
| waypoints | approaches | locations | # |
| 1,2,3,4 | curb curb curb curb | _,_,_,a,b,f,_,_,i,h,_ | 1,2,2,a,b,f,3,3,i,h,4 (Only u-turn at end of roads) |
| 1,2,3,4 | curb unrestricted unrestricted curb | _,_,_,b,f,_,_,h,_ | 1,2,2,b,f,3,3,h,4 (Can u-turn at 2 and 3) |
| 1,2,3,4 | opposite opposite opposite opposite | _,d,a,_,_,b,f,i,_,_,_ | 1,d,a,2,2,b,f,i,3,3,4 (Only u-turn at end of roads) |
| 1,2,3,4 | opposite unrestricted unrestricted opposite | _,d,_,_,b,f,_,_,_ | 1,d,2,2,b,f,3,3,4 (Can u-turn at 2 and 3) |
Scenario: Routes with more than two waypoints - uturns forbidden
Given the profile "testbot"
And the node map
"""
2 1
a------b------c-----------d
|
3 | 4
e------f------g-----------h
|
|
i
"""
And the ways
| nodes |
| ab |
| bc |
| cd |
| bf |
| ef |
| fg |
| gh |
| ei |
And the query options
| continue_straight | true |
When I route I should get
| waypoints | approaches | locations | # |
| 1,2,3,4 | curb curb curb curb | _,_,_,a,b,f,_,_,i,h,_ | 1,2,2,a,b,f,3,3,i,h,4 (Only u-turn at end of roads) |
| 1,2,3,4 | curb opposite opposite curb | _,a,_,_,b,f,i,_,_,h,_ | 1,a,2,2,b,f,i,3,3,h,4 (switches stops with u-turns) |
| 1,2,3,4 | opposite opposite opposite opposite | _,d,a,_,_,b,f,i,_,_,_ | 1,d,a,2,2,b,f,i,3,3,4 (Only u-turn at end of roads) |
| 1,2,3,4 | opposite curb curb opposite | _,d,_,_,a,b,f,_,_,i,_ | 1,d,2,2,a,b,f,3,3,i,4 (switches stops with u-turns) |
+2 -2
View File
@@ -80,7 +80,7 @@ Feature: Testbot - Exclude flags
| a | c | | | a | c | |
| a | f | | | a | f | |
| f | d | fg,gd,gd | | f | d | fg,gd,gd |
@skip_on_routed_js
Scenario: Testbot - exclude with unsupported exclude combination Scenario: Testbot - exclude with unsupported exclude combination
Given the query options Given the query options
| exclude | TwoWords2 | | exclude | TwoWords2 |
@@ -88,7 +88,7 @@ Feature: Testbot - Exclude flags
When I route I should get When I route I should get
| from | to | status | message | | from | to | status | message |
| a | d | 400 | Exclude flag combination is not supported. | | a | d | 400 | Exclude flag combination is not supported. |
@skip_on_routed_js
Scenario: Testbot - exclude with invalid exclude class name Scenario: Testbot - exclude with invalid exclude class name
Given the query options Given the query options
| exclude | foo | | exclude | foo |
-101
View File
@@ -1,101 +0,0 @@
@routing @testbot @via
Feature: Force routing steps
Background:
Given the profile "testbot"
Scenario: Direct routes with waypoints on same edge
Given the node map
"""
1 2
a-------b
| |
d-------c
| |
e-------f
3 4
"""
And the ways
| nodes | oneway |
| ab | no |
| ad | no |
| bc | no |
| cf | no |
| dc | no |
| de | no |
| ef | yes |
When I route I should get
| waypoints | approaches | weight | route |
| 1,2 | | 20 | ab,ab |
| 1,2 | curb curb | 100 | ab,ad,dc,bc,ab |
| 2,1 | | 20 | ab,ab |
| 2,1 | opposite opposite | 100 | ab,bc,dc,ad,ab |
| 3,4 | | 20 | ef,ef |
| 4,3 | | 100 | ef,cf,dc,de,ef |
Scenario: Via routes with waypoints on same edge
Given the node map
"""
1 2
a-------b
| |
d-5-----c
| |
e-------f
3 4
"""
And the ways
| nodes | oneway |
| ab | no |
| ad | no |
| bc | no |
| cf | no |
| dc | no |
| de | no |
| ef | yes |
When I route I should get
| waypoints | approaches | weight | route |
| 5,1,2 | | 59.8 | dc,ad,ab,ab,ab |
| 5,1,2 | unrestricted curb curb | 180.2 | dc,bc,ab,ab,ab,ad,dc,bc,ab |
| 5,2,1 | | 80.2 | dc,bc,ab,ab,ab |
| 5,2,1 | unrestricted opposite opposite | 159.8 | dc,ad,ab,ab,ab,bc,dc,ad,ab |
| 5,3,4 | | 59.8 | dc,de,ef,ef,ef |
| 5,4,3 | | 159.8 | dc,de,ef,ef,ef,cf,dc,de,ef |
Scenario: [U-turns allowed] Via routes with waypoints on same edge
Given the node map
"""
1 2
a-------b
| |
d-5-----c
| |
e-------f
3 4
"""
And the ways
| nodes | oneway |
| ab | no |
| ad | no |
| bc | no |
| cf | no |
| dc | no |
| de | no |
| ef | yes |
And the query options
| continue_straight | false |
When I route I should get
| waypoints | approaches | weight | route |
| 5,1,2 | | 59.8 | dc,ad,ab,ab,ab |
| 5,1,2 | unrestricted curb curb | 180.2 | dc,bc,ab,ab,ab,ad,dc,bc,ab |
| 5,2,1 | | 79.8 | dc,ad,ab,ab,ab,ab |
| 5,2,1 | unrestricted opposite opposite | 159.8 | dc,ad,ab,ab,ab,bc,dc,ad,ab |
| 5,3,4 | | 59.8 | dc,de,ef,ef,ef |
| 5,4,3 | | 159.8 | dc,de,ef,ef,ef,cf,dc,de,ef |
+1
View File
@@ -32,6 +32,7 @@ Feature: Ways of loading data
Then stderr should be empty Then stderr should be empty
And it should exit successfully And it should exit successfully
@skip_on_routed_js
Scenario: osrm-datastore - Fail if no shared memory blocks are loaded Scenario: osrm-datastore - Fail if no shared memory blocks are loaded
When I run "osrm-datastore --spring-clean" with input "Y" When I run "osrm-datastore --spring-clean" with input "Y"
And I try to run "osrm-routed --shared-memory=1" And I try to run "osrm-routed --shared-memory=1"
+3 -1
View File
@@ -563,6 +563,7 @@ Feature: Basic Map Matching
| trace | timestamps | code | | trace | timestamps | code |
| abcd | 0 1 62 63 | NoMatch | | abcd | 0 1 62 63 | NoMatch |
@skip_on_routed_js
Scenario: Testbot - Map matching invalid waypoints Scenario: Testbot - Map matching invalid waypoints
Given the node map Given the node map
""" """
@@ -580,6 +581,7 @@ Feature: Basic Map Matching
| trace | code | | trace | code |
| abcd | InvalidOptions | | abcd | InvalidOptions |
@skip_on_routed_js
Scenario: Matching fail with waypoints param missing start/end Scenario: Matching fail with waypoints param missing start/end
Given the node map Given the node map
""" """
@@ -788,7 +790,7 @@ Feature: Basic Map Matching
| 1234 | 1.000135,1,1.000225,1,1.000404,1,1.000449,1 | 1:2:0.4 | 1:2:0.4 | 3.4 | | 1234 | 1.000135,1,1.000225,1,1.000404,1,1.000449,1 | 1:2:0.4 | 1:2:0.4 | 3.4 |
| 4321 | 1.000449,1,1.000404,1,1.000225,1,1.000135,1 | 0.4:2:1 | 0.4:2:1 | 3.4 | | 4321 | 1.000449,1,1.000404,1,1.000225,1,1.000135,1 | 0.4:2:1 | 0.4:2:1 | 3.4 |
@match @testbot @match @testbot @skip_on_routed_js
Scenario: Regression test - add source phantom properly (two phantoms on one edge) Scenario: Regression test - add source phantom properly (two phantoms on one edge)
Given the profile "testbot" Given the profile "testbot"
Given a grid size of 10 meters Given a grid size of 10 meters
+3 -2
View File
@@ -570,7 +570,8 @@ Feature: Snapping at intersections
| a,f,k | ac,cf,cf,fj,kj,kj | 132.8s | 132.8 | | a,f,k | ac,cf,cf,fj,kj,kj | 132.8s | 132.8 |
| k,f | ik,fi,fi | 54.3s | 54.3 | | k,f | ik,fi,fi | 54.3s | 54.3 |
| f,a | ef,ae,ae | 66.6s | 66.6 | | f,a | ef,ae,ae | 66.6s | 66.6 |
| k,f,a | kj,fj,fj,ef,ae,ae | 141.4s | 141.4 | | k,f,a | kj,fj,fj,ef,ae,ae | 141.4s +- 1e-7 | 141.4 +- 1e-7 |
When I request a travel time matrix I should get When I request a travel time matrix I should get
| | a | f | k | | | a | f | k |
@@ -626,4 +627,4 @@ Feature: Snapping at intersections
| a,f,k | ad,df,df,fj,kj,kj | 105.6s | 105.6 | | a,f,k | ad,df,df,fj,kj,kj | 105.6s | 105.6 |
| k,f | ik,fi,fi | 54.3s | 54.3 | | k,f | ik,fi,fi | 54.3s | 54.3 |
| f,a | ef,ae,ae | 66.6s | 66.6 | | f,a | ef,ae,ae | 66.6s | 66.6 |
| k,f,a | ik,fi,fi,ef,ae,ae | 120.9s | 120.9 | | k,f,a | ik,fi,fi,ef,ae,ae | 120.9s +- 1e-7 | 120.9 +- 1e-7 |
+2 -1
View File
@@ -18,7 +18,7 @@ Feature: Status messages
| from | to | route | status | message | | from | to | route | status | message |
| a | b | ab,ab | 200 | | | a | b | ab,ab | 200 | |
| b | a | ab,ab | 200 | | | b | a | ab,ab | 200 | |
@skip_on_routed_js
Scenario: No route found Scenario: No route found
Given the node map Given the node map
""" """
@@ -39,6 +39,7 @@ Feature: Status messages
| a | c | | 400 | Impossible route between points | | a | c | | 400 | Impossible route between points |
| b | d | | 400 | Impossible route between points | | b | d | | 400 | Impossible route between points |
@skip_on_routed_js
Scenario: Malformed requests Scenario: Malformed requests
Given the node locations Given the node locations
| node | lat | lon | | node | lat | lon |
+6 -4
View File
@@ -4,7 +4,8 @@ Feature: Basic trip planning
Background: Background:
Given the profile "testbot" Given the profile "testbot"
Given a grid size of 10 meters Given a grid size of 10 meters
@skip_on_routed_js
Scenario: Testbot - Trip: Invalid options (like was in test suite for a long time) Scenario: Testbot - Trip: Invalid options (like was in test suite for a long time)
Given the node map Given the node map
""" """
@@ -222,7 +223,7 @@ Feature: Basic trip planning
| waypoints | trips | roundtrip | durations | | waypoints | trips | roundtrip | durations |
| a,b,c,d,e,f,g,h,i,j,k,l | lkjihgfedcbal | true | 22 | | a,b,c,d,e,f,g,h,i,j,k,l | lkjihgfedcbal | true | 22 |
| a,b,c,d,e,f,g,h,i,j,k,l | cbakjihgfedl | false | 19 | | a,b,c,d,e,f,g,h,i,j,k,l | cbakjihgfedl | false | 19 |
@skip_on_routed_js
Scenario: Testbot - Trip: Unroutable roundtrip with waypoints (less than 10) Scenario: Testbot - Trip: Unroutable roundtrip with waypoints (less than 10)
Given the node map Given the node map
""" """
@@ -240,7 +241,7 @@ Feature: Basic trip planning
| waypoints | status | message | | waypoints | status | message |
| a,b,c,d | NoTrips | No trip visiting all destinations possible. | | a,b,c,d | NoTrips | No trip visiting all destinations possible. |
@skip_on_routed_js
Scenario: Testbot - Trip: Unroutable roundtrip with waypoints (more than 10) Scenario: Testbot - Trip: Unroutable roundtrip with waypoints (more than 10)
Given the node map Given the node map
""" """
@@ -278,6 +279,7 @@ Feature: Basic trip planning
| a,b,c,d,e,f,g,h,i,j,k,l,m,n,o,p | NoTrips | No trip visiting all destinations possible. | | a,b,c,d,e,f,g,h,i,j,k,l,m,n,o,p | NoTrips | No trip visiting all destinations possible. |
# Test TFSE # Test TFSE
@skip_on_routed_js
Scenario: Testbot - Trip: TFSE with errors Scenario: Testbot - Trip: TFSE with errors
Given the node map Given the node map
""" """
@@ -371,7 +373,7 @@ Feature: Basic trip planning
| waypoints | source | destination | roundtrip | trips | | waypoints | source | destination | roundtrip | trips |
| a,b,d,e,c | first | last | true | abedca | | a,b,d,e,c | first | last | true | abedca |
@skip_on_routed_js
Scenario: Testbot - Trip: midway points in isolated roads should return no trips Scenario: Testbot - Trip: midway points in isolated roads should return no trips
Given the node map Given the node map
""" """
+5 -5
View File
@@ -52,11 +52,11 @@ Feature: Weight tests
| abc | | abc |
When I route I should get When I route I should get
| waypoints | route | distances | weights | times | a:distance | a:duration | a:weight | a:speed | | waypoints | route | distances | weights | times | a:distance | a:duration | a:weight | a:speed |
| s,t | abc,abc | 20m,0m | 2,0 | 2s,0s | 20.03462663 | 2 | 2 | 10 | | s,t | abc,abc | 20m,0m | 2,0 | 2s,0s | 20.03462663 +- 1e-7 | 2 | 2 | 10 |
| t,s | abc,abc | 20m,0m | 2,0 | 2s,0s | 20.03462663 | 2 | 2 | 10 | | t,s | abc,abc | 20m,0m | 2,0 | 2s,0s | 20.03462663 +- 1e-7 | 2 | 2 | 10 |
| s,e | abc,abc | 40m,0m | 3.9,0 | 3.9s,0s | 29.94063646:10.01731331 | 3:0.9 | 3:0.9 | 10:11.1 | | s,e | abc,abc | 40m,0m | 3.9,0 | 3.9s,0s | 29.94063646:10.01731331 +- 1e-7 | 3:0.9 | 3:0.9 | 10:11.1 |
| e,s | abc,abc | 40m,0m | 3.9,0 | 3.9s,0s | 10.01731331:29.94063646 | 0.9:3 | 0.9:3 | 11.1:10 | | e,s | abc,abc | 40m,0m | 3.9,0 | 3.9s,0s | 10.01731331:29.94063646 +- 1e-7 | 0.9:3 | 0.9:3 | 11.1:10 |
Scenario: Step weights -- way_function: fail if no weight or weight_per_meter property Scenario: Step weights -- way_function: fail if no weight or weight_per_meter property
+14
View File
@@ -0,0 +1,14 @@
Feature: Tile service
Background:
Given the profile "testbot"
Scenario: Smoke test
Given the origin 52.5212,13.3919
Given the node map
"""
a b
"""
And the ways
| nodes |
| ab |
When I request /tile/v1/testbot/tile(8800,5373,14).mvt
Then HTTP code should be 200
@@ -61,12 +61,10 @@ inline auto contractExcludableGraph(ContractorGraph contractor_graph_,
// Add all non-core edges to container // Add all non-core edges to container
{ {
auto non_core_edges = toEdges<QueryEdge>(contractor_graph); auto non_core_edges = toEdges<QueryEdge>(contractor_graph);
auto new_end = std::remove_if(non_core_edges.begin(), auto new_end =
non_core_edges.end(), std::remove_if(non_core_edges.begin(), non_core_edges.end(), [&](const auto &edge) {
[&](const auto &edge) { return is_shared_core[edge.source] && is_shared_core[edge.target];
return is_shared_core[edge.source] && });
is_shared_core[edge.target];
});
non_core_edges.resize(new_end - non_core_edges.begin()); non_core_edges.resize(new_end - non_core_edges.begin());
edge_container.Insert(std::move(non_core_edges)); edge_container.Insert(std::move(non_core_edges));
@@ -77,8 +75,8 @@ inline auto contractExcludableGraph(ContractorGraph contractor_graph_,
} }
// Extract core graph for further contraction // Extract core graph for further contraction
shared_core_graph = contractor_graph.Filter([&is_shared_core](const NodeID node) shared_core_graph = contractor_graph.Filter(
{ return is_shared_core[node]; }); [&is_shared_core](const NodeID node) { return is_shared_core[node]; });
} }
for (const auto &filter : filters) for (const auto &filter : filters)
@@ -89,40 +89,37 @@ struct ContractedEdgeContainer
// Remove all edges that are contained in the old set of edges and set the appropriate flag. // Remove all edges that are contained in the old set of edges and set the appropriate flag.
auto new_end = auto new_end =
std::remove_if(new_edges.begin(), std::remove_if(new_edges.begin(), new_edges.end(), [&](const QueryEdge &edge) {
new_edges.end(), // check if the new edge would be sorted before the currend old edge
[&](const QueryEdge &edge) // if so it is not contained yet in the set of old edges
{ if (edge_iter == edge_end || mergeCompare(edge, *edge_iter))
// check if the new edge would be sorted before the currend old edge {
// if so it is not contained yet in the set of old edges return false;
if (edge_iter == edge_end || mergeCompare(edge, *edge_iter)) }
{
return false;
}
// find the first old edge that is equal or greater then the new edge // find the first old edge that is equal or greater then the new edge
while (edge_iter != edge_end && mergeCompare(*edge_iter, edge)) while (edge_iter != edge_end && mergeCompare(*edge_iter, edge))
{ {
BOOST_ASSERT(flags_iter != flags.end()); BOOST_ASSERT(flags_iter != flags.end());
edge_iter++; edge_iter++;
flags_iter++; flags_iter++;
} }
// all new edges will be sorted after the old edges // all new edges will be sorted after the old edges
if (edge_iter == edge_end) if (edge_iter == edge_end)
{ {
return false; return false;
} }
BOOST_ASSERT(edge_iter != edge_end); BOOST_ASSERT(edge_iter != edge_end);
if (mergable(edge, *edge_iter)) if (mergable(edge, *edge_iter))
{ {
*flags_iter = *flags_iter | flag; *flags_iter = *flags_iter | flag;
return true; return true;
} }
BOOST_ASSERT(mergeCompare(edge, *edge_iter)); BOOST_ASSERT(mergeCompare(edge, *edge_iter));
return false; return false;
}); });
// append new edges // append new edges
edges.insert(edges.end(), new_edges.begin(), new_end); edges.insert(edges.end(), new_edges.begin(), new_end);
@@ -135,10 +132,10 @@ struct ContractedEdgeContainer
// enforce sorting for next merge step // enforce sorting for next merge step
std::vector<unsigned> ordering(edges_size); std::vector<unsigned> ordering(edges_size);
std::iota(ordering.begin(), ordering.end(), 0); std::iota(ordering.begin(), ordering.end(), 0);
tbb::parallel_sort(ordering.begin(), tbb::parallel_sort(
ordering.end(), ordering.begin(), ordering.end(), [&](const auto lhs_idx, const auto rhs_idx) {
[&](const auto lhs_idx, const auto rhs_idx) return mergeCompare(edges[lhs_idx], edges[rhs_idx]);
{ return mergeCompare(edges[lhs_idx], edges[rhs_idx]); }); });
auto permutation = util::orderingToPermutation(ordering); auto permutation = util::orderingToPermutation(ordering);
util::inplacePermutation(edges.begin(), edges.end(), permutation); util::inplacePermutation(edges.begin(), edges.end(), permutation);
+1 -2
View File
@@ -122,8 +122,7 @@ class CellCustomizer
for (std::size_t level = 1; level < partition.GetNumberOfLevels(); ++level) for (std::size_t level = 1; level < partition.GetNumberOfLevels(); ++level)
{ {
tbb::parallel_for(tbb::blocked_range<std::size_t>(0, partition.GetNumberOfCells(level)), tbb::parallel_for(tbb::blocked_range<std::size_t>(0, partition.GetNumberOfCells(level)),
[&](const tbb::blocked_range<std::size_t> &range) [&](const tbb::blocked_range<std::size_t> &range) {
{
auto &heap = heaps.local(); auto &heap = heaps.local();
for (auto id = range.begin(), end = range.end(); id != end; ++id) for (auto id = range.begin(), end = range.end(); id != end; ++id)
{ {
+7 -6
View File
@@ -40,10 +40,10 @@ class BaseAPI
util::json::Array waypoints; util::json::Array waypoints;
waypoints.values.resize(parameters.coordinates.size()); waypoints.values.resize(parameters.coordinates.size());
boost::range::transform(waypoint_candidates, boost::range::transform(
waypoints.values.begin(), waypoint_candidates,
[this](const PhantomNodeCandidates &candidates) waypoints.values.begin(),
{ return MakeWaypoint(candidates); }); [this](const PhantomNodeCandidates &candidates) { return MakeWaypoint(candidates); });
return waypoints; return waypoints;
} }
@@ -104,8 +104,9 @@ class BaseAPI
std::transform(waypoint_candidates.begin(), std::transform(waypoint_candidates.begin(),
waypoint_candidates.end(), waypoint_candidates.end(),
waypoints.begin(), waypoints.begin(),
[this, builder](const PhantomNodeCandidates &candidates) [this, builder](const PhantomNodeCandidates &candidates) {
{ return MakeWaypoint(builder, candidates)->Finish(); }); return MakeWaypoint(builder, candidates)->Finish();
});
return builder->CreateVector(waypoints); return builder->CreateVector(waypoints);
} }
+2 -4
View File
@@ -52,8 +52,7 @@ namespace osrm::engine::api
* optional per coordinate * optional per coordinate
* - bearings: limits the search for segments in the road network to given bearing(s) in degree * - bearings: limits the search for segments in the road network to given bearing(s) in degree
* towards true north in clockwise direction, optional per coordinate * towards true north in clockwise direction, optional per coordinate
* - approaches: force the phantom node to start towards the node with the road country side or * - approaches: force the phantom node to start towards the node with the road country side.
* its opposite
* *
* \see OSRM, Coordinate, Hint, Bearing, RouteParameters, TableParameters, * \see OSRM, Coordinate, Hint, Bearing, RouteParameters, TableParameters,
* NearestParameters, TripParameters, MatchParameters and TileParameters * NearestParameters, TripParameters, MatchParameters and TileParameters
@@ -112,8 +111,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 boost::optional<Bearing> &bearing_and_range) {
{
if (bearing_and_range) if (bearing_and_range)
{ {
return bearing_and_range->IsValid(); return bearing_and_range->IsValid();
+3 -4
View File
@@ -52,10 +52,9 @@ class MatchAPI final : public RouteAPI
data_version_string = fb_result.CreateString(data_timestamp); data_version_string = fb_result.CreateString(data_timestamp);
} }
auto response = MakeFBResponse(sub_routes, auto response = MakeFBResponse(sub_routes, fb_result, [this, &fb_result, &sub_matchings]() {
fb_result, return MakeTracepoints(fb_result, sub_matchings);
[this, &fb_result, &sub_matchings]() });
{ return MakeTracepoints(fb_result, sub_matchings); });
if (!data_timestamp.empty()) if (!data_timestamp.empty())
{ {
+2 -2
View File
@@ -67,7 +67,7 @@ struct MatchParameters : public RouteParameters
MatchParameters(const std::vector<unsigned> &timestamps_, MatchParameters(const std::vector<unsigned> &timestamps_,
GapsType gaps_, GapsType gaps_,
bool tidy_, bool tidy_,
Args &&...args_) Args &&... args_)
: MatchParameters(timestamps_, gaps_, tidy_, {}, std::forward<Args>(args_)...) : MatchParameters(timestamps_, gaps_, tidy_, {}, std::forward<Args>(args_)...)
{ {
} }
@@ -77,7 +77,7 @@ struct MatchParameters : public RouteParameters
GapsType gaps_, GapsType gaps_,
bool tidy_, bool tidy_,
const std::vector<std::size_t> &waypoints_, const std::vector<std::size_t> &waypoints_,
Args &&...args_) Args &&... args_)
: RouteParameters{std::forward<Args>(args_)..., waypoints_}, timestamps{std::move( : RouteParameters{std::forward<Args>(args_)..., waypoints_}, timestamps{std::move(
timestamps_)}, timestamps_)},
gaps(gaps_), tidy(tidy_) gaps(gaps_), tidy(tidy_)
+13 -14
View File
@@ -57,20 +57,20 @@ class NearestAPI final : public BaseAPI
{ {
std::vector<flatbuffers::Offset<fbresult::Waypoint>> waypoints; std::vector<flatbuffers::Offset<fbresult::Waypoint>> waypoints;
waypoints.resize(phantom_nodes.front().size()); waypoints.resize(phantom_nodes.front().size());
std::transform(phantom_nodes.front().begin(), std::transform(
phantom_nodes.front().end(), phantom_nodes.front().begin(),
waypoints.begin(), phantom_nodes.front().end(),
[this, &fb_result](const PhantomNodeWithDistance &phantom_with_distance) waypoints.begin(),
{ [this, &fb_result](const PhantomNodeWithDistance &phantom_with_distance) {
auto &phantom_node = phantom_with_distance.phantom_node; auto &phantom_node = phantom_with_distance.phantom_node;
auto node_values = MakeNodes(phantom_node); auto node_values = MakeNodes(phantom_node);
fbresult::Uint64Pair nodes{node_values.first, node_values.second}; fbresult::Uint64Pair nodes{node_values.first, node_values.second};
auto waypoint = MakeWaypoint(&fb_result, {phantom_node}); auto waypoint = MakeWaypoint(&fb_result, {phantom_node});
waypoint->add_nodes(&nodes); waypoint->add_nodes(&nodes);
return waypoint->Finish(); return waypoint->Finish();
}); });
waypoints_vector = fb_result.CreateVector(waypoints); waypoints_vector = fb_result.CreateVector(waypoints);
} }
@@ -94,8 +94,7 @@ class NearestAPI final : public BaseAPI
std::transform(phantom_nodes.front().begin(), std::transform(phantom_nodes.front().begin(),
phantom_nodes.front().end(), phantom_nodes.front().end(),
waypoints.values.begin(), waypoints.values.begin(),
[this](const PhantomNodeWithDistance &phantom_with_distance) [this](const PhantomNodeWithDistance &phantom_with_distance) {
{
auto &phantom_node = phantom_with_distance.phantom_node; auto &phantom_node = phantom_with_distance.phantom_node;
auto waypoint = MakeWaypoint({phantom_node}); auto waypoint = MakeWaypoint({phantom_node});
+50 -61
View File
@@ -77,10 +77,9 @@ class RouteAPI : public BaseAPI
} }
auto response = auto response =
MakeFBResponse(raw_routes, MakeFBResponse(raw_routes, fb_result, [this, &waypoint_candidates, &fb_result]() {
fb_result, return BaseAPI::MakeWaypoints(&fb_result, waypoint_candidates);
[this, &waypoint_candidates, &fb_result]() });
{ return BaseAPI::MakeWaypoints(&fb_result, waypoint_candidates); });
if (!data_timestamp.empty()) if (!data_timestamp.empty())
{ {
@@ -172,15 +171,10 @@ class RouteAPI : public BaseAPI
} }
std::vector<fbresult::Position> coordinates; std::vector<fbresult::Position> coordinates;
coordinates.resize(std::distance(begin, end)); coordinates.resize(std::distance(begin, end));
std::transform(begin, std::transform(begin, end, coordinates.begin(), [](const Coordinate &c) {
end, return fbresult::Position{static_cast<float>(util::toFloating(c.lon).__value),
coordinates.begin(), static_cast<float>(util::toFloating(c.lat).__value)};
[](const Coordinate &c) });
{
return fbresult::Position{
static_cast<float>(util::toFloating(c.lon).__value),
static_cast<float>(util::toFloating(c.lat).__value)};
});
return builder.CreateVectorOfStructs(coordinates); return builder.CreateVectorOfStructs(coordinates);
} }
@@ -360,8 +354,9 @@ class RouteAPI : public BaseAPI
std::transform(leg.steps.begin(), std::transform(leg.steps.begin(),
leg.steps.end(), leg.steps.end(),
legSteps.begin(), legSteps.begin(),
[this, &fb_result, &leg_geometry](auto &step) [this, &fb_result, &leg_geometry](auto &step) {
{ return this->MakeFBStep(fb_result, leg_geometry, step); }); return this->MakeFBStep(fb_result, leg_geometry, step);
});
} }
auto steps_vector = fb_result.CreateVector(legSteps); auto steps_vector = fb_result.CreateVector(legSteps);
@@ -446,8 +441,7 @@ class RouteAPI : public BaseAPI
speed = speed =
GetAnnotations<float>(fb_result, GetAnnotations<float>(fb_result,
leg_geometry, leg_geometry,
[&prev_speed](const guidance::LegGeometry::Annotation &anno) [&prev_speed](const guidance::LegGeometry::Annotation &anno) {
{
if (anno.duration < std::numeric_limits<float>::min()) if (anno.duration < std::numeric_limits<float>::min())
{ {
return prev_speed; return prev_speed;
@@ -465,37 +459,37 @@ class RouteAPI : public BaseAPI
flatbuffers::Offset<flatbuffers::Vector<uint32_t>> duration; flatbuffers::Offset<flatbuffers::Vector<uint32_t>> duration;
if (requested_annotations & RouteParameters::AnnotationsType::Duration) if (requested_annotations & RouteParameters::AnnotationsType::Duration)
{ {
duration = GetAnnotations<uint32_t>(fb_result, duration = GetAnnotations<uint32_t>(
leg_geometry, fb_result, leg_geometry, [](const guidance::LegGeometry::Annotation &anno) {
[](const guidance::LegGeometry::Annotation &anno) return anno.duration;
{ return anno.duration; }); });
} }
flatbuffers::Offset<flatbuffers::Vector<uint32_t>> distance; flatbuffers::Offset<flatbuffers::Vector<uint32_t>> distance;
if (requested_annotations & RouteParameters::AnnotationsType::Distance) if (requested_annotations & RouteParameters::AnnotationsType::Distance)
{ {
distance = GetAnnotations<uint32_t>(fb_result, distance = GetAnnotations<uint32_t>(
leg_geometry, fb_result, leg_geometry, [](const guidance::LegGeometry::Annotation &anno) {
[](const guidance::LegGeometry::Annotation &anno) return anno.distance;
{ return anno.distance; }); });
} }
flatbuffers::Offset<flatbuffers::Vector<uint32_t>> weight; flatbuffers::Offset<flatbuffers::Vector<uint32_t>> weight;
if (requested_annotations & RouteParameters::AnnotationsType::Weight) if (requested_annotations & RouteParameters::AnnotationsType::Weight)
{ {
weight = GetAnnotations<uint32_t>(fb_result, weight = GetAnnotations<uint32_t>(
leg_geometry, fb_result, leg_geometry, [](const guidance::LegGeometry::Annotation &anno) {
[](const guidance::LegGeometry::Annotation &anno) return anno.weight;
{ return anno.weight; }); });
} }
flatbuffers::Offset<flatbuffers::Vector<uint32_t>> datasources; flatbuffers::Offset<flatbuffers::Vector<uint32_t>> datasources;
if (requested_annotations & RouteParameters::AnnotationsType::Datasources) if (requested_annotations & RouteParameters::AnnotationsType::Datasources)
{ {
datasources = GetAnnotations<uint32_t>(fb_result, datasources = GetAnnotations<uint32_t>(
leg_geometry, fb_result, leg_geometry, [](const guidance::LegGeometry::Annotation &anno) {
[](const guidance::LegGeometry::Annotation &anno) return anno.datasource;
{ return anno.datasource; }); });
} }
std::vector<uint32_t> nodes; std::vector<uint32_t> nodes;
if (requested_annotations & RouteParameters::AnnotationsType::Nodes) if (requested_annotations & RouteParameters::AnnotationsType::Nodes)
@@ -659,8 +653,7 @@ class RouteAPI : public BaseAPI
step.intersections.begin(), step.intersections.begin(),
step.intersections.end(), step.intersections.end(),
intersections.begin(), intersections.begin(),
[&fb_result, this](const guidance::IntermediateIntersection &intersection) [&fb_result, this](const guidance::IntermediateIntersection &intersection) {
{
std::vector<flatbuffers::Offset<fbresult::Lane>> lanes; std::vector<flatbuffers::Offset<fbresult::Lane>> lanes;
if (json::detail::hasValidLanes(intersection)) if (json::detail::hasValidLanes(intersection))
{ {
@@ -688,11 +681,11 @@ class RouteAPI : public BaseAPI
auto bearings_vector = fb_result.CreateVector(intersection.bearings); auto bearings_vector = fb_result.CreateVector(intersection.bearings);
std::vector<flatbuffers::Offset<flatbuffers::String>> classes; std::vector<flatbuffers::Offset<flatbuffers::String>> classes;
classes.resize(intersection.classes.size()); classes.resize(intersection.classes.size());
std::transform(intersection.classes.begin(), std::transform(
intersection.classes.end(), intersection.classes.begin(),
classes.begin(), intersection.classes.end(),
[&fb_result](const std::string &cls) classes.begin(),
{ return fb_result.CreateString(cls); }); [&fb_result](const std::string &cls) { return fb_result.CreateString(cls); });
auto classes_vector = fb_result.CreateVector(classes); auto classes_vector = fb_result.CreateVector(classes);
auto entry_vector = fb_result.CreateVector(intersection.entry); auto entry_vector = fb_result.CreateVector(intersection.entry);
@@ -727,10 +720,9 @@ class RouteAPI : public BaseAPI
std::vector<util::json::Value> step_geometries; std::vector<util::json::Value> step_geometries;
const auto total_step_count = const auto total_step_count =
std::accumulate(legs.begin(), std::accumulate(legs.begin(), legs.end(), 0, [](const auto &v, const auto &leg) {
legs.end(), return v + leg.steps.size();
0, });
[](const auto &v, const auto &leg) { return v + leg.steps.size(); });
step_geometries.reserve(total_step_count); step_geometries.reserve(total_step_count);
for (const auto idx : util::irange<std::size_t>(0UL, legs.size())) for (const auto idx : util::irange<std::size_t>(0UL, legs.size()))
@@ -741,8 +733,7 @@ class RouteAPI : public BaseAPI
legs[idx].steps.begin(), legs[idx].steps.begin(),
legs[idx].steps.end(), legs[idx].steps.end(),
std::back_inserter(step_geometries), std::back_inserter(step_geometries),
[this, &leg_geometry](const guidance::RouteStep &step) [this, &leg_geometry](const guidance::RouteStep &step) {
{
if (parameters.geometries == RouteParameters::GeometriesType::Polyline) if (parameters.geometries == RouteParameters::GeometriesType::Polyline)
{ {
return static_cast<util::json::Value>(json::makePolyline<100000>( return static_cast<util::json::Value>(json::makePolyline<100000>(
@@ -787,9 +778,7 @@ class RouteAPI : public BaseAPI
{ {
double prev_speed = 0; double prev_speed = 0;
annotation.values["speed"] = GetAnnotations( annotation.values["speed"] = GetAnnotations(
leg_geometry, leg_geometry, [&prev_speed](const guidance::LegGeometry::Annotation &anno) {
[&prev_speed](const guidance::LegGeometry::Annotation &anno)
{
if (anno.duration < std::numeric_limits<double>::min()) if (anno.duration < std::numeric_limits<double>::min())
{ {
return prev_speed; return prev_speed;
@@ -805,17 +794,17 @@ class RouteAPI : public BaseAPI
if (requested_annotations & RouteParameters::AnnotationsType::Duration) if (requested_annotations & RouteParameters::AnnotationsType::Duration)
{ {
annotation.values["duration"] = annotation.values["duration"] = GetAnnotations(
GetAnnotations(leg_geometry, 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["distance"] = GetAnnotations(
GetAnnotations(leg_geometry, 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)
{ {
@@ -825,10 +814,10 @@ class RouteAPI : public BaseAPI
} }
if (requested_annotations & RouteParameters::AnnotationsType::Datasources) if (requested_annotations & RouteParameters::AnnotationsType::Datasources)
{ {
annotation.values["datasources"] = annotation.values["datasources"] = GetAnnotations(
GetAnnotations(leg_geometry, 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)
{ {
+8 -8
View File
@@ -83,7 +83,7 @@ struct RouteParameters : public BaseParameters
const GeometriesType geometries_, const GeometriesType geometries_,
const OverviewType overview_, const OverviewType overview_,
const boost::optional<bool> continue_straight_, const boost::optional<bool> continue_straight_,
Args &&...args_) Args &&... args_)
// Once we perfectly-forward `args` (see #2990) this constructor can delegate to the one // Once we perfectly-forward `args` (see #2990) this constructor can delegate to the one
// below. // below.
: BaseParameters{std::forward<Args>(args_)...}, steps{steps_}, alternatives{alternatives_}, : BaseParameters{std::forward<Args>(args_)...}, steps{steps_}, alternatives{alternatives_},
@@ -101,7 +101,7 @@ struct RouteParameters : public BaseParameters
const GeometriesType geometries_, const GeometriesType geometries_,
const OverviewType overview_, const OverviewType overview_,
const boost::optional<bool> continue_straight_, const boost::optional<bool> continue_straight_,
Args &&...args_) Args &&... args_)
: BaseParameters{std::forward<Args>(args_)...}, steps{steps_}, alternatives{alternatives_}, : BaseParameters{std::forward<Args>(args_)...}, steps{steps_}, alternatives{alternatives_},
number_of_alternatives{alternatives_ ? 1u : 0u}, annotations{annotations_}, number_of_alternatives{alternatives_ ? 1u : 0u}, annotations{annotations_},
annotations_type{annotations_ ? AnnotationsType::All : AnnotationsType::None}, annotations_type{annotations_ ? AnnotationsType::All : AnnotationsType::None},
@@ -119,7 +119,7 @@ struct RouteParameters : public BaseParameters
const GeometriesType geometries_, const GeometriesType geometries_,
const OverviewType overview_, const OverviewType overview_,
const boost::optional<bool> continue_straight_, const boost::optional<bool> continue_straight_,
Args &&...args_) Args &&... args_)
: BaseParameters{std::forward<Args>(args_)...}, steps{steps_}, alternatives{alternatives_}, : BaseParameters{std::forward<Args>(args_)...}, steps{steps_}, alternatives{alternatives_},
number_of_alternatives{alternatives_ ? 1u : 0u}, number_of_alternatives{alternatives_ ? 1u : 0u},
annotations{annotations_ != AnnotationsType::None}, annotations_type{annotations_}, annotations{annotations_ != AnnotationsType::None}, annotations_type{annotations_},
@@ -137,7 +137,7 @@ struct RouteParameters : public BaseParameters
const OverviewType overview_, const OverviewType overview_,
const boost::optional<bool> continue_straight_, const boost::optional<bool> continue_straight_,
std::vector<std::size_t> waypoints_, std::vector<std::size_t> waypoints_,
const Args &&...args_) const Args &&... args_)
: BaseParameters{std::forward<Args>(args_)...}, steps{steps_}, alternatives{alternatives_}, : BaseParameters{std::forward<Args>(args_)...}, steps{steps_}, alternatives{alternatives_},
number_of_alternatives{alternatives_ ? 1u : 0u}, annotations{annotations_}, number_of_alternatives{alternatives_ ? 1u : 0u}, annotations{annotations_},
annotations_type{annotations_ ? AnnotationsType::All : AnnotationsType::None}, annotations_type{annotations_ ? AnnotationsType::All : AnnotationsType::None},
@@ -155,7 +155,7 @@ struct RouteParameters : public BaseParameters
const OverviewType overview_, const OverviewType overview_,
const boost::optional<bool> continue_straight_, const boost::optional<bool> continue_straight_,
std::vector<std::size_t> waypoints_, std::vector<std::size_t> waypoints_,
Args &&...args_) Args &&... args_)
: BaseParameters{std::forward<Args>(args_)...}, steps{steps_}, alternatives{alternatives_}, : BaseParameters{std::forward<Args>(args_)...}, steps{steps_}, alternatives{alternatives_},
number_of_alternatives{alternatives_ ? 1u : 0u}, annotations{annotations_ != number_of_alternatives{alternatives_ ? 1u : 0u}, annotations{annotations_ !=
AnnotationsType::None}, AnnotationsType::None},
@@ -180,9 +180,9 @@ struct RouteParameters : public BaseParameters
const auto coordinates_ok = coordinates.size() >= 2; const auto coordinates_ok = coordinates.size() >= 2;
const auto base_params_ok = BaseParameters::IsValid(); const auto base_params_ok = BaseParameters::IsValid();
const auto valid_waypoints = const auto valid_waypoints =
std::all_of(waypoints.begin(), std::all_of(waypoints.begin(), waypoints.end(), [this](const auto &w) {
waypoints.end(), return w < coordinates.size();
[this](const auto &w) { return w < coordinates.size(); }); });
return coordinates_ok && base_params_ok && valid_waypoints; return coordinates_ok && base_params_ok && valid_waypoints;
} }
}; };
+38 -50
View File
@@ -245,8 +245,9 @@ class TableAPI final : public BaseAPI
boost::range::transform(candidates, boost::range::transform(candidates,
std::back_inserter(waypoints), std::back_inserter(waypoints),
[this, &builder](const PhantomNodeCandidates &candidates) [this, &builder](const PhantomNodeCandidates &candidates) {
{ return BaseAPI::MakeWaypoint(&builder, candidates)->Finish(); }); return BaseAPI::MakeWaypoint(&builder, candidates)->Finish();
});
return builder.CreateVector(waypoints); return builder.CreateVector(waypoints);
} }
@@ -260,8 +261,7 @@ class TableAPI final : public BaseAPI
boost::range::transform( boost::range::transform(
indices, indices,
std::back_inserter(waypoints), std::back_inserter(waypoints),
[this, &builder, &candidates](const std::size_t idx) [this, &builder, &candidates](const std::size_t idx) {
{
BOOST_ASSERT(idx < candidates.size()); BOOST_ASSERT(idx < candidates.size());
return BaseAPI::MakeWaypoint(&builder, candidates[idx])->Finish(); return BaseAPI::MakeWaypoint(&builder, candidates[idx])->Finish();
}); });
@@ -274,17 +274,14 @@ class TableAPI final : public BaseAPI
{ {
std::vector<float> distance_table; std::vector<float> distance_table;
distance_table.resize(values.size()); distance_table.resize(values.size());
std::transform(values.begin(), std::transform(
values.end(), values.begin(), values.end(), distance_table.begin(), [](const EdgeDuration duration) {
distance_table.begin(), if (duration == MAXIMAL_EDGE_DURATION)
[](const EdgeDuration duration) {
{ return 0.;
if (duration == MAXIMAL_EDGE_DURATION) }
{ return from_alias<double>(duration) / 10.;
return 0.; });
}
return from_alias<double>(duration) / 10.;
});
return builder.CreateVector(distance_table); return builder.CreateVector(distance_table);
} }
@@ -294,17 +291,14 @@ class TableAPI final : public BaseAPI
{ {
std::vector<float> duration_table; std::vector<float> duration_table;
duration_table.resize(values.size()); duration_table.resize(values.size());
std::transform(values.begin(), std::transform(
values.end(), values.begin(), values.end(), duration_table.begin(), [](const EdgeDistance distance) {
duration_table.begin(), if (distance == INVALID_EDGE_DISTANCE)
[](const EdgeDistance distance) {
{ return 0.;
if (distance == INVALID_EDGE_DISTANCE) }
{ return std::round(from_alias<double>(distance) * 10) / 10.;
return 0.; });
}
return std::round(from_alias<double>(distance) * 10) / 10.;
});
return builder.CreateVector(duration_table); return builder.CreateVector(duration_table);
} }
@@ -314,13 +308,11 @@ class TableAPI final : public BaseAPI
{ {
std::vector<uint32_t> fb_table; std::vector<uint32_t> fb_table;
fb_table.reserve(fallback_speed_cells.size()); fb_table.reserve(fallback_speed_cells.size());
std::for_each(fallback_speed_cells.begin(), std::for_each(
fallback_speed_cells.end(), fallback_speed_cells.begin(), fallback_speed_cells.end(), [&](const auto &cell) {
[&](const auto &cell) fb_table.push_back(cell.row);
{ fb_table.push_back(cell.column);
fb_table.push_back(cell.row); });
fb_table.push_back(cell.column);
});
return builder.CreateVector(fb_table); return builder.CreateVector(fb_table);
} }
@@ -333,8 +325,9 @@ class TableAPI final : public BaseAPI
boost::range::transform(candidates, boost::range::transform(candidates,
std::back_inserter(json_waypoints.values), std::back_inserter(json_waypoints.values),
[this](const PhantomNodeCandidates &candidates) [this](const PhantomNodeCandidates &candidates) {
{ return BaseAPI::MakeWaypoint(candidates); }); return BaseAPI::MakeWaypoint(candidates);
});
return json_waypoints; return json_waypoints;
} }
@@ -345,8 +338,7 @@ class TableAPI final : public BaseAPI
json_waypoints.values.reserve(indices.size()); json_waypoints.values.reserve(indices.size());
boost::range::transform(indices, boost::range::transform(indices,
std::back_inserter(json_waypoints.values), std::back_inserter(json_waypoints.values),
[this, &candidates](const std::size_t idx) [this, &candidates](const std::size_t idx) {
{
BOOST_ASSERT(idx < candidates.size()); BOOST_ASSERT(idx < candidates.size());
return BaseAPI::MakeWaypoint(candidates[idx]); return BaseAPI::MakeWaypoint(candidates[idx]);
}); });
@@ -367,8 +359,7 @@ class TableAPI final : public BaseAPI
std::transform(row_begin_iterator, std::transform(row_begin_iterator,
row_end_iterator, row_end_iterator,
json_row.values.begin(), json_row.values.begin(),
[](const EdgeDuration duration) [](const EdgeDuration duration) {
{
if (duration == MAXIMAL_EDGE_DURATION) if (duration == MAXIMAL_EDGE_DURATION)
{ {
return util::json::Value(util::json::Null()); return util::json::Value(util::json::Null());
@@ -396,8 +387,7 @@ class TableAPI final : public BaseAPI
std::transform(row_begin_iterator, std::transform(row_begin_iterator,
row_end_iterator, row_end_iterator,
json_row.values.begin(), json_row.values.begin(),
[](const EdgeDistance distance) [](const EdgeDistance distance) {
{
if (distance == INVALID_EDGE_DISTANCE) if (distance == INVALID_EDGE_DISTANCE)
{ {
return util::json::Value(util::json::Null()); return util::json::Value(util::json::Null());
@@ -415,15 +405,13 @@ class TableAPI final : public BaseAPI
MakeEstimatesTable(const std::vector<TableCellRef> &fallback_speed_cells) const MakeEstimatesTable(const std::vector<TableCellRef> &fallback_speed_cells) const
{ {
util::json::Array json_table; util::json::Array json_table;
std::for_each(fallback_speed_cells.begin(), std::for_each(
fallback_speed_cells.end(), fallback_speed_cells.begin(), fallback_speed_cells.end(), [&](const auto &cell) {
[&](const auto &cell) util::json::Array row;
{ row.values.push_back(util::json::Number(cell.row));
util::json::Array row; row.values.push_back(util::json::Number(cell.column));
row.values.push_back(util::json::Number(cell.row)); json_table.values.push_back(std::move(row));
row.values.push_back(util::json::Number(cell.column)); });
json_table.values.push_back(std::move(row));
});
return json_table; return json_table;
} }
+3 -3
View File
@@ -81,7 +81,7 @@ struct TableParameters : public BaseParameters
template <typename... Args> template <typename... Args>
TableParameters(std::vector<std::size_t> sources_, TableParameters(std::vector<std::size_t> sources_,
std::vector<std::size_t> destinations_, std::vector<std::size_t> destinations_,
Args &&...args_) Args &&... args_)
: BaseParameters{std::forward<Args>(args_)...}, sources{std::move(sources_)}, : BaseParameters{std::forward<Args>(args_)...}, sources{std::move(sources_)},
destinations{std::move(destinations_)} destinations{std::move(destinations_)}
{ {
@@ -91,7 +91,7 @@ struct TableParameters : public BaseParameters
TableParameters(std::vector<std::size_t> sources_, TableParameters(std::vector<std::size_t> sources_,
std::vector<std::size_t> destinations_, std::vector<std::size_t> destinations_,
const AnnotationsType annotations_, const AnnotationsType annotations_,
Args &&...args_) Args &&... args_)
: BaseParameters{std::forward<Args>(args_)...}, sources{std::move(sources_)}, : BaseParameters{std::forward<Args>(args_)...}, sources{std::move(sources_)},
destinations{std::move(destinations_)}, annotations{annotations_} destinations{std::move(destinations_)}, annotations{annotations_}
{ {
@@ -104,7 +104,7 @@ struct TableParameters : public BaseParameters
double fallback_speed_, double fallback_speed_,
FallbackCoordinateType fallback_coordinate_type_, FallbackCoordinateType fallback_coordinate_type_,
double scale_factor_, double scale_factor_,
Args &&...args_) Args &&... args_)
: BaseParameters{std::forward<Args>(args_)...}, sources{std::move(sources_)}, : BaseParameters{std::forward<Args>(args_)...}, sources{std::move(sources_)},
destinations{std::move(destinations_)}, fallback_speed{fallback_speed_}, destinations{std::move(destinations_)}, fallback_speed{fallback_speed_},
fallback_coordinate_type{fallback_coordinate_type_}, annotations{annotations_}, fallback_coordinate_type{fallback_coordinate_type_}, annotations{annotations_},
+4 -4
View File
@@ -50,10 +50,10 @@ class TripAPI final : public RouteAPI
data_version_string = fb_result.CreateString(data_timestamp); data_version_string = fb_result.CreateString(data_timestamp);
} }
auto response = MakeFBResponse(sub_routes, auto response =
fb_result, MakeFBResponse(sub_routes, fb_result, [this, &fb_result, &sub_trips, &candidates]() {
[this, &fb_result, &sub_trips, &candidates]() return MakeWaypoints(fb_result, sub_trips, candidates);
{ return MakeWaypoints(fb_result, sub_trips, candidates); }); });
if (!data_timestamp.empty()) if (!data_timestamp.empty())
{ {
+1 -1
View File
@@ -60,7 +60,7 @@ struct TripParameters : public RouteParameters
TripParameters(SourceType source_, TripParameters(SourceType source_,
DestinationType destination_, DestinationType destination_,
bool roundtrip_, bool roundtrip_,
Args &&...args_) Args &&... args_)
: RouteParameters{std::forward<Args>(args_)...}, source{source_}, : RouteParameters{std::forward<Args>(args_)...}, source{source_},
destination{destination_}, roundtrip{roundtrip_} destination{destination_}, roundtrip{roundtrip_}
{ {
+1 -2
View File
@@ -36,8 +36,7 @@ namespace osrm::engine
enum class Approach : std::uint8_t enum class Approach : std::uint8_t
{ {
CURB = 0, CURB = 0,
UNRESTRICTED = 1, UNRESTRICTED = 1
OPPOSITE = 2
}; };
} // namespace osrm::engine } // namespace osrm::engine
@@ -440,11 +440,9 @@ class ContiguousInternalMemoryDataFacadeBase : public BaseDataFacade
{ {
auto indexes = extractor::getClassIndexes(class_data); auto indexes = extractor::getClassIndexes(class_data);
std::vector<std::string> classes(indexes.size()); std::vector<std::string> classes(indexes.size());
std::transform(indexes.begin(), std::transform(indexes.begin(), indexes.end(), classes.begin(), [this](const auto index) {
indexes.end(), return m_profile_properties->GetClassName(index);
classes.begin(), });
[this](const auto index)
{ return m_profile_properties->GetClassName(index); });
return classes; return classes;
} }
@@ -602,19 +600,15 @@ class ContiguousInternalMemoryDataFacadeBase : public BaseDataFacade
auto found_range = std::equal_range( auto found_range = std::equal_range(
m_maneuver_overrides.begin(), m_maneuver_overrides.end(), edge_based_node_id, Comp{}); m_maneuver_overrides.begin(), m_maneuver_overrides.end(), edge_based_node_id, Comp{});
std::for_each(found_range.first, std::for_each(found_range.first, found_range.second, [&](const auto &override) {
found_range.second, std::vector<NodeID> sequence(
[&](const auto &override) m_maneuver_override_node_sequences.begin() + override.node_sequence_offset_begin,
{ m_maneuver_override_node_sequences.begin() + override.node_sequence_offset_end);
std::vector<NodeID> sequence(m_maneuver_override_node_sequences.begin() + results.push_back(extractor::ManeuverOverride{std::move(sequence),
override.node_sequence_offset_begin, override.instruction_node,
m_maneuver_override_node_sequences.begin() + override.override_type,
override.node_sequence_offset_end); override.direction});
results.push_back(extractor::ManeuverOverride{std::move(sequence), });
override.instruction_node,
override.override_type,
override.direction});
});
return results; return results;
} }
}; };
+28 -40
View File
@@ -60,8 +60,7 @@ template <typename RTreeT, typename DataFacadeT> class GeospatialQuery
auto results = rtree.Nearest( auto results = rtree.Nearest(
input_coordinate, input_coordinate,
[this, approach, &input_coordinate, &bearing_with_range, &use_all_edges]( [this, approach, &input_coordinate, &bearing_with_range, &use_all_edges](
const CandidateSegment &segment) const CandidateSegment &segment) {
{
auto valid = CheckSegmentExclude(segment) && auto valid = CheckSegmentExclude(segment) &&
CheckApproach(input_coordinate, segment, approach) && CheckApproach(input_coordinate, segment, approach) &&
(use_all_edges ? HasValidEdge(segment, *use_all_edges) (use_all_edges ? HasValidEdge(segment, *use_all_edges)
@@ -71,8 +70,7 @@ template <typename RTreeT, typename DataFacadeT> class GeospatialQuery
return valid; return valid;
}, },
[this, &max_distance, &max_results, input_coordinate](const std::size_t num_results, [this, &max_distance, &max_results, input_coordinate](const std::size_t num_results,
const CandidateSegment &segment) const CandidateSegment &segment) {
{
return (max_results && num_results >= *max_results) || return (max_results && num_results >= *max_results) ||
(max_distance && max_distance != -1.0 && (max_distance && max_distance != -1.0 &&
CheckSegmentDistance(input_coordinate, segment, *max_distance)); CheckSegmentDistance(input_coordinate, segment, *max_distance));
@@ -109,8 +107,7 @@ template <typename RTreeT, typename DataFacadeT> class GeospatialQuery
&big_component_coord, &big_component_coord,
&big_component_distance, &big_component_distance,
&use_all_edges, &use_all_edges,
&bearing_with_range](const CandidateSegment &segment) &bearing_with_range](const CandidateSegment &segment) {
{
auto is_big_component = !IsTinyComponent(segment); auto is_big_component = !IsTinyComponent(segment);
auto not_nearest = auto not_nearest =
has_nearest && segment.fixed_projected_coordinate != nearest_coord; has_nearest && segment.fixed_projected_coordinate != nearest_coord;
@@ -162,8 +159,7 @@ template <typename RTreeT, typename DataFacadeT> class GeospatialQuery
return use_candidate; return use_candidate;
}, },
[this, &has_big_component, &max_distance, input_coordinate, &big_component_distance]( [this, &has_big_component, &max_distance, input_coordinate, &big_component_distance](
const std::size_t /*num_results*/, const CandidateSegment &segment) const std::size_t /*num_results*/, const CandidateSegment &segment) {
{
auto distance = GetSegmentDistance(input_coordinate, segment); auto distance = GetSegmentDistance(input_coordinate, segment);
auto further_than_big_component = distance > big_component_distance; auto further_than_big_component = distance > big_component_distance;
auto no_more_candidates = has_big_component && further_than_big_component; auto no_more_candidates = has_big_component && further_than_big_component;
@@ -194,17 +190,13 @@ template <typename RTreeT, typename DataFacadeT> class GeospatialQuery
PhantomNodeCandidates nearest_phantoms; PhantomNodeCandidates nearest_phantoms;
PhantomNodeCandidates big_component_phantoms; PhantomNodeCandidates big_component_phantoms;
const auto add_to_candidates = const auto add_to_candidates = [this, &input_coordinate](PhantomNodeCandidates &candidates,
[this, &input_coordinate](PhantomNodeCandidates &candidates, const EdgeData data) const EdgeData data) {
{
auto candidate_it = auto candidate_it =
std::find_if(candidates.begin(), std::find_if(candidates.begin(), candidates.end(), [&](const PhantomNode &node) {
candidates.end(), return data.forward_segment_id.id == node.forward_segment_id.id &&
[&](const PhantomNode &node) data.reverse_segment_id.id == node.reverse_segment_id.id;
{ });
return data.forward_segment_id.id == node.forward_segment_id.id &&
data.reverse_segment_id.id == node.reverse_segment_id.id;
});
if (candidate_it == candidates.end()) if (candidate_it == candidates.end())
{ {
// First candidate from this segment // First candidate from this segment
@@ -267,20 +259,17 @@ template <typename RTreeT, typename DataFacadeT> class GeospatialQuery
} }
}; };
std::for_each(results.begin(), std::for_each(results.begin(), results.end(), [&](const CandidateSegment &segment) {
results.end(), if (segment.fixed_projected_coordinate == nearest_coord)
[&](const CandidateSegment &segment) {
{ add_to_candidates(nearest_phantoms, segment.data);
if (segment.fixed_projected_coordinate == nearest_coord) }
{ else
add_to_candidates(nearest_phantoms, segment.data); {
} // Can only be from a big component for the alternative candidates
else add_to_candidates(big_component_phantoms, segment.data);
{ }
// Can only be from a big component for the alternative candidates });
add_to_candidates(big_component_phantoms, segment.data);
}
});
return std::make_pair(std::move(nearest_phantoms), std::move(big_component_phantoms)); return std::make_pair(std::move(nearest_phantoms), std::move(big_component_phantoms));
} }
@@ -292,8 +281,9 @@ template <typename RTreeT, typename DataFacadeT> class GeospatialQuery
std::transform(results.begin(), std::transform(results.begin(),
results.end(), results.end(),
distance_and_phantoms.begin(), distance_and_phantoms.begin(),
[this, &input_coordinate](const CandidateSegment &segment) [this, &input_coordinate](const CandidateSegment &segment) {
{ return MakePhantomNode(input_coordinate, segment.data); }); return MakePhantomNode(input_coordinate, segment.data);
});
return distance_and_phantoms; return distance_and_phantoms;
} }
@@ -410,8 +400,9 @@ template <typename RTreeT, typename DataFacadeT> class GeospatialQuery
} }
// check phantom node segments validity // check phantom node segments validity
auto areSegmentsValid = [](auto first, auto last) -> bool auto areSegmentsValid = [](auto first, auto last) -> bool {
{ return std::find(first, last, INVALID_SEGMENT_WEIGHT) == last; }; return std::find(first, last, INVALID_SEGMENT_WEIGHT) == last;
};
bool is_forward_valid_source = bool is_forward_valid_source =
areSegmentsValid(forward_weights.begin(), forward_weights.end()); areSegmentsValid(forward_weights.begin(), forward_weights.end());
bool is_forward_valid_target = areSegmentsValid( bool is_forward_valid_target = areSegmentsValid(
@@ -567,7 +558,7 @@ template <typename RTreeT, typename DataFacadeT> class GeospatialQuery
{ {
bool isOnewaySegment = bool isOnewaySegment =
!(segment.data.forward_segment_id.enabled && segment.data.reverse_segment_id.enabled); !(segment.data.forward_segment_id.enabled && segment.data.reverse_segment_id.enabled);
if (!isOnewaySegment && (approach == Approach::CURB || approach == Approach::OPPOSITE)) if (!isOnewaySegment && approach == Approach::CURB)
{ {
// Check the counter clockwise // Check the counter clockwise
// //
@@ -582,9 +573,6 @@ template <typename RTreeT, typename DataFacadeT> class GeospatialQuery
if (datafacade.IsLeftHandDriving(segment.data.forward_segment_id.id)) if (datafacade.IsLeftHandDriving(segment.data.forward_segment_id.id))
input_coordinate_is_at_right = !input_coordinate_is_at_right; input_coordinate_is_at_right = !input_coordinate_is_at_right;
if (approach == Approach::OPPOSITE)
input_coordinate_is_at_right = !input_coordinate_is_at_right;
return std::make_pair(input_coordinate_is_at_right, (!input_coordinate_is_at_right)); return std::make_pair(input_coordinate_is_at_right, (!input_coordinate_is_at_right));
} }
return std::make_pair(true, true); return std::make_pair(true, true);
+28 -37
View File
@@ -43,8 +43,7 @@ std::array<std::uint32_t, SegmentNumber> summarizeRoute(const datafacade::BaseDa
const bool target_traversed_in_reverse) const bool target_traversed_in_reverse)
{ {
// merges segments with same name id // merges segments with same name id
const auto collapse_segments = [](std::vector<NamedSegment> &segments) const auto collapse_segments = [](std::vector<NamedSegment> &segments) {
{
auto out = segments.begin(); auto out = segments.begin();
auto end = segments.end(); auto end = segments.end();
@@ -76,8 +75,7 @@ std::array<std::uint32_t, SegmentNumber> summarizeRoute(const datafacade::BaseDa
std::transform(route_data.begin(), std::transform(route_data.begin(),
route_data.end(), route_data.end(),
segments.begin(), segments.begin(),
[&index, &facade](const PathData &point) [&index, &facade](const PathData &point) {
{
return NamedSegment{point.duration_until_turn, return NamedSegment{point.duration_until_turn,
index++, index++,
facade.GetNameIndex(point.from_edge_based_node)}; facade.GetNameIndex(point.from_edge_based_node)};
@@ -89,37 +87,33 @@ std::array<std::uint32_t, SegmentNumber> summarizeRoute(const datafacade::BaseDa
if (target_duration > EdgeDuration{1}) if (target_duration > EdgeDuration{1})
segments.push_back({target_duration, index++, facade.GetNameIndex(target_node_id)}); segments.push_back({target_duration, index++, facade.GetNameIndex(target_node_id)});
// this makes sure that the segment with the lowest position comes first // this makes sure that the segment with the lowest position comes first
std::sort(segments.begin(), std::sort(
segments.end(), segments.begin(), segments.end(), [](const NamedSegment &lhs, const NamedSegment &rhs) {
[](const NamedSegment &lhs, const NamedSegment &rhs) return lhs.name_id < rhs.name_id ||
{ (lhs.name_id == rhs.name_id && lhs.position < rhs.position);
return lhs.name_id < rhs.name_id || });
(lhs.name_id == rhs.name_id && lhs.position < rhs.position);
});
auto new_end = collapse_segments(segments); auto new_end = collapse_segments(segments);
segments.resize(new_end - segments.begin()); segments.resize(new_end - segments.begin());
// Filter out segments with an empty name (name_id == 0) // Filter out segments with an empty name (name_id == 0)
new_end = std::remove_if(segments.begin(), new_end = std::remove_if(segments.begin(), segments.end(), [](const NamedSegment &segment) {
segments.end(), return segment.name_id == 0;
[](const NamedSegment &segment) { return segment.name_id == 0; }); });
segments.resize(new_end - segments.begin()); segments.resize(new_end - segments.begin());
// sort descending // sort descending
std::sort(segments.begin(), std::sort(
segments.end(), segments.begin(), segments.end(), [](const NamedSegment &lhs, const NamedSegment &rhs) {
[](const NamedSegment &lhs, const NamedSegment &rhs) return lhs.duration > rhs.duration ||
{ (lhs.duration == rhs.duration && lhs.position < rhs.position);
return lhs.duration > rhs.duration || });
(lhs.duration == rhs.duration && lhs.position < rhs.position);
});
// make sure the segments are sorted by position // make sure the segments are sorted by position
segments.resize(std::min(segments.size(), SegmentNumber)); segments.resize(std::min(segments.size(), SegmentNumber));
std::sort(segments.begin(), std::sort(
segments.end(), segments.begin(), segments.end(), [](const NamedSegment &lhs, const NamedSegment &rhs) {
[](const NamedSegment &lhs, const NamedSegment &rhs) return lhs.position < rhs.position;
{ return lhs.position < rhs.position; }); });
std::array<std::uint32_t, SegmentNumber> summary; std::array<std::uint32_t, SegmentNumber> summary;
std::fill(summary.begin(), summary.end(), EMPTY_NAMEID); std::fill(summary.begin(), summary.end(), EMPTY_NAMEID);
@@ -144,8 +138,7 @@ inline std::string assembleSummary(const datafacade::BaseDataFacade &facade,
// transform a name_id into a string containing either the name, or -if the name is empty- // transform a name_id into a string containing either the name, or -if the name is empty-
// the reference. // the reference.
const auto name_id_to_string = [&](const NameID name_id) const auto name_id_to_string = [&](const NameID name_id) {
{
const auto name = facade.GetNameForID(name_id); const auto name = facade.GetNameForID(name_id);
if (!name.empty()) if (!name.empty())
return std::string(name); return std::string(name);
@@ -185,16 +178,14 @@ inline RouteLeg assembleLeg(const datafacade::BaseDataFacade &facade,
const auto target_weight = const auto target_weight =
(target_traversed_in_reverse ? target_node.reverse_weight : target_node.forward_weight); (target_traversed_in_reverse ? target_node.reverse_weight : target_node.forward_weight);
auto duration = std::accumulate(route_data.begin(), auto duration = std::accumulate(
route_data.end(), route_data.begin(), route_data.end(), 0, [](const double sum, const PathData &data) {
0, return sum + from_alias<double>(data.duration_until_turn);
[](const double sum, const PathData &data) });
{ return sum + from_alias<double>(data.duration_until_turn); }); auto weight = std::accumulate(
auto weight = std::accumulate(route_data.begin(), route_data.begin(), route_data.end(), 0, [](const double sum, const PathData &data) {
route_data.end(), return sum + from_alias<double>(data.weight_until_turn);
0, });
[](const double sum, const PathData &data)
{ return sum + from_alias<double>(data.weight_until_turn); });
// s // s
// | // |
@@ -16,7 +16,7 @@ bool basicCollapsePreconditions(const RouteStepIterator first,
// Staggered intersection are very short zig-zags of a few meters. // Staggered intersection are very short zig-zags of a few meters.
// We do not want to announce these short left-rights or right-lefts: // We do not want to announce these short left-rights or right-lefts:
//   // 
// * -> b a -> * // * -> b a -> *
// | or | becomes a -> b // | or | becomes a -> b
// a -> * * -> b // a -> * * -> b
@@ -26,7 +26,7 @@ bool isStaggeredIntersection(const RouteStepIterator step_prior_to_intersection,
// Two two turns following close after another, we can announce them as a U-Turn if both end up // Two two turns following close after another, we can announce them as a U-Turn if both end up
// involving the same (segregated) road. // involving the same (segregated) road.
//   // 
// b < - y // b < - y
// | will be represented by at x, turn around instead of turn left at x, turn left at y // | will be represented by at x, turn around instead of turn left at x, turn left at y
// a - > x // a - > x
@@ -42,11 +42,11 @@ bool isNameOszillation(const RouteStepIterator step_prior_to_intersection,
// Sometimes, segments names don't match the perceived turns. We try to detect these additional // Sometimes, segments names don't match the perceived turns. We try to detect these additional
// name changes and issue a combined turn. // name changes and issue a combined turn.
//   // 
// | e | // | e |
// a - b - c // a - b - c
// d // d
//   // 
// can have `a-b` as one name, `b-c-d` as a second. At `b` we would issue a new name, even though // can have `a-b` as one name, `b-c-d` as a second. At `b` we would issue a new name, even though
// the road turns right after. The offset would only be there due to the broad road at `e` // the road turns right after. The offset would only be there due to the broad road at `e`
bool maneuverPreceededByNameChange(const RouteStepIterator step_prior_to_intersection, bool maneuverPreceededByNameChange(const RouteStepIterator step_prior_to_intersection,
@@ -73,11 +73,11 @@ bool doubleChoiceless(const RouteStepIterator step_entering_intersection,
// Due to obvious detection, sometimes we can have straight turns followed by a different turn right // Due to obvious detection, sometimes we can have straight turns followed by a different turn right
// next to each other. We combine both turns into one, if the second turn is without choice // next to each other. We combine both turns into one, if the second turn is without choice
//   // 
//   e //  e
// a - b - c // a - b - c
// ' d // ' d
//   // 
// with a main road `abd`, the turn `continue straight` at `b` and `turn left at `c` will become a // with a main road `abd`, the turn `continue straight` at `b` and `turn left at `c` will become a
// `turn left` at `b` // `turn left` at `b`
bool straightTurnFollowedByChoiceless(const RouteStepIterator step_entering_intersection, bool straightTurnFollowedByChoiceless(const RouteStepIterator step_entering_intersection,
+7 -10
View File
@@ -122,8 +122,9 @@ inline bool haveSameMode(const RouteStep &first, const RouteStep &second, const
// alias for readability // alias for readability
inline bool haveSameName(const RouteStep &lhs, const RouteStep &rhs) inline bool haveSameName(const RouteStep &lhs, const RouteStep &rhs)
{ {
const auto has_name_or_ref = [](auto const &step) const auto has_name_or_ref = [](auto const &step) {
{ return !step.name.empty() || !step.ref.empty(); }; return !step.name.empty() || !step.ref.empty();
};
// make sure empty is not involved // make sure empty is not involved
if (!has_name_or_ref(lhs) || !has_name_or_ref(rhs)) if (!has_name_or_ref(lhs) || !has_name_or_ref(rhs))
@@ -150,14 +151,12 @@ inline bool haveSameName(const RouteStep &lhs, const RouteStep &rhs)
// alias for readability, both turn right | left // alias for readability, both turn right | left
inline bool areSameSide(const RouteStep &lhs, const RouteStep &rhs) inline bool areSameSide(const RouteStep &lhs, const RouteStep &rhs)
{ {
const auto is_left = [](const RouteStep &step) const auto is_left = [](const RouteStep &step) {
{
return hasModifier(step, osrm::guidance::DirectionModifier::Straight) || return hasModifier(step, osrm::guidance::DirectionModifier::Straight) ||
hasLeftModifier(step.maneuver.instruction); hasLeftModifier(step.maneuver.instruction);
}; };
const auto is_right = [](const RouteStep &step) const auto is_right = [](const RouteStep &step) {
{
return hasModifier(step, osrm::guidance::DirectionModifier::Straight) || return hasModifier(step, osrm::guidance::DirectionModifier::Straight) ||
hasRightModifier(step.maneuver.instruction); hasRightModifier(step.maneuver.instruction);
}; };
@@ -175,8 +174,7 @@ inline std::vector<RouteStep> removeNoTurnInstructions(std::vector<RouteStep> st
// Two valid NO_TURNs exist in each leg in the form of Depart/Arrive // Two valid NO_TURNs exist in each leg in the form of Depart/Arrive
// keep valid instructions // keep valid instructions
const auto not_is_valid = [](const RouteStep &step) const auto not_is_valid = [](const RouteStep &step) {
{
return step.maneuver.instruction == osrm::guidance::TurnInstruction::NO_TURN() && return step.maneuver.instruction == osrm::guidance::TurnInstruction::NO_TURN() &&
step.maneuver.waypoint_type == WaypointType::None; step.maneuver.waypoint_type == WaypointType::None;
}; };
@@ -227,8 +225,7 @@ inline double totalTurnAngle(const RouteStep &entry_step, const RouteStep &exit_
inline bool bearingsAreReversed(const double bearing_in, const double bearing_out) inline bool bearingsAreReversed(const double bearing_in, const double bearing_out)
{ {
// Nearly perfectly reversed angles have a difference close to 180 degrees (straight) // Nearly perfectly reversed angles have a difference close to 180 degrees (straight)
const double left_turn_angle = [&]() const double left_turn_angle = [&]() {
{
if (0 <= bearing_out && bearing_out <= bearing_in) if (0 <= bearing_out && bearing_out <= bearing_in)
return bearing_in - bearing_out; return bearing_in - bearing_out;
return bearing_in + 360 - bearing_out; return bearing_in + 360 - bearing_out;
@@ -20,16 +20,14 @@ template <typename Iter, typename Fn> inline Fn forEachRoundabout(Iter first, It
{ {
while (first != last) while (first != last)
{ {
const auto enter = std::find_if(first, const auto enter = std::find_if(first, last, [](const RouteStep &step) {
last, return entersRoundabout(step.maneuver.instruction);
[](const RouteStep &step) });
{ return entersRoundabout(step.maneuver.instruction); });
// enter has to come before leave, otherwise: faulty data / partial roundabout, skip those // enter has to come before leave, otherwise: faulty data / partial roundabout, skip those
const auto leave = std::find_if(enter, const auto leave = std::find_if(enter, last, [](const RouteStep &step) {
last, return leavesRoundabout(step.maneuver.instruction);
[](const RouteStep &step) });
{ return leavesRoundabout(step.maneuver.instruction); });
// No roundabouts, or partial one (like start / end inside a roundabout) // No roundabouts, or partial one (like start / end inside a roundabout)
if (enter == last || leave == last) if (enter == last || leave == last)
+4 -4
View File
@@ -259,10 +259,10 @@ inline util::Coordinate candidatesInputLocation(const PhantomNodeCandidates &can
inline bool candidatesHaveComponent(const PhantomNodeCandidates &candidates, uint32_t component_id) inline bool candidatesHaveComponent(const PhantomNodeCandidates &candidates, uint32_t component_id)
{ {
return std::any_of(candidates.begin(), return std::any_of(
candidates.end(), candidates.begin(), candidates.end(), [component_id](const PhantomNode &node) {
[component_id](const PhantomNode &node) return node.component.id == component_id;
{ return node.component.id == component_id; }); });
} }
struct PhantomEndpoints struct PhantomEndpoints
+35 -35
View File
@@ -33,10 +33,10 @@ class BasePlugin
bool CheckAllCoordinates(const std::vector<util::Coordinate> &coordinates) const bool CheckAllCoordinates(const std::vector<util::Coordinate> &coordinates) const
{ {
return !std::any_of(std::begin(coordinates), return !std::any_of(
std::end(coordinates), std::begin(coordinates), std::end(coordinates), [](const util::Coordinate coordinate) {
[](const util::Coordinate coordinate) return !coordinate.IsValid();
{ return !coordinate.IsValid(); }); });
} }
bool CheckAlgorithms(const api::BaseParameters &params, bool CheckAlgorithms(const api::BaseParameters &params,
@@ -105,45 +105,45 @@ class BasePlugin
{ {
// are all phantoms from a tiny cc? // are all phantoms from a tiny cc?
const auto all_in_same_tiny_component = const auto all_in_same_tiny_component =
[](const std::vector<PhantomCandidateAlternatives> &alts_list) [](const std::vector<PhantomCandidateAlternatives> &alts_list) {
{ return std::any_of(
return std::any_of( alts_list.front().first.begin(),
alts_list.front().first.begin(), alts_list.front().first.end(),
alts_list.front().first.end(), // For each of the first possible phantoms, check if all other
// For each of the first possible phantoms, check if all other // positions in the list have a phantom from the same small component.
// positions in the list have a phantom from the same small component. [&](const PhantomNode &phantom) {
[&](const PhantomNode &phantom) if (!phantom.component.is_tiny)
{ {
if (!phantom.component.is_tiny) return false;
{ }
return false; const auto component_id = phantom.component.id;
} return std::all_of(
const auto component_id = phantom.component.id; std::next(alts_list.begin()),
return std::all_of( std::end(alts_list),
std::next(alts_list.begin()), [component_id](const PhantomCandidateAlternatives &alternatives) {
std::end(alts_list), return candidatesHaveComponent(alternatives.first, component_id);
[component_id](const PhantomCandidateAlternatives &alternatives) });
{ return candidatesHaveComponent(alternatives.first, component_id); }); });
}); };
};
// Move the alternative into the final list // Move the alternative into the final list
const auto fallback_to_big_component = [](PhantomCandidateAlternatives &alternatives) const auto fallback_to_big_component = [](PhantomCandidateAlternatives &alternatives) {
{
auto no_big_alternative = alternatives.second.empty(); auto no_big_alternative = alternatives.second.empty();
return no_big_alternative ? std::move(alternatives.first) return no_big_alternative ? std::move(alternatives.first)
: std::move(alternatives.second); : std::move(alternatives.second);
}; };
// Move the alternative into the final list // Move the alternative into the final list
const auto use_closed_phantom = [](PhantomCandidateAlternatives &alternatives) const auto use_closed_phantom = [](PhantomCandidateAlternatives &alternatives) {
{ return std::move(alternatives.first); }; return std::move(alternatives.first);
};
const auto no_alternatives = const auto no_alternatives =
std::all_of(alternatives_list.begin(), std::all_of(alternatives_list.begin(),
alternatives_list.end(), alternatives_list.end(),
[](const PhantomCandidateAlternatives &alternatives) [](const PhantomCandidateAlternatives &alternatives) {
{ return alternatives.second.empty(); }); return alternatives.second.empty();
});
std::vector<PhantomNodeCandidates> snapped_phantoms; std::vector<PhantomNodeCandidates> snapped_phantoms;
snapped_phantoms.reserve(alternatives_list.size()); snapped_phantoms.reserve(alternatives_list.size());
@@ -313,12 +313,12 @@ class BasePlugin
alternatives.end(), alternatives.end(),
coordinates.begin(), coordinates.begin(),
coordinates.end(), coordinates.end(),
[](const auto &candidates_pair, const auto &coordinate) [](const auto &candidates_pair, const auto &coordinate) {
{
return std::any_of(candidates_pair.first.begin(), return std::any_of(candidates_pair.first.begin(),
candidates_pair.first.end(), candidates_pair.first.end(),
[&](const auto &phantom) [&](const auto &phantom) {
{ return phantom.input_location == coordinate; }); return phantom.input_location == coordinate;
});
}); });
std::size_t missing_index = std::distance(alternatives.begin(), mismatch.first); std::size_t missing_index = std::distance(alternatives.begin(), mismatch.first);
return std::string("Could not find a matching segment for coordinate ") + return std::string("Could not find a matching segment for coordinate ") +
+1 -2
View File
@@ -39,8 +39,7 @@ std::string encodePolyline(CoordVectorForwardIter begin, CoordVectorForwardIter
begin, begin,
end, end,
[&delta_numbers, &current_lat, &current_lon, coordinate_to_polyline]( [&delta_numbers, &current_lat, &current_lon, coordinate_to_polyline](
const util::Coordinate loc) const util::Coordinate loc) {
{
const int lat_diff = const int lat_diff =
std::round(static_cast<int>(loc.lat) * coordinate_to_polyline) - current_lat; std::round(static_cast<int>(loc.lat) * coordinate_to_polyline) - current_lat;
const int lon_diff = const int lon_diff =
@@ -71,27 +71,24 @@ void insertTargetInReverseHeap(Heap &reverse_heap, const PhantomNode &target)
static constexpr bool FORWARD_DIRECTION = true; static constexpr bool FORWARD_DIRECTION = true;
static constexpr bool REVERSE_DIRECTION = false; static constexpr bool REVERSE_DIRECTION = false;
// Identify nodes in the forward(reverse) search direction that will require step forcing // Identify nodes in the forward(reverse) search direction that will require loop forcing
// e.g. if source and destination nodes are on the same segment. // e.g. if source and destination nodes are on the same segment.
std::vector<NodeID> getForwardForceNodes(const PhantomEndpointCandidates &candidates); std::vector<NodeID> getForwardLoopNodes(const PhantomEndpointCandidates &candidates);
std::vector<NodeID> getForwardForceNodes(const PhantomCandidatesToTarget &candidates); std::vector<NodeID> getForwardLoopNodes(const PhantomCandidatesToTarget &candidates);
std::vector<NodeID> getBackwardForceNodes(const PhantomEndpointCandidates &candidates); std::vector<NodeID> getBackwardLoopNodes(const PhantomEndpointCandidates &candidates);
std::vector<NodeID> getBackwardForceNodes(const PhantomCandidatesToTarget &candidates); std::vector<NodeID> getBackwardLoopNodes(const PhantomCandidatesToTarget &candidates);
// Find the specific phantom node endpoints for a given path from a list of candidates. // Find the specific phantom node endpoints for a given path from a list of candidates.
PhantomEndpoints endpointsFromCandidates(const PhantomEndpointCandidates &candidates, PhantomEndpoints endpointsFromCandidates(const PhantomEndpointCandidates &candidates,
const std::vector<NodeID> &path); const std::vector<NodeID> &path);
template <typename HeapNodeT> template <typename HeapNodeT>
inline bool shouldForceStep(const std::vector<NodeID> &force_nodes, inline bool force_loop(const std::vector<NodeID> &force_nodes, const HeapNodeT &heap_node)
const HeapNodeT &forward_heap_node,
const HeapNodeT &reverse_heap_node)
{ {
// routing steps are forced when the node is a source of both forward and reverse search heaps. // if loops are forced, they are so at the source
return forward_heap_node.data.parent == forward_heap_node.node && return !force_nodes.empty() &&
reverse_heap_node.data.parent == reverse_heap_node.node && std::find(force_nodes.begin(), force_nodes.end(), heap_node.node) != force_nodes.end() &&
std::find(force_nodes.begin(), force_nodes.end(), forward_heap_node.node) != heap_node.data.parent == heap_node.node;
force_nodes.end();
} }
template <typename Heap> template <typename Heap>
@@ -193,10 +190,8 @@ void annotatePath(const FacadeT &facade,
std::vector<SegmentDuration> duration_vector; std::vector<SegmentDuration> duration_vector;
std::vector<DatasourceID> datasource_vector; std::vector<DatasourceID> datasource_vector;
const auto get_segment_geometry = [&](const auto geometry_index) const auto get_segment_geometry = [&](const auto geometry_index) {
{ const auto copy = [](auto &vector, const auto range) {
const auto copy = [](auto &vector, const auto range)
{
vector.resize(range.size()); vector.resize(range.size());
std::copy(range.begin(), range.end(), vector.begin()); std::copy(range.begin(), range.end(), vector.begin());
}; };
@@ -112,7 +112,8 @@ void routingStep(const DataFacade<Algorithm> &facade,
NodeID &middle_node_id, NodeID &middle_node_id,
EdgeWeight &upper_bound, EdgeWeight &upper_bound,
EdgeWeight min_edge_offset, EdgeWeight min_edge_offset,
const std::vector<NodeID> &force_step_nodes) const std::vector<NodeID> &force_loop_forward_nodes,
const std::vector<NodeID> &force_loop_reverse_nodes)
{ {
auto heapNode = forward_heap.DeleteMinGetHeapNode(); auto heapNode = forward_heap.DeleteMinGetHeapNode();
const auto reverseHeapNode = reverse_heap.GetHeapNodeIfWasInserted(heapNode.node); const auto reverseHeapNode = reverse_heap.GetHeapNodeIfWasInserted(heapNode.node);
@@ -122,13 +123,13 @@ void routingStep(const DataFacade<Algorithm> &facade,
const EdgeWeight new_weight = reverseHeapNode->weight + heapNode.weight; const EdgeWeight new_weight = reverseHeapNode->weight + heapNode.weight;
if (new_weight < upper_bound) if (new_weight < upper_bound)
{ {
if (shouldForceStep(force_step_nodes, heapNode, reverseHeapNode.get()) || if (force_loop(force_loop_forward_nodes, heapNode) ||
force_loop(force_loop_reverse_nodes, heapNode) ||
// in this case we are looking at a bi-directional way where the source // in this case we are looking at a bi-directional way where the source
// and target phantom are on the same edge based node // and target phantom are on the same edge based node
new_weight < EdgeWeight{0}) new_weight < EdgeWeight{0})
{ {
// Before forcing step, check whether there is a loop present at the node. // check whether there is a loop present at the node
// We may find a valid weight path by following the loop.
for (const auto edge : facade.GetAdjacentEdgeRange(heapNode.node)) for (const auto edge : facade.GetAdjacentEdgeRange(heapNode.node))
{ {
const auto &data = facade.GetEdgeData(edge); const auto &data = facade.GetEdgeData(edge);
@@ -293,9 +294,9 @@ EdgeDistance calculateEBGNodeAnnotations(const DataFacade<Algorithm> &facade,
// Look for an edge on the forward CH graph (.forward) // Look for an edge on the forward CH graph (.forward)
EdgeID smaller_edge_id = EdgeID smaller_edge_id =
facade.FindSmallestEdge(std::get<0>(edge), facade.FindSmallestEdge(std::get<0>(edge), std::get<1>(edge), [](const auto &data) {
std::get<1>(edge), return data.forward;
[](const auto &data) { return data.forward; }); });
// If we didn't find one there, the we might be looking at a part of the path that // If we didn't find one there, the we might be looking at a part of the path that
// was found using the backward search. Here, we flip the node order (.second, // was found using the backward search. Here, we flip the node order (.second,
@@ -380,8 +381,7 @@ void unpackPath(const FacadeT &facade,
unpackPath(facade, unpackPath(facade,
packed_path_begin, packed_path_begin,
packed_path_end, packed_path_end,
[&](std::pair<NodeID, NodeID> &edge, const auto &edge_id) [&](std::pair<NodeID, NodeID> &edge, const auto &edge_id) {
{
BOOST_ASSERT(edge.first == unpacked_nodes.back()); BOOST_ASSERT(edge.first == unpacked_nodes.back());
unpacked_nodes.push_back(edge.second); unpacked_nodes.push_back(edge.second);
unpacked_edges.push_back(edge_id); unpacked_edges.push_back(edge_id);
@@ -420,22 +420,23 @@ void retrievePackedPathFromSingleManyToManyHeap(
// assumes that heaps are already setup correctly. // assumes that heaps are already setup correctly.
// ATTENTION: This only works if no additional offset is supplied next to the Phantom Node // ATTENTION: This only works if no additional offset is supplied next to the Phantom Node
// Offsets. // Offsets.
// In case additional offsets are supplied, you might have to force a routing step first. // In case additional offsets are supplied, you might have to force a loop first.
// A forced step might be necessary, if source and target are on the same segment. // A forced loop might be necessary, if source and target are on the same segment.
// If this is the case and the offsets of the respective direction are larger for the source // If this is the case and the offsets of the respective direction are larger for the source
// than the target // than the target
// then a force step is required (e.g. source_phantom.forward_segment_id == // then a force loop is required (e.g. source_phantom.forward_segment_id ==
// target_phantom.forward_segment_id // target_phantom.forward_segment_id
// && source_phantom.GetForwardWeightPlusOffset() > target_phantom.GetForwardWeightPlusOffset()) // && source_phantom.GetForwardWeightPlusOffset() > target_phantom.GetForwardWeightPlusOffset())
// requires // requires
// a force step, if the heaps have been initialized with positive offsets. // a force loop, if the heaps have been initialized with positive offsets.
void search(SearchEngineData<Algorithm> &engine_working_data, void search(SearchEngineData<Algorithm> &engine_working_data,
const DataFacade<Algorithm> &facade, const DataFacade<Algorithm> &facade,
SearchEngineData<Algorithm>::QueryHeap &forward_heap, SearchEngineData<Algorithm>::QueryHeap &forward_heap,
SearchEngineData<Algorithm>::QueryHeap &reverse_heap, SearchEngineData<Algorithm>::QueryHeap &reverse_heap,
EdgeWeight &weight, EdgeWeight &weight,
std::vector<NodeID> &packed_leg, std::vector<NodeID> &packed_leg,
const std::vector<NodeID> &force_step_nodes, const std::vector<NodeID> &force_loop_forward_node,
const std::vector<NodeID> &force_loop_reverse_node,
const EdgeWeight duration_upper_bound = INVALID_EDGE_WEIGHT); const EdgeWeight duration_upper_bound = INVALID_EDGE_WEIGHT);
template <typename PhantomEndpointT> template <typename PhantomEndpointT>
@@ -445,7 +446,8 @@ void search(SearchEngineData<Algorithm> &engine_working_data,
SearchEngineData<Algorithm>::QueryHeap &reverse_heap, SearchEngineData<Algorithm>::QueryHeap &reverse_heap,
EdgeWeight &weight, EdgeWeight &weight,
std::vector<NodeID> &packed_leg, std::vector<NodeID> &packed_leg,
const std::vector<NodeID> &force_step_nodes, const std::vector<NodeID> &force_loop_forward_node,
const std::vector<NodeID> &force_loop_reverse_node,
const PhantomEndpointT & /*endpoints*/, const PhantomEndpointT & /*endpoints*/,
const EdgeWeight duration_upper_bound = INVALID_EDGE_WEIGHT) const EdgeWeight duration_upper_bound = INVALID_EDGE_WEIGHT)
{ {
@@ -456,13 +458,14 @@ void search(SearchEngineData<Algorithm> &engine_working_data,
reverse_heap, reverse_heap,
weight, weight,
packed_leg, packed_leg,
force_step_nodes, force_loop_forward_node,
force_loop_reverse_node,
duration_upper_bound); duration_upper_bound);
} }
// Requires the heaps for be empty // Requires the heaps for be empty
// If heaps should be adjusted to be initialized outside of this function, // If heaps should be adjusted to be initialized outside of this function,
// the addition of force_step parameters might be required // the addition of force_loop parameters might be required
double getNetworkDistance(SearchEngineData<Algorithm> &engine_working_data, double getNetworkDistance(SearchEngineData<Algorithm> &engine_working_data,
const DataFacade<ch::Algorithm> &facade, const DataFacade<ch::Algorithm> &facade,
SearchEngineData<Algorithm>::QueryHeap &forward_heap, SearchEngineData<Algorithm>::QueryHeap &forward_heap,
@@ -30,8 +30,7 @@ inline LevelID getNodeQueryLevel(const MultiLevelPartition &partition,
const PhantomNode &source, const PhantomNode &source,
const PhantomNode &target) const PhantomNode &target)
{ {
auto level = [&partition, node](const SegmentID &source, const SegmentID &target) auto level = [&partition, node](const SegmentID &source, const SegmentID &target) {
{
if (source.enabled && target.enabled) if (source.enabled && target.enabled)
return partition.GetQueryLevel(source.id, target.id, node); return partition.GetQueryLevel(source.id, target.id, node);
return INVALID_LEVEL_ID; return INVALID_LEVEL_ID;
@@ -60,8 +59,7 @@ inline LevelID getNodeQueryLevel(const MultiLevelPartition &partition,
endpoint_candidates.source_phantoms.begin(), endpoint_candidates.source_phantoms.begin(),
endpoint_candidates.source_phantoms.end(), endpoint_candidates.source_phantoms.end(),
INVALID_LEVEL_ID, INVALID_LEVEL_ID,
[&](LevelID current_level, const PhantomNode &source) [&](LevelID current_level, const PhantomNode &source) {
{
return std::min( return std::min(
current_level, current_level,
getNodeQueryLevel(partition, node, source, endpoint_candidates.target_phantom)); getNodeQueryLevel(partition, node, source, endpoint_candidates.target_phantom));
@@ -78,8 +76,7 @@ inline LevelID getNodeQueryLevel(const MultiLevelPartition &partition,
endpoint_candidates.source_phantoms.begin(), endpoint_candidates.source_phantoms.begin(),
endpoint_candidates.source_phantoms.end(), endpoint_candidates.source_phantoms.end(),
INVALID_LEVEL_ID, INVALID_LEVEL_ID,
[&](LevelID level_1, const PhantomNode &source) [&](LevelID level_1, const PhantomNode &source) {
{
return std::min( return std::min(
level_1, level_1,
std::accumulate(endpoint_candidates.target_phantoms.begin(), std::accumulate(endpoint_candidates.target_phantoms.begin(),
@@ -122,8 +119,7 @@ inline LevelID getNodeQueryLevel(const MultiLevelPartition &partition,
const NodeID node, const NodeID node,
const PhantomNodeCandidates &candidates) const PhantomNodeCandidates &candidates)
{ {
auto highest_different_level = [&partition, node](const SegmentID &segment) auto highest_different_level = [&partition, node](const SegmentID &segment) {
{
return segment.enabled ? partition.GetHighestDifferentLevel(segment.id, node) return segment.enabled ? partition.GetHighestDifferentLevel(segment.id, node)
: INVALID_LEVEL_ID; : INVALID_LEVEL_ID;
}; };
@@ -132,8 +128,7 @@ inline LevelID getNodeQueryLevel(const MultiLevelPartition &partition,
std::accumulate(candidates.begin(), std::accumulate(candidates.begin(),
candidates.end(), candidates.end(),
INVALID_LEVEL_ID, INVALID_LEVEL_ID,
[&](LevelID current_level, const PhantomNode &phantom_node) [&](LevelID current_level, const PhantomNode &phantom_node) {
{
auto highest_level = auto highest_level =
std::min(highest_different_level(phantom_node.forward_segment_id), std::min(highest_different_level(phantom_node.forward_segment_id),
highest_different_level(phantom_node.reverse_segment_id)); highest_different_level(phantom_node.reverse_segment_id));
@@ -156,11 +151,9 @@ inline LevelID getNodeQueryLevel(const MultiLevelPartition &partition,
// This is equivalent to min_{∀ source, target} partition.GetQueryLevel(source, node, target) // This is equivalent to min_{∀ source, target} partition.GetQueryLevel(source, node, target)
auto init = getNodeQueryLevel(partition, node, candidates_list[phantom_index]); auto init = getNodeQueryLevel(partition, node, candidates_list[phantom_index]);
auto result = std::accumulate( auto result = std::accumulate(
phantom_indices.begin(), phantom_indices.begin(), phantom_indices.end(), init, [&](LevelID level, size_t index) {
phantom_indices.end(), return std::min(level, getNodeQueryLevel(partition, node, candidates_list[index]));
init, });
[&](LevelID level, size_t index)
{ return std::min(level, getNodeQueryLevel(partition, node, candidates_list[index])); });
return result; return result;
} }
} // namespace } // namespace
@@ -273,7 +266,7 @@ template <bool DIRECTION, typename Algorithm, typename... Args>
void relaxOutgoingEdges(const DataFacade<Algorithm> &facade, void relaxOutgoingEdges(const DataFacade<Algorithm> &facade,
typename SearchEngineData<Algorithm>::QueryHeap &forward_heap, typename SearchEngineData<Algorithm>::QueryHeap &forward_heap,
const typename SearchEngineData<Algorithm>::QueryHeap::HeapNode &heapNode, const typename SearchEngineData<Algorithm>::QueryHeap::HeapNode &heapNode,
const Args &...args) const Args &... args)
{ {
const auto &partition = facade.GetMultiLevelPartition(); const auto &partition = facade.GetMultiLevelPartition();
const auto &cells = facade.GetCellStorage(); const auto &cells = facade.GetCellStorage();
@@ -389,8 +382,9 @@ void routingStep(const DataFacade<Algorithm> &facade,
typename SearchEngineData<Algorithm>::QueryHeap &reverse_heap, typename SearchEngineData<Algorithm>::QueryHeap &reverse_heap,
NodeID &middle_node, NodeID &middle_node,
EdgeWeight &path_upper_bound, EdgeWeight &path_upper_bound,
const std::vector<NodeID> &force_step_nodes, const std::vector<NodeID> &force_loop_forward_nodes,
const Args &...args) const std::vector<NodeID> &force_loop_reverse_nodes,
const Args &... args)
{ {
const auto heapNode = forward_heap.DeleteMinGetHeapNode(); const auto heapNode = forward_heap.DeleteMinGetHeapNode();
const auto weight = heapNode.weight; const auto weight = heapNode.weight;
@@ -408,8 +402,11 @@ void routingStep(const DataFacade<Algorithm> &facade,
auto reverse_weight = reverseHeapNode->weight; auto reverse_weight = reverseHeapNode->weight;
auto path_weight = weight + reverse_weight; auto path_weight = weight + reverse_weight;
if (!shouldForceStep(force_step_nodes, heapNode, reverseHeapNode.get()) && // MLD uses loops forcing only to prune single node paths in forward and/or
(path_weight >= EdgeWeight{0}) && (path_weight < path_upper_bound)) // backward direction (there is no need to force loops in MLD but in CH)
if (!force_loop(force_loop_forward_nodes, heapNode) &&
!force_loop(force_loop_reverse_nodes, heapNode) && (path_weight >= EdgeWeight{0}) &&
(path_weight < path_upper_bound))
{ {
middle_node = heapNode.node; middle_node = heapNode.node;
path_upper_bound = path_weight; path_upper_bound = path_weight;
@@ -434,9 +431,10 @@ UnpackedPath search(SearchEngineData<Algorithm> &engine_working_data,
const DataFacade<Algorithm> &facade, const DataFacade<Algorithm> &facade,
typename SearchEngineData<Algorithm>::QueryHeap &forward_heap, typename SearchEngineData<Algorithm>::QueryHeap &forward_heap,
typename SearchEngineData<Algorithm>::QueryHeap &reverse_heap, typename SearchEngineData<Algorithm>::QueryHeap &reverse_heap,
const std::vector<NodeID> &force_step_nodes, const std::vector<NodeID> &force_loop_forward_nodes,
const std::vector<NodeID> &force_loop_reverse_nodes,
EdgeWeight weight_upper_bound, EdgeWeight weight_upper_bound,
const Args &...args) const Args &... args)
{ {
if (forward_heap.Empty() || reverse_heap.Empty()) if (forward_heap.Empty() || reverse_heap.Empty())
{ {
@@ -458,15 +456,27 @@ UnpackedPath search(SearchEngineData<Algorithm> &engine_working_data,
{ {
if (!forward_heap.Empty()) if (!forward_heap.Empty())
{ {
routingStep<FORWARD_DIRECTION>( routingStep<FORWARD_DIRECTION>(facade,
facade, forward_heap, reverse_heap, middle, weight, force_step_nodes, args...); forward_heap,
reverse_heap,
middle,
weight,
force_loop_forward_nodes,
force_loop_reverse_nodes,
args...);
if (!forward_heap.Empty()) if (!forward_heap.Empty())
forward_heap_min = forward_heap.MinKey(); forward_heap_min = forward_heap.MinKey();
} }
if (!reverse_heap.Empty()) if (!reverse_heap.Empty())
{ {
routingStep<REVERSE_DIRECTION>( routingStep<REVERSE_DIRECTION>(facade,
facade, reverse_heap, forward_heap, middle, weight, force_step_nodes, args...); reverse_heap,
forward_heap,
middle,
weight,
force_loop_reverse_nodes,
force_loop_forward_nodes,
args...);
if (!reverse_heap.Empty()) if (!reverse_heap.Empty())
reverse_heap_min = reverse_heap.MinKey(); reverse_heap_min = reverse_heap.MinKey();
} }
@@ -495,7 +505,9 @@ UnpackedPath search(SearchEngineData<Algorithm> &engine_working_data,
for (auto const &packed_edge : packed_path) for (auto const &packed_edge : packed_path)
{ {
auto [source, target, overlay_edge] = packed_edge; NodeID source, target;
bool overlay_edge;
std::tie(source, target, overlay_edge) = packed_edge;
if (!overlay_edge) if (!overlay_edge)
{ // a base graph edge { // a base graph edge
unpacked_nodes.push_back(target); unpacked_nodes.push_back(target);
@@ -515,14 +527,21 @@ 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, // TODO: when structured bindings will be allowed change to
facade, // auto [subpath_weight, subpath_source, subpath_target, subpath] = ...
forward_heap, EdgeWeight subpath_weight;
reverse_heap, std::vector<NodeID> subpath_nodes;
force_step_nodes, std::vector<EdgeID> subpath_edges;
INVALID_EDGE_WEIGHT, std::tie(subpath_weight, subpath_nodes, subpath_edges) =
sublevel, search(engine_working_data,
parent_cell_id); facade,
forward_heap,
reverse_heap,
force_loop_forward_nodes,
force_loop_reverse_nodes,
INVALID_EDGE_WEIGHT,
sublevel,
parent_cell_id);
BOOST_ASSERT(!subpath_edges.empty()); BOOST_ASSERT(!subpath_edges.empty());
BOOST_ASSERT(subpath_nodes.size() > 1); BOOST_ASSERT(subpath_nodes.size() > 1);
BOOST_ASSERT(subpath_nodes.front() == source); BOOST_ASSERT(subpath_nodes.front() == source);
@@ -544,7 +563,8 @@ inline void search(SearchEngineData<Algorithm> &engine_working_data,
typename SearchEngineData<Algorithm>::QueryHeap &reverse_heap, typename SearchEngineData<Algorithm>::QueryHeap &reverse_heap,
EdgeWeight &weight, EdgeWeight &weight,
std::vector<NodeID> &unpacked_nodes, std::vector<NodeID> &unpacked_nodes,
const std::vector<NodeID> &force_step_nodes, const std::vector<NodeID> &force_loop_forward_node,
const std::vector<NodeID> &force_loop_reverse_node,
const PhantomEndpointT &endpoints, const PhantomEndpointT &endpoints,
const EdgeWeight weight_upper_bound = INVALID_EDGE_WEIGHT) const EdgeWeight weight_upper_bound = INVALID_EDGE_WEIGHT)
{ {
@@ -553,7 +573,8 @@ inline void search(SearchEngineData<Algorithm> &engine_working_data,
facade, facade,
forward_heap, forward_heap,
reverse_heap, reverse_heap,
force_step_nodes, force_loop_forward_node,
force_loop_reverse_node,
weight_upper_bound, weight_upper_bound,
endpoints); endpoints);
} }
@@ -580,8 +601,7 @@ void unpackPath(const FacadeT &facade,
util::for_each_pair( util::for_each_pair(
packed_path_begin, packed_path_begin,
packed_path_end, packed_path_end,
[&facade, &unpacked_nodes, &unpacked_edges](const auto from, const auto to) [&facade, &unpacked_nodes, &unpacked_edges](const auto from, const auto to) {
{
unpacked_nodes.push_back(to); unpacked_nodes.push_back(to);
unpacked_edges.push_back(facade.FindEdge(from, to)); unpacked_edges.push_back(facade.FindEdge(from, to));
}); });
@@ -605,46 +625,28 @@ double getNetworkDistance(SearchEngineData<Algorithm> &engine_working_data,
const PhantomEndpoints endpoints{source_phantom, target_phantom}; const PhantomEndpoints endpoints{source_phantom, target_phantom};
insertNodesInHeaps(forward_heap, reverse_heap, endpoints); insertNodesInHeaps(forward_heap, reverse_heap, endpoints);
auto [weight, unpacked_nodes, unpacked_edges] = search( EdgeWeight weight = INVALID_EDGE_WEIGHT;
engine_working_data, facade, forward_heap, reverse_heap, {}, weight_upper_bound, endpoints); std::vector<NodeID> unpacked_nodes;
std::vector<EdgeID> unpacked_edges;
std::tie(weight, unpacked_nodes, unpacked_edges) = search(engine_working_data,
facade,
forward_heap,
reverse_heap,
{},
{},
weight_upper_bound,
endpoints);
if (weight == INVALID_EDGE_WEIGHT) if (weight == INVALID_EDGE_WEIGHT)
{ {
return std::numeric_limits<double>::max(); return std::numeric_limits<double>::max();
} }
BOOST_ASSERT(unpacked_nodes.size() >= 1); std::vector<PathData> unpacked_path;
EdgeDistance distance = {0.0}; annotatePath(facade, endpoints, unpacked_nodes, unpacked_edges, unpacked_path);
if (source_phantom.forward_segment_id.id == unpacked_nodes.front()) return getPathDistance(facade, unpacked_path, source_phantom, target_phantom);
{
BOOST_ASSERT(source_phantom.forward_segment_id.enabled);
distance = EdgeDistance{0} - source_phantom.GetForwardDistance();
}
else if (source_phantom.reverse_segment_id.id == unpacked_nodes.front())
{
BOOST_ASSERT(source_phantom.reverse_segment_id.enabled);
distance = EdgeDistance{0} - source_phantom.GetReverseDistance();
}
for (size_t index = 0; index < unpacked_nodes.size() - 1; ++index)
{
distance += facade.GetNodeDistance(unpacked_nodes[index]);
}
if (target_phantom.forward_segment_id.id == unpacked_nodes.back())
{
BOOST_ASSERT(target_phantom.forward_segment_id.enabled);
distance += target_phantom.GetForwardDistance();
}
else if (target_phantom.reverse_segment_id.id == unpacked_nodes.back())
{
BOOST_ASSERT(target_phantom.reverse_segment_id.enabled);
distance += target_phantom.GetReverseDistance();
}
return from_alias<double>(distance);
} }
} // namespace osrm::engine::routing_algorithms::mld } // namespace osrm::engine::routing_algorithms::mld
@@ -19,7 +19,8 @@ void searchWithUTurn(SearchEngineData<Algorithm> &engine_working_data,
typename SearchEngineData<Algorithm>::QueryHeap &forward_heap, typename SearchEngineData<Algorithm>::QueryHeap &forward_heap,
typename SearchEngineData<Algorithm>::QueryHeap &reverse_heap, typename SearchEngineData<Algorithm>::QueryHeap &reverse_heap,
const PhantomEndpointCandidates &candidates, const PhantomEndpointCandidates &candidates,
EdgeWeight &leg_weight, const EdgeWeight &total_weight,
EdgeWeight &new_total_weight,
std::vector<NodeID> &leg_packed_path) std::vector<NodeID> &leg_packed_path)
{ {
forward_heap.Clear(); forward_heap.Clear();
@@ -30,14 +31,14 @@ void searchWithUTurn(SearchEngineData<Algorithm> &engine_working_data,
if (source.IsValidForwardSource()) if (source.IsValidForwardSource())
{ {
forward_heap.Insert(source.forward_segment_id.id, forward_heap.Insert(source.forward_segment_id.id,
EdgeWeight{0} - source.GetForwardWeightPlusOffset(), total_weight - source.GetForwardWeightPlusOffset(),
source.forward_segment_id.id); source.forward_segment_id.id);
} }
if (source.IsValidReverseSource()) if (source.IsValidReverseSource())
{ {
forward_heap.Insert(source.reverse_segment_id.id, forward_heap.Insert(source.reverse_segment_id.id,
EdgeWeight{0} - source.GetReverseWeightPlusOffset(), total_weight - source.GetReverseWeightPlusOffset(),
source.reverse_segment_id.id); source.reverse_segment_id.id);
} }
} }
@@ -61,9 +62,10 @@ void searchWithUTurn(SearchEngineData<Algorithm> &engine_working_data,
facade, facade,
forward_heap, forward_heap,
reverse_heap, reverse_heap,
leg_weight, new_total_weight,
leg_packed_path, leg_packed_path,
{}, getForwardLoopNodes(candidates),
getBackwardLoopNodes(candidates),
candidates); candidates);
} }
@@ -123,7 +125,8 @@ void search(SearchEngineData<Algorithm> &engine_working_data,
reverse_heap, reverse_heap,
new_total_weight_to_forward, new_total_weight_to_forward,
leg_packed_path_forward, leg_packed_path_forward,
getForwardForceNodes(candidates), getForwardLoopNodes(candidates),
{},
candidates); candidates);
} }
@@ -162,7 +165,8 @@ void search(SearchEngineData<Algorithm> &engine_working_data,
reverse_heap, reverse_heap,
new_total_weight_to_reverse, new_total_weight_to_reverse,
leg_packed_path_reverse, leg_packed_path_reverse,
getBackwardForceNodes(candidates), {},
getBackwardLoopNodes(candidates),
candidates); candidates);
} }
} }
@@ -244,8 +248,7 @@ constructRouteResult(const DataFacade<Algorithm> &facade,
auto source_it = auto source_it =
std::find_if(source_candidates.begin(), std::find_if(source_candidates.begin(),
source_candidates.end(), source_candidates.end(),
[&start_node](const auto &source_phantom) [&start_node](const auto &source_phantom) {
{
return (start_node == source_phantom.forward_segment_id.id || return (start_node == source_phantom.forward_segment_id.id ||
start_node == source_phantom.reverse_segment_id.id); start_node == source_phantom.reverse_segment_id.id);
}); });
@@ -254,8 +257,7 @@ constructRouteResult(const DataFacade<Algorithm> &facade,
auto target_it = auto target_it =
std::find_if(target_candidates.begin(), std::find_if(target_candidates.begin(),
target_candidates.end(), target_candidates.end(),
[&end_node](const auto &target_phantom) [&end_node](const auto &target_phantom) {
{
return (end_node == target_phantom.forward_segment_id.id || return (end_node == target_phantom.forward_segment_id.id ||
end_node == target_phantom.reverse_segment_id.id); end_node == target_phantom.reverse_segment_id.id);
}); });
@@ -300,7 +302,7 @@ shortestPathWithWaypointUTurns(SearchEngineData<Algorithm> &engine_working_data,
PhantomEndpointCandidates search_candidates{waypoint_candidates[i], PhantomEndpointCandidates search_candidates{waypoint_candidates[i],
waypoint_candidates[i + 1]}; waypoint_candidates[i + 1]};
std::vector<NodeID> packed_leg; std::vector<NodeID> packed_leg;
EdgeWeight leg_weight = INVALID_EDGE_WEIGHT; EdgeWeight new_total_weight = INVALID_EDGE_WEIGHT;
// We have a valid path up to this leg // We have a valid path up to this leg
BOOST_ASSERT(total_weight != INVALID_EDGE_WEIGHT); BOOST_ASSERT(total_weight != INVALID_EDGE_WEIGHT);
@@ -309,15 +311,16 @@ shortestPathWithWaypointUTurns(SearchEngineData<Algorithm> &engine_working_data,
forward_heap, forward_heap,
reverse_heap, reverse_heap,
search_candidates, search_candidates,
leg_weight, total_weight,
new_total_weight,
packed_leg); packed_leg);
if (leg_weight == INVALID_EDGE_WEIGHT) if (new_total_weight == INVALID_EDGE_WEIGHT)
return {}; return {};
packed_leg_begin.push_back(total_packed_path.size()); packed_leg_begin.push_back(total_packed_path.size());
total_packed_path.insert(total_packed_path.end(), packed_leg.begin(), packed_leg.end()); total_packed_path.insert(total_packed_path.end(), packed_leg.begin(), packed_leg.end());
total_weight += leg_weight; total_weight = new_total_weight;
}; };
// Add sentinel // Add sentinel
@@ -463,16 +466,16 @@ struct route_state
last.total_weight_to_forward.resize(init_candidates.size(), {0}); last.total_weight_to_forward.resize(init_candidates.size(), {0});
last.total_weight_to_reverse.resize(init_candidates.size(), {0}); last.total_weight_to_reverse.resize(init_candidates.size(), {0});
// Initialize routability from source validity. // Initialize routability from source validity.
std::transform(init_candidates.begin(), std::transform(
init_candidates.end(), init_candidates.begin(),
std::back_inserter(last.reached_forward_node_target), init_candidates.end(),
[](const PhantomNode &phantom_node) std::back_inserter(last.reached_forward_node_target),
{ return phantom_node.IsValidForwardSource(); }); [](const PhantomNode &phantom_node) { return phantom_node.IsValidForwardSource(); });
std::transform(init_candidates.begin(), std::transform(
init_candidates.end(), init_candidates.begin(),
std::back_inserter(last.reached_reverse_node_target), init_candidates.end(),
[](const PhantomNode &phantom_node) std::back_inserter(last.reached_reverse_node_target),
{ return phantom_node.IsValidReverseSource(); }); [](const PhantomNode &phantom_node) { return phantom_node.IsValidReverseSource(); });
} }
bool completeLeg() bool completeLeg()
@@ -610,21 +613,15 @@ struct route_state
{ {
// Find the segment from final leg with the shortest path // Find the segment from final leg with the shortest path
auto forward_range = util::irange<std::size_t>(0UL, last.total_weight_to_forward.size()); auto forward_range = util::irange<std::size_t>(0UL, last.total_weight_to_forward.size());
auto forward_min = std::min_element( auto forward_min =
forward_range.begin(), std::min_element(forward_range.begin(), forward_range.end(), [&](size_t a, size_t b) {
forward_range.end(),
[&](size_t a, size_t b)
{
return (last.total_weight_to_forward[a] < last.total_weight_to_forward[b] || return (last.total_weight_to_forward[a] < last.total_weight_to_forward[b] ||
(last.total_weight_to_forward[a] == last.total_weight_to_forward[b] && (last.total_weight_to_forward[a] == last.total_weight_to_forward[b] &&
last.total_nodes_to_forward[a] < last.total_nodes_to_forward[b])); last.total_nodes_to_forward[a] < last.total_nodes_to_forward[b]));
}); });
auto reverse_range = util::irange<std::size_t>(0UL, last.total_weight_to_reverse.size()); auto reverse_range = util::irange<std::size_t>(0UL, last.total_weight_to_reverse.size());
auto reverse_min = std::min_element( auto reverse_min =
reverse_range.begin(), std::min_element(reverse_range.begin(), reverse_range.end(), [&](size_t a, size_t b) {
reverse_range.end(),
[&](size_t a, size_t b)
{
return (last.total_weight_to_reverse[a] < last.total_weight_to_reverse[b] || return (last.total_weight_to_reverse[a] < last.total_weight_to_reverse[b] ||
(last.total_weight_to_reverse[a] == last.total_weight_to_reverse[b] && (last.total_weight_to_reverse[a] == last.total_weight_to_reverse[b] &&
last.total_nodes_to_reverse[a] < last.total_nodes_to_reverse[b])); last.total_nodes_to_reverse[a] < last.total_nodes_to_reverse[b]));
+3 -3
View File
@@ -27,9 +27,9 @@ inline auto getClassData(const std::size_t index)
inline bool isValidClassName(const std::string &name) inline bool isValidClassName(const std::string &name)
{ {
return std::find_if_not(name.begin(), return std::find_if_not(name.begin(), name.end(), [](const auto c) {
name.end(), return std::isalnum(c);
[](const auto c) { return std::isalnum(c); }) == name.end(); }) == name.end();
} }
} // namespace osrm::extractor } // namespace osrm::extractor
@@ -125,8 +125,9 @@ inline std::string canonicalizeStringList(std::string strlist, const std::string
// collapse spaces; this is needed in case we expand "; X" => "; X" above // collapse spaces; this is needed in case we expand "; X" => "; X" above
// but also makes sense to do irregardless of the fact - canonicalizing strings. // but also makes sense to do irregardless of the fact - canonicalizing strings.
const auto spaces = [](unsigned char lhs, unsigned char rhs) const auto spaces = [](unsigned char lhs, unsigned char rhs) {
{ return ::isspace(lhs) && ::isspace(rhs); }; return ::isspace(lhs) && ::isspace(rhs);
};
auto it = std::unique(begin(strlist), end(strlist), spaces); auto it = std::unique(begin(strlist), end(strlist), spaces);
strlist.erase(it, end(strlist)); strlist.erase(it, end(strlist));
+2 -4
View File
@@ -133,8 +133,7 @@ class ExtractionRelationContainer
(void)res; // prevent unused warning in release (void)res; // prevent unused warning in release
} }
auto MergeRefMap = [&](RelationRefMap &source, RelationRefMap &target) auto MergeRefMap = [&](RelationRefMap &source, RelationRefMap &target) {
{
for (auto it : source) for (auto it : source)
{ {
auto &v = target[it.first]; auto &v = target[it.first];
@@ -152,8 +151,7 @@ class ExtractionRelationContainer
const RelationIDList &GetRelations(const OsmIDTyped &member_id) const const RelationIDList &GetRelations(const OsmIDTyped &member_id) const
{ {
auto getFromMap = [this](std::uint64_t id, auto getFromMap = [this](std::uint64_t id,
const RelationRefMap &map) -> const RelationIDList & const RelationRefMap &map) -> const RelationIDList & {
{
auto it = map.find(id); auto it = map.find(id);
if (it != map.end()) if (it != map.end())
return it->second; return it->second;
+2 -5
View File
@@ -1,7 +1,6 @@
#ifndef OSRM_EXTRACTION_SEGMENT_HPP #ifndef OSRM_EXTRACTION_SEGMENT_HPP
#define OSRM_EXTRACTION_SEGMENT_HPP #define OSRM_EXTRACTION_SEGMENT_HPP
#include <extractor/node_based_edge.hpp>
#include <util/coordinate.hpp> #include <util/coordinate.hpp>
namespace osrm::extractor namespace osrm::extractor
@@ -13,10 +12,9 @@ struct ExtractionSegment
const osrm::util::Coordinate target_, const osrm::util::Coordinate target_,
double distance_, double distance_,
double weight_, double weight_,
double duration_, double duration_)
const NodeBasedEdgeClassification flags_)
: source(source_), target(target_), distance(distance_), weight(weight_), : source(source_), target(target_), distance(distance_), weight(weight_),
duration(duration_), flags(flags_) duration(duration_)
{ {
} }
@@ -25,7 +23,6 @@ struct ExtractionSegment
const double distance; const double distance;
double weight; double weight;
double duration; double duration;
const NodeBasedEdgeClassification flags;
}; };
} // namespace osrm::extractor } // namespace osrm::extractor
+1 -2
View File
@@ -453,8 +453,7 @@ void readRawNBGraph(const boost::filesystem::path &path,
coordinates.resize(number_of_nodes); coordinates.resize(number_of_nodes);
osm_node_ids.reserve(number_of_nodes); osm_node_ids.reserve(number_of_nodes);
auto index = 0; auto index = 0;
auto decode = [&](const auto &current_node) auto decode = [&](const auto &current_node) {
{
coordinates[index].lon = current_node.lon; coordinates[index].lon = current_node.lon;
coordinates[index].lat = current_node.lat; coordinates[index].lat = current_node.lat;
osm_node_ids.push_back(current_node.node_id); osm_node_ids.push_back(current_node.node_id);
+1 -1
View File
@@ -24,7 +24,7 @@ class GraphCompressor
public: public:
void Compress(const std::unordered_set<NodeID> &barrier_nodes, void Compress(const std::unordered_set<NodeID> &barrier_nodes,
TrafficSignals &traffic_signals, const TrafficSignals &traffic_signals,
ScriptingEnvironment &scripting_environment, ScriptingEnvironment &scripting_environment,
std::vector<TurnRestriction> &turn_restrictions, std::vector<TurnRestriction> &turn_restrictions,
std::vector<UnresolvedManeuverOverride> &maneuver_overrides, std::vector<UnresolvedManeuverOverride> &maneuver_overrides,
@@ -26,14 +26,16 @@ namespace osrm::extractor::intersection
inline auto makeCompareAngularDeviation(const double angle) inline auto makeCompareAngularDeviation(const double angle)
{ {
return [angle](const auto &lhs, const auto &rhs) return [angle](const auto &lhs, const auto &rhs) {
{ return util::angularDeviation(lhs.angle, angle) < util::angularDeviation(rhs.angle, angle); }; return util::angularDeviation(lhs.angle, angle) < util::angularDeviation(rhs.angle, angle);
};
} }
inline auto makeExtractLanesForRoad(const util::NodeBasedDynamicGraph &node_based_graph) inline auto makeExtractLanesForRoad(const util::NodeBasedDynamicGraph &node_based_graph)
{ {
return [&node_based_graph](const auto &road) return [&node_based_graph](const auto &road) {
{ return node_based_graph.GetEdgeData(road.eid).road_classification.GetNumberOfLanes(); }; return node_based_graph.GetEdgeData(road.eid).road_classification.GetNumberOfLanes();
};
} }
// When viewing an intersection from an incoming edge, we can transform a shape into a view which // When viewing an intersection from an incoming edge, we can transform a shape into a view which
@@ -61,10 +63,7 @@ template <typename Self> struct EnableShapeOps
auto FindClosestBearing(double base_bearing) const auto FindClosestBearing(double base_bearing) const
{ {
return std::min_element( return std::min_element(
self()->begin(), self()->begin(), self()->end(), [base_bearing](const auto &lhs, const auto &rhs) {
self()->end(),
[base_bearing](const auto &lhs, const auto &rhs)
{
return util::angularDeviation(lhs.perceived_bearing, base_bearing) < return util::angularDeviation(lhs.perceived_bearing, base_bearing) <
util::angularDeviation(rhs.perceived_bearing, base_bearing); util::angularDeviation(rhs.perceived_bearing, base_bearing);
}); });
@@ -82,8 +81,7 @@ template <typename Self> struct EnableShapeOps
BOOST_ASSERT(!self()->empty()); BOOST_ASSERT(!self()->empty());
auto initial = converter(self()->front()); auto initial = converter(self()->front());
const auto extract_maximal_value = [&initial, converter](const auto &road) const auto extract_maximal_value = [&initial, converter](const auto &road) {
{
initial = std::max(initial, converter(road)); initial = std::max(initial, converter(road));
return false; return false;
}; };
@@ -193,10 +191,8 @@ template <typename Self> struct EnableIntersectionOps
auto findClosestTurn(const double angle, const UnaryPredicate filter) const auto findClosestTurn(const double angle, const UnaryPredicate filter) const
{ {
BOOST_ASSERT(!self()->empty()); BOOST_ASSERT(!self()->empty());
const auto candidate = boost::range::min_element( const auto candidate =
*self(), boost::range::min_element(*self(), [angle, &filter](const auto &lhs, const auto &rhs) {
[angle, &filter](const auto &lhs, const auto &rhs)
{
const auto filtered_lhs = filter(lhs), filtered_rhs = filter(rhs); const auto filtered_lhs = filter(lhs), filtered_rhs = filter(rhs);
const auto deviation_lhs = util::angularDeviation(lhs.angle, angle), const auto deviation_lhs = util::angularDeviation(lhs.angle, angle),
deviation_rhs = util::angularDeviation(rhs.angle, angle); deviation_rhs = util::angularDeviation(rhs.angle, angle);
@@ -39,7 +39,7 @@ class NodeBasedGraphFactory
NodeBasedGraphFactory(ScriptingEnvironment &scripting_environment, NodeBasedGraphFactory(ScriptingEnvironment &scripting_environment,
std::vector<TurnRestriction> &turn_restrictions, std::vector<TurnRestriction> &turn_restrictions,
std::vector<UnresolvedManeuverOverride> &maneuver_overrides, std::vector<UnresolvedManeuverOverride> &maneuver_overrides,
TrafficSignals &traffic_signals, const TrafficSignals &traffic_signals,
std::unordered_set<NodeID> &&barriers, std::unordered_set<NodeID> &&barriers,
std::vector<util::Coordinate> &&coordinates, std::vector<util::Coordinate> &&coordinates,
extractor::PackedOSMIDs &&osm_node_ids, extractor::PackedOSMIDs &&osm_node_ids,
@@ -71,7 +71,7 @@ class NodeBasedGraphFactory
void Compress(ScriptingEnvironment &scripting_environment, void Compress(ScriptingEnvironment &scripting_environment,
std::vector<TurnRestriction> &turn_restrictions, std::vector<TurnRestriction> &turn_restrictions,
std::vector<UnresolvedManeuverOverride> &maneuver_overrides, std::vector<UnresolvedManeuverOverride> &maneuver_overrides,
TrafficSignals &traffic_signals); const TrafficSignals &traffic_signals);
// Most ways are bidirectional, making the geometry in forward and backward direction the same, // Most ways are bidirectional, making the geometry in forward and backward direction the same,
// except for reversal. We make use of this fact by keeping only one representation of the // except for reversal. We make use of this fact by keeping only one representation of the
+3 -2
View File
@@ -32,8 +32,9 @@ template <typename RestrictionFilter> class NodeRestrictionMap
// Find all restrictions applicable to (from,via,to) turns // Find all restrictions applicable to (from,via,to) turns
auto Restrictions(NodeID from, NodeID via, NodeID to) const auto Restrictions(NodeID from, NodeID via, NodeID to) const
{ {
const auto turnFilter = [this, to](const auto &restriction) const auto turnFilter = [this, to](const auto &restriction) {
{ return index_filter(restriction) && restriction->IsTurnRestricted(to); }; return index_filter(restriction) && restriction->IsTurnRestricted(to);
};
return getRange(from, via) | boost::adaptors::filtered(turnFilter); return getRange(from, via) | boost::adaptors::filtered(turnFilter);
}; };
-15
View File
@@ -19,21 +19,6 @@ struct TrafficSignals
{ {
return bidirectional_nodes.count(to) > 0 || unidirectional_segments.count({from, to}) > 0; return bidirectional_nodes.count(to) > 0 || unidirectional_segments.count({from, to}) > 0;
} }
void Compress(NodeID from, NodeID via, NodeID to)
{
bidirectional_nodes.erase(via);
if (unidirectional_segments.count({via, to}))
{
unidirectional_segments.erase({via, to});
unidirectional_segments.insert({from, to});
}
if (unidirectional_segments.count({via, from}))
{
unidirectional_segments.erase({via, from});
unidirectional_segments.insert({to, from});
}
}
}; };
} // namespace osrm::extractor } // namespace osrm::extractor
+10 -16
View File
@@ -187,11 +187,11 @@ IntersectionHandler::IsDistinctNarrowTurn(const EdgeID via_edge,
node_data_container.GetAnnotation(candidate_data.annotation_data); node_data_container.GetAnnotation(candidate_data.annotation_data);
auto const candidate_deviation = util::angularDeviation(candidate->angle, STRAIGHT_ANGLE); auto const candidate_deviation = util::angularDeviation(candidate->angle, STRAIGHT_ANGLE);
auto const num_lanes = [](auto const &data) auto const num_lanes = [](auto const &data) {
{ return data.flags.road_classification.GetNumberOfLanes(); }; return data.flags.road_classification.GetNumberOfLanes();
};
auto const lanes_number_equal = [&](auto const &compare_data) auto const lanes_number_equal = [&](auto const &compare_data) {
{
// Check if the lanes number is the same going from the inbound edge to the compare road // Check if the lanes number is the same going from the inbound edge to the compare road
return num_lanes(compare_data) > 0 && num_lanes(compare_data) == num_lanes(via_edge_data); return num_lanes(compare_data) > 0 && num_lanes(compare_data) == num_lanes(via_edge_data);
}; };
@@ -210,8 +210,7 @@ IntersectionHandler::IsDistinctNarrowTurn(const EdgeID via_edge,
// check if there are other narrow turns are not considered passing a low category or simply // check if there are other narrow turns are not considered passing a low category or simply
// a link of the same type as the potentially obvious turn // a link of the same type as the potentially obvious turn
auto const is_similar_turn = [&](auto const &road) auto const is_similar_turn = [&](auto const &road) {
{
// 1. Skip the candidate road // 1. Skip the candidate road
if (road.eid == candidate->eid) if (road.eid == candidate->eid)
{ {
@@ -406,8 +405,7 @@ IntersectionHandler::IsDistinctWideTurn(const EdgeID via_edge,
// Deviation is larger than NARROW_TURN_ANGLE0 here for the candidate // Deviation is larger than NARROW_TURN_ANGLE0 here for the candidate
// check if there is any turn, that might look just as obvious, even though it might not // check if there is any turn, that might look just as obvious, even though it might not
// be allowed. Entry-allowed isn't considered a valid distinction criterion here // be allowed. Entry-allowed isn't considered a valid distinction criterion here
auto const is_similar_turn = [&](auto const &road) auto const is_similar_turn = [&](auto const &road) {
{
// 1. Skip over our candidate // 1. Skip over our candidate
if (road.eid == candidate->eid) if (road.eid == candidate->eid)
return false; return false;
@@ -505,8 +503,7 @@ std::size_t IntersectionHandler::findObviousTurn(const EdgeID via_edge,
node_data_container.GetAnnotation(via_edge_data.annotation_data); node_data_container.GetAnnotation(via_edge_data.annotation_data);
// implement a filter, taking out all roads of lower class or different names // implement a filter, taking out all roads of lower class or different names
auto const continues_on_name_with_higher_class = [&](auto const &road) auto const continues_on_name_with_higher_class = [&](auto const &road) {
{
// it needs to be possible to enter the road // it needs to be possible to enter the road
if (!road.entry_allowed) if (!road.entry_allowed)
return true; return true;
@@ -553,8 +550,7 @@ std::size_t IntersectionHandler::findObviousTurn(const EdgeID via_edge,
// this check is not part of the main conditions, so that if the turn looks obvious from all // this check is not part of the main conditions, so that if the turn looks obvious from all
// other perspectives, a mode change will not result in different classification // other perspectives, a mode change will not result in different classification
auto const to_index_if_valid = [&](auto const iterator) -> std::size_t auto const to_index_if_valid = [&](auto const iterator) -> std::size_t {
{
auto const &from_data = node_based_graph.GetEdgeData(via_edge); auto const &from_data = node_based_graph.GetEdgeData(via_edge);
auto const &to_data = node_based_graph.GetEdgeData(iterator->eid); auto const &to_data = node_based_graph.GetEdgeData(iterator->eid);
@@ -581,8 +577,7 @@ std::size_t IntersectionHandler::findObviousTurn(const EdgeID via_edge,
// opposed to before, we do not care about name changes, again: this is a filter, so internal // opposed to before, we do not care about name changes, again: this is a filter, so internal
// false/true will be negated for selection // false/true will be negated for selection
auto const valid_of_higher_or_same_category = [&](auto const &road) auto const valid_of_higher_or_same_category = [&](auto const &road) {
{
if (!road.entry_allowed) if (!road.entry_allowed)
return true; return true;
@@ -645,8 +640,7 @@ std::size_t IntersectionHandler::findObviousTurn(const EdgeID via_edge,
const auto all_roads_have_same_name = const auto all_roads_have_same_name =
std::all_of(intersection.begin(), std::all_of(intersection.begin(),
intersection.end(), intersection.end(),
[id = via_edge_annotation.name_id, this](auto const &road) [id = via_edge_annotation.name_id, this](auto const &road) {
{
auto const data_id = node_based_graph.GetEdgeData(road.eid).annotation_data; auto const data_id = node_based_graph.GetEdgeData(road.eid).annotation_data;
auto const name_id = node_data_container.GetAnnotation(data_id).name_id; auto const name_id = node_data_container.GetAnnotation(data_id).name_id;
return (name_id != EMPTY_NAMEID) && (name_id == id); return (name_id != EMPTY_NAMEID) && (name_id == id);
+1 -1
View File
@@ -71,7 +71,7 @@ trimLaneString(std::string lane_string, std::int32_t count_left, std::int32_t co
OSRM_ATTR_WARN_UNUSED OSRM_ATTR_WARN_UNUSED
inline std::string applyAccessTokens(std::string lane_string, const std::string &access_tokens) inline std::string applyAccessTokens(std::string lane_string, const std::string &access_tokens)
{ {
using tokenizer = boost::tokenizer<boost::char_separator<char>>; typedef boost::tokenizer<boost::char_separator<char>> tokenizer;
boost::char_separator<char> sep("|", "", boost::keep_empty_tokens); boost::char_separator<char> sep("|", "", boost::keep_empty_tokens);
tokenizer tokens(lane_string, sep); tokenizer tokens(lane_string, sep);
tokenizer access(access_tokens, sep); tokenizer access(access_tokens, sep);
+20 -20
View File
@@ -1,14 +1,13 @@
#ifndef OSRM_GUIDANCE_TURN_INSTRUCTION_HPP_ #ifndef OSRM_GUIDANCE_TURN_INSTRUCTION_HPP_
#define OSRM_GUIDANCE_TURN_INSTRUCTION_HPP_ #define OSRM_GUIDANCE_TURN_INSTRUCTION_HPP_
#include <algorithm>
#include <cstdint>
#include "guidance/roundabout_type.hpp" #include "guidance/roundabout_type.hpp"
#include "util/attributes.hpp" #include "util/attributes.hpp"
#include "util/typedefs.hpp" #include "util/typedefs.hpp"
#include <algorithm>
#include <array>
#include <cstdint>
namespace osrm::guidance namespace osrm::guidance
{ {
@@ -155,23 +154,24 @@ inline bool operator==(const TurnInstruction lhs, const TurnInstruction rhs)
inline bool hasRoundaboutType(const TurnInstruction instruction) inline bool hasRoundaboutType(const TurnInstruction instruction)
{ {
using namespace guidance::TurnType; using namespace guidance::TurnType;
const constexpr std::array<TurnType::Enum, 13> valid_types = { const constexpr TurnType::Enum valid_types[] = {TurnType::EnterRoundabout,
TurnType::EnterRoundabout, TurnType::EnterAndExitRoundabout,
TurnType::EnterAndExitRoundabout, TurnType::EnterRotary,
TurnType::EnterRotary, TurnType::EnterAndExitRotary,
TurnType::EnterAndExitRotary, TurnType::EnterRoundaboutIntersection,
TurnType::EnterRoundaboutIntersection, TurnType::EnterAndExitRoundaboutIntersection,
TurnType::EnterAndExitRoundaboutIntersection, TurnType::EnterRoundaboutAtExit,
TurnType::EnterRoundaboutAtExit, TurnType::ExitRoundabout,
TurnType::ExitRoundabout, TurnType::EnterRotaryAtExit,
TurnType::EnterRotaryAtExit, TurnType::ExitRotary,
TurnType::ExitRotary, TurnType::EnterRoundaboutIntersectionAtExit,
TurnType::EnterRoundaboutIntersectionAtExit, TurnType::ExitRoundaboutIntersection,
TurnType::ExitRoundaboutIntersection, TurnType::StayOnRoundabout};
TurnType::StayOnRoundabout};
return std::find(valid_types.cbegin(), valid_types.cend(), instruction.type) != const auto *first = valid_types;
valid_types.cend(); const auto *last = first + sizeof(valid_types) / sizeof(valid_types[0]);
return std::find(first, last, instruction.type) != last;
} }
inline bool entersRoundabout(const guidance::TurnInstruction instruction) inline bool entersRoundabout(const guidance::TurnInstruction instruction)
+2 -8
View File
@@ -99,7 +99,6 @@ inline void ParseResult(const osrm::Status &result_status, osrm::json::Object &r
throw std::logic_error(code_iter->second.get<osrm::json::String>().value.c_str()); throw std::logic_error(code_iter->second.get<osrm::json::String>().value.c_str());
} }
result.values.erase(code_iter);
const auto message_iter = result.values.find("message"); const auto message_iter = result.values.find("message");
if (message_iter != end_iter) if (message_iter != end_iter)
{ {
@@ -560,10 +559,6 @@ inline bool argumentsToParameter(const Napi::CallbackInfo &args,
{ {
params->approaches.push_back(osrm::Approach::CURB); params->approaches.push_back(osrm::Approach::CURB);
} }
else if (approach_str == "opposite")
{
params->approaches.push_back(osrm::Approach::OPPOSITE);
}
else if (approach_str == "unrestricted") else if (approach_str == "unrestricted")
{ {
params->approaches.push_back(osrm::Approach::UNRESTRICTED); params->approaches.push_back(osrm::Approach::UNRESTRICTED);
@@ -571,14 +566,13 @@ inline bool argumentsToParameter(const Napi::CallbackInfo &args,
else else
{ {
ThrowError(args.Env(), ThrowError(args.Env(),
"'approaches' param must be one of [curb, opposite, unrestricted]"); "'approaches' param must be one of [curb, unrestricted]");
return false; return false;
} }
} }
else else
{ {
ThrowError(args.Env(), ThrowError(args.Env(), "Approach must be a string: [curb, unrestricted] or null");
"Approach must be a string: [curb, opposite, unrestricted] or null");
return false; return false;
} }
} }
+8 -11
View File
@@ -65,8 +65,8 @@ inline BisectionGraph makeBisectionGraph(const std::vector<util::Coordinate> &co
result_edges.reserve(edges.size()); result_edges.reserve(edges.size());
// find the end of edges that belong to node_id // find the end of edges that belong to node_id
const auto advance_edge_itr = [&edges, &result_edges](const std::size_t node_id, auto edge_itr) const auto advance_edge_itr = [&edges, &result_edges](const std::size_t node_id,
{ auto edge_itr) {
while (edge_itr != edges.end() && edge_itr->source == node_id) while (edge_itr != edges.end() && edge_itr->source == node_id)
{ {
result_edges.push_back(edge_itr->Reduce()); result_edges.push_back(edge_itr->Reduce());
@@ -76,9 +76,9 @@ inline BisectionGraph makeBisectionGraph(const std::vector<util::Coordinate> &co
}; };
// create a bisection node, requires the ID of the node as well as the lower bound to its edges // create a bisection node, requires the ID of the node as well as the lower bound to its edges
const auto make_bisection_node = const auto make_bisection_node = [&edges, &coordinates](const std::size_t node_id,
[&edges, &coordinates](const std::size_t node_id, const auto begin_itr, const auto end_itr) const auto begin_itr,
{ const auto end_itr) {
std::size_t range_begin = std::distance(edges.begin(), begin_itr); std::size_t range_begin = std::distance(edges.begin(), begin_itr);
std::size_t range_end = std::distance(edges.begin(), end_itr); std::size_t range_end = std::distance(edges.begin(), end_itr);
return BisectionGraph::NodeT(range_begin, range_end, coordinates[node_id], node_id); return BisectionGraph::NodeT(range_begin, range_end, coordinates[node_id], node_id);
@@ -102,12 +102,9 @@ std::vector<BisectionInputEdge> adaptToBisectionEdge(std::vector<InputEdge> edge
std::vector<BisectionInputEdge> result; std::vector<BisectionInputEdge> result;
result.reserve(edges.size()); result.reserve(edges.size());
std::transform(begin(edges), std::transform(begin(edges), end(edges), std::back_inserter(result), [](const auto &edge) {
end(edges), return BisectionInputEdge{edge.source, edge.target};
std::back_inserter(result), });
[](const auto &edge) {
return BisectionInputEdge{edge.source, edge.target};
});
return result; return result;
} }
+3 -6
View File
@@ -298,8 +298,7 @@ template <storage::Ownership Ownership> class CellStorageImpl
auto set_num_nodes_fn, auto set_num_nodes_fn,
auto set_boundary_offset_fn, auto set_boundary_offset_fn,
auto begin, auto begin,
auto end) auto end) {
{
BOOST_ASSERT(std::distance(begin, end) > 0); BOOST_ASSERT(std::distance(begin, end) > 0);
const auto cell_id = begin->first; const auto cell_id = begin->first;
@@ -317,8 +316,7 @@ template <storage::Ownership Ownership> class CellStorageImpl
util::for_each_range( util::for_each_range(
level_source_boundary.begin(), level_source_boundary.begin(),
level_source_boundary.end(), level_source_boundary.end(),
[this, insert_cell_boundary](auto begin, auto end) [this, insert_cell_boundary](auto begin, auto end) {
{
insert_cell_boundary( insert_cell_boundary(
source_boundary, source_boundary,
[](auto &cell, auto value) { cell.num_source_nodes = value; }, [](auto &cell, auto value) { cell.num_source_nodes = value; },
@@ -329,8 +327,7 @@ template <storage::Ownership Ownership> class CellStorageImpl
util::for_each_range( util::for_each_range(
level_destination_boundary.begin(), level_destination_boundary.begin(),
level_destination_boundary.end(), level_destination_boundary.end(),
[this, insert_cell_boundary](auto begin, auto end) [this, insert_cell_boundary](auto begin, auto end) {
{
insert_cell_boundary( insert_cell_boundary(
destination_boundary, destination_boundary,
[](auto &cell, auto value) { cell.num_destination_nodes = value; }, [](auto &cell, auto value) { cell.num_destination_nodes = value; },
+24 -32
View File
@@ -64,13 +64,10 @@ std::vector<OutputEdgeT> prepareEdgesForUsageInGraph(std::vector<extractor::Edge
// sort into blocks of edges with same source + target // sort into blocks of edges with same source + target
// the we partition by the forward flag to sort all edges with a forward direction first. // the we partition by the forward flag to sort all edges with a forward direction first.
// the we sort by weight to ensure the first forward edge is the smallest forward edge // the we sort by weight to ensure the first forward edge is the smallest forward edge
std::sort(begin(edges), std::sort(begin(edges), end(edges), [](const auto &lhs, const auto &rhs) {
end(edges), return std::tie(lhs.source, lhs.target, rhs.data.forward, lhs.data.weight) <
[](const auto &lhs, const auto &rhs) std::tie(rhs.source, rhs.target, lhs.data.forward, rhs.data.weight);
{ });
return std::tie(lhs.source, lhs.target, rhs.data.forward, lhs.data.weight) <
std::tie(rhs.source, rhs.target, lhs.data.forward, rhs.data.weight);
});
std::vector<OutputEdgeT> output_edges; std::vector<OutputEdgeT> output_edges;
output_edges.reserve(edges.size()); output_edges.reserve(edges.size());
@@ -80,11 +77,10 @@ std::vector<OutputEdgeT> prepareEdgesForUsageInGraph(std::vector<extractor::Edge
const NodeID source = begin_interval->source; const NodeID source = begin_interval->source;
const NodeID target = begin_interval->target; const NodeID target = begin_interval->target;
auto end_interval = std::find_if_not( auto end_interval =
begin_interval, std::find_if_not(begin_interval, edges.end(), [source, target](const auto &edge) {
edges.end(), return std::tie(edge.source, edge.target) == std::tie(source, target);
[source, target](const auto &edge) });
{ return std::tie(edge.source, edge.target) == std::tie(source, target); });
BOOST_ASSERT(begin_interval != end_interval); BOOST_ASSERT(begin_interval != end_interval);
// remove eigenloops // remove eigenloops
@@ -148,8 +144,7 @@ graphToEdges(const DynamicEdgeBasedGraph &edge_based_graph)
auto max_turn_id = tbb::parallel_reduce( auto max_turn_id = tbb::parallel_reduce(
range, range,
NodeID{0}, NodeID{0},
[&edge_based_graph](const auto range, NodeID initial) [&edge_based_graph](const auto range, NodeID initial) {
{
NodeID max_turn_id = initial; NodeID max_turn_id = initial;
for (auto node = range.begin(); node < range.end(); ++node) for (auto node = range.begin(); node < range.end(); ++node)
{ {
@@ -164,29 +159,26 @@ graphToEdges(const DynamicEdgeBasedGraph &edge_based_graph)
[](const NodeID lhs, const NodeID rhs) { return std::max(lhs, rhs); }); [](const NodeID lhs, const NodeID rhs) { return std::max(lhs, rhs); });
std::vector<extractor::EdgeBasedEdge> edges(max_turn_id + 1); std::vector<extractor::EdgeBasedEdge> edges(max_turn_id + 1);
tbb::parallel_for( tbb::parallel_for(range, [&](const auto range) {
range, for (auto node = range.begin(); node < range.end(); ++node)
[&](const auto range)
{ {
for (auto node = range.begin(); node < range.end(); ++node) for (auto edge : edge_based_graph.GetAdjacentEdgeRange(node))
{ {
for (auto edge : edge_based_graph.GetAdjacentEdgeRange(node)) const auto &data = edge_based_graph.GetEdgeData(edge);
// we only need to save the forward edges, since the read method will
// convert from forward to bi-directional edges again
if (data.forward)
{ {
const auto &data = edge_based_graph.GetEdgeData(edge); auto target = edge_based_graph.GetTarget(edge);
// we only need to save the forward edges, since the read method will BOOST_ASSERT(data.turn_id <= max_turn_id);
// convert from forward to bi-directional edges again edges[data.turn_id] = extractor::EdgeBasedEdge{node, target, data};
if (data.forward) // only save the forward edge
{ edges[data.turn_id].data.forward = true;
auto target = edge_based_graph.GetTarget(edge); edges[data.turn_id].data.backward = false;
BOOST_ASSERT(data.turn_id <= max_turn_id);
edges[data.turn_id] = extractor::EdgeBasedEdge{node, target, data};
// only save the forward edge
edges[data.turn_id].data.forward = true;
edges[data.turn_id].data.backward = false;
}
} }
} }
}); }
});
return edges; return edges;
} }
+10 -13
View File
@@ -159,11 +159,10 @@ class MultiLevelGraph : public util::StaticGraph<EdgeDataT, Ownership>
auto GetHighestBorderLevel(const MultiLevelPartition &mlp, const ContainerT &edges) const auto GetHighestBorderLevel(const MultiLevelPartition &mlp, const ContainerT &edges) const
{ {
std::vector<LevelID> highest_border_level(edges.size()); std::vector<LevelID> highest_border_level(edges.size());
std::transform(edges.begin(), std::transform(
edges.end(), edges.begin(), edges.end(), highest_border_level.begin(), [&mlp](const auto &edge) {
highest_border_level.begin(), return mlp.GetHighestDifferentLevel(edge.source, edge.target);
[&mlp](const auto &edge) });
{ return mlp.GetHighestDifferentLevel(edge.source, edge.target); });
return highest_border_level; return highest_border_level;
} }
@@ -176,8 +175,7 @@ class MultiLevelGraph : public util::StaticGraph<EdgeDataT, Ownership>
tbb::parallel_sort( tbb::parallel_sort(
permutation.begin(), permutation.begin(),
permutation.end(), permutation.end(),
[&edges, &highest_border_level](const auto &lhs, const auto &rhs) [&edges, &highest_border_level](const auto &lhs, const auto &rhs) {
{
// sort by source node and then by level in ascending order // sort by source node and then by level in ascending order
return std::tie(edges[lhs].source, highest_border_level[lhs], edges[lhs].target) < return std::tie(edges[lhs].source, highest_border_level[lhs], edges[lhs].target) <
std::tie(edges[rhs].source, highest_border_level[rhs], edges[rhs].target); std::tie(edges[rhs].source, highest_border_level[rhs], edges[rhs].target);
@@ -203,12 +201,11 @@ class MultiLevelGraph : public util::StaticGraph<EdgeDataT, Ownership>
auto level_begin = iter; auto level_begin = iter;
for (auto level : util::irange<LevelID>(0, mlp.GetNumberOfLevels())) for (auto level : util::irange<LevelID>(0, mlp.GetNumberOfLevels()))
{ {
iter = std::find_if(iter, iter = std::find_if(
edge_and_level_end, iter, edge_and_level_end, [node, level](const auto &edge_and_level) {
[node, level](const auto &edge_and_level) { return boost::get<0>(edge_and_level).source != node ||
return boost::get<0>(edge_and_level).source != node || boost::get<1>(edge_and_level) != level;
boost::get<1>(edge_and_level) != level; });
});
EdgeOffset offset = std::distance(level_begin, iter); EdgeOffset offset = std::distance(level_begin, iter);
node_to_edge_offset.push_back(offset); node_to_edge_offset.push_back(offset);
} }
@@ -207,8 +207,7 @@ template <storage::Ownership Ownership> class MultiLevelPartitionImpl final
auto lidx = 0UL; auto lidx = 0UL;
util::for_each_pair(level_offsets.begin(), util::for_each_pair(level_offsets.begin(),
level_offsets.begin() + num_level, level_offsets.begin() + num_level,
[&](const auto offset, const auto next_offset) [&](const auto offset, const auto next_offset) {
{
// create mask that has `bits` ones at its LSBs. // create mask that has `bits` ones at its LSBs.
// 000011 // 000011
BOOST_ASSERT(offset <= NUM_PARTITION_BITS); BOOST_ASSERT(offset <= NUM_PARTITION_BITS);
@@ -275,8 +274,9 @@ template <storage::Ownership Ownership> class MultiLevelPartitionImpl final
{ {
std::stable_sort(permutation.begin(), std::stable_sort(permutation.begin(),
permutation.end(), permutation.end(),
[&partition](const auto lhs, const auto rhs) [&partition](const auto lhs, const auto rhs) {
{ return partition[lhs] < partition[rhs]; }); return partition[lhs] < partition[rhs];
});
} }
// top down assign new cell ids // top down assign new cell ids
+2 -2
View File
@@ -21,7 +21,7 @@ template <typename Base> class NodeEntryWrapper : public Base
{ {
public: public:
template <typename... Args> template <typename... Args>
NodeEntryWrapper(std::size_t edges_begin_, std::size_t edges_end_, Args &&...args) NodeEntryWrapper(std::size_t edges_begin_, std::size_t edges_end_, Args &&... args)
: Base(std::forward<Args>(args)...), edges_begin(edges_begin_), edges_end(edges_end_) : Base(std::forward<Args>(args)...), edges_begin(edges_begin_), edges_end(edges_end_)
{ {
} }
@@ -41,7 +41,7 @@ template <typename Base> class GraphConstructionWrapper : public Base
{ {
public: public:
template <typename... Args> template <typename... Args>
GraphConstructionWrapper(const NodeID source_, Args &&...args) GraphConstructionWrapper(const NodeID source_, Args &&... args)
: Base(std::forward<Args>(args)...), source(source_) : Base(std::forward<Args>(args)...), source(source_)
{ {
} }
+9 -13
View File
@@ -59,13 +59,11 @@ std::size_t removeUnconnectedBoundaryNodes(const GraphT &edge_based_graph,
if (level_index < static_cast<int>(partitions.size() - 1)) if (level_index < static_cast<int>(partitions.size() - 1))
{ {
auto new_end = auto new_end = std::remove_if(
std::remove_if(witnesses.begin(), witnesses.begin(), witnesses.end(), [&](const auto &witness) {
witnesses.end(), return partitions[level_index + 1][node] !=
[&](const auto &witness) { partitions[level_index + 1][witness.id];
return partitions[level_index + 1][node] != });
partitions[level_index + 1][witness.id];
});
witnesses.resize(new_end - witnesses.begin()); witnesses.resize(new_end - witnesses.begin());
} }
if (witnesses.size() == 0) if (witnesses.size() == 0)
@@ -89,12 +87,10 @@ std::size_t removeUnconnectedBoundaryNodes(const GraphT &edge_based_graph,
} }
} }
auto best_witness = auto best_witness = std::min_element(
std::min_element(witnesses.begin(), witnesses.begin(), witnesses.end(), [](const auto &lhs, const auto &rhs) {
witnesses.end(), return lhs.induced_border_edges < rhs.induced_border_edges;
[](const auto &lhs, const auto &rhs) { });
return lhs.induced_border_edges < rhs.induced_border_edges;
});
BOOST_ASSERT(best_witness != witnesses.end()); BOOST_ASSERT(best_witness != witnesses.end());
// assign `node` to same subcells as `best_witness` // assign `node` to same subcells as `best_witness`
+4 -4
View File
@@ -30,10 +30,10 @@ void reorderFirstLast(RandomIt first, RandomIt last, std::size_t n, Comparator c
// requirements. // requirements.
std::reverse_iterator<RandomIt> rfirst{last}, rlast{first + n}; std::reverse_iterator<RandomIt> rfirst{last}, rlast{first + n};
const auto flipped = [](auto fn) const auto flipped = [](auto fn) {
{ return [fn](auto &&lhs, auto &&rhs) {
return [fn](auto &&lhs, auto &&rhs) return fn(std::forward<decltype(lhs)>(rhs), std::forward<decltype(rhs)>(lhs));
{ return fn(std::forward<decltype(lhs)>(rhs), std::forward<decltype(rhs)>(lhs)); }; };
}; };
std::nth_element(rfirst, rfirst + (n - 1), rlast, flipped(comp)); std::nth_element(rfirst, rfirst + (n - 1), rlast, flipped(comp));
+28 -29
View File
@@ -74,16 +74,16 @@ struct BaseParametersGrammar : boost::spirit::qi::grammar<Iterator, Signature>
: BaseParametersGrammar::base_type(root_rule) : BaseParametersGrammar::base_type(root_rule)
{ {
const auto add_hint = [](engine::api::BaseParameters &base_parameters, const auto add_hint = [](engine::api::BaseParameters &base_parameters,
const std::vector<std::string> &hint_strings) const std::vector<std::string> &hint_strings) {
{
if (!hint_strings.empty()) if (!hint_strings.empty())
{ {
std::vector<engine::SegmentHint> location_hints(hint_strings.size()); std::vector<engine::SegmentHint> location_hints(hint_strings.size());
std::transform(hint_strings.begin(), std::transform(hint_strings.begin(),
hint_strings.end(), hint_strings.end(),
location_hints.begin(), location_hints.begin(),
[](const auto &hint_string) [](const auto &hint_string) {
{ return engine::SegmentHint::FromBase64(hint_string); }); return engine::SegmentHint::FromBase64(hint_string);
});
base_parameters.hints.push_back(engine::Hint{std::move(location_hints)}); base_parameters.hints.push_back(engine::Hint{std::move(location_hints)});
} }
else else
@@ -94,16 +94,15 @@ struct BaseParametersGrammar : boost::spirit::qi::grammar<Iterator, Signature>
const auto add_bearing = const auto add_bearing =
[](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;
boost::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(std::move(bearing)); };
};
polyline_chars = qi::char_("a-zA-Z0-9_.--[]{}@?|\\%~`^"); polyline_chars = qi::char_("a-zA-Z0-9_.--[]{}@?|\\%~`^");
base64_char = qi::char_("a-zA-Z0-9--_="); base64_char = qi::char_("a-zA-Z0-9--_=");
@@ -119,8 +118,7 @@ struct BaseParametersGrammar : boost::spirit::qi::grammar<Iterator, Signature>
location_rule = (double_ > qi::lit(',') > location_rule = (double_ > qi::lit(',') >
double_)[qi::_val = ph::bind( double_)[qi::_val = ph::bind(
[](double lon, double lat) [](double lon, double lat) {
{
return util::Coordinate( return util::Coordinate(
util::toFixed(util::UnsafeFloatLongitude{lon}), util::toFixed(util::UnsafeFloatLongitude{lon}),
util::toFixed(util::UnsafeFloatLatitude{lat})); util::toFixed(util::UnsafeFloatLatitude{lat}));
@@ -128,17 +126,19 @@ struct BaseParametersGrammar : boost::spirit::qi::grammar<Iterator, Signature>
qi::_1, qi::_1,
qi::_2)]; qi::_2)];
polyline_rule = polyline_rule = qi::as_string[qi::lit("polyline(") > +polyline_chars > ')']
qi::as_string[qi::lit("polyline(") > +polyline_chars > ')'] [qi::_val = ph::bind(
[qi::_val = ph::bind([](const std::string &polyline) [](const std::string &polyline) {
{ return engine::decodePolyline(polyline); }, return engine::decodePolyline(polyline);
qi::_1)]; },
qi::_1)];
polyline6_rule = polyline6_rule = qi::as_string[qi::lit("polyline6(") > +polyline_chars > ')']
qi::as_string[qi::lit("polyline6(") > +polyline_chars > ')'] [qi::_val = ph::bind(
[qi::_val = ph::bind([](const std::string &polyline) [](const std::string &polyline) {
{ return engine::decodePolyline<1000000>(polyline); }, return engine::decodePolyline<1000000>(polyline);
qi::_1)]; },
qi::_1)];
query_rule = query_rule =
((location_rule % ';') | polyline_rule | ((location_rule % ';') | polyline_rule |
@@ -166,9 +166,8 @@ struct BaseParametersGrammar : boost::spirit::qi::grammar<Iterator, Signature>
qi::lit("bearings=") > qi::lit("bearings=") >
(-(qi::short_ > ',' > qi::short_))[ph::bind(add_bearing, qi::_r1, qi::_1)] % ';'; (-(qi::short_ > ',' > qi::short_))[ph::bind(add_bearing, qi::_r1, qi::_1)] % ';';
approach_type.add("unrestricted", engine::Approach::UNRESTRICTED)( approach_type.add("unrestricted", engine::Approach::UNRESTRICTED)("curb",
"curb", engine::Approach::CURB)("opposite", engine::Approach::OPPOSITE); engine::Approach::CURB);
approach_rule = qi::lit("approaches=") > approach_rule = qi::lit("approaches=") >
(-approach_type % (-approach_type %
';')[ph::bind(&engine::api::BaseParameters::approaches, qi::_r1) = qi::_1]; ';')[ph::bind(&engine::api::BaseParameters::approaches, qi::_r1) = qi::_1];
@@ -54,9 +54,8 @@ struct RouteParametersGrammar : public BaseParametersGrammar<Iterator, Signature
#endif #endif
using AnnotationsType = engine::api::RouteParameters::AnnotationsType; using AnnotationsType = engine::api::RouteParameters::AnnotationsType;
const auto add_annotation = const auto add_annotation = [](engine::api::RouteParameters &route_parameters,
[](engine::api::RouteParameters &route_parameters, AnnotationsType route_param) AnnotationsType route_param) {
{
route_parameters.annotations_type = route_parameters.annotations_type | route_param; route_parameters.annotations_type = route_parameters.annotations_type | route_param;
route_parameters.annotations = route_parameters.annotations =
route_parameters.annotations_type != AnnotationsType::None; route_parameters.annotations_type != AnnotationsType::None;
+13 -3
View File
@@ -14,6 +14,18 @@
#include <memory> #include <memory>
#include <vector> #include <vector>
// workaround for incomplete std::shared_ptr compatibility in old boost versions
#if BOOST_VERSION < 105300 || defined BOOST_NO_CXX11_SMART_PTR
namespace boost
{
template <class T> const T *get_pointer(std::shared_ptr<T> const &p) { return p.get(); }
template <class T> T *get_pointer(std::shared_ptr<T> &p) { return p.get(); }
} // namespace boost
#endif
namespace osrm::server namespace osrm::server
{ {
@@ -23,9 +35,7 @@ class RequestHandler;
class Connection : public std::enable_shared_from_this<Connection> class Connection : public std::enable_shared_from_this<Connection>
{ {
public: public:
explicit Connection(boost::asio::io_context &io_context, explicit Connection(boost::asio::io_context &io_context, RequestHandler &handler);
RequestHandler &handler,
short keepalive_timeout);
Connection(const Connection &) = delete; Connection(const Connection &) = delete;
Connection &operator=(const Connection &) = delete; Connection &operator=(const Connection &) = delete;
+7 -15
View File
@@ -31,24 +31,18 @@ class Server
{ {
public: public:
// Note: returns a shared instead of a unique ptr as it is captured in a lambda somewhere else // Note: returns a shared instead of a unique ptr as it is captured in a lambda somewhere else
static std::shared_ptr<Server> CreateServer(std::string &ip_address, static std::shared_ptr<Server>
int ip_port, CreateServer(std::string &ip_address, int ip_port, unsigned requested_num_threads)
unsigned requested_num_threads,
short keepalive_timeout)
{ {
util::Log() << "http 1.1 compression handled by zlib version " << zlibVersion(); util::Log() << "http 1.1 compression handled by zlib version " << zlibVersion();
const unsigned hardware_threads = std::max(1u, std::thread::hardware_concurrency()); const unsigned hardware_threads = std::max(1u, std::thread::hardware_concurrency());
const unsigned real_num_threads = std::min(hardware_threads, requested_num_threads); const unsigned real_num_threads = std::min(hardware_threads, requested_num_threads);
return std::make_shared<Server>(ip_address, ip_port, real_num_threads, keepalive_timeout); return std::make_shared<Server>(ip_address, ip_port, real_num_threads);
} }
explicit Server(const std::string &address, explicit Server(const std::string &address, const int port, const unsigned thread_pool_size)
const int port, : thread_pool_size(thread_pool_size), acceptor(io_context),
const unsigned thread_pool_size, new_connection(std::make_shared<Connection>(io_context, request_handler))
const short keepalive_timeout)
: thread_pool_size(thread_pool_size), keepalive_timeout(keepalive_timeout),
acceptor(io_context), new_connection(std::make_shared<Connection>(
io_context, request_handler, keepalive_timeout))
{ {
const auto port_string = std::to_string(port); const auto port_string = std::to_string(port);
@@ -100,8 +94,7 @@ class Server
if (!e) if (!e)
{ {
new_connection->start(); new_connection->start();
new_connection = new_connection = std::make_shared<Connection>(io_context, request_handler);
std::make_shared<Connection>(io_context, request_handler, keepalive_timeout);
acceptor.async_accept( acceptor.async_accept(
new_connection->socket(), new_connection->socket(),
boost::bind(&Server::HandleAccept, this, boost::asio::placeholders::error)); boost::bind(&Server::HandleAccept, this, boost::asio::placeholders::error));
@@ -114,7 +107,6 @@ class Server
RequestHandler request_handler; RequestHandler request_handler;
unsigned thread_pool_size; unsigned thread_pool_size;
short keepalive_timeout;
boost::asio::io_context io_context; boost::asio::io_context io_context;
boost::asio::ip::tcp::acceptor acceptor; boost::asio::ip::tcp::acceptor acceptor;
std::shared_ptr<Connection> new_connection; std::shared_ptr<Connection> new_connection;
+2 -4
View File
@@ -66,8 +66,7 @@ void readBoolVector(tar::FileReader &reader, const std::string &name, VectorT &d
using BlockType = std::uint64_t; using BlockType = std::uint64_t;
constexpr std::uint64_t BLOCK_BITS = CHAR_BIT * sizeof(BlockType); constexpr std::uint64_t BLOCK_BITS = CHAR_BIT * sizeof(BlockType);
const auto decode = [&](const BlockType block) const auto decode = [&](const BlockType block) {
{
auto read_size = std::min<std::size_t>(count - index, BLOCK_BITS); auto read_size = std::min<std::size_t>(count - index, BLOCK_BITS);
unpackBits<VectorT, BlockType>(data, index, read_size, block); unpackBits<VectorT, BlockType>(data, index, read_size, block);
index += BLOCK_BITS; index += BLOCK_BITS;
@@ -88,8 +87,7 @@ void writeBoolVector(tar::FileWriter &writer, const std::string &name, const Vec
// FIXME on old boost version the function_input_iterator does not work with lambdas // FIXME on old boost version the function_input_iterator does not work with lambdas
// so we need to wrap it in a function here. // so we need to wrap it in a function here.
const std::function<BlockType()> encode_function = [&]() -> BlockType const std::function<BlockType()> encode_function = [&]() -> BlockType {
{
auto write_size = std::min<std::size_t>(count - index, BLOCK_BITS); auto write_size = std::min<std::size_t>(count - index, BLOCK_BITS);
auto packed = packBits<VectorT, BlockType>(data, index, write_size); auto packed = packBits<VectorT, BlockType>(data, index, write_size);
index += BLOCK_BITS; index += BLOCK_BITS;
+4 -4
View File
@@ -28,10 +28,10 @@ class SharedDataIndex
// Build mapping from block name to region // Build mapping from block name to region
for (auto index : util::irange<std::uint32_t>(0, regions.size())) for (auto index : util::irange<std::uint32_t>(0, regions.size()))
{ {
regions[index].layout->List( regions[index].layout->List("",
"", boost::make_function_output_iterator([&](const auto &name) {
boost::make_function_output_iterator([&](const auto &name) block_to_region[name] = index;
{ block_to_region[name] = index; })); }));
} }
} }
+3 -6
View File
@@ -223,12 +223,9 @@ struct SharedRegionRegister
// Returns the key of the region with the given name // Returns the key of the region with the given name
RegionID Find(const std::string &name) const RegionID Find(const std::string &name) const
{ {
auto iter = std::find_if( auto iter = std::find_if(regions.begin(), regions.end(), [&](const auto &region) {
regions.begin(), return std::strncmp(region.name, name.c_str(), SharedRegion::MAX_NAME_LENGTH) == 0;
regions.end(), });
[&](const auto &region) {
return std::strncmp(region.name, name.c_str(), SharedRegion::MAX_NAME_LENGTH) == 0;
});
if (iter == regions.end()) if (iter == regions.end())
{ {
+1 -2
View File
@@ -113,8 +113,7 @@ class SharedMemory
{ {
auto shmid = shm.get_shmid(); auto shmid = shm.get_shmid();
::shmid_ds xsi_ds; ::shmid_ds xsi_ds;
const auto errorToMessage = [](int error) -> std::string const auto errorToMessage = [](int error) -> std::string {
{
switch (error) switch (error)
{ {
case EPERM: case EPERM:
+3 -3
View File
@@ -241,9 +241,9 @@ inline auto make_contracted_metric_view(const SharedDataIndex &index, const std:
std::vector<util::vector_view<bool>> edge_filter; std::vector<util::vector_view<bool>> edge_filter;
index.List(name + "/exclude", index.List(name + "/exclude",
boost::make_function_output_iterator( boost::make_function_output_iterator([&](const auto &filter_name) {
[&](const auto &filter_name) edge_filter.push_back(make_vector_view<bool>(index, filter_name));
{ edge_filter.push_back(make_vector_view<bool>(index, filter_name)); })); }));
return contractor::ContractedMetricView{{node_list, edge_list}, std::move(edge_filter)}; return contractor::ContractedMetricView{{node_list, edge_list}, std::move(edge_filter)};
} }
+17 -22
View File
@@ -46,36 +46,31 @@ template <typename Key, typename Value> struct CSVFilesParser
{ {
tbb::spin_mutex mutex; tbb::spin_mutex mutex;
std::vector<std::pair<Key, Value>> lookup; std::vector<std::pair<Key, Value>> lookup;
tbb::parallel_for(std::size_t{0}, tbb::parallel_for(std::size_t{0}, csv_filenames.size(), [&](const std::size_t idx) {
csv_filenames.size(), auto local = ParseCSVFile(csv_filenames[idx], start_index + idx);
[&](const std::size_t idx)
{
auto local = ParseCSVFile(csv_filenames[idx], start_index + idx);
{ // Merge local CSV results into a flat global vector { // Merge local CSV results into a flat global vector
tbb::spin_mutex::scoped_lock _{mutex}; tbb::spin_mutex::scoped_lock _{mutex};
lookup.insert(end(lookup), lookup.insert(end(lookup),
std::make_move_iterator(begin(local)), std::make_move_iterator(begin(local)),
std::make_move_iterator(end(local))); std::make_move_iterator(end(local)));
} }
}); });
// With flattened map-ish view of all the files, make a stable sort on key and source // With flattened map-ish view of all the files, make a stable sort on key and source
// and unique them on key to keep only the value with the largest file index // and unique them on key to keep only the value with the largest file index
// and the largest line number in a file. // and the largest line number in a file.
// The operands order is swapped to make descending ordering on (key, source) // The operands order is swapped to make descending ordering on (key, source)
tbb::parallel_sort(begin(lookup), tbb::parallel_sort(begin(lookup), end(lookup), [](const auto &lhs, const auto &rhs) {
end(lookup), return std::tie(rhs.first, rhs.second.source) <
[](const auto &lhs, const auto &rhs) { std::tie(lhs.first, lhs.second.source);
return std::tie(rhs.first, rhs.second.source) < });
std::tie(lhs.first, lhs.second.source);
});
// Unique only on key to take the source precedence into account and remove duplicates. // Unique only on key to take the source precedence into account and remove duplicates.
const auto it = std::unique(begin(lookup), const auto it =
end(lookup), std::unique(begin(lookup), end(lookup), [](const auto &lhs, const auto &rhs) {
[](const auto &lhs, const auto &rhs) return lhs.first == rhs.first;
{ return lhs.first == rhs.first; }); });
lookup.erase(it, end(lookup)); lookup.erase(it, end(lookup));
util::Log() << "In total loaded " << csv_filenames.size() << " file(s) with a total of " util::Log() << "In total loaded " << csv_filenames.size() << " file(s) with a total of "
+4 -5
View File
@@ -15,11 +15,10 @@ template <typename Key, typename Value> struct LookupTable
boost::optional<Value> operator()(const Key &key) const boost::optional<Value> operator()(const Key &key) const
{ {
using Result = boost::optional<Value>; using Result = boost::optional<Value>;
const auto it = const auto it = std::lower_bound(
std::lower_bound(lookup.begin(), lookup.begin(), lookup.end(), key, [](const auto &lhs, const auto &rhs) {
lookup.end(), return rhs < lhs.first;
key, });
[](const auto &lhs, const auto &rhs) { return rhs < lhs.first; });
return it != std::end(lookup) && !(it->first < key) ? Result(it->second) : Result(); return it != std::end(lookup) && !(it->first < key) ? Result(it->second) : Result();
} }
+1 -1
View File
@@ -46,7 +46,7 @@ template <typename From, typename Tag> struct Alias final
static_assert(std::is_arithmetic<From>::value, "Needs to be based on an arithmetic type"); static_assert(std::is_arithmetic<From>::value, "Needs to be based on an arithmetic type");
From __value; From __value;
friend std::ostream &operator<< <From, Tag>(std::ostream &stream, const Alias &inst); friend std::ostream &operator<<<From, Tag>(std::ostream &stream, const Alias &inst);
explicit operator From &() { return __value; } explicit operator From &() { return __value; }
explicit operator From() const { return __value; } explicit operator From() const { return __value; }
+6 -14
View File
@@ -72,20 +72,12 @@ using FloatLongitude = Alias<double, tag::longitude>;
// range checks on these (toFixed/toFloat, etc) // range checks on these (toFixed/toFloat, etc)
using UnsafeFloatLatitude = Alias<double, tag::unsafelatitude>; using UnsafeFloatLatitude = Alias<double, tag::unsafelatitude>;
using UnsafeFloatLongitude = Alias<double, tag::unsafelongitude>; using UnsafeFloatLongitude = Alias<double, tag::unsafelongitude>;
static_assert(std::is_standard_layout<FixedLatitude>() && std::is_trivial<FixedLatitude>(), static_assert(std::is_pod<FixedLatitude>(), "FixedLatitude is not a valid alias");
"FixedLatitude is not a valid alias"); static_assert(std::is_pod<FixedLongitude>(), "FixedLongitude is not a valid alias");
static_assert(std::is_standard_layout<FixedLongitude>() && std::is_trivial<FixedLongitude>(), static_assert(std::is_pod<FloatLatitude>(), "FloatLatitude is not a valid alias");
"FixedLongitude is not a valid alias"); static_assert(std::is_pod<FloatLongitude>(), "FloatLongitude is not a valid alias");
static_assert(std::is_standard_layout<FloatLatitude>() && std::is_trivial<FloatLatitude>(), static_assert(std::is_pod<UnsafeFloatLatitude>(), "UnsafeFloatLatitude is not a valid alias");
"FloatLatitude is not a valid alias"); static_assert(std::is_pod<UnsafeFloatLongitude>(), "UnsafeFloatLongitude is not a valid alias");
static_assert(std::is_standard_layout<FloatLongitude>() && std::is_trivial<FloatLongitude>(),
"FloatLongitude is not a valid alias");
static_assert(std::is_standard_layout<UnsafeFloatLatitude>() &&
std::is_trivial<UnsafeFloatLatitude>(),
"UnsafeFloatLatitude is not a valid alias");
static_assert(std::is_standard_layout<UnsafeFloatLongitude>() &&
std::is_trivial<UnsafeFloatLongitude>(),
"UnsafeFloatLongitude is not a valid alias");
/** /**
* Converts a typed latitude from floating to fixed representation. * Converts a typed latitude from floating to fixed representation.
+27 -35
View File
@@ -179,14 +179,12 @@ template <class BinaryOperation, typename iterator_type>
double getLength(iterator_type begin, const iterator_type end, BinaryOperation op) double getLength(iterator_type begin, const iterator_type end, BinaryOperation op)
{ {
double result = 0; double result = 0;
const auto functor = [&result, op](const Coordinate lhs, const Coordinate rhs) const auto functor = [&result, op](const Coordinate lhs, const Coordinate rhs) {
{
result += op(lhs, rhs); result += op(lhs, rhs);
return false; return false;
}; };
// side-effect find adding up distances // side-effect find adding up distances
// Ignore return value, we are only interested in the side-effect std::adjacent_find(begin, end, functor);
[[maybe_unused]] auto _ = std::adjacent_find(begin, end, functor);
return result; return result;
} }
@@ -198,15 +196,13 @@ findClosestDistance(const Coordinate coordinate, const iterator_type begin, cons
double current_min = std::numeric_limits<double>::max(); double current_min = std::numeric_limits<double>::max();
// comparator updating current_min without ever finding an element // comparator updating current_min without ever finding an element
const auto compute_minimum_distance = const auto compute_minimum_distance = [&current_min, coordinate](const Coordinate lhs,
[&current_min, coordinate](const Coordinate lhs, const Coordinate rhs) const Coordinate rhs) {
{
current_min = std::min(current_min, findClosestDistance(coordinate, lhs, rhs)); current_min = std::min(current_min, findClosestDistance(coordinate, lhs, rhs));
return false; return false;
}; };
// Ignore return value, we are only interested in the side-effect std::adjacent_find(begin, end, compute_minimum_distance);
[[maybe_unused]] auto _ = std::adjacent_find(begin, end, compute_minimum_distance);
return current_min; return current_min;
} }
@@ -218,9 +214,8 @@ double findClosestDistance(const iterator_type lhs_begin,
{ {
double current_min = std::numeric_limits<double>::max(); double current_min = std::numeric_limits<double>::max();
const auto compute_minimum_distance_in_rhs = const auto compute_minimum_distance_in_rhs = [&current_min, rhs_begin, rhs_end](
[&current_min, rhs_begin, rhs_end](const Coordinate coordinate) const Coordinate coordinate) {
{
current_min = std::min(current_min, findClosestDistance(coordinate, rhs_begin, rhs_end)); current_min = std::min(current_min, findClosestDistance(coordinate, rhs_begin, rhs_end));
return false; return false;
}; };
@@ -236,11 +231,13 @@ std::pair<Coordinate, Coordinate> leastSquareRegression(const iterator_type begi
// following the formulas of https://faculty.elgin.edu/dkernler/statistics/ch04/4-2.html // following the formulas of https://faculty.elgin.edu/dkernler/statistics/ch04/4-2.html
const auto number_of_coordinates = std::distance(begin, end); const auto number_of_coordinates = std::distance(begin, end);
BOOST_ASSERT(number_of_coordinates >= 2); BOOST_ASSERT(number_of_coordinates >= 2);
const auto extract_lon = [](const Coordinate coordinate) const auto extract_lon = [](const Coordinate coordinate) {
{ return static_cast<double>(toFloating(coordinate.lon)); }; return static_cast<double>(toFloating(coordinate.lon));
};
const auto extract_lat = [](const Coordinate coordinate) const auto extract_lat = [](const Coordinate coordinate) {
{ return static_cast<double>(toFloating(coordinate.lat)); }; return static_cast<double>(toFloating(coordinate.lat));
};
double min_lon = extract_lon(*begin); double min_lon = extract_lon(*begin);
double max_lon = extract_lon(*begin); double max_lon = extract_lon(*begin);
@@ -263,21 +260,19 @@ std::pair<Coordinate, Coordinate> leastSquareRegression(const iterator_type begi
{ {
std::vector<util::Coordinate> rotated_coordinates(number_of_coordinates); std::vector<util::Coordinate> rotated_coordinates(number_of_coordinates);
// rotate all coordinates to the right // rotate all coordinates to the right
std::transform(begin, std::transform(begin, end, rotated_coordinates.begin(), [](const auto coordinate) {
end, return rotateCCWAroundZero(coordinate, detail::degToRad(-90));
rotated_coordinates.begin(), });
[](const auto coordinate)
{ return rotateCCWAroundZero(coordinate, detail::degToRad(-90)); });
const auto rotated_regression = const auto rotated_regression =
leastSquareRegression(rotated_coordinates.begin(), rotated_coordinates.end()); leastSquareRegression(rotated_coordinates.begin(), rotated_coordinates.end());
return {rotateCCWAroundZero(rotated_regression.first, detail::degToRad(90)), return {rotateCCWAroundZero(rotated_regression.first, detail::degToRad(90)),
rotateCCWAroundZero(rotated_regression.second, detail::degToRad(90))}; rotateCCWAroundZero(rotated_regression.second, detail::degToRad(90))};
} }
const auto make_accumulate = [](const auto extraction_function) const auto make_accumulate = [](const auto extraction_function) {
{ return [extraction_function](const double sum_so_far, const Coordinate coordinate) {
return [extraction_function](const double sum_so_far, const Coordinate coordinate) return sum_so_far + extraction_function(coordinate);
{ return sum_so_far + extraction_function(coordinate); }; };
}; };
const auto accumulated_lon = std::accumulate(begin, end, 0., make_accumulate(extract_lon)); const auto accumulated_lon = std::accumulate(begin, end, 0., make_accumulate(extract_lon));
@@ -286,10 +281,8 @@ std::pair<Coordinate, Coordinate> leastSquareRegression(const iterator_type begi
const auto mean_lon = accumulated_lon / number_of_coordinates; const auto mean_lon = accumulated_lon / number_of_coordinates;
const auto mean_lat = accumulated_lat / number_of_coordinates; const auto mean_lat = accumulated_lat / number_of_coordinates;
const auto make_variance = [](const auto mean, const auto extraction_function) const auto make_variance = [](const auto mean, const auto extraction_function) {
{ return [extraction_function, mean](const double sum_so_far, const Coordinate coordinate) {
return [extraction_function, mean](const double sum_so_far, const Coordinate coordinate)
{
const auto difference = extraction_function(coordinate) - mean; const auto difference = extraction_function(coordinate) - mean;
return sum_so_far + difference * difference; return sum_so_far + difference * difference;
}; };
@@ -317,8 +310,7 @@ std::pair<Coordinate, Coordinate> leastSquareRegression(const iterator_type begi
std::accumulate(begin, std::accumulate(begin,
end, end,
0., 0.,
[&](const auto sum_so_far, const auto current_coordinate) [&](const auto sum_so_far, const auto current_coordinate) {
{
return sum_so_far + (extract_lon(current_coordinate) - mean_lon) * return sum_so_far + (extract_lon(current_coordinate) - mean_lon) *
(extract_lat(current_coordinate) - mean_lat) / (extract_lat(current_coordinate) - mean_lat) /
(sample_variance_lon * sample_variance_lat); (sample_variance_lon * sample_variance_lat);
@@ -329,8 +321,9 @@ std::pair<Coordinate, Coordinate> leastSquareRegression(const iterator_type begi
const auto intercept = mean_lat - slope * mean_lon; const auto intercept = mean_lat - slope * mean_lon;
const auto GetLatAtLon = [intercept, const auto GetLatAtLon = [intercept,
slope](const util::FloatLongitude longitude) -> util::FloatLatitude slope](const util::FloatLongitude longitude) -> util::FloatLatitude {
{ return {intercept + slope * static_cast<double>((longitude))}; }; return {intercept + slope * static_cast<double>((longitude))};
};
const double offset = 0.00001; const double offset = 0.00001;
const Coordinate regression_first = { const Coordinate regression_first = {
@@ -364,8 +357,7 @@ bool areParallel(const iterator_type lhs_begin,
const auto rotation_angle_radians = detail::degToRad(bearing_lhs - 90); const auto rotation_angle_radians = detail::degToRad(bearing_lhs - 90);
const auto rotated_difference_rhs = rotateCCWAroundZero(difference_rhs, rotation_angle_radians); const auto rotated_difference_rhs = rotateCCWAroundZero(difference_rhs, rotation_angle_radians);
const auto get_slope = [](const Coordinate from, const Coordinate to) const auto get_slope = [](const Coordinate from, const Coordinate to) {
{
const auto diff_lat = static_cast<int>(from.lat) - static_cast<int>(to.lat); const auto diff_lat = static_cast<int>(from.lat) - static_cast<int>(to.lat);
const auto diff_lon = static_cast<int>(from.lon) - static_cast<int>(to.lon); const auto diff_lon = static_cast<int>(from.lon) - static_cast<int>(to.lon);
if (diff_lon == 0) if (diff_lon == 0)
+1 -1
View File
@@ -254,7 +254,7 @@ template <typename ElementT> class DeallocatingVector
++current_size; ++current_size;
} }
template <typename... Ts> void emplace_back(Ts &&...element) template <typename... Ts> void emplace_back(Ts &&... element)
{ {
const std::size_t current_capacity = capacity(); const std::size_t current_capacity = capacity();
if (current_size == current_capacity) if (current_size == current_capacity)
+19 -22
View File
@@ -68,7 +68,7 @@ template <typename EdgeDataT> class DynamicGraph
} }
template <typename... Ts> template <typename... Ts>
InputEdge(NodeIterator source, NodeIterator target, Ts &&...data) InputEdge(NodeIterator source, NodeIterator target, Ts &&... data)
: source(source), target(target), data(std::forward<Ts>(data)...) : source(source), target(target), data(std::forward<Ts>(data)...)
{ {
} }
@@ -189,28 +189,25 @@ template <typename EdgeDataT> class DynamicGraph
other.node_array.resize(node_array.size()); other.node_array.resize(node_array.size());
NodeID node_id = 0; NodeID node_id = 0;
std::transform(node_array.begin(), std::transform(
node_array.end(), node_array.begin(), node_array.end(), other.node_array.begin(), [&](const Node &node) {
other.node_array.begin(), const EdgeIterator first_edge = other.edge_list.size();
[&](const Node &node)
{
const EdgeIterator first_edge = other.edge_list.size();
BOOST_ASSERT(node_id < number_of_nodes); BOOST_ASSERT(node_id < number_of_nodes);
if (filter(node_id++)) if (filter(node_id++))
{ {
std::copy_if(edge_list.begin() + node.first_edge, std::copy_if(edge_list.begin() + node.first_edge,
edge_list.begin() + node.first_edge + node.edges, edge_list.begin() + node.first_edge + node.edges,
std::back_inserter(other.edge_list), std::back_inserter(other.edge_list),
[&](const auto &edge) { return filter(edge.target); }); [&](const auto &edge) { return filter(edge.target); });
const unsigned num_edges = other.edge_list.size() - first_edge; const unsigned num_edges = other.edge_list.size() - first_edge;
return Node{first_edge, num_edges}; return Node{first_edge, num_edges};
} }
else else
{ {
return Node{first_edge, 0}; return Node{first_edge, 0};
} }
}); });
return other; return other;
} }
+3 -3
View File
@@ -37,9 +37,9 @@ class FilteredGraphImpl<util::StaticGraph<EdgeDataT, Ownership>, Ownership>
unsigned GetOutDegree(const NodeIterator n) const unsigned GetOutDegree(const NodeIterator n) const
{ {
auto range = graph.GetAdjacentEdgeRange(n); auto range = graph.GetAdjacentEdgeRange(n);
return std::count_if(range.begin(), return std::count_if(range.begin(), range.end(), [this](const EdgeIterator edge) {
range.end(), return edge_filter[edge];
[this](const EdgeIterator edge) { return edge_filter[edge]; }); });
} }
inline NodeIterator GetTarget(const EdgeIterator e) const inline NodeIterator GetTarget(const EdgeIterator e) const
+1 -2
View File
@@ -33,8 +33,7 @@ struct FingerPrint
static_assert(sizeof(FingerPrint) == 8, "FingerPrint has unexpected size"); static_assert(sizeof(FingerPrint) == 8, "FingerPrint has unexpected size");
static_assert(std::is_trivial<FingerPrint>::value, "FingerPrint needs to be trivial."); static_assert(std::is_trivial<FingerPrint>::value, "FingerPrint needs to be trivial.");
static_assert(std::is_standard_layout<FingerPrint>::value, static_assert(std::is_pod<FingerPrint>::value, "FingerPrint needs to be a POD.");
"FingerPrint needs have a standard layout.");
} // namespace osrm::util } // namespace osrm::util
#endif /* FingerPrint_H */ #endif /* FingerPrint_H */
+3 -3
View File
@@ -58,7 +58,7 @@ class GeojsonLogger
} }
// writes a single feature into the Geojson file // writes a single feature into the Geojson file
template <typename... Args> static bool Write(Args &&...args) template <typename... Args> static bool Write(Args &&... args)
{ {
// make sure to syncronize logging output, our writing should be sequential // make sure to syncronize logging output, our writing should be sequential
std::lock_guard<std::mutex> guard(lock); std::lock_guard<std::mutex> guard(lock);
@@ -146,7 +146,7 @@ class ScopedGeojsonLoggerGuard
{ {
public: public:
template <typename... Args> template <typename... Args>
ScopedGeojsonLoggerGuard(const std::string &logfile, Args &&...args) ScopedGeojsonLoggerGuard(const std::string &logfile, Args &&... args)
: policy(std::forward<Args>(args)...) : policy(std::forward<Args>(args)...)
{ {
GeojsonLogger<geojson_conversion_policy, scenario>::Open(logfile); GeojsonLogger<geojson_conversion_policy, scenario>::Open(logfile);
@@ -159,7 +159,7 @@ class ScopedGeojsonLoggerGuard
GeojsonLogger<geojson_conversion_policy, scenario>::SetPolicy(nullptr); GeojsonLogger<geojson_conversion_policy, scenario>::SetPolicy(nullptr);
} }
template <typename... Args> static bool Write(Args &&...args) template <typename... Args> static bool Write(Args &&... args)
{ {
return GeojsonLogger<geojson_conversion_policy, scenario>::Write( return GeojsonLogger<geojson_conversion_policy, scenario>::Write(
std::forward<Args>(args)...); std::forward<Args>(args)...);
+8 -10
View File
@@ -63,16 +63,14 @@ template <typename StringView> inline auto decompose(const StringView &lhs, cons
auto const lcs = longest_common_substring(lhs, rhs); auto const lcs = longest_common_substring(lhs, rhs);
// trim spaces, transform to lower // trim spaces, transform to lower
const auto trim = [](StringView view) const auto trim = [](StringView view) {
{
// we compare suffixes based on this value, it might break UTF chars, but as long as we are // we compare suffixes based on this value, it might break UTF chars, but as long as we are
// consistent in handling, we do not create bad results // consistent in handling, we do not create bad results
std::string str; std::string str;
str.reserve(view.size()); str.reserve(view.size());
std::transform(view.begin(), std::transform(view.begin(), view.end(), std::back_inserter(str), [](unsigned char c) {
view.end(), return std::tolower(c);
std::back_inserter(str), });
[](unsigned char c) { return std::tolower(c); });
auto front = str.find_first_not_of(' '); auto front = str.find_first_not_of(' ');
if (front == std::string::npos) if (front == std::string::npos)
@@ -133,13 +131,13 @@ inline bool requiresNameAnnounced(const StringView &from_name,
const auto checkForPrefixOrSuffixChange = [](const std::string_view first, const auto checkForPrefixOrSuffixChange = [](const std::string_view first,
const std::string_view second, const std::string_view second,
const SuffixTable &suffix_table) const SuffixTable &suffix_table) {
{
std::string first_prefix, first_suffix, second_prefix, second_suffix; std::string first_prefix, first_suffix, second_prefix, second_suffix;
std::tie(first_prefix, first_suffix, second_prefix, second_suffix) = std::tie(first_prefix, first_suffix, second_prefix, second_suffix) =
decompose(first, second); decompose(first, second);
const auto checkTable = [&](const std::string &str) const auto checkTable = [&](const std::string &str) {
{ return str.empty() || suffix_table.isSuffix(str); }; return str.empty() || suffix_table.isSuffix(str);
};
return checkTable(first_prefix) && checkTable(first_suffix) && checkTable(second_prefix) && return checkTable(first_prefix) && checkTable(first_suffix) && checkTable(second_prefix) &&
checkTable(second_suffix); checkTable(second_suffix);

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