diff --git a/azure-pipelines.yml b/azure-pipelines.yml index ebbdef1be9..dca19be29a 100644 --- a/azure-pipelines.yml +++ b/azure-pipelines.yml @@ -1,85 +1,96 @@ jobs: - - - job: 'OSx' + - job: "OSx" displayName: "Build and test OSx" timeoutInMinutes: 0 cancelTimeoutInMinutes: 60 pool: vmImage: macOS-latest variables: - pythonVersion: '3.9' + pythonVersion: "3.9" cmakeBuildType: Release steps: - # Use a specific Python version - - task: UsePythonVersion@0 - displayName: Use Python $(pythonVersion) - inputs: - versionSpec: $(pythonVersion) - addToPath: true - architecture: 'x64' + # Use a specific Python version + - task: UsePythonVersion@0 + displayName: Use Python $(pythonVersion) + inputs: + versionSpec: $(pythonVersion) + addToPath: true + architecture: "x64" - - bash: | - git submodule update --init - python -m pip install --user -r ext/gudhi-deploy/build-requirements.txt - python -m pip install --user -r ext/gudhi-deploy/test-requirements.txt - python -m pip uninstall -y pykeops - brew update || true - brew install ninja graphviz doxygen boost eigen gmp mpfr tbb cgal || true - displayName: 'Install build dependencies' - - bash: | - mkdir build - cd build - cmake -DCMAKE_BUILD_TYPE:STRING=$(cmakeBuildType) -GNinja -DWITH_GUDHI_EXAMPLE=ON -DWITH_GUDHI_TEST=ON -DWITH_GUDHI_UTILITIES=ON -DWITH_GUDHI_PYTHON=ON -DWITH_GUDHI_REMOTE_TEST=ON .. - ninja - ninja doxygen - ctest --output-on-failure - displayName: 'Build, test and documentation generation' + - bash: | + git submodule update --init + python -m pip install --user -r ext/gudhi-deploy/build-requirements.txt + python -m pip install --user -r ext/gudhi-deploy/test-requirements.txt + python -m pip uninstall -y pykeops + brew update || true + brew install ninja graphviz doxygen boost eigen gmp mpfr tbb cgal || true + displayName: "Install build dependencies" + - bash: | + mkdir build + cd build + cmake -DCMAKE_BUILD_TYPE:STRING=$(cmakeBuildType) -GNinja -DWITH_GUDHI_EXAMPLE=ON -DWITH_GUDHI_TEST=ON -DWITH_GUDHI_UTILITIES=ON -DWITH_GUDHI_PYTHON=ON -DWITH_GUDHI_REMOTE_TEST=ON .. + ninja + ninja doxygen + ctest --output-on-failure + displayName: "Build, test and documentation generation" - - job: 'Windows' + - job: "Windows" displayName: "Build and test Windows" timeoutInMinutes: 0 cancelTimeoutInMinutes: 60 pool: vmImage: windows-latest variables: - pythonVersion: '3.9' + pythonVersion: "3.9" cmakeVcpkgFlags: -DVCPKG_TARGET_TRIPLET=x64-windows -DCMAKE_TOOLCHAIN_FILE=c:\vcpkg\scripts\buildsystems\vcpkg.cmake cmakeFlags: -DWITH_GUDHI_EXAMPLE=ON -DWITH_GUDHI_TEST=ON -DWITH_GUDHI_UTILITIES=ON -DWITH_GUDHI_PYTHON=OFF steps: - # Use a specific Python version - - task: UsePythonVersion@0 - displayName: Use Python $(pythonVersion) - inputs: - versionSpec: $(pythonVersion) - addToPath: true - architecture: 'x64' + # Use a specific Python version + - task: UsePythonVersion@0 + displayName: Use Python $(pythonVersion) + inputs: + versionSpec: $(pythonVersion) + addToPath: true + architecture: "x64" - - script: | - git submodule update --init - python -m pip install --user -r ext/gudhi-deploy/build-requirements.txt - python -m pip install --user -r ext/gudhi-deploy/test-requirements.txt - # Only vcpkg release libs for CI - echo.set(VCPKG_BUILD_TYPE release)>> C:\vcpkg\triplets\x64-windows.cmake - vcpkg install boost-filesystem:x64-windows boost-test:x64-windows boost-program-options:x64-windows tbb:x64-windows eigen3:x64-windows cgal:x64-windows - choco install -y ninja --force --force-dependencies - displayName: 'Install build dependencies' - - script: | - $ErrorActionPreference = 'Stop' - call "C:\Program Files\Microsoft Visual Studio\2022\Enterprise\VC\Auxiliary\Build\vcvarsall.bat" amd64 - mkdir build - cd build - cmake -DCMAKE_BUILD_TYPE=Release -G "Ninja" -DFORCE_EIGEN_DEFAULT_DENSE_INDEX_TYPE_TO_INT=ON $(cmakeVcpkgFlags) $(cmakeFlags) .. - ninja - ctest --output-on-failure -C Release -E diff_files - cmake -DWITH_GUDHI_PYTHON=ON -DWITH_GUDHI_REMOTE_TEST=ON . - cd src\python - copy "C:\vcpkg\installed\x64-windows\bin\mpfr*.dll" ".\gudhi\" - copy "C:\vcpkg\installed\x64-windows\bin\gmp*.dll" ".\gudhi\" - copy "C:\vcpkg\installed\x64-windows\bin\tbb*.dll" ".\gudhi\" - python setup.py build_ext --inplace - SET PYTHONPATH=%CD%;%PYTHONPATH% - echo %PYTHONPATH% - ctest --output-on-failure -C Release - displayName: 'Build and test' + - script: | + git submodule update --init + python -m pip install --user -r ext/gudhi-deploy/build-requirements.txt + IF %ERRORLEVEL% NEQ 0 EXIT 1 + python -m pip install --user -r ext/gudhi-deploy/test-requirements.txt + IF %ERRORLEVEL% NEQ 0 EXIT 1 + # Only vcpkg release libs for CI + echo.set(VCPKG_BUILD_TYPE release)>> C:\vcpkg\triplets\x64-windows.cmake + vcpkg install boost-filesystem:x64-windows boost-test:x64-windows boost-program-options:x64-windows tbb:x64-windows eigen3:x64-windows cgal:x64-windows + IF %ERRORLEVEL% NEQ 0 EXIT 1 + choco install -y ninja --force --force-dependencies + IF %ERRORLEVEL% NEQ 0 EXIT 1 + displayName: "Install build dependencies" + - script: | + call "C:\Program Files\Microsoft Visual Studio\2022\Enterprise\VC\Auxiliary\Build\vcvarsall.bat" amd64 + mkdir build + cd build + cmake -DCMAKE_BUILD_TYPE=Release -G "Ninja" -DFORCE_EIGEN_DEFAULT_DENSE_INDEX_TYPE_TO_INT=ON $(cmakeVcpkgFlags) $(cmakeFlags) .. + IF %ERRORLEVEL% NEQ 0 EXIT 1 + ninja + IF %ERRORLEVEL% NEQ 0 EXIT 1 + ctest --output-on-failure -C Release -E diff_files + IF %ERRORLEVEL% NEQ 0 EXIT 1 + cmake -DWITH_GUDHI_PYTHON=ON -DWITH_GUDHI_REMOTE_TEST=ON . + IF %ERRORLEVEL% NEQ 0 EXIT 1 + cd src\python + copy "C:\vcpkg\installed\x64-windows\bin\mpfr*.dll" ".\gudhi\" + IF %ERRORLEVEL% NEQ 0 EXIT 1 + copy "C:\vcpkg\installed\x64-windows\bin\gmp*.dll" ".\gudhi\" + IF %ERRORLEVEL% NEQ 0 EXIT 1 + copy "C:\vcpkg\installed\x64-windows\bin\tbb*.dll" ".\gudhi\" + IF %ERRORLEVEL% NEQ 0 EXIT 1 + python setup.py build_ext --inplace + IF %ERRORLEVEL% NEQ 0 EXIT 1 + SET PYTHONPATH=%CD%;%PYTHONPATH% + echo %PYTHONPATH% + ctest --output-on-failure -C Release + IF %ERRORLEVEL% NEQ 0 EXIT 1 + displayName: "Build and test" diff --git a/src/Persistence_matrix/include/gudhi/persistence_interval.h b/src/Persistence_matrix/include/gudhi/persistence_interval.h index b1b1528131..d72cabdad6 100644 --- a/src/Persistence_matrix/include/gudhi/persistence_interval.h +++ b/src/Persistence_matrix/include/gudhi/persistence_interval.h @@ -88,140 +88,164 @@ struct Persistence_interval { } return stream; } + + /** + * @brief Specialization of `get` for @ref Gudhi::persistence_matrix::Persistence_interval. + * + * @tparam I Index of the value to return: 0 for the birth value, 1 for the death value and 2 for the dimension. + * @return Either the birth value if @p I == 0, the death value if @p I == 1 or the dimension if @p I == 2. + */ + template + constexpr auto& get() & noexcept { + static_assert(I < 3, "Value mismatch at argument 1 in template parameter list. Maximal possible value is 2."); + + if constexpr (I == 0) return birth; + if constexpr (I == 1) return death; + if constexpr (I == 2) return dim; + } + + /** + * @brief Specialization of `get` for @ref Gudhi::persistence_matrix::Persistence_interval. + * + * @tparam I Index of the value to return: 0 for the birth value, 1 for the death value and 2 for the dimension. + * @return Either the birth value if @p I == 0, the death value if @p I == 1 or the dimension if @p I == 2. + */ + template + constexpr const auto& get() const& noexcept { + static_assert(I < 3, "Value mismatch at argument 1 in template parameter list. Maximal possible value is 2."); + + if constexpr (I == 0) return birth; + if constexpr (I == 1) return death; + if constexpr (I == 2) return dim; + } + + /** + * @brief Specialization of `get` for @ref Gudhi::persistence_matrix::Persistence_interval. + * + * @tparam I Index of the value to return: 0 for the birth value, 1 for the death value and 2 for the dimension. + * @return Either the birth value if @p I == 0, the death value if @p I == 1 or the dimension if @p I == 2. + */ + template + constexpr auto&& get() && noexcept { + static_assert(I < 3, "Value mismatch at argument 1 in template parameter list. Maximal possible value is 2."); + + if constexpr (I == 0) return std::move(birth); + if constexpr (I == 1) return std::move(death); + if constexpr (I == 2) return std::move(dim); + } + + /** + * @brief Specialization of `get` for @ref Gudhi::persistence_matrix::Persistence_interval. + * + * @tparam I Index of the value to return: 0 for the birth value, 1 for the death value and 2 for the dimension. + * @return Either the birth value if @p I == 0, the death value if @p I == 1 or the dimension if @p I == 2. + */ + template + constexpr const auto&& get() const&& noexcept { + static_assert(I < 3, "Value mismatch at argument 1 in template parameter list. Maximal possible value is 2."); + + if constexpr (I == 0) return std::move(birth); + if constexpr (I == 1) return std::move(death); + if constexpr (I == 2) return std::move(dim); + } }; +} // namespace persistence_matrix +} // namespace Gudhi + +namespace std { + /** * @ingroup persistence_matrix * - * @brief Partial specialization of `get` for @ref Gudhi::persistence_matrix::Persistence_interval. + * @brief Partial specialization of `std::tuple_size` for @ref Gudhi::persistence_matrix::Persistence_interval. * - * @tparam I Index of the value to return: 0 for the birth value, 1 for the death value and 2 for the dimension. * @tparam Dimension First template parameter of @ref Gudhi::persistence_matrix::Persistence_interval. * @tparam Event_value Second template parameter of @ref Gudhi::persistence_matrix::Persistence_interval. - * @param i Interval from which the value should be returned. - * @return Either the birth value if @p I == 0, the death value if @p I == 1 or the dimension if @p I == 2. */ -template -constexpr auto& get(Gudhi::persistence_matrix::Persistence_interval& i) noexcept { - static_assert(I < 3, "Value mismatch at argument 1 in template parameter list. Maximal possible value is 2."); - - if constexpr (I == 0) return i.birth; - if constexpr (I == 1) return i.death; - if constexpr (I == 2) return i.dim; -} +template +struct tuple_size > + : integral_constant {}; /** * @ingroup persistence_matrix * - * @brief Partial specialization of `get` for @ref Gudhi::persistence_matrix::Persistence_interval. + * @brief Partial specialization of `std::tuple_element` for @ref Gudhi::persistence_matrix::Persistence_interval. * - * @tparam I Index of the value to return: 0 for the birth value, 1 for the death value and 2 for the dimension. + * @tparam I Index of the type to store: 0 for the birth value type, 1 for the death value type and 2 for the + * dimension value type. * @tparam Dimension First template parameter of @ref Gudhi::persistence_matrix::Persistence_interval. * @tparam Event_value Second template parameter of @ref Gudhi::persistence_matrix::Persistence_interval. - * @param i Interval from which the value should be returned. - * @return Either the birth value if @p I == 0, the death value if @p I == 1 or the dimension if @p I == 2. */ -template -constexpr const auto& get(const Gudhi::persistence_matrix::Persistence_interval& i) noexcept { +template +struct tuple_element > { static_assert(I < 3, "Value mismatch at argument 1 in template parameter list. Maximal possible value is 2."); - if constexpr (I == 0) return i.birth; - if constexpr (I == 1) return i.death; - if constexpr (I == 2) return i.dim; -} + using type = typename conditional ::type; +}; /** * @ingroup persistence_matrix * * @brief Partial specialization of `get` for @ref Gudhi::persistence_matrix::Persistence_interval. - * + * * @tparam I Index of the value to return: 0 for the birth value, 1 for the death value and 2 for the dimension. * @tparam Dimension First template parameter of @ref Gudhi::persistence_matrix::Persistence_interval. * @tparam Event_value Second template parameter of @ref Gudhi::persistence_matrix::Persistence_interval. * @param i Interval from which the value should be returned. * @return Either the birth value if @p I == 0, the death value if @p I == 1 or the dimension if @p I == 2. */ -template -constexpr auto&& get(Gudhi::persistence_matrix::Persistence_interval&& i) noexcept { - static_assert(I < 3, "Value mismatch at argument 1 in template parameter list. Maximal possible value is 2."); - - if constexpr (I == 0) return std::move(i.birth); - if constexpr (I == 1) return std::move(i.death); - if constexpr (I == 2) return std::move(i.dim); +template +constexpr auto& get(Gudhi::persistence_matrix::Persistence_interval& i) noexcept { + return i.template get(); } /** * @ingroup persistence_matrix * * @brief Partial specialization of `get` for @ref Gudhi::persistence_matrix::Persistence_interval. - * + * * @tparam I Index of the value to return: 0 for the birth value, 1 for the death value and 2 for the dimension. * @tparam Dimension First template parameter of @ref Gudhi::persistence_matrix::Persistence_interval. * @tparam Event_value Second template parameter of @ref Gudhi::persistence_matrix::Persistence_interval. * @param i Interval from which the value should be returned. * @return Either the birth value if @p I == 0, the death value if @p I == 1 or the dimension if @p I == 2. */ -template -constexpr const auto&& get(const Gudhi::persistence_matrix::Persistence_interval&& i) noexcept { - static_assert(I < 3, "Value mismatch at argument 1 in template parameter list. Maximal possible value is 2."); - - if constexpr (I == 0) return std::move(i.birth); - if constexpr (I == 1) return std::move(i.death); - if constexpr (I == 2) return std::move(i.dim); +template +constexpr const auto& get(const Gudhi::persistence_matrix::Persistence_interval& i) noexcept { + return i.template get(); } -} // namespace persistence_matrix -} // namespace Gudhi - -namespace std { - /** * @ingroup persistence_matrix * - * @brief Partial specialization of `std::tuple_size` for @ref Gudhi::persistence_matrix::Persistence_interval. - * + * @brief Partial specialization of `get` for @ref Gudhi::persistence_matrix::Persistence_interval. + * + * @tparam I Index of the value to return: 0 for the birth value, 1 for the death value and 2 for the dimension. * @tparam Dimension First template parameter of @ref Gudhi::persistence_matrix::Persistence_interval. * @tparam Event_value Second template parameter of @ref Gudhi::persistence_matrix::Persistence_interval. + * @param i Interval from which the value should be returned. + * @return Either the birth value if @p I == 0, the death value if @p I == 1 or the dimension if @p I == 2. */ -template -struct tuple_size > - : integral_constant {}; +template +constexpr auto&& get(Gudhi::persistence_matrix::Persistence_interval&& i) noexcept { + return std::move(i).template get(); +} /** * @ingroup persistence_matrix * - * @brief Partial specialization of `std::tuple_element` for @ref Gudhi::persistence_matrix::Persistence_interval. - * - * @tparam I Index of the type to store: 0 for the birth value type, 1 for the death value type and 2 for the - * dimension value type. + * @brief Partial specialization of `get` for @ref Gudhi::persistence_matrix::Persistence_interval. + * + * @tparam I Index of the value to return: 0 for the birth value, 1 for the death value and 2 for the dimension. * @tparam Dimension First template parameter of @ref Gudhi::persistence_matrix::Persistence_interval. * @tparam Event_value Second template parameter of @ref Gudhi::persistence_matrix::Persistence_interval. + * @param i Interval from which the value should be returned. + * @return Either the birth value if @p I == 0, the death value if @p I == 1 or the dimension if @p I == 2. */ -template -struct tuple_element > { - static_assert(I < 3, "Value mismatch at argument 1 in template parameter list. Maximal possible value is 2."); - - using type = typename conditional ::type; -}; - -template -constexpr auto& get(Gudhi::persistence_matrix::Persistence_interval& i) noexcept { - return Gudhi::persistence_matrix::get(i); -} - -template -constexpr const auto& get(const Gudhi::persistence_matrix::Persistence_interval& i) noexcept { - return Gudhi::persistence_matrix::get(i); -} - -template -constexpr auto&& get(Gudhi::persistence_matrix::Persistence_interval&& i) noexcept { - return Gudhi::persistence_matrix::get(move(i)); -} - template constexpr const auto&& get(const Gudhi::persistence_matrix::Persistence_interval&& i) noexcept { - return Gudhi::persistence_matrix::get(move(i)); + return std::move(i).template get(); } } // namespace std