[PATCH] Define [range.cmp] comparisons for C++20
Jonathan Wakely
jwakely.gcc@gmail.com
Wed Oct 23 08:02:00 GMT 2019
On Wed, 23 Oct 2019 at 00:33, Tam S. B. <cpplearner@outlook.com> wrote:
>
> > commit b948d3f92d7bbe4d53237cb20ff40a15fa123988
> > Author: Jonathan Wakely <jwakely@redhat.com>
> > Date: Thu Oct 17 15:20:38 2019 +0100
> >
> > Define [range.cmp] comparisons for C++20
> >
> > Define std::identity, std::ranges::equal_to, std::ranges::not_equal_to,
> > std::ranges::greater, std::ranges::less, std::ranges::greater_equal and
> > std::ranges::less_equal.
> >
> > * include/Makefile.am: Add new header.
> > * include/Makefile.in: Regenerate.
> > * include/bits/range_cmp.h: New header for C++20 function objects.
> > * include/std/functional: Include new header.
> > * testsuite/20_util/function_objects/identity/1.cc: New test.
> > * testsuite/20_util/function_objects/range.cmp/equal_to.cc: New test.
> > * testsuite/20_util/function_objects/range.cmp/greater.cc: New test.
> > * testsuite/20_util/function_objects/range.cmp/greater_equal.cc: New
> > test.
> > * testsuite/20_util/function_objects/range.cmp/less.cc: New test.
> > * testsuite/20_util/function_objects/range.cmp/less_equal.cc: New test.
> > * testsuite/20_util/function_objects/range.cmp/not_equal_to.cc: New
> > test.
> >
> > diff --git a/libstdc++-v3/include/Makefile.am b/libstdc++-v3/include/Makefile.am
> > index 35ee3cfcd34..9ff12f10fb1 100644
> > --- a/libstdc++-v3/include/Makefile.am
> > +++ b/libstdc++-v3/include/Makefile.am
> > @@ -152,6 +152,7 @@ bits_headers = \
> > ${bits_srcdir}/random.h \
> > ${bits_srcdir}/random.tcc \
> > ${bits_srcdir}/range_access.h \
> > + ${bits_srcdir}/range_cmp.h \
> > ${bits_srcdir}/refwrap.h \
> > ${bits_srcdir}/regex.h \
> > ${bits_srcdir}/regex.tcc \
> > diff --git a/libstdc++-v3/include/bits/range_cmp.h b/libstdc++-v3/include/bits/range_cmp.h
> > new file mode 100644
> > index 00000000000..3e5bb8847ab
> > --- /dev/null
> > +++ b/libstdc++-v3/include/bits/range_cmp.h
> > @@ -0,0 +1,179 @@
> > +// Concept-constrained comparison implementations -*- C++ -*-
> > +
> > +// Copyright (C) 2019 Free Software Foundation, Inc.
> > +//
> > +// This file is part of the GNU ISO C++ Library. This library is free
> > +// software; you can redistribute it and/or modify it under the
> > +// terms of the GNU General Public License as published by the
> > +// Free Software Foundation; either version 3, or (at your option)
> > +// any later version.
> > +
> > +// This library is distributed in the hope that it will be useful,
> > +// but WITHOUT ANY WARRANTY; without even the implied warranty of
> > +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
> > +// GNU General Public License for more details.
> > +
> > +// Under Section 7 of GPL version 3, you are granted additional
> > +// permissions described in the GCC Runtime Library Exception, version
> > +// 3.1, as published by the Free Software Foundation.
> > +
> > +// You should have received a copy of the GNU General Public License and
> > +// a copy of the GCC Runtime Library Exception along with this program;
> > +// see the files COPYING3 and COPYING.RUNTIME respectively. If not, see
> > +// <http://www.gnu.org/licenses/>.
> > +
> > +/** @file bits/ranges_function.h
>
> This does not match the actual filename. Seems like a typo?
Yes, I renamed the file and didn't fix the comment. It's already fixed
locally and will be committed with the next round of changes (probably
today).
> > + * This is an internal header file, included by other library headers.
> > + * Do not attempt to use it directly. @headername{functional}
> > + */
> > +
> > +#ifndef _RANGE_CMP_H
> > +#define _RANGE_CMP_H 1
> > +
> > +#if __cplusplus > 201703L
> > +# include <bits/move.h>
> > +# include <concepts>
> > +
> > +namespace std _GLIBCXX_VISIBILITY(default)
> > +{
> > +_GLIBCXX_BEGIN_NAMESPACE_VERSION
> > +
> > + struct __is_transparent; // not defined
> > +
> > + // Define std::identity here so that <iterator> and <ranges>
> > + // don't need to include <bits/stl_function.h> to get it.
> > +
> > + /// [func.identity] The identity function.
> > + struct identity
> > + {
> > + template<typename _Tp>
> > + constexpr _Tp&&
> > + operator()(_Tp&& __t) const noexcept
> > + { return std::forward<_Tp>(__t); }
> > +
> > + using is_transparent = __is_transparent;
> > + };
> > +
> > +namespace ranges
> > +{
> > + namespace __detail
> > + {
> > + // BUILTIN-PTR-CMP(T, ==, U)
> > + template<typename _Tp, typename _Up>
> > + concept __eq_builtin_ptr_cmp
> > + = convertible_to<_Tp, const volatile void*>
> > + && convertible_to<_Up, const volatile void*>
> > + && (! requires(_Tp&& __t, _Up&& __u)
>
> The use of concepts is causing `#include <functional>` to break on clang.
OK, thanks, I'll guard it with #if.
More information about the Gcc-patches
mailing list