Merge branch 'master' into sf-ranges
This commit is contained in:
		
						commit
						015ba69f3e
					
				
							
								
								
									
										104
									
								
								.github/workflows/osrm-backend.yml
									
									
									
									
										vendored
									
									
								
							
							
						
						
									
										104
									
								
								.github/workflows/osrm-backend.yml
									
									
									
									
										vendored
									
									
								
							@ -446,14 +446,14 @@ jobs:
 | 
				
			|||||||
      if: steps.cache-boost.outputs.cache-hit != 'true' && runner.os == 'Linux' && matrix.ENABLE_CONAN != 'ON'
 | 
					      if: steps.cache-boost.outputs.cache-hit != 'true' && runner.os == 'Linux' && matrix.ENABLE_CONAN != 'ON'
 | 
				
			||||||
      run: |
 | 
					      run: |
 | 
				
			||||||
        BOOST_VERSION="1.85.0"
 | 
					        BOOST_VERSION="1.85.0"
 | 
				
			||||||
        BOOST_VERSION_UNDERSCORE="${BOOST_VERSION//./_}"
 | 
					        BOOST_VERSION_FLAVOR="${BOOST_VERSION}-b2-nodocs"
 | 
				
			||||||
        wget -q https://boostorg.jfrog.io/artifactory/main/release/${BOOST_VERSION}/source/boost_${BOOST_VERSION_UNDERSCORE}.tar.gz
 | 
					        wget -q https://github.com/boostorg/boost/releases/download/boost-${BOOST_VERSION}/boost-${BOOST_VERSION_FLAVOR}.tar.gz
 | 
				
			||||||
        tar xzf boost_${BOOST_VERSION_UNDERSCORE}.tar.gz
 | 
					        tar xzf boost-${BOOST_VERSION_FLAVOR}.tar.gz
 | 
				
			||||||
        cd boost_${BOOST_VERSION_UNDERSCORE}
 | 
					        cd boost-${BOOST_VERSION}
 | 
				
			||||||
        sudo ./bootstrap.sh
 | 
					        sudo ./bootstrap.sh
 | 
				
			||||||
        sudo ./b2 install
 | 
					        sudo ./b2 install
 | 
				
			||||||
        cd ..
 | 
					        cd ..
 | 
				
			||||||
        sudo rm -rf boost_${BOOST_VERSION_UNDERSCORE}*
 | 
					        sudo rm -rf boost-${BOOST_VERSION}*
 | 
				
			||||||
    
 | 
					    
 | 
				
			||||||
    - name: Install dev dependencies
 | 
					    - name: Install dev dependencies
 | 
				
			||||||
      run: |
 | 
					      run: |
 | 
				
			||||||
@ -502,6 +502,13 @@ jobs:
 | 
				
			|||||||
 | 
					
 | 
				
			||||||
        conan config init
 | 
					        conan config init
 | 
				
			||||||
        yq eval '.compiler.clang.version += ["18"]' -i "$HOME/.conan/settings.yml"
 | 
					        yq eval '.compiler.clang.version += ["18"]' -i "$HOME/.conan/settings.yml"
 | 
				
			||||||
 | 
					    - name: Add Apple-clang 16 to list of Conan compilers # workaround for the issue that Conan 1.x doesn't know about Apple-clang 16
 | 
				
			||||||
 | 
					      if: ${{ matrix.ENABLE_CONAN == 'ON' && matrix.runs-on == 'macos-14' }}
 | 
				
			||||||
 | 
					      run: |
 | 
				
			||||||
 | 
					        sudo wget https://github.com/mikefarah/yq/releases/download/v4.9.6/yq_darwin_arm64 -O /usr/local/bin/yq && sudo chmod +x /usr/local/bin/yq
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					        conan config init
 | 
				
			||||||
 | 
					        yq eval '.compiler.apple-clang.version += ["16.0"]' -i "$HOME/.conan/settings.yml"
 | 
				
			||||||
    - name: Prepare build
 | 
					    - name: Prepare build
 | 
				
			||||||
      run: |
 | 
					      run: |
 | 
				
			||||||
        mkdir ${OSRM_BUILD_DIR}
 | 
					        mkdir ${OSRM_BUILD_DIR}
 | 
				
			||||||
@ -653,7 +660,7 @@ jobs:
 | 
				
			|||||||
  benchmarks:
 | 
					  benchmarks:
 | 
				
			||||||
    if: github.event_name == 'pull_request'
 | 
					    if: github.event_name == 'pull_request'
 | 
				
			||||||
    needs: [format-taginfo-docs]
 | 
					    needs: [format-taginfo-docs]
 | 
				
			||||||
    runs-on: ubuntu-24.04
 | 
					    runs-on: self-hosted
 | 
				
			||||||
    env:
 | 
					    env:
 | 
				
			||||||
      CCOMPILER: clang-16
 | 
					      CCOMPILER: clang-16
 | 
				
			||||||
      CXXCOMPILER: clang++-16
 | 
					      CXXCOMPILER: clang++-16
 | 
				
			||||||
@ -664,37 +671,17 @@ jobs:
 | 
				
			|||||||
      GITHUB_REPOSITORY: ${{ github.repository }}
 | 
					      GITHUB_REPOSITORY: ${{ github.repository }}
 | 
				
			||||||
      RUN_BIG_BENCHMARK: ${{ contains(github.event.pull_request.labels.*.name, 'Performance') }}
 | 
					      RUN_BIG_BENCHMARK: ${{ contains(github.event.pull_request.labels.*.name, 'Performance') }}
 | 
				
			||||||
    steps: 
 | 
					    steps: 
 | 
				
			||||||
      - name: Enable data.osm.pbf cache
 | 
					 | 
				
			||||||
        if: ${{ ! env.RUN_BIG_BENCHMARK }}        
 | 
					 | 
				
			||||||
        uses: actions/cache@v4
 | 
					 | 
				
			||||||
        with:
 | 
					 | 
				
			||||||
          path: ~/data.osm.pbf
 | 
					 | 
				
			||||||
          key: v1-data-osm-pbf
 | 
					 | 
				
			||||||
          restore-keys: |
 | 
					 | 
				
			||||||
            v1-data-osm-pbf
 | 
					 | 
				
			||||||
      - name: Enable compiler cache
 | 
					 | 
				
			||||||
        uses: actions/cache@v4
 | 
					 | 
				
			||||||
        with:
 | 
					 | 
				
			||||||
          path: ~/.ccache
 | 
					 | 
				
			||||||
          key: v1-ccache-benchmarks-${{ github.sha }}
 | 
					 | 
				
			||||||
          restore-keys: |
 | 
					 | 
				
			||||||
            v1-ccache-benchmarks-
 | 
					 | 
				
			||||||
      - name: Enable Conan cache
 | 
					 | 
				
			||||||
        uses: actions/cache@v4
 | 
					 | 
				
			||||||
        with:
 | 
					 | 
				
			||||||
          path: ~/.conan
 | 
					 | 
				
			||||||
          key: v1-conan-benchmarks-${{ github.sha }}
 | 
					 | 
				
			||||||
          restore-keys: |
 | 
					 | 
				
			||||||
            v1-conan-benchmarks-
 | 
					 | 
				
			||||||
      - name: Checkout PR Branch
 | 
					      - name: Checkout PR Branch
 | 
				
			||||||
        uses: actions/checkout@v4
 | 
					        uses: actions/checkout@v4
 | 
				
			||||||
        with:
 | 
					        with:
 | 
				
			||||||
          ref: ${{ github.head_ref }}
 | 
					          ref: ${{ github.head_ref }}
 | 
				
			||||||
          path: pr
 | 
					          path: pr
 | 
				
			||||||
      - name: Install dependencies
 | 
					      - name: Activate virtualenv
 | 
				
			||||||
        run: |
 | 
					        run: |
 | 
				
			||||||
          python3 -m pip install "conan<2.0.0" "requests==2.31.0" "numpy==1.26.4" --break-system-packages
 | 
					          python3 -m venv .venv
 | 
				
			||||||
          sudo apt-get update -y && sudo apt-get install ccache
 | 
					          source .venv/bin/activate
 | 
				
			||||||
 | 
					          echo PATH=$PATH >> $GITHUB_ENV
 | 
				
			||||||
 | 
					          pip install "conan<2.0.0" "requests==2.31.0" "numpy==1.26.4" 
 | 
				
			||||||
      - name: Prepare data
 | 
					      - name: Prepare data
 | 
				
			||||||
        run: |
 | 
					        run: |
 | 
				
			||||||
          if [ "$RUN_BIG_BENCHMARK" = "true" ]; then
 | 
					          if [ "$RUN_BIG_BENCHMARK" = "true" ]; then
 | 
				
			||||||
@ -722,50 +709,67 @@ jobs:
 | 
				
			|||||||
          path: base
 | 
					          path: base
 | 
				
			||||||
      - name: Build Base Branch
 | 
					      - name: Build Base Branch
 | 
				
			||||||
        run: |
 | 
					        run: |
 | 
				
			||||||
 | 
					          cd base
 | 
				
			||||||
 | 
					          npm ci --ignore-scripts
 | 
				
			||||||
 | 
					          cd ..
 | 
				
			||||||
          mkdir base/build
 | 
					          mkdir base/build
 | 
				
			||||||
          cd base/build
 | 
					          cd base/build
 | 
				
			||||||
          cmake -DENABLE_CONAN=ON -DCMAKE_BUILD_TYPE=Release ..
 | 
					          cmake -DENABLE_CONAN=ON -DCMAKE_BUILD_TYPE=Release -DENABLE_NODE_BINDINGS=ON ..
 | 
				
			||||||
          make -j$(nproc)
 | 
					          make -j$(nproc)
 | 
				
			||||||
          make -j$(nproc) benchmarks
 | 
					          make -j$(nproc) benchmarks
 | 
				
			||||||
          cd ..
 | 
					          cd ..
 | 
				
			||||||
          make -C test/data 
 | 
					          make -C test/data 
 | 
				
			||||||
      - name: Build PR Branch
 | 
					      - name: Build PR Branch
 | 
				
			||||||
        run: |
 | 
					        run: |
 | 
				
			||||||
 | 
					          cd pr
 | 
				
			||||||
 | 
					          npm ci --ignore-scripts
 | 
				
			||||||
 | 
					          cd ..
 | 
				
			||||||
          mkdir -p pr/build
 | 
					          mkdir -p pr/build
 | 
				
			||||||
          cd pr/build
 | 
					          cd pr/build
 | 
				
			||||||
          cmake -DENABLE_CONAN=ON -DCMAKE_BUILD_TYPE=Release ..
 | 
					          cmake -DENABLE_CONAN=ON -DCMAKE_BUILD_TYPE=Release -DENABLE_NODE_BINDINGS=ON ..
 | 
				
			||||||
          make -j$(nproc) 
 | 
					          make -j$(nproc) 
 | 
				
			||||||
          make -j$(nproc) benchmarks
 | 
					          make -j$(nproc) benchmarks
 | 
				
			||||||
          cd ..
 | 
					          cd ..
 | 
				
			||||||
          make -C test/data 
 | 
					          make -C test/data 
 | 
				
			||||||
      # we run benchmarks in tmpfs to avoid impact of disk IO
 | 
					      # we run benchmarks in tmpfs to avoid impact of disk IO
 | 
				
			||||||
      - name: Create folder for tmpfs 
 | 
					      - name: Create folder for tmpfs 
 | 
				
			||||||
        run: mkdir -p /opt/benchmarks
 | 
					        run: |
 | 
				
			||||||
 | 
					          # if by any chance it was mounted before(e.g. due to previous job failed), unmount it
 | 
				
			||||||
 | 
					          sudo umount ~/benchmarks | true
 | 
				
			||||||
 | 
					          rm -rf ~/benchmarks 
 | 
				
			||||||
 | 
					          mkdir -p ~/benchmarks
 | 
				
			||||||
 | 
					      # see https://llvm.org/docs/Benchmarking.html
 | 
				
			||||||
      - name: Run PR Benchmarks 
 | 
					      - name: Run PR Benchmarks 
 | 
				
			||||||
        run: |
 | 
					        run: |
 | 
				
			||||||
          sudo mount -t tmpfs -o size=4g none /opt/benchmarks
 | 
					          sudo cset shield -c 2-3 -k on
 | 
				
			||||||
          cp -rf pr/build /opt/benchmarks/build
 | 
					          sudo mount -t tmpfs -o size=4g none ~/benchmarks
 | 
				
			||||||
          mkdir -p /opt/benchmarks/test
 | 
					          cp -rf pr/build ~/benchmarks/build
 | 
				
			||||||
          cp -rf pr/test/data /opt/benchmarks/test/data
 | 
					          cp -rf pr/lib ~/benchmarks/lib
 | 
				
			||||||
          cp -rf pr/profiles /opt/benchmarks/profiles
 | 
					          mkdir -p ~/benchmarks/test
 | 
				
			||||||
 | 
					          cp -rf pr/test/data ~/benchmarks/test/data
 | 
				
			||||||
 | 
					          cp -rf pr/profiles ~/benchmarks/profiles
 | 
				
			||||||
 | 
					
 | 
				
			||||||
          ./pr/scripts/ci/run_benchmarks.sh -f /opt/benchmarks -r $(pwd)/pr_results -s $(pwd)/pr -b /opt/benchmarks/build -o ~/data.osm.pbf -g ~/gps_traces.csv
 | 
					          sudo cset shield --exec -- ./pr/scripts/ci/run_benchmarks.sh -f ~/benchmarks -r $(pwd)/pr_results -s $(pwd)/pr -b ~/benchmarks/build -o ~/data.osm.pbf -g ~/gps_traces.csv
 | 
				
			||||||
          sudo umount /opt/benchmarks
 | 
					          sudo umount ~/benchmarks
 | 
				
			||||||
 | 
					          sudo cset shield --reset
 | 
				
			||||||
      - name: Run Base Benchmarks
 | 
					      - name: Run Base Benchmarks
 | 
				
			||||||
        run: |
 | 
					        run: |
 | 
				
			||||||
          sudo mount -t tmpfs -o size=4g none /opt/benchmarks
 | 
					          sudo cset shield -c 2-3 -k on
 | 
				
			||||||
          cp -rf base/build /opt/benchmarks/build
 | 
					          sudo mount -t tmpfs -o size=4g none ~/benchmarks
 | 
				
			||||||
          mkdir -p /opt/benchmarks/test
 | 
					          cp -rf base/build ~/benchmarks/build
 | 
				
			||||||
          cp -rf base/test/data /opt/benchmarks/test/data
 | 
					          cp -rf base/lib ~/benchmarks/lib
 | 
				
			||||||
          cp -rf base/profiles /opt/benchmarks/profiles
 | 
					          mkdir -p ~/benchmarks/test
 | 
				
			||||||
 | 
					          cp -rf base/test/data ~/benchmarks/test/data
 | 
				
			||||||
 | 
					          cp -rf base/profiles ~/benchmarks/profiles
 | 
				
			||||||
 | 
					
 | 
				
			||||||
          # TODO: remove it when base branch will have this file at needed location
 | 
					          # TODO: remove it when base branch will have this file at needed location
 | 
				
			||||||
          if [ ! -f /opt/benchmarks/test/data/portugal_to_korea.json ]; then
 | 
					          if [ ! -f ~/benchmarks/test/data/portugal_to_korea.json ]; then
 | 
				
			||||||
            cp base/src/benchmarks/portugal_to_korea.json /opt/benchmarks/test/data/portugal_to_korea.json
 | 
					            cp base/src/benchmarks/portugal_to_korea.json ~/benchmarks/test/data/portugal_to_korea.json
 | 
				
			||||||
          fi
 | 
					          fi
 | 
				
			||||||
          # we intentionally use scripts from PR branch to be able to update them and see results in the same PR
 | 
					          # we intentionally use scripts from PR branch to be able to update them and see results in the same PR
 | 
				
			||||||
          ./pr/scripts/ci/run_benchmarks.sh -f /opt/benchmarks -r $(pwd)/base_results -s $(pwd)/pr -b /opt/benchmarks/build -o ~/data.osm.pbf -g ~/gps_traces.csv
 | 
					          sudo cset shield --exec -- cset shield --exec -- ./pr/scripts/ci/run_benchmarks.sh -f ~/benchmarks -r $(pwd)/base_results -s $(pwd)/pr -b ~/benchmarks/build -o ~/data.osm.pbf -g ~/gps_traces.csv
 | 
				
			||||||
          sudo umount /opt/benchmarks
 | 
					          sudo umount ~/benchmarks
 | 
				
			||||||
 | 
					          sudo cset shield --reset
 | 
				
			||||||
      - name: Post Benchmark Results
 | 
					      - name: Post Benchmark Results
 | 
				
			||||||
        run: |
 | 
					        run: |
 | 
				
			||||||
          python3 pr/scripts/ci/post_benchmark_results.py base_results pr_results
 | 
					          python3 pr/scripts/ci/post_benchmark_results.py base_results pr_results
 | 
				
			||||||
 | 
				
			|||||||
@ -1,6 +1,7 @@
 | 
				
			|||||||
