diff mbox series

[1/2] libstdc++: Move down definitions of ranges::cbegin/cend/cetc

Message ID 20230414040042.1498825-1-ppalka@redhat.com
State New
Headers show
Series [1/2] libstdc++: Move down definitions of ranges::cbegin/cend/cetc | expand

Commit Message

Patrick Palka April 14, 2023, 4 a.m. UTC
This moves down the definitions of the const range access CPOs to after
the definition of input_range in preparation for implementing P2287R4
which redefines these CPOs in a way that indirectly uses input_range.

tested on x86_64-pc-linux-gnu, does this look OK for trunk?

libstdc++-v3/ChangeLog:

	* include/bits/ranges_base.h (__cust_access::__as_const)
	(__cust_access::_CBegin, __cust::cbegin)
	(__cust_access::_CEnd, __cust::cend)
	(__cust_access::_CRBegin, __cust::crbegin)
	(__cust_access::_CREnd, __cust::crend)
	(__cust_access::_CData, __cust::cdata): Move down definitions to
	shortly after the definition of input_range.
---
 libstdc++-v3/include/bits/ranges_base.h | 174 +++++++++++++-----------
 1 file changed, 91 insertions(+), 83 deletions(-)

Comments

Jonathan Wakely April 14, 2023, 9:49 a.m. UTC | #1
On Fri, 14 Apr 2023 at 05:02, Patrick Palka via Libstdc++
<libstdc++@gcc.gnu.org> wrote:
>
> This moves down the definitions of the const range access CPOs to after
> the definition of input_range in preparation for implementing P2287R4
> which redefines these CPOs in a way that indirectly uses input_range.
>
> tested on x86_64-pc-linux-gnu, does this look OK for trunk?

OK


