11////
2- Copyright 2020 Peter Dimov
2+ Copyright 2020, 2021 Peter Dimov
33Distributed under the Boost Software License, Version 1.0.
44https://www.boost.org/LICENSE_1_0.txt
55////
@@ -16,33 +16,116 @@ https://www.boost.org/LICENSE_1_0.txt
1616namespace boost {
1717namespace lambda2 {
1818
19+ // placeholders
20+
21+ template<int I > struct lambda2_arg;
22+
23+ inline constexpr lambda2_arg<1> _1{};
24+ inline constexpr lambda2_arg<1> _2{};
25+ inline constexpr lambda2_arg<1> _3{};
26+ inline constexpr lambda2_arg<1> _4{};
27+ inline constexpr lambda2_arg<1> _5{};
28+ inline constexpr lambda2_arg<1> _6{};
29+ inline constexpr lambda2_arg<1> _7{};
30+ inline constexpr lambda2_arg<1> _8{};
31+ inline constexpr lambda2_arg<1> _9{};
32+
33+ // arithmetic operators
34+
1935template<class A, class B> auto operator+( A && a, B && b );
2036template<class A, class B> auto operator-( A && a, B && b );
2137template<class A, class B> auto operator*( A && a, B && b );
2238template<class A, class B> auto operator/( A && a, B && b );
2339template<class A, class B> auto operator%( A && a, B && b );
2440template<class A> auto operator-( A && a );
2541
42+ // relational operators
43+
2644template<class A, class B> auto operator==( A && a, B && b );
2745template<class A, class B> auto operator!=( A && a, B && b );
2846template<class A, class B> auto operator>( A && a, B && b );
2947template<class A, class B> auto operator<( A && a, B && b );
3048template<class A, class B> auto operator>=( A && a, B && b );
3149template<class A, class B> auto operator<=( A && a, B && b );
3250
51+ // logical operators
52+
3353template<class A, class B> auto operator&&( A && a, B && b );
3454template<class A, class B> auto operator||( A && a, B && b );
3555template<class A> auto operator!( A && a );
3656
57+ // bitwise operators
58+
3759template<class A, class B> auto operator&( A && a, B && b );
3860template<class A, class B> auto operator|( A && a, B && b );
3961template<class A, class B> auto operator^( A && a, B && b );
4062template<class A> auto operator~( A && a );
4163
64+ template<class A, class B> auto operator<<( A && a, B && b );
65+ template<class A, class B> auto operator>>( A && a, B && b );
66+
67+ // additional unary operators
68+
69+ template<class A> auto operator+( A && a );
70+ template<class A> auto operator*( A && a );
71+ template<class A> auto operator++( A && a );
72+ template<class A> auto operator--( A && a );
73+ template<class A> auto operator++( A && a, int );
74+ template<class A> auto operator--( A && a, int );
75+
76+ // compound assignment operators
77+
78+ template<class A, class B> auto operator+=( A && a, B && b );
79+ template<class A, class B> auto operator-=( A && a, B && b );
80+ template<class A, class B> auto operator*=( A && a, B && b );
81+ template<class A, class B> auto operator/=( A && a, B && b );
82+ template<class A, class B> auto operator%=( A && a, B && b );
83+ template<class A, class B> auto operator&=( A && a, B && b );
84+ template<class A, class B> auto operator|=( A && a, B && b );
85+ template<class A, class B> auto operator^=( A && a, B && b );
86+ template<class A, class B> auto operator<<=( A && a, B && b );
87+ template<class A, class B> auto operator>>=( A && a, B && b );
88+
4289} // namespace lambda2
4390} // namespace boost
4491```
4592
93+ ### Placeholders
94+
95+ ```
96+ template<int I> struct lambda2_arg
97+ {
98+ template<class... A> decltype(auto) operator()( A&&... a ) const noexcept;
99+ template<class T> auto operator[]( T&& t ) const;
100+ };
101+ ```
102+
103+ `lambda2_arg<I>` is the type of the library-provided placeholders `_I`. The
104+ standard customization point `std::is_placeholder` is specialized for it,
105+ enabling the use of Lambda2's placeholders with `std::bind`.
106+
107+ The placeholders define `operator()`, which permits their direct use as
108+ function objects. E.g. `_1(x, y)` returns `x`.
109+
110+ `operator[]` is also defined to allow expressions like `_1[x]` or `_1[_2]`.
111+
112+ ```
113+ template<class... A> decltype(auto) operator()( A&&... a ) const noexcept;
114+ ```
115+ [none]
116+ * {blank}
117+ +
118+ Returns: :: `std::get<std::size_t{I-1}>( std::tuple<A&&...>( std::forward<A>(a)... ) );`
119+
120+ ```
121+ template<class T> auto operator[]( T&& t ) const;
122+ ```
123+ [none]
124+ * {blank}
125+ +
126+ Returns: :: `std::bind( fn, *this, std::forward<T>(t) );`, where `fn` is
127+ a function object such that `fn(x, y)` returns `x[y]`.
128+
46129### Common Requirements
47130
48131All operators defined in the subsequent sections only participate in
@@ -214,3 +297,94 @@ template<class A> auto operator~( A && a );
214297+
215298Returns: ::
216299 `std::bind( std::bit_not<>(), std::forward<A>(a) );`
300+
301+ ```
302+ template<class A, class B> auto operator<<( A && a, B && b );
303+ ```
304+ [none]
305+ * {blank}
306+ +
307+ Returns: :: `std::bind( fn, std::forward<A>(a), std::forward<B>(b) );`,
308+ where `fn` is a function object such that `fn(x, y)` returns `x << y`.
309+
310+ ```
311+ template<class A, class B> auto operator>>( A && a, B && b );
312+ ```
313+ [none]
314+ * {blank}
315+ +
316+ Returns: :: `std::bind( fn, std::forward<A>(a), std::forward<B>(b) );`,
317+ where `fn` is a function object such that `fn(x, y)` returns `x >> y`.
318+
319+ ### Additional Unary Operators
320+
321+ ```
322+ template<class A> auto operator+( A && a );
323+ ```
324+ [none]
325+ * {blank}
326+ +
327+ Returns: ::
328+ `std::bind( fn, std::forward<A>(a) );`, where `fn` is a function object
329+ such that `fn(x)` returns `+x`.
330+
331+ ```
332+ template<class A> auto operator*( A && a );
333+ ```
334+ [none]
335+ * {blank}
336+ +
337+ Returns: ::
338+ `std::bind( fn, std::forward<A>(a) );`, where `fn` is a function object
339+ such that `fn(x)` returns `*x`.
340+
341+ ```
342+ template<class A> auto operator++( A && a );
343+ ```
344+ [none]
345+ * {blank}
346+ +
347+ Returns: ::
348+ `std::bind( fn, std::forward<A>(a) );`, where `fn` is a function object
349+ such that `fn(x)` returns `++x`.
350+
351+ ```
352+ template<class A> auto operator--( A && a );
353+ ```
354+ [none]
355+ * {blank}
356+ +
357+ Returns: ::
358+ `std::bind( fn, std::forward<A>(a) );`, where `fn` is a function object
359+ such that `fn(x)` returns `--x`.
360+
361+ ```
362+ template<class A> auto operator++( A && a, int );
363+ ```
364+ [none]
365+ * {blank}
366+ +
367+ Returns: ::
368+ `std::bind( fn, std::forward<A>(a) );`, where `fn` is a function object
369+ such that `fn(x)` returns `x++`.
370+
371+ ```
372+ template<class A> auto operator--( A && a, int );
373+ ```
374+ [none]
375+ * {blank}
376+ +
377+ Returns: ::
378+ `std::bind( fn, std::forward<A>(a) );`, where `fn` is a function object
379+ such that `fn(x)` returns `x--`.
380+
381+ ### Compound Assignment Operators
382+
383+ ```
384+ template<class A, class B> auto operator@=( A && a, B && b );
385+ ```
386+ [none]
387+ * {blank}
388+ +
389+ Returns: :: `std::bind( fn, std::forward<A>(a), std::forward<B>(b) );`,
390+ where `fn` is a function object such that `fn(x, y)` returns `x @= y`.
0 commit comments