]> git.proxmox.com Git - ceph.git/blobdiff - ceph/src/boost/boost/asio/execution/mapping.hpp
update ceph source to reef 18.1.2
[ceph.git] / ceph / src / boost / boost / asio / execution / mapping.hpp
index 3b9fc1c9c92765fb20a37206861f2f84ac495aa4..b46ddfab739d8a36b42642faebba19dff484b8c0 100644 (file)
@@ -2,7 +2,7 @@
 // execution/mapping.hpp
 // ~~~~~~~~~~~~~~~~~~~~~
 //
-// Copyright (c) 2003-2020 Christopher M. Kohlhoff (chris at kohlhoff dot com)
+// Copyright (c) 2003-2022 Christopher M. Kohlhoff (chris at kohlhoff dot com)
 //
 // Distributed under the Boost Software License, Version 1.0. (See accompanying
 // file LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt)
@@ -195,8 +195,18 @@ struct mapping_t
 #if defined(BOOST_ASIO_HAS_VARIABLE_TEMPLATES)
   template <typename T>
   BOOST_ASIO_STATIC_CONSTEXPR(bool,
-    is_applicable_property_v = is_executor<T>::value
-      || is_sender<T>::value || is_scheduler<T>::value);
+    is_applicable_property_v = (
+      is_executor<T>::value
+        || conditional<
+            is_executor<T>::value,
+            false_type,
+            is_sender<T>
+          >::type::value
+        || conditional<
+            is_executor<T>::value,
+            false_type,
+            is_scheduler<T>
+          >::type::value));
 #endif // defined(BOOST_ASIO_HAS_VARIABLE_TEMPLATES)
 
   BOOST_ASIO_STATIC_CONSTEXPR(bool, is_requirable = false);
@@ -227,16 +237,74 @@ struct mapping_t
   {
   }
 
+  template <typename T>
+  struct proxy
+  {
+#if defined(BOOST_ASIO_HAS_DEDUCED_QUERY_MEMBER_TRAIT)
+    struct type
+    {
+      template <typename P>
+      auto query(BOOST_ASIO_MOVE_ARG(P) p) const
+        noexcept(
+          noexcept(
+            declval<typename conditional<true, T, P>::type>().query(
+              BOOST_ASIO_MOVE_CAST(P)(p))
+          )
+        )
+        -> decltype(
+          declval<typename conditional<true, T, P>::type>().query(
+            BOOST_ASIO_MOVE_CAST(P)(p))
+        );
+    };
+#else // defined(BOOST_ASIO_HAS_DEDUCED_QUERY_MEMBER_TRAIT)
+    typedef T type;
+#endif // defined(BOOST_ASIO_HAS_DEDUCED_QUERY_MEMBER_TRAIT)
+  };
+
+  template <typename T>
+  struct static_proxy
+  {
+#if defined(BOOST_ASIO_HAS_DEDUCED_QUERY_STATIC_CONSTEXPR_MEMBER_TRAIT)
+    struct type
+    {
+      template <typename P>
+      static constexpr auto query(BOOST_ASIO_MOVE_ARG(P) p)
+        noexcept(
+          noexcept(
+            conditional<true, T, P>::type::query(BOOST_ASIO_MOVE_CAST(P)(p))
+          )
+        )
+        -> decltype(
+          conditional<true, T, P>::type::query(BOOST_ASIO_MOVE_CAST(P)(p))
+        )
+      {
+        return T::query(BOOST_ASIO_MOVE_CAST(P)(p));
+      }
+    };
+#else // defined(BOOST_ASIO_HAS_DEDUCED_QUERY_STATIC_CONSTEXPR_MEMBER_TRAIT)
+    typedef T type;
+#endif // defined(BOOST_ASIO_HAS_DEDUCED_QUERY_STATIC_CONSTEXPR_MEMBER_TRAIT)
+  };
+
+  template <typename T>
+  struct query_member :
+    traits::query_member<typename proxy<T>::type, mapping_t> {};
+
+  template <typename T>
+  struct query_static_constexpr_member :
+    traits::query_static_constexpr_member<
+      typename static_proxy<T>::type, mapping_t> {};
+
 #if defined(BOOST_ASIO_HAS_DEDUCED_STATIC_QUERY_TRAIT) \
   && defined(BOOST_ASIO_HAS_SFINAE_VARIABLE_TEMPLATES)
   template <typename T>
   static BOOST_ASIO_CONSTEXPR