>
> libstdc++-v3/ChangeLog:
>
>         * include/bits/ranges_base.h (__cust_access::__as_const)
>         (__cust_access::_CBegin, __cust::cbegin)
>         (__cust_access::_CEnd, __cust::cend)
>         (__cust_access::_CRBegin, __cust::crbegin)
>         (__cust_access::_CREnd, __cust::crend)
>         (__cust_access::_CData, __cust::cdata): Move down definitions to
>         shortly after the definition of input_range.
> ---
>  libstdc++-v3/include/bits/ranges_base.h | 174 +++++++++++++-----------
>  1 file changed, 91 insertions(+), 83 deletions(-)
>
> diff --git a/libstdc++-v3/include/bits/ranges_base.h b/libstdc++-v3/include/bits/ranges_base.h
> index 86952b34096..c89cb3e976a 100644
> --- a/libstdc++-v3/include/bits/ranges_base.h
> +++ b/libstdc++-v3/include/bits/ranges_base.h
> @@ -177,45 +177,6 @@ namespace ranges
>         }
>      };
>
> -    // If _To is an lvalue-reference, return const _Tp&, otherwise const _Tp&&.
> -    template<typename _To, typename _Tp>
> -      constexpr decltype(auto)
> -      __as_const(_Tp& __t) noexcept
> -      {
> -       static_assert(std::is_same_v<_To&, _Tp&>);
> -
> -       if constexpr (is_lvalue_reference_v<_To>)
> -         return const_cast<const _Tp&>(__t);
> -       else
> -         return static_cast<const _Tp&&>(__t);
> -      }
> -
> -    struct _CBegin
> -    {
> -      template<typename _Tp>
> -       [[nodiscard]]
> -       constexpr auto
> -       operator()(_Tp&& __e) const
> -       noexcept(noexcept(_Begin{}(__cust_access::__as_const<_Tp>(__e))))
> -       requires requires { _Begin{}(__cust_access::__as_const<_Tp>(__e)); }
> -       {
> -         return _Begin{}(__cust_access::__as_const<_Tp>(__e));
> -       }
> -    };
> -
> -    struct _CEnd final
> -    {
> -      template<typename _Tp>
> -       [[nodiscard]]
> -       constexpr auto
> -       operator()(_Tp&& __e) const
> -       noexcept(noexcept(_End{}(__cust_access::__as_const<_Tp>(__e))))
> -       requires requires { _End{}(__cust_access::__as_const<_Tp>(__e)); }
> -       {
> -         return _End{}(__cust_access::__as_const<_Tp>(__e));
> -       }
> -    };
> -
>      template<typename _Tp>
>        concept __member_rbegin = requires(_Tp& __t)
>         {
> @@ -337,32 +298,6 @@ namespace ranges
>         }
>      };
>
> -    struct _CRBegin
> -    {
> -      template<typename _Tp>
> -       [[nodiscard]]
> -       constexpr auto
> -       operator()(_Tp&& __e) const
> -       noexcept(noexcept(_RBegin{}(__cust_access::__as_const<_Tp>(__e))))
> -       requires requires { _RBegin{}(__cust_access::__as_const<_Tp>(__e)); }
> -       {
> -         return _RBegin{}(__cust_access::__as_const<_Tp>(__e));
> -       }
> -    };
> -
> -    struct _CREnd
> -    {
> -      template<typename _Tp>
> -       [[nodiscard]]
> -       constexpr auto
> -       operator()(_Tp&& __e) const
> -       noexcept(noexcept(_REnd{}(__cust_access::__as_const<_Tp>(__e))))
> -       requires requires { _REnd{}(__cust_access::__as_const<_Tp>(__e)); }
> -       {
> -         return _REnd{}(__cust_access::__as_const<_Tp>(__e));
> -       }
> -    };
> -
>      template<typename _Tp>
>        concept __member_size = !disable_sized_range<remove_cvref_t<_Tp>>
>         && requires(_Tp& __t)
> @@ -547,36 +482,18 @@ namespace ranges
>         }
>      };
>
> -    struct _CData
> -    {
> -      template<typename _Tp>
> -       [[nodiscard]]
> -       constexpr auto
> -       operator()(_Tp&& __e) const
> -       noexcept(noexcept(_Data{}(__cust_access::__as_const<_Tp>(__e))))
> -       requires requires { _Data{}(__cust_access::__as_const<_Tp>(__e)); }
> -       {
> -         return _Data{}(__cust_access::__as_const<_Tp>(__e));
> -       }
> -    };
> -
>    } // namespace __cust_access
>
>    inline namespace __cust
>    {
>      inline constexpr __cust_access::_Begin begin{};
>      inline constexpr __cust_access::_End end{};
> -    inline constexpr __cust_access::_CBegin cbegin{};
> -    inline constexpr __cust_access::_CEnd cend{};
>      inline constexpr __cust_access::_RBegin rbegin{};
>      inline constexpr __cust_access::_REnd rend{};
> -    inline constexpr __cust_access::_CRBegin crbegin{};
> -    inline constexpr __cust_access::_CREnd crend{};
>      inline constexpr __cust_access::_Size size{};
>      inline constexpr __cust_access::_SSize ssize{};
>      inline constexpr __cust_access::_Empty empty{};
>      inline constexpr __cust_access::_Data data{};
> -    inline constexpr __cust_access::_CData cdata{};
>    }
>
>    /// [range.range] The range concept.
> @@ -690,6 +607,97 @@ namespace ranges
>      concept common_range
>        = range<_Tp> && same_as<iterator_t<_Tp>, sentinel_t<_Tp>>;
>
> +  namespace __cust_access
> +  {
> +    // If _To is an lvalue-reference, return const _Tp&, otherwise const _Tp&&.
> +    template<typename _To, typename _Tp>
> +      constexpr decltype(auto)
> +      __as_const(_Tp& __t) noexcept
> +      {
> +       static_assert(std::is_same_v<_To&, _Tp&>);
> +
> +       if constexpr (is_lvalue_reference_v<_To>)
> +         return const_cast<const _Tp&>(__t);
> +       else
> +         return static_cast<const _Tp&&>(__t);
> +      }
> +
> +    struct _CBegin
> +    {
> +      template<typename _Tp>
> +       [[nodiscard]]
> +       constexpr auto
> +       operator()(_Tp&& __e) const
> +       noexcept(noexcept(_Begin{}(__cust_access::__as_const<_Tp>(__e))))
> +       requires requires { _Begin{}(__cust_access::__as_const<_Tp>(__e)); }
> +       {
> +         return _Begin{}(__cust_access::__as_const<_Tp>(__e));
> +       }
> +    };
> +
> +    struct _CEnd final
> +    {
> +      template<typename _Tp>
> +       [[nodiscard]]
> +       constexpr auto
> +       operator()(_Tp&& __e) const
> +       noexcept(noexcept(_End{}(__cust_access::__as_const<_Tp>(__e))))
> +       requires requires { _End{}(__cust_access::__as_const<_Tp>(__e)); }
> +       {
> +         return _End{}(__cust_access::__as_const<_Tp>(__e));
> +       }
> +    };
> +
> +    struct _CRBegin
> +    {
> +      template<typename _Tp>
> +       [[nodiscard]]
> +       constexpr auto
> +       operator()(_Tp&& __e) const
> +       noexcept(noexcept(_RBegin{}(__cust_access::__as_const<_Tp>(__e))))
> +       requires requires { _RBegin{}(__cust_access::__as_const<_Tp>(__e)); }
> +       {
> +         return _RBegin{}(__cust_access::__as_const<_Tp>(__e));
> +       }
> +    };
> +
> +    struct _CREnd
> +    {
> +      template<typename _Tp>
> +       [[nodiscard]]
> +       constexpr auto
> +       operator()(_Tp&& __e) const
> +       noexcept(noexcept(_REnd{}(__cust_access::__as_const<_Tp>(__e))))
> +       requires requires { _REnd{}(__cust_access::__as_const<_Tp>(__e)); }
> +       {
> +         return _REnd{}(__cust_access::__as_const<_Tp>(__e));
> +       }
> +    };
> +
> +    struct _CData
> +    {
> +      template<typename _Tp>
> +       [[nodiscard]]
> +       constexpr auto
> +       operator()(_Tp&& __e) const
> +       noexcept(noexcept(_Data{}(__cust_access::__as_const<_Tp>(__e))))
> +       requires requires { _Data{}(__cust_access::__as_const<_Tp>(__e)); }
> +       {
> +         return _Data{}(__cust_access::__as_const<_Tp>(__e));
> +       }
> +    };
> +
> +  } // namespace __cust_access
> +
> +  inline namespace __cust
> +  {
> +    inline constexpr __cust_access::_CBegin cbegin{};
> +    inline constexpr __cust_access::_CEnd cend{};
> +    inline constexpr __cust_access::_CRBegin crbegin{};
> +    inline constexpr __cust_access::_CREnd crend{};
> +    inline constexpr __cust_access::_CData cdata{};
> +  }
> +
>    namespace __detail
>    {
>      template<typename _Tp>
> --
> 2.40.0.335.g9857273be0
>
diff mbox series

Patch

diff --git a/libstdc++-v3/include/bits/ranges_base.h b/libstdc++-v3/include/bits/ranges_base.h
index 86952b34096..c89cb3e976a 100644
--- a/libstdc++-v3/include/bits/ranges_base.h
+++ b/libstdc++-v3/include/bits/ranges_base.h
@@ -177,45 +177,6 @@  namespace ranges
 	}
     };
 
