get:
Show a patch.

patch:
Update a patch.

put:
Update a patch.

GET /api/1.2/patches/2226298/?format=api
HTTP 200 OK
Allow: GET, PUT, PATCH, HEAD, OPTIONS
Content-Type: application/json
Vary: Accept

{
    "id": 2226298,
    "url": "http://patchwork.ozlabs.org/api/1.2/patches/2226298/?format=api",
    "web_url": "http://patchwork.ozlabs.org/project/gcc/patch/bmm.hhubpmz4v8.gcc.gcc-TEST.fdumont.30.1.1@forge-stage.sourceware.org/",
    "project": {
        "id": 17,
        "url": "http://patchwork.ozlabs.org/api/1.2/projects/17/?format=api",
        "name": "GNU Compiler Collection",
        "link_name": "gcc",
        "list_id": "gcc-patches.gcc.gnu.org",
        "list_email": "gcc-patches@gcc.gnu.org",
        "web_url": null,
        "scm_url": null,
        "webscm_url": null,
        "list_archive_url": "",
        "list_archive_url_format": "",
        "commit_url_format": ""
    },
    "msgid": "<bmm.hhubpmz4v8.gcc.gcc-TEST.fdumont.30.1.1@forge-stage.sourceware.org>",
    "list_archive_url": null,
    "date": "2026-04-22T10:42:29",
    "name": "[v1,1/1] libstdc++: Reimplement __gnu_cxx::__ops operators",
    "commit_ref": null,
    "pull_url": null,
    "state": "new",
    "archived": false,
    "hash": "7cc36ab78c92afab58785457a63e644342ed7baf",
    "submitter": {
        "id": 93220,
        "url": "http://patchwork.ozlabs.org/api/1.2/people/93220/?format=api",
        "name": "François Dumont via Sourceware Forge",
        "email": "forge-bot+fdumont@forge-stage.sourceware.org"
    },
    "delegate": null,
    "mbox": "http://patchwork.ozlabs.org/project/gcc/patch/bmm.hhubpmz4v8.gcc.gcc-TEST.fdumont.30.1.1@forge-stage.sourceware.org/mbox/",
    "series": [
        {
            "id": 500989,
            "url": "http://patchwork.ozlabs.org/api/1.2/series/500989/?format=api",
            "web_url": "http://patchwork.ozlabs.org/project/gcc/list/?series=500989",
            "date": "2026-04-22T10:42:28",
            "name": "libstdc++: Reimplement __gnu_cxx::__ops functors",
            "version": 1,
            "mbox": "http://patchwork.ozlabs.org/series/500989/mbox/"
        }
    ],
    "comments": "http://patchwork.ozlabs.org/api/patches/2226298/comments/",
    "check": "pending",
    "checks": "http://patchwork.ozlabs.org/api/patches/2226298/checks/",
    "tags": {},
    "related": [],
    "headers": {
        "Return-Path": "<gcc-patches-bounces~incoming=patchwork.ozlabs.org@gcc.gnu.org>",
        "X-Original-To": [
            "incoming@patchwork.ozlabs.org",
            "gcc-patches@gcc.gnu.org"
        ],
        "Delivered-To": [
            "patchwork-incoming@legolas.ozlabs.org",
            "gcc-patches@gcc.gnu.org"
        ],
        "Authentication-Results": [
            "legolas.ozlabs.org;\n spf=pass (sender SPF authorized) smtp.mailfrom=gcc.gnu.org\n (client-ip=2620:52:6:3111::32; helo=vm01.sourceware.org;\n envelope-from=gcc-patches-bounces~incoming=patchwork.ozlabs.org@gcc.gnu.org;\n receiver=patchwork.ozlabs.org)",
            "sourceware.org; dmarc=none (p=none dis=none)\n header.from=forge-stage.sourceware.org",
            "sourceware.org;\n spf=pass smtp.mailfrom=forge-stage.sourceware.org",
            "server2.sourceware.org;\n arc=none smtp.remote-ip=38.145.34.39"
        ],
        "Received": [
            "from vm01.sourceware.org (vm01.sourceware.org\n [IPv6:2620:52:6:3111::32])\n\t(using TLSv1.3 with cipher TLS_AES_256_GCM_SHA384 (256/256 bits)\n\t key-exchange x25519 server-signature ECDSA (secp384r1) server-digest SHA384)\n\t(No client certificate requested)\n\tby legolas.ozlabs.org (Postfix) with ESMTPS id 4g0xb44K0Wz1y2d\n\tfor <incoming@patchwork.ozlabs.org>; Wed, 22 Apr 2026 21:20:00 +1000 (AEST)",
            "from vm01.sourceware.org (localhost [127.0.0.1])\n\tby sourceware.org (Postfix) with ESMTP id BB295427C769\n\tfor <incoming@patchwork.ozlabs.org>; Wed, 22 Apr 2026 11:19:58 +0000 (GMT)",
            "from forge-stage.sourceware.org (vm08.sourceware.org [38.145.34.39])\n by sourceware.org (Postfix) with ESMTPS id 34DEB4BB3BE5\n for <gcc-patches@gcc.gnu.org>; Wed, 22 Apr 2026 10:43:19 +0000 (GMT)",
            "from forge-stage.sourceware.org (localhost [IPv6:::1])\n (using TLSv1.3 with cipher TLS_AES_256_GCM_SHA384 (256/256 bits)\n key-exchange x25519 server-signature ECDSA (prime256v1) server-digest SHA256)\n (No client certificate requested)\n by forge-stage.sourceware.org (Postfix) with ESMTPS id 0DD1E42B84\n for <gcc-patches@gcc.gnu.org>; Wed, 22 Apr 2026 10:43:19 +0000 (UTC)"
        ],
        "DKIM-Filter": [
            "OpenDKIM Filter v2.11.0 sourceware.org BB295427C769",
            "OpenDKIM Filter v2.11.0 sourceware.org 34DEB4BB3BE5"
        ],
        "DMARC-Filter": "OpenDMARC Filter v1.4.2 sourceware.org 34DEB4BB3BE5",
        "ARC-Filter": "OpenARC Filter v1.0.0 sourceware.org 34DEB4BB3BE5",
        "ARC-Seal": "i=1; a=rsa-sha256; d=sourceware.org; s=key; t=1776854599; cv=none;\n b=B/0ThN8YwBiwJbkMi6tsbOC5AiMHkiYejds+9keBahEZladXwjQnZ1TiwhVIaxx8YkM2LHNopSsTBz47wR7gZTE6o0n92ngE5jpLWJz5K5itmtF00L7AVxnxiBiEC3NMRmjDC605/tbMMquuC/nL77WJuB+HWYeK6QyF9OpNItM=",
        "ARC-Message-Signature": "i=1; a=rsa-sha256; d=sourceware.org; s=key;\n t=1776854599; c=relaxed/simple;\n bh=CTikqUUTpKTEKsgMP+ugVC2c61yRCRrOYdy1/AWlwQ4=;\n h=From:Date:Subject:MIME-Version:To:Message-ID;\n b=CHbOKSTWR3KaoKJEcAvIMOjYKrWsMGlQ5vTwOIcexIo3jAwEzy2dpDZKqOyeb4nKAIDlb/Peu+KlGwKCfYS6iL99h4rD74zVPGMVaeEhzMGzGDTGS4g5N4sT6yKmch1ruBMPX3weOxwoo36Rb6q34oAj9fu+7FVK7v6+QDxurpI=",
        "ARC-Authentication-Results": "i=1; server2.sourceware.org",
        "From": "=?utf-8?b?PT91dGYtOD9xP0ZyYW49QzM9QTdvaXNfRHVtb250X3ZpYV9Tb3VyY2V3YXJl?=\n\t=?utf-8?b?X0ZvcmdlPz0=?= <forge-bot+fdumont@forge-stage.sourceware.org>",
        "Date": "Wed, 22 Apr 2026 10:42:29 +0000",
        "Subject": "[PATCH v1 1/1] libstdc++: Reimplement __gnu_cxx::__ops operators",
        "MIME-Version": "1.0",
        "Content-Type": "text/plain; charset=UTF-8",
        "Content-Transfer-Encoding": "8bit",
        "To": "gcc-patches mailing list <gcc-patches@gcc.gnu.org>",
        "Message-ID": "\n <bmm.hhubpmz4v8.gcc.gcc-TEST.fdumont.30.1.1@forge-stage.sourceware.org>",
        "X-Mailer": "batrachomyomachia",
        "X-Pull-Request-Organization": "gcc",
        "X-Pull-Request-Repository": "gcc-TEST",
        "X-Pull-Request": "https://forge.sourceware.org/gcc/gcc-TEST/pulls/30",
        "References": "\n <bmm.hhubpmz4v8.gcc.gcc-TEST.fdumont.30.1.0@forge-stage.sourceware.org>",
        "In-Reply-To": "\n <bmm.hhubpmz4v8.gcc.gcc-TEST.fdumont.30.1.0@forge-stage.sourceware.org>",
        "X-Patch-URL": "\n https://forge.sourceware.org/fdumont/gcc-TEST/commit/7f4c93adf8d0f3b08e642b14b01df7fb87d93e96",
        "X-BeenThere": "gcc-patches@gcc.gnu.org",
        "X-Mailman-Version": "2.1.30",
        "Precedence": "list",
        "List-Id": "Gcc-patches mailing list <gcc-patches.gcc.gnu.org>",
        "List-Unsubscribe": "<https://gcc.gnu.org/mailman/options/gcc-patches>,\n <mailto:gcc-patches-request@gcc.gnu.org?subject=unsubscribe>",
        "List-Archive": "<https://gcc.gnu.org/pipermail/gcc-patches/>",
        "List-Post": "<mailto:gcc-patches@gcc.gnu.org>",
        "List-Help": "<mailto:gcc-patches-request@gcc.gnu.org?subject=help>",
        "List-Subscribe": "<https://gcc.gnu.org/mailman/listinfo/gcc-patches>,\n <mailto:gcc-patches-request@gcc.gnu.org?subject=subscribe>",
        "Reply-To": "gcc-patches mailing list <gcc-patches@gcc.gnu.org>,\n fdumont@gcc.gnu.org",
        "Errors-To": "gcc-patches-bounces~incoming=patchwork.ozlabs.org@gcc.gnu.org"
    },
    "content": "From: François Dumont <fdumont@gcc.gnu.org>\n\nReplace functors using iterators as input to adopt functors that are\nmatching the same Standard expectations as the ones imposed on functor-aware\nalgos. It forces to have iterators dereferenced at algo level and not in the\npredefined functors anymore. This way the functor used by functor-aware algos\ndo not need to be wrap anymore. Only the different flavour of '<', '==' and\n'!' operators needed to be wrapped.\n\nAlso make sure that in algos implementation helpers, functors are passed using\nperfect forwarding rather than by copy. This way we can remove usage of std::refwrap\nin std::erase_if implementations and instead use std::move.\n\nAdditionnally improve __lower_bound/__upper_bound signatures. Those internal\nfunctions have been introduced as implementation details of respectively\nstd::lower_bound/std::upper_bound. For this reason they are taking\nthe value argument as a const reference. The problem is that it's now being used\nin algos like std::inplace_merge and std::stable_sort and so forces functor used\nin those algos to take their arguments as const references. Using a rvalue references\n__lower_bound/__upper_bound will automatically adapt to the usage context. The\nlimitation still exists in C++98.\n\nlibstdc++-v3/ChangeLog:\n\n\t* include/bits/move.h\n\t(_GLIBCXX_CP_FWDREF): New macro, substituted by a copy in pre-c++11 mode.\n\t* include/std/functional: Include predefined_ops.h.\n\t(_Not_fn): Move to...\n\t* include/bits/predefined_ops.h: ...here, and expose a version\n\tin pre-C++14 mode.\n\t(__not_fn): New, use latter.\n\tInclude bits/stl_iterator_base_types.h.\n\tInclude bits/invoke.h.\n\t(_Iter_less_iter, _Iter_less_val, _Val_less_iter, _Iter_equal_to_iter)\n\t(_Iter_equal_to_val, _Iter_comp_iter, _Iter_comp_val, _Val_comp_iter)\n\t(_Iter_equals_val, _Iter_equals_iter, _Iter_pred, _Iter_comp_val)\n\t(_Iter_comp_to_val, _Iter_comp_to_iter, _Iter_negate): Remove.\n\t(__iter_less_iter, __iter_less_val, __iter_comp_val, __val_less_iter)\n\t(__val_comp_iter, __iter_equal_to_iter, __iter_equal_to_val, __iter_comp_iter)\n\t(__val_comp_iter, __iter_equals_val, __iter_comp_iter, __pred_iter): Remove.\n\t(_Less, _LessRefs<>, _LessCRef<>, _LessVal<>)\n\t(_EqualTo, _EqualToRefs<>, _EqualToVal<>, _EqualVal<>, _EqualValRef<>)\n\t(_CompVal): New.\n\t(__less, __less_val, __equal_to, __comp_val, __equal_ite): New.\n\t* include/bits/stl_algo.h: Adapt all algos to use new __gnu_cxx::__ops operators.\n\tWhen possible use std::move to pass predicates to helpers and std::forward between\n\thelpers.\n\t* include/bits/stl_algobase.h: Likewise.\n\t* include/bits/stl_heap.h: Likewise.\n\t* include/std/deque: Cleanup usage of __gnu_cxx::__ops operators. Replace usage of\n\tstd::ref by std::move to pass predicate to std::__remove_if.\n\t* include/std/inplace_vector: Likewise.\n\t* include/std/string: Likewise.\n\t* include/std/vector: Likewise.\n\t* src/c++17/memory_resource.cc: Include <functional>.\n\t* testsuite/25_algorithms/inplace_merge/1.cc (test5): New test case.\n\t* testsuite/25_algorithms/stable_sort/1.cc (test4): New test case.\n---\n libstdc++-v3/include/bits/move.h              |   2 +\n libstdc++-v3/include/bits/predefined_ops.h    | 727 +++++++++++-------\n libstdc++-v3/include/bits/stl_algo.h          | 579 +++++++-------\n libstdc++-v3/include/bits/stl_algobase.h      |  88 ++-\n libstdc++-v3/include/bits/stl_heap.h          | 103 ++-\n libstdc++-v3/include/std/deque                |   7 +-\n libstdc++-v3/include/std/functional           |  54 +-\n libstdc++-v3/include/std/inplace_vector       |   6 +-\n libstdc++-v3/include/std/string               |   7 +-\n libstdc++-v3/include/std/vector               |   7 +-\n libstdc++-v3/src/c++17/memory_resource.cc     |   1 +\n .../25_algorithms/inplace_merge/1.cc          |  15 +\n .../testsuite/25_algorithms/stable_sort/1.cc  |  24 +\n 13 files changed, 911 insertions(+), 709 deletions(-)",
    "diff": "diff --git a/libstdc++-v3/include/bits/move.h b/libstdc++-v3/include/bits/move.h\nindex 8c4f461a1105..1f3a739e2c71 100644\n--- a/libstdc++-v3/include/bits/move.h\n+++ b/libstdc++-v3/include/bits/move.h\n@@ -195,10 +195,12 @@ _GLIBCXX_BEGIN_NAMESPACE_VERSION\n   /// @} group utilities\n \n #define _GLIBCXX_FWDREF(_Tp) _Tp&&\n+#define _GLIBCXX_CP_FWDREF(_Tp) _Tp&&\n #define _GLIBCXX_MOVE(__val) std::move(__val)\n #define _GLIBCXX_FORWARD(_Tp, __val) std::forward<_Tp>(__val)\n #else\n #define _GLIBCXX_FWDREF(_Tp) const _Tp&\n+#define _GLIBCXX_CP_FWDREF(_Tp) _Tp\n #define _GLIBCXX_MOVE(__val) (__val)\n #define _GLIBCXX_FORWARD(_Tp, __val) (__val)\n #endif\ndiff --git a/libstdc++-v3/include/bits/predefined_ops.h b/libstdc++-v3/include/bits/predefined_ops.h\nindex 5759ebd0e5bc..dd3c5ebdb921 100644\n--- a/libstdc++-v3/include/bits/predefined_ops.h\n+++ b/libstdc++-v3/include/bits/predefined_ops.h\n@@ -31,377 +31,526 @@\n #define _GLIBCXX_PREDEFINED_OPS_H\t1\n \n #include <bits/move.h>\n+#include <bits/stl_iterator_base_types.h>\n+\n+#if __cplusplus >= 201103L\n+# include <bits/invoke.h>\n+#endif\n \n namespace __gnu_cxx\n {\n namespace __ops\n {\n-  struct _Iter_less_iter\n+#if __cplusplus >= 201103L\n+  struct _Less\n   {\n-    template<typename _Iterator1, typename _Iterator2>\n+    template<typename _Lhs, typename _Rhs>\n       _GLIBCXX14_CONSTEXPR\n       bool\n-      operator()(_Iterator1 __it1, _Iterator2 __it2) const\n-      { return *__it1 < *__it2; }\n+      operator()(_Lhs&& __lhs, _Rhs&& __rhs) const\n+      noexcept( noexcept(__lhs < __rhs) )\n+      { return __lhs < __rhs; }\n   };\n+#else\n+  template<typename _Ref1, typename _Ref2>\n+    struct _LessRefs\n+    {\n+      bool\n+      operator()(_Ref1 __lhs, _Ref2 __rhs) const\n+      { return __lhs < __rhs; }\n \n-  _GLIBCXX14_CONSTEXPR\n-  inline _Iter_less_iter\n-  __iter_less_iter()\n-  { return _Iter_less_iter(); }\n+      bool\n+      operator()(_Ref2 __lhs, _Ref1 __rhs) const\n+      { return __lhs < __rhs; }\n \n-  struct _Iter_less_val\n-  {\n-#if __cplusplus >= 201103L\n-    constexpr _Iter_less_val() = default;\n-#else\n-    _Iter_less_val() { }\n-#endif\n+      bool\n+      operator()(_Ref1 __lhs, _Ref1 __rhs) const\n+      { return __lhs < __rhs; }\n \n-    _GLIBCXX20_CONSTEXPR\n-    explicit\n-    _Iter_less_val(_Iter_less_iter) { }\n+      bool\n+      operator()(_Ref2 __lhs, _Ref2 __rhs) const\n+      { return __lhs < __rhs; }\n+    };\n \n-    template<typename _Iterator, typename _Value>\n-      _GLIBCXX20_CONSTEXPR\n+  template<typename _Ref>\n+    struct _LessRefs<_Ref, _Ref>\n+    {\n       bool\n-      operator()(_Iterator __it, _Value& __val) const\n-      { return *__it < __val; }\n-  };\n+      operator()(_Ref __lhs, _Ref __rhs) const\n+      { return __lhs < __rhs; }\n+    };\n \n-  _GLIBCXX20_CONSTEXPR\n-  inline _Iter_less_val\n-  __iter_less_val()\n-  { return _Iter_less_val(); }\n+  template<typename _Ite1, typename _Ite2>\n+    struct _Less\n+    : _LessRefs<typename std::iterator_traits<_Ite1>::reference,\n+\t\ttypename std::iterator_traits<_Ite2>::reference>\n+    { };\n+\n+  template<typename _Ite>\n+    struct _LessCRef\n+    : _LessRefs<typename std::iterator_traits<_Ite>::reference,\n+\t\tconst typename std::iterator_traits<_Ite>::value_type&>\n+    { };\n+#endif\n \n-  _GLIBCXX20_CONSTEXPR\n-  inline _Iter_less_val\n-  __iter_comp_val(_Iter_less_iter)\n-  { return _Iter_less_val(); }\n+#if __cplusplus >= 201103L\n+  template<typename _Ite1, typename _Ite2>\n+    constexpr _Less\n+    __less(_Ite1, _Ite2) noexcept\n+    { return _Less{}; }\n+\n+  constexpr _Less\n+  __less() noexcept\n+  { return _Less{}; }\n+#else\n+  template<typename _Ite1, typename _Ite2>\n+    inline _Less<_Ite1, _Ite2>\n+    __less(_Ite1, _Ite2)\n+    { return _Less<_Ite1, _Ite2>(); }\n+#endif\n \n-  struct _Val_less_iter\n-  {\n #if __cplusplus >= 201103L\n-    constexpr _Val_less_iter() = default;\n+  template<typename _Ite>\n+    constexpr _Less\n+    __less(_Ite) noexcept\n+    { return _Less{}; }\n #else\n-    _Val_less_iter() { }\n+  template<typename _Ite>\n+    inline _LessCRef<_Ite>\n+    __less(_Ite)\n+    { return _LessCRef<_Ite>(); }\n #endif\n \n-    _GLIBCXX20_CONSTEXPR\n-    explicit\n-    _Val_less_iter(_Iter_less_iter) { }\n+#if __cplusplus >= 201103L\n+  template<typename _Comp, typename _Ite1, typename _Ite2>\n+    constexpr auto\n+    __less(_Comp&& __comp, _Ite1, _Ite2) noexcept\n+    -> decltype(std::forward<_Comp>(__comp))\n+    { return std::forward<_Comp>(__comp); }\n+#else\n+  template<typename _Comp, typename _Ite1, typename _Ite2>\n+    inline _Comp\n+    __less(_Comp __comp, _Ite1, _Ite2)\n+    { return __comp; }\n+\n+  template<typename _LessRef1, typename _LessRef2, typename _Ite1, typename _Ite2>\n+    inline _Less<_Ite1, _Ite2>\n+    __less(const _LessRefs<_LessRef1, _LessRef2>&, _Ite1, _Ite2)\n+    { return _Less<_Ite1, _Ite2>(); }\n+#endif\n \n-    template<typename _Value, typename _Iterator>\n-      _GLIBCXX20_CONSTEXPR\n-      bool\n-      operator()(_Value& __val, _Iterator __it) const\n-      { return __val < *__it; }\n-  };\n+#if __cplusplus < 201103L\n+  template<typename _Ite, typename _Val>\n+    struct _LessVal : _LessRefs<typename std::iterator_traits<_Ite>::reference,\n+\t\t\t      _Val&>\n+    { };\n+#endif\n \n-  _GLIBCXX20_CONSTEXPR\n-  inline _Val_less_iter\n-  __val_less_iter()\n-  { return _Val_less_iter(); }\n+#if __cplusplus >= 201103L\n+  template<typename _Ite, typename _Val>\n+    constexpr _Less\n+    __less_val(_Ite, _Val&&) noexcept\n+    { return _Less{}; }\n+#else\n+  template<typename _Ite, typename _Val>\n+    inline _LessVal<_Ite, _Val>\n+    __less_val(_Ite, _Val&)\n+    { return _LessVal<_Ite, _Val>(); }\n+#endif\n \n-  _GLIBCXX20_CONSTEXPR\n-  inline _Val_less_iter\n-  __val_comp_iter(_Iter_less_iter)\n-  { return _Val_less_iter(); }\n+#if __cplusplus >= 201103L\n+  template<typename _Comp, typename _Ite, typename _Val>\n+    constexpr auto\n+    __less_val(_Comp&& __comp, _Ite, _Val&&) noexcept\n+    -> decltype(std::forward<_Comp>(__comp))\n+    { return std::forward<_Comp>(__comp); }\n+#else\n+  template<typename _Comp, typename _Ite, typename _Val>\n+    inline _Comp\n+    __less_val(_Comp __comp, _Ite, _Val&)\n+    { return __comp; }\n+\n+  template<typename _Ref1, typename _Ref2, typename _Ite, typename _Val>\n+    inline _LessVal<_Ite, _Val>\n+    __less_val(const _LessRefs<_Ref1, _Ref2>&, _Ite, _Val&)\n+    { return _LessVal<_Ite, _Val>(); }\n+#endif\n \n-  struct _Iter_equal_to_iter\n+#if __cplusplus >= 201103L\n+  struct _EqualTo\n   {\n-    template<typename _Iterator1, typename _Iterator2>\n+    template<typename _Lhs, typename _Rhs>\n       _GLIBCXX20_CONSTEXPR\n       bool\n-      operator()(_Iterator1 __it1, _Iterator2 __it2) const\n-      { return *__it1 == *__it2; }\n+      operator()(_Lhs&& __lhs, _Rhs&& __rhs) const\n+      noexcept( noexcept(__lhs == __rhs) )\n+      { return __lhs == __rhs; }\n   };\n-\n-  _GLIBCXX20_CONSTEXPR\n-  inline _Iter_equal_to_iter\n-  __iter_equal_to_iter()\n-  { return _Iter_equal_to_iter(); }\n-\n-  struct _Iter_equal_to_val\n-  {\n-    template<typename _Iterator, typename _Value>\n-      _GLIBCXX20_CONSTEXPR\n+#else\n+  template<typename _Ref1, typename _Ref2>\n+    struct _EqualToRefs\n+    {\n       bool\n-      operator()(_Iterator __it, _Value& __val) const\n-      { return *__it == __val; }\n-  };\n-\n-  _GLIBCXX20_CONSTEXPR\n-  inline _Iter_equal_to_val\n-  __iter_equal_to_val()\n-  { return _Iter_equal_to_val(); }\n-\n-  _GLIBCXX20_CONSTEXPR\n-  inline _Iter_equal_to_val\n-  __iter_comp_val(_Iter_equal_to_iter)\n-  { return _Iter_equal_to_val(); }\n+      operator()(_Ref1 __lhs, _Ref2 __rhs) const\n+      { return __lhs == __rhs; }\n \n-  template<typename _Compare>\n-    struct _Iter_comp_iter\n-    {\n-      _Compare _M_comp;\n+      bool\n+      operator()(_Ref2 __lhs, _Ref1 __rhs) const\n+      { return __lhs == __rhs; }\n \n-      explicit _GLIBCXX14_CONSTEXPR\n-      _Iter_comp_iter(_Compare __comp)\n-\t: _M_comp(_GLIBCXX_MOVE(__comp))\n-      { }\n+      bool\n+      operator()(_Ref1 __lhs, _Ref1 __rhs) const\n+      { return __lhs == __rhs; }\n \n-      template<typename _Iterator1, typename _Iterator2>\n-        _GLIBCXX14_CONSTEXPR\n-        bool\n-        operator()(_Iterator1 __it1, _Iterator2 __it2)\n-        { return bool(_M_comp(*__it1, *__it2)); }\n+      bool\n+      operator()(_Ref2 __lhs, _Ref2 __rhs) const\n+      { return __lhs == __rhs; }\n     };\n \n-  template<typename _Compare>\n-    _GLIBCXX14_CONSTEXPR\n-    inline _Iter_comp_iter<_Compare>\n-    __iter_comp_iter(_Compare __comp)\n-    { return _Iter_comp_iter<_Compare>(_GLIBCXX_MOVE(__comp)); }\n-\n-  template<typename _Compare>\n-    struct _Iter_comp_val\n+  template<typename _Ref>\n+    struct _EqualToRefs<_Ref, _Ref>\n     {\n-      _Compare _M_comp;\n-\n-      _GLIBCXX20_CONSTEXPR\n-      explicit\n-      _Iter_comp_val(_Compare __comp)\n-\t: _M_comp(_GLIBCXX_MOVE(__comp))\n-      { }\n+      bool\n+      operator()(_Ref __lhs, _Ref __rhs) const\n+      { return __lhs == __rhs; }\n+    };\n \n-      _GLIBCXX20_CONSTEXPR\n-      explicit\n-      _Iter_comp_val(const _Iter_comp_iter<_Compare>& __comp)\n-\t: _M_comp(__comp._M_comp)\n-      { }\n+  template<typename _Ite1, typename _Ite2>\n+    struct _EqualTo\n+      : _EqualToRefs<typename std::iterator_traits<_Ite1>::reference,\n+\t\t     typename std::iterator_traits<_Ite2>::reference>\n+    { };\n+#endif\n \n #if __cplusplus >= 201103L\n-      _GLIBCXX20_CONSTEXPR\n-      explicit\n-      _Iter_comp_val(_Iter_comp_iter<_Compare>&& __comp)\n-\t: _M_comp(std::move(__comp._M_comp))\n-      { }\n+  template<typename _Ite1, typename _Ite2>\n+    constexpr _EqualTo\n+    __equal_to(_Ite1, _Ite2) noexcept\n+    { return _EqualTo{}; }\n+\n+  constexpr _EqualTo\n+  __equal_to() noexcept\n+  { return _EqualTo{}; }\n+#else\n+  template<typename _Ite1, typename _Ite2>\n+    inline _EqualTo<_Ite1, _Ite2>\n+    __equal_to(_Ite1, _Ite2)\n+    { return _EqualTo<_Ite1, _Ite2>(); }\n #endif\n \n-      template<typename _Iterator, typename _Value>\n-\t_GLIBCXX20_CONSTEXPR\n-\tbool\n-\toperator()(_Iterator __it, _Value& __val)\n-\t{ return bool(_M_comp(*__it, __val)); }\n-    };\n-\n-  template<typename _Compare>\n-    _GLIBCXX20_CONSTEXPR\n-    inline _Iter_comp_val<_Compare>\n-    __iter_comp_val(_Compare __comp)\n-    { return _Iter_comp_val<_Compare>(_GLIBCXX_MOVE(__comp)); }\n-\n-  template<typename _Compare>\n-    _GLIBCXX20_CONSTEXPR\n-    inline _Iter_comp_val<_Compare>\n-    __iter_comp_val(_Iter_comp_iter<_Compare> __comp)\n-    { return _Iter_comp_val<_Compare>(_GLIBCXX_MOVE(__comp)); }\n-\n-  template<typename _Compare>\n-    struct _Val_comp_iter\n-    {\n-      _Compare _M_comp;\n-\n-      _GLIBCXX20_CONSTEXPR\n-      explicit\n-      _Val_comp_iter(_Compare __comp)\n-\t: _M_comp(_GLIBCXX_MOVE(__comp))\n-      { }\n-\n-      _GLIBCXX20_CONSTEXPR\n-      explicit\n-      _Val_comp_iter(const _Iter_comp_iter<_Compare>& __comp)\n-\t: _M_comp(__comp._M_comp)\n-      { }\n-\n #if __cplusplus >= 201103L\n-      _GLIBCXX20_CONSTEXPR\n-      explicit\n-      _Val_comp_iter(_Iter_comp_iter<_Compare>&& __comp)\n-\t: _M_comp(std::move(__comp._M_comp))\n-      { }\n+  template<typename _Ite>\n+    constexpr _EqualTo\n+    __equal_to(_Ite) noexcept\n+    { return _EqualTo{}; }\n+#else\n+  template<typename _Ite>\n+    inline _EqualTo<_Ite, _Ite>\n+    __equal_to(_Ite)\n+    { return _EqualTo<_Ite, _Ite>(); }\n #endif\n \n-      template<typename _Value, typename _Iterator>\n-\t_GLIBCXX20_CONSTEXPR\n-\tbool\n-\toperator()(_Value& __val, _Iterator __it)\n-\t{ return bool(_M_comp(__val, *__it)); }\n-    };\n-\n-  template<typename _Compare>\n-    _GLIBCXX20_CONSTEXPR\n-    inline _Val_comp_iter<_Compare>\n-    __val_comp_iter(_Compare __comp)\n-    { return _Val_comp_iter<_Compare>(_GLIBCXX_MOVE(__comp)); }\n+#if __cplusplus < 201103L\n+  template<typename _Ite, typename _Val>\n+    struct _EqualToVal\n+      : _EqualToRefs<typename std::iterator_traits<_Ite>::reference, _Val&>\n+    { };\n+#endif\n \n-  template<typename _Compare>\n-    _GLIBCXX20_CONSTEXPR\n-    inline _Val_comp_iter<_Compare>\n-    __val_comp_iter(_Iter_comp_iter<_Compare> __comp)\n-    { return _Val_comp_iter<_Compare>(_GLIBCXX_MOVE(__comp)); }\n+#if __cplusplus >= 201103L\n+  template<typename _Comp, typename _Ite, typename _Val>\n+    constexpr auto\n+    __equal_to_val(_Comp&& __comp, _Ite, _Val&&) noexcept\n+    -> decltype(std::forward<_Comp>(__comp))\n+    { return std::forward<_Comp>(__comp); }\n+#else\n+  template<typename _Comp, typename _Ite, typename _Val>\n+    inline _Comp\n+    __equal_to_val(_Comp __comp, _Ite, _Val&)\n+    { return __comp; }\n+\n+  template<typename _Ref1, typename _Ref2, typename _Ite, typename _Val>\n+    inline _EqualToVal<_Ite, _Val>\n+    __equal_to_val(const _EqualToRefs<_Ref1, _Ref2>&, _Ite, _Val&)\n+    { return _EqualToVal<_Ite, _Val>(); }\n+#endif\n \n-  template<typename _Value>\n-    struct _Iter_equals_val\n+#if __cplusplus >= 201103L\n+  template<typename _Val>\n+    struct _EqualVal\n     {\n-      _Value& _M_value;\n+    private:\n+      _Val _M_val;\n \n-      _GLIBCXX20_CONSTEXPR\n-      explicit\n-      _Iter_equals_val(_Value& __value)\n-\t: _M_value(__value)\n-      { }\n+    public:\n+      constexpr\n+      _EqualVal(_Val __val)\n+      : _M_val(__val) { }\n \n-      template<typename _Iterator>\n+      template<typename _Lhs>\n \t_GLIBCXX20_CONSTEXPR\n \tbool\n-\toperator()(_Iterator __it)\n-\t{ return *__it == _M_value; }\n+\toperator()(_Lhs&& __lhs) const\n+\tnoexcept( noexcept(__lhs == _M_val) )\n+\t{ return __lhs == _M_val; }\n     };\n-\n-  template<typename _Value>\n-    _GLIBCXX20_CONSTEXPR\n-    inline _Iter_equals_val<_Value>\n-    __iter_equals_val(_Value& __val)\n-    { return _Iter_equals_val<_Value>(__val); }\n-\n-  template<typename _Iterator1>\n-    struct _Iter_equals_iter\n+#else\n+  template<typename _Ref, typename _Val>\n+    struct _EqualValRef\n     {\n-      _Iterator1 _M_it1;\n+    private:\n+      _Val _M_val;\n \n-      _GLIBCXX20_CONSTEXPR\n-      explicit\n-      _Iter_equals_iter(_Iterator1 __it1)\n-\t: _M_it1(__it1)\n+    public:\n+      _EqualValRef(_Val __val)\n+      : _M_val(__val)\n       { }\n \n-      template<typename _Iterator2>\n-\t_GLIBCXX20_CONSTEXPR\n-\tbool\n-\toperator()(_Iterator2 __it2)\n-\t{ return *__it2 == *_M_it1; }\n+      bool\n+      operator()(_Ref __lhs) const\n+      { return __lhs == _M_val; }\n     };\n \n-  template<typename _Iterator>\n-    _GLIBCXX20_CONSTEXPR\n-    inline _Iter_equals_iter<_Iterator>\n-    __iter_comp_iter(_Iter_equal_to_iter, _Iterator __it)\n-    { return _Iter_equals_iter<_Iterator>(__it); }\n-\n-  template<typename _Predicate>\n-    struct _Iter_pred\n+  template<typename _Ite, typename _Val>\n+    struct _EqualVal\n+    : _EqualValRef<typename std::iterator_traits<_Ite>::reference, _Val>\n     {\n-      _Predicate _M_pred;\n+      typedef\n+      _EqualValRef<typename std::iterator_traits<_Ite>::reference, _Val> _Base;\n \n-      _GLIBCXX20_CONSTEXPR\n-      explicit\n-      _Iter_pred(_Predicate __pred)\n-\t: _M_pred(_GLIBCXX_MOVE(__pred))\n+      _EqualVal(_Val __val)\n+      : _Base(__val)\n       { }\n-\n-      template<typename _Iterator>\n-\t_GLIBCXX20_CONSTEXPR\n-\tbool\n-\toperator()(_Iterator __it)\n-\t{ return bool(_M_pred(*__it)); }\n     };\n+#endif\n \n-  template<typename _Predicate>\n-    _GLIBCXX20_CONSTEXPR\n-    inline _Iter_pred<_Predicate>\n-    __pred_iter(_Predicate __pred)\n-    { return _Iter_pred<_Predicate>(_GLIBCXX_MOVE(__pred)); }\n+#if __cplusplus >= 201103L\n+  template<typename _Ite, typename _Val>\n+    constexpr _EqualVal<const _Val&>\n+    __equal_val(_Ite, const _Val& __val) noexcept\n+    {return _EqualVal<const _Val&>(__val);}\n+\n+  template<typename _Val>\n+    constexpr _EqualVal<const _Val&>\n+    __equal_val(const _Val& __val) noexcept\n+    {return _EqualVal<const _Val&>(__val);}\n+#else\n+  template<typename _Ite, typename _Val>\n+    inline _EqualVal<_Ite, const _Val&>\n+    __equal_val(_Ite, const _Val& __val)\n+    { return _EqualVal<_Ite, const _Val&>(__val); }\n+#endif\n \n-  template<typename _Compare, typename _Value>\n-    struct _Iter_comp_to_val\n+#if __cplusplus >= 201103L\n+  template<typename _BinaryPred, typename _Val>\n+    struct _CompVal\n     {\n-      _Compare _M_comp;\n-      _Value& _M_value;\n-\n-      _GLIBCXX20_CONSTEXPR\n-      _Iter_comp_to_val(_Compare __comp, _Value& __value)\n-\t: _M_comp(_GLIBCXX_MOVE(__comp)), _M_value(__value)\n+      template<typename _BPred>\n+\tconstexpr\n+\t_CompVal(_BPred&& __pred, _Val __val)\n+\t: _M_binary_pred(std::forward<_BPred>(__pred))\n+\t, _M_val(__val)\n+\t{ }\n+\n+      _CompVal(const _CompVal&) = default;\n+      _CompVal(_CompVal&&) = default;\n+      ~_CompVal() = default;\n+\n+      // Macro to define operator() with given cv-qualifiers ref-qualifiers,\n+      // forwarding _M_binary_pred and the function arguments with the same\n+      // qualifiers, and deducing the return type and exception-specification.\n+# define _GLIBCXX_BINARY_PRED_CALL_OP( _QUALS )\t\t\t\t\\\n+      template<typename _Arg,\t\t\t\t\t\t\\\n+\t       typename = std::__enable_if_t<std::__is_invocable<\t\\\n+\t\t _BinaryPred _QUALS, _Arg, _Val>::value>> \t\\\n+\t_GLIBCXX20_CONSTEXPR\t\t\t\t\t\t\\\n+\tbool\t\t\t\t\t\t\t\t\\\n+\toperator()(_Arg&& __arg) _QUALS\t\t\t\t\t\\\n+\tnoexcept(std::__is_nothrow_invocable<\t\t\t\t\\\n+\t\t _BinaryPred _QUALS, _Arg, _Val>::value)\t\t\\\n+\t{\t\t\t\t\t\t\t\t\\\n+\t  return std::__invoke(\t\t\t\t\t\t\\\n+\t\t   std::forward< _BinaryPred _QUALS >(_M_binary_pred),\t\\\n+\t\t   std::forward<_Arg>(__arg), _M_val);\t\t\t\\\n+\t}\t\t\t\t\t\t\t\t\\\n+\t\t\t\t\t\t\t\t\t\\\n+      template<typename _Arg,\t\t\t\t\t\t\\\n+\t       typename = std::__enable_if_t<!std::__is_invocable<\t\\\n+\t\t _BinaryPred _QUALS, _Arg, _Val>::value>>\t\\\n+\tvoid operator()(_Arg&&) _QUALS = delete;\n+\n+      _GLIBCXX_BINARY_PRED_CALL_OP( & )\n+      _GLIBCXX_BINARY_PRED_CALL_OP( const & )\n+      _GLIBCXX_BINARY_PRED_CALL_OP( && )\n+      _GLIBCXX_BINARY_PRED_CALL_OP( const && )\n+# undef _GLIBCXX_BINARY_PRED_CALL_OP\n+#else\n+  template<typename _BinaryPred, typename _Ite, typename _Val>\n+    struct _CompVal\n+    {\n+      _CompVal(_BinaryPred __pred, _Val __val)\n+      : _M_binary_pred(__pred), _M_val(__val)\n       { }\n \n-      template<typename _Iterator>\n-\t_GLIBCXX20_CONSTEXPR\n-\tbool\n-\toperator()(_Iterator __it)\n-\t{ return bool(_M_comp(*__it, _M_value)); }\n+      bool\n+      operator()(typename std::iterator_traits<_Ite>::reference __lhs)\n+      { return bool(_M_binary_pred(__lhs, _M_val)); }\n+#endif\n+\n+    private:\n+      _BinaryPred _M_binary_pred;\n+      _Val\t  _M_val;\n     };\n \n-  template<typename _Compare, typename _Value>\n-    _Iter_comp_to_val<_Compare, _Value>\n-    _GLIBCXX20_CONSTEXPR\n-    __iter_comp_val(_Compare __comp, _Value &__val)\n+#if __cplusplus >= 201103L\n+  template<typename _BPred, typename _Ite, typename _Val>\n+    _GLIBCXX20_CONSTEXPR inline\n+    _CompVal<std::__decay_t<_BPred>, const _Val&>\n+    __comp_val(_BPred&& __pred, _Ite, const _Val& __val)\n+    noexcept(std::is_nothrow_constructible<std::__decay_t<_BPred>,\n+\t     _BPred&&>::value)\n     {\n-      return _Iter_comp_to_val<_Compare, _Value>(_GLIBCXX_MOVE(__comp), __val);\n+      return\n+\t_CompVal<std::__decay_t<_BPred>, const _Val&>\n+\t(std::forward<_BPred>(__pred), __val);\n     }\n+#else\n+  template<typename _BPred, typename _Ite, typename _Val>\n+    inline _CompVal<_BPred, _Ite, const _Val&>\n+    __comp_val(_BPred __pred, _Ite, const _Val& __val)\n+    { return _CompVal<_BPred, _Ite, const _Val&>(__pred, __val); }\n+#endif\n \n-  template<typename _Compare, typename _Iterator1>\n-    struct _Iter_comp_to_iter\n+#if __cplusplus >= 201103L\n+  template<typename _BPred, typename _InIte, typename _Ite>\n+    _GLIBCXX20_CONSTEXPR inline\n+    _CompVal<std::__decay_t<_BPred>,\n+\t     typename std::iterator_traits<_Ite>::reference>\n+    __equal_ite(_BPred&& __pred, _InIte, _Ite  __ite)\n+    noexcept(std::is_nothrow_constructible<std::__decay_t<_BPred>,\n+\t     _BPred&&>::value)\n     {\n-      _Compare _M_comp;\n-      _Iterator1 _M_it1;\n-\n-      _GLIBCXX20_CONSTEXPR\n-      _Iter_comp_to_iter(_Compare __comp, _Iterator1 __it1)\n-\t: _M_comp(_GLIBCXX_MOVE(__comp)), _M_it1(__it1)\n-      { }\n-\n-      template<typename _Iterator2>\n-\t_GLIBCXX20_CONSTEXPR\n-\tbool\n-\toperator()(_Iterator2 __it2)\n-\t{ return bool(_M_comp(*__it2, *_M_it1)); }\n-    };\n+      return\n+\t_CompVal<std::__decay_t<_BPred>,\n+\t\t typename std::iterator_traits<_Ite>::reference>\n+\t(std::forward<_BPred>(__pred), *__ite);\n+    }\n \n-  template<typename _Compare, typename _Iterator>\n-    _GLIBCXX20_CONSTEXPR\n-    inline _Iter_comp_to_iter<_Compare, _Iterator>\n-    __iter_comp_iter(_Iter_comp_iter<_Compare> __comp, _Iterator __it)\n+  template<typename _InIte, typename _Ite>\n+    _GLIBCXX20_CONSTEXPR inline\n+    _EqualVal<typename std::iterator_traits<_Ite>::reference>\n+    __equal_ite(_EqualTo, _InIte, _Ite __ite)\n     {\n-      return _Iter_comp_to_iter<_Compare, _Iterator>(\n-\t  _GLIBCXX_MOVE(__comp._M_comp), __it);\n+      return\n+\t_EqualVal<typename std::iterator_traits<_Ite>::reference>(*__ite);\n+    }\n+#else\n+  template<typename _BPred, typename _InIte, typename _Ite>\n+    inline\n+      _CompVal<_BPred, _InIte, typename std::iterator_traits<_Ite>::reference>\n+    __equal_ite(_BPred __pred, _InIte, _Ite __ite)\n+    {\n+      return\n+\t_CompVal<_BPred, _InIte, typename std::iterator_traits<_Ite>::reference>\n+\t(__pred, *__ite);\n     }\n \n-  template<typename _Predicate>\n-    struct _Iter_negate\n+  template<typename _Ref1, typename _Ref2, typename _InIte, typename _Ite>\n+    inline\n+      _EqualVal<_InIte, typename std::iterator_traits<_Ite>::reference>\n+    __equal_ite(const _EqualToRefs<_Ref1, _Ref2>&, _InIte, _Ite __ite)\n     {\n-      _Predicate _M_pred;\n+      return\n+\t_EqualVal<_InIte, typename std::iterator_traits<_Ite>::reference>\n+\t(*__ite);\n+    }\n+#endif\n+} // namespace __ops\n+} // namespace __gnu_cxx\n \n-      _GLIBCXX20_CONSTEXPR\n-      explicit\n-      _Iter_negate(_Predicate __pred)\n-\t: _M_pred(_GLIBCXX_MOVE(__pred))\n-      { }\n \n-      template<typename _Iterator>\n-\t_GLIBCXX20_CONSTEXPR\n-\tbool\n-\toperator()(_Iterator __it)\n-\t{ return !bool(_M_pred(*__it)); }\n+namespace std _GLIBCXX_VISIBILITY(default)\n+{\n+_GLIBCXX_BEGIN_NAMESPACE_VERSION\n+\n+#if __cplusplus >= 201103L\n+  /// Generalized negator.\n+  template<typename _Fn>\n+    class _Not_fn\n+    {\n+      template<typename _Fn2, typename... _Args>\n+\tusing __inv_res_t = typename __invoke_result<_Fn2, _Args...>::type;\n+\n+      template<typename _Tp>\n+\tstatic decltype(!std::declval<_Tp>())\n+\t_S_not() noexcept(noexcept(!std::declval<_Tp>()));\n+\n+    public:\n+      template<typename _Fn2>\n+\tconstexpr\n+\t_Not_fn(_Fn2&& __fn, int)\n+\t: _M_fn(std::forward<_Fn2>(__fn)) { }\n+\n+      _Not_fn(const _Not_fn& __fn) = default;\n+      _Not_fn(_Not_fn&& __fn) = default;\n+      ~_Not_fn() = default;\n+\n+      // Macro to define operator() with given cv-qualifiers ref-qualifiers,\n+      // forwarding _M_fn and the function arguments with the same qualifiers,\n+      // and deducing the return type and exception-specification.\n+# define _GLIBCXX_NOT_FN_CALL_OP( _QUALS )\t\t\t\t\\\n+      template<typename... _Args,\t\t\t\t\t\\\n+\t       typename = __enable_if_t<__is_invocable<_Fn _QUALS, _Args...>::value>> \\\n+\t_GLIBCXX20_CONSTEXPR\t\t\t\t\t\t\\\n+\tdecltype(_S_not<__inv_res_t<_Fn _QUALS, _Args...>>())\t\t\\\n+\toperator()(_Args&&... __args) _QUALS\t\t\t\t\\\n+\tnoexcept(__is_nothrow_invocable<_Fn _QUALS, _Args...>::value\t\\\n+\t    && noexcept(_S_not<__inv_res_t<_Fn _QUALS, _Args...>>()))\t\\\n+\t{\t\t\t\t\t\t\t\t\\\n+\t  return !std::__invoke(std::forward< _Fn _QUALS >(_M_fn),\t\\\n+\t\t\t\tstd::forward<_Args>(__args)...);\t\\\n+\t}\t\t\t\t\t\t\t\t\\\n+\t\t\t\t\t\t\t\t\t\\\n+      template<typename... _Args,\t\t\t\t\t\\\n+\t       typename = __enable_if_t<!__is_invocable<_Fn _QUALS, _Args...>::value>> \\\n+\tvoid operator()(_Args&&... __args) _QUALS = delete;\n+\n+      _GLIBCXX_NOT_FN_CALL_OP( & )\n+      _GLIBCXX_NOT_FN_CALL_OP( const & )\n+      _GLIBCXX_NOT_FN_CALL_OP( && )\n+      _GLIBCXX_NOT_FN_CALL_OP( const && )\n+# undef _GLIBCXX_NOT_FN_CALL_OP\n+#else\n+  /// Generalized negator.\n+  template<typename _Fn, typename _Ite>\n+    class _Not_fn\n+    {\n+    public:\n+      _Not_fn(_Fn __fn)\n+      : _M_fn(__fn) { }\n+\n+      bool\n+      operator()(typename std::iterator_traits<_Ite>::reference __arg)\n+      { return !bool(_M_fn(__arg)); }\n+#endif\n+    private:\n+      _Fn _M_fn;\n     };\n \n-  template<typename _Predicate>\n-    _GLIBCXX20_CONSTEXPR\n-    inline _Iter_negate<_Predicate>\n-    __negate(_Iter_pred<_Predicate> __pred)\n-    { return _Iter_negate<_Predicate>(_GLIBCXX_MOVE(__pred._M_pred)); }\n+  template<typename _Fn, typename _Ite>\n+    inline _GLIBCXX20_CONSTEXPR\n+#if __cplusplus >= 201103L\n+    _Not_fn<std::__decay_t<_Fn>>\n+    __not_fn(_Fn&& __fn, _Ite)\n+    noexcept(std::is_nothrow_constructible<std::__decay_t<_Fn>, _Fn&&>::value)\n+    { return _Not_fn<std::__decay_t<_Fn>>{std::forward<_Fn>(__fn), 0}; }\n+#else\n+    _Not_fn<_Fn, _Ite>\n+    __not_fn(_Fn __fn, _Ite)\n+    { return _Not_fn<_Fn, _Ite>(__fn); }\n+#endif\n \n-} // namespace __ops\n-} // namespace __gnu_cxx\n+_GLIBCXX_END_NAMESPACE_VERSION\n+} // namespace std\n \n #endif\ndiff --git a/libstdc++-v3/include/bits/stl_algo.h b/libstdc++-v3/include/bits/stl_algo.h\nindex 81a2457ae6f2..bfb729ef5fd4 100644\n--- a/libstdc++-v3/include/bits/stl_algo.h\n+++ b/libstdc++-v3/include/bits/stl_algo.h\n@@ -85,21 +85,21 @@ _GLIBCXX_BEGIN_NAMESPACE_VERSION\n   template<typename _Iterator, typename _Compare>\n     _GLIBCXX20_CONSTEXPR\n     void\n-    __move_median_to_first(_Iterator __result,_Iterator __a, _Iterator __b,\n-\t\t\t   _Iterator __c, _Compare __comp)\n+    __move_median_to_first(_Iterator __result, _Iterator __a, _Iterator __b,\n+\t\t\t   _Iterator __c, _GLIBCXX_CP_FWDREF(_Compare) __comp)\n     {\n-      if (__comp(__a, __b))\n+      if (__comp(*__a, *__b))\n \t{\n-\t  if (__comp(__b, __c))\n+\t  if (__comp(*__b, *__c))\n \t    std::iter_swap(__result, __b);\n-\t  else if (__comp(__a, __c))\n+\t  else if (__comp(*__a, *__c))\n \t    std::iter_swap(__result, __c);\n \t  else\n \t    std::iter_swap(__result, __a);\n \t}\n-      else if (__comp(__a, __c))\n+      else if (__comp(*__a, *__c))\n \tstd::iter_swap(__result, __a);\n-      else if (__comp(__b, __c))\n+      else if (__comp(*__b, *__c))\n \tstd::iter_swap(__result, __c);\n       else\n \tstd::iter_swap(__result, __b);\n@@ -110,10 +110,10 @@ _GLIBCXX_BEGIN_NAMESPACE_VERSION\n     _GLIBCXX20_CONSTEXPR\n     inline _InputIterator\n     __find_if_not(_InputIterator __first, _InputIterator __last,\n-\t\t  _Predicate __pred)\n+\t\t  _GLIBCXX_CP_FWDREF(_Predicate) __pred)\n     {\n       return std::__find_if(__first, __last,\n-\t\t\t    __gnu_cxx::__ops::__negate(__pred));\n+\tstd::__not_fn(_GLIBCXX_FORWARD(_Predicate, __pred), __first));\n     }\n \n   /// Like find_if_not(), but uses and updates a count of the\n@@ -122,10 +122,11 @@ _GLIBCXX_BEGIN_NAMESPACE_VERSION\n   template<typename _InputIterator, typename _Predicate, typename _Distance>\n     _GLIBCXX20_CONSTEXPR\n     _InputIterator\n-    __find_if_not_n(_InputIterator __first, _Distance& __len, _Predicate __pred)\n+    __find_if_not_n(_InputIterator __first, _Distance& __len,\n+\t\t    _GLIBCXX_CP_FWDREF(_Predicate) __pred)\n     {\n       for (; __len; --__len,  (void) ++__first)\n-\tif (!__pred(__first))\n+\tif (!__pred(*__first))\n \t  break;\n       return __first;\n     }\n@@ -152,7 +153,8 @@ _GLIBCXX_BEGIN_NAMESPACE_VERSION\n     _GLIBCXX20_CONSTEXPR\n     _ForwardIterator\n     __search_n_aux(_ForwardIterator __first, _ForwardIterator __last,\n-\t\t   _Integer __count, _UnaryPredicate __unary_pred,\n+\t\t   _Integer __count,\n+\t\t   _GLIBCXX_CP_FWDREF(_UnaryPredicate) __unary_pred,\n \t\t   std::forward_iterator_tag)\n     {\n       __first = std::__find_if(__first, __last, __unary_pred);\n@@ -162,7 +164,7 @@ _GLIBCXX_BEGIN_NAMESPACE_VERSION\n \t    __n = __count;\n \t  _ForwardIterator __i = __first;\n \t  ++__i;\n-\t  while (__i != __last && __n != 1 && __unary_pred(__i))\n+\t  while (__i != __last && __n != 1 && __unary_pred(*__i))\n \t    {\n \t      ++__i;\n \t      --__n;\n@@ -185,7 +187,8 @@ _GLIBCXX_BEGIN_NAMESPACE_VERSION\n     _GLIBCXX20_CONSTEXPR\n     _RandomAccessIter\n     __search_n_aux(_RandomAccessIter __first, _RandomAccessIter __last,\n-\t\t   _Integer __count, _UnaryPredicate __unary_pred,\n+\t\t   _Integer __count,\n+\t\t   _GLIBCXX_CP_FWDREF(_UnaryPredicate) __unary_pred,\n \t\t   std::random_access_iterator_tag)\n     {\n       typedef typename std::iterator_traits<_RandomAccessIter>::difference_type\n@@ -201,7 +204,7 @@ _GLIBCXX_BEGIN_NAMESPACE_VERSION\n \t  // __first here is always pointing to one past the last element of\n \t  // next possible match.\n \t  _RandomAccessIter __backTrack = __first;\n-\t  while (__unary_pred(--__backTrack))\n+\t  while (__unary_pred(*(--__backTrack)))\n \t    {\n \t      if (--__remainder == 0)\n \t\treturn (__first - __count); // Success\n@@ -217,15 +220,17 @@ _GLIBCXX_BEGIN_NAMESPACE_VERSION\n     _ForwardIterator\n     __search_n(_ForwardIterator __first, _ForwardIterator __last,\n \t       _Integer __count,\n-\t       _UnaryPredicate __unary_pred)\n+\t       _GLIBCXX_CP_FWDREF(_UnaryPredicate) __unary_pred)\n     {\n       if (__count <= 0)\n \treturn __first;\n \n       if (__count == 1)\n-\treturn std::__find_if(__first, __last, __unary_pred);\n+\treturn std::__find_if(__first, __last,\n+\t\t\t      _GLIBCXX_FORWARD(_UnaryPredicate, __unary_pred));\n \n-      return std::__search_n_aux(__first, __last, __count, __unary_pred,\n+      return std::__search_n_aux(__first, __last, __count,\n+\t\t\t\t_GLIBCXX_FORWARD(_UnaryPredicate, __unary_pred),\n \t\t\t\t std::__iterator_category(__first));\n     }\n \n@@ -237,7 +242,7 @@ _GLIBCXX_BEGIN_NAMESPACE_VERSION\n     __find_end(_ForwardIterator1 __first1, _ForwardIterator1 __last1,\n \t       _ForwardIterator2 __first2, _ForwardIterator2 __last2,\n \t       forward_iterator_tag, forward_iterator_tag,\n-\t       _BinaryPredicate __comp)\n+\t       _GLIBCXX_CP_FWDREF(_BinaryPredicate) __comp)\n     {\n       if (__first2 == __last2)\n \treturn __last1;\n@@ -268,7 +273,7 @@ _GLIBCXX_BEGIN_NAMESPACE_VERSION\n \t       _BidirectionalIterator2 __first2,\n \t       _BidirectionalIterator2 __last2,\n \t       bidirectional_iterator_tag, bidirectional_iterator_tag,\n-\t       _BinaryPredicate __comp)\n+\t       _GLIBCXX_CP_FWDREF(_BinaryPredicate) __comp)\n     {\n       // concept requirements\n       __glibcxx_function_requires(_BidirectionalIteratorConcept<\n@@ -283,7 +288,7 @@ _GLIBCXX_BEGIN_NAMESPACE_VERSION\n       _RevIterator2 __rlast2(__first2);\n       _RevIterator1 __rresult = std::__search(_RevIterator1(__last1), __rlast1,\n \t\t\t\t\t      _RevIterator2(__last2), __rlast2,\n-\t\t\t\t\t      __comp);\n+\t\t\t\t_GLIBCXX_FORWARD(_BinaryPredicate, __comp));\n \n       if (__rresult == __rlast1)\n \treturn __last1;\n@@ -339,7 +344,7 @@ _GLIBCXX_BEGIN_NAMESPACE_VERSION\n       return std::__find_end(__first1, __last1, __first2, __last2,\n \t\t\t     std::__iterator_category(__first1),\n \t\t\t     std::__iterator_category(__first2),\n-\t\t\t     __gnu_cxx::__ops::__iter_equal_to_iter());\n+\t\t\t     __gnu_cxx::__ops::__equal_to(__first1, __first2));\n     }\n \n   /**\n@@ -390,7 +395,7 @@ _GLIBCXX_BEGIN_NAMESPACE_VERSION\n       return std::__find_end(__first1, __last1, __first2, __last2,\n \t\t\t     std::__iterator_category(__first1),\n \t\t\t     std::__iterator_category(__first2),\n-\t\t\t     __gnu_cxx::__ops::__iter_comp_iter(__comp));\n+\t\t\t     _GLIBCXX_MOVE(__comp));\n     }\n \n #if __cplusplus >= 201103L\n@@ -410,7 +415,7 @@ _GLIBCXX_BEGIN_NAMESPACE_VERSION\n     _GLIBCXX_NODISCARD _GLIBCXX20_CONSTEXPR\n     inline bool\n     all_of(_InputIterator __first, _InputIterator __last, _Predicate __pred)\n-    { return __last == std::find_if_not(__first, __last, __pred); }\n+    { return __last == std::find_if_not(__first, __last, std::move(__pred)); }\n \n   /**\n    *  @brief  Checks that a predicate is false for all the elements\n@@ -428,7 +433,10 @@ _GLIBCXX_BEGIN_NAMESPACE_VERSION\n     _GLIBCXX_NODISCARD _GLIBCXX20_CONSTEXPR\n     inline bool\n     none_of(_InputIterator __first, _InputIterator __last, _Predicate __pred)\n-    { return __last == _GLIBCXX_STD_A::find_if(__first, __last, __pred); }\n+    {\n+      return\n+\t__last == _GLIBCXX_STD_A::find_if(__first, __last, std::move(__pred));\n+    }\n \n   /**\n    *  @brief  Checks that a predicate is true for at least one element\n@@ -447,7 +455,7 @@ _GLIBCXX_BEGIN_NAMESPACE_VERSION\n     _GLIBCXX_NODISCARD _GLIBCXX20_CONSTEXPR\n     inline bool\n     any_of(_InputIterator __first, _InputIterator __last, _Predicate __pred)\n-    { return !std::none_of(__first, __last, __pred); }\n+    { return !std::none_of(__first, __last, std::move(__pred)); }\n \n   /**\n    *  @brief  Find the first element in a sequence for which a\n@@ -470,8 +478,7 @@ _GLIBCXX_BEGIN_NAMESPACE_VERSION\n       __glibcxx_function_requires(_UnaryPredicateConcept<_Predicate,\n \t      typename iterator_traits<_InputIterator>::value_type>)\n       __glibcxx_requires_valid_range(__first, __last);\n-      return std::__find_if_not(__first, __last,\n-\t\t\t\t__gnu_cxx::__ops::__pred_iter(__pred));\n+      return std::__find_if_not(__first, __last, std::move(__pred));\n     }\n \n   /**\n@@ -494,7 +501,7 @@ _GLIBCXX_BEGIN_NAMESPACE_VERSION\n       if (__first == __last)\n \treturn true;\n       ++__first;\n-      return std::none_of(__first, __last, __pred);\n+      return std::none_of(__first, __last, std::move(__pred));\n     }\n \n   /**\n@@ -541,17 +548,18 @@ _GLIBCXX_BEGIN_NAMESPACE_VERSION\n \t}\n       return __first;\n     }\n-#endif\n+#endif // C++11\n \n   template<typename _InputIterator, typename _OutputIterator,\n \t   typename _Predicate>\n     _GLIBCXX20_CONSTEXPR\n     _OutputIterator\n     __remove_copy_if(_InputIterator __first, _InputIterator __last,\n-\t\t     _OutputIterator __result, _Predicate __pred)\n+\t\t     _OutputIterator __result,\n+\t\t     _GLIBCXX_CP_FWDREF(_Predicate) __pred)\n     {\n       for (; __first != __last; ++__first)\n-\tif (!__pred(__first))\n+\tif (!__pred(*__first))\n \t  {\n \t    *__result = *__first;\n \t    ++__result;\n@@ -588,7 +596,7 @@ _GLIBCXX_BEGIN_NAMESPACE_VERSION\n       __glibcxx_requires_valid_range(__first, __last);\n \n       return std::__remove_copy_if(__first, __last, __result,\n-\t__gnu_cxx::__ops::__iter_equals_val(__value));\n+\t__gnu_cxx::__ops::__equal_val(__first, __value));\n     }\n \n   /**\n@@ -622,7 +630,7 @@ _GLIBCXX_BEGIN_NAMESPACE_VERSION\n       __glibcxx_requires_valid_range(__first, __last);\n \n       return std::__remove_copy_if(__first, __last, __result,\n-\t\t\t\t   __gnu_cxx::__ops::__pred_iter(__pred));\n+\t\t\t\t   _GLIBCXX_MOVE(__pred));\n     }\n \n #if __cplusplus >= 201103L\n@@ -780,7 +788,7 @@ _GLIBCXX_BEGIN_NAMESPACE_VERSION\n       __glibcxx_requires_valid_range(__first, __last);\n \n       return std::__remove_if(__first, __last,\n-\t\t__gnu_cxx::__ops::__iter_equals_val(__value));\n+\t__gnu_cxx::__ops::__equal_val(__first, __value));\n     }\n \n   /**\n@@ -814,21 +822,21 @@ _GLIBCXX_BEGIN_NAMESPACE_VERSION\n       __glibcxx_requires_valid_range(__first, __last);\n \n       return std::__remove_if(__first, __last,\n-\t\t\t      __gnu_cxx::__ops::__pred_iter(__pred));\n+\t\t\t      _GLIBCXX_MOVE(__pred));\n     }\n \n   template<typename _ForwardIterator, typename _BinaryPredicate>\n     _GLIBCXX20_CONSTEXPR\n     _ForwardIterator\n     __adjacent_find(_ForwardIterator __first, _ForwardIterator __last,\n-\t\t    _BinaryPredicate __binary_pred)\n+\t\t    _GLIBCXX_CP_FWDREF(_BinaryPredicate) __binary_pred)\n     {\n       if (__first == __last)\n \treturn __last;\n       _ForwardIterator __next = __first;\n       while (++__next != __last)\n \t{\n-\t  if (__binary_pred(__first, __next))\n+\t  if (__binary_pred(*__first, *__next))\n \t    return __first;\n \t  __first = __next;\n \t}\n@@ -839,7 +847,7 @@ _GLIBCXX_BEGIN_NAMESPACE_VERSION\n     _GLIBCXX20_CONSTEXPR\n     _ForwardIterator\n     __unique(_ForwardIterator __first, _ForwardIterator __last,\n-\t     _BinaryPredicate __binary_pred)\n+\t     _GLIBCXX_CP_FWDREF(_BinaryPredicate) __binary_pred)\n     {\n       // Skip the beginning, if already unique.\n       __first = std::__adjacent_find(__first, __last, __binary_pred);\n@@ -850,7 +858,7 @@ _GLIBCXX_BEGIN_NAMESPACE_VERSION\n       _ForwardIterator __dest = __first;\n       ++__first;\n       while (++__first != __last)\n-\tif (!__binary_pred(__dest, __first))\n+\tif (!__binary_pred(*__dest, *__first))\n \t  *++__dest = _GLIBCXX_MOVE(*__first);\n       return ++__dest;\n     }\n@@ -882,7 +890,7 @@ _GLIBCXX_BEGIN_NAMESPACE_VERSION\n       __glibcxx_requires_valid_range(__first, __last);\n \n       return std::__unique(__first, __last,\n-\t\t\t   __gnu_cxx::__ops::__iter_equal_to_iter());\n+\t__gnu_cxx::__ops::__equal_to(__first));\n     }\n \n   /**\n@@ -915,7 +923,7 @@ _GLIBCXX_BEGIN_NAMESPACE_VERSION\n       __glibcxx_requires_valid_range(__first, __last);\n \n       return std::__unique(__first, __last,\n-\t\t\t   __gnu_cxx::__ops::__iter_comp_iter(__binary_pred));\n+\t\t\t   _GLIBCXX_MOVE(__binary_pred));\n     }\n \n   // _GLIBCXX_RESOLVE_LIB_DEFECTS\n@@ -928,13 +936,14 @@ _GLIBCXX_BEGIN_NAMESPACE_VERSION\n     _GLIBCXX20_CONSTEXPR\n     _OutputIterator\n     __unique_copy(_ForwardIterator __first, _ForwardIterator __last,\n-\t\t  _OutputIterator __result, _BinaryPredicate __binary_pred,\n+\t\t  _OutputIterator __result,\n+\t\t  _GLIBCXX_CP_FWDREF(_BinaryPredicate) __binary_pred,\n \t\t  forward_iterator_tag)\n     {\n       _ForwardIterator __prev = __first;\n       *__result = *__first;\n       while (++__first != __last)\n-\tif (!__binary_pred(__prev, __first))\n+\tif (!__binary_pred(*__prev, *__first))\n \t  {\n \t    *++__result = *__first;\n \t    __prev = __first;\n@@ -949,14 +958,20 @@ _GLIBCXX_BEGIN_NAMESPACE_VERSION\n     _GLIBCXX20_CONSTEXPR\n     _OutputIterator\n     __unique_copy_1(_InputIterator __first, _InputIterator __last,\n-\t\t    _OutputIterator __result, _BinaryPredicate __binary_pred,\n+\t\t    _OutputIterator __result,\n+\t\t    _GLIBCXX_CP_FWDREF(_BinaryPredicate) __binary_pred,\n \t\t    __false_type)\n     {\n       typedef typename iterator_traits<_InputIterator>::value_type _Val;\n       _Val __value = *__first;\n+      __decltype(__gnu_cxx::__ops::__equal_to_val\n+\t\t (_GLIBCXX_FORWARD(_BinaryPredicate, __binary_pred),\n+\t\t  __first, __value)) __bnry_pred =\n+\t__gnu_cxx::__ops::__equal_to_val\n+\t(_GLIBCXX_FORWARD(_BinaryPredicate, __binary_pred), __first, __value);\n       *__result = __value;\n       while (++__first != __last)\n-\tif (!__binary_pred(std::__addressof(__value), __first))\n+\tif (!__bnry_pred(__value, *__first))\n \t  {\n \t    __value = *__first;\n \t    *++__result = __value;\n@@ -970,12 +985,13 @@ _GLIBCXX_BEGIN_NAMESPACE_VERSION\n \t   typename _BinaryPredicate>\n     _ForwardIterator\n     __unique_copy_1(_InputIterator __first, _InputIterator __last,\n-\t\t    _ForwardIterator __result, _BinaryPredicate __binary_pred,\n+\t\t    _ForwardIterator __result,\n+\t\t    _GLIBCXX_CP_FWDREF(_BinaryPredicate) __binary_pred,\n \t\t    __true_type)\n     {\n       *__result = *__first;\n       while (++__first != __last)\n-\tif (!__binary_pred(__result, __first))\n+\tif (!__binary_pred(*__result, *__first))\n \t  *++__result = *__first;\n       return ++__result;\n     }\n@@ -1385,7 +1401,7 @@ _GLIBCXX_END_INLINE_ABI_NAMESPACE(_V2)\n     _GLIBCXX20_CONSTEXPR\n     _ForwardIterator\n     __partition(_ForwardIterator __first, _ForwardIterator __last,\n-\t\t_Predicate __pred, forward_iterator_tag)\n+\t\t_GLIBCXX_CP_FWDREF(_Predicate) __pred, forward_iterator_tag)\n     {\n       if (__first == __last)\n \treturn __first;\n@@ -1411,7 +1427,7 @@ _GLIBCXX_END_INLINE_ABI_NAMESPACE(_V2)\n     _GLIBCXX20_CONSTEXPR\n     _BidirectionalIterator\n     __partition(_BidirectionalIterator __first, _BidirectionalIterator __last,\n-\t\t_Predicate __pred, bidirectional_iterator_tag)\n+\t\t_GLIBCXX_CP_FWDREF(_Predicate) __pred, bidirectional_iterator_tag)\n     {\n       while (true)\n \t{\n@@ -1450,7 +1466,8 @@ _GLIBCXX_END_INLINE_ABI_NAMESPACE(_V2)\n     _ForwardIterator\n     __stable_partition_adaptive(_ForwardIterator __first,\n \t\t\t\t_ForwardIterator __last,\n-\t\t\t\t_Predicate __pred, _Distance __len,\n+\t\t\t\t_GLIBCXX_CP_FWDREF(_Predicate) __pred,\n+\t\t\t\t_Distance __len,\n \t\t\t\t_Pointer __buffer,\n \t\t\t\t_Distance __buffer_size)\n     {\n@@ -1469,7 +1486,7 @@ _GLIBCXX_END_INLINE_ABI_NAMESPACE(_V2)\n \t  ++__result2;\n \t  ++__first;\n \t  for (; __first != __last; ++__first)\n-\t    if (__pred(__first))\n+\t    if (__pred(*__first))\n \t      {\n \t\t*__result1 = _GLIBCXX_MOVE(*__first);\n \t\t++__result1;\n@@ -1499,7 +1516,8 @@ _GLIBCXX_END_INLINE_ABI_NAMESPACE(_V2)\n \n       if (__right_len)\n \t__right_split =\n-\t  std::__stable_partition_adaptive(__right_split, __last, __pred,\n+\t  std::__stable_partition_adaptive(__right_split, __last,\n+\t\t\t\t\t   _GLIBCXX_FORWARD(_Predicate, __pred),\n \t\t\t\t\t   __right_len,\n \t\t\t\t\t   __buffer, __buffer_size);\n \n@@ -1510,7 +1528,7 @@ _GLIBCXX_END_INLINE_ABI_NAMESPACE(_V2)\n     _GLIBCXX26_CONSTEXPR\n     _ForwardIterator\n     __stable_partition(_ForwardIterator __first, _ForwardIterator __last,\n-\t\t       _Predicate __pred)\n+\t\t       _GLIBCXX_CP_FWDREF(_Predicate) __pred)\n     {\n       __first = std::__find_if_not(__first, __last, __pred);\n \n@@ -1539,7 +1557,8 @@ _GLIBCXX_END_INLINE_ABI_NAMESPACE(_V2)\n       _Temporary_buffer<_ForwardIterator, _ValueType>\n \t__buf(__first, __len);\n       return\n-\tstd::__stable_partition_adaptive(__first, __last, __pred,\n+\tstd::__stable_partition_adaptive(__first, __last,\n+\t\t\t\t\t _GLIBCXX_FORWARD(_Predicate, __pred),\n \t\t\t\t\t __len,\n \t\t\t\t\t __buf.begin(),\n \t\t\t\t\t _DistanceType(__buf.size()));\n@@ -1576,7 +1595,7 @@ _GLIBCXX_END_INLINE_ABI_NAMESPACE(_V2)\n       __glibcxx_requires_valid_range(__first, __last);\n \n       return std::__stable_partition(__first, __last,\n-\t\t\t\t     __gnu_cxx::__ops::__pred_iter(__pred));\n+\t\t\t\t     _GLIBCXX_MOVE(__pred));\n     }\n #endif // HOSTED\n \n@@ -1588,11 +1607,12 @@ _GLIBCXX_END_INLINE_ABI_NAMESPACE(_V2)\n     void\n     __heap_select(_RandomAccessIterator __first,\n \t\t  _RandomAccessIterator __middle,\n-\t\t  _RandomAccessIterator __last, _Compare __comp)\n+\t\t  _RandomAccessIterator __last,\n+\t\t  _GLIBCXX_CP_FWDREF(_Compare) __comp)\n     {\n       std::__make_heap(__first, __middle, __comp);\n       for (_RandomAccessIterator __i = __middle; __i < __last; ++__i)\n-\tif (__comp(__i, __first))\n+\tif (__comp(*__i, *__first))\n \t  std::__pop_heap(__first, __middle, __i, __comp);\n     }\n \n@@ -1605,7 +1625,7 @@ _GLIBCXX_END_INLINE_ABI_NAMESPACE(_V2)\n     __partial_sort_copy(_InputIterator __first, _InputIterator __last,\n \t\t\t_RandomAccessIterator __result_first,\n \t\t\t_RandomAccessIterator __result_last,\n-\t\t\t_Compare __comp)\n+\t\t\t_GLIBCXX_CP_FWDREF(_Compare) __comp)\n     {\n       typedef typename iterator_traits<_InputIterator>::value_type\n \t_InputValueType;\n@@ -1625,14 +1645,15 @@ _GLIBCXX_END_INLINE_ABI_NAMESPACE(_V2)\n       std::__make_heap(__result_first, __result_real_last, __comp);\n       while (__first != __last)\n \t{\n-\t  if (__comp(__first, __result_first))\n+\t  if (__comp(*__first, *__result_first))\n \t    std::__adjust_heap(__result_first, _DistanceType(0),\n \t\t\t       _DistanceType(__result_real_last\n \t\t\t\t\t     - __result_first),\n \t\t\t       _InputValueType(*__first), __comp);\n \t  ++__first;\n \t}\n-      std::__sort_heap(__result_first, __result_real_last, __comp);\n+      std::__sort_heap(__result_first, __result_real_last,\n+\t\t       _GLIBCXX_FORWARD(_Compare, __comp));\n       return __result_real_last;\n     }\n \n@@ -1683,7 +1704,7 @@ _GLIBCXX_END_INLINE_ABI_NAMESPACE(_V2)\n \n       return std::__partial_sort_copy(__first, __last,\n \t\t\t\t      __result_first, __result_last,\n-\t\t\t\t      __gnu_cxx::__ops::__iter_less_iter());\n+\t__gnu_cxx::__ops::__less(__first, __result_first));\n     }\n \n   /**\n@@ -1738,7 +1759,7 @@ _GLIBCXX_END_INLINE_ABI_NAMESPACE(_V2)\n \n       return std::__partial_sort_copy(__first, __last,\n \t\t\t\t      __result_first, __result_last,\n-\t\t\t\t__gnu_cxx::__ops::__iter_comp_iter(__comp));\n+\t\t\t\t      _GLIBCXX_MOVE(__comp));\n     }\n \n   /// @cond undocumented\n@@ -1748,13 +1769,13 @@ _GLIBCXX_END_INLINE_ABI_NAMESPACE(_V2)\n     _GLIBCXX20_CONSTEXPR\n     void\n     __unguarded_linear_insert(_RandomAccessIterator __last,\n-\t\t\t      _Compare __comp)\n+\t\t\t      _GLIBCXX_CP_FWDREF(_Compare) __comp)\n     {\n       typename iterator_traits<_RandomAccessIterator>::value_type\n \t__val = _GLIBCXX_MOVE(*__last);\n       _RandomAccessIterator __next = __last;\n       --__next;\n-      while (__comp(__val, __next))\n+      while (__comp(__val, *__next))\n \t{\n \t  *__last = _GLIBCXX_MOVE(*__next);\n \t  __last = __next;\n@@ -1768,13 +1789,14 @@ _GLIBCXX_END_INLINE_ABI_NAMESPACE(_V2)\n     _GLIBCXX20_CONSTEXPR\n     void\n     __insertion_sort(_RandomAccessIterator __first,\n-\t\t     _RandomAccessIterator __last, _Compare __comp)\n+\t\t     _RandomAccessIterator __last,\n+\t\t     _GLIBCXX_CP_FWDREF(_Compare) __comp)\n     {\n       if (__first == __last) return;\n \n       for (_RandomAccessIterator __i = __first + 1; __i != __last; ++__i)\n \t{\n-\t  if (__comp(__i, __first))\n+\t  if (__comp(*__i, *__first))\n \t    {\n \t      typename iterator_traits<_RandomAccessIterator>::value_type\n \t\t__val = _GLIBCXX_MOVE(*__i);\n@@ -1782,8 +1804,7 @@ _GLIBCXX_END_INLINE_ABI_NAMESPACE(_V2)\n \t      *__first = _GLIBCXX_MOVE(__val);\n \t    }\n \t  else\n-\t    std::__unguarded_linear_insert(__i,\n-\t\t\t\t__gnu_cxx::__ops::__val_comp_iter(__comp));\n+\t    std::__unguarded_linear_insert(__i, __comp);\n \t}\n     }\n \n@@ -1792,11 +1813,11 @@ _GLIBCXX_END_INLINE_ABI_NAMESPACE(_V2)\n     _GLIBCXX20_CONSTEXPR\n     inline void\n     __unguarded_insertion_sort(_RandomAccessIterator __first,\n-\t\t\t       _RandomAccessIterator __last, _Compare __comp)\n+\t\t\t       _RandomAccessIterator __last,\n+\t\t\t       _GLIBCXX_CP_FWDREF(_Compare) __comp)\n     {\n       for (_RandomAccessIterator __i = __first; __i != __last; ++__i)\n-\tstd::__unguarded_linear_insert(__i,\n-\t\t\t\t__gnu_cxx::__ops::__val_comp_iter(__comp));\n+\tstd::__unguarded_linear_insert(__i, __comp);\n     }\n \n   /**\n@@ -1810,16 +1831,18 @@ _GLIBCXX_END_INLINE_ABI_NAMESPACE(_V2)\n     _GLIBCXX20_CONSTEXPR\n     void\n     __final_insertion_sort(_RandomAccessIterator __first,\n-\t\t\t   _RandomAccessIterator __last, _Compare __comp)\n+\t\t\t   _RandomAccessIterator __last,\n+\t\t\t   _GLIBCXX_CP_FWDREF(_Compare) __comp)\n     {\n       if (__last - __first > int(_S_threshold))\n \t{\n \t  std::__insertion_sort(__first, __first + int(_S_threshold), __comp);\n \t  std::__unguarded_insertion_sort(__first + int(_S_threshold), __last,\n-\t\t\t\t\t  __comp);\n+\t\t\t\t\t  _GLIBCXX_FORWARD(_Compare, __comp));\n \t}\n       else\n-\tstd::__insertion_sort(__first, __last, __comp);\n+\tstd::__insertion_sort(__first, __last,\n+\t\t\t      _GLIBCXX_FORWARD(_Compare, __comp));\n     }\n \n   /// This is a helper function...\n@@ -1828,14 +1851,15 @@ _GLIBCXX_END_INLINE_ABI_NAMESPACE(_V2)\n     _RandomAccessIterator\n     __unguarded_partition(_RandomAccessIterator __first,\n \t\t\t  _RandomAccessIterator __last,\n-\t\t\t  _RandomAccessIterator __pivot, _Compare __comp)\n+\t\t\t  _RandomAccessIterator __pivot,\n+\t\t\t  _GLIBCXX_CP_FWDREF(_Compare) __comp)\n     {\n       while (true)\n \t{\n-\t  while (__comp(__first, __pivot))\n+\t  while (__comp(*__first, *__pivot))\n \t    ++__first;\n \t  --__last;\n-\t  while (__comp(__pivot, __last))\n+\t  while (__comp(*__pivot, *__last))\n \t    --__last;\n \t  if (!(__first < __last))\n \t    return __first;\n@@ -1849,12 +1873,14 @@ _GLIBCXX_END_INLINE_ABI_NAMESPACE(_V2)\n     _GLIBCXX20_CONSTEXPR\n     inline _RandomAccessIterator\n     __unguarded_partition_pivot(_RandomAccessIterator __first,\n-\t\t\t\t_RandomAccessIterator __last, _Compare __comp)\n+\t\t\t\t_RandomAccessIterator __last,\n+\t\t\t\t_GLIBCXX_CP_FWDREF(_Compare) __comp)\n     {\n       _RandomAccessIterator __mid = __first + (__last - __first) / 2;\n       std::__move_median_to_first(__first, __first + 1, __mid, __last - 1,\n \t\t\t\t  __comp);\n-      return std::__unguarded_partition(__first + 1, __last, __first, __comp);\n+      return std::__unguarded_partition(__first + 1, __last, __first,\n+\t\t\t\t\t_GLIBCXX_FORWARD(_Compare, __comp));\n     }\n \n   template<typename _RandomAccessIterator, typename _Compare>\n@@ -1863,10 +1889,10 @@ _GLIBCXX_END_INLINE_ABI_NAMESPACE(_V2)\n     __partial_sort(_RandomAccessIterator __first,\n \t\t   _RandomAccessIterator __middle,\n \t\t   _RandomAccessIterator __last,\n-\t\t   _Compare __comp)\n+\t\t   _GLIBCXX_CP_FWDREF(_Compare) __comp)\n     {\n       std::__heap_select(__first, __middle, __last, __comp);\n-      std::__sort_heap(__first, __middle, __comp);\n+      std::__sort_heap(__first, __middle, _GLIBCXX_FORWARD(_Compare, __comp));\n     }\n \n   /// This is a helper function for the sort routine.\n@@ -1875,13 +1901,14 @@ _GLIBCXX_END_INLINE_ABI_NAMESPACE(_V2)\n     void\n     __introsort_loop(_RandomAccessIterator __first,\n \t\t     _RandomAccessIterator __last,\n-\t\t     _Size __depth_limit, _Compare __comp)\n+\t\t     _Size __depth_limit, _GLIBCXX_CP_FWDREF(_Compare) __comp)\n     {\n       while (__last - __first > int(_S_threshold))\n \t{\n \t  if (__depth_limit == 0)\n \t    {\n-\t      std::__partial_sort(__first, __last, __last, __comp);\n+\t      std::__partial_sort(__first, __last, __last,\n+\t\t\t\t  _GLIBCXX_FORWARD(_Compare, __comp));\n \t      return;\n \t    }\n \t  --__depth_limit;\n@@ -1898,14 +1925,15 @@ _GLIBCXX_END_INLINE_ABI_NAMESPACE(_V2)\n     _GLIBCXX20_CONSTEXPR\n     inline void\n     __sort(_RandomAccessIterator __first, _RandomAccessIterator __last,\n-\t   _Compare __comp)\n+\t   _GLIBCXX_CP_FWDREF(_Compare) __comp)\n     {\n       if (__first != __last)\n \t{\n \t  std::__introsort_loop(__first, __last,\n \t\t\t\tstd::__lg(__last - __first) * 2,\n \t\t\t\t__comp);\n-\t  std::__final_insertion_sort(__first, __last, __comp);\n+\t  std::__final_insertion_sort(__first, __last,\n+\t\t\t\t      _GLIBCXX_FORWARD(_Compare, __comp));\n \t}\n     }\n \n@@ -1914,13 +1942,14 @@ _GLIBCXX_END_INLINE_ABI_NAMESPACE(_V2)\n     void\n     __introselect(_RandomAccessIterator __first, _RandomAccessIterator __nth,\n \t\t  _RandomAccessIterator __last, _Size __depth_limit,\n-\t\t  _Compare __comp)\n+\t\t  _GLIBCXX_CP_FWDREF(_Compare) __comp)\n     {\n       while (__last - __first > 3)\n \t{\n \t  if (__depth_limit == 0)\n \t    {\n-\t      std::__heap_select(__first, __nth + 1, __last, __comp);\n+\t      std::__heap_select(__first, __nth + 1, __last,\n+\t\t\t\t _GLIBCXX_FORWARD(_Compare, __comp));\n \t      // Place the nth largest element in its final position.\n \t      std::iter_swap(__first, __nth);\n \t      return;\n@@ -1933,7 +1962,8 @@ _GLIBCXX_END_INLINE_ABI_NAMESPACE(_V2)\n \t  else\n \t    __last = __cut;\n \t}\n-      std::__insertion_sort(__first, __last, __comp);\n+      std::__insertion_sort(__first, __last,\n+\t\t\t    _GLIBCXX_FORWARD(_Compare, __comp));\n     }\n \n   /// @endcond\n@@ -1971,14 +2001,15 @@ _GLIBCXX_END_INLINE_ABI_NAMESPACE(_V2)\n \t\t\t\t\t\t__val, __comp);\n \n       return std::__lower_bound(__first, __last, __val,\n-\t\t\t\t__gnu_cxx::__ops::__iter_comp_val(__comp));\n+\t\t\t\t_GLIBCXX_MOVE(__comp));\n     }\n \n   template<typename _ForwardIterator, typename _Tp, typename _Compare>\n     _GLIBCXX20_CONSTEXPR\n     _ForwardIterator\n     __upper_bound(_ForwardIterator __first, _ForwardIterator __last,\n-\t\t  const _Tp& __val, _Compare __comp)\n+\t\t  _GLIBCXX_FWDREF(_Tp) __val,\n+\t\t  _GLIBCXX_CP_FWDREF(_Compare) __comp)\n     {\n       typedef typename iterator_traits<_ForwardIterator>::difference_type\n \t_DistanceType;\n@@ -1990,7 +2021,7 @@ _GLIBCXX_END_INLINE_ABI_NAMESPACE(_V2)\n \t  _DistanceType __half = __len >> 1;\n \t  _ForwardIterator __middle = __first;\n \t  std::advance(__middle, __half);\n-\t  if (__comp(__val, __middle))\n+\t  if (__comp(__val, *__middle))\n \t    __len = __half;\n \t  else\n \t    {\n@@ -2026,7 +2057,7 @@ _GLIBCXX_END_INLINE_ABI_NAMESPACE(_V2)\n       __glibcxx_requires_partitioned_upper(__first, __last, __val);\n \n       return std::__upper_bound(__first, __last, __val,\n-\t\t\t\t__gnu_cxx::__ops::__val_less_iter());\n+\t\t\t\t__gnu_cxx::__ops::__less_val(__first, __val));\n     }\n \n   /**\n@@ -2058,16 +2089,16 @@ _GLIBCXX_END_INLINE_ABI_NAMESPACE(_V2)\n \t\t\t\t\t\t__val, __comp);\n \n       return std::__upper_bound(__first, __last, __val,\n-\t\t\t\t__gnu_cxx::__ops::__val_comp_iter(__comp));\n+\t\t\t\t_GLIBCXX_MOVE(__comp));\n     }\n \n   template<typename _ForwardIterator, typename _Tp,\n-\t   typename _CompareItTp, typename _CompareTpIt>\n+\t   typename _Comp>\n     _GLIBCXX20_CONSTEXPR\n     pair<_ForwardIterator, _ForwardIterator>\n     __equal_range(_ForwardIterator __first, _ForwardIterator __last,\n \t\t  const _Tp& __val,\n-\t\t  _CompareItTp __comp_it_val, _CompareTpIt __comp_val_it)\n+\t\t  _GLIBCXX_CP_FWDREF(_Comp) __comp)\n     {\n       typedef typename iterator_traits<_ForwardIterator>::difference_type\n \t_DistanceType;\n@@ -2079,21 +2110,22 @@ _GLIBCXX_END_INLINE_ABI_NAMESPACE(_V2)\n \t  _DistanceType __half = __len >> 1;\n \t  _ForwardIterator __middle = __first;\n \t  std::advance(__middle, __half);\n-\t  if (__comp_it_val(__middle, __val))\n+\t  if (__comp(*__middle, __val))\n \t    {\n \t      __first = __middle;\n \t      ++__first;\n \t      __len = __len - __half - 1;\n \t    }\n-\t  else if (__comp_val_it(__val, __middle))\n+\t  else if (__comp(__val, *__middle))\n \t    __len = __half;\n \t  else\n \t    {\n \t      _ForwardIterator __left\n-\t\t= std::__lower_bound(__first, __middle, __val, __comp_it_val);\n+\t\t= std::__lower_bound(__first, __middle, __val, __comp);\n \t      std::advance(__first, __len);\n \t      _ForwardIterator __right\n-\t\t= std::__upper_bound(++__middle, __first, __val, __comp_val_it);\n+\t\t= std::__upper_bound(++__middle, __first, __val,\n+\t\t\t\t     _GLIBCXX_FORWARD(_Comp, __comp));\n \t      return pair<_ForwardIterator, _ForwardIterator>(__left, __right);\n \t    }\n \t}\n@@ -2133,8 +2165,7 @@ _GLIBCXX_END_INLINE_ABI_NAMESPACE(_V2)\n       __glibcxx_requires_partitioned_upper(__first, __last, __val);\n \n       return std::__equal_range(__first, __last, __val,\n-\t\t\t\t__gnu_cxx::__ops::__iter_less_val(),\n-\t\t\t\t__gnu_cxx::__ops::__val_less_iter());\n+\t\t\t\t__gnu_cxx::__ops::__less_val(__first, __val));\n     }\n \n   /**\n@@ -2172,8 +2203,7 @@ _GLIBCXX_END_INLINE_ABI_NAMESPACE(_V2)\n \t\t\t\t\t\t__val, __comp);\n \n       return std::__equal_range(__first, __last, __val,\n-\t\t\t\t__gnu_cxx::__ops::__iter_comp_val(__comp),\n-\t\t\t\t__gnu_cxx::__ops::__val_comp_iter(__comp));\n+\t\t\t\t_GLIBCXX_MOVE(__comp));\n     }\n \n   /**\n@@ -2203,7 +2233,7 @@ _GLIBCXX_END_INLINE_ABI_NAMESPACE(_V2)\n \n       _ForwardIterator __i\n \t= std::__lower_bound(__first, __last, __val,\n-\t\t\t     __gnu_cxx::__ops::__iter_less_val());\n+\t\t\t     __gnu_cxx::__ops::__less_val(__first, __val));\n       return __i != __last && !(__val < *__i);\n     }\n \n@@ -2239,7 +2269,7 @@ _GLIBCXX_END_INLINE_ABI_NAMESPACE(_V2)\n \n       _ForwardIterator __i\n \t= std::__lower_bound(__first, __last, __val,\n-\t\t\t     __gnu_cxx::__ops::__iter_comp_val(__comp));\n+\t\t\t     __comp);\n       return __i != __last && !bool(__comp(__val, *__i));\n     }\n \n@@ -2251,11 +2281,12 @@ _GLIBCXX_END_INLINE_ABI_NAMESPACE(_V2)\n     void\n     __move_merge_adaptive(_InputIterator1 __first1, _InputIterator1 __last1,\n \t\t\t  _InputIterator2 __first2, _InputIterator2 __last2,\n-\t\t\t  _OutputIterator __result, _Compare __comp)\n+\t\t\t  _OutputIterator __result,\n+\t\t\t  _GLIBCXX_CP_FWDREF(_Compare) __comp)\n     {\n       while (__first1 != __last1 && __first2 != __last2)\n \t{\n-\t  if (__comp(__first2, __first1))\n+\t  if (__comp(*__first2, *__first1))\n \t    {\n \t      *__result = _GLIBCXX_MOVE(*__first2);\n \t      ++__first2;\n@@ -2280,7 +2311,7 @@ _GLIBCXX_END_INLINE_ABI_NAMESPACE(_V2)\n \t\t\t\t   _BidirectionalIterator2 __first2,\n \t\t\t\t   _BidirectionalIterator2 __last2,\n \t\t\t\t   _BidirectionalIterator3 __result,\n-\t\t\t\t   _Compare __comp)\n+\t\t\t\t   _GLIBCXX_CP_FWDREF(_Compare) __comp)\n     {\n       if (__first1 == __last1)\n \t{\n@@ -2294,7 +2325,7 @@ _GLIBCXX_END_INLINE_ABI_NAMESPACE(_V2)\n       --__last2;\n       while (true)\n \t{\n-\t  if (__comp(__last2, __last1))\n+\t  if (__comp(*__last2, *__last1))\n \t    {\n \t      *--__result = _GLIBCXX_MOVE(*__last1);\n \t      if (__first1 == __last1)\n@@ -2360,19 +2391,25 @@ _GLIBCXX_END_INLINE_ABI_NAMESPACE(_V2)\n \t\t     _BidirectionalIterator __middle,\n \t\t     _BidirectionalIterator __last,\n \t\t     _Distance __len1, _Distance __len2,\n-\t\t     _Pointer __buffer, _Compare __comp)\n+\t\t     _Pointer __buffer, _GLIBCXX_CP_FWDREF(_Compare) __comp)\n     {\n+      __decltype(__gnu_cxx::__ops::__less(_GLIBCXX_FORWARD(_Compare, __comp),\n+\t\t\t\t\t  __first, __buffer)) __cmp\n+\t= __gnu_cxx::__ops::__less(_GLIBCXX_FORWARD(_Compare, __comp),\n+\t\t\t\t   __first, __buffer);\n       if (__len1 <= __len2)\n \t{\n \t  _Pointer __buffer_end = _GLIBCXX_MOVE3(__first, __middle, __buffer);\n \t  std::__move_merge_adaptive(__buffer, __buffer_end, __middle, __last,\n-\t\t\t\t     __first, __comp);\n+\t\t\t\t     __first,\n+\t\t\t\t     _GLIBCXX_FORWARD(_Compare, __cmp));\n \t}\n       else\n \t{\n \t  _Pointer __buffer_end = _GLIBCXX_MOVE3(__middle, __last, __buffer);\n \t  std::__move_merge_adaptive_backward(__first, __middle, __buffer,\n-\t\t\t\t\t      __buffer_end, __last, __comp);\n+\t\t\t\t\t      __buffer_end, __last,\n+\t\t\t\t\t     _GLIBCXX_FORWARD(_Compare, __cmp));\n \t}\n     }\n \n@@ -2384,11 +2421,12 @@ _GLIBCXX_END_INLINE_ABI_NAMESPACE(_V2)\n \t\t\t    _BidirectionalIterator __last,\n \t\t\t    _Distance __len1, _Distance __len2,\n \t\t\t    _Pointer __buffer, _Distance __buffer_size,\n-\t\t\t    _Compare __comp)\n+\t\t\t    _GLIBCXX_CP_FWDREF(_Compare) __comp)\n     {\n       if (__len1 <= __buffer_size || __len2 <= __buffer_size)\n \tstd::__merge_adaptive(__first, __middle, __last,\n-\t\t\t      __len1, __len2, __buffer, __comp);\n+\t\t\t      __len1, __len2, __buffer,\n+\t\t\t      _GLIBCXX_FORWARD(_Compare, __comp));\n       else\n \t{\n \t  _BidirectionalIterator __first_cut = __first;\n@@ -2400,8 +2438,7 @@ _GLIBCXX_END_INLINE_ABI_NAMESPACE(_V2)\n \t      __len11 = __len1 / 2;\n \t      std::advance(__first_cut, __len11);\n \t      __second_cut\n-\t\t= std::__lower_bound(__middle, __last, *__first_cut,\n-\t\t\t\t     __gnu_cxx::__ops::__iter_comp_val(__comp));\n+\t\t= std::__lower_bound(__middle, __last, *__first_cut, __comp);\n \t      __len22 = std::distance(__middle, __second_cut);\n \t    }\n \t  else\n@@ -2409,8 +2446,7 @@ _GLIBCXX_END_INLINE_ABI_NAMESPACE(_V2)\n \t      __len22 = __len2 / 2;\n \t      std::advance(__second_cut, __len22);\n \t      __first_cut\n-\t\t= std::__upper_bound(__first, __middle, *__second_cut,\n-\t\t\t\t     __gnu_cxx::__ops::__val_comp_iter(__comp));\n+\t\t= std::__upper_bound(__first, __middle, *__second_cut, __comp);\n \t      __len11 = std::distance(__first, __first_cut);\n \t    }\n \n@@ -2424,7 +2460,8 @@ _GLIBCXX_END_INLINE_ABI_NAMESPACE(_V2)\n \t  std::__merge_adaptive_resize(__new_middle, __second_cut, __last,\n \t\t\t\t       _Distance(__len1 - __len11),\n \t\t\t\t       _Distance(__len2 - __len22),\n-\t\t\t\t       __buffer, __buffer_size, __comp);\n+\t\t\t\t       __buffer, __buffer_size,\n+\t\t\t\t       _GLIBCXX_FORWARD(_Compare, __comp));\n \t}\n     }\n \n@@ -2437,14 +2474,14 @@ _GLIBCXX_END_INLINE_ABI_NAMESPACE(_V2)\n \t\t\t   _BidirectionalIterator __middle,\n \t\t\t   _BidirectionalIterator __last,\n \t\t\t   _Distance __len1, _Distance __len2,\n-\t\t\t   _Compare __comp)\n+\t\t\t   _GLIBCXX_CP_FWDREF(_Compare) __comp)\n     {\n       if (__len1 == 0 || __len2 == 0)\n \treturn;\n \n       if (__len1 + __len2 == 2)\n \t{\n-\t  if (__comp(__middle, __first))\n+\t  if (__comp(*__middle, *__first))\n \t    std::iter_swap(__first, __middle);\n \t  return;\n \t}\n@@ -2458,8 +2495,7 @@ _GLIBCXX_END_INLINE_ABI_NAMESPACE(_V2)\n \t  __len11 = __len1 / 2;\n \t  std::advance(__first_cut, __len11);\n \t  __second_cut\n-\t    = std::__lower_bound(__middle, __last, *__first_cut,\n-\t\t\t\t __gnu_cxx::__ops::__iter_comp_val(__comp));\n+\t    = std::__lower_bound(__middle, __last, *__first_cut, __comp);\n \t  __len22 = std::distance(__middle, __second_cut);\n \t}\n       else\n@@ -2467,8 +2503,7 @@ _GLIBCXX_END_INLINE_ABI_NAMESPACE(_V2)\n \t  __len22 = __len2 / 2;\n \t  std::advance(__second_cut, __len22);\n \t  __first_cut\n-\t    = std::__upper_bound(__first, __middle, *__second_cut,\n-\t\t\t\t __gnu_cxx::__ops::__val_comp_iter(__comp));\n+\t    = std::__upper_bound(__first, __middle, *__second_cut, __comp);\n \t  __len11 = std::distance(__first, __first_cut);\n \t}\n \n@@ -2477,7 +2512,8 @@ _GLIBCXX_END_INLINE_ABI_NAMESPACE(_V2)\n       std::__merge_without_buffer(__first, __first_cut, __new_middle,\n \t\t\t\t  __len11, __len22, __comp);\n       std::__merge_without_buffer(__new_middle, __second_cut, __last,\n-\t\t\t\t  __len1 - __len11, __len2 - __len22, __comp);\n+\t\t\t\t  __len1 - __len11, __len2 - __len22,\n+\t\t\t\t  _GLIBCXX_FORWARD(_Compare, __comp));\n     }\n \n   template<typename _BidirectionalIterator, typename _Compare>\n@@ -2486,7 +2522,7 @@ _GLIBCXX_END_INLINE_ABI_NAMESPACE(_V2)\n     __inplace_merge(_BidirectionalIterator __first,\n \t\t    _BidirectionalIterator __middle,\n \t\t    _BidirectionalIterator __last,\n-\t\t    _Compare __comp)\n+\t\t    _GLIBCXX_CP_FWDREF(_Compare) __comp)\n     {\n       typedef typename iterator_traits<_BidirectionalIterator>::value_type\n \t  _ValueType;\n@@ -2513,17 +2549,20 @@ _GLIBCXX_END_INLINE_ABI_NAMESPACE(_V2)\n \n       if (__builtin_expect(__buf.size() == __buf._M_requested_size(), true))\n \tstd::__merge_adaptive\n-\t  (__first, __middle, __last, __len1, __len2, __buf.begin(), __comp);\n+\t  (__first, __middle, __last, __len1, __len2, __buf.begin(),\n+\t   _GLIBCXX_FORWARD(_Compare, __comp));\n       else if (__builtin_expect(__buf.begin() == 0, false))\n \tstd::__merge_without_buffer\n-\t  (__first, __middle, __last, __len1, __len2, __comp);\n+\t  (__first, __middle, __last, __len1, __len2,\n+\t   _GLIBCXX_FORWARD(_Compare, __comp));\n       else\n \tstd::__merge_adaptive_resize\n \t  (__first, __middle, __last, __len1, __len2, __buf.begin(),\n-\t   _DistanceType(__buf.size()), __comp);\n+\t   _DistanceType(__buf.size()), _GLIBCXX_FORWARD(_Compare, __comp));\n #else\n       std::__merge_without_buffer\n-\t(__first, __middle, __last, __len1, __len2, __comp);\n+\t(__first, __middle, __last, __len1, __len2,\n+\t _GLIBCXX_FORWARD(_Compare, __comp));\n #endif\n     }\n \n@@ -2562,7 +2601,7 @@ _GLIBCXX_END_INLINE_ABI_NAMESPACE(_V2)\n       __glibcxx_requires_irreflexive(__first, __last);\n \n       std::__inplace_merge(__first, __middle, __last,\n-\t\t\t   __gnu_cxx::__ops::__iter_less_iter());\n+\t\t\t   __gnu_cxx::__ops::__less(__first));\n     }\n \n   /**\n@@ -2606,7 +2645,7 @@ _GLIBCXX_END_INLINE_ABI_NAMESPACE(_V2)\n       __glibcxx_requires_irreflexive_pred(__first, __last, __comp);\n \n       std::__inplace_merge(__first, __middle, __last,\n-\t\t\t   __gnu_cxx::__ops::__iter_comp_iter(__comp));\n+\t\t\t   _GLIBCXX_MOVE(__comp));\n     }\n \n \n@@ -2616,11 +2655,11 @@ _GLIBCXX_END_INLINE_ABI_NAMESPACE(_V2)\n     _OutputIterator\n     __move_merge(_InputIterator __first1, _InputIterator __last1,\n \t\t _InputIterator __first2, _InputIterator __last2,\n-\t\t _OutputIterator __result, _Compare __comp)\n+\t\t _OutputIterator __result, _GLIBCXX_CP_FWDREF(_Compare) __comp)\n     {\n       while (__first1 != __last1 && __first2 != __last2)\n \t{\n-\t  if (__comp(__first2, __first1))\n+\t  if (__comp(*__first2, *__first1))\n \t    {\n \t      *__result = _GLIBCXX_MOVE(*__first2);\n \t      ++__first2;\n@@ -2643,7 +2682,7 @@ _GLIBCXX_END_INLINE_ABI_NAMESPACE(_V2)\n     __merge_sort_loop(_RandomAccessIterator1 __first,\n \t\t      _RandomAccessIterator1 __last,\n \t\t      _RandomAccessIterator2 __result, _Distance __step_size,\n-\t\t      _Compare __comp)\n+\t\t      _GLIBCXX_CP_FWDREF(_Compare) __comp)\n     {\n       const _Distance __two_step = 2 * __step_size;\n \n@@ -2658,7 +2697,8 @@ _GLIBCXX_END_INLINE_ABI_NAMESPACE(_V2)\n       __step_size = std::min(_Distance(__last - __first), __step_size);\n \n       std::__move_merge(__first, __first + __step_size,\n-\t\t\t__first + __step_size, __last, __result, __comp);\n+\t\t\t__first + __step_size, __last, __result,\n+\t\t\t_GLIBCXX_FORWARD(_Compare, __comp));\n     }\n \n   template<typename _RandomAccessIterator, typename _Distance,\n@@ -2667,14 +2707,16 @@ _GLIBCXX_END_INLINE_ABI_NAMESPACE(_V2)\n     void\n     __chunk_insertion_sort(_RandomAccessIterator __first,\n \t\t\t   _RandomAccessIterator __last,\n-\t\t\t   _Distance __chunk_size, _Compare __comp)\n+\t\t\t   _Distance __chunk_size,\n+\t\t\t   _GLIBCXX_CP_FWDREF(_Compare) __comp)\n     {\n       while (__last - __first >= __chunk_size)\n \t{\n \t  std::__insertion_sort(__first, __first + __chunk_size, __comp);\n \t  __first += __chunk_size;\n \t}\n-      std::__insertion_sort(__first, __last, __comp);\n+      std::__insertion_sort(__first, __last,\n+\t\t\t    _GLIBCXX_FORWARD(_Compare, __comp));\n     }\n \n   enum { _S_chunk_size = 7 };\n@@ -2683,7 +2725,8 @@ _GLIBCXX_END_INLINE_ABI_NAMESPACE(_V2)\n     void\n     __merge_sort_with_buffer(_RandomAccessIterator __first,\n \t\t\t     _RandomAccessIterator __last,\n-\t\t\t     _Pointer __buffer, _Compare __comp)\n+\t\t\t     _Pointer __buffer,\n+\t\t\t     _GLIBCXX_CP_FWDREF(_Compare) __comp)\n     {\n       typedef typename iterator_traits<_RandomAccessIterator>::difference_type\n \t_Distance;\n@@ -2710,14 +2753,17 @@ _GLIBCXX_END_INLINE_ABI_NAMESPACE(_V2)\n     __stable_sort_adaptive(_RandomAccessIterator __first,\n \t\t\t   _RandomAccessIterator __middle,\n \t\t\t   _RandomAccessIterator __last,\n-\t\t\t   _Pointer __buffer, _Compare __comp)\n+\t\t\t   _Pointer __buffer,\n+\t\t\t   _GLIBCXX_CP_FWDREF(_Compare) __comp)\n     {\n-      std::__merge_sort_with_buffer(__first, __middle, __buffer, __comp);\n-      std::__merge_sort_with_buffer(__middle, __last, __buffer, __comp);\n+      __decltype(__gnu_cxx::__ops::__less(__comp, __first, __buffer)) __cmp\n+\t= __gnu_cxx::__ops::__less(__comp, __first, __buffer);\n+      std::__merge_sort_with_buffer(__first, __middle, __buffer, __cmp);\n+      std::__merge_sort_with_buffer(__middle, __last, __buffer, __cmp);\n \n       std::__merge_adaptive(__first, __middle, __last,\n \t\t\t    __middle - __first, __last - __middle,\n-\t\t\t    __buffer, __comp);\n+\t\t\t    __buffer, _GLIBCXX_FORWARD(_Compare, __comp));\n     }\n \n   template<typename _RandomAccessIterator, typename _Pointer,\n@@ -2726,7 +2772,7 @@ _GLIBCXX_END_INLINE_ABI_NAMESPACE(_V2)\n     __stable_sort_adaptive_resize(_RandomAccessIterator __first,\n \t\t\t\t  _RandomAccessIterator __last,\n \t\t\t\t  _Pointer __buffer, _Distance __buffer_size,\n-\t\t\t\t  _Compare __comp)\n+\t\t\t\t  _GLIBCXX_CP_FWDREF(_Compare) __comp)\n     {\n       const _Distance __len = (__last - __first + 1) / 2;\n       const _RandomAccessIterator __middle = __first + __len;\n@@ -2740,11 +2786,11 @@ _GLIBCXX_END_INLINE_ABI_NAMESPACE(_V2)\n \t\t\t\t       _Distance(__middle - __first),\n \t\t\t\t       _Distance(__last - __middle),\n \t\t\t\t       __buffer, __buffer_size,\n-\t\t\t\t       __comp);\n+\t\t\t\t       _GLIBCXX_FORWARD(_Compare, __comp));\n \t}\n       else\n \tstd::__stable_sort_adaptive(__first, __middle, __last,\n-\t\t\t\t    __buffer, __comp);\n+\t\t\t\t__buffer, _GLIBCXX_FORWARD(_Compare, __comp));\n     }\n \n   /// This is a helper function for the stable sorting routines.\n@@ -2752,11 +2798,13 @@ _GLIBCXX_END_INLINE_ABI_NAMESPACE(_V2)\n     _GLIBCXX26_CONSTEXPR\n     void\n     __inplace_stable_sort(_RandomAccessIterator __first,\n-\t\t\t  _RandomAccessIterator __last, _Compare __comp)\n+\t\t\t  _RandomAccessIterator __last,\n+\t\t\t  _GLIBCXX_CP_FWDREF(_Compare) __comp)\n     {\n       if (__last - __first < 15)\n \t{\n-\t  std::__insertion_sort(__first, __last, __comp);\n+\t  std::__insertion_sort(__first, __last,\n+\t\t\t\t_GLIBCXX_FORWARD(_Compare, __comp));\n \t  return;\n \t}\n       _RandomAccessIterator __middle = __first + (__last - __first) / 2;\n@@ -2765,7 +2813,7 @@ _GLIBCXX_END_INLINE_ABI_NAMESPACE(_V2)\n       std::__merge_without_buffer(__first, __middle, __last,\n \t\t\t\t  __middle - __first,\n \t\t\t\t  __last - __middle,\n-\t\t\t\t  __comp);\n+\t\t\t\t  _GLIBCXX_FORWARD(_Compare, __comp));\n     }\n \n   // stable_sort\n@@ -2781,13 +2829,13 @@ _GLIBCXX_END_INLINE_ABI_NAMESPACE(_V2)\n     bool\n     __includes(_InputIterator1 __first1, _InputIterator1 __last1,\n \t       _InputIterator2 __first2, _InputIterator2 __last2,\n-\t       _Compare __comp)\n+\t       _GLIBCXX_CP_FWDREF(_Compare) __comp)\n     {\n       while (__first1 != __last1 && __first2 != __last2)\n \t{\n-\t  if (__comp(__first2, __first1))\n+\t  if (__comp(*__first2, *__first1))\n \t    return false;\n-\t  if (!__comp(__first1, __first2))\n+\t  if (!__comp(*__first1, *__first2))\n \t    ++__first2;\n \t  ++__first1;\n \t}\n@@ -2834,7 +2882,7 @@ _GLIBCXX_END_INLINE_ABI_NAMESPACE(_V2)\n       __glibcxx_requires_irreflexive2(__first2, __last2);\n \n       return std::__includes(__first1, __last1, __first2, __last2,\n-\t\t\t     __gnu_cxx::__ops::__iter_less_iter());\n+\t\t\t     __gnu_cxx::__ops::__less(__first1, __first2));\n     }\n \n   /**\n@@ -2881,7 +2929,7 @@ _GLIBCXX_END_INLINE_ABI_NAMESPACE(_V2)\n       __glibcxx_requires_irreflexive_pred2(__first2, __last2, __comp);\n \n       return std::__includes(__first1, __last1, __first2, __last2,\n-\t\t\t     __gnu_cxx::__ops::__iter_comp_iter(__comp));\n+\t\t\t     _GLIBCXX_MOVE(__comp));\n     }\n \n   // nth_element\n@@ -2898,7 +2946,8 @@ _GLIBCXX_END_INLINE_ABI_NAMESPACE(_V2)\n     _GLIBCXX20_CONSTEXPR\n     bool\n     __next_permutation(_BidirectionalIterator __first,\n-\t\t       _BidirectionalIterator __last, _Compare __comp)\n+\t\t       _BidirectionalIterator __last,\n+\t\t       _GLIBCXX_CP_FWDREF(_Compare) __comp)\n     {\n       if (__first == __last)\n \treturn false;\n@@ -2913,10 +2962,10 @@ _GLIBCXX_END_INLINE_ABI_NAMESPACE(_V2)\n \t{\n \t  _BidirectionalIterator __ii = __i;\n \t  --__i;\n-\t  if (__comp(__i, __ii))\n+\t  if (__comp(*__i, *__ii))\n \t    {\n \t      _BidirectionalIterator __j = __last;\n-\t      while (!__comp(__i, --__j))\n+\t      while (!__comp(*__i, *(--__j)))\n \t\t{}\n \t      std::iter_swap(__i, __j);\n \t      std::__reverse(__ii, __last,\n@@ -2959,7 +3008,7 @@ _GLIBCXX_END_INLINE_ABI_NAMESPACE(_V2)\n       __glibcxx_requires_irreflexive(__first, __last);\n \n       return std::__next_permutation\n-\t(__first, __last, __gnu_cxx::__ops::__iter_less_iter());\n+\t(__first, __last, __gnu_cxx::__ops::__less(__first));\n     }\n \n   /**\n@@ -2993,14 +3042,15 @@ _GLIBCXX_END_INLINE_ABI_NAMESPACE(_V2)\n       __glibcxx_requires_irreflexive_pred(__first, __last, __comp);\n \n       return std::__next_permutation\n-\t(__first, __last, __gnu_cxx::__ops::__iter_comp_iter(__comp));\n+\t(__first, __last, _GLIBCXX_MOVE(__comp));\n     }\n \n   template<typename _BidirectionalIterator, typename _Compare>\n     _GLIBCXX20_CONSTEXPR\n     bool\n     __prev_permutation(_BidirectionalIterator __first,\n-\t\t       _BidirectionalIterator __last, _Compare __comp)\n+\t\t       _BidirectionalIterator __last,\n+\t\t       _GLIBCXX_CP_FWDREF(_Compare) __comp)\n     {\n       if (__first == __last)\n \treturn false;\n@@ -3015,10 +3065,10 @@ _GLIBCXX_END_INLINE_ABI_NAMESPACE(_V2)\n \t{\n \t  _BidirectionalIterator __ii = __i;\n \t  --__i;\n-\t  if (__comp(__ii, __i))\n+\t  if (__comp(*__ii, *__i))\n \t    {\n \t      _BidirectionalIterator __j = __last;\n-\t      while (!__comp(--__j, __i))\n+\t      while (!__comp(*(--__j), *__i))\n \t\t{}\n \t      std::iter_swap(__i, __j);\n \t      std::__reverse(__ii, __last,\n@@ -3062,7 +3112,7 @@ _GLIBCXX_END_INLINE_ABI_NAMESPACE(_V2)\n       __glibcxx_requires_irreflexive(__first, __last);\n \n       return std::__prev_permutation(__first, __last,\n-\t\t\t\t     __gnu_cxx::__ops::__iter_less_iter());\n+\t\t\t\t     __gnu_cxx::__ops::__less(__first));\n     }\n \n   /**\n@@ -3096,7 +3146,7 @@ _GLIBCXX_END_INLINE_ABI_NAMESPACE(_V2)\n       __glibcxx_requires_irreflexive_pred(__first, __last, __comp);\n \n       return std::__prev_permutation(__first, __last,\n-\t\t\t\t__gnu_cxx::__ops::__iter_comp_iter(__comp));\n+\t\t\t\t     _GLIBCXX_MOVE(__comp));\n     }\n \n   // replace\n@@ -3108,10 +3158,11 @@ _GLIBCXX_END_INLINE_ABI_NAMESPACE(_V2)\n     _OutputIterator\n     __replace_copy_if(_InputIterator __first, _InputIterator __last,\n \t\t      _OutputIterator __result,\n-\t\t      _Predicate __pred, const _Tp& __new_value)\n+\t\t      _GLIBCXX_CP_FWDREF(_Predicate) __pred,\n+\t\t      const _Tp& __new_value)\n     {\n       for (; __first != __last; ++__first, (void)++__result)\n-\tif (__pred(__first))\n+\tif (__pred(*__first))\n \t  *__result = __new_value;\n \telse\n \t  *__result = *__first;\n@@ -3148,8 +3199,8 @@ _GLIBCXX_END_INLINE_ABI_NAMESPACE(_V2)\n       __glibcxx_requires_valid_range(__first, __last);\n \n       return std::__replace_copy_if(__first, __last, __result,\n-\t\t\t__gnu_cxx::__ops::__iter_equals_val(__old_value),\n-\t\t\t\t\t      __new_value);\n+\t\t\t__gnu_cxx::__ops::__equal_val(__first, __old_value),\n+\t\t\t\t    __new_value);\n     }\n \n   /**\n@@ -3184,8 +3235,7 @@ _GLIBCXX_END_INLINE_ABI_NAMESPACE(_V2)\n       __glibcxx_requires_valid_range(__first, __last);\n \n       return std::__replace_copy_if(__first, __last, __result,\n-\t\t\t\t__gnu_cxx::__ops::__pred_iter(__pred),\n-\t\t\t\t\t      __new_value);\n+\t\t\t\t    _GLIBCXX_MOVE(__pred), __new_value);\n     }\n \n #if __cplusplus >= 201103L\n@@ -3216,20 +3266,22 @@ _GLIBCXX_END_INLINE_ABI_NAMESPACE(_V2)\n     inline bool\n     is_sorted(_ForwardIterator __first, _ForwardIterator __last,\n \t      _Compare __comp)\n-    { return std::is_sorted_until(__first, __last, __comp) == __last; }\n+    {\n+      return std::is_sorted_until(__first, __last, std::move(__comp)) == __last;\n+    }\n \n   template<typename _ForwardIterator, typename _Compare>\n     _GLIBCXX20_CONSTEXPR\n     _ForwardIterator\n     __is_sorted_until(_ForwardIterator __first, _ForwardIterator __last,\n-\t\t      _Compare __comp)\n+\t\t      _Compare&& __comp)\n     {\n       if (__first == __last)\n \treturn __last;\n \n       _ForwardIterator __next = __first;\n       for (++__next; __next != __last; __first = __next, (void)++__next)\n-\tif (__comp(__next, __first))\n+\tif (__comp(*__next, *__first))\n \t  return __next;\n       return __next;\n     }\n@@ -3255,7 +3307,7 @@ _GLIBCXX_END_INLINE_ABI_NAMESPACE(_V2)\n       __glibcxx_requires_irreflexive(__first, __last);\n \n       return std::__is_sorted_until(__first, __last,\n-\t\t\t\t    __gnu_cxx::__ops::__iter_less_iter());\n+\t\t\t\t    __gnu_cxx::__ops::__less());\n     }\n \n   /**\n@@ -3282,7 +3334,7 @@ _GLIBCXX_END_INLINE_ABI_NAMESPACE(_V2)\n       __glibcxx_requires_irreflexive_pred(__first, __last, __comp);\n \n       return std::__is_sorted_until(__first, __last,\n-\t\t\t\t    __gnu_cxx::__ops::__iter_comp_iter(__comp));\n+\t\t\t\t    std::move(__comp));\n     }\n \n   /**\n@@ -3327,7 +3379,7 @@ _GLIBCXX_END_INLINE_ABI_NAMESPACE(_V2)\n     _GLIBCXX14_CONSTEXPR\n     pair<_ForwardIterator, _ForwardIterator>\n     __minmax_element(_ForwardIterator __first, _ForwardIterator __last,\n-\t\t     _Compare __comp)\n+\t\t     _Compare&& __comp)\n     {\n       _ForwardIterator __next = __first;\n       if (__first == __last\n@@ -3335,7 +3387,7 @@ _GLIBCXX_END_INLINE_ABI_NAMESPACE(_V2)\n \treturn std::make_pair(__first, __first);\n \n       _ForwardIterator __min{}, __max{};\n-      if (__comp(__next, __first))\n+      if (__comp(*__next, *__first))\n \t{\n \t  __min = __next;\n \t  __max = __first;\n@@ -3354,25 +3406,25 @@ _GLIBCXX_END_INLINE_ABI_NAMESPACE(_V2)\n \t  __next = __first;\n \t  if (++__next == __last)\n \t    {\n-\t      if (__comp(__first, __min))\n+\t      if (__comp(*__first, *__min))\n \t\t__min = __first;\n-\t      else if (!__comp(__first, __max))\n+\t      else if (!__comp(*__first, *__max))\n \t\t__max = __first;\n \t      break;\n \t    }\n \n-\t  if (__comp(__next, __first))\n+\t  if (__comp(*__next, *__first))\n \t    {\n-\t      if (__comp(__next, __min))\n+\t      if (__comp(*__next, *__min))\n \t\t__min = __next;\n-\t      if (!__comp(__first, __max))\n+\t      if (!__comp(*__first, *__max))\n \t\t__max = __first;\n \t    }\n \t  else\n \t    {\n-\t      if (__comp(__first, __min))\n+\t      if (__comp(*__first, *__min))\n \t\t__min = __first;\n-\t      if (!__comp(__next, __max))\n+\t      if (!__comp(*__next, *__max))\n \t\t__max = __next;\n \t    }\n \n@@ -3407,7 +3459,7 @@ _GLIBCXX_END_INLINE_ABI_NAMESPACE(_V2)\n       __glibcxx_requires_irreflexive(__first, __last);\n \n       return std::__minmax_element(__first, __last,\n-\t\t\t\t   __gnu_cxx::__ops::__iter_less_iter());\n+\t\t\t\t   __gnu_cxx::__ops::__less());\n     }\n \n   /**\n@@ -3437,7 +3489,7 @@ _GLIBCXX_END_INLINE_ABI_NAMESPACE(_V2)\n       __glibcxx_requires_irreflexive_pred(__first, __last, __comp);\n \n       return std::__minmax_element(__first, __last,\n-\t\t\t\t   __gnu_cxx::__ops::__iter_comp_iter(__comp));\n+\t\t\t\t   std::move(__comp));\n     }\n \n   template<typename _Tp>\n@@ -3448,7 +3500,7 @@ _GLIBCXX_END_INLINE_ABI_NAMESPACE(_V2)\n       __glibcxx_requires_irreflexive(__l.begin(), __l.end());\n       pair<const _Tp*, const _Tp*> __p =\n \tstd::__minmax_element(__l.begin(), __l.end(),\n-\t\t\t      __gnu_cxx::__ops::__iter_less_iter());\n+\t\t\t      __gnu_cxx::__ops::__less());\n       return std::make_pair(*__p.first, *__p.second);\n     }\n \n@@ -3460,7 +3512,7 @@ _GLIBCXX_END_INLINE_ABI_NAMESPACE(_V2)\n       __glibcxx_requires_irreflexive_pred(__l.begin(), __l.end(), __comp);\n       pair<const _Tp*, const _Tp*> __p =\n \tstd::__minmax_element(__l.begin(), __l.end(),\n-\t\t\t      __gnu_cxx::__ops::__iter_comp_iter(__comp));\n+\t\t\t      std::move(__comp));\n       return std::make_pair(*__p.first, *__p.second);\n     }\n \n@@ -3494,7 +3546,7 @@ _GLIBCXX_END_INLINE_ABI_NAMESPACE(_V2)\n       __glibcxx_requires_valid_range(__first1, __last1);\n \n       return std::__is_permutation(__first1, __last1, __first2,\n-\t\t\t\t   __gnu_cxx::__ops::__iter_comp_iter(__pred));\n+\t\t\t\t   std::move(__pred));\n     }\n \n #if __cplusplus > 201103L\n@@ -3506,7 +3558,7 @@ _GLIBCXX_END_INLINE_ABI_NAMESPACE(_V2)\n     bool\n     __is_permutation(_ForwardIterator1 __first1, _ForwardIterator1 __last1,\n \t\t     _ForwardIterator2 __first2, _ForwardIterator2 __last2,\n-\t\t     _BinaryPredicate __pred)\n+\t\t     _BinaryPredicate&& __pred)\n     {\n       using _Cat1\n \t= typename iterator_traits<_ForwardIterator1>::iterator_category;\n@@ -3525,7 +3577,7 @@ _GLIBCXX_END_INLINE_ABI_NAMESPACE(_V2)\n       // have the same elements in the same order.\n       for (; __first1 != __last1 && __first2 != __last2;\n \t  ++__first1, (void)++__first2)\n-\tif (!__pred(__first1, __first2))\n+\tif (!__pred(*__first1, *__first2))\n \t  break;\n \n       if constexpr (__ra_iters)\n@@ -3546,14 +3598,14 @@ _GLIBCXX_END_INLINE_ABI_NAMESPACE(_V2)\n       for (_ForwardIterator1 __scan = __first1; __scan != __last1; ++__scan)\n \t{\n \t  if (__scan != std::__find_if(__first1, __scan,\n-\t\t\t__gnu_cxx::__ops::__iter_comp_iter(__pred, __scan)))\n+\t\t__gnu_cxx::__ops::__equal_ite(__pred, __first1, __scan)))\n \t    continue; // We've seen this one before.\n \n \t  auto __matches = std::__count_if(__first2, __last2,\n-\t\t__gnu_cxx::__ops::__iter_comp_iter(__pred, __scan));\n+\t    __gnu_cxx::__ops::__equal_ite(__pred, __first2, __scan));\n \t  if (0 == __matches\n \t      || std::__count_if(__scan, __last1,\n-\t\t\t__gnu_cxx::__ops::__iter_comp_iter(__pred, __scan))\n+\t\t   __gnu_cxx::__ops::__equal_ite(__pred, __first1, __scan))\n \t      != __matches)\n \t    return false;\n \t}\n@@ -3585,7 +3637,7 @@ _GLIBCXX_END_INLINE_ABI_NAMESPACE(_V2)\n \n       return\n \tstd::__is_permutation(__first1, __last1, __first2, __last2,\n-\t\t\t      __gnu_cxx::__ops::__iter_equal_to_iter());\n+\t\t\t      __gnu_cxx::__ops::__equal_to());\n     }\n \n   /**\n@@ -3614,7 +3666,7 @@ _GLIBCXX_END_INLINE_ABI_NAMESPACE(_V2)\n       __glibcxx_requires_valid_range(__first2, __last2);\n \n       return std::__is_permutation(__first1, __last1, __first2, __last2,\n-\t\t\t\t   __gnu_cxx::__ops::__iter_comp_iter(__pred));\n+\t\t\t\t   std::move(__pred));\n     }\n #endif // C++14\n \n@@ -3892,7 +3944,7 @@ _GLIBCXX_BEGIN_NAMESPACE_ALGO\n #endif\n \n       return std::__find_if(__first, __last,\n-\t\t\t    __gnu_cxx::__ops::__iter_equals_val(__val));\n+\t\t\t    __gnu_cxx::__ops::__equal_val(__first, __val));\n     }\n \n   /**\n@@ -3918,7 +3970,7 @@ _GLIBCXX_BEGIN_NAMESPACE_ALGO\n       __glibcxx_requires_valid_range(__first, __last);\n \n       return std::__find_if(__first, __last,\n-\t\t\t    __gnu_cxx::__ops::__pred_iter(__pred));\n+\t\t\t    _GLIBCXX_MOVE(__pred));\n     }\n \n   /**\n@@ -4023,7 +4075,7 @@ _GLIBCXX_BEGIN_NAMESPACE_ALGO\n       __glibcxx_requires_valid_range(__first, __last);\n \n       return std::__adjacent_find(__first, __last,\n-\t\t\t\t  __gnu_cxx::__ops::__iter_equal_to_iter());\n+\t\t\t\t  __gnu_cxx::__ops::__equal_to(__first));\n     }\n \n   /**\n@@ -4051,7 +4103,7 @@ _GLIBCXX_BEGIN_NAMESPACE_ALGO\n       __glibcxx_requires_valid_range(__first, __last);\n \n       return std::__adjacent_find(__first, __last,\n-\t\t\t__gnu_cxx::__ops::__iter_comp_iter(__binary_pred));\n+\t\t\t\t  _GLIBCXX_MOVE(__binary_pred));\n     }\n \n   /**\n@@ -4075,7 +4127,7 @@ _GLIBCXX_BEGIN_NAMESPACE_ALGO\n       __glibcxx_requires_valid_range(__first, __last);\n \n       return std::__count_if(__first, __last,\n-\t\t\t     __gnu_cxx::__ops::__iter_equals_val(__value));\n+\t\t\t     __gnu_cxx::__ops::__equal_val(__first, __value));\n     }\n \n   /**\n@@ -4099,7 +4151,7 @@ _GLIBCXX_BEGIN_NAMESPACE_ALGO\n       __glibcxx_requires_valid_range(__first, __last);\n \n       return std::__count_if(__first, __last,\n-\t\t\t     __gnu_cxx::__ops::__pred_iter(__pred));\n+\t\t\t     _GLIBCXX_MOVE(__pred));\n     }\n \n   /**\n@@ -4144,7 +4196,7 @@ _GLIBCXX_BEGIN_NAMESPACE_ALGO\n       __glibcxx_requires_valid_range(__first2, __last2);\n \n       return std::__search(__first1, __last1, __first2, __last2,\n-\t\t\t   __gnu_cxx::__ops::__iter_equal_to_iter());\n+\t__gnu_cxx::__ops::__equal_to(__first1, __first2));\n     }\n \n   /**\n@@ -4175,7 +4227,7 @@ _GLIBCXX_BEGIN_NAMESPACE_ALGO\n       __glibcxx_requires_valid_range(__first, __last);\n \n       return std::__search_n(__first, __last, __count,\n-\t\t\t     __gnu_cxx::__ops::__iter_equals_val(__val));\n+\t\t\t     __gnu_cxx::__ops::__equal_val(__first, __val));\n     }\n \n \n@@ -4211,7 +4263,8 @@ _GLIBCXX_BEGIN_NAMESPACE_ALGO\n       __glibcxx_requires_valid_range(__first, __last);\n \n       return std::__search_n(__first, __last, __count,\n-\t\t__gnu_cxx::__ops::__iter_comp_val(__binary_pred, __val));\n+\t\t\t     __gnu_cxx::__ops::__comp_val\n+\t\t\t     (_GLIBCXX_MOVE(__binary_pred), __first, __val));\n     }\n \n #if __cplusplus >= 201703L\n@@ -4468,7 +4521,7 @@ _GLIBCXX_BEGIN_NAMESPACE_ALGO\n       if (__first == __last)\n \treturn __result;\n       return std::__unique_copy(__first, __last, __result,\n-\t\t\t\t__gnu_cxx::__ops::__iter_equal_to_iter(),\n+\t\t\t\t__gnu_cxx::__ops::__equal_to(__first),\n \t\t\t\tstd::__iterator_category(__first));\n     }\n \n@@ -4510,7 +4563,7 @@ _GLIBCXX_BEGIN_NAMESPACE_ALGO\n       if (__first == __last)\n \treturn __result;\n       return std::__unique_copy(__first, __last, __result,\n-\t\t\t__gnu_cxx::__ops::__iter_comp_iter(__binary_pred),\n+\t\t\t\t_GLIBCXX_MOVE(__binary_pred),\n \t\t\t\tstd::__iterator_category(__first));\n     }\n \n@@ -4649,7 +4702,7 @@ _GLIBCXX_BEGIN_NAMESPACE_ALGO\n \t    typename iterator_traits<_ForwardIterator>::value_type>)\n       __glibcxx_requires_valid_range(__first, __last);\n \n-      return std::__partition(__first, __last, __pred,\n+      return std::__partition(__first, __last, _GLIBCXX_MOVE(__pred),\n \t\t\t      std::__iterator_category(__first));\n     }\n \n@@ -4688,7 +4741,7 @@ _GLIBCXX_BEGIN_NAMESPACE_ALGO\n       __glibcxx_requires_irreflexive(__first, __last);\n \n       std::__partial_sort(__first, __middle, __last,\n-\t\t\t  __gnu_cxx::__ops::__iter_less_iter());\n+\t\t\t  __gnu_cxx::__ops::__less(__first));\n     }\n \n   /**\n@@ -4729,7 +4782,7 @@ _GLIBCXX_BEGIN_NAMESPACE_ALGO\n       __glibcxx_requires_irreflexive_pred(__first, __last, __comp);\n \n       std::__partial_sort(__first, __middle, __last,\n-\t\t\t  __gnu_cxx::__ops::__iter_comp_iter(__comp));\n+\t\t\t  _GLIBCXX_MOVE(__comp));\n     }\n \n   /**\n@@ -4767,7 +4820,7 @@ _GLIBCXX_BEGIN_NAMESPACE_ALGO\n \n       std::__introselect(__first, __nth, __last,\n \t\t\t std::__lg(__last - __first) * 2,\n-\t\t\t __gnu_cxx::__ops::__iter_less_iter());\n+\t\t\t __gnu_cxx::__ops::__less(__first));\n     }\n \n   /**\n@@ -4808,7 +4861,7 @@ _GLIBCXX_BEGIN_NAMESPACE_ALGO\n \n       std::__introselect(__first, __nth, __last,\n \t\t\t std::__lg(__last - __first) * 2,\n-\t\t\t __gnu_cxx::__ops::__iter_comp_iter(__comp));\n+\t\t\t _GLIBCXX_MOVE(__comp));\n     }\n \n   /**\n@@ -4838,7 +4891,7 @@ _GLIBCXX_BEGIN_NAMESPACE_ALGO\n       __glibcxx_requires_valid_range(__first, __last);\n       __glibcxx_requires_irreflexive(__first, __last);\n \n-      std::__sort(__first, __last, __gnu_cxx::__ops::__iter_less_iter());\n+      std::__sort(__first, __last, __gnu_cxx::__ops::__less(__first));\n     }\n \n   /**\n@@ -4871,7 +4924,7 @@ _GLIBCXX_BEGIN_NAMESPACE_ALGO\n       __glibcxx_requires_valid_range(__first, __last);\n       __glibcxx_requires_irreflexive_pred(__first, __last, __comp);\n \n-      std::__sort(__first, __last, __gnu_cxx::__ops::__iter_comp_iter(__comp));\n+      std::__sort(__first, __last, _GLIBCXX_MOVE(__comp));\n     }\n \n   template<typename _InputIterator1, typename _InputIterator2,\n@@ -4880,11 +4933,11 @@ _GLIBCXX_BEGIN_NAMESPACE_ALGO\n     _OutputIterator\n     __merge(_InputIterator1 __first1, _InputIterator1 __last1,\n \t    _InputIterator2 __first2, _InputIterator2 __last2,\n-\t    _OutputIterator __result, _Compare __comp)\n+\t    _OutputIterator __result, _GLIBCXX_CP_FWDREF(_Compare) __comp)\n     {\n       while (__first1 != __last1 && __first2 != __last2)\n \t{\n-\t  if (__comp(__first2, __first1))\n+\t  if (__comp(*__first2, *__first1))\n \t    {\n \t      *__result = *__first2;\n \t      ++__first2;\n@@ -4944,7 +4997,7 @@ _GLIBCXX_BEGIN_NAMESPACE_ALGO\n \n       return _GLIBCXX_STD_A::__merge(__first1, __last1,\n \t\t\t\t     __first2, __last2, __result,\n-\t\t\t\t     __gnu_cxx::__ops::__iter_less_iter());\n+\t\t\t\t__gnu_cxx::__ops::__less(__first1, __first2));\n     }\n \n   /**\n@@ -4995,14 +5048,14 @@ _GLIBCXX_BEGIN_NAMESPACE_ALGO\n \n       return _GLIBCXX_STD_A::__merge(__first1, __last1,\n \t\t\t\t__first2, __last2, __result,\n-\t\t\t\t__gnu_cxx::__ops::__iter_comp_iter(__comp));\n+\t\t\t\t_GLIBCXX_MOVE(__comp));\n     }\n \n   template<typename _RandomAccessIterator, typename _Compare>\n     _GLIBCXX26_CONSTEXPR\n     inline void\n     __stable_sort(_RandomAccessIterator __first, _RandomAccessIterator __last,\n-\t\t  _Compare __comp)\n+\t\t  _GLIBCXX_CP_FWDREF(_Compare) __comp)\n     {\n       typedef typename iterator_traits<_RandomAccessIterator>::value_type\n \t_ValueType;\n@@ -5015,7 +5068,8 @@ _GLIBCXX_BEGIN_NAMESPACE_ALGO\n #if _GLIBCXX_HOSTED\n # if __glibcxx_constexpr_algorithms >= 202306L // >= C++26\n       if consteval {\n-\treturn std::__inplace_stable_sort(__first, __last, __comp);\n+\treturn std::__inplace_stable_sort(__first, __last,\n+\t\t\t\t\t  std::forward<_Compare>(__comp));\n       }\n # endif\n \n@@ -5027,14 +5081,18 @@ _GLIBCXX_BEGIN_NAMESPACE_ALGO\n       if (__builtin_expect(__buf._M_requested_size() == __buf.size(), true))\n \tstd::__stable_sort_adaptive(__first,\n \t\t\t\t    __first + _DistanceType(__buf.size()),\n-\t\t\t\t    __last, __buf.begin(), __comp);\n+\t\t\t\t    __last, __buf.begin(),\n+\t\t\t\t    _GLIBCXX_FORWARD(_Compare, __comp));\n       else if (__builtin_expect(__buf.begin() == 0, false))\n-\tstd::__inplace_stable_sort(__first, __last, __comp);\n+\tstd::__inplace_stable_sort(__first, __last,\n+\t\t\t\t   _GLIBCXX_FORWARD(_Compare, __comp));\n       else\n \tstd::__stable_sort_adaptive_resize(__first, __last, __buf.begin(),\n-\t\t\t\t\t   _DistanceType(__buf.size()), __comp);\n+\t\t\t\t\t   _DistanceType(__buf.size()),\n+\t\t\t\t\t   _GLIBCXX_FORWARD(_Compare, __comp));\n #else\n-      std::__inplace_stable_sort(__first, __last, __comp);\n+      std::__inplace_stable_sort\n+\t(__first, __last, _GLIBCXX_FORWARD(_Compare, __comp));\n #endif\n     }\n \n@@ -5069,7 +5127,7 @@ _GLIBCXX_BEGIN_NAMESPACE_ALGO\n       __glibcxx_requires_irreflexive(__first, __last);\n \n       _GLIBCXX_STD_A::__stable_sort(__first, __last,\n-\t\t\t\t    __gnu_cxx::__ops::__iter_less_iter());\n+\t\t\t\t    __gnu_cxx::__ops::__less(__first));\n     }\n \n   /**\n@@ -5106,7 +5164,7 @@ _GLIBCXX_BEGIN_NAMESPACE_ALGO\n       __glibcxx_requires_irreflexive_pred(__first, __last, __comp);\n \n       _GLIBCXX_STD_A::__stable_sort(__first, __last,\n-\t\t\t\t    __gnu_cxx::__ops::__iter_comp_iter(__comp));\n+\t\t\t\t    _GLIBCXX_MOVE(__comp));\n     }\n \n   template<typename _InputIterator1, typename _InputIterator2,\n@@ -5116,16 +5174,16 @@ _GLIBCXX_BEGIN_NAMESPACE_ALGO\n     _OutputIterator\n     __set_union(_InputIterator1 __first1, _InputIterator1 __last1,\n \t\t_InputIterator2 __first2, _InputIterator2 __last2,\n-\t\t_OutputIterator __result, _Compare __comp)\n+\t\t_OutputIterator __result, _GLIBCXX_CP_FWDREF(_Compare) __comp)\n     {\n       while (__first1 != __last1 && __first2 != __last2)\n \t{\n-\t  if (__comp(__first1, __first2))\n+\t  if (__comp(*__first1, *__first2))\n \t    {\n \t      *__result = *__first1;\n \t      ++__first1;\n \t    }\n-\t  else if (__comp(__first2, __first1))\n+\t  else if (__comp(*__first2, *__first1))\n \t    {\n \t      *__result = *__first2;\n \t      ++__first2;\n@@ -5189,7 +5247,7 @@ _GLIBCXX_BEGIN_NAMESPACE_ALGO\n \n       return _GLIBCXX_STD_A::__set_union(__first1, __last1,\n \t\t\t\t__first2, __last2, __result,\n-\t\t\t\t__gnu_cxx::__ops::__iter_less_iter());\n+\t\t\t\t__gnu_cxx::__ops::__less(__first1, __first2));\n     }\n \n   /**\n@@ -5240,7 +5298,7 @@ _GLIBCXX_BEGIN_NAMESPACE_ALGO\n \n       return _GLIBCXX_STD_A::__set_union(__first1, __last1,\n \t\t\t\t__first2, __last2, __result,\n-\t\t\t\t__gnu_cxx::__ops::__iter_comp_iter(__comp));\n+\t\t\t\t_GLIBCXX_MOVE(__comp));\n     }\n \n   template<typename _InputIterator1, typename _InputIterator2,\n@@ -5250,12 +5308,13 @@ _GLIBCXX_BEGIN_NAMESPACE_ALGO\n     _OutputIterator\n     __set_intersection(_InputIterator1 __first1, _InputIterator1 __last1,\n \t\t       _InputIterator2 __first2, _InputIterator2 __last2,\n-\t\t       _OutputIterator __result, _Compare __comp)\n+\t\t       _OutputIterator __result,\n+\t\t       _GLIBCXX_CP_FWDREF(_Compare) __comp)\n     {\n       while (__first1 != __last1 && __first2 != __last2)\n-\tif (__comp(__first1, __first2))\n+\tif (__comp(*__first1, *__first2))\n \t  ++__first1;\n-\telse if (__comp(__first2, __first1))\n+\telse if (__comp(*__first2, *__first1))\n \t  ++__first2;\n \telse\n \t  {\n@@ -5311,7 +5370,7 @@ _GLIBCXX_BEGIN_NAMESPACE_ALGO\n \n       return _GLIBCXX_STD_A::__set_intersection(__first1, __last1,\n \t\t\t\t     __first2, __last2, __result,\n-\t\t\t\t     __gnu_cxx::__ops::__iter_less_iter());\n+\t\t\t\t__gnu_cxx::__ops::__less(__first1, __first2));\n     }\n \n   /**\n@@ -5361,7 +5420,7 @@ _GLIBCXX_BEGIN_NAMESPACE_ALGO\n \n       return _GLIBCXX_STD_A::__set_intersection(__first1, __last1,\n \t\t\t\t__first2, __last2, __result,\n-\t\t\t\t__gnu_cxx::__ops::__iter_comp_iter(__comp));\n+\t\t\t\t_GLIBCXX_MOVE(__comp));\n     }\n \n   template<typename _InputIterator1, typename _InputIterator2,\n@@ -5371,16 +5430,16 @@ _GLIBCXX_BEGIN_NAMESPACE_ALGO\n     _OutputIterator\n     __set_difference(_InputIterator1 __first1, _InputIterator1 __last1,\n \t\t     _InputIterator2 __first2, _InputIterator2 __last2,\n-\t\t     _OutputIterator __result, _Compare __comp)\n+\t\t     _OutputIterator __result, _GLIBCXX_CP_FWDREF(_Compare) __comp)\n     {\n       while (__first1 != __last1 && __first2 != __last2)\n-\tif (__comp(__first1, __first2))\n+\tif (__comp(*__first1, *__first2))\n \t  {\n \t    *__result = *__first1;\n \t    ++__first1;\n \t    ++__result;\n \t  }\n-\telse if (__comp(__first2, __first1))\n+\telse if (__comp(*__first2, *__first1))\n \t  ++__first2;\n \telse\n \t  {\n@@ -5436,7 +5495,7 @@ _GLIBCXX_BEGIN_NAMESPACE_ALGO\n \n       return _GLIBCXX_STD_A::__set_difference(__first1, __last1,\n \t\t\t\t   __first2, __last2, __result,\n-\t\t\t\t   __gnu_cxx::__ops::__iter_less_iter());\n+\t\t\t\t__gnu_cxx::__ops::__less(__first1, __first2));\n     }\n \n   /**\n@@ -5488,7 +5547,7 @@ _GLIBCXX_BEGIN_NAMESPACE_ALGO\n \n       return _GLIBCXX_STD_A::__set_difference(__first1, __last1,\n \t\t\t\t   __first2, __last2, __result,\n-\t\t\t\t   __gnu_cxx::__ops::__iter_comp_iter(__comp));\n+\t\t\t\t\t      _GLIBCXX_MOVE(__comp));\n     }\n \n   template<typename _InputIterator1, typename _InputIterator2,\n@@ -5501,16 +5560,16 @@ _GLIBCXX_BEGIN_NAMESPACE_ALGO\n \t\t\t       _InputIterator2 __first2,\n \t\t\t       _InputIterator2 __last2,\n \t\t\t       _OutputIterator __result,\n-\t\t\t       _Compare __comp)\n+\t\t\t       _GLIBCXX_CP_FWDREF(_Compare) __comp)\n     {\n       while (__first1 != __last1 && __first2 != __last2)\n-\tif (__comp(__first1, __first2))\n+\tif (__comp(*__first1, *__first2))\n \t  {\n \t    *__result = *__first1;\n \t    ++__first1;\n \t    ++__result;\n \t  }\n-\telse if (__comp(__first2, __first1))\n+\telse if (__comp(*__first2, *__first1))\n \t  {\n \t    *__result = *__first2;\n \t    ++__first2;\n@@ -5571,7 +5630,7 @@ _GLIBCXX_BEGIN_NAMESPACE_ALGO\n \n       return _GLIBCXX_STD_A::__set_symmetric_difference(__first1, __last1,\n \t\t\t\t\t__first2, __last2, __result,\n-\t\t\t\t\t__gnu_cxx::__ops::__iter_less_iter());\n+\t\t\t\t__gnu_cxx::__ops::__less(__first1, __first2));\n     }\n \n   /**\n@@ -5624,20 +5683,20 @@ _GLIBCXX_BEGIN_NAMESPACE_ALGO\n \n       return _GLIBCXX_STD_A::__set_symmetric_difference(__first1, __last1,\n \t\t\t\t__first2, __last2, __result,\n-\t\t\t\t__gnu_cxx::__ops::__iter_comp_iter(__comp));\n+\t\t\t\t_GLIBCXX_MOVE(__comp));\n     }\n \n   template<typename _ForwardIterator, typename _Compare>\n     _GLIBCXX14_CONSTEXPR\n     _ForwardIterator\n     __min_element(_ForwardIterator __first, _ForwardIterator __last,\n-\t\t  _Compare __comp)\n+\t\t  _GLIBCXX_CP_FWDREF(_Compare) __comp)\n     {\n       if (__first == __last)\n \treturn __first;\n       _ForwardIterator __result = __first;\n       while (++__first != __last)\n-\tif (__comp(__first, __result))\n+\tif (__comp(*__first, *__result))\n \t  __result = __first;\n       return __result;\n     }\n@@ -5662,7 +5721,7 @@ _GLIBCXX_BEGIN_NAMESPACE_ALGO\n       __glibcxx_requires_irreflexive(__first, __last);\n \n       return _GLIBCXX_STD_A::__min_element(__first, __last,\n-\t\t\t\t__gnu_cxx::__ops::__iter_less_iter());\n+\t\t\t\t\t   __gnu_cxx::__ops::__less(__first));\n     }\n \n   /**\n@@ -5689,19 +5748,19 @@ _GLIBCXX_BEGIN_NAMESPACE_ALGO\n       __glibcxx_requires_irreflexive_pred(__first, __last, __comp);\n \n       return _GLIBCXX_STD_A::__min_element(__first, __last,\n-\t\t\t\t__gnu_cxx::__ops::__iter_comp_iter(__comp));\n+\t\t\t\t\t   _GLIBCXX_MOVE(__comp));\n     }\n \n   template<typename _ForwardIterator, typename _Compare>\n     _GLIBCXX14_CONSTEXPR\n     _ForwardIterator\n     __max_element(_ForwardIterator __first, _ForwardIterator __last,\n-\t\t  _Compare __comp)\n+\t\t  _GLIBCXX_CP_FWDREF(_Compare) __comp)\n     {\n       if (__first == __last) return __first;\n       _ForwardIterator __result = __first;\n       while (++__first != __last)\n-\tif (__comp(__result, __first))\n+\tif (__comp(*__result, *__first))\n \t  __result = __first;\n       return __result;\n     }\n@@ -5726,7 +5785,7 @@ _GLIBCXX_BEGIN_NAMESPACE_ALGO\n       __glibcxx_requires_irreflexive(__first, __last);\n \n       return _GLIBCXX_STD_A::__max_element(__first, __last,\n-\t\t\t\t__gnu_cxx::__ops::__iter_less_iter());\n+\t\t\t\t\t   __gnu_cxx::__ops::__less(__first));\n     }\n \n   /**\n@@ -5753,7 +5812,7 @@ _GLIBCXX_BEGIN_NAMESPACE_ALGO\n       __glibcxx_requires_irreflexive_pred(__first, __last, __comp);\n \n       return _GLIBCXX_STD_A::__max_element(__first, __last,\n-\t\t\t\t__gnu_cxx::__ops::__iter_comp_iter(__comp));\n+\t\t\t\t\t   _GLIBCXX_MOVE(__comp));\n     }\n \n #if __cplusplus >= 201103L\n@@ -5765,7 +5824,7 @@ _GLIBCXX_BEGIN_NAMESPACE_ALGO\n     {\n       __glibcxx_requires_irreflexive(__l.begin(), __l.end());\n       return *_GLIBCXX_STD_A::__min_element(__l.begin(), __l.end(),\n-\t  __gnu_cxx::__ops::__iter_less_iter());\n+\t\t\t\t\t    __gnu_cxx::__ops::__less());\n     }\n \n   template<typename _Tp, typename _Compare>\n@@ -5775,7 +5834,7 @@ _GLIBCXX_BEGIN_NAMESPACE_ALGO\n     {\n       __glibcxx_requires_irreflexive_pred(__l.begin(), __l.end(), __comp);\n       return *_GLIBCXX_STD_A::__min_element(__l.begin(), __l.end(),\n-\t  __gnu_cxx::__ops::__iter_comp_iter(__comp));\n+\t\t\t\t\t    std::move(__comp));\n     }\n \n   template<typename _Tp>\n@@ -5785,7 +5844,7 @@ _GLIBCXX_BEGIN_NAMESPACE_ALGO\n     {\n       __glibcxx_requires_irreflexive(__l.begin(), __l.end());\n       return *_GLIBCXX_STD_A::__max_element(__l.begin(), __l.end(),\n-\t  __gnu_cxx::__ops::__iter_less_iter());\n+\t\t\t\t\t    __gnu_cxx::__ops::__less());\n     }\n \n   template<typename _Tp, typename _Compare>\n@@ -5795,7 +5854,7 @@ _GLIBCXX_BEGIN_NAMESPACE_ALGO\n     {\n       __glibcxx_requires_irreflexive_pred(__l.begin(), __l.end(), __comp);\n       return *_GLIBCXX_STD_A::__max_element(__l.begin(), __l.end(),\n-\t  __gnu_cxx::__ops::__iter_comp_iter(__comp));\n+\t\t\t\t\t    std::move(__comp));\n     }\n #endif // C++11\n \ndiff --git a/libstdc++-v3/include/bits/stl_algobase.h b/libstdc++-v3/include/bits/stl_algobase.h\nindex b104ec2536a0..a54293e0abca 100644\n--- a/libstdc++-v3/include/bits/stl_algobase.h\n+++ b/libstdc++-v3/include/bits/stl_algobase.h\n@@ -1328,7 +1328,7 @@ _GLIBCXX_END_NAMESPACE_CONTAINER\n     bool\n     __lexicographical_compare_impl(_II1 __first1, _II1 __last1,\n \t\t\t\t   _II2 __first2, _II2 __last2,\n-\t\t\t\t   _Compare __comp)\n+\t\t\t\t   _GLIBCXX_CP_FWDREF(_Compare) __comp)\n     {\n       typedef typename iterator_traits<_II1>::iterator_category _Category1;\n       typedef typename iterator_traits<_II2>::iterator_category _Category2;\n@@ -1338,9 +1338,9 @@ _GLIBCXX_END_NAMESPACE_CONTAINER\n       for (; __first1 != __last1 && __rai_type::__cnd2(__first2, __last2);\n \t   ++__first1, (void)++__first2)\n \t{\n-\t  if (__comp(__first1, __first2))\n+\t  if (__comp(*__first1, *__first2))\n \t    return true;\n-\t  if (__comp(__first2, __first1))\n+\t  if (__comp(*__first2, *__first1))\n \t    return false;\n \t}\n       return __first1 == __last1 && __first2 != __last2;\n@@ -1354,10 +1354,9 @@ _GLIBCXX_END_NAMESPACE_CONTAINER\n \tstatic bool\n \t__lc(_II1 __first1, _II1 __last1, _II2 __first2, _II2 __last2)\n \t{\n-\t  using __gnu_cxx::__ops::__iter_less_iter;\n \t  return std::__lexicographical_compare_impl(__first1, __last1,\n \t\t\t\t\t\t     __first2, __last2,\n-\t\t\t\t\t\t     __iter_less_iter());\n+\t\t\t\t__gnu_cxx::__ops::__less(__first1, __first2));\n \t}\n \n       template<typename _II1, typename _II2>\n@@ -1501,7 +1500,8 @@ _GLIBCXX_END_NAMESPACE_CONTAINER\n     _GLIBCXX20_CONSTEXPR\n     _ForwardIterator\n     __lower_bound(_ForwardIterator __first, _ForwardIterator __last,\n-\t\t  const _Tp& __val, _Compare __comp)\n+\t\t  _GLIBCXX_FWDREF(_Tp) __val,\n+\t\t  _GLIBCXX_CP_FWDREF(_Compare) __comp)\n     {\n       typedef typename iterator_traits<_ForwardIterator>::difference_type\n \t_DistanceType;\n@@ -1513,7 +1513,7 @@ _GLIBCXX_END_NAMESPACE_CONTAINER\n \t  _DistanceType __half = __len >> 1;\n \t  _ForwardIterator __middle = __first;\n \t  std::advance(__middle, __half);\n-\t  if (__comp(__middle, __val))\n+\t  if (__comp(*__middle, __val))\n \t    {\n \t      __first = __middle;\n \t      ++__first;\n@@ -1549,7 +1549,7 @@ _GLIBCXX_END_NAMESPACE_CONTAINER\n       __glibcxx_requires_partitioned_lower(__first, __last, __val);\n \n       return std::__lower_bound(__first, __last, __val,\n-\t\t\t\t__gnu_cxx::__ops::__iter_less_val());\n+\t\t\t\t__gnu_cxx::__ops::__less_val(__first, __val));\n     }\n \n   /// This is a helper function for the sort routines and for random.tcc.\n@@ -1671,7 +1671,7 @@ _GLIBCXX_BEGIN_NAMESPACE_ALGO\n     _GLIBCXX20_CONSTEXPR\n     inline bool\n     __equal4(_II1 __first1, _II1 __last1, _II2 __first2, _II2 __last2,\n-\t     _BinaryPredicate __binary_pred)\n+\t     _BinaryPredicate&& __binary_pred)\n     {\n       using _RATag = random_access_iterator_tag;\n       using _Cat1 = typename iterator_traits<_II1>::iterator_category;\n@@ -1682,7 +1682,7 @@ _GLIBCXX_BEGIN_NAMESPACE_ALGO\n \t  if ((__last1 - __first1) != (__last2 - __first2))\n \t    return false;\n \t  return _GLIBCXX_STD_A::equal(__first1, __last1, __first2,\n-\t\t\t\t       __binary_pred);\n+\t     std::forward<_BinaryPredicate>(__binary_pred));\n \t}\n       else\n \t{\n@@ -1756,7 +1756,7 @@ _GLIBCXX_BEGIN_NAMESPACE_ALGO\n       __glibcxx_requires_valid_range(__first2, __last2);\n \n       return _GLIBCXX_STD_A::__equal4(__first1, __last1, __first2, __last2,\n-\t\t\t\t      __binary_pred);\n+\t\t\t\t      std::move(__binary_pred));\n     }\n #endif // __glibcxx_robust_nonmodifying_seq_ops\n \n@@ -1823,8 +1823,7 @@ _GLIBCXX_BEGIN_NAMESPACE_ALGO\n       __glibcxx_requires_valid_range(__first2, __last2);\n \n       return std::__lexicographical_compare_impl\n-\t(__first1, __last1, __first2, __last2,\n-\t __gnu_cxx::__ops::__iter_comp_iter(__comp));\n+\t(__first1, __last1, __first2, __last2, _GLIBCXX_MOVE(__comp));\n     }\n \n #if __cpp_lib_three_way_comparison\n@@ -1930,9 +1929,10 @@ _GLIBCXX_BEGIN_NAMESPACE_ALGO\n     _GLIBCXX20_CONSTEXPR\n     pair<_InputIterator1, _InputIterator2>\n     __mismatch(_InputIterator1 __first1, _InputIterator1 __last1,\n-\t       _InputIterator2 __first2, _BinaryPredicate __binary_pred)\n+\t       _InputIterator2 __first2,\n+\t       _GLIBCXX_CP_FWDREF(_BinaryPredicate) __binary_pred)\n     {\n-      while (__first1 != __last1 && __binary_pred(__first1, __first2))\n+      while (__first1 != __last1 && __binary_pred(*__first1, *__first2))\n \t{\n \t  ++__first1;\n \t  ++__first2;\n@@ -1968,7 +1968,7 @@ _GLIBCXX_BEGIN_NAMESPACE_ALGO\n       __glibcxx_requires_valid_range(__first1, __last1);\n \n       return _GLIBCXX_STD_A::__mismatch(__first1, __last1, __first2,\n-\t\t\t     __gnu_cxx::__ops::__iter_equal_to_iter());\n+\t\t\t__gnu_cxx::__ops::__equal_to(__first1, __first2));\n     }\n \n   /**\n@@ -2000,7 +2000,7 @@ _GLIBCXX_BEGIN_NAMESPACE_ALGO\n       __glibcxx_requires_valid_range(__first1, __last1);\n \n       return _GLIBCXX_STD_A::__mismatch(__first1, __last1, __first2,\n-\t__gnu_cxx::__ops::__iter_comp_iter(__binary_pred));\n+\t\t\t\t\t_GLIBCXX_MOVE(__binary_pred));\n     }\n \n #if __glibcxx_robust_nonmodifying_seq_ops // C++ >= 14\n@@ -2010,10 +2010,10 @@ _GLIBCXX_BEGIN_NAMESPACE_ALGO\n     pair<_InputIterator1, _InputIterator2>\n     __mismatch(_InputIterator1 __first1, _InputIterator1 __last1,\n \t       _InputIterator2 __first2, _InputIterator2 __last2,\n-\t       _BinaryPredicate __binary_pred)\n+\t       _BinaryPredicate&& __binary_pred)\n     {\n       while (__first1 != __last1 && __first2 != __last2\n-\t     && __binary_pred(__first1, __first2))\n+\t     && __binary_pred(*__first1, *__first2))\n \t{\n \t  ++__first1;\n \t  ++__first2;\n@@ -2051,7 +2051,7 @@ _GLIBCXX_BEGIN_NAMESPACE_ALGO\n       __glibcxx_requires_valid_range(__first2, __last2);\n \n       return _GLIBCXX_STD_A::__mismatch(__first1, __last1, __first2, __last2,\n-\t\t\t     __gnu_cxx::__ops::__iter_equal_to_iter());\n+\t\t\t__gnu_cxx::__ops::__equal_to(__first1, __first2));\n     }\n \n   /**\n@@ -2086,7 +2086,7 @@ _GLIBCXX_BEGIN_NAMESPACE_ALGO\n       __glibcxx_requires_valid_range(__first2, __last2);\n \n       return _GLIBCXX_STD_A::__mismatch(__first1, __last1, __first2, __last2,\n-\t\t\t     __gnu_cxx::__ops::__iter_comp_iter(__binary_pred));\n+\t\t\t\t\t_GLIBCXX_MOVE(__binary_pred));\n     }\n #endif\n \n@@ -2096,10 +2096,11 @@ _GLIBCXX_END_NAMESPACE_ALGO\n   template<typename _Iterator, typename _Predicate>\n     _GLIBCXX20_CONSTEXPR\n     inline _Iterator\n-    __find_if(_Iterator __first, _Iterator __last, _Predicate __pred)\n+    __find_if(_Iterator __first, _Iterator __last,\n+\t      _GLIBCXX_CP_FWDREF(_Predicate) __pred)\n     {\n #pragma GCC unroll 4\n-      while (__first != __last && !__pred(__first))\n+      while (__first != __last && !__pred(*__first))\n \t++__first;\n       return __first;\n     }\n@@ -2107,11 +2108,12 @@ _GLIBCXX_END_NAMESPACE_ALGO\n   template<typename _InputIterator, typename _Predicate>\n     _GLIBCXX20_CONSTEXPR\n     typename iterator_traits<_InputIterator>::difference_type\n-    __count_if(_InputIterator __first, _InputIterator __last, _Predicate __pred)\n+    __count_if(_InputIterator __first, _InputIterator __last,\n+\t       _GLIBCXX_CP_FWDREF(_Predicate) __pred)\n     {\n       typename iterator_traits<_InputIterator>::difference_type __n = 0;\n       for (; __first != __last; ++__first)\n-\tif (__pred(__first))\n+\tif (__pred(*__first))\n \t  ++__n;\n       return __n;\n     }\n@@ -2120,7 +2122,7 @@ _GLIBCXX_END_NAMESPACE_ALGO\n     _GLIBCXX20_CONSTEXPR\n     _ForwardIterator\n     __remove_if(_ForwardIterator __first, _ForwardIterator __last,\n-\t\t_Predicate __pred)\n+\t\t_GLIBCXX_CP_FWDREF(_Predicate) __pred)\n     {\n       __first = std::__find_if(__first, __last, __pred);\n       if (__first == __last)\n@@ -2128,7 +2130,7 @@ _GLIBCXX_END_NAMESPACE_ALGO\n       _ForwardIterator __result = __first;\n       ++__first;\n       for (; __first != __last; ++__first)\n-\tif (!__pred(__first))\n+\tif (!__pred(*__first))\n \t  {\n \t    *__result = _GLIBCXX_MOVE(*__first);\n \t    ++__result;\n@@ -2142,7 +2144,7 @@ _GLIBCXX_END_NAMESPACE_ALGO\n     _ForwardIterator1\n     __search(_ForwardIterator1 __first1, _ForwardIterator1 __last1,\n \t     _ForwardIterator2 __first2, _ForwardIterator2 __last2,\n-\t     _BinaryPredicate  __predicate)\n+\t     _GLIBCXX_CP_FWDREF(_BinaryPredicate)  __predicate)\n     {\n       // Test for empty ranges\n       if (__first1 == __last1 || __first2 == __last2)\n@@ -2151,18 +2153,22 @@ _GLIBCXX_END_NAMESPACE_ALGO\n       // Test for a pattern of length 1.\n       _ForwardIterator2 __p1(__first2);\n       if (++__p1 == __last2)\n-\treturn std::__find_if(__first1, __last1,\n-\t\t__gnu_cxx::__ops::__iter_comp_iter(__predicate, __first2));\n+\t{\n+\t  return std::__find_if(__first1, __last1,\n+\t     __gnu_cxx::__ops::__equal_ite(_GLIBCXX_FORWARD(_BinaryPredicate,\n+\t\t\t\t\t\t\t    __predicate),\n+\t\t\t\t\t   __first1, __first2));\n+\t}\n \n       // General case.\n       _ForwardIterator1 __current = __first1;\n \n+      __decltype(__gnu_cxx::__ops::__equal_ite(__predicate, __first1, __first2))\n+\t__unry_pred = __gnu_cxx::__ops::__equal_ite(__predicate,\n+\t\t\t\t\t\t    __first1, __first2);\n       for (;;)\n \t{\n-\t  __first1 =\n-\t    std::__find_if(__first1, __last1,\n-\t\t__gnu_cxx::__ops::__iter_comp_iter(__predicate, __first2));\n-\n+\t  __first1 = std::__find_if(__first1, __last1, __unry_pred);\n \t  if (__first1 == __last1)\n \t    return __last1;\n \n@@ -2171,7 +2177,7 @@ _GLIBCXX_END_NAMESPACE_ALGO\n \t  if (++__current == __last1)\n \t    return __last1;\n \n-\t  while (__predicate(__current, __p))\n+\t  while (__predicate(*__current, *__p))\n \t    {\n \t      if (++__p == __last2)\n \t\treturn __first1;\n@@ -2194,7 +2200,7 @@ _GLIBCXX_END_NAMESPACE_ALGO\n       // Efficiently compare identical prefixes:  O(N) if sequences\n       // have the same elements in the same order.\n       for (; __first1 != __last1; ++__first1, (void)++__first2)\n-\tif (!__pred(__first1, __first2))\n+\tif (!__pred(*__first1, *__first2))\n \t  break;\n \n       if (__first1 == __last1)\n@@ -2207,15 +2213,15 @@ _GLIBCXX_END_NAMESPACE_ALGO\n       for (_ForwardIterator1 __scan = __first1; __scan != __last1; ++__scan)\n \t{\n \t  if (__scan != std::__find_if(__first1, __scan,\n-\t\t\t  __gnu_cxx::__ops::__iter_comp_iter(__pred, __scan)))\n+\t\t__gnu_cxx::__ops::__equal_ite(__pred, __first1, __scan)))\n \t    continue; // We've seen this one before.\n \n \t  auto __matches\n \t    = std::__count_if(__first2, __last2,\n-\t\t\t__gnu_cxx::__ops::__iter_comp_iter(__pred, __scan));\n+\t\t__gnu_cxx::__ops::__equal_ite(__pred, __first2, __scan));\n \t  if (0 == __matches ||\n \t      std::__count_if(__scan, __last1,\n-\t\t\t__gnu_cxx::__ops::__iter_comp_iter(__pred, __scan))\n+\t\t__gnu_cxx::__ops::__equal_ite(__pred, __first1, __scan))\n \t      != __matches)\n \t    return false;\n \t}\n@@ -2249,7 +2255,7 @@ _GLIBCXX_END_NAMESPACE_ALGO\n       __glibcxx_requires_valid_range(__first1, __last1);\n \n       return std::__is_permutation(__first1, __last1, __first2,\n-\t\t\t\t   __gnu_cxx::__ops::__iter_equal_to_iter());\n+\t\t\t\t   __gnu_cxx::__ops::__equal_to());\n     }\n #endif // C++11\n \n@@ -2294,7 +2300,7 @@ _GLIBCXX_BEGIN_NAMESPACE_ALGO\n       __glibcxx_requires_valid_range(__first2, __last2);\n \n       return std::__search(__first1, __last1, __first2, __last2,\n-\t\t\t   __gnu_cxx::__ops::__iter_comp_iter(__predicate));\n+\t\t\t   _GLIBCXX_MOVE(__predicate));\n     }\n \n _GLIBCXX_END_NAMESPACE_ALGO\ndiff --git a/libstdc++-v3/include/bits/stl_heap.h b/libstdc++-v3/include/bits/stl_heap.h\nindex 028ac83eeb70..18326c7115b5 100644\n--- a/libstdc++-v3/include/bits/stl_heap.h\n+++ b/libstdc++-v3/include/bits/stl_heap.h\n@@ -74,12 +74,12 @@ _GLIBCXX_BEGIN_NAMESPACE_VERSION\n     _GLIBCXX20_CONSTEXPR\n     _Distance\n     __is_heap_until(_RandomAccessIterator __first, _Distance __n,\n-\t\t    _Compare& __comp)\n+\t\t    _GLIBCXX_CP_FWDREF(_Compare) __comp)\n     {\n       _Distance __parent = 0;\n       for (_Distance __child = 1; __child < __n; ++__child)\n \t{\n-\t  if (__comp(__first + __parent, __first + __child))\n+\t  if (__comp(__first[__parent], __first[__child]))\n \t    return __child;\n \t  if ((__child & 1) == 0)\n \t    ++__parent;\n@@ -94,19 +94,20 @@ _GLIBCXX_BEGIN_NAMESPACE_VERSION\n     inline bool\n     __is_heap(_RandomAccessIterator __first, _Distance __n)\n     {\n-      __gnu_cxx::__ops::_Iter_less_iter __comp;\n-      return std::__is_heap_until(__first, __n, __comp) == __n;\n+      return std::__is_heap_until\n+\t(__first, __n, __gnu_cxx::__ops::__less(__first)) == __n;\n     }\n \n   template<typename _RandomAccessIterator, typename _Compare,\n \t   typename _Distance>\n     _GLIBCXX20_CONSTEXPR\n     inline bool\n-    __is_heap(_RandomAccessIterator __first, _Compare __comp, _Distance __n)\n+    __is_heap(_RandomAccessIterator __first,\n+\t      _GLIBCXX_CP_FWDREF(_Compare) __comp,\n+\t      _Distance __n)\n     {\n-      typedef __decltype(__comp) _Cmp;\n-      __gnu_cxx::__ops::_Iter_comp_iter<_Cmp> __cmp(_GLIBCXX_MOVE(__comp));\n-      return std::__is_heap_until(__first, __n, __cmp) == __n;\n+      return std::__is_heap_until\n+\t(__first, __n, _GLIBCXX_FORWARD(_Compare, __comp)) == __n;\n     }\n \n   template<typename _RandomAccessIterator>\n@@ -119,9 +120,9 @@ _GLIBCXX_BEGIN_NAMESPACE_VERSION\n     _GLIBCXX20_CONSTEXPR\n     inline bool\n     __is_heap(_RandomAccessIterator __first, _RandomAccessIterator __last,\n-\t      _Compare __comp)\n+\t      _GLIBCXX_CP_FWDREF(_Compare) __comp)\n     {\n-      return std::__is_heap(__first, _GLIBCXX_MOVE(__comp),\n+      return std::__is_heap(__first, _GLIBCXX_FORWARD(_Compare, __comp),\n \t\t\t    std::distance(__first, __last));\n     }\n \n@@ -133,17 +134,18 @@ _GLIBCXX_BEGIN_NAMESPACE_VERSION\n     _GLIBCXX20_CONSTEXPR\n     void\n     __push_heap(_RandomAccessIterator __first,\n-\t\t_Distance __holeIndex, _Distance __topIndex, _Tp __value,\n-\t\t_Compare& __comp)\n+\t\t_Distance __holeIndex, _Distance __topIndex,\n+\t\t_GLIBCXX_CP_FWDREF(_Tp) __value,\n+\t\t_GLIBCXX_CP_FWDREF(_Compare) __comp)\n     {\n       _Distance __parent = (__holeIndex - 1) / 2;\n-      while (__holeIndex > __topIndex && __comp(__first + __parent, __value))\n+      while (__holeIndex > __topIndex && __comp(__first[__parent], __value))\n \t{\n \t  *(__first + __holeIndex) = _GLIBCXX_MOVE(*(__first + __parent));\n \t  __holeIndex = __parent;\n \t  __parent = (__holeIndex - 1) / 2;\n \t}\n-      *(__first + __holeIndex) = _GLIBCXX_MOVE(__value);\n+      *(__first + __holeIndex) = _GLIBCXX_FORWARD(_Tp, __value);\n     }\n \n   /**\n@@ -174,8 +176,9 @@ _GLIBCXX_BEGIN_NAMESPACE_VERSION\n       __glibcxx_requires_irreflexive(__first, __last);\n       __glibcxx_requires_heap(__first, __last - 1);\n \n-      __gnu_cxx::__ops::_Iter_less_val __comp;\n       _ValueType __value = _GLIBCXX_MOVE(*(__last - 1));\n+      __decltype(__gnu_cxx::__ops::__less_val(__first, __value)) __comp =\n+\t__gnu_cxx::__ops::__less_val(__first, __value);\n       std::__push_heap(__first, _DistanceType((__last - __first) - 1),\n \t\t       _DistanceType(0), _GLIBCXX_MOVE(__value), __comp);\n     }\n@@ -210,11 +213,10 @@ _GLIBCXX_BEGIN_NAMESPACE_VERSION\n       __glibcxx_requires_irreflexive_pred(__first, __last, __comp);\n       __glibcxx_requires_heap_pred(__first, __last - 1, __comp);\n \n-      __decltype(__gnu_cxx::__ops::__iter_comp_val(_GLIBCXX_MOVE(__comp)))\n-\t__cmp(_GLIBCXX_MOVE(__comp));\n       _ValueType __value = _GLIBCXX_MOVE(*(__last - 1));\n       std::__push_heap(__first, _DistanceType((__last - __first) - 1),\n-\t\t       _DistanceType(0), _GLIBCXX_MOVE(__value), __cmp);\n+\t\t       _DistanceType(0), _GLIBCXX_MOVE(__value),\n+\t\t       _GLIBCXX_MOVE(__comp));\n     }\n \n   template<typename _RandomAccessIterator, typename _Distance,\n@@ -222,15 +224,17 @@ _GLIBCXX_BEGIN_NAMESPACE_VERSION\n     _GLIBCXX20_CONSTEXPR\n     void\n     __adjust_heap(_RandomAccessIterator __first, _Distance __holeIndex,\n-\t\t  _Distance __len, _Tp __value, _Compare __comp)\n+\t\t  _Distance __len,\n+\t\t  _GLIBCXX_CP_FWDREF(_Tp) __value,\n+\t\t  _GLIBCXX_CP_FWDREF(_Compare) __comp)\n     {\n       const _Distance __topIndex = __holeIndex;\n       _Distance __secondChild = __holeIndex;\n       while (__secondChild < (__len - 1) / 2)\n \t{\n \t  __secondChild = 2 * (__secondChild + 1);\n-\t  if (__comp(__first + __secondChild,\n-\t\t     __first + (__secondChild - 1)))\n+\t  if (__comp(__first[__secondChild],\n+\t\t     __first[__secondChild - 1]))\n \t    __secondChild--;\n \t  *(__first + __holeIndex) = _GLIBCXX_MOVE(*(__first + __secondChild));\n \t  __holeIndex = __secondChild;\n@@ -242,17 +246,22 @@ _GLIBCXX_BEGIN_NAMESPACE_VERSION\n \t\t\t\t\t\t     + (__secondChild - 1)));\n \t  __holeIndex = __secondChild - 1;\n \t}\n-      __decltype(__gnu_cxx::__ops::__iter_comp_val(_GLIBCXX_MOVE(__comp)))\n-\t__cmp(_GLIBCXX_MOVE(__comp));\n+\n+      __decltype(__gnu_cxx::__ops::__less_val\n+\t\t (_GLIBCXX_FORWARD(_Compare, __comp), __first, __value)) __cmp\n+\t= __gnu_cxx::__ops::__less_val\n+\t(_GLIBCXX_FORWARD(_Compare, __comp), __first, __value);\n       std::__push_heap(__first, __holeIndex, __topIndex,\n-\t\t       _GLIBCXX_MOVE(__value), __cmp);\n+\t\t       _GLIBCXX_FORWARD(_Tp, __value),\n+\t\t       _GLIBCXX_MOVE(__cmp));\n     }\n \n   template<typename _RandomAccessIterator, typename _Compare>\n     _GLIBCXX20_CONSTEXPR\n     inline void\n     __pop_heap(_RandomAccessIterator __first, _RandomAccessIterator __last,\n-\t       _RandomAccessIterator __result, _Compare& __comp)\n+\t       _RandomAccessIterator __result,\n+\t       _GLIBCXX_CP_FWDREF(_Compare) __comp)\n     {\n       typedef typename iterator_traits<_RandomAccessIterator>::value_type\n \t_ValueType;\n@@ -263,7 +272,7 @@ _GLIBCXX_BEGIN_NAMESPACE_VERSION\n       *__result = _GLIBCXX_MOVE(*__first);\n       std::__adjust_heap(__first, _DistanceType(0),\n \t\t\t _DistanceType(__last - __first),\n-\t\t\t _GLIBCXX_MOVE(__value), __comp);\n+\t\t_GLIBCXX_MOVE(__value), _GLIBCXX_FORWARD(_Compare, __comp));\n     }\n \n   /**\n@@ -295,8 +304,8 @@ _GLIBCXX_BEGIN_NAMESPACE_VERSION\n       if (__last - __first > 1)\n \t{\n \t  --__last;\n-\t  __gnu_cxx::__ops::_Iter_less_iter __comp;\n-\t  std::__pop_heap(__first, __last, __last, __comp);\n+\t  std::__pop_heap(__first, __last, __last,\n+\t\t\t  __gnu_cxx::__ops::__less(__first));\n \t}\n     }\n \n@@ -327,10 +336,8 @@ _GLIBCXX_BEGIN_NAMESPACE_VERSION\n \n       if (__last - __first > 1)\n \t{\n-\t  typedef __decltype(__comp) _Cmp;\n-\t  __gnu_cxx::__ops::_Iter_comp_iter<_Cmp> __cmp(_GLIBCXX_MOVE(__comp));\n \t  --__last;\n-\t  std::__pop_heap(__first, __last, __last, __cmp);\n+\t  std::__pop_heap(__first, __last, __last, _GLIBCXX_MOVE(__comp));\n \t}\n     }\n \n@@ -338,7 +345,7 @@ _GLIBCXX_BEGIN_NAMESPACE_VERSION\n     _GLIBCXX20_CONSTEXPR\n     void\n     __make_heap(_RandomAccessIterator __first, _RandomAccessIterator __last,\n-\t\t_Compare& __comp)\n+\t\t_GLIBCXX_CP_FWDREF(_Compare) __comp)\n     {\n       typedef typename iterator_traits<_RandomAccessIterator>::value_type\n \t  _ValueType;\n@@ -382,8 +389,7 @@ _GLIBCXX_BEGIN_NAMESPACE_VERSION\n       __glibcxx_requires_valid_range(__first, __last);\n       __glibcxx_requires_irreflexive(__first, __last);\n \n-      __gnu_cxx::__ops::_Iter_less_iter __comp;\n-      std::__make_heap(__first, __last, __comp);\n+      std::__make_heap(__first, __last, __gnu_cxx::__ops::__less(__first));\n     }\n \n   /**\n@@ -408,16 +414,14 @@ _GLIBCXX_BEGIN_NAMESPACE_VERSION\n       __glibcxx_requires_valid_range(__first, __last);\n       __glibcxx_requires_irreflexive_pred(__first, __last, __comp);\n \n-      typedef __decltype(__comp) _Cmp;\n-      __gnu_cxx::__ops::_Iter_comp_iter<_Cmp> __cmp(_GLIBCXX_MOVE(__comp));\n-      std::__make_heap(__first, __last, __cmp);\n+      std::__make_heap(__first, __last, _GLIBCXX_MOVE(__comp));\n     }\n \n   template<typename _RandomAccessIterator, typename _Compare>\n     _GLIBCXX20_CONSTEXPR\n     void\n     __sort_heap(_RandomAccessIterator __first, _RandomAccessIterator __last,\n-\t\t_Compare& __comp)\n+\t\t_GLIBCXX_CP_FWDREF(_Compare) __comp)\n     {\n       while (__last - __first > 1)\n \t{\n@@ -448,8 +452,7 @@ _GLIBCXX_BEGIN_NAMESPACE_VERSION\n       __glibcxx_requires_irreflexive(__first, __last);\n       __glibcxx_requires_heap(__first, __last);\n \n-      __gnu_cxx::__ops::_Iter_less_iter __comp;\n-      std::__sort_heap(__first, __last, __comp);\n+      std::__sort_heap(__first, __last, __gnu_cxx::__ops::__less(__first));\n     }\n \n   /**\n@@ -475,9 +478,7 @@ _GLIBCXX_BEGIN_NAMESPACE_VERSION\n       __glibcxx_requires_irreflexive_pred(__first, __last, __comp);\n       __glibcxx_requires_heap_pred(__first, __last, __comp);\n \n-      typedef __decltype(__comp) _Cmp;\n-      __gnu_cxx::__ops::_Iter_comp_iter<_Cmp> __cmp(_GLIBCXX_MOVE(__comp));\n-      std::__sort_heap(__first, __last, __cmp);\n+      std::__sort_heap(__first, __last, _GLIBCXX_MOVE(__comp));\n     }\n \n #if __cplusplus >= 201103L\n@@ -504,9 +505,9 @@ _GLIBCXX_BEGIN_NAMESPACE_VERSION\n       __glibcxx_requires_valid_range(__first, __last);\n       __glibcxx_requires_irreflexive(__first, __last);\n \n-      __gnu_cxx::__ops::_Iter_less_iter __comp;\n       return __first +\n-\tstd::__is_heap_until(__first, std::distance(__first, __last), __comp);\n+\tstd::__is_heap_until(__first, std::distance(__first, __last),\n+\t\t\t     __gnu_cxx::__ops::__less());\n     }\n \n   /**\n@@ -532,10 +533,9 @@ _GLIBCXX_BEGIN_NAMESPACE_VERSION\n       __glibcxx_requires_valid_range(__first, __last);\n       __glibcxx_requires_irreflexive_pred(__first, __last, __comp);\n \n-      typedef __decltype(__comp) _Cmp;\n-      __gnu_cxx::__ops::_Iter_comp_iter<_Cmp> __cmp(_GLIBCXX_MOVE(__comp));\n       return __first\n-\t+ std::__is_heap_until(__first, std::distance(__first, __last), __cmp);\n+\t+ std::__is_heap_until(__first, std::distance(__first, __last),\n+\t\t\t       std::move(__comp));\n     }\n \n   /**\n@@ -572,11 +572,10 @@ _GLIBCXX_BEGIN_NAMESPACE_VERSION\n       __glibcxx_requires_irreflexive_pred(__first, __last, __comp);\n \n       const auto __dist = std::distance(__first, __last);\n-      typedef __decltype(__comp) _Cmp;\n-      __gnu_cxx::__ops::_Iter_comp_iter<_Cmp> __cmp(_GLIBCXX_MOVE(__comp));\n-      return std::__is_heap_until(__first, __dist, __cmp) == __dist;\n+      return std::__is_heap_until(__first, __dist,\n+\t\t\t\t  std::move(__comp)) == __dist;\n     }\n-#endif\n+#endif // C++11\n \n _GLIBCXX_END_NAMESPACE_VERSION\n } // namespace\ndiff --git a/libstdc++-v3/include/std/deque b/libstdc++-v3/include/std/deque\nindex 2badab80a6dc..6b977998b20a 100644\n--- a/libstdc++-v3/include/std/deque\n+++ b/libstdc++-v3/include/std/deque\n@@ -66,7 +66,7 @@\n #include <bits/stl_construct.h>\n #include <bits/stl_uninitialized.h>\n #include <bits/stl_deque.h>\n-#include <bits/refwrap.h>\n+#include <bits/move.h>\n #include <bits/range_access.h>\n #include <bits/deque.tcc>\n \n@@ -104,12 +104,11 @@ _GLIBCXX_BEGIN_NAMESPACE_VERSION\n     inline typename deque<_Tp, _Alloc>::size_type\n     erase_if(deque<_Tp, _Alloc>& __cont, _Predicate __pred)\n     {\n-      using namespace __gnu_cxx;\n       _GLIBCXX_STD_C::deque<_Tp, _Alloc>& __ucont = __cont;\n       const auto __osz = __cont.size();\n       const auto __end = __ucont.end();\n       auto __removed = std::__remove_if(__ucont.begin(), __end,\n-\t\t\t\t\t__ops::__pred_iter(std::ref(__pred)));\n+\t\t\t\t\tstd::move(__pred));\n       if (__removed != __end)\n \t{\n \t  __cont.erase(__niter_wrap(__cont.begin(), __removed),\n@@ -130,7 +129,7 @@ _GLIBCXX_BEGIN_NAMESPACE_VERSION\n       const auto __osz = __cont.size();\n       const auto __end = __ucont.end();\n       auto __removed = std::__remove_if(__ucont.begin(), __end,\n-\t\t\t\t\t__ops::__iter_equals_val(__value));\n+\t\t\t\t\t__ops::__equal_val(__value));\n       if (__removed != __end)\n \t{\n \t  __cont.erase(__niter_wrap(__cont.begin(), __removed),\ndiff --git a/libstdc++-v3/include/std/functional b/libstdc++-v3/include/std/functional\nindex 5b329daf184e..db86f1131c4d 100644\n--- a/libstdc++-v3/include/std/functional\n+++ b/libstdc++-v3/include/std/functional\n@@ -75,6 +75,9 @@\n #if _GLIBCXX_HOSTED\n # include <bits/std_function.h>\t// std::function\n #endif\n+#if __cplusplus >= 201402L\n+# include <bits/predefined_ops.h> // std::_Not_fn\n+#endif\n #if __cplusplus >= 201703L\n # if _GLIBCXX_HOSTED\n #  include <unordered_map>\n@@ -965,57 +968,6 @@ _GLIBCXX_BEGIN_NAMESPACE_VERSION\n #endif // __cpp_lib_bind_back\n \n #if __cplusplus >= 201402L\n-  /// Generalized negator.\n-  template<typename _Fn>\n-    class _Not_fn\n-    {\n-      template<typename _Fn2, typename... _Args>\n-\tusing __inv_res_t = typename __invoke_result<_Fn2, _Args...>::type;\n-\n-      template<typename _Tp>\n-\tstatic decltype(!std::declval<_Tp>())\n-\t_S_not() noexcept(noexcept(!std::declval<_Tp>()));\n-\n-    public:\n-      template<typename _Fn2>\n-\tconstexpr\n-\t_Not_fn(_Fn2&& __fn, int)\n-\t: _M_fn(std::forward<_Fn2>(__fn)) { }\n-\n-      _Not_fn(const _Not_fn& __fn) = default;\n-      _Not_fn(_Not_fn&& __fn) = default;\n-      ~_Not_fn() = default;\n-\n-      // Macro to define operator() with given cv-qualifiers ref-qualifiers,\n-      // forwarding _M_fn and the function arguments with the same qualifiers,\n-      // and deducing the return type and exception-specification.\n-#define _GLIBCXX_NOT_FN_CALL_OP( _QUALS )\t\t\t\t\\\n-      template<typename... _Args,\t\t\t\t\t\\\n-\t       typename = enable_if_t<__is_invocable<_Fn _QUALS, _Args...>::value>> \\\n-\t_GLIBCXX20_CONSTEXPR\t\t\t\t\t\t\\\n-\tdecltype(_S_not<__inv_res_t<_Fn _QUALS, _Args...>>())\t\t\\\n-\toperator()(_Args&&... __args) _QUALS\t\t\t\t\\\n-\tnoexcept(__is_nothrow_invocable<_Fn _QUALS, _Args...>::value\t\\\n-\t    && noexcept(_S_not<__inv_res_t<_Fn _QUALS, _Args...>>()))\t\\\n-\t{\t\t\t\t\t\t\t\t\\\n-\t  return !std::__invoke(std::forward< _Fn _QUALS >(_M_fn),\t\\\n-\t\t\t\tstd::forward<_Args>(__args)...);\t\\\n-\t}\t\t\t\t\t\t\t\t\\\n-\t\t\t\t\t\t\t\t\t\\\n-      template<typename... _Args,\t\t\t\t\t\\\n-\t       typename = enable_if_t<!__is_invocable<_Fn _QUALS, _Args...>::value>> \\\n-\tvoid operator()(_Args&&... __args) _QUALS = delete;\n-\n-      _GLIBCXX_NOT_FN_CALL_OP( & )\n-      _GLIBCXX_NOT_FN_CALL_OP( const & )\n-      _GLIBCXX_NOT_FN_CALL_OP( && )\n-      _GLIBCXX_NOT_FN_CALL_OP( const && )\n-#undef _GLIBCXX_NOT_FN_CALL_OP\n-\n-    private:\n-      _Fn _M_fn;\n-    };\n-\n   template<typename _Tp, typename _Pred>\n     struct __is_byte_like : false_type { };\n \ndiff --git a/libstdc++-v3/include/std/inplace_vector b/libstdc++-v3/include/std/inplace_vector\nindex b5a81bed3c98..f3aea9119430 100644\n--- a/libstdc++-v3/include/std/inplace_vector\n+++ b/libstdc++-v3/include/std/inplace_vector\n@@ -42,7 +42,6 @@\n #include <bits/ranges_base.h> // borrowed_iterator_t, __detail::__container_compatible_range\n #include <bits/ranges_util.h> // subrange\n #include <bits/ranges_uninitialized.h>\n-#include <bits/refwrap.h>\n #include <bits/stl_construct.h>\n #include <bits/stl_uninitialized.h>\n #include <bits/stl_algo.h> // rotate\n@@ -1339,11 +1338,10 @@ _GLIBCXX_BEGIN_NAMESPACE_VERSION\n     constexpr size_t\n     erase_if(inplace_vector<_Tp, _Nm>& __cont, _Predicate __pred)\n     {\n-      using namespace __gnu_cxx;\n       const auto __osz = __cont.size();\n       const auto __end = __cont.end();\n       auto __removed = std::__remove_if(__cont.begin(), __end,\n-\t\t\t\t\t__ops::__pred_iter(std::ref(__pred)));\n+\t\t\t\t\tstd::move(__pred));\n       if (__removed != __end)\n \t{\n \t  __cont.erase(__niter_wrap(__cont.begin(), __removed),\n@@ -1362,7 +1360,7 @@ _GLIBCXX_BEGIN_NAMESPACE_VERSION\n       const auto __osz = __cont.size();\n       const auto __end = __cont.end();\n       auto __removed = std::__remove_if(__cont.begin(), __end,\n-\t\t\t\t\t__ops::__iter_equals_val(__value));\n+\t\t\t\t\t__ops::__equal_val(__value));\n       if (__removed != __end)\n \t{\n \t  __cont.erase(__niter_wrap(__cont.begin(), __removed),\ndiff --git a/libstdc++-v3/include/std/string b/libstdc++-v3/include/std/string\nindex 71864715ff75..e6e0f284e077 100644\n--- a/libstdc++-v3/include/std/string\n+++ b/libstdc++-v3/include/std/string\n@@ -51,7 +51,7 @@\n #include <bits/stl_function.h> // For less\n #include <ext/numeric_traits.h>\n #include <bits/stl_algobase.h>\n-#include <bits/refwrap.h>\n+#include <bits/move.h>\n #include <bits/range_access.h>\n #include <bits/basic_string.h>\n #include <bits/basic_string.tcc>\n@@ -100,11 +100,10 @@ _GLIBCXX_BEGIN_NAMESPACE_VERSION\n     inline typename basic_string<_CharT, _Traits, _Alloc>::size_type\n     erase_if(basic_string<_CharT, _Traits, _Alloc>& __cont, _Predicate __pred)\n     {\n-      using namespace __gnu_cxx;\n       const auto __osz = __cont.size();\n       const auto __end = __cont.end();\n       auto __removed = std::__remove_if(__cont.begin(), __end,\n-\t\t\t\t\t__ops::__pred_iter(std::ref(__pred)));\n+\t\t\t\t\tstd::move(__pred));\n       __cont.erase(__removed, __end);\n       return __osz - __cont.size();\n     }\n@@ -119,7 +118,7 @@ _GLIBCXX_BEGIN_NAMESPACE_VERSION\n       const auto __osz = __cont.size();\n       const auto __end = __cont.end();\n       auto __removed = std::__remove_if(__cont.begin(), __end,\n-\t\t\t\t\t__ops::__iter_equals_val(__value));\n+\t\t\t\t\t__ops::__equal_val(__value));\n       __cont.erase(__removed, __end);\n       return __osz - __cont.size();\n     }\ndiff --git a/libstdc++-v3/include/std/vector b/libstdc++-v3/include/std/vector\nindex a98ffb179ec0..73f27cd2bd4c 100644\n--- a/libstdc++-v3/include/std/vector\n+++ b/libstdc++-v3/include/std/vector\n@@ -67,7 +67,7 @@\n #include <bits/stl_uninitialized.h>\n #include <bits/stl_vector.h>\n #include <bits/stl_bvector.h>\n-#include <bits/refwrap.h>\n+#include <bits/move.h>\n #include <bits/range_access.h>\n \n #ifndef _GLIBCXX_EXPORT_TEMPLATE\n@@ -117,12 +117,11 @@ _GLIBCXX_BEGIN_NAMESPACE_VERSION\n     inline typename vector<_Tp, _Alloc>::size_type\n     erase_if(vector<_Tp, _Alloc>& __cont, _Predicate __pred)\n     {\n-      using namespace __gnu_cxx;\n       _GLIBCXX_STD_C::vector<_Tp, _Alloc>& __ucont = __cont;\n       const auto __osz = __cont.size();\n       const auto __end = __ucont.end();\n       auto __removed = std::__remove_if(__ucont.begin(), __end,\n-\t\t\t\t\t__ops::__pred_iter(std::ref(__pred)));\n+\t\t\t\t\tstd::move(__pred));\n       if (__removed != __end)\n \t{\n \t  __cont.erase(__niter_wrap(__cont.begin(), __removed),\n@@ -144,7 +143,7 @@ _GLIBCXX_BEGIN_NAMESPACE_VERSION\n       const auto __osz = __cont.size();\n       const auto __end = __ucont.end();\n       auto __removed = std::__remove_if(__ucont.begin(), __end,\n-\t\t\t\t\t__ops::__iter_equals_val(__value));\n+\t\t\t\t\t__ops::__equal_val(__value));\n       if (__removed != __end)\n \t{\n \t  __cont.erase(__niter_wrap(__cont.begin(), __removed),\ndiff --git a/libstdc++-v3/src/c++17/memory_resource.cc b/libstdc++-v3/src/c++17/memory_resource.cc\nindex c61569f249ad..d4398b52a700 100644\n--- a/libstdc++-v3/src/c++17/memory_resource.cc\n+++ b/libstdc++-v3/src/c++17/memory_resource.cc\n@@ -26,6 +26,7 @@\n #include <algorithm>\t\t\t// lower_bound, rotate\n #include <atomic>\n #include <bit>\t\t\t\t// has_single_bit, bit_ceil, bit_width\n+#include <functional>\t\t\t// less_equal\n #include <new>\n #include <bits/move.h>\t\t\t// std::__exchange\n #if ATOMIC_POINTER_LOCK_FREE != 2\ndiff --git a/libstdc++-v3/testsuite/25_algorithms/inplace_merge/1.cc b/libstdc++-v3/testsuite/25_algorithms/inplace_merge/1.cc\nindex 84f4e337f8b1..a4bcef166c84 100644\n--- a/libstdc++-v3/testsuite/25_algorithms/inplace_merge/1.cc\n+++ b/libstdc++-v3/testsuite/25_algorithms/inplace_merge/1.cc\n@@ -21,6 +21,7 @@\n // { dg-require-effective-target hosted }\n \n #include <algorithm>\n+#include <vector>\n #include <testsuite_hooks.h>\n #include <testsuite_iterators.h>\n #include <testsuite_new_operators.h>\n@@ -119,6 +120,17 @@ test4()\n     }\n }\n \n+bool bs[] = { false, false, true, false, true, true };\n+std::vector<bool> v(6);\n+\n+void\n+test5()\n+{\n+  v.assign(bs, bs + 6);\n+  inplace_merge(v.begin(), v.begin() + 3, v.end());\n+  VERIFY( !v[0] && !v[1] && !v[2] && v[3] && v[4] && v[5] );\n+}\n+\n int \n main()\n {\n@@ -129,14 +141,17 @@ main()\n   __gnu_test::set_new_limit(sizeof(S) * 4);\n   test3();\n   test4();\n+  test5();\n \n   __gnu_test::set_new_limit(sizeof(S));\n   test3();\n   test4();\n+  test5();\n \n   __gnu_test::set_new_limit(0);\n   test3();\n   test4();\n+  test5();\n \n   return 0;\n }\ndiff --git a/libstdc++-v3/testsuite/25_algorithms/stable_sort/1.cc b/libstdc++-v3/testsuite/25_algorithms/stable_sort/1.cc\nindex 73d8dffbdf9b..8fb8aca4af32 100644\n--- a/libstdc++-v3/testsuite/25_algorithms/stable_sort/1.cc\n+++ b/libstdc++-v3/testsuite/25_algorithms/stable_sort/1.cc\n@@ -84,6 +84,26 @@ test3()\n     VERIFY(array[i].j == i % 2);\n }\n \n+struct NotConstLess\n+{\n+  bool\n+  operator()(S& s1, S& s2)\n+  { return s1.i < s2.i; }\n+};\n+\n+void\n+test4()\n+{\n+#if __cplusplus >= 201103L\n+  NotConstLess less;\n+  S array[] = { -1, -2, 1, 2, -3 ,-5 ,3 , -4, 5, 4 };\n+  test_container<S, random_access_iterator_wrapper> con(array,array + 10);\n+  stable_sort(con.begin(), con.end(), less);\n+  for(int i = 0; i < 10; ++i)\n+    VERIFY(array[i].j == i % 2);\n+#endif\n+}\n+\n int \n main()\n {\n@@ -91,13 +111,17 @@ main()\n   test2();\n \n   test3();\n+  test4();\n \n   __gnu_test::set_new_limit(sizeof(S) * 5);\n   test3();\n+  test4();\n \n   __gnu_test::set_new_limit(sizeof(S));\n   test3();\n+  test4();\n \n   __gnu_test::set_new_limit(0);\n   test3();\n+  test4();\n }\n",
    "prefixes": [
        "v1",
        "1/1"
    ]
}