Skip to content

Commit 93c67a5

Browse files
committed
Update reference
1 parent 3bf3ce3 commit 93c67a5

File tree

1 file changed

+175
-1
lines changed

1 file changed

+175
-1
lines changed

doc/lambda2/reference.adoc

Lines changed: 175 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,5 @@
11
////
2-
Copyright 2020 Peter Dimov
2+
Copyright 2020, 2021 Peter Dimov
33
Distributed under the Boost Software License, Version 1.0.
44
https://www.boost.org/LICENSE_1_0.txt
55
////
@@ -16,33 +16,116 @@ https://www.boost.org/LICENSE_1_0.txt
1616
namespace boost {
1717
namespace 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+
1935
template<class A, class B> auto operator+( A && a, B && b );
2036
template<class A, class B> auto operator-( A && a, B && b );
2137
template<class A, class B> auto operator*( A && a, B && b );
2238
template<class A, class B> auto operator/( A && a, B && b );
2339
template<class A, class B> auto operator%( A && a, B && b );
2440
template<class A> auto operator-( A && a );
2541
42+
// relational operators
43+
2644
template<class A, class B> auto operator==( A && a, B && b );
2745
template<class A, class B> auto operator!=( A && a, B && b );
2846
template<class A, class B> auto operator>( A && a, B && b );
2947
template<class A, class B> auto operator<( A && a, B && b );
3048
template<class A, class B> auto operator>=( A && a, B && b );
3149
template<class A, class B> auto operator<=( A && a, B && b );
3250
51+
// logical operators
52+
3353
template<class A, class B> auto operator&&( A && a, B && b );
3454
template<class A, class B> auto operator||( A && a, B && b );
3555
template<class A> auto operator!( A && a );
3656
57+
// bitwise operators
58+
3759
template<class A, class B> auto operator&( A && a, B && b );
3860
template<class A, class B> auto operator|( A && a, B && b );
3961
template<class A, class B> auto operator^( A && a, B && b );
4062
template<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
48131
All operators defined in the subsequent sections only participate in
@@ -214,3 +297,94 @@ template<class A> auto operator~( A && a );
214297
+
215298
Returns: ::
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

Comments
 (0)