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