-    // If _To is an lvalue-reference, return const _Tp&, otherwise const _Tp&&.
-    template<typename _To, typename _Tp>
-      constexpr decltype(auto)
-      __as_const(_Tp& __t) noexcept
-      {
-	static_assert(std::is_same_v<_To&, _Tp&>);
-
-	if constexpr (is_lvalue_reference_v<_To>)
-	  return const_cast<const _Tp&>(__t);
-	else
-	  return static_cast<const _Tp&&>(__t);
-      }
-
-    struct _CBegin
-    {
-      template<typename _Tp>
-	[[nodiscard]]
-	constexpr auto
-	operator()(_Tp&& __e) const
-	noexcept(noexcept(_Begin{}(__cust_access::__as_const<_Tp>(__e))))
-	requires requires { _Begin{}(__cust_access::__as_const<_Tp>(__e)); }
-	{
-	  return _Begin{}(__cust_access::__as_const<_Tp>(__e));
-	}
-    };
-
-    struct _CEnd final
-    {
-      template<typename _Tp>
-	[[nodiscard]]
-	constexpr auto
-	operator()(_Tp&& __e) const
-	noexcept(noexcept(_End{}(__cust_access::__as_const<_Tp>(__e))))
-	requires requires { _End{}(__cust_access::__as_const<_Tp>(__e)); }
-	{
-	  return _End{}(__cust_access::__as_const<_Tp>(__e));
-	}
-    };
-
     template<typename _Tp>
       concept __member_rbegin = requires(_Tp& __t)
 	{
@@ -337,32 +298,6 @@  namespace ranges
 	}
     };
 
-    struct _CRBegin
-    {
-      template<typename _Tp>
-	[[nodiscard]]
-	constexpr auto
-	operator()(_Tp&& __e) const
-	noexcept(noexcept(_RBegin{}(__cust_access::__as_const<_Tp>(__e))))
-	requires requires { _RBegin{}(__cust_access::__as_const<_Tp>(__e)); }
-	{
-	  return _RBegin{}(__cust_access::__as_const<_Tp>(__e));
-	}
-    };
-
-    struct _CREnd
-    {
-      template<typename _Tp>
-	[[nodiscard]]
-	constexpr auto
-	operator()(_Tp&& __e) const
-	noexcept(noexcept(_REnd{}(__cust_access::__as_const<_Tp>(__e))))
-	requires requires { _REnd{}(__cust_access::__as_const<_Tp>(__e)); }
-	{
-	  return _REnd{}(__cust_access::__as_const<_Tp>(__e));
-	}
-    };
-
     template<typename _Tp>
       concept __member_size = !disable_sized_range<remove_cvref_t<_Tp>>
 	&& requires(_Tp& __t)
@@ -547,36 +482,18 @@  namespace ranges
 	}
     };
 