# Unreleased
 | 
					# Unreleased
 | 
				
			||||||
  - Changes from 5.27.1
 | 
					  - Changes from 5.27.1
 | 
				
			||||||
    - Features
 | 
					    - Features
 | 
				
			||||||
 | 
					      - ADDED: Route pedestrians over highway=platform [#6993](https://github.com/Project-OSRM/osrm-backend/pull/6993)
 | 
				
			||||||
      - REMOVED: Remove all core-CH left-overs [#6920](https://github.com/Project-OSRM/osrm-backend/pull/6920)
 | 
					      - REMOVED: Remove all core-CH left-overs [#6920](https://github.com/Project-OSRM/osrm-backend/pull/6920)
 | 
				
			||||||
      - ADDED: Add support for a keepalive_timeout flag. [#6674](https://github.com/Project-OSRM/osrm-backend/pull/6674)
 | 
					      - ADDED: Add support for a keepalive_timeout flag. [#6674](https://github.com/Project-OSRM/osrm-backend/pull/6674)
 | 
				
			||||||
      - ADDED: Add support for a default_radius flag. [#6575](https://github.com/Project-OSRM/osrm-backend/pull/6575)
 | 
					      - ADDED: Add support for a default_radius flag. [#6575](https://github.com/Project-OSRM/osrm-backend/pull/6575)
 | 
				
			||||||
@ -24,6 +25,7 @@
 | 
				
			|||||||
    - NodeJS:
 | 
					    - NodeJS:
 | 
				
			||||||
      - CHANGED: Use node-api instead of NAN. [#6452](https://github.com/Project-OSRM/osrm-backend/pull/6452)
 | 
					      - CHANGED: Use node-api instead of NAN. [#6452](https://github.com/Project-OSRM/osrm-backend/pull/6452)
 | 
				
			||||||
    - Misc:
 | 
					    - Misc:
 | 
				
			||||||
 | 
					      - CHANGED: Use std::string_view for key type in json::Object. [#7062](https://github.com/Project-OSRM/osrm-backend/pull/7062)
 | 
				
			||||||
      - CHANGED: Use thread_local instead of boost::thread_specific_ptr. [#6991](https://github.com/Project-OSRM/osrm-backend/pull/6991)
 | 
					      - CHANGED: Use thread_local instead of boost::thread_specific_ptr. [#6991](https://github.com/Project-OSRM/osrm-backend/pull/6991)
 | 
				
			||||||
      - CHANGED: Bump flatbuffers to v24.3.25 version. [#6988](https://github.com/Project-OSRM/osrm-backend/pull/6988)
 | 
					      - CHANGED: Bump flatbuffers to v24.3.25 version. [#6988](https://github.com/Project-OSRM/osrm-backend/pull/6988)
 | 
				
			||||||
      - CHANGED: Add .reserve(...) to assembleGeometry function. [#6983](https://github.com/Project-OSRM/osrm-backend/pull/6983)
 | 
					      - CHANGED: Add .reserve(...) to assembleGeometry function. [#6983](https://github.com/Project-OSRM/osrm-backend/pull/6983)
 | 
				
			||||||
@ -78,6 +80,7 @@
 | 
				
			|||||||
      - ADDED: Extract prerelease/build information from package semver [#6839](https://github.com/Project-OSRM/osrm-backend/pull/6839)
 | 
					      - ADDED: Extract prerelease/build information from package semver [#6839](https://github.com/Project-OSRM/osrm-backend/pull/6839)
 | 
				
			||||||
    - Profiles:
 | 
					    - Profiles:
 | 
				
			||||||
      - FIXED: Bicycle and foot profiles now don't route on proposed ways [#6615](https://github.com/Project-OSRM/osrm-backend/pull/6615)
 | 
					      - FIXED: Bicycle and foot profiles now don't route on proposed ways [#6615](https://github.com/Project-OSRM/osrm-backend/pull/6615)
 | 
				
			||||||
 | 
					      - ADDED: Add optional support of cargo bike exclusion and width to bicyle profile [#7044](https://github.com/Project-OSRM/osrm-backend/pull/7044)
 | 
				
			||||||
    - Routing:
 | 
					    - Routing:
 | 
				
			||||||
      - FIXED: Fix adding traffic signal penalties during compression [#6419](https://github.com/Project-OSRM/osrm-backend/pull/6419)
 | 
					      - FIXED: Fix adding traffic signal penalties during compression [#6419](https://github.com/Project-OSRM/osrm-backend/pull/6419)
 | 
				
			||||||
      - FIXED: Correctly handle compressed traffic signals. [#6724](https://github.com/Project-OSRM/osrm-backend/pull/6724)
 | 
					      - FIXED: Correctly handle compressed traffic signals. [#6724](https://github.com/Project-OSRM/osrm-backend/pull/6724)
 | 
				
			||||||
 | 
				
			|||||||
@ -56,6 +56,9 @@ endif()
 | 
				
			|||||||
if (POLICY CMP0074)
 | 
					if (POLICY CMP0074)
 | 
				
			||||||
  cmake_policy(SET CMP0074 NEW)
 | 
					  cmake_policy(SET CMP0074 NEW)
 | 
				
			||||||
endif()
 | 
					endif()
 | 
				
			||||||
 | 
					if (POLICY CMP0167)
 | 
				
			||||||
 | 
					  cmake_policy(SET CMP0167 NEW)
 | 
				
			||||||
 | 
					endif()
 | 
				
			||||||
project(OSRM C CXX)
 | 
					project(OSRM C CXX)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
				
			|||||||
@ -1,20 +1,34 @@
 | 
				
			|||||||
FROM alpine:3.20.0 as alpine-mimalloc
 | 
					FROM alpine:3.21.2 AS alpine-mimalloc
 | 
				
			||||||
 | 
					
 | 
				
			||||||
RUN apk add --no-cache mimalloc
 | 
					RUN apk update && \
 | 
				
			||||||
 | 
					    apk upgrade && \
 | 
				
			||||||
 | 
					    apk add --no-cache \
 | 
				
			||||||
 | 
					        boost-iostreams \
 | 
				
			||||||
 | 
					        boost-program_options \
 | 
				
			||||||
 | 
					        boost-thread \
 | 
				
			||||||
 | 
					        mimalloc
 | 
				
			||||||
 | 
					
 | 
				
			||||||
ENV LD_PRELOAD=/usr/lib/libmimalloc.so.2
 | 
					ENV LD_PRELOAD=/usr/lib/libmimalloc.so.2
 | 
				
			||||||
ENV MIMALLOC_LARGE_OS_PAGES=1
 | 
					ENV MIMALLOC_LARGE_OS_PAGES=1
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					
 | 
				
			||||||
FROM alpine-mimalloc as builder
 | 
					FROM alpine-mimalloc AS builder
 | 
				
			||||||
ARG DOCKER_TAG
 | 
					ARG DOCKER_TAG
 | 
				
			||||||
ARG BUILD_CONCURRENCY
 | 
					ARG BUILD_CONCURRENCY
 | 
				
			||||||
RUN mkdir -p /src  && mkdir -p /opt
 | 
					 | 
				
			||||||
 | 
					
 | 
				
			||||||
RUN apk add --no-cache \
 | 
					RUN mkdir -p /src /opt && \
 | 
				
			||||||
    cmake make git clang libbz2 libxml2 \
 | 
					    apk add --no-cache \
 | 
				
			||||||
    boost-dev boost-program_options boost-filesystem boost-iostreams boost-thread \
 | 
					    boost-dev \
 | 
				
			||||||
    lua5.4-dev onetbb-dev expat-dev
 | 
					    boost-filesystem \
 | 
				
			||||||
 | 
					    clang \
 | 
				
			||||||
 | 
					    cmake \
 | 
				
			||||||
 | 
					    expat-dev \
 | 
				
			||||||
 | 
					    git \
 | 
				
			||||||
 | 
					    libbz2 \
 | 
				
			||||||
 | 
					    libxml2 \
 | 
				
			||||||
 | 
					    lua5.4-dev \
 | 
				
			||||||
 | 
					    make \
 | 
				
			||||||
 | 
					    onetbb-dev
 | 
				
			||||||
 | 
					
 | 
				
			||||||
COPY . /src
 | 
					COPY . /src
 | 
				
			||||||
WORKDIR /src
 | 
					WORKDIR /src
 | 
				
			||||||
@ -39,16 +53,18 @@ RUN NPROC=${BUILD_CONCURRENCY:-$(nproc)} && \
 | 
				
			|||||||
    rm -rf /src
 | 
					    rm -rf /src
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					
 | 
				
			||||||
# Multistage build to reduce image size - https://docs.docker.com/engine/userguide/eng-image/multistage-build/#use-multi-stage-builds
 | 
					# Multistage build to reduce image size - https://docs.docker.com/build/building/multi-stage/#use-multi-stage-builds
 | 
				
			||||||
# Only the content below ends up in the image, this helps remove /src from the image (which is large)
 | 
					# Only the content below ends up in the image, this helps remove /src from the image (which is large)
 | 
				
			||||||
FROM alpine-mimalloc as runstage
 | 
					FROM alpine-mimalloc AS runstage
 | 
				
			||||||
 | 
					
 | 
				
			||||||
COPY --from=builder /usr/local /usr/local
 | 
					COPY --from=builder /usr/local /usr/local
 | 
				
			||||||
COPY --from=builder /opt /opt
 | 
					COPY --from=builder /opt /opt
 | 
				
			||||||
 | 
					
 | 
				
			||||||
RUN apk add --no-cache \
 | 
					RUN apk add --no-cache \
 | 
				
			||||||
    boost-program_options boost-date_time boost-iostreams boost-thread \
 | 
					    boost-date_time \
 | 
				
			||||||
    expat lua5.4 onetbb && \
 | 
					    expat \
 | 
				
			||||||
 | 
					    lua5.4 \
 | 
				
			||||||
 | 
					    onetbb && \
 | 
				
			||||||
    ldconfig /usr/local/lib
 | 
					    ldconfig /usr/local/lib
 | 
				
			||||||
 | 
					
 | 
				
			||||||
RUN /usr/local/bin/osrm-extract --help && \
 | 
					RUN /usr/local/bin/osrm-extract --help && \
 | 
				
			||||||
@ -60,3 +76,4 @@ RUN /usr/local/bin/osrm-extract --help && \
 | 
				
			|||||||
WORKDIR /opt
 | 
					WORKDIR /opt
 | 
				
			||||||
 | 
					
 | 
				
			||||||
EXPOSE 5000
 | 
					EXPOSE 5000
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
				
			|||||||
@ -1,21 +1,24 @@
 | 
				
			|||||||
FROM debian:bookworm-slim as builder
 | 
					FROM debian:bookworm-slim AS builder
 | 
				
			||||||
ARG DOCKER_TAG
 | 
					ARG DOCKER_TAG
 | 
				
			||||||
ARG BUILD_CONCURRENCY
 | 
					ARG BUILD_CONCURRENCY
 | 
				
			||||||
RUN mkdir -p /src  && mkdir -p /opt
 | 
					 | 
				
			||||||
 | 
					
 | 
				
			||||||
RUN apt-get update && \
 | 
					RUN mkdir -p /src /opt && \
 | 
				
			||||||
    apt-get -y --no-install-recommends install ca-certificates cmake make git gcc g++ libbz2-dev libxml2-dev wget \
 | 
					    apt-get update && \
 | 
				
			||||||
    libzip-dev libboost1.81-all-dev lua5.4 liblua5.4-dev pkg-config -o APT::Install-Suggests=0 -o APT::Install-Recommends=0
 | 
					    apt-get -y --no-install-recommends --no-install-suggests install \
 | 
				
			||||||
 | 
					        ca-certificates \
 | 
				
			||||||
RUN NPROC=${BUILD_CONCURRENCY:-$(nproc)} && \
 | 
					        cmake \
 | 
				
			||||||
    ldconfig /usr/local/lib && \
 | 
					        g++ \
 | 
				
			||||||
    git clone --branch v2021.12.0 --single-branch https://github.com/oneapi-src/oneTBB.git && \
 | 
					        gcc \
 | 
				
			||||||
    cd oneTBB && \
 | 
					        git \
 | 
				
			||||||
    mkdir build && \
 | 
					        libboost1.81-all-dev \
 | 
				
			||||||
    cd build && \
 | 
					        libbz2-dev \
 | 
				
			||||||
    cmake -DTBB_TEST=OFF -DCMAKE_BUILD_TYPE=Release ..  && \
 | 
					        liblua5.4-dev \
 | 
				
			||||||
    cmake --build . && \
 | 
					        libtbb-dev \
 | 
				
			||||||
    cmake --install .
 | 
					        libxml2-dev \
 | 
				
			||||||
 | 
					        libzip-dev \
 | 
				
			||||||
 | 
					        lua5.4 \
 | 
				
			||||||
 | 
					        make \
 | 
				
			||||||
 | 
					        pkg-config
 | 
				
			||||||
 | 
					
 | 
				
			||||||
COPY . /src
 | 
					COPY . /src
 | 
				
			||||||
WORKDIR /src
 | 
					WORKDIR /src
 | 
				
			||||||
@ -41,19 +44,24 @@ RUN NPROC=${BUILD_CONCURRENCY:-$(nproc)} && \
 | 
				
			|||||||
    rm -rf /src
 | 
					    rm -rf /src
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					
 | 
				
			||||||
# Multistage build to reduce image size - https://docs.docker.com/engine/userguide/eng-image/multistage-build/#use-multi-stage-builds
 | 
					# Multistage build to reduce image size - https://docs.docker.com/build/building/multi-stage/#use-multi-stage-builds
 | 
				
			||||||
# Only the content below ends up in the image, this helps remove /src from the image (which is large)
 | 
					# Only the content below ends up in the image, this helps remove /src from the image (which is large)
 | 
				
			||||||
FROM debian:bookworm-slim as runstage
 | 
					FROM debian:bookworm-slim AS runstage
 | 
				
			||||||
 | 
					
 | 
				
			||||||
COPY --from=builder /usr/local /usr/local
 | 
					COPY --from=builder /usr/local /usr/local
 | 
				
			||||||
COPY --from=builder /opt /opt
 | 
					COPY --from=builder /opt /opt
 | 
				
			||||||
 | 
					
 | 
				
			||||||
RUN apt-get update && \
 | 
					RUN apt-get update && \
 | 
				
			||||||
    apt-get install -y --no-install-recommends \
 | 
					    apt-get install -y --no-install-recommends --no-install-suggests \
 | 
				
			||||||
        libboost-program-options1.81.0 libboost-date-time1.81.0 libboost-iostreams1.81.0 libboost-thread1.81.0 \
 | 
					        expat \
 | 
				
			||||||
        expat liblua5.4-0 && \
 | 
					        libboost-date-time1.81.0 \
 | 
				
			||||||
 | 
					        libboost-iostreams1.81.0 \
 | 
				
			||||||
 | 
					        libboost-program-options1.81.0 \
 | 
				
			||||||
 | 
					        libboost-thread1.81.0 \
 | 
				
			||||||
 | 
					        liblua5.4-0 \
 | 
				
			||||||
 | 
					        libtbb12 && \
 | 
				
			||||||
    rm -rf /var/lib/apt/lists/* && \
 | 
					    rm -rf /var/lib/apt/lists/* && \
 | 
				
			||||||
# add /usr/local/lib to ldconfig to allow loading libraries from there
 | 
					# Add /usr/local/lib to ldconfig to allow loading libraries from there
 | 
				
			||||||
    ldconfig /usr/local/lib
 | 
					    ldconfig /usr/local/lib
 | 
				
			||||||
 | 
					
 | 
				
			||||||
RUN /usr/local/bin/osrm-extract --help && \
 | 
					RUN /usr/local/bin/osrm-extract --help && \
 | 
				
			||||||
@ -65,3 +73,4 @@ RUN /usr/local/bin/osrm-extract --help && \
 | 
				
			|||||||
WORKDIR /opt
 | 
					WORKDIR /opt
 | 
				
			||||||
 | 
					
 | 
				
			||||||
EXPOSE 5000
 | 
					EXPOSE 5000
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
				
			|||||||
@ -26,7 +26,15 @@ Feature: Foot - Access tags on ways
 | 
				
			|||||||
            | motorway | no     |      |       |
 | 
					            | motorway | no     |      |       |
 | 
				
			||||||
            | motorway | no     | yes  | x     |
 | 
					            | motorway | no     | yes  | x     |
 | 
				
			||||||
            | motorway | no     | no   |       |
 | 
					            | motorway | no     | no   |       |
 | 
				
			||||||
 | 
					            | platform |        |      | x     |
 | 
				
			||||||
 | 
					            | platform |        | yes  | x     |
 | 
				
			||||||
 | 
					            | platform |        | no   |       |
 | 
				
			||||||
 | 
					            | platform | yes    |      | x     |
 | 
				
			||||||
 | 
					            | platform | yes    | yes  | x     |
 | 
				
			||||||
 | 
					            | platform | yes    | no   |       |
 | 
				
			||||||
 | 
					            | platform | no     |      |       |
 | 
				
			||||||
 | 
					            | platform | no     | yes  | x     |
 | 
				
			||||||
 | 
					            | platform | no     | no   |       |
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    Scenario: Foot - Overwriting implied acccess on ways
 | 
					    Scenario: Foot - Overwriting implied acccess on ways
 | 
				
			||||||
        Then routability should be
 | 
					        Then routability should be
 | 
				
			||||||
 | 
				
			|||||||
@ -603,6 +603,8 @@ class ContiguousInternalMemoryDataFacadeBase : public BaseDataFacade
 | 
				
			|||||||
        auto found_range = std::equal_range(
 | 
					        auto found_range = std::equal_range(
 | 
				
			||||||
            m_maneuver_overrides.begin(), m_maneuver_overrides.end(), edge_based_node_id, Comp{});
 | 
					            m_maneuver_overrides.begin(), m_maneuver_overrides.end(), edge_based_node_id, Comp{});
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					        results.reserve(std::distance(found_range.first, found_range.second));
 | 
				
			||||||
 | 
					
 | 
				
			||||||
        std::for_each(found_range.first,
 | 
					        std::for_each(found_range.first,
 | 
				
			||||||
                      found_range.second,
 | 
					                      found_range.second,
 | 
				
			||||||
                      [&](const auto &override)
 | 
					                      [&](const auto &override)
 | 
				
			||||||
 | 
				
			|||||||
@ -30,7 +30,7 @@ struct V8Renderer
 | 
				
			|||||||
        {
 | 
					        {
 | 
				
			||||||
            Napi::Value child;
 | 
					            Napi::Value child;
 | 
				
			||||||
            std::visit(V8Renderer(env, child), keyValue.second);
 | 
					            std::visit(V8Renderer(env, child), keyValue.second);
 | 
				
			||||||
            obj.Set(keyValue.first, child);
 | 
					            obj.Set(keyValue.first.data(), child);
 | 
				
			||||||
        }
 | 
					        }
 | 
				
			||||||
        out = obj;
 | 
					        out = obj;
 | 
				
			||||||
    }
 | 
					    }
 | 
				
			||||||
 | 
				
			|||||||
@ -11,46 +11,6 @@ namespace osrm::util
 | 
				
			|||||||
namespace bearing
 | 
					namespace bearing
 | 
				
			||||||
{
 | 
					{
 | 
				
			||||||
 | 
					
 | 
				
			||||||
inline std::string get(const double heading)
 | 
					 | 
				
			||||||
{
 | 
					 | 
				
			||||||
    BOOST_ASSERT(heading >= 0);
 | 
					 | 
				
			||||||
    BOOST_ASSERT(heading <= 360);
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
    if (heading <= 22.5)
 | 
					 | 
				
			||||||
    {
 | 
					 | 
				
			||||||
        return "N";
 | 
					 | 
				
			||||||
    }
 | 
					 | 
				
			||||||
    if (heading <= 67.5)
 | 
					 | 
				
			||||||
    {
 | 
					 | 
				
			||||||
        return "NE";
 | 
					 | 
				
			||||||
    }
 | 
					 | 
				
			||||||
    if (heading <= 112.5)
 | 
					 | 
				
			||||||
    {
 | 
					 | 
				
			||||||
        return "E";
 | 
					 | 
				
			||||||
    }
 | 
					 | 
				
			||||||
    if (heading <= 157.5)
 | 
					 | 
				
			||||||
    {
 | 
					 | 
				
			||||||
        return "SE";
 | 
					 | 
				
			||||||
    }
 | 
					 | 
				
			||||||
    if (heading <= 202.5)
 | 
					 | 
				
			||||||
    {
 | 
					 | 
				
			||||||
        return "S";
 | 
					 | 
				
			||||||
    }
 | 
					 | 
				
			||||||
    if (heading <= 247.5)
 | 
					 | 
				
			||||||
    {
 | 
					 | 
				
			||||||
        return "SW";
 | 
					 | 
				
			||||||
    }
 | 
					 | 
				
			||||||
    if (heading <= 292.5)
 | 
					 | 
				
			||||||
    {
 | 
					 | 
				
			||||||
        return "W";
 | 
					 | 
				
			||||||
    }
 | 
					 | 
				
			||||||
    if (heading <= 337.5)
 | 
					 | 
				
			||||||
    {
 | 
					 | 
				
			||||||
        return "NW";
 | 
					 | 
				
			||||||
    }
 | 
					 | 
				
			||||||
    return "N";
 | 
					 | 
				
			||||||
}
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
// Checks whether A is between B-range and B+range, all modulo 360
 | 
					// Checks whether A is between B-range and B+range, all modulo 360
 | 
				
			||||||
// e.g. A = 5, B = 5, range = 10 == true
 | 
					// e.g. A = 5, B = 5, range = 10 == true
 | 
				
			||||||
//      A = -6, B = 5, range = 10 == false
 | 
					//      A = -6, B = 5, range = 10 == false
 | 
				
			||||||
 | 
				
			|||||||
@ -2,43 +2,13 @@
 | 
				
			|||||||
#define OSRM_UTIL_BIT_RANGE_HPP
 | 
					#define OSRM_UTIL_BIT_RANGE_HPP
 | 
				
			||||||
 | 
					
 | 
				
			||||||
#include "util/msb.hpp"
 | 
					#include "util/msb.hpp"
 | 
				
			||||||
 | 
					#include <bit>
 | 
				
			||||||
#include <boost/iterator/iterator_facade.hpp>
 | 
					#include <boost/iterator/iterator_facade.hpp>
 | 
				
			||||||
#include <ranges>
 | 
					#include <ranges>
 | 
				
			||||||
 | 
					
 | 
				
			||||||
namespace osrm::util
 | 
					namespace osrm::util
 | 
				
			||||||
{
 | 
					{
 | 
				
			||||||
 | 
					
 | 
				
			||||||
namespace detail
 | 
					 | 
				
			||||||
{
 | 
					 | 
				
			||||||
template <typename T> std::size_t countOnes(T value)
 | 
					 | 
				
			||||||
{
 | 
					 | 
				
			||||||
    static_assert(std::is_unsigned<T>::value, "Only unsigned types allowed");
 | 
					 | 
				
			||||||
    std::size_t number_of_ones = 0;
 | 
					 | 
				
			||||||
    while (value > 0)
 | 
					 | 
				
			||||||
    {
 | 
					 | 
				
			||||||
        auto index = msb(value);
 | 
					 | 
				
			||||||
        value = value & ~(T{1} << index);
 | 
					 | 
				
			||||||
        number_of_ones++;
 | 
					 | 
				
			||||||
    }
 | 
					 | 
				
			||||||
    return number_of_ones;
 | 
					 | 
				
			||||||
}
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
#if (defined(__clang__) || defined(__GNUC__) || defined(__GNUG__))
 | 
					 | 
				
			||||||
inline std::size_t countOnes(std::uint8_t value)
 | 
					 | 
				
			||||||
{
 | 
					 | 
				
			||||||
    return __builtin_popcount(std::uint32_t{value});
 | 
					 | 
				
			||||||
}
 | 
					 | 
				
			||||||
inline std::size_t countOnes(std::uint16_t value)
 | 
					 | 
				
			||||||
{
 | 
					 | 
				
			||||||
    return __builtin_popcount(std::uint32_t{value});
 | 
					 | 
				
			||||||
}
 | 
					 | 
				
			||||||
inline std::size_t countOnes(unsigned int value) { return __builtin_popcount(value); }
 | 
					 | 
				
			||||||
inline std::size_t countOnes(unsigned long value) { return __builtin_popcountl(value); }
 | 
					 | 
				
			||||||
inline std::size_t countOnes(unsigned long long value) { return __builtin_popcountll(value); }
 | 
					 | 
				
			||||||
#endif
 | 
					 | 
				
			||||||
} // namespace detail
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
// Investigate if we can replace this with
 | 
					// Investigate if we can replace this with
 | 
				
			||||||
// http://www.boost.org/doc/libs/1_64_0/libs/dynamic_bitset/dynamic_bitset.html
 | 
					// http://www.boost.org/doc/libs/1_64_0/libs/dynamic_bitset/dynamic_bitset.html
 | 
				
			||||||
template <typename DataT>
 | 
					template <typename DataT>
 | 
				
			||||||
@ -70,7 +40,7 @@ class BitIterator : public boost::iterator_facade<BitIterator<DataT>,
 | 
				
			|||||||
 | 
					
 | 
				
			||||||
    difference_type distance_to(const BitIterator &other) const
 | 
					    difference_type distance_to(const BitIterator &other) const
 | 
				
			||||||
    {
 | 
					    {
 | 
				
			||||||
        return detail::countOnes(m_value) - detail::countOnes(other.m_value);
 | 
					        return std::popcount(m_value) - std::popcount(other.m_value);
 | 
				
			||||||
    }
 | 
					    }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    bool equal(const BitIterator &other) const { return m_value == other.m_value; }
 | 
					    bool equal(const BitIterator &other) const { return m_value == other.m_value; }
 | 
				
			||||||
 | 
				
			|||||||
@ -104,7 +104,7 @@ using Value = std::variant<String, Number, Object, Array, True, False, Null>;
 | 
				
			|||||||
 */
 | 
					 */
 | 
				
			||||||
struct Object
 | 
					struct Object
 | 
				
			||||||
{
 | 
					{
 | 
				
			||||||
    std::unordered_map<std::string, Value> values;
 | 
					    std::unordered_map<std::string_view, Value> values;
 | 
				
			||||||
};
 | 
					};
 | 
				
			||||||
 | 
					
 | 
				
			||||||
/**
 | 
					/**
 | 
				
			||||||
 | 
				
			|||||||
@ -44,13 +44,13 @@ struct Comparator
 | 
				
			|||||||
 | 
					
 | 
				
			||||||
    bool operator()(const Object &lhs, const Object &rhs) const
 | 
					    bool operator()(const Object &lhs, const Object &rhs) const
 | 
				
			||||||
    {
 | 
					    {
 | 
				
			||||||
        std::set<std::string> lhs_keys;
 | 
					        std::set<std::string_view> lhs_keys;
 | 
				
			||||||
        for (const auto &key_value : lhs.values)
 | 
					        for (const auto &key_value : lhs.values)
 | 
				
			||||||
        {
 | 
					        {
 | 
				
			||||||
            lhs_keys.insert(key_value.first);
 | 
					            lhs_keys.insert(key_value.first);
 | 
				
			||||||
        }
 | 
					        }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
        std::set<std::string> rhs_keys;
 | 
					        std::set<std::string_view> rhs_keys;
 | 
				
			||||||
        for (const auto &key_value : rhs.values)
 | 
					        for (const auto &key_value : rhs.values)
 | 
				
			||||||
        {
 | 
					        {
 | 
				
			||||||
            rhs_keys.insert(key_value.first);
 | 
					            rhs_keys.insert(key_value.first);
 | 
				
			||||||
@ -60,7 +60,7 @@ struct Comparator
 | 
				
			|||||||
        {
 | 
					        {
 | 
				
			||||||
            if (rhs_keys.find(key) == rhs_keys.end())
 | 
					            if (rhs_keys.find(key) == rhs_keys.end())
 | 
				
			||||||
            {
 | 
					            {
 | 
				
			||||||
                reason = rhs_path + " doesn't have key \"" + key + "\"";
 | 
					                reason = rhs_path + " doesn't have key \"" + std::string(key) + "\"";
 | 
				
			||||||
                return false;
 | 
					                return false;
 | 
				
			||||||
            }
 | 
					            }
 | 
				
			||||||
        }
 | 
					        }
 | 
				
			||||||
@ -69,7 +69,7 @@ struct Comparator
 | 
				
			|||||||
        {
 | 
					        {
 | 
				
			||||||
            if (lhs_keys.find(key) == lhs_keys.end())
 | 
					            if (lhs_keys.find(key) == lhs_keys.end())
 | 
				
			||||||
            {
 | 
					            {
 | 
				
			||||||
                reason = lhs_path + " doesn't have key \"" + key + "\"";
 | 
					                reason = lhs_path + " doesn't have key \"" + std::string(key) + "\"";
 | 
				
			||||||
                return false;
 | 
					                return false;
 | 
				
			||||||
            }
 | 
					            }
 | 
				
			||||||
        }
 | 
					        }
 | 
				
			||||||
@ -81,8 +81,9 @@ struct Comparator
 | 
				
			|||||||
 | 
					
 | 
				
			||||||
            const auto &rhs_child = rhs.values.find(key)->second;
 | 
					            const auto &rhs_child = rhs.values.find(key)->second;
 | 
				
			||||||
            const auto &lhs_child = lhs.values.find(key)->second;
 | 
					            const auto &lhs_child = lhs.values.find(key)->second;
 | 
				
			||||||
            auto is_same =
 | 
					            auto is_same = std::visit(Comparator(reason,
 | 
				
			||||||
                std::visit(Comparator(reason, lhs_path + "." + key, rhs_path + "." + key),
 | 
					                                                 lhs_path + "." + std::string(key),
 | 
				
			||||||
 | 
					                                                 rhs_path + "." + std::string(key)),
 | 
				
			||||||
                                      lhs_child,
 | 
					                                      lhs_child,
 | 
				
			||||||
                                      rhs_child);
 | 
					                                      rhs_child);
 | 
				
			||||||
            if (!is_same)
 | 
					            if (!is_same)
 | 
				
			||||||
 | 
				
			|||||||
@ -97,7 +97,7 @@ template <typename Out> struct Renderer
 | 
				
			|||||||
    void operator()(const Null &) { write<>("null"); }
 | 
					    void operator()(const Null &) { write<>("null"); }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
  private:
 | 
					  private:
 | 
				
			||||||
    void write(const std::string &str);
 | 
					    void write(std::string_view str);
 | 
				
			||||||
    void write(const char *str, size_t size);
 | 
					    void write(const char *str, size_t size);
 | 
				
			||||||
    void write(char ch);
 | 
					    void write(char ch);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
@ -110,7 +110,7 @@ template <typename Out> struct Renderer
 | 
				
			|||||||
    Out &out;
 | 
					    Out &out;
 | 
				
			||||||
};
 | 
					};
 | 
				
			||||||
 | 
					
 | 
				
			||||||
template <> void Renderer<std::vector<char>>::write(const std::string &str)
 | 
					template <> void Renderer<std::vector<char>>::write(std::string_view str)
 | 
				
			||||||
{
 | 
					{
 | 
				
			||||||
    out.insert(out.end(), str.begin(), str.end());
 | 
					    out.insert(out.end(), str.begin(), str.end());
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
@ -122,7 +122,7 @@ template <> void Renderer<std::vector<char>>::write(const char *str, size_t size
 | 
				
			|||||||
 | 
					
 | 
				
			||||||
template <> void Renderer<std::vector<char>>::write(char ch) { out.push_back(ch); }
 | 
					template <> void Renderer<std::vector<char>>::write(char ch) { out.push_back(ch); }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
template <> void Renderer<std::ostream>::write(const std::string &str) { out << str; }
 | 
					template <> void Renderer<std::ostream>::write(std::string_view str) { out << str; }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
template <> void Renderer<std::ostream>::write(const char *str, size_t size)
 | 
					template <> void Renderer<std::ostream>::write(const char *str, size_t size)
 | 
				
			||||||
{
 | 
					{
 | 
				
			||||||
@ -131,7 +131,7 @@ template <> void Renderer<std::ostream>::write(const char *str, size_t size)
 | 
				
			|||||||
 | 
					
 | 
				
			||||||
template <> void Renderer<std::ostream>::write(char ch) { out << ch; }
 | 
					template <> void Renderer<std::ostream>::write(char ch) { out << ch; }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
template <> void Renderer<std::string>::write(const std::string &str) { out += str; }
 | 
					template <> void Renderer<std::string>::write(std::string_view str) { out += str; }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
template <> void Renderer<std::string>::write(const char *str, size_t size)
 | 
					template <> void Renderer<std::string>::write(const char *str, size_t size)
 | 
				
			||||||
{
 | 
					{
 | 
				
			||||||
 | 
				
			|||||||
@ -2,6 +2,7 @@
 | 
				
			|||||||
#define MEMINFO_HPP
 | 
					#define MEMINFO_HPP
 | 
				
			||||||
 | 
					
 | 
				
			||||||
#include "util/log.hpp"
 | 
					#include "util/log.hpp"
 | 
				
			||||||
 | 
					#include <cstddef>
 | 
				
			||||||
 | 
					
 | 
				
			||||||
#ifndef _WIN32
 | 
					#ifndef _WIN32
 | 
				
			||||||
#include <sys/resource.h>
 | 
					#include <sys/resource.h>
 | 
				
			||||||
@ -10,18 +11,27 @@
 | 
				
			|||||||
namespace osrm::util
 | 
					namespace osrm::util
 | 
				
			||||||
{
 | 
					{
 | 
				
			||||||
 | 
					
 | 
				
			||||||
inline void DumpMemoryStats()
 | 
					inline size_t PeakRAMUsedInBytes()
 | 
				
			||||||
{
 | 
					{
 | 
				
			||||||
#ifndef _WIN32
 | 
					#ifndef _WIN32
 | 
				
			||||||
    rusage usage;
 | 
					    rusage usage;
 | 
				
			||||||
    getrusage(RUSAGE_SELF, &usage);
 | 
					    getrusage(RUSAGE_SELF, &usage);
 | 
				
			||||||
#ifdef __linux__
 | 
					#ifdef __linux__
 | 
				
			||||||
    // Under linux, ru.maxrss is in kb
 | 
					    // Under linux, ru.maxrss is in kb
 | 
				
			||||||
    util::Log() << "RAM: peak bytes used: " << usage.ru_maxrss * 1024;
 | 
					    return usage.ru_maxrss * 1024;
 | 
				
			||||||
#else  // __linux__
 | 
					#else  // __linux__
 | 
				
			||||||
    // Under BSD systems (OSX), it's in bytes
 | 
					    // Under BSD systems (OSX), it's in bytes
 | 
				
			||||||
    util::Log() << "RAM: peak bytes used: " << usage.ru_maxrss;
 | 
					    return usage.ru_maxrss;
 | 
				
			||||||
#endif // __linux__
 | 
					#endif // __linux__
 | 
				
			||||||
 | 
					#else  // _WIN32
 | 
				
			||||||
 | 
					    return 0;
 | 
				
			||||||
 | 
					#endif // _WIN32
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					inline void DumpMemoryStats()
 | 
				
			||||||
 | 
					{
 | 
				
			||||||
 | 
					#ifndef _WIN32
 | 
				
			||||||
 | 
					    util::Log() << "RAM: peak bytes used: " << PeakRAMUsedInBytes();
 | 
				
			||||||
#else  // _WIN32
 | 
					#else  // _WIN32
 | 
				
			||||||
    util::Log() << "RAM: peak bytes used: <not implemented on Windows>";
 | 
					    util::Log() << "RAM: peak bytes used: <not implemented on Windows>";
 | 
				
			||||||
#endif // _WIN32
 | 
					#endif // _WIN32
 | 
				
			||||||
 | 
				
			|||||||
@ -1,50 +1,24 @@
 | 
				
			|||||||
#ifndef OSRM_UTIL_MSB_HPP
 | 
					#ifndef OSRM_UTIL_MSB_HPP
 | 
				
			||||||
#define OSRM_UTIL_MSB_HPP
 | 
					#define OSRM_UTIL_MSB_HPP
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					#include <bit>
 | 
				
			||||||
#include <boost/assert.hpp>
 | 
					#include <boost/assert.hpp>
 | 
				
			||||||
 | 
					 | 
				
			||||||
#include <climits>
 | 
					 | 
				
			||||||
#include <cstdint>
 | 
					#include <cstdint>
 | 
				
			||||||
#include <utility>
 | 
					#include <limits>
 | 
				
			||||||
 | 
					
 | 
				
			||||||
namespace osrm::util
 | 
					namespace osrm::util
 | 
				
			||||||
{
 | 
					{
 | 
				
			||||||
 | 
					
 | 
				
			||||||
// get the msb of an integer
 | 
					 | 
				
			||||||
// return 0 for integers without msb
 | 
					 | 
				
			||||||
template <typename T> std::size_t msb(T value)
 | 
					template <typename T> std::size_t msb(T value)
 | 
				
			||||||
{
 | 
					{
 | 
				
			||||||
 | 
					    BOOST_ASSERT(value > 0);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    static_assert(std::is_integral<T>::value && !std::is_signed<T>::value, "Integer required.");
 | 
					    static_assert(std::is_integral<T>::value && !std::is_signed<T>::value, "Integer required.");
 | 
				
			||||||
    std::size_t msb = 0;
 | 
					    constexpr auto MSB_INDEX = std::numeric_limits<unsigned char>::digits * sizeof(T) - 1;
 | 
				
			||||||
    while (value > 0)
 | 
					
 | 
				
			||||||
    {
 | 
					    return MSB_INDEX - std::countl_zero(value);
 | 
				
			||||||
        value >>= 1u;
 | 
					 | 
				
			||||||
        msb++;
 | 
					 | 
				
			||||||
    }
 | 
					 | 
				
			||||||
    BOOST_ASSERT(msb > 0);
 | 
					 | 
				
			||||||
    return msb - 1;
 | 
					 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
#if (defined(__clang__) || defined(__GNUC__) || defined(__GNUG__))
 | 
					 | 
				
			||||||
inline std::size_t msb(unsigned long long v)
 | 
					 | 
				
			||||||
{
 | 
					 | 
				
			||||||
    BOOST_ASSERT(v > 0);
 | 
					 | 
				
			||||||
    constexpr auto MSB_INDEX = CHAR_BIT * sizeof(unsigned long long) - 1;
 | 
					 | 
				
			||||||
    return MSB_INDEX - __builtin_clzll(v);
 | 
					 | 
				
			||||||
}
 | 
					 | 
				
			||||||
inline std::size_t msb(unsigned long v)
 | 
					 | 
				
			||||||
{
 | 
					 | 
				
			||||||
    BOOST_ASSERT(v > 0);
 | 
					 | 
				
			||||||
    constexpr auto MSB_INDEX = CHAR_BIT * sizeof(unsigned long) - 1;
 | 
					 | 
				
			||||||
    return MSB_INDEX - __builtin_clzl(v);
 | 
					 | 
				
			||||||
}
 | 
					 | 
				
			||||||
inline std::size_t msb(unsigned int v)
 | 
					 | 
				
			||||||
{
 | 
					 | 
				
			||||||
    BOOST_ASSERT(v > 0);
 | 
					 | 
				
			||||||
    constexpr auto MSB_INDEX = CHAR_BIT * sizeof(unsigned int) - 1;
 | 
					 | 
				
			||||||
    return MSB_INDEX - __builtin_clz(v);
 | 
					 | 
				
			||||||
}
 | 
					 | 
				
			||||||
#endif
 | 
					 | 
				
			||||||
} // namespace osrm::util
 | 
					} // namespace osrm::util
 | 
				
			||||||
 | 
					
 | 
				
			||||||
#endif
 | 
					#endif
 | 
				
			||||||
 | 
				
			|||||||
							
								
								
									
										13
									
								
								package-lock.json
									
									
									
										generated
									
									
									
								
							
							
						
						
									
										13
									
								
								package-lock.json
									
									
									
										generated
									
									
									
								
							@ -10,7 +10,8 @@
 | 
				
			|||||||
      "hasInstallScript": true,
 | 
					      "hasInstallScript": true,
 | 
				
			||||||
      "license": "BSD-2-Clause",
 | 
					      "license": "BSD-2-Clause",
 | 
				
			||||||
      "dependencies": {
 | 
					      "dependencies": {
 | 
				
			||||||
        "@mapbox/node-pre-gyp": "^1.0.11"
 | 
					        "@mapbox/node-pre-gyp": "^1.0.11",
 | 
				
			||||||
 | 
					        "seedrandom": "^3.0.5"
 | 
				
			||||||
      },
 | 
					      },
 | 
				
			||||||
      "devDependencies": {
 | 
					      "devDependencies": {
 | 
				
			||||||
        "@babel/cli": "^7.18.10",
 | 
					        "@babel/cli": "^7.18.10",
 | 
				
			||||||
@ -14652,6 +14653,11 @@
 | 
				
			|||||||
      "integrity": "sha512-YZo3K82SD7Riyi0E1EQPojLz7kpepnSQI9IyPbHHg1XXXevb5dJI7tpyN2ADxGcQbHG7vcyRHk0cbwqcQriUtg==",
 | 
					      "integrity": "sha512-YZo3K82SD7Riyi0E1EQPojLz7kpepnSQI9IyPbHHg1XXXevb5dJI7tpyN2ADxGcQbHG7vcyRHk0cbwqcQriUtg==",
 | 
				
			||||||
      "devOptional": true
 | 
					      "devOptional": true
 | 
				
			||||||
    },
 | 
					    },
 | 
				
			||||||
 | 
					    "node_modules/seedrandom": {
 | 
				
			||||||
 | 
					      "version": "3.0.5",
 | 
				
			||||||
 | 
					      "resolved": "https://registry.npmjs.org/seedrandom/-/seedrandom-3.0.5.tgz",
 | 
				
			||||||
 | 
					      "integrity": "sha512-8OwmbklUNzwezjGInmZ+2clQmExQPvomqjL7LFqOYqtmuxRgQYqOD3mHaU+MvZn5FLUeVxVfQjwLZW/n/JFuqg=="
 | 
				
			||||||
 | 
					    },
 | 
				
			||||||
    "node_modules/semver": {
 | 
					    "node_modules/semver": {
 | 
				
			||||||
      "version": "5.7.2",
 | 
					      "version": "5.7.2",
 | 
				
			||||||
      "resolved": "https://registry.npmjs.org/semver/-/semver-5.7.2.tgz",
 | 
					      "resolved": "https://registry.npmjs.org/semver/-/semver-5.7.2.tgz",
 | 
				
			||||||
@ -30296,6 +30302,11 @@
 | 
				
			|||||||
      "integrity": "sha512-YZo3K82SD7Riyi0E1EQPojLz7kpepnSQI9IyPbHHg1XXXevb5dJI7tpyN2ADxGcQbHG7vcyRHk0cbwqcQriUtg==",
 | 
					      "integrity": "sha512-YZo3K82SD7Riyi0E1EQPojLz7kpepnSQI9IyPbHHg1XXXevb5dJI7tpyN2ADxGcQbHG7vcyRHk0cbwqcQriUtg==",
 | 
				
			||||||
      "devOptional": true
 | 
					      "devOptional": true
 | 
				
			||||||
    },
 | 
					    },
 | 
				
			||||||
 | 
					    "seedrandom": {
 | 
				
			||||||
 | 
					      "version": "3.0.5",
 | 
				
			||||||
 | 
					      "resolved": "https://registry.npmjs.org/seedrandom/-/seedrandom-3.0.5.tgz",
 | 
				
			||||||
 | 
					      "integrity": "sha512-8OwmbklUNzwezjGInmZ+2clQmExQPvomqjL7LFqOYqtmuxRgQYqOD3mHaU+MvZn5FLUeVxVfQjwLZW/n/JFuqg=="
 | 
				
			||||||
 | 
					    },
 | 
				
			||||||
    "semver": {
 | 
					    "semver": {
 | 
				
			||||||
      "version": "5.7.2",
 | 
					      "version": "5.7.2",
 | 
				
			||||||
      "resolved": "https://registry.npmjs.org/semver/-/semver-5.7.2.tgz",
 | 
					      "resolved": "https://registry.npmjs.org/semver/-/semver-5.7.2.tgz",
 | 
				
			||||||
 | 
				
			|||||||
							
								
								
									
										11
									
								
								package.json
									
									
									
									
									
								
							
							
						
						
									
										11
									
								
								package.json
									
									
									
									
									
								
							@ -4,7 +4,8 @@
 | 
				
			|||||||
  "private": false,
 | 
					  "private": false,
 | 
				
			||||||
  "description": "The Open Source Routing Machine is a high performance routing engine written in C++ designed to run on OpenStreetMap data.",
 | 
					  "description": "The Open Source Routing Machine is a high performance routing engine written in C++ designed to run on OpenStreetMap data.",
 | 
				
			||||||
  "dependencies": {
 | 
					  "dependencies": {
 | 
				
			||||||
    "@mapbox/node-pre-gyp": "^1.0.11"
 | 
					    "@mapbox/node-pre-gyp": "^1.0.11",
 | 
				
			||||||
 | 
					    "seedrandom": "^3.0.5"
 | 
				
			||||||
  },
 | 
					  },
 | 
				
			||||||
  "browserify": {
 | 
					  "browserify": {
 | 
				
			||||||
    "transform": [
 | 
					    "transform": [
 | 
				
			||||||
@ -57,6 +58,7 @@
 | 
				
			|||||||
    "jsonpath": "^1.1.1",
 | 
					    "jsonpath": "^1.1.1",
 | 
				
			||||||
    "mkdirp": "^0.5.6",
 | 
					    "mkdirp": "^0.5.6",
 | 
				
			||||||
    "node-addon-api": "^5.0.0",
 | 
					    "node-addon-api": "^5.0.0",
 | 
				
			||||||
 | 
					    "node-cmake": "^2.5.1",
 | 
				
			||||||
    "node-timeout": "0.0.4",
 | 
					    "node-timeout": "0.0.4",
 | 
				
			||||||
    "polyline": "^0.2.0",
 | 
					    "polyline": "^0.2.0",
 | 
				
			||||||
    "request": "^2.88.2",
 | 
					    "request": "^2.88.2",
 | 
				
			||||||
@ -64,12 +66,13 @@
 | 
				
			|||||||
    "tape": "^4.16.0",
 | 
					    "tape": "^4.16.0",
 | 
				
			||||||
    "turf": "^3.0.14",
 | 
					    "turf": "^3.0.14",
 | 
				
			||||||
    "uglify-js": "^3.17.0",
 | 
					    "uglify-js": "^3.17.0",
 | 
				
			||||||
    "xmlbuilder": "^4.2.1",
 | 
					    "xmlbuilder": "^4.2.1"
 | 
				
			||||||
    "node-cmake": "^2.5.1"
 | 
					 | 
				
			||||||
  },
 | 
					  },
 | 
				
			||||||
  "main": "lib/index.js",
 | 
					  "main": "lib/index.js",
 | 
				
			||||||
  "binary": {
 | 
					  "binary": {
 | 
				
			||||||
    "napi_versions": [8],
 | 
					    "napi_versions": [
 | 
				
			||||||
 | 
					      8
 | 
				
			||||||
 | 
					    ],
 | 
				
			||||||
    "module_name": "node_osrm",
 | 
					    "module_name": "node_osrm",
 | 
				
			||||||
    "module_path": "./lib/binding_napi_v{napi_build_version}/",
 | 
					    "module_path": "./lib/binding_napi_v{napi_build_version}/",
 | 
				
			||||||
    "host": "https://github.com",
 | 
					    "host": "https://github.com",
 | 
				
			||||||
 | 
				
			|||||||
@ -35,6 +35,10 @@ function setup()
 | 
				
			|||||||
    turn_bias                 = 1.4,
 | 
					    turn_bias                 = 1.4,
 | 
				
			||||||
    use_public_transport      = true,
 | 
					    use_public_transport      = true,
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    -- Exclude narrow ways, in particular to route with cargo bike
 | 
				
			||||||
 | 
					    width                     = nil, -- Cargo bike could 0.5 width, in meters
 | 
				
			||||||
 | 
					    exclude_cargo_bike        = false,
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    allowed_start_modes = Set {
 | 
					    allowed_start_modes = Set {
 | 
				
			||||||
      mode.cycling,
 | 
					      mode.cycling,
 | 
				
			||||||
      mode.pushing_bike
 | 
					      mode.pushing_bike
 | 
				
			||||||
@ -243,6 +247,27 @@ function process_node(profile, node, result)
 | 
				
			|||||||
    end
 | 
					    end
 | 
				
			||||||
  end
 | 
					  end
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					  if profile.exclude_cargo_bike then
 | 
				
			||||||
 | 
					    local cargo_bike = node:get_value_by_key("cargo_bike")
 | 
				
			||||||
 | 
					    if cargo_bike and cargo_bike == "no" then
 | 
				
			||||||
 | 
					      result.barrier = true
 | 
				
			||||||
 | 
					    end
 | 
				
			||||||
 | 
					  end
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					  -- width
 | 
				
			||||||
 | 
					  if profile.width then
 | 
				
			||||||
 | 
					    -- From barrier=cycle_barrier or other barriers
 | 
				
			||||||
 | 
					    local maxwidth_physical = node:get_value_by_key("maxwidth:physical")
 | 
				
			||||||
 | 
					    local maxwidth_physical_meter = maxwidth_physical and Measure.parse_value_meters(maxwidth_physical) or 99
 | 
				
			||||||
 | 
					    local opening = node:get_value_by_key("opening")
 | 
				
			||||||
 | 
					    local opening_meter = opening and Measure.parse_value_meters(opening) or 99
 | 
				
			||||||
 | 
					    local width_meter = math.min(maxwidth_physical_meter, opening_meter)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    if width_meter and width_meter < profile.width then
 | 
				
			||||||
 | 
					      result.barrier = true
 | 
				
			||||||
 | 
					    end
 | 
				
			||||||
 | 
					  end
 | 
				
			||||||
 | 
					
 | 
				
			||||||
  -- check if node is a traffic light
 | 
					  -- check if node is a traffic light
 | 
				
			||||||
  result.traffic_lights = TrafficSignal.get_value(node)
 | 
					  result.traffic_lights = TrafficSignal.get_value(node)
 | 
				
			||||||
end
 | 
					end
 | 
				
			||||||
@ -299,6 +324,8 @@ function handle_bicycle_tags(profile,way,result,data)
 | 
				
			|||||||
 | 
					
 | 
				
			||||||
  bike_push_handler(profile,way,result,data)
 | 
					  bike_push_handler(profile,way,result,data)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					  -- width should be after bike_push
 | 
				
			||||||
 | 
					  width_handler(profile,way,result,data)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
  -- maxspeed
 | 
					  -- maxspeed
 | 
				
			||||||
  limit( result, data.maxspeed, data.maxspeed_forward, data.maxspeed_backward )
 | 
					  limit( result, data.maxspeed, data.maxspeed_forward, data.maxspeed_backward )
 | 
				
			||||||
@ -453,6 +480,27 @@ function cycleway_handler(profile,way,result,data)
 | 
				
			|||||||
  end
 | 
					  end
 | 
				
			||||||
end
 | 
					end
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					function width_handler(profile,way,result,data)
 | 
				
			||||||
 | 
					  if profile.exclude_cargo_bike then
 | 
				
			||||||
 | 
					    local cargo_bike = way:get_value_by_key("cargo_bike")
 | 
				
			||||||
 | 
					    if cargo_bike and cargo_bike == "no" then
 | 
				
			||||||
 | 
					      result.forward_mode = mode.inaccessible
 | 
				
			||||||
 | 
					      result.backward_mode = mode.inaccessible
 | 
				
			||||||
 | 
					    end
 | 
				
			||||||
 | 
					  end
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					  if profile.width then
 | 
				
			||||||
 | 
					    local width = way:get_value_by_key("width")
 | 
				
			||||||
 | 
					    if width then
 | 
				
			||||||
 | 
					      local width_meter = Measure.parse_value_meters(width)
 | 
				
			||||||
 | 
					      if width_meter and width_meter < profile.width then
 | 
				
			||||||
 | 
					        result.forward_mode = mode.inaccessible
 | 
				
			||||||
 | 
					        result.backward_mode = mode.inaccessible
 | 
				
			||||||
 | 
					      end
 | 
				
			||||||
 | 
					    end
 | 
				
			||||||
 | 
					  end
 | 
				
			||||||
 | 
					end
 | 
				
			||||||
 | 
					
 | 
				
			||||||
function bike_push_handler(profile,way,result,data)
 | 
					function bike_push_handler(profile,way,result,data)
 | 
				
			||||||
  -- pushing bikes - if no other mode found
 | 
					  -- pushing bikes - if no other mode found
 | 
				
			||||||
  if result.forward_mode == mode.inaccessible or result.backward_mode == mode.inaccessible or
 | 
					  if result.forward_mode == mode.inaccessible or result.backward_mode == mode.inaccessible or
 | 
				
			||||||
 | 
				
			|||||||
@ -90,6 +90,7 @@ function setup()
 | 
				
			|||||||
        path            = walking_speed,
 | 
					        path            = walking_speed,
 | 
				
			||||||
        steps           = walking_speed,
 | 
					        steps           = walking_speed,
 | 
				
			||||||
        pedestrian      = walking_speed,
 | 
					        pedestrian      = walking_speed,
 | 
				
			||||||
 | 
					        platform        = walking_speed,
 | 
				
			||||||
        footway         = walking_speed,
 | 
					        footway         = walking_speed,
 | 
				
			||||||
        pier            = walking_speed,
 | 
					        pier            = walking_speed,
 | 
				
			||||||
      },
 | 
					      },
 | 
				
			||||||
 | 
				
			|||||||
							
								
								
									
										211
									
								
								scripts/ci/bench.js
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										211
									
								
								scripts/ci/bench.js
									
									
									
									
									
										Normal file
									
								
							@ -0,0 +1,211 @@
 | 
				
			|||||||
 | 
					const fs = require('fs');
 | 
				
			||||||
 | 
					const path = require('path');
 | 
				
			||||||
 | 
					const readline = require('readline');
 | 
				
			||||||
 | 
					const seedrandom = require('seedrandom');
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					let RNG;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					class GPSData {
 | 
				
			||||||
 | 
					    constructor(gpsTracesFilePath) {
 | 
				
			||||||
 | 
					        this.tracks = {};
 | 
				
			||||||
 | 
					        this.coordinates = [];
 | 
				
			||||||
 | 
					        this.trackIds = [];
 | 
				
			||||||
 | 
					        this._loadGPSTraces(gpsTracesFilePath);
 | 
				
			||||||
 | 
					    }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    _loadGPSTraces(gpsTracesFilePath) {
 | 
				
			||||||
 | 
					        const expandedPath = path.resolve(gpsTracesFilePath);
 | 
				
			||||||
 | 
					        const data = fs.readFileSync(expandedPath, 'utf-8');
 | 
				
			||||||
 | 
					        const lines = data.split('\n');
 | 
				
			||||||
 | 
					        const headers = lines[0].split(',');
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					        const latitudeIndex = headers.indexOf('Latitude');
 | 
				
			||||||
 | 
					        const longitudeIndex = headers.indexOf('Longitude');
 | 
				
			||||||
 | 
					        const trackIdIndex = headers.indexOf('TrackID');
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					        for (let i = 1; i < lines.length; i++) {
 | 
				
			||||||
 | 
					            if (lines[i].trim() === '') continue;
 | 
				
			||||||
 | 
					            const row = lines[i].split(',');
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					            const latitude = parseFloat(row[latitudeIndex]);
 | 
				
			||||||
 | 
					            const longitude = parseFloat(row[longitudeIndex]);
 | 
				
			||||||
 | 
					            const trackId = row[trackIdIndex];
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					            const coord = [longitude, latitude];
 | 
				
			||||||
 | 
					            this.coordinates.push(coord);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					            if (!this.tracks[trackId]) {
 | 
				
			||||||
 | 
					                this.tracks[trackId] = [];
 | 
				
			||||||
 | 
					            }
 | 
				
			||||||
 | 
					            this.tracks[trackId].push(coord);
 | 
				
			||||||
 | 
					        }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					        this.trackIds = Object.keys(this.tracks);
 | 
				
			||||||
 | 
					    }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    getRandomCoordinate() {
 | 
				
			||||||
 | 
					        const randomIndex = Math.floor(RNG() * this.coordinates.length);
 | 
				
			||||||
 | 
					        return this.coordinates[randomIndex];
 | 
				
			||||||
 | 
					    }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    getRandomTrack() {
 | 
				
			||||||
 | 
					        const randomIndex = Math.floor(RNG() * this.trackIds.length);
 | 
				
			||||||
 | 
					        const trackId = this.trackIds[randomIndex];
 | 
				
			||||||
 | 
					        return this.tracks[trackId];
 | 
				
			||||||
 | 
					    }
 | 
				
			||||||
 | 
					};
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					async function runOSRMMethod(osrm, method, coordinates) {
 | 
				
			||||||
 | 
					    const time = await new Promise((resolve, reject) => {
 | 
				
			||||||
 | 
					        const startTime = process.hrtime();
 | 
				
			||||||
 | 
					        osrm[method]({coordinates}, (err, result) => {
 | 
				
			||||||
 | 
					            if (err) {
 | 
				
			||||||
 | 
					                if (['NoSegment', 'NoMatch', 'NoRoute', 'NoTrips'].includes(err.message)) {
 | 
				
			||||||
 | 
					                    resolve(null);
 | 
				
			||||||
 | 
					                } else {
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					                reject(err);
 | 
				
			||||||
 | 
					                }
 | 
				
			||||||
 | 
					            } else {
 | 
				
			||||||
 | 
					                const endTime = process.hrtime(startTime);
 | 
				
			||||||
 | 
					                resolve(endTime[0] + endTime[1] / 1e9);
 | 
				
			||||||
 | 
					            }
 | 
				
			||||||
 | 
					        });
 | 
				
			||||||
 | 
					    });
 | 
				
			||||||
 | 
					    return time;
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					async function nearest(osrm, gpsData) {
 | 
				
			||||||
 | 
					    const times = [];
 | 
				
			||||||
 | 
					    for (let i = 0; i < 1000; i++) {
 | 
				
			||||||
 | 
					        const coord = gpsData.getRandomCoordinate();
 | 
				
			||||||
 | 
					        times.push(await runOSRMMethod(osrm, 'nearest', [coord]));
 | 
				
			||||||
 | 
					    }
 | 
				
			||||||
 | 
					    return times;
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					async function route(osrm, gpsData) {
 | 
				
			||||||
 | 
					    const times = [];
 | 
				
			||||||
 | 
					    for (let i = 0; i < 1000; i++) {
 | 
				
			||||||
 | 
					        const from = gpsData.getRandomCoordinate();
 | 
				
			||||||
 | 
					        const to = gpsData.getRandomCoordinate();
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					        
 | 
				
			||||||
 | 
					        times.push(await runOSRMMethod(osrm, 'route', [from, to]));
 | 
				
			||||||
 | 
					    }
 | 
				
			||||||
 | 
					    return times;
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					async function table(osrm, gpsData) {
 | 
				
			||||||
 | 
					    const times = [];
 | 
				
			||||||
 | 
					    for (let i = 0; i < 250; i++) {
 | 
				
			||||||
 | 
					        const numPoints = Math.floor(RNG() * 3) + 15;
 | 
				
			||||||
 | 
					        const coordinates = [];
 | 
				
			||||||
 | 
					        for (let i = 0; i < numPoints; i++) {
 | 
				
			||||||
 | 
					            coordinates.push(gpsData.getRandomCoordinate());
 | 
				
			||||||
 | 
					        }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					        
 | 
				
			||||||
 | 
					        times.push(await runOSRMMethod(osrm, 'table', coordinates));
 | 
				
			||||||
 | 
					    }
 | 
				
			||||||
 | 
					    return times;
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					async function match(osrm, gpsData) {
 | 
				
			||||||
 | 
					    const times = [];
 | 
				
			||||||
 | 
					    for (let i = 0; i < 1000; i++) {
 | 
				
			||||||
 | 
					        const numPoints = Math.floor(RNG() * 50) + 50;
 | 
				
			||||||
 | 
					        const coordinates = gpsData.getRandomTrack().slice(0, numPoints);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					        
 | 
				
			||||||
 | 
					        times.push(await runOSRMMethod(osrm, 'match', coordinates));
 | 
				
			||||||
 | 
					    }
 | 
				
			||||||
 | 
					    return times;
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					async function trip(osrm, gpsData) {
 | 
				
			||||||
 | 
					    const times = [];
 | 
				
			||||||
 | 
					    for (let i = 0; i < 250; i++) {
 | 
				
			||||||
 | 
					        const numPoints = Math.floor(RNG() * 2) + 5;
 | 
				
			||||||
 | 
					        const coordinates = [];
 | 
				
			||||||
 | 
					        for (let i = 0; i < numPoints; i++) {
 | 
				
			||||||
 | 
					            coordinates.push(gpsData.getRandomCoordinate());
 | 
				
			||||||
 | 
					        }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					        
 | 
				
			||||||
 | 
					        times.push(await runOSRMMethod(osrm, 'trip', coordinates));
 | 
				
			||||||
 | 
					    }
 | 
				
			||||||
 | 
					    return times;
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					function bootstrapConfidenceInterval(data, numSamples = 1000, confidenceLevel = 0.95) {
 | 
				
			||||||
 | 
					    let means = [];
 | 
				
			||||||
 | 
					    let dataLength = data.length;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    for (let i = 0; i < numSamples; i++) {
 | 
				
			||||||
 | 
					        let sample = [];
 | 
				
			||||||
 | 
					        for (let j = 0; j < dataLength; j++) {
 | 
				
			||||||
 | 
					            let randomIndex = Math.floor(RNG() * dataLength);
 | 
				
			||||||
 | 
					            sample.push(data[randomIndex]);
 | 
				
			||||||
 | 
					        }
 | 
				
			||||||
 | 
					        let sampleMean = sample.reduce((a, b) => a + b, 0) / sample.length;
 | 
				
			||||||
 | 
					        means.push(sampleMean);
 | 
				
			||||||
 | 
					    }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    means.sort((a, b) => a - b);
 | 
				
			||||||
 | 
					    let lowerBoundIndex = Math.floor((1 - confidenceLevel) / 2 * numSamples);
 | 
				
			||||||
 | 
					    let upperBoundIndex = Math.floor((1 + confidenceLevel) / 2 * numSamples);
 | 
				
			||||||
 | 
					    let mean = means.reduce((a, b) => a + b, 0) / means.length;
 | 
				
			||||||
 | 
					    let lowerBound = means[lowerBoundIndex];
 | 
				
			||||||
 | 
					    let upperBound = means[upperBoundIndex];
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    return { mean: mean, lowerBound: lowerBound, upperBound: upperBound };
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					function calculateConfidenceInterval(data) {
 | 
				
			||||||
 | 
					    let { mean, lowerBound, upperBound } = bootstrapConfidenceInterval(data);
 | 
				
			||||||
 | 
					    let bestValue = Math.max(...data);
 | 
				
			||||||
 | 
					    let errorMargin = (upperBound - lowerBound) / 2;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    return { mean, errorMargin, bestValue };
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					async function main() {
 | 
				
			||||||
 | 
					    const args = process.argv.slice(2);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    const {OSRM} = require(args[0]);
 | 
				
			||||||
 | 
					    const path = args[1];
 | 
				
			||||||
 | 
					    const algorithm = args[2].toUpperCase();
 | 
				
			||||||
 | 
					    const method = args[3];
 | 
				
			||||||
 | 
					    const gpsTracesFilePath = args[4];
 | 
				
			||||||
 | 
					    const iterations = parseInt(args[5]);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    const gpsData = new GPSData(gpsTracesFilePath);
 | 
				
			||||||
 | 
					    const osrm = new OSRM({path, algorithm});
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    const functions = {
 | 
				
			||||||
 | 
					        route: route,
 | 
				
			||||||
 | 
					        table: table,
 | 
				
			||||||
 | 
					        nearest: nearest,
 | 
				
			||||||
 | 
					        match: match,
 | 
				
			||||||
 | 
					        trip: trip
 | 
				
			||||||
 | 
					    };
 | 
				
			||||||
 | 
					    const func = functions[method];
 | 
				
			||||||
 | 
					    if (!func) {
 | 
				
			||||||
 | 
					        throw new Error('Unknown method');
 | 
				
			||||||
 | 
					    }
 | 
				
			||||||
 | 
					    const allTimes = [];
 | 
				
			||||||
 | 
					    for (let i = 0; i < iterations; i++) {
 | 
				
			||||||
 | 
					        RNG = seedrandom(42);
 | 
				
			||||||
 | 
					        allTimes.push((await func(osrm, gpsData)).filter(t => t !== null));
 | 
				
			||||||
 | 
					    }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    const opsPerSec = allTimes.map(times => times.length / times.reduce((a, b) => a + b, 0));
 | 
				
			||||||
 | 
					    const { mean, errorMargin, bestValue } = calculateConfidenceInterval(opsPerSec);
 | 
				
			||||||
 | 
					    console.log(`Ops: ${mean.toFixed(1)} ± ${errorMargin.toFixed(1)} ops/s. Best: ${bestValue.toFixed(1)} ops/s`);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					main();
 | 
				
			||||||
@ -53,6 +53,7 @@ function run_benchmarks_for_folder {
 | 
				
			|||||||
    mkdir -p $RESULTS_FOLDER
 | 
					    mkdir -p $RESULTS_FOLDER
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    BENCHMARKS_FOLDER="$BINARIES_FOLDER/src/benchmarks"
 | 
					    BENCHMARKS_FOLDER="$BINARIES_FOLDER/src/benchmarks"
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    echo "Running match-bench MLD"
 | 
					    echo "Running match-bench MLD"
 | 
				
			||||||
    $BENCHMARKS_FOLDER/match-bench "$FOLDER/test/data/mld/monaco.osrm" mld > "$RESULTS_FOLDER/match_mld.bench"
 | 
					    $BENCHMARKS_FOLDER/match-bench "$FOLDER/test/data/mld/monaco.osrm" mld > "$RESULTS_FOLDER/match_mld.bench"
 | 
				
			||||||
    echo "Running match-bench CH"
 | 
					    echo "Running match-bench CH"
 | 
				
			||||||
@ -81,6 +82,18 @@ function run_benchmarks_for_folder {
 | 
				
			|||||||
    echo "Running osrm-contract"
 | 
					    echo "Running osrm-contract"
 | 
				
			||||||
    measure_peak_ram_and_time "$BINARIES_FOLDER/osrm-contract $FOLDER/data.osrm" "$RESULTS_FOLDER/osrm_contract.bench"
 | 
					    measure_peak_ram_and_time "$BINARIES_FOLDER/osrm-contract $FOLDER/data.osrm" "$RESULTS_FOLDER/osrm_contract.bench"
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    for ALGORITHM in ch mld; do
 | 
				
			||||||
 | 
					        for BENCH in nearest table trip route match; do
 | 
				
			||||||
 | 
					            echo "Running node $BENCH $ALGORITHM"
 | 
				
			||||||
 | 
					            START=$(date +%s.%N)
 | 
				
			||||||
 | 
					            node $SCRIPTS_FOLDER/scripts/ci/bench.js $FOLDER/lib/binding/node_osrm.node $FOLDER/data.osrm $ALGORITHM $BENCH $GPS_TRACES > "$RESULTS_FOLDER/node_${BENCH}_${ALGORITHM}.bench" 5
 | 
				
			||||||
 | 
					            END=$(date +%s.%N)
 | 
				
			||||||
 | 
					            DIFF=$(echo "$END - $START" | bc)
 | 
				
			||||||
 | 
					            echo "Took: ${DIFF}s"
 | 
				
			||||||
 | 
					        done
 | 
				
			||||||
 | 
					    done
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    for ALGORITHM in ch mld; do
 | 
					    for ALGORITHM in ch mld; do
 | 
				
			||||||
        for BENCH in nearest table trip route match; do
 | 
					        for BENCH in nearest table trip route match; do
 | 
				
			||||||
            echo "Running random $BENCH $ALGORITHM"
 | 
					            echo "Running random $BENCH $ALGORITHM"
 | 
				
			||||||
 | 
				
			|||||||
@ -10,7 +10,7 @@ set -o nounset
 | 
				
			|||||||
# http://git.661346.n2.nabble.com/subtree-merges-lose-prefix-after-rebase-td7332850.html
 | 
					# http://git.661346.n2.nabble.com/subtree-merges-lose-prefix-after-rebase-td7332850.html
 | 
				
			||||||
 | 
					
 | 
				
			||||||
OSMIUM_PATH="osmcode/libosmium"
 | 
					OSMIUM_PATH="osmcode/libosmium"
 | 
				
			||||||
OSMIUM_TAG=v2.14.0
 | 
					OSMIUM_TAG=v2.20.0
 | 
				
			||||||
 | 
					
 | 
				
			||||||
SOL_PATH="ThePhD/sol2"
 | 
					SOL_PATH="ThePhD/sol2"
 | 
				
			||||||
SOL_TAG=v3.3.0
 | 
					SOL_TAG=v3.3.0
 | 
				
			||||||
@ -22,7 +22,7 @@ MICROTAR_PATH="rxi/microtar"
 | 
				
			|||||||
MICROTAR_TAG=v0.1.0
 | 
					MICROTAR_TAG=v0.1.0
 | 
				
			||||||
 | 
					
 | 
				
			||||||
PROTOZERO_PATH="mapbox/protozero"
 | 
					PROTOZERO_PATH="mapbox/protozero"
 | 
				
			||||||
PROTOZERO_TAG=v1.6.2
 | 
					PROTOZERO_TAG=v1.7.1
 | 
				
			||||||
 | 
					
 | 
				
			||||||
VTZERO_PATH="mapbox/vtzero"
 | 
					VTZERO_PATH="mapbox/vtzero"
 | 
				
			||||||
VTZERO_TAG=v1.1.0
 | 
					VTZERO_TAG=v1.1.0
 | 
				
			||||||
 | 
				
			|||||||
@ -16,8 +16,8 @@
 | 
				
			|||||||
#include "osrm/osrm.hpp"
 | 
					#include "osrm/osrm.hpp"
 | 
				
			||||||
#include "osrm/status.hpp"
 | 
					#include "osrm/status.hpp"
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					#include "util/meminfo.hpp"
 | 
				
			||||||
#include <boost/assert.hpp>
 | 
					#include <boost/assert.hpp>
 | 
				
			||||||
 | 
					 | 
				
			||||||
#include <boost/optional/optional.hpp>
 | 
					#include <boost/optional/optional.hpp>
 | 
				
			||||||
#include <cstdlib>
 | 
					#include <cstdlib>
 | 
				
			||||||
#include <exception>
 | 
					#include <exception>
 | 
				
			||||||
@ -655,6 +655,12 @@ try
 | 
				
			|||||||
        std::cerr << "Unknown benchmark: " << benchmarkToRun << std::endl;
 | 
					        std::cerr << "Unknown benchmark: " << benchmarkToRun << std::endl;
 | 
				
			||||||
        return EXIT_FAILURE;
 | 
					        return EXIT_FAILURE;
 | 
				
			||||||
    }
 | 
					    }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    std::cout << "Peak RAM: " << std::setprecision(3)
 | 
				
			||||||
 | 
					              << static_cast<double>(osrm::util::PeakRAMUsedInBytes()) /
 | 
				
			||||||
 | 
					                     static_cast<double>((1024 * 1024))
 | 
				
			||||||
 | 
					              << "MB" << std::endl;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    return EXIT_SUCCESS;
 | 
					    return EXIT_SUCCESS;
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
catch (const std::exception &e)
 | 
					catch (const std::exception &e)
 | 
				
			||||||
 | 
				
			|||||||
@ -9,12 +9,17 @@
 | 
				
			|||||||
#include <rapidjson/document.h>
 | 
					#include <rapidjson/document.h>
 | 
				
			||||||
#include <sstream>
 | 
					#include <sstream>
 | 
				
			||||||
#include <stdexcept>
 | 
					#include <stdexcept>
 | 
				
			||||||
 | 
					#include <unordered_set>
 | 
				
			||||||
 | 
					
 | 
				
			||||||
using namespace osrm;
 | 
					using namespace osrm;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
namespace
 | 
					namespace
 | 
				
			||||||
{
 | 
					{
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					// we use std::string_view as a key in the object, so since here we have dynamic keys we have to
 | 
				
			||||||
 | 
					// "hold" them somewhere okay for tests...
 | 
				
			||||||
 | 
					static std::unordered_set<std::string> gKeysHolder;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
void convert(const rapidjson::Value &value, json::Value &result)
 | 
					void convert(const rapidjson::Value &value, json::Value &result)
 | 
				
			||||||
{
 | 
					{
 | 
				
			||||||
    if (value.IsString())
 | 
					    if (value.IsString())
 | 
				
			||||||
@ -32,7 +37,8 @@ void convert(const rapidjson::Value &value, json::Value &result)
 | 
				
			|||||||
        {
 | 
					        {
 | 
				
			||||||
            json::Value member;
 | 
					            json::Value member;
 | 
				
			||||||
            convert(itr->value, member);
 | 
					            convert(itr->value, member);
 | 
				
			||||||
            object.values.emplace(itr->name.GetString(), std::move(member));
 | 
					            auto keyItr = gKeysHolder.emplace(itr->name.GetString()).first;
 | 
				
			||||||
 | 
					            object.values.emplace(*keyItr, std::move(member));
 | 
				
			||||||
        }
 | 
					        }
 | 
				
			||||||
        result = std::move(object);
 | 
					        result = std::move(object);
 | 
				
			||||||
    }
 | 
					    }
 | 
				
			||||||
@ -122,6 +128,7 @@ int main(int argc, char **argv)
 | 
				
			|||||||
 | 
					
 | 
				
			||||||
    if (std::string{out_vec.begin(), out_vec.end()} != out_str || out_str != out_ss_str)
 | 
					    if (std::string{out_vec.begin(), out_vec.end()} != out_str || out_str != out_ss_str)
 | 
				
			||||||
    {
 | 
					    {
 | 
				
			||||||
 | 
					        std::cerr << "Vector/string results are not equal\n";
 | 
				
			||||||
        throw std::logic_error("Vector/stringstream/string results are not equal");
 | 
					        throw std::logic_error("Vector/stringstream/string results are not equal");
 | 
				
			||||||
    }
 | 
					    }
 | 
				
			||||||
    return EXIT_SUCCESS;
 | 
					    return EXIT_SUCCESS;
 | 
				
			||||||
 | 
				
			|||||||
@ -222,7 +222,6 @@ oneToManySearch(SearchEngineData<Algorithm> &engine_working_data,
 | 
				
			|||||||
    std::vector<EdgeDuration> durations_table(target_indices.size(), MAXIMAL_EDGE_DURATION);
 | 
					    std::vector<EdgeDuration> durations_table(target_indices.size(), MAXIMAL_EDGE_DURATION);
 | 
				
			||||||
    std::vector<EdgeDistance> distances_table(calculate_distance ? target_indices.size() : 0,
 | 
					    std::vector<EdgeDistance> distances_table(calculate_distance ? target_indices.size() : 0,
 | 
				
			||||||
                                              MAXIMAL_EDGE_DISTANCE);
 | 
					                                              MAXIMAL_EDGE_DISTANCE);
 | 
				
			||||||
    std::vector<NodeID> middle_nodes_table(target_indices.size(), SPECIAL_NODEID);
 | 
					 | 
				
			||||||
 | 
					
 | 
				
			||||||
    // Collect destination (source) nodes into a map
 | 
					    // Collect destination (source) nodes into a map
 | 
				
			||||||
    std::unordered_multimap<NodeID, std::tuple<std::size_t, EdgeWeight, EdgeDuration, EdgeDistance>>
 | 
					    std::unordered_multimap<NodeID, std::tuple<std::size_t, EdgeWeight, EdgeDuration, EdgeDistance>>
 | 
				
			||||||
@ -307,7 +306,6 @@ oneToManySearch(SearchEngineData<Algorithm> &engine_working_data,
 | 
				
			|||||||
                    weights_table[index] = path_weight;
 | 
					                    weights_table[index] = path_weight;
 | 
				
			||||||
                    durations_table[index] = path_duration;
 | 
					                    durations_table[index] = path_duration;
 | 
				
			||||||
                    current_distance = path_distance;
 | 
					                    current_distance = path_distance;
 | 
				
			||||||
                    middle_nodes_table[index] = node;
 | 
					 | 
				
			||||||
                }
 | 
					                }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
                // Remove node from destinations list
 | 
					                // Remove node from destinations list
 | 
				
			||||||
 | 
				
			|||||||
							
								
								
									
										5
									
								
								third_party/libosmium/.clang-tidy
									
									
									
									
										vendored
									
									
								
							
							
						
						
									
										5
									
								
								third_party/libosmium/.clang-tidy
									
									
									
									
										vendored
									
									
								
							@ -1,5 +1,5 @@
 | 
				
			|||||||
---
 | 
					---
 | 
				
			||||||
Checks: '*,-abseil-string-find-str-contains,-altera-*,-android-cloexec-*,-bugprone-branch-clone,-bugprone-easily-swappable-parameters,-bugprone-macro-parentheses,-cert-dcl21-cpp,-cert-err58-cpp,-clang-analyzer-optin.cplusplus.VirtualCall,-cppcoreguidelines-avoid-c-arrays,-cppcoreguidelines-avoid-magic-numbers,-cppcoreguidelines-macro-usage,-cppcoreguidelines-non-private-member-variables-in-classes,-cppcoreguidelines-owning-memory,-cppcoreguidelines-pro-bounds-array-to-pointer-decay,-cppcoreguidelines-pro-bounds-constant-array-index,-cppcoreguidelines-pro-bounds-pointer-arithmetic,-cppcoreguidelines-pro-type-const-cast,-cppcoreguidelines-pro-type-reinterpret-cast,-cppcoreguidelines-pro-type-static-cast-downcast,-cppcoreguidelines-pro-type-vararg,-fuchsia-*,-google-runtime-references,-hicpp-avoid-c-arrays,-hicpp-invalid-access-moved,-hicpp-no-array-decay,-hicpp-no-assembler,-hicpp-vararg,-llvmlibc-*,-llvm-qualified-auto,-misc-macro-parentheses,-misc-non-private-member-variables-in-classes,-misc-no-recursion,-misc-unused-parameters,-modernize-avoid-c-arrays,-modernize-make-unique,-modernize-raw-string-literal,-modernize-use-trailing-return-type,-readability-avoid-const-params-in-decls,-readability-function-cognitive-complexity,-readability-identifier-length,-readability-implicit-bool-cast,-readability-implicit-bool-conversion,-readability-magic-numbers,-readability-qualified-auto'
 | 
					Checks: '*,-abseil-string-find-str-contains,-altera-*,-android-cloexec-*,-bugprone-branch-clone,-bugprone-easily-swappable-parameters,-bugprone-macro-parentheses,-cert-dcl21-cpp,-cert-err58-cpp,-clang-analyzer-optin.cplusplus.VirtualCall,-cppcoreguidelines-avoid-c-arrays,-cppcoreguidelines-avoid-magic-numbers,-cppcoreguidelines-macro-usage,-cppcoreguidelines-non-private-member-variables-in-classes,-cppcoreguidelines-owning-memory,-cppcoreguidelines-pro-bounds-array-to-pointer-decay,-cppcoreguidelines-pro-bounds-constant-array-index,-cppcoreguidelines-pro-bounds-pointer-arithmetic,-cppcoreguidelines-pro-type-const-cast,-cppcoreguidelines-pro-type-reinterpret-cast,-cppcoreguidelines-pro-type-static-cast-downcast,-cppcoreguidelines-pro-type-vararg,-fuchsia-*,-google-runtime-references,-hicpp-avoid-c-arrays,-hicpp-invalid-access-moved,-hicpp-no-array-decay,-hicpp-no-assembler,-hicpp-vararg,-llvmlibc-*,-llvm-qualified-auto,-misc-macro-parentheses,-misc-non-private-member-variables-in-classes,-misc-no-recursion,-misc-unused-parameters,-modernize-avoid-c-arrays,-modernize-make-unique,-modernize-raw-string-literal,-modernize-use-trailing-return-type,-readability-avoid-const-params-in-decls,-readability-convert-member-functions-to-static,-readability-function-cognitive-complexity,-readability-identifier-length,-readability-implicit-bool-cast,-readability-implicit-bool-conversion,-readability-magic-numbers,-readability-qualified-auto'
 | 
				
			||||||
#
 | 
					#
 | 
				
			||||||
#  For a list of check options, see:
 | 
					#  For a list of check options, see:
 | 
				
			||||||
#  https://clang.llvm.org/extra/clang-tidy/checks/list.html
 | 
					#  https://clang.llvm.org/extra/clang-tidy/checks/list.html
 | 
				
			||||||
@ -137,6 +137,9 @@ Checks: '*,-abseil-string-find-str-contains,-altera-*,-android-cloexec-*,-bugpro
 | 
				
			|||||||
#    This is header only library, so the declaration and implementation are
 | 
					#    This is header only library, so the declaration and implementation are
 | 
				
			||||||
#    often the same and we want to have the const in implementations.
 | 
					#    often the same and we want to have the const in implementations.
 | 
				
			||||||
#
 | 
					#
 | 
				
			||||||
 | 
					#  readability-convert-member-functions-to-static
 | 
				
			||||||
 | 
					#    Reports too many false positives
 | 
				
			||||||
 | 
					#
 | 
				
			||||||
#  readability-function-cognitive-complexity
 | 
					#  readability-function-cognitive-complexity
 | 
				
			||||||
#    Sometimes the large functions are needed.
 | 
					#    Sometimes the large functions are needed.
 | 
				
			||||||
#
 | 
					#
 | 
				
			||||||
 | 
				
			|||||||
@ -7,7 +7,13 @@ runs:
 | 
				
			|||||||
      run: mkdir build
 | 
					      run: mkdir build
 | 
				
			||||||
      shell: bash
 | 
					      shell: bash
 | 
				
			||||||
    - name: Configure
 | 
					    - name: Configure
 | 
				
			||||||
      run: cmake -LA .. -DCMAKE_TOOLCHAIN_FILE=C:/vcpkg/scripts/buildsystems/vcpkg.cmake -DBUILD_HEADERS=OFF -DBUILD_BENCHMARKS=ON -DOsmium_DEBUG=TRUE -DPROTOZERO_INCLUDE_DIR=${GITHUB_WORKSPACE}/../protozero/include
 | 
					      run: |
 | 
				
			||||||
 | 
					        cmake -LA .. \
 | 
				
			||||||
 | 
					              -DCMAKE_TOOLCHAIN_FILE=C:/vcpkg/scripts/buildsystems/vcpkg.cmake \
 | 
				
			||||||
 | 
					              -DBUILD_HEADERS=OFF \
 | 
				
			||||||
 | 
					              -DBUILD_BENCHMARKS=ON \
 | 
				
			||||||
 | 
					              -DOsmium_DEBUG=TRUE \
 | 
				
			||||||
 | 
					              -DPROTOZERO_INCLUDE_DIR=${GITHUB_WORKSPACE}/../protozero/include
 | 
				
			||||||
      shell: bash
 | 
					      shell: bash
 | 
				
			||||||
      working-directory: build
 | 
					      working-directory: build
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
				
			|||||||
@ -5,7 +5,7 @@ runs:
 | 
				
			|||||||
  steps:
 | 
					  steps:
 | 
				
			||||||
    - name: Install packages
 | 
					    - name: Install packages
 | 
				
			||||||
      run: |
 | 
					      run: |
 | 
				
			||||||
        sudo apt-get update -q
 | 
					        sudo apt-get update -qq
 | 
				
			||||||
        sudo apt-get install -yq \
 | 
					        sudo apt-get install -yq \
 | 
				
			||||||
             doxygen \
 | 
					             doxygen \
 | 
				
			||||||
             libboost-dev \
 | 
					             libboost-dev \
 | 
				
			||||||
@ -16,8 +16,5 @@ runs:
 | 
				
			|||||||
             libsparsehash-dev \
 | 
					             libsparsehash-dev \
 | 
				
			||||||
             ruby-json \
 | 
					             ruby-json \
 | 
				
			||||||
             spatialite-bin
 | 
					             spatialite-bin
 | 
				
			||||||
        test "$CC" = clang-6.0 && sudo apt-get install -yq --no-install-suggests --no-install-recommends clang-6.0
 | 
					 | 
				
			||||||
        test "$CC" = clang-8   && sudo apt-get install -yq --no-install-suggests --no-install-recommends clang-8
 | 
					 | 
				
			||||||
        test "$CC" = clang-13  && sudo apt-get install -yq --no-install-suggests --no-install-recommends clang-13
 | 
					 | 
				
			||||||
      shell: bash
 | 
					      shell: bash
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
				
			|||||||
							
								
								
									
										240
									
								
								third_party/libosmium/.github/workflows/ci.yml
									
									
									
									
										vendored
									
									
								
							
							
						
						
									
										240
									
								
								third_party/libosmium/.github/workflows/ci.yml
									
									
									
									
										vendored
									
									
								
							@ -3,14 +3,13 @@ name: CI
 | 
				
			|||||||
on: [ push, pull_request ]
 | 
					on: [ push, pull_request ]
 | 
				
			||||||
 | 
					
 | 
				
			||||||
jobs:
 | 
					jobs:
 | 
				
			||||||
 | 
					 | 
				
			||||||
  linux:
 | 
					  linux:
 | 
				
			||||||
    runs-on: ubuntu-latest
 | 
					    runs-on: ubuntu-latest
 | 
				
			||||||
    timeout-minutes: 40
 | 
					    timeout-minutes: 40
 | 
				
			||||||
    strategy:
 | 
					    strategy:
 | 
				
			||||||
      fail-fast: false
 | 
					      fail-fast: false
 | 
				
			||||||
      matrix:
 | 
					      matrix:
 | 
				
			||||||
        name: [Ubuntu-18, Ubuntu-20, Ubuntu-21, Debian-9, Debian-10, Debian-11, Debian-Testing, Debian-Experimental, Fedora-34]
 | 
					        name: [Ubuntu-18, Ubuntu-20, Ubuntu-22, Debian-10, Debian-11, Debian-12, Debian-Testing, Debian-Experimental, Fedora-35, Fedora-36, Fedora-37, Fedora-38]
 | 
				
			||||||
        build_type: [Dev]
 | 
					        build_type: [Dev]
 | 
				
			||||||
        cpp_compiler: [g++]
 | 
					        cpp_compiler: [g++]
 | 
				
			||||||
        cpp_version: [c++11]
 | 
					        cpp_version: [c++11]
 | 
				
			||||||
@ -19,122 +18,136 @@ jobs:
 | 
				
			|||||||
            # Uses gcc 7.5.0, clang 6.0.0, cmake 3.10.2
 | 
					            # Uses gcc 7.5.0, clang 6.0.0, cmake 3.10.2
 | 
				
			||||||
            image: "ubuntu:18.04"
 | 
					            image: "ubuntu:18.04"
 | 
				
			||||||
            ubuntu: 18
 | 
					            ubuntu: 18
 | 
				
			||||||
            installer: apt
 | 
					 | 
				
			||||||
          - name: Ubuntu-20
 | 
					          - name: Ubuntu-20
 | 
				
			||||||
            # Uses gcc 9.3.0, clang 10.0.0, cmake 3.16.3
 | 
					            # Uses gcc 9.3.0, clang 10.0.0, cmake 3.16.3
 | 
				
			||||||
            image: "ubuntu:20.04"
 | 
					            image: "ubuntu:20.04"
 | 
				
			||||||
            ubuntu: 20
 | 
					            ubuntu: 20
 | 
				
			||||||
            installer: apt
 | 
					          - name: Ubuntu-22
 | 
				
			||||||
          - name: Ubuntu-21
 | 
					            # Uses gcc 12.2.0, clang 15.0.7, cmake 3.24.2
 | 
				
			||||||
            # Uses gcc 10.3.0, clang, 12.0.0, cmake 3.18.4
 | 
					            image: "ubuntu:22.04"
 | 
				
			||||||
            image: "ubuntu:21.04"
 | 
					            ubuntu: 22
 | 
				
			||||||
            ubuntu: 21
 | 
					            CXXFLAGS: -Wno-stringop-overread
 | 
				
			||||||
            installer: apt
 | 
					 | 
				
			||||||
          - name: Debian-9
 | 
					 | 
				
			||||||
            # Uses gcc 6.3.0, clang 3.8.1, cmake 3.7.2
 | 
					 | 
				
			||||||
            image: "debian:stretch"
 | 
					 | 
				
			||||||
            installer: apt
 | 
					 | 
				
			||||||
          - name: Debian-10
 | 
					          - name: Debian-10
 | 
				
			||||||
            # Uses gcc 8.3.0, clang 7.0.1, cmake 3.13.4
 | 
					            # Uses gcc 8.3.0, clang 7.0.1, cmake 3.13.4
 | 
				
			||||||
            image: "debian:buster"
 | 
					            image: "debian:buster"
 | 
				
			||||||
            installer: apt
 | 
					 | 
				
			||||||
          - name: Debian-11
 | 
					          - name: Debian-11
 | 
				
			||||||
            # Uses gcc 10.2.1, clang 11.0.1, cmake 3.18.4
 | 
					            # Uses gcc 10.2.1, clang 11.0.1, cmake 3.18.4
 | 
				
			||||||
            image: "debian:bullseye"
 | 
					            image: "debian:bullseye"
 | 
				
			||||||
            installer: apt
 | 
					 | 
				
			||||||
          - name: Debian-11
 | 
					          - name: Debian-11
 | 
				
			||||||
            # Uses gcc 10.2.1, clang 11.0.1, cmake 3.18.4
 | 
					 | 
				
			||||||
            image: "debian:bullseye"
 | 
					            image: "debian:bullseye"
 | 
				
			||||||
            installer: apt
 | 
					 | 
				
			||||||
            cpp_version: c++17
 | 
					            cpp_version: c++17
 | 
				
			||||||
          - name: Debian-11
 | 
					          - name: Debian-11
 | 
				
			||||||
            # Uses gcc 10.2.1, clang 11.0.1, cmake 3.18.4
 | 
					 | 
				
			||||||
            image: "debian:bullseye"
 | 
					            image: "debian:bullseye"
 | 
				
			||||||
            installer: apt
 | 
					 | 
				
			||||||
            cpp_version: c++20
 | 
					            cpp_version: c++20
 | 
				
			||||||
          - name: Debian-11
 | 
					          - name: Debian-11
 | 
				
			||||||
            # Uses gcc 10.2.1, clang 11.0.1, cmake 3.18.4
 | 
					 | 
				
			||||||
            image: "debian:bullseye"
 | 
					            image: "debian:bullseye"
 | 
				
			||||||
            installer: apt
 | 
					            c_compiler: clang
 | 
				
			||||||
 | 
					            cpp_compiler: clang++
 | 
				
			||||||
 | 
					          - name: Debian-11
 | 
				
			||||||
 | 
					            image: "debian:bullseye"
 | 
				
			||||||
            c_compiler: clang
 | 
					            c_compiler: clang
 | 
				
			||||||
            cpp_compiler: clang++
 | 
					            cpp_compiler: clang++
 | 
				
			||||||
            cpp_version: c++17
 | 
					            cpp_version: c++17
 | 
				
			||||||
          - name: Debian-11
 | 
					          - name: Debian-11
 | 
				
			||||||
            # Uses gcc 10.2.1, clang 11.0.1, cmake 3.18.4
 | 
					 | 
				
			||||||
            image: "debian:bullseye"
 | 
					            image: "debian:bullseye"
 | 
				
			||||||
            installer: apt
 | 
					 | 
				
			||||||
            c_compiler: clang
 | 
					            c_compiler: clang
 | 
				
			||||||
            cpp_compiler: clang++
 | 
					            cpp_compiler: clang++
 | 
				
			||||||
            cpp_version: c++20
 | 
					            cpp_version: c++20
 | 
				
			||||||
          - name: Debian-11
 | 
					          - name: Debian-11
 | 
				
			||||||
            # Uses gcc 10.2.1, clang 11.0.1, cmake 3.18.4
 | 
					 | 
				
			||||||
            image: "debian:bullseye"
 | 
					            image: "debian:bullseye"
 | 
				
			||||||
            installer: apt
 | 
					 | 
				
			||||||
            build_type: RelWithDebInfo
 | 
					            build_type: RelWithDebInfo
 | 
				
			||||||
          - name: Debian-11
 | 
					          - name: Debian-11
 | 
				
			||||||
            # Uses gcc 10.2.1, clang 11.0.1, cmake 3.18.4
 | 
					 | 
				
			||||||
            image: "debian:bullseye"
 | 
					            image: "debian:bullseye"
 | 
				
			||||||
            installer: apt
 | 
					 | 
				
			||||||
            c_compiler: clang
 | 
					            c_compiler: clang
 | 
				
			||||||
            cpp_compiler: clang++
 | 
					            cpp_compiler: clang++
 | 
				
			||||||
          - name: Debian-11
 | 
					            CXXFLAGS: -fsanitize=address,undefined -fno-sanitize-recover=all -fno-omit-frame-pointer
 | 
				
			||||||
            # Uses gcc 10.2.1, clang 11.0.1, cmake 3.18.4
 | 
					            LDFLAGS: -fsanitize=address,undefined
 | 
				
			||||||
            image: "debian:bullseye"
 | 
					          - name: Debian-12
 | 
				
			||||||
            installer: apt
 | 
					            # Uses gcc 12.2.0, clang 15.0.6, cmake 3.25.1
 | 
				
			||||||
            c_compiler: clang
 | 
					            image: "debian:bookworm"
 | 
				
			||||||
            cpp_compiler: clang++
 | 
					 | 
				
			||||||
            CXXFLAGS: -fsanitize=address,undefined,integer -fno-sanitize-recover=all -fno-omit-frame-pointer
 | 
					 | 
				
			||||||
            LDFLAGS: -fsanitize=address,undefined,integer
 | 
					 | 
				
			||||||
          - name: Debian-Testing
 | 
					 | 
				
			||||||
            # Uses gcc 10.3.0, clang 11.1.0, cmake 3.21.3
 | 
					 | 
				
			||||||
            image: "debian:testing"
 | 
					 | 
				
			||||||
            installer: apt
 | 
					 | 
				
			||||||
            CXXFLAGS: -Wno-stringop-overread
 | 
					            CXXFLAGS: -Wno-stringop-overread
 | 
				
			||||||
 | 
					          - name: Debian-12
 | 
				
			||||||
 | 
					            image: "debian:bookworm"
 | 
				
			||||||
 | 
					            cpp_version: c++17
 | 
				
			||||||
 | 
					            CXXFLAGS: -Wno-stringop-overread
 | 
				
			||||||
 | 
					          - name: Debian-12
 | 
				
			||||||
 | 
					            image: "debian:bookworm"
 | 
				
			||||||
 | 
					            cpp_version: c++20
 | 
				
			||||||
 | 
					            CXXFLAGS: -Wno-stringop-overread
 | 
				
			||||||
 | 
					          - name: Debian-12
 | 
				
			||||||
 | 
					            image: "debian:bookworm"
 | 
				
			||||||
 | 
					            c_compiler: clang
 | 
				
			||||||
 | 
					            cpp_compiler: clang++
 | 
				
			||||||
 | 
					          - name: Debian-12
 | 
				
			||||||
 | 
					            image: "debian:bookworm"
 | 
				
			||||||
 | 
					            c_compiler: clang
 | 
				
			||||||
 | 
					            cpp_compiler: clang++
 | 
				
			||||||
 | 
					            cpp_version: c++17
 | 
				
			||||||
 | 
					          - name: Debian-12
 | 
				
			||||||
 | 
					            image: "debian:bookworm"
 | 
				
			||||||
 | 
					            c_compiler: clang
 | 
				
			||||||
 | 
					            cpp_compiler: clang++
 | 
				
			||||||
 | 
					            cpp_version: c++20
 | 
				
			||||||
 | 
					          - name: Debian-12
 | 
				
			||||||
 | 
					            image: "debian:bookworm"
 | 
				
			||||||
 | 
					            build_type: RelWithDebInfo
 | 
				
			||||||
 | 
					            CXXFLAGS: -Wno-stringop-overread
 | 
				
			||||||
 | 
					          - name: Debian-12
 | 
				
			||||||
 | 
					            image: "debian:bookworm"
 | 
				
			||||||
 | 
					            c_compiler: clang
 | 
				
			||||||
 | 
					            cpp_compiler: clang++
 | 
				
			||||||
 | 
					            CXXFLAGS: -fsanitize=address,undefined -fno-sanitize-recover=all -fno-omit-frame-pointer
 | 
				
			||||||
 | 
					            LDFLAGS: -fsanitize=address,undefined
 | 
				
			||||||
 | 
					          - name: Debian-Testing
 | 
				
			||||||
 | 
					            image: "debian:testing"
 | 
				
			||||||
 | 
					            CXXFLAGS: -Wno-stringop-overread -Wno-dangling-reference
 | 
				
			||||||
          - name: Debian-Testing
 | 
					          - name: Debian-Testing
 | 
				
			||||||
            # Uses gcc 10.3.0, clang 11.1.0, cmake 3.21.3
 | 
					 | 
				
			||||||
            image: "debian:testing"
 | 
					            image: "debian:testing"
 | 
				
			||||||
            installer: apt
 | 
					 | 
				
			||||||
            c_compiler: clang
 | 
					            c_compiler: clang
 | 
				
			||||||
            cpp_compiler: clang++
 | 
					            cpp_compiler: clang++
 | 
				
			||||||
          - name: Debian-Experimental
 | 
					          - name: Debian-Experimental
 | 
				
			||||||
            # Uses gcc 11, clang 14, cmake 3.21.3
 | 
					 | 
				
			||||||
            image: "debian:experimental"
 | 
					            image: "debian:experimental"
 | 
				
			||||||
            installer: apt
 | 
					            CXXFLAGS: -Wno-stringop-overread -Wno-dangling-reference
 | 
				
			||||||
            CXXFLAGS: -Wno-stringop-overread
 | 
					 | 
				
			||||||
          - name: Debian-Experimental
 | 
					          - name: Debian-Experimental
 | 
				
			||||||
            # Uses gcc 11, clang 14, cmake 3.21.3
 | 
					 | 
				
			||||||
            image: "debian:experimental"
 | 
					            image: "debian:experimental"
 | 
				
			||||||
            installer: apt
 | 
					            c_compiler: clang
 | 
				
			||||||
            c_compiler: clang-14
 | 
					            cpp_compiler: clang++
 | 
				
			||||||
            cpp_compiler: clang++-14
 | 
					 | 
				
			||||||
          - name: Fedora-34
 | 
					 | 
				
			||||||
            # Uses gcc 11.2.1, clang 12.0.1, cmake 3.20.5
 | 
					 | 
				
			||||||
            image: "fedora:34"
 | 
					 | 
				
			||||||
            installer: dnf
 | 
					 | 
				
			||||||
            CXXFLAGS: -Wno-stringop-overread
 | 
					 | 
				
			||||||
          - name: Fedora-35
 | 
					          - name: Fedora-35
 | 
				
			||||||
            # Uses gcc 11.2.1, clang 12.0.1, cmake 3.20.5
 | 
					            # Uses gcc 11.2.1, clang 12.0.1, cmake 3.20.5
 | 
				
			||||||
            image: "fedora:35"
 | 
					            image: "fedora:35"
 | 
				
			||||||
            installer: dnf
 | 
					 | 
				
			||||||
            CXXFLAGS: -Wno-stringop-overread
 | 
					            CXXFLAGS: -Wno-stringop-overread
 | 
				
			||||||
 | 
					          - name: Fedora-36
 | 
				
			||||||
 | 
					            # Uses gcc 12.2.0, clang 14.0.5, cmake 3.24.2
 | 
				
			||||||
 | 
					            image: "fedora:36"
 | 
				
			||||||
 | 
					            CXXFLAGS: -Wno-stringop-overread
 | 
				
			||||||
 | 
					          - name: Fedora-37
 | 
				
			||||||
 | 
					            # Uses gcc 12.3.1, clang 15.0.7, cmake 3.26.4
 | 
				
			||||||
 | 
					            image: "fedora:37"
 | 
				
			||||||
 | 
					            CXXFLAGS: -Wno-stringop-overread
 | 
				
			||||||
 | 
					          - name: Fedora-38
 | 
				
			||||||
 | 
					            # Uses gcc 13.0.1, clang 16.0.5, cmake 3.26.4
 | 
				
			||||||
 | 
					            image: "fedora:38"
 | 
				
			||||||
 | 
					            CXXFLAGS: -Wno-stringop-overread -Wno-dangling-reference
 | 
				
			||||||
    container:
 | 
					    container:
 | 
				
			||||||
      image: ${{ matrix.image }}
 | 
					      image: ${{ matrix.image }}
 | 
				
			||||||
      env:
 | 
					      env:
 | 
				
			||||||
        LANG: en_US.UTF-8
 | 
					        LANG: en_US.UTF-8
 | 
				
			||||||
        BUILD_TYPE: ${{ matrix.build_type }}
 | 
					        BUILD_TYPE: ${{ matrix.build_type }}
 | 
				
			||||||
        CXXFLAGS: ${{ matrix.CXXFLAGS }}
 | 
					 | 
				
			||||||
        LDFLAGS: ${{ matrix.LDFLAGS }}
 | 
					 | 
				
			||||||
        CC: ${{ matrix.c_compiler }}
 | 
					        CC: ${{ matrix.c_compiler }}
 | 
				
			||||||
        CXX: ${{ matrix.cpp_compiler }}
 | 
					        CXX: ${{ matrix.cpp_compiler }}
 | 
				
			||||||
 | 
					        CXXFLAGS: ${{ matrix.CXXFLAGS }}
 | 
				
			||||||
 | 
					        LDFLAGS: ${{ matrix.LDFLAGS }}
 | 
				
			||||||
        CPP_VERSION: ${{ matrix.cpp_version }}
 | 
					        CPP_VERSION: ${{ matrix.cpp_version }}
 | 
				
			||||||
        WITH_PROJ: ON
 | 
					        WITH_PROJ: ON
 | 
				
			||||||
 | 
					        APT_LISTCHANGES_FRONTEND: none
 | 
				
			||||||
 | 
					        DEBIAN_FRONTEND: noninteractive
 | 
				
			||||||
    steps:
 | 
					    steps:
 | 
				
			||||||
      - name: Prepare container (apt)
 | 
					      - name: Prepare container (apt)
 | 
				
			||||||
 | 
					        shell: bash
 | 
				
			||||||
 | 
					        if: startsWith(matrix.image, 'debian:') || startsWith(matrix.image, 'ubuntu:')
 | 
				
			||||||
        run: |
 | 
					        run: |
 | 
				
			||||||
          export APT_LISTCHANGES_FRONTEND=none
 | 
					 | 
				
			||||||
          export DEBIAN_FRONTEND=noninteractive
 | 
					 | 
				
			||||||
          apt-get update -qq
 | 
					          apt-get update -qq
 | 
				
			||||||
          apt-get install -y \
 | 
					          apt-get install -yq \
 | 
				
			||||||
            clang \
 | 
					            clang \
 | 
				
			||||||
            cmake \
 | 
					            cmake \
 | 
				
			||||||
            doxygen \
 | 
					            doxygen \
 | 
				
			||||||
@ -154,16 +167,13 @@ jobs:
 | 
				
			|||||||
            ruby-json \
 | 
					            ruby-json \
 | 
				
			||||||
            spatialite-bin \
 | 
					            spatialite-bin \
 | 
				
			||||||
            zlib1g-dev
 | 
					            zlib1g-dev
 | 
				
			||||||
        shell: bash
 | 
					 | 
				
			||||||
        if: matrix.installer == 'apt'
 | 
					 | 
				
			||||||
      - name: Install compiler
 | 
					      - name: Install compiler
 | 
				
			||||||
        shell: bash
 | 
					        shell: bash
 | 
				
			||||||
        run: |
 | 
					 | 
				
			||||||
          export APT_LISTCHANGES_FRONTEND=none
 | 
					 | 
				
			||||||
          export DEBIAN_FRONTEND=noninteractive
 | 
					 | 
				
			||||||
          apt-get install -y clang-14
 | 
					 | 
				
			||||||
        if: matrix.cpp_compiler == 'clang++-14'
 | 
					        if: matrix.cpp_compiler == 'clang++-14'
 | 
				
			||||||
 | 
					        run: apt-get install -yq clang-14
 | 
				
			||||||
      - name: Prepare container (dnf)
 | 
					      - name: Prepare container (dnf)
 | 
				
			||||||
 | 
					        shell: bash
 | 
				
			||||||
 | 
					        if: startsWith(matrix.image, 'fedora:')
 | 
				
			||||||
        run: |
 | 
					        run: |
 | 
				
			||||||
          dnf install --quiet --assumeyes \
 | 
					          dnf install --quiet --assumeyes \
 | 
				
			||||||
              boost-devel \
 | 
					              boost-devel \
 | 
				
			||||||
@ -185,9 +195,7 @@ jobs:
 | 
				
			|||||||
              sparsehash-devel \
 | 
					              sparsehash-devel \
 | 
				
			||||||
              spatialite-tools \
 | 
					              spatialite-tools \
 | 
				
			||||||
              zlib-devel
 | 
					              zlib-devel
 | 
				
			||||||
        shell: bash
 | 
					      # Use v1 of checkout because v3 doesn't work with submodules
 | 
				
			||||||
        if: matrix.installer == 'dnf'
 | 
					 | 
				
			||||||
      # Use v1 of checkout because v2 doesn't work with submodules
 | 
					 | 
				
			||||||
      - uses: actions/checkout@v1
 | 
					      - uses: actions/checkout@v1
 | 
				
			||||||
        with:
 | 
					        with:
 | 
				
			||||||
          submodules: true
 | 
					          submodules: true
 | 
				
			||||||
@ -197,21 +205,23 @@ jobs:
 | 
				
			|||||||
      - uses: ./.github/actions/ctest
 | 
					      - uses: ./.github/actions/ctest
 | 
				
			||||||
 | 
					
 | 
				
			||||||
  ubuntu-latest:
 | 
					  ubuntu-latest:
 | 
				
			||||||
    runs-on: ubuntu-20.04
 | 
					    runs-on: ubuntu-22.04
 | 
				
			||||||
    timeout-minutes: 40
 | 
					    timeout-minutes: 40
 | 
				
			||||||
    env:
 | 
					    env:
 | 
				
			||||||
      CC: clang-13
 | 
					      CC: clang-15
 | 
				
			||||||
      CXX: clang++-13
 | 
					      CXX: clang++-15
 | 
				
			||||||
      BUILD_TYPE: Dev
 | 
					      BUILD_TYPE: Dev
 | 
				
			||||||
      WITH_PROJ: ON
 | 
					      WITH_PROJ: ON
 | 
				
			||||||
    steps:
 | 
					    steps:
 | 
				
			||||||
      - uses: actions/checkout@v2
 | 
					      - uses: actions/checkout@v3
 | 
				
			||||||
        with:
 | 
					        with:
 | 
				
			||||||
          submodules: true
 | 
					          submodules: true
 | 
				
			||||||
      - name: Install new clang
 | 
					      - name: Install new clang
 | 
				
			||||||
        run: |
 | 
					        run: |
 | 
				
			||||||
          wget -O - https://apt.llvm.org/llvm-snapshot.gpg.key | sudo apt-key add -
 | 
					          wget -O - https://apt.llvm.org/llvm-snapshot.gpg.key | sudo tee /etc/apt/trusted.gpg.d/llvm-snapshot.asc
 | 
				
			||||||
          sudo add-apt-repository 'deb http://apt.llvm.org/focal/ llvm-toolchain-focal-13 main'
 | 
					          sudo add-apt-repository 'deb http://apt.llvm.org/jammy/ llvm-toolchain-jammy-15 main'
 | 
				
			||||||
 | 
					          sudo apt-get update -qq
 | 
				
			||||||
 | 
					          sudo apt-get install -yq clang-15
 | 
				
			||||||
        shell: bash
 | 
					        shell: bash
 | 
				
			||||||
      - uses: ./.github/actions/install-ubuntu
 | 
					      - uses: ./.github/actions/install-ubuntu
 | 
				
			||||||
      - uses: ./.github/actions/install-protozero
 | 
					      - uses: ./.github/actions/install-protozero
 | 
				
			||||||
@ -219,16 +229,27 @@ jobs:
 | 
				
			|||||||
      - uses: ./.github/actions/build
 | 
					      - uses: ./.github/actions/build
 | 
				
			||||||
      - uses: ./.github/actions/ctest
 | 
					      - uses: ./.github/actions/ctest
 | 
				
			||||||
 | 
					
 | 
				
			||||||
  macos10-dev:
 | 
					  macos:
 | 
				
			||||||
    runs-on: macos-10.15
 | 
					 | 
				
			||||||
    timeout-minutes: 60
 | 
					    timeout-minutes: 60
 | 
				
			||||||
 | 
					    strategy:
 | 
				
			||||||
 | 
					      fail-fast: false
 | 
				
			||||||
 | 
					      matrix:
 | 
				
			||||||
 | 
					        os:
 | 
				
			||||||
 | 
					          - "macos-11"
 | 
				
			||||||
 | 
					          - "macos-12"
 | 
				
			||||||
 | 
					          - "macos-13"
 | 
				
			||||||
 | 
					        build_type: [Dev]
 | 
				
			||||||
 | 
					        include:
 | 
				
			||||||
 | 
					          - os: "macos-12"
 | 
				
			||||||
 | 
					            build_type: Release
 | 
				
			||||||
 | 
					    runs-on: ${{ matrix.os }}
 | 
				
			||||||
    env:
 | 
					    env:
 | 
				
			||||||
      CC: clang
 | 
					      CC: clang
 | 
				
			||||||
      CXX: clang++
 | 
					      CXX: clang++
 | 
				
			||||||
      BUILD_TYPE: Dev
 | 
					      BUILD_TYPE: ${{ matrix.build_type }}
 | 
				
			||||||
      WITH_PROJ: OFF
 | 
					      WITH_PROJ: OFF
 | 
				
			||||||
    steps:
 | 
					    steps:
 | 
				
			||||||
      - uses: actions/checkout@v2
 | 
					      - uses: actions/checkout@v3
 | 
				
			||||||
        with:
 | 
					        with:
 | 
				
			||||||
          submodules: true
 | 
					          submodules: true
 | 
				
			||||||
      - uses: ./.github/actions/install-macos
 | 
					      - uses: ./.github/actions/install-macos
 | 
				
			||||||
@ -237,47 +258,17 @@ jobs:
 | 
				
			|||||||
      - uses: ./.github/actions/build
 | 
					      - uses: ./.github/actions/build
 | 
				
			||||||
      - uses: ./.github/actions/ctest
 | 
					      - uses: ./.github/actions/ctest
 | 
				
			||||||
 | 
					
 | 
				
			||||||
  macos11-dev:
 | 
					  windows-minimal:
 | 
				
			||||||
    runs-on: macos-11
 | 
					 | 
				
			||||||
    timeout-minutes: 60
 | 
					 | 
				
			||||||
    env:
 | 
					 | 
				
			||||||
      CC: clang
 | 
					 | 
				
			||||||
      CXX: clang++
 | 
					 | 
				
			||||||
      BUILD_TYPE: Dev
 | 
					 | 
				
			||||||
      WITH_PROJ: OFF
 | 
					 | 
				
			||||||
    steps:
 | 
					 | 
				
			||||||
      - uses: actions/checkout@v2
 | 
					 | 
				
			||||||
        with:
 | 
					 | 
				
			||||||
          submodules: true
 | 
					 | 
				
			||||||
      - uses: ./.github/actions/install-macos
 | 
					 | 
				
			||||||
      - uses: ./.github/actions/install-protozero
 | 
					 | 
				
			||||||
      - uses: ./.github/actions/cmake
 | 
					 | 
				
			||||||
      - uses: ./.github/actions/build
 | 
					 | 
				
			||||||
      - uses: ./.github/actions/ctest
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
  macos11-release:
 | 
					 | 
				
			||||||
    runs-on: macos-11
 | 
					 | 
				
			||||||
    timeout-minutes: 60
 | 
					 | 
				
			||||||
    env:
 | 
					 | 
				
			||||||
      CC: clang
 | 
					 | 
				
			||||||
      CXX: clang++
 | 
					 | 
				
			||||||
      BUILD_TYPE: Release
 | 
					 | 
				
			||||||
      WITH_PROJ: OFF
 | 
					 | 
				
			||||||
    steps:
 | 
					 | 
				
			||||||
      - uses: actions/checkout@v2
 | 
					 | 
				
			||||||
        with:
 | 
					 | 
				
			||||||
          submodules: true
 | 
					 | 
				
			||||||
      - uses: ./.github/actions/install-macos
 | 
					 | 
				
			||||||
      - uses: ./.github/actions/install-protozero
 | 
					 | 
				
			||||||
      - uses: ./.github/actions/cmake
 | 
					 | 
				
			||||||
      - uses: ./.github/actions/build
 | 
					 | 
				
			||||||
      - uses: ./.github/actions/ctest
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
  windows-2019-minimal:
 | 
					 | 
				
			||||||
    runs-on: windows-2019
 | 
					 | 
				
			||||||
    timeout-minutes: 40
 | 
					    timeout-minutes: 40
 | 
				
			||||||
 | 
					    strategy:
 | 
				
			||||||
 | 
					      fail-fast: false
 | 
				
			||||||
 | 
					      matrix:
 | 
				
			||||||
 | 
					        os:
 | 
				
			||||||
 | 
					          - windows-2019
 | 
				
			||||||
 | 
					          - windows-2022
 | 
				
			||||||
 | 
					    runs-on: ${{ matrix.os }}
 | 
				
			||||||
    steps:
 | 
					    steps:
 | 
				
			||||||
      - uses: actions/checkout@v2
 | 
					      - uses: actions/checkout@v3
 | 
				
			||||||
        with:
 | 
					        with:
 | 
				
			||||||
          submodules: true
 | 
					          submodules: true
 | 
				
			||||||
      - uses: ./.github/actions/install-windows
 | 
					      - uses: ./.github/actions/install-windows
 | 
				
			||||||
@ -289,7 +280,7 @@ jobs:
 | 
				
			|||||||
  windows-2019-full:
 | 
					  windows-2019-full:
 | 
				
			||||||
    runs-on: windows-2019
 | 
					    runs-on: windows-2019
 | 
				
			||||||
    steps:
 | 
					    steps:
 | 
				
			||||||
      - uses: actions/checkout@v2
 | 
					      - uses: actions/checkout@v3
 | 
				
			||||||
        with:
 | 
					        with:
 | 
				
			||||||
          submodules: true
 | 
					          submodules: true
 | 
				
			||||||
      - uses: ./.github/actions/install-windows
 | 
					      - uses: ./.github/actions/install-windows
 | 
				
			||||||
@ -301,16 +292,3 @@ jobs:
 | 
				
			|||||||
      - uses: ./.github/actions/build-windows
 | 
					      - uses: ./.github/actions/build-windows
 | 
				
			||||||
      - uses: ./.github/actions/ctest-windows
 | 
					      - uses: ./.github/actions/ctest-windows
 | 
				
			||||||
 | 
					
 | 
				
			||||||
  windows-2022-minimal:
 | 
					 | 
				
			||||||
    runs-on: windows-2022
 | 
					 | 
				
			||||||
    timeout-minutes: 40
 | 
					 | 
				
			||||||
    steps:
 | 
					 | 
				
			||||||
      - uses: actions/checkout@v2
 | 
					 | 
				
			||||||
        with:
 | 
					 | 
				
			||||||
          submodules: true
 | 
					 | 
				
			||||||
      - uses: ./.github/actions/install-windows
 | 
					 | 
				
			||||||
      - uses: ./.github/actions/install-protozero
 | 
					 | 
				
			||||||
      - uses: ./.github/actions/cmake-windows
 | 
					 | 
				
			||||||
      - uses: ./.github/actions/build-windows
 | 
					 | 
				
			||||||
      - uses: ./.github/actions/ctest-windows
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
 | 
				
			|||||||
@ -3,7 +3,6 @@ name: clang-tidy
 | 
				
			|||||||
on: workflow_dispatch
 | 
					on: workflow_dispatch
 | 
				
			||||||
 | 
					
 | 
				
			||||||
jobs:
 | 
					jobs:
 | 
				
			||||||
 | 
					 | 
				
			||||||
  clang-tidy:
 | 
					  clang-tidy:
 | 
				
			||||||
    runs-on: ubuntu-latest
 | 
					    runs-on: ubuntu-latest
 | 
				
			||||||
    strategy:
 | 
					    strategy:
 | 
				
			||||||
@ -14,9 +13,9 @@ jobs:
 | 
				
			|||||||
          - image: "debian:bullseye"
 | 
					          - image: "debian:bullseye"
 | 
				
			||||||
            clang: 11
 | 
					            clang: 11
 | 
				
			||||||
          - image: "debian:testing"
 | 
					          - image: "debian:testing"
 | 
				
			||||||
            clang: 12
 | 
					            clang: 15
 | 
				
			||||||
          - image: "debian:experimental"
 | 
					          - image: "debian:experimental"
 | 
				
			||||||
            clang: 14
 | 
					            clang: 15
 | 
				
			||||||
    container:
 | 
					    container:
 | 
				
			||||||
      image: ${{ matrix.image }}
 | 
					      image: ${{ matrix.image }}
 | 
				
			||||||
      env:
 | 
					      env:
 | 
				
			||||||
@ -25,13 +24,13 @@ jobs:
 | 
				
			|||||||
        CXX: clang++-${{ matrix.clang }}
 | 
					        CXX: clang++-${{ matrix.clang }}
 | 
				
			||||||
        CPP_VERSION: c++11
 | 
					        CPP_VERSION: c++11
 | 
				
			||||||
        WITH_PROJ: ON
 | 
					        WITH_PROJ: ON
 | 
				
			||||||
 | 
					        APT_LISTCHANGES_FRONTEND: none
 | 
				
			||||||
 | 
					        DEBIAN_FRONTEND: noninteractive
 | 
				
			||||||
    steps:
 | 
					    steps:
 | 
				
			||||||
      - name: Prepare container (apt)
 | 
					      - name: Prepare container (apt)
 | 
				
			||||||
        run: |
 | 
					        run: |
 | 
				
			||||||
          export APT_LISTCHANGES_FRONTEND=none
 | 
					 | 
				
			||||||
          export DEBIAN_FRONTEND=noninteractive
 | 
					 | 
				
			||||||
          apt-get update -qq
 | 
					          apt-get update -qq
 | 
				
			||||||
          apt-get install -y \
 | 
					          apt-get install -yq \
 | 
				
			||||||
                  clang-${{ matrix.clang }} \
 | 
					                  clang-${{ matrix.clang }} \
 | 
				
			||||||
                  clang-tidy-${{ matrix.clang }} \
 | 
					                  clang-tidy-${{ matrix.clang }} \
 | 
				
			||||||
                  cmake \
 | 
					                  cmake \
 | 
				
			||||||
@ -47,7 +46,7 @@ jobs:
 | 
				
			|||||||
                  make \
 | 
					                  make \
 | 
				
			||||||
                  zlib1g-dev
 | 
					                  zlib1g-dev
 | 
				
			||||||
        shell: bash
 | 
					        shell: bash
 | 
				
			||||||
      # Use v1 of checkout because v2 doesn't work with submodules
 | 
					      # Use v1 of checkout because v3 doesn't work with submodules
 | 
				
			||||||
      - uses: actions/checkout@v1
 | 
					      - uses: actions/checkout@v1
 | 
				
			||||||
        with:
 | 
					        with:
 | 
				
			||||||
          submodules: true
 | 
					          submodules: true
 | 
				
			||||||
@ -58,7 +57,7 @@ jobs:
 | 
				
			|||||||
        shell: bash
 | 
					        shell: bash
 | 
				
			||||||
        working-directory: build
 | 
					        working-directory: build
 | 
				
			||||||
      - name: Upload Log
 | 
					      - name: Upload Log
 | 
				
			||||||
        uses: actions/upload-artifact@v2
 | 
					        uses: actions/upload-artifact@v3
 | 
				
			||||||
        if: always()
 | 
					        if: always()
 | 
				
			||||||
        with:
 | 
					        with:
 | 
				
			||||||
          name: clang-tidy-${{ matrix.clang }}-log
 | 
					          name: clang-tidy-${{ matrix.clang }}-log
 | 
				
			||||||
 | 
				
			|||||||
							
								
								
									
										53
									
								
								third_party/libosmium/.ycm_extra_conf.py
									
									
									
									
										vendored
									
									
								
							
							
						
						
									
										53
									
								
								third_party/libosmium/.ycm_extra_conf.py
									
									
									
									
										vendored
									
									
								
							@ -1,53 +0,0 @@
 | 
				
			|||||||
#-----------------------------------------------------------------------------
 | 
					 | 
				
			||||||
#
 | 
					 | 
				
			||||||
#  Configuration for YouCompleteMe Vim plugin
 | 
					 | 
				
			||||||
#
 | 
					 | 
				
			||||||
#  https://valloric.github.io/YouCompleteMe/
 | 
					 | 
				
			||||||
#
 | 
					 | 
				
			||||||
#-----------------------------------------------------------------------------
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
from os.path import realpath, dirname
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
basedir = dirname(realpath(__file__))
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
# some default flags
 | 
					 | 
				
			||||||
# for more information install clang-3.2-doc package and
 | 
					 | 
				
			||||||
# check UsersManual.html
 | 
					 | 
				
			||||||
flags = [
 | 
					 | 
				
			||||||
'-Werror',
 | 
					 | 
				
			||||||
'-Wall',
 | 
					 | 
				
			||||||
'-Wextra',
 | 
					 | 
				
			||||||
'-pedantic',
 | 
					 | 
				
			||||||
'-Wno-return-type',
 | 
					 | 
				
			||||||
'-Wno-unused-parameter',
 | 
					 | 
				
			||||||
'-Wno-unused-variable',
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
'-std=c++11',
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
# '-x' and 'c++' also required
 | 
					 | 
				
			||||||
# use 'c' for C projects
 | 
					 | 
				
			||||||
'-x',
 | 
					 | 
				
			||||||
'c++',
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
# workaround for https://github.com/Valloric/YouCompleteMe/issues/303
 | 
					 | 
				
			||||||
# also see https://bugs.debian.org/cgi-bin/bugreport.cgi?bug=800618
 | 
					 | 
				
			||||||
'-isystem',
 | 
					 | 
				
			||||||
'/usr/lib/ycmd/clang_includes/',
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
# libosmium include dirs
 | 
					 | 
				
			||||||
'-I%s/include' % basedir,
 | 
					 | 
				
			||||||
'-I%s/test/include' % basedir,
 | 
					 | 
				
			||||||
'-I%s/test/data-test/include' % basedir,
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
# include third party libraries
 | 
					 | 
				
			||||||
'-I/usr/include/gdal',
 | 
					 | 
				
			||||||
]
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
# youcompleteme is calling this function to get flags
 | 
					 | 
				
			||||||
# You can also set database for flags. Check: JSONCompilationDatabase.html in
 | 
					 | 
				
			||||||
# clang-3.2-doc package
 | 
					 | 
				
			||||||
def FlagsForFile( filename ):
 | 
					 | 
				
			||||||
  return {
 | 
					 | 
				
			||||||
    'flags': flags,
 | 
					 | 
				
			||||||
    'do_cache': True
 | 
					 | 
				
			||||||
  }
 | 
					 | 
				
			||||||
							
								
								
									
										36
									
								
								third_party/libosmium/CHANGELOG.md
									
									
									
									
										vendored
									
									
								
							
							
						
						
									
										36
									
								
								third_party/libosmium/CHANGELOG.md
									
									
									
									
										vendored
									
									
								
							@ -12,6 +12,38 @@ This project adheres to [Semantic Versioning](https://semver.org/).
 | 
				
			|||||||
 | 
					
 | 
				
			||||||
### Fixed
 | 
					### Fixed
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					## [2.20.0] - 2023-09-20
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					### Changed
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					* Optionally allow fractional seconds in timestamps in OSM files.
 | 
				
			||||||
 | 
					* Enable `posix_fadvise` usage on FreeBSD.
 | 
				
			||||||
 | 
					* Make parsing PBFs a bit less picky.
 | 
				
			||||||
 | 
					* Various small code cleanups.
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					### Fixed
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					* Don't use class template arguments on `GeometryFactory` constructor
 | 
				
			||||||
 | 
					  definition.
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					## [2.19.0] - 2023-01-19
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					### Changed
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					* Mark RapidJSON support as deprecated.
 | 
				
			||||||
 | 
					* Update included Catch to v2.13.10.
 | 
				
			||||||
 | 
					* Remove deprecated BoolVector class.
 | 
				
			||||||
 | 
					* Remove deprecated NWRIdSet class.
 | 
				
			||||||
 | 
					* Remove deprecated AssemblerConfig constructor.
 | 
				
			||||||
 | 
					* Print start of offending string in overlong string exception.
 | 
				
			||||||
 | 
					* Implement `set_thread_name()` on FreeBSD.
 | 
				
			||||||
 | 
					* Some small code cleanups.
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					### Fixed
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					* Fix return type in `MembersDatabaseCommon::count_not_removed()`.
 | 
				
			||||||
 | 
					* Make bzip2 unit tests pass on musl-based systems.
 | 
				
			||||||
 | 
					* Fix bug in members database test case.
 | 
				
			||||||
 | 
					
 | 
				
			||||||
## [2.18.0] - 2022-02-07
 | 
					## [2.18.0] - 2022-02-07
 | 
				
			||||||
 | 
					
 | 
				
			||||||
@ -1253,7 +1285,9 @@ long time. These will not be part of the next version of libosmium:
 | 
				
			|||||||
  Doxygen (up to version 1.8.8). This version contains a workaround to fix
 | 
					  Doxygen (up to version 1.8.8). This version contains a workaround to fix
 | 
				
			||||||
  this.
 | 
					  this.
 | 
				
			||||||
 | 
					
 | 
				
			||||||
[unreleased]: https://github.com/osmcode/libosmium/compare/v2.18.0...HEAD
 | 
					[unreleased]: https://github.com/osmcode/libosmium/compare/v2.20.0...HEAD
 | 
				
			||||||
 | 
					[2.20.0]: https://github.com/osmcode/libosmium/compare/v2.19.0...v2.20.0
 | 
				
			||||||
 | 
					[2.19.0]: https://github.com/osmcode/libosmium/compare/v2.18.9...v2.19.0
 | 
				
			||||||
[2.18.0]: https://github.com/osmcode/libosmium/compare/v2.17.3...v2.18.0
 | 
					[2.18.0]: https://github.com/osmcode/libosmium/compare/v2.17.3...v2.18.0
 | 
				
			||||||
[2.17.3]: https://github.com/osmcode/libosmium/compare/v2.17.2...v2.17.3
 | 
					[2.17.3]: https://github.com/osmcode/libosmium/compare/v2.17.2...v2.17.3
 | 
				
			||||||
[2.17.2]: https://github.com/osmcode/libosmium/compare/v2.17.1...v2.17.2
 | 
					[2.17.2]: https://github.com/osmcode/libosmium/compare/v2.17.1...v2.17.2
 | 
				
			||||||
 | 
				
			|||||||
							
								
								
									
										4
									
								
								third_party/libosmium/CMakeLists.txt
									
									
									
									
										vendored
									
									
								
							
							
						
						
									
										4
									
								
								third_party/libosmium/CMakeLists.txt
									
									
									
									
										vendored
									
									
								
							@ -39,7 +39,7 @@ set(CMAKE_CONFIGURATION_TYPES "Debug;Release;RelWithDebInfo;MinSizeRel;Dev;Cover
 | 
				
			|||||||
project(libosmium)
 | 
					project(libosmium)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
set(LIBOSMIUM_VERSION_MAJOR 2)
 | 
					set(LIBOSMIUM_VERSION_MAJOR 2)
 | 
				
			||||||
set(LIBOSMIUM_VERSION_MINOR 18)
 | 
					set(LIBOSMIUM_VERSION_MINOR 20)
 | 
				
			||||||
set(LIBOSMIUM_VERSION_PATCH 0)
 | 
					set(LIBOSMIUM_VERSION_PATCH 0)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
set(LIBOSMIUM_VERSION
 | 
					set(LIBOSMIUM_VERSION
 | 
				
			||||||
@ -427,7 +427,7 @@ endif()
 | 
				
			|||||||
#
 | 
					#
 | 
				
			||||||
#-----------------------------------------------------------------------------
 | 
					#-----------------------------------------------------------------------------
 | 
				
			||||||
message(STATUS "Looking for clang-tidy")
 | 
					message(STATUS "Looking for clang-tidy")
 | 
				
			||||||
find_program(CLANG_TIDY NAMES clang-tidy clang-tidy-14 clang-tidy-13 clang-tidy-12 clang-tidy-11)
 | 
					find_program(CLANG_TIDY NAMES clang-tidy clang-tidy-16 clang-tidy-15 clang-tidy-14 clang-tidy-13 clang-tidy-12 clang-tidy-11)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
if(CLANG_TIDY)
 | 
					if(CLANG_TIDY)
 | 
				
			||||||
    message(STATUS "Looking for clang-tidy - found ${CLANG_TIDY}")
 | 
					    message(STATUS "Looking for clang-tidy - found ${CLANG_TIDY}")
 | 
				
			||||||
 | 
				
			|||||||
@ -136,8 +136,7 @@ directory, some data tests in `test/osm-testdata` and tests of the examples in
 | 
				
			|||||||
`test/examples`. They are built by the default cmake config. Run `ctest` to
 | 
					`test/examples`. They are built by the default cmake config. Run `ctest` to
 | 
				
			||||||
run them. We can always use more tests.
 | 
					run them. We can always use more tests.
 | 
				
			||||||
 | 
					
 | 
				
			||||||
Tests are run automatically using Github Actions (Linux/macOS) and Appveyor
 | 
					Tests are run automatically using Github Actions.
 | 
				
			||||||
(Windows) services.
 | 
					 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					
 | 
				
			||||||
## Documenting the code
 | 
					## Documenting the code
 | 
				
			||||||
 | 
				
			|||||||
							
								
								
									
										14
									
								
								third_party/libosmium/README.md
									
									
									
									
										vendored
									
									
								
							
							
						
						
									
										14
									
								
								third_party/libosmium/README.md
									
									
									
									
										vendored
									
									
								
							@ -7,8 +7,6 @@ A fast and flexible C++ library for working with OpenStreetMap data.
 | 
				
			|||||||
Libosmium works on Linux, macOS and Windows.
 | 
					Libosmium works on Linux, macOS and Windows.
 | 
				
			||||||
 | 
					
 | 
				
			||||||
[](https://github.com/osmcode/libosmium/actions)
 | 
					[](https://github.com/osmcode/libosmium/actions)
 | 
				
			||||||
[](https://ci.appveyor.com/project/lonvia/libosmium-eq41p/branch/master)
 | 
					 | 
				
			||||||
[](https://codecov.io/gh/osmcode/libosmium)
 | 
					 | 
				
			||||||
[](https://repology.org/metapackage/libosmium)
 | 
					[](https://repology.org/metapackage/libosmium)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
Please see the [Libosmium manual](https://osmcode.org/libosmium/manual.html)
 | 
					Please see the [Libosmium manual](https://osmcode.org/libosmium/manual.html)
 | 
				
			||||||
@ -17,9 +15,8 @@ for more details than this README can provide.
 | 
				
			|||||||
 | 
					
 | 
				
			||||||
## Prerequisites
 | 
					## Prerequisites
 | 
				
			||||||
 | 
					
 | 
				
			||||||
Because Libosmium uses many C++11 features you need a modern compiler and
 | 
					You need a C++11 compiler and standard C++ library. Osmium needs at least GCC
 | 
				
			||||||
standard C++ library. Osmium needs at least GCC 4.8 or clang (LLVM) 3.4.
 | 
					4.8 or clang (LLVM) 3.4. (Some parts may work with older versions.)
 | 
				
			||||||
(Some parts may work with older versions.)
 | 
					 | 
				
			||||||
 | 
					
 | 
				
			||||||
Different parts of Libosmium (and the applications built on top of it) need
 | 
					Different parts of Libosmium (and the applications built on top of it) need
 | 
				
			||||||
different libraries. You DO NOT NEED to install all of them, just install those
 | 
					different libraries. You DO NOT NEED to install all of them, just install those
 | 
				
			||||||
@ -88,13 +85,6 @@ See the
 | 
				
			|||||||
for instructions.
 | 
					for instructions.
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					
 | 
				
			||||||
## Switching from the old Osmium
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
If you have been using the old version of Osmium at
 | 
					 | 
				
			||||||
https://github.com/joto/osmium you might want to read about the [changes
 | 
					 | 
				
			||||||
needed](https://osmcode.org/libosmium/manual.html#changes-from-old-versions-of-osmium).
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
## License
 | 
					## License
 | 
				
			||||||
 | 
					
 | 
				
			||||||
Libosmium is available under the Boost Software License. See LICENSE.
 | 
					Libosmium is available under the Boost Software License. See LICENSE.
 | 
				
			||||||
 | 
				
			|||||||
@ -47,7 +47,7 @@ int main(int argc, char* argv[]) {
 | 
				
			|||||||
    try {
 | 
					    try {
 | 
				
			||||||
        const std::string input_filename{argv[1]};
 | 
					        const std::string input_filename{argv[1]};
 | 
				
			||||||
 | 
					
 | 
				
			||||||
        osmium::memory::Buffer buffer{osmium::io::read_file(input_filename)};
 | 
					        const osmium::memory::Buffer buffer{osmium::io::read_file(input_filename)};
 | 
				
			||||||
 | 
					
 | 
				
			||||||
        const auto& map_factory = osmium::index::MapFactory<osmium::unsigned_object_id_type, osmium::Location>::instance();
 | 
					        const auto& map_factory = osmium::index::MapFactory<osmium::unsigned_object_id_type, osmium::Location>::instance();
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
				
			|||||||
@ -18,12 +18,12 @@ int main(int argc, char* argv[]) {
 | 
				
			|||||||
    }
 | 
					    }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    try {
 | 
					    try {
 | 
				
			||||||
        std::string input_filename{argv[1]};
 | 
					        const std::string input_filename{argv[1]};
 | 
				
			||||||
        std::string output_filename{argv[2]};
 | 
					        const std::string output_filename{argv[2]};
 | 
				
			||||||
 | 
					
 | 
				
			||||||
        osmium::io::Reader reader{input_filename};
 | 
					        osmium::io::Reader reader{input_filename};
 | 
				
			||||||
        osmium::io::File output_file{output_filename, "pbf"};
 | 
					        const osmium::io::File output_file{output_filename, "pbf"};
 | 
				
			||||||
        osmium::io::Header header;
 | 
					        const osmium::io::Header header;
 | 
				
			||||||
        osmium::io::Writer writer{output_file, header, osmium::io::overwrite::allow};
 | 
					        osmium::io::Writer writer{output_file, header, osmium::io::overwrite::allow};
 | 
				
			||||||
 | 
					
 | 
				
			||||||
        while (osmium::memory::Buffer buffer = reader.read()) { // NOLINT(bugprone-use-after-move) Bug in clang-tidy https://bugs.llvm.org/show_bug.cgi?id=36516
 | 
					        while (osmium::memory::Buffer buffer = reader.read()) { // NOLINT(bugprone-use-after-move) Bug in clang-tidy https://bugs.llvm.org/show_bug.cgi?id=36516
 | 
				
			||||||
 | 
				
			|||||||
							
								
								
									
										9
									
								
								third_party/libosmium/build-appveyor.bat
									
									
									
									
										vendored
									
									
								
							
							
						
						
									
										9
									
								
								third_party/libosmium/build-appveyor.bat
									
									
									
									
										vendored
									
									
								
							@ -24,6 +24,11 @@ IF %ERRORLEVEL% NEQ 0 GOTO ERROR
 | 
				
			|||||||
 | 
					
 | 
				
			||||||
SET PATH=C:/projects/bzip2.v140.1.0.6.9/build/native/bin/x64/%config%;%PATH%
 | 
					SET PATH=C:/projects/bzip2.v140.1.0.6.9/build/native/bin/x64/%config%;%PATH%
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					nuget install lz4 -Version 1.3.1.2
 | 
				
			||||||
 | 
					IF %ERRORLEVEL% NEQ 0 GOTO ERROR
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					SET PATH=C:/projects/lz4.1.3.1.2/build/native/bin/x64/%config%;%PATH%
 | 
				
			||||||
 | 
					
 | 
				
			||||||
CD libosmium
 | 
					CD libosmium
 | 
				
			||||||
 | 
					
 | 
				
			||||||
ECHO config^: %config%
 | 
					ECHO config^: %config%
 | 
				
			||||||
@ -52,7 +57,9 @@ SET CMAKE_CMD=cmake .. -LA -G "Visual Studio 14 Win64" ^
 | 
				
			|||||||
-DEXPAT_INCLUDE_DIR=C:/projects/expat.v140.2.2.5/build/native/include ^
 | 
					-DEXPAT_INCLUDE_DIR=C:/projects/expat.v140.2.2.5/build/native/include ^
 | 
				
			||||||
-DEXPAT_LIBRARY=C:/projects/expat.v140.2.2.5/build/native/lib/x64/%config%/libexpat%libpostfix%.lib ^
 | 
					-DEXPAT_LIBRARY=C:/projects/expat.v140.2.2.5/build/native/lib/x64/%config%/libexpat%libpostfix%.lib ^
 | 
				
			||||||
-DBZIP2_INCLUDE_DIR=C:/projects/bzip2.v140.1.0.6.9/build/native/include ^
 | 
					-DBZIP2_INCLUDE_DIR=C:/projects/bzip2.v140.1.0.6.9/build/native/include ^
 | 
				
			||||||
-DBZIP2_LIBRARIES=C:/projects/bzip2.v140.1.0.6.9/build/native/lib/x64/%config%/libbz2%libpostfix%.lib
 | 
					-DBZIP2_LIBRARIES=C:/projects/bzip2.v140.1.0.6.9/build/native/lib/x64/%config%/libbz2%libpostfix%.lib ^
 | 
				
			||||||
 | 
					-DLZ4_INCLUDE_DIR=C:/projects/lz4.1.3.1.2/build/native/include ^
 | 
				
			||||||
 | 
					-DLZ4_LIBRARY=C:/projects/lz4.1.3.1.2/build/native/lib/x64/%config%/liblz4%libpostfix%.lib
 | 
				
			||||||
 | 
					
 | 
				
			||||||
ECHO calling^: %CMAKE_CMD%
 | 
					ECHO calling^: %CMAKE_CMD%
 | 
				
			||||||
%CMAKE_CMD%
 | 
					%CMAKE_CMD%
 | 
				
			||||||
 | 
				
			|||||||
							
								
								
									
										3
									
								
								third_party/libosmium/build-msys2.bat
									
									
									
									
										vendored
									
									
								
							
							
						
						
									
										3
									
								
								third_party/libosmium/build-msys2.bat
									
									
									
									
										vendored
									
									
								
							@ -16,8 +16,9 @@ call C:\msys64\mingw64\bin\gem.cmd install json
 | 
				
			|||||||
REM Workaround for problem with spatialite (see https://github.com/osmcode/libosmium/issues/262)
 | 
					REM Workaround for problem with spatialite (see https://github.com/osmcode/libosmium/issues/262)
 | 
				
			||||||
copy /y C:\msys64\mingw64\bin\libreadline8.dll C:\msys64\mingw64\bin\libreadline7.dll
 | 
					copy /y C:\msys64\mingw64\bin\libreadline8.dll C:\msys64\mingw64\bin\libreadline7.dll
 | 
				
			||||||
 | 
					
 | 
				
			||||||
echo "Setting PROJ_LIB variable for correct PROJ.4 working"
 | 
					echo "Setting PROJ_LIB/DATA variable for correct PROJ.4 working"
 | 
				
			||||||
set PROJ_LIB=c:\msys64\mingw64\share\proj
 | 
					set PROJ_LIB=c:\msys64\mingw64\share\proj
 | 
				
			||||||
 | 
					set PROJ_DATA=c:\msys64\mingw64\share\proj
 | 
				
			||||||
 | 
					
 | 
				
			||||||
set CXXFLAGS=-Wno-stringop-overflow
 | 
					set CXXFLAGS=-Wno-stringop-overflow
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
				
			|||||||
@ -74,8 +74,8 @@ class AmenityHandler : public osmium::handler::Handler {
 | 
				
			|||||||
            c.y += nr.lat();
 | 
					            c.y += nr.lat();
 | 
				
			||||||
        }
 | 
					        }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
        c.x /= nr_list.size();
 | 
					        c.x /= static_cast<double>(nr_list.size());
 | 
				
			||||||
        c.y /= nr_list.size();
 | 
					        c.y /= static_cast<double>(nr_list.size());
 | 
				
			||||||
 | 
					
 | 
				
			||||||
        return c;
 | 
					        return c;
 | 
				
			||||||
    }
 | 
					    }
 | 
				
			||||||
 | 
				
			|||||||
@ -122,11 +122,11 @@ int main(int argc, char* argv[]) {
 | 
				
			|||||||
            return 1;
 | 
					            return 1;
 | 
				
			||||||
        }
 | 
					        }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
        osmium::io::File input_file{argv[2]};
 | 
					        const osmium::io::File input_file{argv[2]};
 | 
				
			||||||
 | 
					
 | 
				
			||||||
        // Configuration for the multipolygon assembler. Here the default settings
 | 
					        // Configuration for the multipolygon assembler. Here the default settings
 | 
				
			||||||
        // are used, but you could change multiple settings.
 | 
					        // are used, but you could change multiple settings.
 | 
				
			||||||
        osmium::area::Assembler::config_type assembler_config;
 | 
					        const osmium::area::Assembler::config_type assembler_config;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
        // Set up a filter matching only forests. This will be used to only build
 | 
					        // Set up a filter matching only forests. This will be used to only build
 | 
				
			||||||
        // areas with matching tags.
 | 
					        // areas with matching tags.
 | 
				
			||||||
 | 
				
			|||||||
@ -153,8 +153,8 @@ int main(int argc, char* argv[]) {
 | 
				
			|||||||
    }
 | 
					    }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    // Get input and output file names from command line.
 | 
					    // Get input and output file names from command line.
 | 
				
			||||||
    std::string input_file_name{argv[1]};
 | 
					    const std::string input_file_name{argv[1]};
 | 
				
			||||||
    std::string output_file_name{argv[2]};
 | 
					    const std::string output_file_name{argv[2]};
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    try {
 | 
					    try {
 | 
				
			||||||
        // Initialize Reader
 | 
					        // Initialize Reader
 | 
				
			||||||
 | 
				
			|||||||
@ -68,7 +68,7 @@ int main(int argc, char* argv[]) {
 | 
				
			|||||||
    try {
 | 
					    try {
 | 
				
			||||||
        // The Reader is initialized here with an osmium::io::File, but could
 | 
					        // The Reader is initialized here with an osmium::io::File, but could
 | 
				
			||||||
        // also be directly initialized with a file name.
 | 
					        // also be directly initialized with a file name.
 | 
				
			||||||
        osmium::io::File input_file{argv[1]};
 | 
					        const osmium::io::File input_file{argv[1]};
 | 
				
			||||||
        osmium::io::Reader reader{input_file};
 | 
					        osmium::io::Reader reader{input_file};
 | 
				
			||||||
 | 
					
 | 
				
			||||||
        // Create an instance of our own CountHandler and push the data from the
 | 
					        // Create an instance of our own CountHandler and push the data from the
 | 
				
			||||||
@ -88,7 +88,7 @@ int main(int argc, char* argv[]) {
 | 
				
			|||||||
        // (though not this one) can use huge amounts of data. So checking actual
 | 
					        // (though not this one) can use huge amounts of data. So checking actual
 | 
				
			||||||
        // memore usage is often useful and can be done easily with this class.
 | 
					        // memore usage is often useful and can be done easily with this class.
 | 
				
			||||||
        // (Currently only works on Linux, not macOS and Windows.)
 | 
					        // (Currently only works on Linux, not macOS and Windows.)
 | 
				
			||||||
        osmium::MemoryUsage memory;
 | 
					        const osmium::MemoryUsage memory;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
        std::cout << "\nMemory used: " << memory.peak() << " MBytes\n";
 | 
					        std::cout << "\nMemory used: " << memory.peak() << " MBytes\n";
 | 
				
			||||||
    } catch (const std::exception& e) {
 | 
					    } catch (const std::exception& e) {
 | 
				
			||||||
 | 
				
			|||||||
@ -40,11 +40,11 @@ int main(int argc, char* argv[]) {
 | 
				
			|||||||
    }
 | 
					    }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    // Get output file name from command line.
 | 
					    // Get output file name from command line.
 | 
				
			||||||
    std::string output_file_name{argv[1]};
 | 
					    const std::string output_file_name{argv[1]};
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    // If output file name is "-", this means STDOUT. Set the OPL file type
 | 
					    // If output file name is "-", this means STDOUT. Set the OPL file type
 | 
				
			||||||
    // in this case. Otherwise take the file type from the file name suffix.
 | 
					    // in this case. Otherwise take the file type from the file name suffix.
 | 
				
			||||||
    osmium::io::File output_file{output_file_name, output_file_name == "-" ? ".opl" : ""};
 | 
					    const osmium::io::File output_file{output_file_name, output_file_name == "-" ? ".opl" : ""};
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    try {
 | 
					    try {
 | 
				
			||||||
        // Create a buffer where all objects will live. Use a sensible initial
 | 
					        // Create a buffer where all objects will live. Use a sensible initial
 | 
				
			||||||
 | 
				
			|||||||
@ -43,7 +43,7 @@ int main(int argc, char* argv[]) {
 | 
				
			|||||||
        // Get entity types from command line if there is a 2nd argument.
 | 
					        // Get entity types from command line if there is a 2nd argument.
 | 
				
			||||||
        if (argc == 3) {
 | 
					        if (argc == 3) {
 | 
				
			||||||
            read_types = osmium::osm_entity_bits::nothing;
 | 
					            read_types = osmium::osm_entity_bits::nothing;
 | 
				
			||||||
            std::string types = argv[2];
 | 
					            const std::string types = argv[2];
 | 
				
			||||||
            if (types.find('n') != std::string::npos) {
 | 
					            if (types.find('n') != std::string::npos) {
 | 
				
			||||||
                read_types |= osmium::osm_entity_bits::node;
 | 
					                read_types |= osmium::osm_entity_bits::node;
 | 
				
			||||||
            }
 | 
					            }
 | 
				
			||||||
 | 
				
			|||||||
@ -165,31 +165,31 @@ int main(int argc, char* argv[]) {
 | 
				
			|||||||
        reader.close();
 | 
					        reader.close();
 | 
				
			||||||
 | 
					
 | 
				
			||||||
        // Write out node, way, and relation offset indexes to disk.
 | 
					        // Write out node, way, and relation offset indexes to disk.
 | 
				
			||||||
        IndexFile nodes_idx{output_dir + "/nodes.idx"};
 | 
					        const IndexFile nodes_idx{output_dir + "/nodes.idx"};
 | 
				
			||||||
        node_index.dump_as_list(nodes_idx.fd());
 | 
					        node_index.dump_as_list(nodes_idx.fd());
 | 
				
			||||||
 | 
					
 | 
				
			||||||
        IndexFile ways_idx{output_dir + "/ways.idx"};
 | 
					        const IndexFile ways_idx{output_dir + "/ways.idx"};
 | 
				
			||||||
        way_index.dump_as_list(ways_idx.fd());
 | 
					        way_index.dump_as_list(ways_idx.fd());
 | 
				
			||||||
 | 
					
 | 
				
			||||||
        IndexFile relations_idx{output_dir + "/relations.idx"};
 | 
					        const IndexFile relations_idx{output_dir + "/relations.idx"};
 | 
				
			||||||
        relation_index.dump_as_list(relations_idx.fd());
 | 
					        relation_index.dump_as_list(relations_idx.fd());
 | 
				
			||||||
 | 
					
 | 
				
			||||||
        // Sort the maps (so later binary search will work on them) and write
 | 
					        // Sort the maps (so later binary search will work on them) and write
 | 
				
			||||||
        // them to disk.
 | 
					        // them to disk.
 | 
				
			||||||
        map_node2way.sort();
 | 
					        map_node2way.sort();
 | 
				
			||||||
        IndexFile node2way_idx{output_dir + "/node2way.map"};
 | 
					        const IndexFile node2way_idx{output_dir + "/node2way.map"};
 | 
				
			||||||
        map_node2way.dump_as_list(node2way_idx.fd());
 | 
					        map_node2way.dump_as_list(node2way_idx.fd());
 | 
				
			||||||
 | 
					
 | 
				
			||||||
        map_node2relation.sort();
 | 
					        map_node2relation.sort();
 | 
				
			||||||
        IndexFile node2relation_idx{output_dir + "/node2rel.map"};
 | 
					        const IndexFile node2relation_idx{output_dir + "/node2rel.map"};
 | 
				
			||||||
        map_node2relation.dump_as_list(node2relation_idx.fd());
 | 
					        map_node2relation.dump_as_list(node2relation_idx.fd());
 | 
				
			||||||
 | 
					
 | 
				
			||||||
        map_way2relation.sort();
 | 
					        map_way2relation.sort();
 | 
				
			||||||
        IndexFile way2relation_idx{output_dir + "/way2rel.map"};
 | 
					        const IndexFile way2relation_idx{output_dir + "/way2rel.map"};
 | 
				
			||||||
        map_way2relation.dump_as_list(way2relation_idx.fd());
 | 
					        map_way2relation.dump_as_list(way2relation_idx.fd());
 | 
				
			||||||
 | 
					
 | 
				
			||||||
        map_relation2relation.sort();
 | 
					        map_relation2relation.sort();
 | 
				
			||||||
        IndexFile relation2relation_idx{output_dir + "/rel2rel.map"};
 | 
					        const IndexFile relation2relation_idx{output_dir + "/rel2rel.map"};
 | 
				
			||||||
        map_relation2relation.dump_as_list(relation2relation_idx.fd());
 | 
					        map_relation2relation.dump_as_list(relation2relation_idx.fd());
 | 
				
			||||||
    } catch (const std::exception& e) {
 | 
					    } catch (const std::exception& e) {
 | 
				
			||||||
        // All exceptions used by the Osmium library derive from std::exception.
 | 
					        // All exceptions used by the Osmium library derive from std::exception.
 | 
				
			||||||
 | 
				
			|||||||
@ -47,10 +47,10 @@ int main(int argc, char* argv[]) {
 | 
				
			|||||||
 | 
					
 | 
				
			||||||
    try {
 | 
					    try {
 | 
				
			||||||
        // The input file, deduce file format from file suffix.
 | 
					        // The input file, deduce file format from file suffix.
 | 
				
			||||||
        osmium::io::File input_file{argv[1]};
 | 
					        const osmium::io::File input_file{argv[1]};
 | 
				
			||||||
 | 
					
 | 
				
			||||||
        // The output file, force XML OSM file format.
 | 
					        // The output file, force XML OSM file format.
 | 
				
			||||||
        osmium::io::File output_file{argv[2], "osm"};
 | 
					        const osmium::io::File output_file{argv[2], "osm"};
 | 
				
			||||||
 | 
					
 | 
				
			||||||
        // Initialize Reader for the input file.
 | 
					        // Initialize Reader for the input file.
 | 
				
			||||||
        // Read only changesets (will ignore nodes, ways, and
 | 
					        // Read only changesets (will ignore nodes, ways, and
 | 
				
			||||||
 | 
				
			|||||||
@ -67,8 +67,8 @@ public:
 | 
				
			|||||||
    IndexAccess(const IndexAccess&) = delete;
 | 
					    IndexAccess(const IndexAccess&) = delete;
 | 
				
			||||||
    IndexAccess& operator=(const IndexAccess&) = delete;
 | 
					    IndexAccess& operator=(const IndexAccess&) = delete;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    IndexAccess(IndexAccess&&) = delete;
 | 
					    IndexAccess(IndexAccess&&) noexcept = delete;
 | 
				
			||||||
    IndexAccess& operator=(IndexAccess&&) = delete;
 | 
					    IndexAccess& operator=(IndexAccess&&) noexcept = delete;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    virtual ~IndexAccess() noexcept = default;
 | 
					    virtual ~IndexAccess() noexcept = default;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
@ -106,7 +106,7 @@ public:
 | 
				
			|||||||
    ~IndexAccessDense() noexcept override = default;
 | 
					    ~IndexAccessDense() noexcept override = default;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    void dump() const override {
 | 
					    void dump() const override {
 | 
				
			||||||
        index_type index{this->fd()};
 | 
					        const index_type index{this->fd()};
 | 
				
			||||||
 | 
					
 | 
				
			||||||
        for (std::size_t i = 0; i < index.size(); ++i) {
 | 
					        for (std::size_t i = 0; i < index.size(); ++i) {
 | 
				
			||||||
            if (index.get(i) != TValue{}) {
 | 
					            if (index.get(i) != TValue{}) {
 | 
				
			||||||
@ -116,7 +116,7 @@ public:
 | 
				
			|||||||
    }
 | 
					    }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    bool search(const osmium::unsigned_object_id_type& key) const override {
 | 
					    bool search(const osmium::unsigned_object_id_type& key) const override {
 | 
				
			||||||
        index_type index{this->fd()};
 | 
					        const index_type index{this->fd()};
 | 
				
			||||||
 | 
					
 | 
				
			||||||
        try {
 | 
					        try {
 | 
				
			||||||
            TValue value = index.get(key);
 | 
					            TValue value = index.get(key);
 | 
				
			||||||
@ -153,7 +153,7 @@ public:
 | 
				
			|||||||
    ~IndexAccessSparse() noexcept override = default;
 | 
					    ~IndexAccessSparse() noexcept override = default;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    void dump() const override {
 | 
					    void dump() const override {
 | 
				
			||||||
        index_type index{this->fd()};
 | 
					        const index_type index{this->fd()};
 | 
				
			||||||
 | 
					
 | 
				
			||||||
        for (const auto& element : index) {
 | 
					        for (const auto& element : index) {
 | 
				
			||||||
            std::cout << element.first << " " << element.second << "\n";
 | 
					            std::cout << element.first << " " << element.second << "\n";
 | 
				
			||||||
@ -164,7 +164,7 @@ public:
 | 
				
			|||||||
        using element_type = typename index_type::element_type;
 | 
					        using element_type = typename index_type::element_type;
 | 
				
			||||||
        index_type index{this->fd()};
 | 
					        index_type index{this->fd()};
 | 
				
			||||||
 | 
					
 | 
				
			||||||
        element_type elem{key, TValue{}};
 | 
					        const element_type elem{key, TValue{}};
 | 
				
			||||||
        const auto positions = std::equal_range(index.begin(),
 | 
					        const auto positions = std::equal_range(index.begin(),
 | 
				
			||||||
                                                index.end(),
 | 
					                                                index.end(),
 | 
				
			||||||
                                                elem,
 | 
					                                                elem,
 | 
				
			||||||
@ -347,7 +347,7 @@ int run(const IndexAccess<TValue>& index, const Options& options) {
 | 
				
			|||||||
 | 
					
 | 
				
			||||||
int main(int argc, char* argv[]) {
 | 
					int main(int argc, char* argv[]) {
 | 
				
			||||||
    // Parse command line options.
 | 
					    // Parse command line options.
 | 
				
			||||||
    Options options{argc, argv};
 | 
					    const Options options{argc, argv};
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    // Open the index file.
 | 
					    // Open the index file.
 | 
				
			||||||
    const int fd = ::open(options.filename(), O_RDWR);
 | 
					    const int fd = ::open(options.filename(), O_RDWR);
 | 
				
			||||||
 | 
				
			|||||||
@ -27,11 +27,11 @@ int main(int argc, char* argv[]) {
 | 
				
			|||||||
    try {
 | 
					    try {
 | 
				
			||||||
        // The Reader is initialized here with an osmium::io::File, but could
 | 
					        // The Reader is initialized here with an osmium::io::File, but could
 | 
				
			||||||
        // also be directly initialized with a file name.
 | 
					        // also be directly initialized with a file name.
 | 
				
			||||||
        osmium::io::File input_file{argv[1]};
 | 
					        const osmium::io::File input_file{argv[1]};
 | 
				
			||||||
        osmium::io::Reader reader{input_file};
 | 
					        osmium::io::Reader reader{input_file};
 | 
				
			||||||
 | 
					
 | 
				
			||||||
        // OSM data comes in buffers, read until there are no more.
 | 
					        // OSM data comes in buffers, read until there are no more.
 | 
				
			||||||
        while (osmium::memory::Buffer buffer = reader.read()) {
 | 
					        while (const osmium::memory::Buffer buffer = reader.read()) {
 | 
				
			||||||
            // do nothing
 | 
					            // do nothing
 | 
				
			||||||
        }
 | 
					        }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
				
			|||||||
@ -34,14 +34,14 @@ int main(int argc, char* argv[]) {
 | 
				
			|||||||
    try {
 | 
					    try {
 | 
				
			||||||
        // The Reader is initialized here with an osmium::io::File, but could
 | 
					        // The Reader is initialized here with an osmium::io::File, but could
 | 
				
			||||||
        // also be directly initialized with a file name.
 | 
					        // also be directly initialized with a file name.
 | 
				
			||||||
        osmium::io::File input_file{argv[1]};
 | 
					        const osmium::io::File input_file{argv[1]};
 | 
				
			||||||
        osmium::io::Reader reader{input_file};
 | 
					        osmium::io::Reader reader{input_file};
 | 
				
			||||||
 | 
					
 | 
				
			||||||
        // Initialize progress bar, enable it only if STDERR is a TTY.
 | 
					        // Initialize progress bar, enable it only if STDERR is a TTY.
 | 
				
			||||||
        osmium::ProgressBar progress{reader.file_size(), osmium::isatty(2)};
 | 
					        osmium::ProgressBar progress{reader.file_size(), osmium::isatty(2)};
 | 
				
			||||||
 | 
					
 | 
				
			||||||
        // OSM data comes in buffers, read until there are no more.
 | 
					        // OSM data comes in buffers, read until there are no more.
 | 
				
			||||||
        while (osmium::memory::Buffer buffer = reader.read()) {
 | 
					        while (const osmium::memory::Buffer buffer = reader.read()) {
 | 
				
			||||||
            // Update progress bar for each buffer.
 | 
					            // Update progress bar for each buffer.
 | 
				
			||||||
            progress.update(reader.offset());
 | 
					            progress.update(reader.offset());
 | 
				
			||||||
        }
 | 
					        }
 | 
				
			||||||
 | 
				
			|||||||
@ -68,7 +68,7 @@ int main(int argc, char* argv[]) {
 | 
				
			|||||||
 | 
					
 | 
				
			||||||
    // Create a tile at this location. This will also internally use the
 | 
					    // Create a tile at this location. This will also internally use the
 | 
				
			||||||
    // Mercator projection and then calculate the tile coordinates.
 | 
					    // Mercator projection and then calculate the tile coordinates.
 | 
				
			||||||
    const osmium::geom::Tile tile{uint32_t(zoom), location};
 | 
					    const osmium::geom::Tile tile{static_cast<uint32_t>(zoom), location};
 | 
				
			||||||
    std::cout << "Tile:     zoom=" << tile.z << " x=" << tile.x << " y=" << tile.y << "\n";
 | 
					    std::cout << "Tile:     zoom=" << tile.z << " x=" << tile.x << " y=" << tile.y << "\n";
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
				
			|||||||
@ -5,7 +5,7 @@
 | 
				
			|||||||
 | 
					
 | 
				
			||||||
This file is part of Osmium (https://osmcode.org/libosmium).
 | 
					This file is part of Osmium (https://osmcode.org/libosmium).
 | 
				
			||||||
 | 
					
 | 
				
			||||||
Copyright 2013-2022 Jochen Topf <jochen@topf.org> and others (see README).
 | 
					Copyright 2013-2023 Jochen Topf <jochen@topf.org> and others (see README).
 | 
				
			||||||
 | 
					
 | 
				
			||||||
Boost Software License - Version 1.0 - August 17th, 2003
 | 
					Boost Software License - Version 1.0 - August 17th, 2003
 | 
				
			||||||
 | 
					
 | 
				
			||||||
@ -213,7 +213,7 @@ namespace osmium {
 | 
				
			|||||||
 | 
					
 | 
				
			||||||
                // Now create the Area object and add the attributes and tags
 | 
					                // Now create the Area object and add the attributes and tags
 | 
				
			||||||
                // from the relation.
 | 
					                // from the relation.
 | 
				
			||||||
                bool okay = create_area(out_buffer, relation, members);
 | 
					                const bool okay = create_area(out_buffer, relation, members);
 | 
				
			||||||
                if (okay) {
 | 
					                if (okay) {
 | 
				
			||||||
                    out_buffer.commit();
 | 
					                    out_buffer.commit();
 | 
				
			||||||
                } else {
 | 
					                } else {
 | 
				
			||||||
 | 
				
			|||||||
@ -5,7 +5,7 @@
 | 
				
			|||||||
 | 
					
 | 
				
			||||||
This file is part of Osmium (https://osmcode.org/libosmium).
 | 
					This file is part of Osmium (https://osmcode.org/libosmium).
 | 
				
			||||||
 | 
					
 | 
				
			||||||
Copyright 2013-2022 Jochen Topf <jochen@topf.org> and others (see README).
 | 
					Copyright 2013-2023 Jochen Topf <jochen@topf.org> and others (see README).
 | 
				
			||||||
 | 
					
 | 
				
			||||||
Boost Software License - Version 1.0 - August 17th, 2003
 | 
					Boost Software License - Version 1.0 - August 17th, 2003
 | 
				
			||||||
 | 
					
 | 
				
			||||||
@ -124,15 +124,6 @@ namespace osmium {
 | 
				
			|||||||
 | 
					
 | 
				
			||||||
            AssemblerConfig() noexcept = default;
 | 
					            AssemblerConfig() noexcept = default;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
            /**
 | 
					 | 
				
			||||||
             * Constructor
 | 
					 | 
				
			||||||
             * @deprecated Use default constructor and set values afterwards.
 | 
					 | 
				
			||||||
             */
 | 
					 | 
				
			||||||
            explicit AssemblerConfig(ProblemReporter* pr, bool d = false) :
 | 
					 | 
				
			||||||
                problem_reporter(pr),
 | 
					 | 
				
			||||||
                debug_level(d) {
 | 
					 | 
				
			||||||
            }
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
        }; // struct AssemblerConfig
 | 
					        }; // struct AssemblerConfig
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    } // namespace area
 | 
					    } // namespace area
 | 
				
			||||||
 | 
				
			|||||||
@ -5,7 +5,7 @@
 | 
				
			|||||||
 | 
					
 | 
				
			||||||
This file is part of Osmium (https://osmcode.org/libosmium).
 | 
					This file is part of Osmium (https://osmcode.org/libosmium).
 | 
				
			||||||
 | 
					
 | 
				
			||||||
Copyright 2013-2022 Jochen Topf <jochen@topf.org> and others (see README).
 | 
					Copyright 2013-2023 Jochen Topf <jochen@topf.org> and others (see README).
 | 
				
			||||||
 | 
					
 | 
				
			||||||
Boost Software License - Version 1.0 - August 17th, 2003
 | 
					Boost Software License - Version 1.0 - August 17th, 2003
 | 
				
			||||||
 | 
					
 | 
				
			||||||
@ -332,10 +332,10 @@ namespace osmium {
 | 
				
			|||||||
                            if (!way.nodes().empty() && way.is_closed() && !way.tags().empty()) {
 | 
					                            if (!way.nodes().empty() && way.is_closed() && !way.tags().empty()) {
 | 
				
			||||||
                                const auto d = std::count_if(way.tags().cbegin(), way.tags().cend(), std::cref(filter()));
 | 
					                                const auto d = std::count_if(way.tags().cbegin(), way.tags().cend(), std::cref(filter()));
 | 
				
			||||||
                                if (d > 0) {
 | 
					                                if (d > 0) {
 | 
				
			||||||
                                    osmium::tags::KeyFilter::iterator way_fi_begin(std::cref(filter()), way.tags().cbegin(), way.tags().cend());
 | 
					                                    const osmium::tags::KeyFilter::iterator way_fi_begin(std::cref(filter()), way.tags().cbegin(), way.tags().cend());
 | 
				
			||||||
                                    osmium::tags::KeyFilter::iterator way_fi_end(std::cref(filter()), way.tags().cend(), way.tags().cend());
 | 
					                                    const osmium::tags::KeyFilter::iterator way_fi_end(std::cref(filter()), way.tags().cend(), way.tags().cend());
 | 
				
			||||||
                                    osmium::tags::KeyFilter::iterator area_fi_begin(std::cref(filter()), area_tags.cbegin(), area_tags.cend());
 | 
					                                    const osmium::tags::KeyFilter::iterator area_fi_begin(std::cref(filter()), area_tags.cbegin(), area_tags.cend());
 | 
				
			||||||
                                    osmium::tags::KeyFilter::iterator area_fi_end(std::cref(filter()), area_tags.cend(), area_tags.cend());
 | 
					                                    const osmium::tags::KeyFilter::iterator area_fi_end(std::cref(filter()), area_tags.cend(), area_tags.cend());
 | 
				
			||||||
#ifdef __cpp_lib_robust_nonmodifying_seq_ops
 | 
					#ifdef __cpp_lib_robust_nonmodifying_seq_ops
 | 
				
			||||||
                                    if (!std::equal(way_fi_begin, way_fi_end, area_fi_begin, area_fi_end)) {
 | 
					                                    if (!std::equal(way_fi_begin, way_fi_end, area_fi_begin, area_fi_end)) {
 | 
				
			||||||
#else
 | 
					#else
 | 
				
			||||||
 | 
				
			|||||||
@ -5,7 +5,7 @@
 | 
				
			|||||||
 | 
					
 | 
				
			||||||
This file is part of Osmium (https://osmcode.org/libosmium).
 | 
					This file is part of Osmium (https://osmcode.org/libosmium).
 | 
				
			||||||
 | 
					
 | 
				
			||||||
Copyright 2013-2022 Jochen Topf <jochen@topf.org> and others (see README).
 | 
					Copyright 2013-2023 Jochen Topf <jochen@topf.org> and others (see README).
 | 
				
			||||||
 | 
					
 | 
				
			||||||
Boost Software License - Version 1.0 - August 17th, 2003
 | 
					Boost Software License - Version 1.0 - August 17th, 2003
 | 
				
			||||||
 | 
					
 | 
				
			||||||
@ -608,7 +608,7 @@ namespace osmium {
 | 
				
			|||||||
 | 
					
 | 
				
			||||||
                void create_rings_simple_case() {
 | 
					                void create_rings_simple_case() {
 | 
				
			||||||
                    auto count_remaining = m_segment_list.size();
 | 
					                    auto count_remaining = m_segment_list.size();
 | 
				
			||||||
                    for (slocation& sl : m_locations) {
 | 
					                    for (const slocation& sl : m_locations) {
 | 
				
			||||||
                        const NodeRefSegment& segment = m_segment_list[sl.item];
 | 
					                        const NodeRefSegment& segment = m_segment_list[sl.item];
 | 
				
			||||||
                        if (!segment.is_done()) {
 | 
					                        if (!segment.is_done()) {
 | 
				
			||||||
                            count_remaining -= add_new_ring(sl);
 | 
					                            count_remaining -= add_new_ring(sl);
 | 
				
			||||||
@ -671,7 +671,7 @@ namespace osmium {
 | 
				
			|||||||
                        std::cerr << "    Trying to merge " << open_ring_its.size() << " open rings (try_to_merge)\n";
 | 
					                        std::cerr << "    Trying to merge " << open_ring_its.size() << " open rings (try_to_merge)\n";
 | 
				
			||||||
                    }
 | 
					                    }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
                    std::vector<location_to_ring_map> xrings = create_location_to_ring_map(open_ring_its);
 | 
					                    const auto xrings = create_location_to_ring_map(open_ring_its);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
                    auto it = xrings.cbegin();
 | 
					                    auto it = xrings.cbegin();
 | 
				
			||||||
                    while (it != xrings.cend()) {
 | 
					                    while (it != xrings.cend()) {
 | 
				
			||||||
@ -825,7 +825,7 @@ namespace osmium {
 | 
				
			|||||||
 | 
					
 | 
				
			||||||
                    find_inner_outer_complex();
 | 
					                    find_inner_outer_complex();
 | 
				
			||||||
                    ProtoRing* outer_ring = find_enclosing_ring(ring_min->ring().min_segment());
 | 
					                    ProtoRing* outer_ring = find_enclosing_ring(ring_min->ring().min_segment());
 | 
				
			||||||
                    bool ring_min_is_outer = !outer_ring;
 | 
					                    const bool ring_min_is_outer = !outer_ring;
 | 
				
			||||||
                    if (debug()) {
 | 
					                    if (debug()) {
 | 
				
			||||||
                        std::cerr << "  Open ring is " << (ring_min_is_outer ? "outer" : "inner") << " ring\n";
 | 
					                        std::cerr << "  Open ring is " << (ring_min_is_outer ? "outer" : "inner") << " ring\n";
 | 
				
			||||||
                    }
 | 
					                    }
 | 
				
			||||||
@ -924,7 +924,7 @@ namespace osmium {
 | 
				
			|||||||
 | 
					
 | 
				
			||||||
                    // Now find all the rest of the rings (ie not starting at split locations)
 | 
					                    // Now find all the rest of the rings (ie not starting at split locations)
 | 
				
			||||||
                    if (count_remaining > 0) {
 | 
					                    if (count_remaining > 0) {
 | 
				
			||||||
                        for (slocation& sl : m_locations) {
 | 
					                        for (const slocation& sl : m_locations) {
 | 
				
			||||||
                            const NodeRefSegment& segment = m_segment_list[sl.item];
 | 
					                            const NodeRefSegment& segment = m_segment_list[sl.item];
 | 
				
			||||||
                            if (!segment.is_done()) {
 | 
					                            if (!segment.is_done()) {
 | 
				
			||||||
                                count_remaining -= add_new_ring_complex(sl);
 | 
					                                count_remaining -= add_new_ring_complex(sl);
 | 
				
			||||||
 | 
				
			|||||||
@ -5,7 +5,7 @@
 | 
				
			|||||||
 | 
					
 | 
				
			||||||
This file is part of Osmium (https://osmcode.org/libosmium).
 | 
					This file is part of Osmium (https://osmcode.org/libosmium).
 | 
				
			||||||
 | 
					
 | 
				
			||||||
Copyright 2013-2022 Jochen Topf <jochen@topf.org> and others (see README).
 | 
					Copyright 2013-2023 Jochen Topf <jochen@topf.org> and others (see README).
 | 
				
			||||||
 | 
					
 | 
				
			||||||
Boost Software License - Version 1.0 - August 17th, 2003
 | 
					Boost Software License - Version 1.0 - August 17th, 2003
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
				
			|||||||
@ -5,7 +5,7 @@
 | 
				
			|||||||
 | 
					
 | 
				
			||||||
This file is part of Osmium (https://osmcode.org/libosmium).
 | 
					This file is part of Osmium (https://osmcode.org/libosmium).
 | 
				
			||||||
 | 
					
 | 
				
			||||||
Copyright 2013-2022 Jochen Topf <jochen@topf.org> and others (see README).
 | 
					Copyright 2013-2023 Jochen Topf <jochen@topf.org> and others (see README).
 | 
				
			||||||
 | 
					
 | 
				
			||||||
Boost Software License - Version 1.0 - August 17th, 2003
 | 
					Boost Software License - Version 1.0 - August 17th, 2003
 | 
				
			||||||
 | 
					
 | 
				
			||||||
@ -193,7 +193,7 @@ namespace osmium {
 | 
				
			|||||||
 | 
					
 | 
				
			||||||
                const char* role_name() const noexcept {
 | 
					                const char* role_name() const noexcept {
 | 
				
			||||||
                    static const std::array<const char*, 4> names = {{"unknown", "outer", "inner", "empty"}};
 | 
					                    static const std::array<const char*, 4> names = {{"unknown", "outer", "inner", "empty"}};
 | 
				
			||||||
                    return names[int(m_role)];
 | 
					                    return names[static_cast<int>(m_role)];
 | 
				
			||||||
                }
 | 
					                }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
                const osmium::Way* way() const noexcept {
 | 
					                const osmium::Way* way() const noexcept {
 | 
				
			||||||
@ -327,9 +327,9 @@ namespace osmium {
 | 
				
			|||||||
 | 
					
 | 
				
			||||||
                    if ((d > 0 && na >= 0 && na <= d && nb >= 0 && nb <= d) ||
 | 
					                    if ((d > 0 && na >= 0 && na <= d && nb >= 0 && nb <= d) ||
 | 
				
			||||||
                        (d < 0 && na <= 0 && na >= d && nb <= 0 && nb >= d)) {
 | 
					                        (d < 0 && na <= 0 && na >= d && nb <= 0 && nb >= d)) {
 | 
				
			||||||
                        const double ua = double(na) / d;
 | 
					                        const double ua = static_cast<double>(na) / static_cast<double>(d);
 | 
				
			||||||
                        const vec i = p0 + ua * (p1 - p0);
 | 
					                        const vec i = p0 + ua * (p1 - p0);
 | 
				
			||||||
                        return osmium::Location{int32_t(i.x), int32_t(i.y)};
 | 
					                        return osmium::Location{static_cast<int32_t>(i.x), static_cast<int32_t>(i.y)};
 | 
				
			||||||
                    }
 | 
					                    }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
                    return osmium::Location{};
 | 
					                    return osmium::Location{};
 | 
				
			||||||
 | 
				
			|||||||
@ -5,7 +5,7 @@
 | 
				
			|||||||
 | 
					
 | 
				
			||||||
This file is part of Osmium (https://osmcode.org/libosmium).
 | 
					This file is part of Osmium (https://osmcode.org/libosmium).
 | 
				
			||||||
 | 
					
 | 
				
			||||||
Copyright 2013-2022 Jochen Topf <jochen@topf.org> and others (see README).
 | 
					Copyright 2013-2023 Jochen Topf <jochen@topf.org> and others (see README).
 | 
				
			||||||
 | 
					
 | 
				
			||||||
Boost Software License - Version 1.0 - August 17th, 2003
 | 
					Boost Software License - Version 1.0 - August 17th, 2003
 | 
				
			||||||
 | 
					
 | 
				
			||||||
@ -86,16 +86,16 @@ namespace osmium {
 | 
				
			|||||||
                int64_t m_num;
 | 
					                int64_t m_num;
 | 
				
			||||||
#endif
 | 
					#endif
 | 
				
			||||||
 | 
					
 | 
				
			||||||
                int64_t m_sum;
 | 
					                int64_t m_sum = 0;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
            public:
 | 
					            public:
 | 
				
			||||||
 | 
					
 | 
				
			||||||
                explicit ProtoRing(NodeRefSegment* segment) noexcept :
 | 
					                explicit ProtoRing(NodeRefSegment* segment) noexcept :
 | 
				
			||||||
                    m_min_segment(segment),
 | 
					                    m_min_segment(segment)
 | 
				
			||||||
#ifdef OSMIUM_DEBUG_RING_NO
 | 
					#ifdef OSMIUM_DEBUG_RING_NO
 | 
				
			||||||
                    m_num(next_num()),
 | 
					                    , m_num(next_num())
 | 
				
			||||||
#endif
 | 
					#endif
 | 
				
			||||||
                    m_sum(0) {
 | 
					                    {
 | 
				
			||||||
                    add_segment_back(segment);
 | 
					                    add_segment_back(segment);
 | 
				
			||||||
                }
 | 
					                }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
				
			|||||||
@ -5,7 +5,7 @@
 | 
				
			|||||||
 | 
					
 | 
				
			||||||
This file is part of Osmium (https://osmcode.org/libosmium).
 | 
					This file is part of Osmium (https://osmcode.org/libosmium).
 | 
				
			||||||
 | 
					
 | 
				
			||||||
Copyright 2013-2022 Jochen Topf <jochen@topf.org> and others (see README).
 | 
					Copyright 2013-2023 Jochen Topf <jochen@topf.org> and others (see README).
 | 
				
			||||||
 | 
					
 | 
				
			||||||
Boost Software License - Version 1.0 - August 17th, 2003
 | 
					Boost Software License - Version 1.0 - August 17th, 2003
 | 
				
			||||||
 | 
					
 | 
				
			||||||
@ -333,7 +333,7 @@ namespace osmium {
 | 
				
			|||||||
                            }
 | 
					                            }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
                            if (y_range_overlap(s1, s2)) {
 | 
					                            if (y_range_overlap(s1, s2)) {
 | 
				
			||||||
                                osmium::Location intersection{calculate_intersection(s1, s2)};
 | 
					                                const osmium::Location intersection{calculate_intersection(s1, s2)};
 | 
				
			||||||
                                if (intersection) {
 | 
					                                if (intersection) {
 | 
				
			||||||
                                    ++found_intersections;
 | 
					                                    ++found_intersections;
 | 
				
			||||||
                                    if (m_debug) {
 | 
					                                    if (m_debug) {
 | 
				
			||||||
 | 
				
			|||||||
@ -5,7 +5,7 @@
 | 
				
			|||||||
 | 
					
 | 
				
			||||||
This file is part of Osmium (https://osmcode.org/libosmium).
 | 
					This file is part of Osmium (https://osmcode.org/libosmium).
 | 
				
			||||||
 | 
					
 | 
				
			||||||
Copyright 2013-2022 Jochen Topf <jochen@topf.org> and others (see README).
 | 
					Copyright 2013-2023 Jochen Topf <jochen@topf.org> and others (see README).
 | 
				
			||||||
 | 
					
 | 
				
			||||||
Boost Software License - Version 1.0 - August 17th, 2003
 | 
					Boost Software License - Version 1.0 - August 17th, 2003
 | 
				
			||||||
 | 
					
 | 
				
			||||||
@ -89,12 +89,12 @@ namespace osmium {
 | 
				
			|||||||
 | 
					
 | 
				
			||||||
            // scale vector
 | 
					            // scale vector
 | 
				
			||||||
            constexpr inline vec operator*(double s, const vec& v) noexcept {
 | 
					            constexpr inline vec operator*(double s, const vec& v) noexcept {
 | 
				
			||||||
                return vec{int64_t(s * v.x), int64_t(s * v.y)};
 | 
					                return vec{static_cast<int64_t>(s * static_cast<double>(v.x)), static_cast<int64_t>(s * static_cast<double>(v.y))};
 | 
				
			||||||
            }
 | 
					            }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
            // scale vector
 | 
					            // scale vector
 | 
				
			||||||
            constexpr inline vec operator*(const vec& v, double s) noexcept {
 | 
					            constexpr inline vec operator*(const vec& v, double s) noexcept {
 | 
				
			||||||
                return vec{int64_t(s * v.x), int64_t(s * v.y)};
 | 
					                return vec{static_cast<int64_t>(s * static_cast<double>(v.x)), static_cast<int64_t>(s * static_cast<double>(v.y))};
 | 
				
			||||||
            }
 | 
					            }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
            // equality
 | 
					            // equality
 | 
				
			||||||
 | 
				
			|||||||
@ -5,7 +5,7 @@
 | 
				
			|||||||
 | 
					
 | 
				
			||||||
This file is part of Osmium (https://osmcode.org/libosmium).
 | 
					This file is part of Osmium (https://osmcode.org/libosmium).
 | 
				
			||||||
 | 
					
 | 
				
			||||||
Copyright 2013-2022 Jochen Topf <jochen@topf.org> and others (see README).
 | 
					Copyright 2013-2023 Jochen Topf <jochen@topf.org> and others (see README).
 | 
				
			||||||
 | 
					
 | 
				
			||||||
Boost Software License - Version 1.0 - August 17th, 2003
 | 
					Boost Software License - Version 1.0 - August 17th, 2003
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
				
			|||||||
@ -5,7 +5,7 @@
 | 
				
			|||||||
 | 
					
 | 
				
			||||||
This file is part of Osmium (https://osmcode.org/libosmium).
 | 
					This file is part of Osmium (https://osmcode.org/libosmium).
 | 
				
			||||||
 | 
					
 | 
				
			||||||
Copyright 2013-2022 Jochen Topf <jochen@topf.org> and others (see README).
 | 
					Copyright 2013-2023 Jochen Topf <jochen@topf.org> and others (see README).
 | 
				
			||||||
 | 
					
 | 
				
			||||||
Boost Software License - Version 1.0 - August 17th, 2003
 | 
					Boost Software License - Version 1.0 - August 17th, 2003
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
				
			|||||||
@ -5,7 +5,7 @@
 | 
				
			|||||||
 | 
					
 | 
				
			||||||
This file is part of Osmium (https://osmcode.org/libosmium).
 | 
					This file is part of Osmium (https://osmcode.org/libosmium).
 | 
				
			||||||
 | 
					
 | 
				
			||||||
Copyright 2013-2022 Jochen Topf <jochen@topf.org> and others (see README).
 | 
					Copyright 2013-2023 Jochen Topf <jochen@topf.org> and others (see README).
 | 
				
			||||||
 | 
					
 | 
				
			||||||
Boost Software License - Version 1.0 - August 17th, 2003
 | 
					Boost Software License - Version 1.0 - August 17th, 2003
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
				
			|||||||
@ -5,7 +5,7 @@
 | 
				
			|||||||
 | 
					
 | 
				
			||||||
This file is part of Osmium (https://osmcode.org/libosmium).
 | 
					This file is part of Osmium (https://osmcode.org/libosmium).
 | 
				
			||||||
 | 
					
 | 
				
			||||||
Copyright 2013-2022 Jochen Topf <jochen@topf.org> and others (see README).
 | 
					Copyright 2013-2023 Jochen Topf <jochen@topf.org> and others (see README).
 | 
				
			||||||
 | 
					
 | 
				
			||||||
Boost Software License - Version 1.0 - August 17th, 2003
 | 
					Boost Software License - Version 1.0 - August 17th, 2003
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
				
			|||||||
@ -5,7 +5,7 @@
 | 
				
			|||||||
 | 
					
 | 
				
			||||||
This file is part of Osmium (https://osmcode.org/libosmium).
 | 
					This file is part of Osmium (https://osmcode.org/libosmium).
 | 
				
			||||||
 | 
					
 | 
				
			||||||
Copyright 2013-2022 Jochen Topf <jochen@topf.org> and others (see README).
 | 
					Copyright 2013-2023 Jochen Topf <jochen@topf.org> and others (see README).
 | 
				
			||||||
 | 
					
 | 
				
			||||||
Boost Software License - Version 1.0 - August 17th, 2003
 | 
					Boost Software License - Version 1.0 - August 17th, 2003
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
				
			|||||||
@ -5,7 +5,7 @@
 | 
				
			|||||||
 | 
					
 | 
				
			||||||
This file is part of Osmium (https://osmcode.org/libosmium).
 | 
					This file is part of Osmium (https://osmcode.org/libosmium).
 | 
				
			||||||
 | 
					
 | 
				
			||||||
Copyright 2013-2022 Jochen Topf <jochen@topf.org> and others (see README).
 | 
					Copyright 2013-2023 Jochen Topf <jochen@topf.org> and others (see README).
 | 
				
			||||||
 | 
					
 | 
				
			||||||
Boost Software License - Version 1.0 - August 17th, 2003
 | 
					Boost Software License - Version 1.0 - August 17th, 2003
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
				
			|||||||
@ -5,7 +5,7 @@
 | 
				
			|||||||
 | 
					
 | 
				
			||||||
This file is part of Osmium (https://osmcode.org/libosmium).
 | 
					This file is part of Osmium (https://osmcode.org/libosmium).
 | 
				
			||||||
 | 
					
 | 
				
			||||||
Copyright 2013-2022 Jochen Topf <jochen@topf.org> and others (see README).
 | 
					Copyright 2013-2023 Jochen Topf <jochen@topf.org> and others (see README).
 | 
				
			||||||
 | 
					
 | 
				
			||||||
Boost Software License - Version 1.0 - August 17th, 2003
 | 
					Boost Software License - Version 1.0 - August 17th, 2003
 | 
				
			||||||
 | 
					
 | 
				
			||||||
@ -75,15 +75,15 @@ namespace osmium {
 | 
				
			|||||||
            void set_object(gdalcpp::Feature& feature) {
 | 
					            void set_object(gdalcpp::Feature& feature) {
 | 
				
			||||||
                const char t[2] = {osmium::item_type_to_char(m_object_type), '\0'};
 | 
					                const char t[2] = {osmium::item_type_to_char(m_object_type), '\0'};
 | 
				
			||||||
                feature.set_field("obj_type", t);
 | 
					                feature.set_field("obj_type", t);
 | 
				
			||||||
                feature.set_field("obj_id", int32_t(m_object_id));
 | 
					                feature.set_field("obj_id", static_cast<int32_t>(m_object_id));
 | 
				
			||||||
                feature.set_field("nodes", int32_t(m_nodes));
 | 
					                feature.set_field("nodes", static_cast<int32_t>(m_nodes));
 | 
				
			||||||
            }
 | 
					            }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
            void write_point(const char* problem_type, osmium::object_id_type id1, osmium::object_id_type id2, osmium::Location location) {
 | 
					            void write_point(const char* problem_type, osmium::object_id_type id1, osmium::object_id_type id2, osmium::Location location) {
 | 
				
			||||||
                gdalcpp::Feature feature{m_layer_perror, m_ogr_factory.create_point(location)};
 | 
					                gdalcpp::Feature feature{m_layer_perror, m_ogr_factory.create_point(location)};
 | 
				
			||||||
                set_object(feature);
 | 
					                set_object(feature);
 | 
				
			||||||
                feature.set_field("id1", double(id1));
 | 
					                feature.set_field("id1", static_cast<double>(id1));
 | 
				
			||||||
                feature.set_field("id2", double(id2));
 | 
					                feature.set_field("id2", static_cast<double>(id2));
 | 
				
			||||||
                feature.set_field("problem", problem_type);
 | 
					                feature.set_field("problem", problem_type);
 | 
				
			||||||
                feature.add_to_layer();
 | 
					                feature.add_to_layer();
 | 
				
			||||||
            }
 | 
					            }
 | 
				
			||||||
@ -176,7 +176,7 @@ namespace osmium {
 | 
				
			|||||||
                try {
 | 
					                try {
 | 
				
			||||||
                    gdalcpp::Feature feature{m_layer_lerror, m_ogr_factory.create_linestring(way)};
 | 
					                    gdalcpp::Feature feature{m_layer_lerror, m_ogr_factory.create_linestring(way)};
 | 
				
			||||||
                    set_object(feature);
 | 
					                    set_object(feature);
 | 
				
			||||||
                    feature.set_field("id1", int32_t(way.id()));
 | 
					                    feature.set_field("id1", static_cast<int32_t>(way.id()));
 | 
				
			||||||
                    feature.set_field("id2", 0);
 | 
					                    feature.set_field("id2", 0);
 | 
				
			||||||
                    feature.set_field("problem", "way_in_multiple_rings");
 | 
					                    feature.set_field("problem", "way_in_multiple_rings");
 | 
				
			||||||
                    feature.add_to_layer();
 | 
					                    feature.add_to_layer();
 | 
				
			||||||
@ -192,7 +192,7 @@ namespace osmium {
 | 
				
			|||||||
                try {
 | 
					                try {
 | 
				
			||||||
                    gdalcpp::Feature feature{m_layer_lerror, m_ogr_factory.create_linestring(way)};
 | 
					                    gdalcpp::Feature feature{m_layer_lerror, m_ogr_factory.create_linestring(way)};
 | 
				
			||||||
                    set_object(feature);
 | 
					                    set_object(feature);
 | 
				
			||||||
                    feature.set_field("id1", int32_t(way.id()));
 | 
					                    feature.set_field("id1", static_cast<int32_t>(way.id()));
 | 
				
			||||||
                    feature.set_field("id2", 0);
 | 
					                    feature.set_field("id2", 0);
 | 
				
			||||||
                    feature.set_field("problem", "inner_with_same_tags");
 | 
					                    feature.set_field("problem", "inner_with_same_tags");
 | 
				
			||||||
                    feature.add_to_layer();
 | 
					                    feature.add_to_layer();
 | 
				
			||||||
@ -208,7 +208,7 @@ namespace osmium {
 | 
				
			|||||||
                try {
 | 
					                try {
 | 
				
			||||||
                    gdalcpp::Feature feature{m_layer_lerror, m_ogr_factory.create_linestring(way)};
 | 
					                    gdalcpp::Feature feature{m_layer_lerror, m_ogr_factory.create_linestring(way)};
 | 
				
			||||||
                    set_object(feature);
 | 
					                    set_object(feature);
 | 
				
			||||||
                    feature.set_field("id1", int32_t(way.id()));
 | 
					                    feature.set_field("id1", static_cast<int32_t>(way.id()));
 | 
				
			||||||
                    feature.set_field("id2", 0);
 | 
					                    feature.set_field("id2", 0);
 | 
				
			||||||
                    feature.set_field("problem", "duplicate_way");
 | 
					                    feature.set_field("problem", "duplicate_way");
 | 
				
			||||||
                    feature.add_to_layer();
 | 
					                    feature.add_to_layer();
 | 
				
			||||||
@ -229,7 +229,7 @@ namespace osmium {
 | 
				
			|||||||
                try {
 | 
					                try {
 | 
				
			||||||
                    gdalcpp::Feature feature{m_layer_ways, m_ogr_factory.create_linestring(way)};
 | 
					                    gdalcpp::Feature feature{m_layer_ways, m_ogr_factory.create_linestring(way)};
 | 
				
			||||||
                    set_object(feature);
 | 
					                    set_object(feature);
 | 
				
			||||||
                    feature.set_field("way_id", int32_t(way.id()));
 | 
					                    feature.set_field("way_id", static_cast<int32_t>(way.id()));
 | 
				
			||||||
                    feature.add_to_layer();
 | 
					                    feature.add_to_layer();
 | 
				
			||||||
                } catch (const osmium::geometry_error&) {
 | 
					                } catch (const osmium::geometry_error&) {
 | 
				
			||||||
                    // XXX
 | 
					                    // XXX
 | 
				
			||||||
 | 
				
			|||||||
@ -5,7 +5,7 @@
 | 
				
			|||||||
 | 
					
 | 
				
			||||||
This file is part of Osmium (https://osmcode.org/libosmium).
 | 
					This file is part of Osmium (https://osmcode.org/libosmium).
 | 
				
			||||||
 | 
					
 | 
				
			||||||
Copyright 2013-2022 Jochen Topf <jochen@topf.org> and others (see README).
 | 
					Copyright 2013-2023 Jochen Topf <jochen@topf.org> and others (see README).
 | 
				
			||||||
 | 
					
 | 
				
			||||||
Boost Software License - Version 1.0 - August 17th, 2003
 | 
					Boost Software License - Version 1.0 - August 17th, 2003
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
				
			|||||||
@ -5,7 +5,7 @@
 | 
				
			|||||||
 | 
					
 | 
				
			||||||
This file is part of Osmium (https://osmcode.org/libosmium).
 | 
					This file is part of Osmium (https://osmcode.org/libosmium).
 | 
				
			||||||
 | 
					
 | 
				
			||||||
Copyright 2013-2022 Jochen Topf <jochen@topf.org> and others (see README).
 | 
					Copyright 2013-2023 Jochen Topf <jochen@topf.org> and others (see README).
 | 
				
			||||||
 | 
					
 | 
				
			||||||
Boost Software License - Version 1.0 - August 17th, 2003
 | 
					Boost Software License - Version 1.0 - August 17th, 2003
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
				
			|||||||
@ -5,7 +5,7 @@
 | 
				
			|||||||
 | 
					
 | 
				
			||||||
This file is part of Osmium (https://osmcode.org/libosmium).
 | 
					This file is part of Osmium (https://osmcode.org/libosmium).
 | 
				
			||||||
 | 
					
 | 
				
			||||||
Copyright 2013-2022 Jochen Topf <jochen@topf.org> and others (see README).
 | 
					Copyright 2013-2023 Jochen Topf <jochen@topf.org> and others (see README).
 | 
				
			||||||
 | 
					
 | 
				
			||||||
Boost Software License - Version 1.0 - August 17th, 2003
 | 
					Boost Software License - Version 1.0 - August 17th, 2003
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
				
			|||||||
@ -5,7 +5,7 @@
 | 
				
			|||||||
 | 
					
 | 
				
			||||||
This file is part of Osmium (https://osmcode.org/libosmium).
 | 
					This file is part of Osmium (https://osmcode.org/libosmium).
 | 
				
			||||||
 | 
					
 | 
				
			||||||
Copyright 2013-2022 Jochen Topf <jochen@topf.org> and others (see README).
 | 
					Copyright 2013-2023 Jochen Topf <jochen@topf.org> and others (see README).
 | 
				
			||||||
 | 
					
 | 
				
			||||||
Boost Software License - Version 1.0 - August 17th, 2003
 | 
					Boost Software License - Version 1.0 - August 17th, 2003
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
				
			|||||||
@ -5,7 +5,7 @@
 | 
				
			|||||||
 | 
					
 | 
				
			||||||
This file is part of Osmium (https://osmcode.org/libosmium).
 | 
					This file is part of Osmium (https://osmcode.org/libosmium).
 | 
				
			||||||
 | 
					
 | 
				
			||||||
Copyright 2013-2022 Jochen Topf <jochen@topf.org> and others (see README).
 | 
					Copyright 2013-2023 Jochen Topf <jochen@topf.org> and others (see README).
 | 
				
			||||||
 | 
					
 | 
				
			||||||
Boost Software License - Version 1.0 - August 17th, 2003
 | 
					Boost Software License - Version 1.0 - August 17th, 2003
 | 
				
			||||||
 | 
					
 | 
				
			||||||
@ -125,8 +125,8 @@ namespace osmium {
 | 
				
			|||||||
                if (value_length > osmium::max_osm_string_length) {
 | 
					                if (value_length > osmium::max_osm_string_length) {
 | 
				
			||||||
                    throw std::length_error{"OSM tag value is too long"};
 | 
					                    throw std::length_error{"OSM tag value is too long"};
 | 
				
			||||||
                }
 | 
					                }
 | 
				
			||||||
                add_size(append_with_zero(key,   osmium::memory::item_size_type(key_length)));
 | 
					                add_size(append_with_zero(key,   static_cast<osmium::memory::item_size_type>(key_length)));
 | 
				
			||||||
                add_size(append_with_zero(value, osmium::memory::item_size_type(value_length)));
 | 
					                add_size(append_with_zero(value, static_cast<osmium::memory::item_size_type>(value_length)));
 | 
				
			||||||
            }
 | 
					            }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
            /**
 | 
					            /**
 | 
				
			||||||
@ -142,8 +142,8 @@ namespace osmium {
 | 
				
			|||||||
                if (value.size() > osmium::max_osm_string_length) {
 | 
					                if (value.size() > osmium::max_osm_string_length) {
 | 
				
			||||||
                    throw std::length_error{"OSM tag value is too long"};
 | 
					                    throw std::length_error{"OSM tag value is too long"};
 | 
				
			||||||
                }
 | 
					                }
 | 
				
			||||||
                add_size(append(key.data(),   osmium::memory::item_size_type(key.size())   + 1));
 | 
					                add_size(append(key.data(),   static_cast<osmium::memory::item_size_type>(key.size())   + 1));
 | 
				
			||||||
                add_size(append(value.data(), osmium::memory::item_size_type(value.size()) + 1));
 | 
					                add_size(append(value.data(), static_cast<osmium::memory::item_size_type>(value.size()) + 1));
 | 
				
			||||||
            }
 | 
					            }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
            /**
 | 
					            /**
 | 
				
			||||||
@ -240,8 +240,8 @@ namespace osmium {
 | 
				
			|||||||
                if (length > osmium::max_osm_string_length) {
 | 
					                if (length > osmium::max_osm_string_length) {
 | 
				
			||||||
                    throw std::length_error{"OSM relation member role is too long"};
 | 
					                    throw std::length_error{"OSM relation member role is too long"};
 | 
				
			||||||
                }
 | 
					                }
 | 
				
			||||||
                member.set_role_size(osmium::string_size_type(length) + 1);
 | 
					                member.set_role_size(static_cast<osmium::string_size_type>(length) + 1);
 | 
				
			||||||
                add_size(append_with_zero(role, osmium::memory::item_size_type(length)));
 | 
					                add_size(append_with_zero(role, static_cast<osmium::memory::item_size_type>(length)));
 | 
				
			||||||
                add_padding(true);
 | 
					                add_padding(true);
 | 
				
			||||||
            }
 | 
					            }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
@ -330,16 +330,16 @@ namespace osmium {
 | 
				
			|||||||
                if (length > osmium::max_osm_string_length) {
 | 
					                if (length > osmium::max_osm_string_length) {
 | 
				
			||||||
                    throw std::length_error{"OSM user name is too long"};
 | 
					                    throw std::length_error{"OSM user name is too long"};
 | 
				
			||||||
                }
 | 
					                }
 | 
				
			||||||
                comment.set_user_size(osmium::string_size_type(length) + 1);
 | 
					                comment.set_user_size(static_cast<osmium::string_size_type>(length) + 1);
 | 
				
			||||||
                add_size(append_with_zero(user, osmium::memory::item_size_type(length)));
 | 
					                add_size(append_with_zero(user, static_cast<osmium::memory::item_size_type>(length)));
 | 
				
			||||||
            }
 | 
					            }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
            void add_text(osmium::ChangesetComment& comment, const char* text, const std::size_t length) {
 | 
					            void add_text(osmium::ChangesetComment& comment, const char* text, const std::size_t length) {
 | 
				
			||||||
                if (length > std::numeric_limits<osmium::changeset_comment_size_type>::max() - 1) {
 | 
					                if (length > std::numeric_limits<osmium::changeset_comment_size_type>::max() - 1) {
 | 
				
			||||||
                    throw std::length_error{"OSM changeset comment is too long"};
 | 
					                    throw std::length_error{"OSM changeset comment is too long"};
 | 
				
			||||||
                }
 | 
					                }
 | 
				
			||||||
                comment.set_text_size(osmium::changeset_comment_size_type(length) + 1);
 | 
					                comment.set_text_size(static_cast<osmium::changeset_comment_size_type>(length) + 1);
 | 
				
			||||||
                add_size(append_with_zero(text, osmium::memory::item_size_type(length)));
 | 
					                add_size(append_with_zero(text, static_cast<osmium::memory::item_size_type>(length)));
 | 
				
			||||||
                add_padding(true);
 | 
					                add_padding(true);
 | 
				
			||||||
            }
 | 
					            }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
				
			|||||||
@ -5,7 +5,7 @@
 | 
				
			|||||||
 | 
					
 | 
				
			||||||
This file is part of Osmium (https://osmcode.org/libosmium).
 | 
					This file is part of Osmium (https://osmcode.org/libosmium).
 | 
				
			||||||
 | 
					
 | 
				
			||||||
Copyright 2013-2022 Jochen Topf <jochen@topf.org> and others (see README).
 | 
					Copyright 2013-2023 Jochen Topf <jochen@topf.org> and others (see README).
 | 
				
			||||||
 | 
					
 | 
				
			||||||
Boost Software License - Version 1.0 - August 17th, 2003
 | 
					Boost Software License - Version 1.0 - August 17th, 2003
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
				
			|||||||
@ -5,7 +5,7 @@
 | 
				
			|||||||
 | 
					
 | 
				
			||||||
This file is part of Osmium (https://osmcode.org/libosmium).
 | 
					This file is part of Osmium (https://osmcode.org/libosmium).
 | 
				
			||||||
 | 
					
 | 
				
			||||||
Copyright 2013-2022 Jochen Topf <jochen@topf.org> and others (see README).
 | 
					Copyright 2013-2023 Jochen Topf <jochen@topf.org> and others (see README).
 | 
				
			||||||
 | 
					
 | 
				
			||||||
Boost Software License - Version 1.0 - August 17th, 2003
 | 
					Boost Software License - Version 1.0 - August 17th, 2003
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
				
			|||||||
@ -5,7 +5,7 @@
 | 
				
			|||||||
 | 
					
 | 
				
			||||||
This file is part of Osmium (https://osmcode.org/libosmium).
 | 
					This file is part of Osmium (https://osmcode.org/libosmium).
 | 
				
			||||||
 | 
					
 | 
				
			||||||
Copyright 2013-2022 Jochen Topf <jochen@topf.org> and others (see README).
 | 
					Copyright 2013-2023 Jochen Topf <jochen@topf.org> and others (see README).
 | 
				
			||||||
 | 
					
 | 
				
			||||||
Boost Software License - Version 1.0 - August 17th, 2003
 | 
					Boost Software License - Version 1.0 - August 17th, 2003
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
				
			|||||||
@ -5,7 +5,7 @@
 | 
				
			|||||||
 | 
					
 | 
				
			||||||
This file is part of Osmium (https://osmcode.org/libosmium).
 | 
					This file is part of Osmium (https://osmcode.org/libosmium).
 | 
				
			||||||
 | 
					
 | 
				
			||||||
Copyright 2013-2022 Jochen Topf <jochen@topf.org> and others (see README).
 | 
					Copyright 2013-2023 Jochen Topf <jochen@topf.org> and others (see README).
 | 
				
			||||||
 | 
					
 | 
				
			||||||
Boost Software License - Version 1.0 - August 17th, 2003
 | 
					Boost Software License - Version 1.0 - August 17th, 2003
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
				
			|||||||
@ -5,7 +5,7 @@
 | 
				
			|||||||
 | 
					
 | 
				
			||||||
This file is part of Osmium (https://osmcode.org/libosmium).
 | 
					This file is part of Osmium (https://osmcode.org/libosmium).
 | 
				
			||||||
 | 
					
 | 
				
			||||||
Copyright 2013-2022 Jochen Topf <jochen@topf.org> and others (see README).
 | 
					Copyright 2013-2023 Jochen Topf <jochen@topf.org> and others (see README).
 | 
				
			||||||
 | 
					
 | 
				
			||||||
Boost Software License - Version 1.0 - August 17th, 2003
 | 
					Boost Software License - Version 1.0 - August 17th, 2003
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
				
			|||||||
							
								
								
									
										2
									
								
								third_party/libosmium/include/osmium/fwd.hpp
									
									
									
									
										vendored
									
									
								
							
							
						
						
									
										2
									
								
								third_party/libosmium/include/osmium/fwd.hpp
									
									
									
									
										vendored
									
									
								
							@ -5,7 +5,7 @@
 | 
				
			|||||||
 | 
					
 | 
				
			||||||
This file is part of Osmium (https://osmcode.org/libosmium).
 | 
					This file is part of Osmium (https://osmcode.org/libosmium).
 | 
				
			||||||
 | 
					
 | 
				
			||||||
Copyright 2013-2022 Jochen Topf <jochen@topf.org> and others (see README).
 | 
					Copyright 2013-2023 Jochen Topf <jochen@topf.org> and others (see README).
 | 
				
			||||||
 | 
					
 | 
				
			||||||
Boost Software License - Version 1.0 - August 17th, 2003
 | 
					Boost Software License - Version 1.0 - August 17th, 2003
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
				
			|||||||
@ -5,7 +5,7 @@
 | 
				
			|||||||
 | 
					
 | 
				
			||||||
This file is part of Osmium (https://osmcode.org/libosmium).
 | 
					This file is part of Osmium (https://osmcode.org/libosmium).
 | 
				
			||||||
 | 
					
 | 
				
			||||||
Copyright 2013-2022 Jochen Topf <jochen@topf.org> and others (see README).
 | 
					Copyright 2013-2023 Jochen Topf <jochen@topf.org> and others (see README).
 | 
				
			||||||
 | 
					
 | 
				
			||||||
Boost Software License - Version 1.0 - August 17th, 2003
 | 
					Boost Software License - Version 1.0 - August 17th, 2003
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
				
			|||||||
@ -5,7 +5,7 @@
 | 
				
			|||||||
 | 
					
 | 
				
			||||||
This file is part of Osmium (https://osmcode.org/libosmium).
 | 
					This file is part of Osmium (https://osmcode.org/libosmium).
 | 
				
			||||||
 | 
					
 | 
				
			||||||
Copyright 2013-2022 Jochen Topf <jochen@topf.org> and others (see README).
 | 
					Copyright 2013-2023 Jochen Topf <jochen@topf.org> and others (see README).
 | 
				
			||||||
 | 
					
 | 
				
			||||||
Boost Software License - Version 1.0 - August 17th, 2003
 | 
					Boost Software License - Version 1.0 - August 17th, 2003
 | 
				
			||||||
 | 
					
 | 
				
			||||||
@ -166,7 +166,7 @@ namespace osmium {
 | 
				
			|||||||
 | 
					
 | 
				
			||||||
        public:
 | 
					        public:
 | 
				
			||||||
 | 
					
 | 
				
			||||||
            GeometryFactory<TGeomImpl, TProjection>() :
 | 
					            GeometryFactory() :
 | 
				
			||||||
                m_projection(),
 | 
					                m_projection(),
 | 
				
			||||||
                m_impl(m_projection.epsg()) {
 | 
					                m_impl(m_projection.epsg()) {
 | 
				
			||||||
            }
 | 
					            }
 | 
				
			||||||
@ -175,7 +175,7 @@ namespace osmium {
 | 
				
			|||||||
             * Constructor for default initialized projection.
 | 
					             * Constructor for default initialized projection.
 | 
				
			||||||
             */
 | 
					             */
 | 
				
			||||||
            template <typename... TArgs>
 | 
					            template <typename... TArgs>
 | 
				
			||||||
            explicit GeometryFactory<TGeomImpl, TProjection>(TArgs&&... args) :
 | 
					            explicit GeometryFactory(TArgs&&... args) :
 | 
				
			||||||
                m_projection(),
 | 
					                m_projection(),
 | 
				
			||||||
                m_impl(m_projection.epsg(), std::forward<TArgs>(args)...) {
 | 
					                m_impl(m_projection.epsg(), std::forward<TArgs>(args)...) {
 | 
				
			||||||
            }
 | 
					            }
 | 
				
			||||||
@ -185,7 +185,7 @@ namespace osmium {
 | 
				
			|||||||
             * projection is moved into the GeometryFactory.
 | 
					             * projection is moved into the GeometryFactory.
 | 
				
			||||||
             */
 | 
					             */
 | 
				
			||||||
            template <typename... TArgs>
 | 
					            template <typename... TArgs>
 | 
				
			||||||
            explicit GeometryFactory<TGeomImpl, TProjection>(TProjection&& projection, TArgs&&... args) :
 | 
					            explicit GeometryFactory(TProjection&& projection, TArgs&&... args) :
 | 
				
			||||||
                m_projection(std::move(projection)),
 | 
					                m_projection(std::move(projection)),
 | 
				
			||||||
                m_impl(m_projection.epsg(), std::forward<TArgs>(args)...) {
 | 
					                m_impl(m_projection.epsg(), std::forward<TArgs>(args)...) {
 | 
				
			||||||
            }
 | 
					            }
 | 
				
			||||||
 | 
				
			|||||||
@ -5,7 +5,7 @@
 | 
				
			|||||||
 | 
					
 | 
				
			||||||
This file is part of Osmium (https://osmcode.org/libosmium).
 | 
					This file is part of Osmium (https://osmcode.org/libosmium).
 | 
				
			||||||
 | 
					
 | 
				
			||||||
Copyright 2013-2022 Jochen Topf <jochen@topf.org> and others (see README).
 | 
					Copyright 2013-2023 Jochen Topf <jochen@topf.org> and others (see README).
 | 
				
			||||||
 | 
					
 | 
				
			||||||
Boost Software License - Version 1.0 - August 17th, 2003
 | 
					Boost Software License - Version 1.0 - August 17th, 2003
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
				
			|||||||
@ -5,7 +5,7 @@
 | 
				
			|||||||
 | 
					
 | 
				
			||||||
This file is part of Osmium (https://osmcode.org/libosmium).
 | 
					This file is part of Osmium (https://osmcode.org/libosmium).
 | 
				
			||||||
 | 
					
 | 
				
			||||||
Copyright 2013-2022 Jochen Topf <jochen@topf.org> and others (see README).
 | 
					Copyright 2013-2023 Jochen Topf <jochen@topf.org> and others (see README).
 | 
				
			||||||
 | 
					
 | 
				
			||||||
Boost Software License - Version 1.0 - August 17th, 2003
 | 
					Boost Software License - Version 1.0 - August 17th, 2003
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
				
			|||||||
@ -5,7 +5,7 @@
 | 
				
			|||||||
 | 
					
 | 
				
			||||||
This file is part of Osmium (https://osmcode.org/libosmium).
 | 
					This file is part of Osmium (https://osmcode.org/libosmium).
 | 
				
			||||||
 | 
					
 | 
				
			||||||
Copyright 2013-2022 Jochen Topf <jochen@topf.org> and others (see README).
 | 
					Copyright 2013-2023 Jochen Topf <jochen@topf.org> and others (see README).
 | 
				
			||||||
 | 
					
 | 
				
			||||||
Boost Software License - Version 1.0 - August 17th, 2003
 | 
					Boost Software License - Version 1.0 - August 17th, 2003
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
				
			|||||||
@ -5,7 +5,7 @@
 | 
				
			|||||||
 | 
					
 | 
				
			||||||
This file is part of Osmium (https://osmcode.org/libosmium).
 | 
					This file is part of Osmium (https://osmcode.org/libosmium).
 | 
				
			||||||
 | 
					
 | 
				
			||||||
Copyright 2013-2022 Jochen Topf <jochen@topf.org> and others (see README).
 | 
					Copyright 2013-2023 Jochen Topf <jochen@topf.org> and others (see README).
 | 
				
			||||||
 | 
					
 | 
				
			||||||
Boost Software License - Version 1.0 - August 17th, 2003
 | 
					Boost Software License - Version 1.0 - August 17th, 2003
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
				
			|||||||
@ -5,7 +5,7 @@
 | 
				
			|||||||
 | 
					
 | 
				
			||||||
This file is part of Osmium (https://osmcode.org/libosmium).
 | 
					This file is part of Osmium (https://osmcode.org/libosmium).
 | 
				
			||||||
 | 
					
 | 
				
			||||||
Copyright 2013-2022 Jochen Topf <jochen@topf.org> and others (see README).
 | 
					Copyright 2013-2023 Jochen Topf <jochen@topf.org> and others (see README).
 | 
				
			||||||
 | 
					
 | 
				
			||||||
Boost Software License - Version 1.0 - August 17th, 2003
 | 
					Boost Software License - Version 1.0 - August 17th, 2003
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
				
			|||||||
@ -5,7 +5,7 @@
 | 
				
			|||||||
 | 
					
 | 
				
			||||||
This file is part of Osmium (https://osmcode.org/libosmium).
 | 
					This file is part of Osmium (https://osmcode.org/libosmium).
 | 
				
			||||||
 | 
					
 | 
				
			||||||
Copyright 2013-2022 Jochen Topf <jochen@topf.org> and others (see README).
 | 
					Copyright 2013-2023 Jochen Topf <jochen@topf.org> and others (see README).
 | 
				
			||||||
 | 
					
 | 
				
			||||||
Boost Software License - Version 1.0 - August 17th, 2003
 | 
					Boost Software License - Version 1.0 - August 17th, 2003
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
				
			|||||||
@ -5,7 +5,7 @@
 | 
				
			|||||||
 | 
					
 | 
				
			||||||
This file is part of Osmium (https://osmcode.org/libosmium).
 | 
					This file is part of Osmium (https://osmcode.org/libosmium).
 | 
				
			||||||
 | 
					
 | 
				
			||||||
Copyright 2013-2022 Jochen Topf <jochen@topf.org> and others (see README).
 | 
					Copyright 2013-2023 Jochen Topf <jochen@topf.org> and others (see README).
 | 
				
			||||||
 | 
					
 | 
				
			||||||
Boost Software License - Version 1.0 - August 17th, 2003
 | 
					Boost Software License - Version 1.0 - August 17th, 2003
 | 
				
			||||||
 | 
					
 | 
				
			||||||
@ -47,6 +47,9 @@ namespace osmium {
 | 
				
			|||||||
            /**
 | 
					            /**
 | 
				
			||||||
             * A geometry factory implementation that can be used with the
 | 
					             * A geometry factory implementation that can be used with the
 | 
				
			||||||
             * RapidJSON (https://github.com/miloyip/rapidjson) JSON writer.
 | 
					             * RapidJSON (https://github.com/miloyip/rapidjson) JSON writer.
 | 
				
			||||||
 | 
					             *
 | 
				
			||||||
 | 
					             * @deprecated The RapidJSON support will be removed in a future
 | 
				
			||||||
 | 
					             *             version of libosmium.
 | 
				
			||||||
             */
 | 
					             */
 | 
				
			||||||
            template <typename TWriter>
 | 
					            template <typename TWriter>
 | 
				
			||||||
            class RapidGeoJSONFactoryImpl {
 | 
					            class RapidGeoJSONFactoryImpl {
 | 
				
			||||||
 | 
				
			|||||||
@ -5,7 +5,7 @@
 | 
				
			|||||||
 | 
					
 | 
				
			||||||
This file is part of Osmium (https://osmcode.org/libosmium).
 | 
					This file is part of Osmium (https://osmcode.org/libosmium).
 | 
				
			||||||
 | 
					
 | 
				
			||||||
Copyright 2013-2022 Jochen Topf <jochen@topf.org> and others (see README).
 | 
					Copyright 2013-2023 Jochen Topf <jochen@topf.org> and others (see README).
 | 
				
			||||||
 | 
					
 | 
				
			||||||
Boost Software License - Version 1.0 - August 17th, 2003
 | 
					Boost Software License - Version 1.0 - August 17th, 2003
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
				
			|||||||
@ -5,7 +5,7 @@
 | 
				
			|||||||
 | 
					
 | 
				
			||||||
This file is part of Osmium (https://osmcode.org/libosmium).
 | 
					This file is part of Osmium (https://osmcode.org/libosmium).
 | 
				
			||||||
 | 
					
 | 
				
			||||||
Copyright 2013-2022 Jochen Topf <jochen@topf.org> and others (see README).
 | 
					Copyright 2013-2023 Jochen Topf <jochen@topf.org> and others (see README).
 | 
				
			||||||
 | 
					
 | 
				
			||||||
Boost Software License - Version 1.0 - August 17th, 2003
 | 
					Boost Software License - Version 1.0 - August 17th, 2003
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
				
			|||||||
@ -5,7 +5,7 @@
 | 
				
			|||||||
 | 
					
 | 
				
			||||||
This file is part of Osmium (https://osmcode.org/libosmium).
 | 
					This file is part of Osmium (https://osmcode.org/libosmium).
 | 
				
			||||||
 | 
					
 | 
				
			||||||
Copyright 2013-2022 Jochen Topf <jochen@topf.org> and others (see README).
 | 
					Copyright 2013-2023 Jochen Topf <jochen@topf.org> and others (see README).
 | 
				
			||||||
 | 
					
 | 
				
			||||||
Boost Software License - Version 1.0 - August 17th, 2003
 | 
					Boost Software License - Version 1.0 - August 17th, 2003
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
				
			|||||||
@ -5,7 +5,7 @@
 | 
				
			|||||||
 | 
					
 | 
				
			||||||
This file is part of Osmium (https://osmcode.org/libosmium).
 | 
					This file is part of Osmium (https://osmcode.org/libosmium).
 | 
				
			||||||
 | 
					
 | 
				
			||||||
Copyright 2013-2022 Jochen Topf <jochen@topf.org> and others (see README).
 | 
					Copyright 2013-2023 Jochen Topf <jochen@topf.org> and others (see README).
 | 
				
			||||||
 | 
					
 | 
				
			||||||
Boost Software License - Version 1.0 - August 17th, 2003
 | 
					Boost Software License - Version 1.0 - August 17th, 2003
 | 
				
			||||||
 | 
					
 | 
				
			||||||
@ -68,7 +68,7 @@ namespace osmium {
 | 
				
			|||||||
                std::string out;
 | 
					                std::string out;
 | 
				
			||||||
                out.reserve(str.size() * 2);
 | 
					                out.reserve(str.size() * 2);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
                for (char c : str) {
 | 
					                for (const char c : str) {
 | 
				
			||||||
                    out += lookup_hex[(static_cast<unsigned int>(c) >> 4U) & 0xfU];
 | 
					                    out += lookup_hex[(static_cast<unsigned int>(c) >> 4U) & 0xfU];
 | 
				
			||||||
                    out += lookup_hex[ static_cast<unsigned int>(c)        & 0xfU];
 | 
					                    out += lookup_hex[ static_cast<unsigned int>(c)        & 0xfU];
 | 
				
			||||||
                }
 | 
					                }
 | 
				
			||||||
 | 
				
			|||||||
@ -5,7 +5,7 @@
 | 
				
			|||||||
 | 
					
 | 
				
			||||||
This file is part of Osmium (https://osmcode.org/libosmium).
 | 
					This file is part of Osmium (https://osmcode.org/libosmium).
 | 
				
			||||||
 | 
					
 | 
				
			||||||
Copyright 2013-2022 Jochen Topf <jochen@topf.org> and others (see README).
 | 
					Copyright 2013-2023 Jochen Topf <jochen@topf.org> and others (see README).
 | 
				
			||||||
 | 
					
 | 
				
			||||||
Boost Software License - Version 1.0 - August 17th, 2003
 | 
					Boost Software License - Version 1.0 - August 17th, 2003
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
				
			|||||||
@ -5,7 +5,7 @@
 | 
				
			|||||||
 | 
					
 | 
				
			||||||
This file is part of Osmium (https://osmcode.org/libosmium).
 | 
					This file is part of Osmium (https://osmcode.org/libosmium).
 | 
				
			||||||
 | 
					
 | 
				
			||||||
Copyright 2013-2022 Jochen Topf <jochen@topf.org> and others (see README).
 | 
					Copyright 2013-2023 Jochen Topf <jochen@topf.org> and others (see README).
 | 
				
			||||||
 | 
					
 | 
				
			||||||
Boost Software License - Version 1.0 - August 17th, 2003
 | 
					Boost Software License - Version 1.0 - August 17th, 2003
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
				
			|||||||
@ -5,7 +5,7 @@
 | 
				
			|||||||
 | 
					
 | 
				
			||||||
This file is part of Osmium (https://osmcode.org/libosmium).
 | 
					This file is part of Osmium (https://osmcode.org/libosmium).
 | 
				
			||||||
 | 
					
 | 
				
			||||||
Copyright 2013-2022 Jochen Topf <jochen@topf.org> and others (see README).
 | 
					Copyright 2013-2023 Jochen Topf <jochen@topf.org> and others (see README).
 | 
				
			||||||
 | 
					
 | 
				
			||||||
Boost Software License - Version 1.0 - August 17th, 2003
 | 
					Boost Software License - Version 1.0 - August 17th, 2003
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
				
			|||||||
@ -5,7 +5,7 @@
 | 
				
			|||||||
 | 
					
 | 
				
			||||||
This file is part of Osmium (https://osmcode.org/libosmium).
 | 
					This file is part of Osmium (https://osmcode.org/libosmium).
 | 
				
			||||||
 | 
					
 | 
				
			||||||
Copyright 2013-2022 Jochen Topf <jochen@topf.org> and others (see README).
 | 
					Copyright 2013-2023 Jochen Topf <jochen@topf.org> and others (see README).
 | 
				
			||||||
 | 
					
 | 
				
			||||||
Boost Software License - Version 1.0 - August 17th, 2003
 | 
					Boost Software License - Version 1.0 - August 17th, 2003
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
				
			|||||||
Some files were not shown because too many files have changed in this diff Show More
		Loading…
	
		Reference in New Issue
	
	Block a user