-  typename traits::query_static_constexpr_member<T, mapping_t>::result_type
+  typename query_static_constexpr_member<T>::result_type
   static_query()
     BOOST_ASIO_NOEXCEPT_IF((
-      traits::query_static_constexpr_member<T, mapping_t>::is_noexcept))
+      query_static_constexpr_member<T>::is_noexcept))
   {
-    return traits::query_static_constexpr_member<T, mapping_t>::value();
+    return query_static_constexpr_member<T>::value();
   }
 
   template <typename T>
@@ -244,9 +312,13 @@ struct mapping_t
   typename traits::static_query<T, thread_t>::result_type
   static_query(
       typename enable_if<
-        !traits::query_static_constexpr_member<T, mapping_t>::is_valid
-          && !traits::query_member<T, mapping_t>::is_valid
-          && traits::static_query<T, thread_t>::is_valid
+        !query_static_constexpr_member<T>::is_valid
+      >::type* = 0,
+      typename enable_if<
+        !query_member<T>::is_valid
+      >::type* = 0,
+      typename enable_if<
+        traits::static_query<T, thread_t>::is_valid
       >::type* = 0) BOOST_ASIO_NOEXCEPT
   {
     return traits::static_query<T, thread_t>::value();
@@ -257,10 +329,16 @@ struct mapping_t
   typename traits::static_query<T, new_thread_t>::result_type
   static_query(
       typename enable_if<
-        !traits::query_static_constexpr_member<T, mapping_t>::is_valid
-          && !traits::query_member<T, mapping_t>::is_valid
-          && !traits::static_query<T, thread_t>::is_valid
-          && traits::static_query<T, new_thread_t>::is_valid
+        !query_static_constexpr_member<T>::is_valid
+      >::type* = 0,
+      typename enable_if<
+        !query_member<T>::is_valid
+      >::type* = 0,
+      typename enable_if<
+        !traits::static_query<T, thread_t>::is_valid
+      >::type* = 0,
+      typename enable_if<
+        traits::static_query<T, new_thread_t>::is_valid
       >::type* = 0) BOOST_ASIO_NOEXCEPT
   {
     return traits::static_query<T, new_thread_t>::value();
@@ -271,11 +349,19 @@ struct mapping_t
   typename traits::static_query<T, other_t>::result_type
   static_query(
       typename enable_if<
-        !traits::query_static_constexpr_member<T, mapping_t>::is_valid
-          && !traits::query_member<T, mapping_t>::is_valid
-          && !traits::static_query<T, thread_t>::is_valid
-          && !traits::static_query<T, new_thread_t>::is_valid
-          && traits::static_query<T, other_t>::is_valid
+        !query_static_constexpr_member<T>::is_valid
+      >::type* = 0,
+      typename enable_if<
+        !query_member<T>::is_valid
+      >::type* = 0,
+      typename enable_if<
+        !traits::static_query<T, thread_t>::is_valid
+      >::type* = 0,
+      typename enable_if<
+        !traits::static_query<T, new_thread_t>::is_valid
+      >::type* = 0,
+      typename enable_if<
+        traits::static_query<T, other_t>::is_valid
       >::type* = 0) BOOST_ASIO_NOEXCEPT
   {
     return traits::static_query<T, other_t>::value();
@@ -328,7 +414,9 @@ struct mapping_t
       const Executor& ex, convertible_from_mapping_t,
       typename enable_if<
         !can_query<const Executor&, thread_t>::value
-          && can_query<const Executor&, new_thread_t>::value
+      >::type* = 0,
+      typename enable_if<
+        can_query<const Executor&, new_thread_t>::value
       >::type* = 0)
 #if !defined(__clang__) // Clang crashes if noexcept is used here.
 #if defined(BOOST_ASIO_MSVC) // Visual C++ wants the type to be qualified.
@@ -348,8 +436,12 @@ struct mapping_t
       const Executor& ex, convertible_from_mapping_t,
       typename enable_if<
         !can_query<const Executor&, thread_t>::value
-          && !can_query<const Executor&, new_thread_t>::value
-          && can_query<const Executor&, other_t>::value
+      >::type* = 0,
+      typename enable_if<
+        !can_query<const Executor&, new_thread_t>::value
+      >::type* = 0,
+      typename enable_if<
+        can_query<const Executor&, other_t>::value
       >::type* = 0)
 #if !defined(__clang__) // Clang crashes if noexcept is used here.
 #if defined(BOOST_ASIO_MSVC) // Visual C++ wants the type to be qualified.
@@ -405,8 +497,18 @@ struct thread_t
 #if defined(BOOST_ASIO_HAS_VARIABLE_TEMPLATES)
   template <typename T>
   BOOST_ASIO_STATIC_CONSTEXPR(bool,
-    is_applicable_property_v = is_executor<T>::value
-      || is_sender<T>::value || is_scheduler<T>::value);
+    is_applicable_property_v = (
+      is_executor<T>::value
+        || conditional<
+            is_executor<T>::value,
+            false_type,
+            is_sender<T>
+          >::type::value
+        || conditional<
+            is_executor<T>::value,
+            false_type,
+            is_scheduler<T>
+          >::type::value));
 #endif // defined(BOOST_ASIO_HAS_VARIABLE_TEMPLATES)
 
   BOOST_ASIO_STATIC_CONSTEXPR(bool, is_requirable = true);
