Add an alternative implementation of mp_map_find for GCC 14+. Fixes #106.

This commit is contained in:
Peter Dimov
2025-05-08 15:50:59 +03:00
parent f8ee448fa5
commit 1a99027e8c

View File

@ -11,6 +11,14 @@
#include <boost/mp11/utility.hpp>
#include <boost/mp11/detail/config.hpp>
#if BOOST_MP11_WORKAROUND( BOOST_MP11_GCC, >= 140000 )
#include <boost/mp11/detail/mp_list.hpp>
#include <boost/mp11/detail/mp_append.hpp>
#include <boost/mp11/detail/mp_front.hpp>
#endif
#if BOOST_MP11_WORKAROUND( BOOST_MP11_MSVC, < 1930 )
// not exactly good practice, but...
@ -26,6 +34,30 @@ namespace boost
namespace mp11
{
#if BOOST_MP11_WORKAROUND( BOOST_MP11_GCC, >= 140000 )
// https://gcc.gnu.org/bugzilla/show_bug.cgi?id=120161
namespace detail
{
template<class M, class K> struct mp_map_find_impl;
template<template<class...> class M, class... T, class K> struct mp_map_find_impl<M<T...>, K>
{
template<class U> using _f = mp_if<std::is_same<mp_front<U>, K>, mp_list<U>, mp_list<>>;
using _l = mp_append<_f<T>..., mp_list<void>>;
using type = mp_front<_l>;
};
} // namespace detail
template<class M, class K> using mp_map_find = typename detail::mp_map_find_impl<M, K>::type;
#else
// mp_map_find
namespace detail
{
@ -81,6 +113,8 @@ template<template<class...> class M, class... T, class K> struct mp_map_find_imp
template<class M, class K> using mp_map_find = typename detail::mp_map_find_impl<M, K>::type;
#endif
} // namespace mp11
} // namespace boost