Blame view

3rdparty/boost_1_81_0/boost/hof/tap.hpp 2.07 KB
63e88f80   Hu Chunming   提交三方库
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
  /*=============================================================================
      Copyright (c) 2014 Paul Fultz II
      tap.h
      Distributed under the Boost Software License, Version 1.0. (See accompanying
      file LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt)
  ==============================================================================*/
  
  #ifndef BOOST_HOF_GUARD_FUNCTION_TAP_H
  #define BOOST_HOF_GUARD_FUNCTION_TAP_H
  
  /// tap
  /// ===
  /// 
  /// Description
  /// -----------
  /// 
  /// The `tap` function invokes a function on the first argument passed in and
  /// then returns the first argument. This is useful in a chain of pipable
  /// function to perform operations on intermediate results. As a result, this
  /// function is [`pipable`](/include/boost/hof/pipable).
  /// 
  /// Synopsis
  /// --------
  /// 
  ///     template<class T, class F>
  ///     pipable constexpr T tap(T&& x, const F& f);
  /// 
  /// Requirements
  /// ------------
  /// 
  /// F must be:
  /// 
  /// * [UnaryInvocable](UnaryInvocable)
  /// 
  /// Example
  /// -------
  /// 
  ///     #include <boost/hof.hpp>
  ///     #include <cassert>
  ///     #include <iostream>
  ///     using namespace boost::hof;
  /// 
  ///     struct sum_f
  ///     {
  ///         template<class T, class U>
  ///         T operator()(T x, U y) const
  ///         {
  ///             return x+y;
  ///         }
  ///     };
  /// 
  ///     const pipable_adaptor<sum_f> sum = {};
  ///     int main() {
  ///         // Prints 3
  ///         int r = 1 | sum(2) | tap([](int i) { std::cout << i; }) | sum(2);
  ///         assert(r == 5);
  ///     }
  /// 
  
  #include <boost/hof/pipable.hpp>
  #include <boost/hof/apply.hpp>
  #include <boost/hof/detail/static_const_var.hpp>
  
  namespace boost { namespace hof { namespace detail {
  
  struct tap_f
  {
      template<class T, class F>
      constexpr T operator()(T&& x, const F& f) const
      BOOST_HOF_RETURNS_DEDUCE_NOEXCEPT((boost::hof::apply(f, x), BOOST_HOF_FORWARD(T)(x)))
      {
          return boost::hof::apply(f, x), BOOST_HOF_FORWARD(T)(x);
      }
  };
  
  }
  
  BOOST_HOF_DECLARE_STATIC_VAR(tap, pipable_adaptor<detail::tap_f>);
  
  
  }} // namespace boost::hof
  
  #endif