@@ -417,26 +519,44 @@ struct thread_t
   {
   }
 
+  template <typename T>
+  struct query_member :
+    traits::query_member<
+      typename mapping_t<I>::template proxy<T>::type, thread_t> {};
+
+  template <typename T>
+  struct query_static_constexpr_member :
+    traits::query_static_constexpr_member<
+      typename mapping_t<I>::template static_proxy<T>::type, thread_t> {};
+
 #if defined(BOOST_ASIO_HAS_DEDUCED_STATIC_QUERY_TRAIT) \
   && defined(BOOST_ASIO_HAS_SFINAE_VARIABLE_TEMPLATES)
   template <typename T>
   static BOOST_ASIO_CONSTEXPR
-  typename traits::query_static_constexpr_member<T, thread_t>::result_type
+  typename query_static_constexpr_member<T>::result_type
   static_query()
     BOOST_ASIO_NOEXCEPT_IF((
-      traits::query_static_constexpr_member<T, thread_t>::is_noexcept))
+      query_static_constexpr_member<T>::is_noexcept))
   {
-    return traits::query_static_constexpr_member<T, thread_t>::value();
+    return query_static_constexpr_member<T>::value();
   }
 
   template <typename T>
   static BOOST_ASIO_CONSTEXPR thread_t static_query(
       typename enable_if<
-        !traits::query_static_constexpr_member<T, thread_t>::is_valid
-          && !traits::query_member<T, thread_t>::is_valid
-          && !traits::query_free<T, thread_t>::is_valid
-          && !can_query<T, new_thread_t<I> >::value
-          && !can_query<T, other_t<I> >::value
+        !query_static_constexpr_member<T>::is_valid
+      >::type* = 0,
+      typename enable_if<
+        !query_member<T>::is_valid
+      >::type* = 0,
+      typename enable_if<
+        !traits::query_free<T, thread_t>::is_valid
+      >::type* = 0,
+      typename enable_if<
+        !can_query<T, new_thread_t<I> >::value
+      >::type* = 0,
+      typename enable_if<
+        !can_query<T, other_t<I> >::value
       >::type* = 0) BOOST_ASIO_NOEXCEPT
   {
     return thread_t();
@@ -479,8 +599,18 @@ struct new_thread_t
 #if defined(BOOST_ASIO_HAS_VARIABLE_TEMPLATES)
   template <typename T>
   BOOST_ASIO_STATIC_CONSTEXPR(bool,
-    is_applicable_property_v = is_executor<T>::value
-      || is_sender<T>::value || is_scheduler<T>::value);
+    is_applicable_property_v = (
+      is_executor<T>::value
+        || conditional<
+            is_executor<T>::value,
+            false_type,
+            is_sender<T>
+          >::type::value
+        || conditional<
+            is_executor<T>::value,
+            false_type,
+            is_scheduler<T>
+          >::type::value));
 #endif // defined(BOOST_ASIO_HAS_VARIABLE_TEMPLATES)
 
   BOOST_ASIO_STATIC_CONSTEXPR(bool, is_requirable = true);
