xref: /llvm-project/libcxx/test/support/counting_projection.h (revision b57abb721e7a77210fc86d08192a772d21fd0ac2)
1065202f3SKonstantin Varlamov //===----------------------------------------------------------------------===//
2065202f3SKonstantin Varlamov //
3065202f3SKonstantin Varlamov // Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.
4065202f3SKonstantin Varlamov // See https://llvm.org/LICENSE.txt for license information.
5065202f3SKonstantin Varlamov // SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception
6065202f3SKonstantin Varlamov //
7065202f3SKonstantin Varlamov //===----------------------------------------------------------------------===//
8065202f3SKonstantin Varlamov 
9065202f3SKonstantin Varlamov #ifndef TEST_SUPPORT_COUNTING_PROJECTION_H
10065202f3SKonstantin Varlamov #define TEST_SUPPORT_COUNTING_PROJECTION_H
11065202f3SKonstantin Varlamov 
12065202f3SKonstantin Varlamov #include <functional>
13065202f3SKonstantin Varlamov #include <utility>
14065202f3SKonstantin Varlamov #include "test_macros.h"
15065202f3SKonstantin Varlamov 
16065202f3SKonstantin Varlamov #if TEST_STD_VER > 14
17065202f3SKonstantin Varlamov 
18065202f3SKonstantin Varlamov template <class Proj = std::identity>
19065202f3SKonstantin Varlamov class counting_projection {
20065202f3SKonstantin Varlamov   Proj proj_;
21065202f3SKonstantin Varlamov   int* count_ = nullptr;
22065202f3SKonstantin Varlamov 
23065202f3SKonstantin Varlamov public:
24065202f3SKonstantin Varlamov   constexpr counting_projection() = default;
counting_projection(int & count)25065202f3SKonstantin Varlamov   constexpr counting_projection(int& count) : count_(&count) {}
counting_projection(Proj proj,int & count)26065202f3SKonstantin Varlamov   constexpr counting_projection(Proj proj, int& count) : proj_(std::move(proj)), count_(&count) {}
27065202f3SKonstantin Varlamov 
28065202f3SKonstantin Varlamov   template <class T>
decltype(auto)29065202f3SKonstantin Varlamov   constexpr decltype(auto) operator()(T&& value) const {
30065202f3SKonstantin Varlamov     ++(*count_);
31*760d2b46SNikolas Klauser     return std::invoke(proj_, std::forward<T>(value));
32065202f3SKonstantin Varlamov   }
33065202f3SKonstantin Varlamov };
34065202f3SKonstantin Varlamov 
35065202f3SKonstantin Varlamov counting_projection(int& count) -> counting_projection<std::identity>;
36065202f3SKonstantin Varlamov template <class Proj>
37065202f3SKonstantin Varlamov counting_projection(Proj proj, int& count) -> counting_projection<Proj>;
38065202f3SKonstantin Varlamov 
39065202f3SKonstantin Varlamov #endif // TEST_STD_VER > 14
40065202f3SKonstantin Varlamov 
41065202f3SKonstantin Varlamov #endif // TEST_SUPPORT_COUNTING_PROJECTION_H
42