From 12536431ade794ab9d16ee3230a6880c1d277552 Mon Sep 17 00:00:00 2001 From: Edward Smith-Rowland <3dw4rd@verizon.net> Date: Fri, 15 Nov 2019 21:26:25 +0000 Subject: [PATCH] Implement the default_searcher part of C++20 p1032 Misc constexpr bits. 2019-11-15 Edward Smith-Rowland <3dw4rd@verizon.net> Implement the default_searcher part of C++20 p1032 Misc constexpr bits. * include/std/functional (default_searcher, default_searcher::operator()): Constexpr. * testsuite/20_util/function_objects/constexpr_searcher.cc: New. From-SVN: r278317 --- libstdc++-v3/ChangeLog | 7 +++ libstdc++-v3/include/std/functional | 4 +- .../function_objects/constexpr_searcher.cc | 52 +++++++++++++++++++ 3 files changed, 62 insertions(+), 1 deletion(-) create mode 100644 libstdc++-v3/testsuite/20_util/function_objects/constexpr_searcher.cc diff --git a/libstdc++-v3/ChangeLog b/libstdc++-v3/ChangeLog index 3e4e898ba81..5e2cb545a28 100644 --- a/libstdc++-v3/ChangeLog +++ b/libstdc++-v3/ChangeLog @@ -1,3 +1,10 @@ +2019-11-15 Edward Smith-Rowland <3dw4rd@verizon.net> + + Implement the default_searcher part of C++20 p1032 Misc constexpr bits. + * include/std/functional + (default_searcher, default_searcher::operator()): Constexpr. + * testsuite/20_util/function_objects/constexpr_searcher.cc: New. + 2019-11-15 Jonathan Wakely * include/bits/iterator_concepts.h (weakly_incrementable): Adjust. diff --git a/libstdc++-v3/include/std/functional b/libstdc++-v3/include/std/functional index b6a57ac9b54..93a3f9fecae 100644 --- a/libstdc++-v3/include/std/functional +++ b/libstdc++-v3/include/std/functional @@ -1000,6 +1000,7 @@ _GLIBCXX_BEGIN_NAMESPACE_VERSION class default_searcher { public: + _GLIBCXX20_CONSTEXPR default_searcher(_ForwardIterator1 __pat_first, _ForwardIterator1 __pat_last, _BinaryPredicate __pred = _BinaryPredicate()) @@ -1007,7 +1008,8 @@ _GLIBCXX_BEGIN_NAMESPACE_VERSION { } template - pair<_ForwardIterator2, _ForwardIterator2> + _GLIBCXX20_CONSTEXPR + pair<_ForwardIterator2, _ForwardIterator2> operator()(_ForwardIterator2 __first, _ForwardIterator2 __last) const { _ForwardIterator2 __first_ret = diff --git a/libstdc++-v3/testsuite/20_util/function_objects/constexpr_searcher.cc b/libstdc++-v3/testsuite/20_util/function_objects/constexpr_searcher.cc new file mode 100644 index 00000000000..e9fc0fc2204 --- /dev/null +++ b/libstdc++-v3/testsuite/20_util/function_objects/constexpr_searcher.cc @@ -0,0 +1,52 @@ +// Copyright (C) 2014-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. + +// You should have received a copy of the GNU General Public License along +// with this library; see the file COPYING3. If not see +// . + +// { dg-options "-std=gnu++2a" } +// { dg-do compile { target c++2a } } + +#include +#include + +const std::string_view +patt = "World"; + +constexpr std::string_view +greet = "Hello, Humongous World of Wonder!!!"; + +const std::wstring_view +wpatt = L"World"; + +constexpr std::wstring_view +wgreet = L"Hello, Humongous World of Wonder!!!"; + +constexpr bool +test_searcher() +{ + auto ok = true; + + const std::default_searcher search(patt.begin(), patt.end(), + std::equal_to<>()); + const auto find = search(greet.begin(), greet.end()); + + const std::default_searcher wsearch(wpatt.begin(), wpatt.end(), + std::equal_to<>()); + const auto wfind = wsearch(wgreet.begin(), wgreet.end()); + + return ok; +} + +static_assert(test_searcher()); -- 2.30.2