@@ -491,16 +621,26 @@ struct new_thread_t
   {
   }
 
+  template <typename T>
+  struct query_member :
+    traits::query_member<
+      typename mapping_t<I>::template proxy<T>::type, new_thread_t> {};
+
+  template <typename T>
+  struct query_static_constexpr_member :
+    traits::query_static_constexpr_member<
+      typename mapping_t<I>::template static_proxy<T>::type, new_thread_t> {};
+
 #if defined(BOOST_ASIO_HAS_DEDUCED_STATIC_QUERY_TRAIT) \
   && defined(BOOST_ASIO_HAS_SFINAE_VARIABLE_TEMPLATES)
   template <typename T>
   static BOOST_ASIO_CONSTEXPR
-  typename traits::query_static_constexpr_member<T, new_thread_t>::result_type
+  typename query_static_constexpr_member<T>::result_type
   static_query()
     BOOST_ASIO_NOEXCEPT_IF((
-      traits::query_static_constexpr_member<T, new_thread_t>::is_noexcept))
+      query_static_constexpr_member<T>::is_noexcept))
   {
-    return traits::query_static_constexpr_member<T, new_thread_t>::value();
+    return query_static_constexpr_member<T>::value();
   }
 
   template <typename E, typename T = decltype(new_thread_t::static_query<E>())>
@@ -540,8 +680,18 @@ struct other_t
 #if defined(BOOST_ASIO_HAS_VARIABLE_TEMPLATES)
   template <typename T>
   BOOST_ASIO_STATIC_CONSTEXPR(bool,
-    is_applicable_property_v = is_executor<T>::value
-      || is_sender<T>::value || is_scheduler<T>::value);
+    is_applicable_property_v = (
+      is_executor<T>::value
+        || conditional<
+            is_executor<T>::value,
+            false_type,
+            is_sender<T>
+          >::type::value
+        || conditional<
+            is_executor<T>::value,
+            false_type,
+            is_scheduler<T>
+          >::type::value));
 #endif // defined(BOOST_ASIO_HAS_VARIABLE_TEMPLATES)
 
   BOOST_ASIO_STATIC_CONSTEXPR(bool, is_requirable = true);
@@ -552,16 +702,26 @@ struct other_t
   {
   }
 
+  template <typename T>
+  struct query_member :
+    traits::query_member<
+      typename mapping_t<I>::template proxy<T>::type, other_t> {};
+
+  template <typename T>
+  struct query_static_constexpr_member :
+    traits::query_static_constexpr_member<
+      typename mapping_t<I>::template static_proxy<T>::type, other_t> {};
+
 #if defined(BOOST_ASIO_HAS_DEDUCED_STATIC_QUERY_TRAIT) \
   && defined(BOOST_ASIO_HAS_SFINAE_VARIABLE_TEMPLATES)
   template <typename T>
   static BOOST_ASIO_CONSTEXPR
-  typename traits::query_static_constexpr_member<T, other_t>::result_type
+  typename query_static_constexpr_member<T>::result_type
   static_query()
     BOOST_ASIO_NOEXCEPT_IF((
-      traits::query_static_constexpr_member<T, other_t>::is_noexcept))
+      query_static_constexpr_member<T>::is_noexcept))
   {
-    return traits::query_static_constexpr_member<T, other_t>::value();
+    return query_static_constexpr_member<T>::value();
   }
 
   template <typename E, typename T = decltype(other_t::static_query<E>())>
@@ -614,8 +774,16 @@ template <typename T>
 struct is_applicable_property<T, execution::mapping_t>
   : integral_constant<bool,
       execution::is_executor<T>::value
-        || execution::is_sender<T>::value
-        || execution::is_scheduler<T>::value>
+        || conditional<
+            execution::is_executor<T>::value,
+            false_type,
+            execution::is_sender<T>
+          >::type::value
+        || conditional<
+            execution::is_executor<T>::value,
+            false_type,
+            execution::is_scheduler<T>
+          >::type::value>
 {
 };
 
@@ -623,8 +791,16 @@ template <typename T>
 struct is_applicable_property<T, execution::mapping_t::thread_t>
   : integral_constant<bool,
       execution::is_executor<T>::value