-    struct _CData
-    {
-      template<typename _Tp>
-	[[nodiscard]]
-	constexpr auto
-	operator()(_Tp&& __e) const
-	noexcept(noexcept(_Data{}(__cust_access::__as_const<_Tp>(__e))))
-	requires requires { _Data{}(__cust_access::__as_const<_Tp>(__e)); }
-	{
-	  return _Data{}(__cust_access::__as_const<_Tp>(__e));
-	}
-    };
-
   } // namespace __cust_access
 
   inline namespace __cust
   {
     inline constexpr __cust_access::_Begin begin{};
     inline constexpr __cust_access::_End end{};
-    inline constexpr __cust_access::_CBegin cbegin{};
-    inline constexpr __cust_access::_CEnd cend{};
     inline constexpr __cust_access::_RBegin rbegin{};
     inline constexpr __cust_access::_REnd rend{};
-    inline constexpr __cust_access::_CRBegin crbegin{};
-    inline constexpr __cust_access::_CREnd crend{};
     inline constexpr __cust_access::_Size size{};
     inline constexpr __cust_access::_SSize ssize{};
     inline constexpr __cust_access::_Empty empty{};
     inline constexpr __cust_access::_Data data{};
-    inline constexpr __cust_access::_CData cdata{};
   }
 
   /// [range.range] The range concept.
@@ -690,6 +607,97 @@  namespace ranges
     concept common_range
       = range<_Tp> && same_as<iterator_t<_Tp>, sentinel_t<_Tp>>;
 
+  namespace __cust_access
+  {
+    // If _To is an lvalue-reference, return const _Tp&, otherwise const _Tp&&.
+    template<typename _To, typename _Tp>
+      constexpr decltype(auto)
+      __as_const(_Tp& __t) noexcept
+      {
+	static_assert(std::is_same_v<_To&, _Tp&>);
+
+	if constexpr (is_lvalue_reference_v<_To>)
+	  return const_cast<const _Tp&>(__t);
+	else
+	  return static_cast<const _Tp&&>(__t);
+      }
+
+    struct _CBegin
+    {
+      template<typename _Tp>
+	[[nodiscard]]
+	constexpr auto
+	operator()(_Tp&& __e) const
+	noexcept(noexcept(_Begin{}(__cust_access::__as_const<_Tp>(__e))))
+	requires requires { _Begin{}(__cust_access::__as_const<_Tp>(__e)); }
+	{
+	  return _Begin{}(__cust_access::__as_const<_Tp>(__e));
+	}
+    };
+
+    struct _CEnd final
+    {
+      template<typename _Tp>
+	[[nodiscard]]
+	constexpr auto
+	operator()(_Tp&& __e) const
+	noexcept(noexcept(_End{}(__cust_access::__as_const<_Tp>(__e))))
+	requires requires { _End{}(__cust_access::__as_const<_Tp>(__e)); }
+	{
+	  return _End{}(__cust_access::__as_const<_Tp>(__e));
+	}
+    };
+
+    struct _CRBegin
+    {
+      template<typename _Tp>
+	[[nodiscard]]
+	constexpr auto
+	operator()(_Tp&& __e) const
+	noexcept(noexcept(_RBegin{}(__cust_access::__as_const<_Tp>(__e))))
+	requires requires { _RBegin{}(__cust_access::__as_const<_Tp>(__e)); }
+	{
+	  return _RBegin{}(__cust_access::__as_const<_Tp>(__e));
+	}
+    };
+
+    struct _CREnd
+    {
+      template<typename _Tp>
+	[[nodiscard]]
+	constexpr auto
+	operator()(_Tp&& __e) const
+	noexcept(noexcept(_REnd{}(__cust_access::__as_const<_Tp>(__e))))
+	requires requires { _REnd{}(__cust_access::__as_const<_Tp>(__e)); }
+	{
+	  return _REnd{}(__cust_access::__as_const<_Tp>(__e));
+	}
+    };
+
+    struct _CData
+    {
+      template<typename _Tp>
+	[[nodiscard]]
+	constexpr auto
+	operator()(_Tp&& __e) const
+	noexcept(noexcept(_Data{}(__cust_access::__as_const<_Tp>(__e))))
+	requires requires { _Data{}(__cust_access::__as_const<_Tp>(__e)); }
+	{
+	  return _Data{}(__cust_access::__as_const<_Tp>(__e));
+	}
+    };
+
+  } // namespace __cust_access
+
+  inline namespace __cust
+  {
+    inline constexpr __cust_access::_CBegin cbegin{};
+    inline constexpr __cust_access::_CEnd cend{};
+    inline constexpr __cust_access::_CRBegin crbegin{};
+    inline constexpr __cust_access::_CREnd crend{};
+    inline constexpr __cust_access::_CData cdata{};
+  }
+
   namespace __detail
   {
     template<typename _Tp>