-        || execution::is_sender<T>::value
-        || execution::is_scheduler<T>::value>
+        || conditional<
+            execution::is_executor<T>::value,
+            false_type,
+            execution::is_sender<T>
+          >::type::value
+        || conditional<
+            execution::is_executor<T>::value,
+            false_type,
+            execution::is_scheduler<T>
+          >::type::value>
 {
 };
 
@@ -632,8 +808,16 @@ template <typename T>
 struct is_applicable_property<T, execution::mapping_t::new_thread_t>
   : integral_constant<bool,
       execution::is_executor<T>::value
-        || execution::is_sender<T>::value
-        || execution::is_scheduler<T>::value>
+        || conditional<
+            execution::is_executor<T>::value,
+            false_type,
+            execution::is_sender<T>
+          >::type::value
+        || conditional<
+            execution::is_executor<T>::value,
+            false_type,
+            execution::is_scheduler<T>
+          >::type::value>
 {
 };
 
@@ -641,8 +825,16 @@ template <typename T>
 struct is_applicable_property<T, execution::mapping_t::other_t>
   : integral_constant<bool,
       execution::is_executor<T>::value
-        || execution::is_sender<T>::value
-        || execution::is_scheduler<T>::value>
+        || conditional<
+            execution::is_executor<T>::value,
+            false_type,
+            execution::is_sender<T>
+          >::type::value
+        || conditional<
+            execution::is_executor<T>::value,
+            false_type,
+            execution::is_scheduler<T>
+          >::type::value>
 {
 };
 
@@ -702,28 +894,30 @@ struct query_free_default<T, execution::mapping_t,
 template <typename T>
 struct static_query<T, execution::mapping_t,
   typename enable_if<
-    traits::query_static_constexpr_member<T,
-      execution::mapping_t>::is_valid
+    execution::detail::mapping_t<0>::
+      query_static_constexpr_member<T>::is_valid
   >::type>
 {
   BOOST_ASIO_STATIC_CONSTEXPR(bool, is_valid = true);
   BOOST_ASIO_STATIC_CONSTEXPR(bool, is_noexcept = true);
 
-  typedef typename traits::query_static_constexpr_member<T,
-    execution::mapping_t>::result_type result_type;
+  typedef typename execution::detail::mapping_t<0>::
+    query_static_constexpr_member<T>::result_type result_type;
 
   static BOOST_ASIO_CONSTEXPR result_type value()
   {
-    return traits::query_static_constexpr_member<T,
-      execution::mapping_t>::value();
+    return execution::detail::mapping_t<0>::
+      query_static_constexpr_member<T>::value();
   }
 };
 
 template <typename T>
 struct static_query<T, execution::mapping_t,
   typename enable_if<
-    !traits::query_static_constexpr_member<T, execution::mapping_t>::is_valid
-      && !traits::query_member<T, execution::mapping_t>::is_valid
+    !execution::detail::mapping_t<0>::
+        query_static_constexpr_member<T>::is_valid
+      && !execution::detail::mapping_t<0>::
+        query_member<T>::is_valid
       && traits::static_query<T, execution::mapping_t::thread_t>::is_valid
   >::type>
 {
@@ -742,8 +936,10 @@ struct static_query<T, execution::mapping_t,
 template <typename T>
 struct static_query<T, execution::mapping_t,
   typename enable_if<
-    !traits::query_static_constexpr_member<T, execution::mapping_t>::is_valid
-      && !traits::query_member<T, execution::mapping_t>::is_valid
+    !execution::detail::mapping_t<0>::
+        query_static_constexpr_member<T>::is_valid
+      && !execution::detail::mapping_t<0>::
+        query_member<T>::is_valid
       && !traits::static_query<T, execution::mapping_t::thread_t>::is_valid
       && traits::static_query<T, execution::mapping_t::new_thread_t>::is_valid
   >::type>
@@ -763,8 +959,10 @@ struct static_query<T, execution::mapping_t,
 template <typename T>
 struct static_query<T, execution::mapping_t,
   typename enable_if<
-    !traits::query_static_constexpr_member<T, execution::mapping_t>::is_valid
-      && !traits::query_member<T, execution::mapping_t>::is_valid
+    !execution::detail::mapping_t<0>::
+        query_static_constexpr_member<T>::is_valid
+      && !execution::detail::mapping_t<0>::
+        query_member<T>::is_valid
       && !traits::static_query<T, execution::mapping_t::thread_t>::is_valid
       && !traits::static_query<T, execution::mapping_t::new_thread_t>::is_valid
       && traits::static_query<T, execution::mapping_t::other_t>::is_valid
@@ -785,29 +983,30 @@ struct static_query<T, execution::mapping_t,
 template <typename T>
 struct static_query<T, execution::mapping_t::thread_t,
   typename enable_if<
-    traits::query_static_constexpr_member<T,
-      execution::mapping_t::thread_t>::is_valid
+    execution::detail::mapping::thread_t<0>::
+      query_static_constexpr_member<T>::is_valid
   >::type>
 {
   BOOST_ASIO_STATIC_CONSTEXPR(bool, is_valid = true);
   BOOST_ASIO_STATIC_CONSTEXPR(bool, is_noexcept = true);
 
-  typedef typename traits::query_static_constexpr_member<T,
-    execution::mapping_t::thread_t>::result_type result_type;
+  typedef typename execution::detail::mapping::thread_t<0>::
+    query_static_constexpr_member<T>::result_type result_type;
 
   static BOOST_ASIO_CONSTEXPR result_type value()
   {
-    return traits::query_static_constexpr_member<T,
-      execution::mapping_t::thread_t>::value();
+    return execution::detail::mapping::thread_t<0>::
+      query_static_constexpr_member<T>::value();
   }
 };
 
 template <typename T>
 struct static_query<T, execution::mapping_t::thread_t,
   typename enable_if<
-    !traits::query_static_constexpr_member<T,
-      execution::mapping_t::thread_t>::is_valid
-      && !traits::query_member<T, execution::mapping_t::thread_t>::is_valid
+    !execution::detail::mapping::thread_t<0>::
+        query_static_constexpr_member<T>::is_valid
+      && !execution::detail::mapping::thread_t<0>::
+        query_member<T>::is_valid
       && !traits::query_free<T, execution::mapping_t::thread_t>::is_valid
       && !can_query<T, execution::mapping_t::new_thread_t>::value
       && !can_query<T, execution::mapping_t::other_t>::value
@@ -827,40 +1026,40 @@ struct static_query<T, execution::mapping_t::thread_t,
 template <typename T>
 struct static_query<T, execution::mapping_t::new_thread_t,
   typename enable_if<
-    traits::query_static_constexpr_member<T,
-      execution::mapping_t::new_thread_t>::is_valid
+    execution::detail::mapping::new_thread_t<0>::
+      query_static_constexpr_member<T>::is_valid
   >::type>
 {
   BOOST_ASIO_STATIC_CONSTEXPR(bool, is_valid = true);
   BOOST_ASIO_STATIC_CONSTEXPR(bool, is_noexcept = true);
 
-  typedef typename traits::query_static_constexpr_member<T,
-    execution::mapping_t::new_thread_t>::result_type result_type;
+  typedef typename execution::detail::mapping::new_thread_t<0>::
+    query_static_constexpr_member<T>::result_type result_type;
 
   static BOOST_ASIO_CONSTEXPR result_type value()
   {
-    return traits::query_static_constexpr_member<T,
-      execution::mapping_t::new_thread_t>::value();
+    return execution::detail::mapping::new_thread_t<0>::
+      query_static_constexpr_member<T>::value();
   }
 };
 
 template <typename T>
 struct static_query<T, execution::mapping_t::other_t,
   typename enable_if<
-    traits::query_static_constexpr_member<T,
-      execution::mapping_t::other_t>::is_valid
+    execution::detail::mapping::other_t<0>::
+      query_static_constexpr_member<T>::is_valid
   >::type>
 {
   BOOST_ASIO_STATIC_CONSTEXPR(bool, is_valid = true);
   BOOST_ASIO_STATIC_CONSTEXPR(bool, is_noexcept = true);
 
-  typedef typename traits::query_static_constexpr_member<T,
-    execution::mapping_t::other_t>::result_type result_type;
+  typedef typename execution::detail::mapping::other_t<0>::
+    query_static_constexpr_member<T>::result_type result_type;
 
   static BOOST_ASIO_CONSTEXPR result_type value()
   {
-    return traits::query_static_constexpr_member<T,
-      execution::mapping_t::other_t>::value();
+    return execution::detail::mapping::other_t<0>::
+      query_static_constexpr_member<T>::value();
   }
 };