<table border="1" cellspacing="0" cellpadding="8">
    <tr>
        <th>Issue</th>
        <td>
            <a href=https://github.com/llvm/llvm-project/issues/133583>133583</a>
        </td>
    </tr>

    <tr>
        <th>Summary</th>
        <td>
            [clang-tidy] Check request: boost-use-lambda2
        </td>
    </tr>

    <tr>
      <th>Labels</th>
      <td>
            clang-tidy
      </td>
    </tr>

    <tr>
      <th>Assignees</th>
      <td>
      </td>
    </tr>

    <tr>
      <th>Reporter</th>
      <td>
          denzor200
      </td>
    </tr>
</table>

<pre>
    C++11 lambdas are known to be cumbersome. Even for a simple STL algorithm predicate its mandatory to specify:
-Three different braces;
-List of arguments;
-Return statement with the expression.
While specifying only the expression would be more than enough for STL algorithms. Thats the reason why some programmers refrain from STL algorithms usage and would prefer to write manual `for` loop. The [Boost Lambda 2 library](https://www.boost.org/doc/libs/1_87_0/libs/lambda2/doc/html/lambda2.html) is intended to resolve the described problem.

Need a check that will find a C++11 lambdas which might be converted to lambdas from Boost Lambda 2 and will suggest to convert them.

BEFORE:
```
int count_even( int const * first, int const * last )
{
    return std::count_if( first, last, [](int val) {
        return val % 2 == 0;
    });
}

char const * find_whitespace( char const * first, char const * last )
{
    return std::find_if( first, last, [](char ch) {
        return ch == ' ' || ch == '\t' || ch == '\r' || ch == '\n';
    });
}

void print( std::map<int, std::string> const & m )
{
    std::for_each( m.begin(), m.end(), [](const auto& node) {
        std::cout << node->first << ": " << node->second << '\n';
    });
}
```

AFTER:
```
int count_even( int const * first, int const * last )
{
    using namespace boost::lambda2;
    return std::count_if( first, last, _1 % 2 == 0 );
}

char const * find_whitespace( char const * first, char const * last )
{
    using namespace boost::lambda2;

    return std::find_if( first, last,
 _1 == ' ' || _1 == '\t' || _1 == '\r' || _1 == '\n' );
}

void print( std::map<int, std::string> const & m )
{
    using namespace boost::lambda2;
    std::for_each( m.begin(), m.end(),
        std::cout << _1->*first << ": " << _1->*second << '\n' );
}
```

</pre>
<img width="1" height="1" alt="" src="http://email.email.llvm.org/o/eJy8Vktv6zYT_TX0ZmBDpiw_Fl74uQq-D0gDdGlQ1EhiLx8uSdl1f30xVBwnTm-Se4FeIIHE4fCQ58wcmSIE1VjEJSvWrNgORBdb55cV2r-d51k2KF11WW4YXzO-Ho9BC1NWIoDwCN-sO1uIDkoE2ZkSfXAGR7A7oYXaeRAQlDlqhN-eHkDoxnkVWwNHj5WSIiKoGMAIW4no_IWQwhGlqi8sX7FsNXxqPSJUqq7Ro41QeiExsHxNkw8qRHA1CN90Bm28xh8xdt5CiCIixeGsYguxRcC_jh5DUM6OWLb6vVUarxsq24Cz-nKXB2fX6Yr4GecRYissoHVd0yZ-b2iFETy1IoYE4VEEWt5egDSBo3eNF8agD-Cx9kJZqL0zdxDQBdEgCFs973z0WKMnZc5eRSSxOqGBTbPaeTbNQDt3pI0RWLFeOxciPKQSAQetSi_8hRVbxudtjMdAuvI94_vz-TwqKXvkfMP4vnKS8b1WZWB8Pz7MZ4fsNu5rzl_S2mj0LTzqhwtQAZSNaCus6MAeg9MnTHJUGKRXJRIhV2o0VACWrf6HWIEA2aL8RupSsbSGWlkKv--6c6tkC0Y1bUxN5-wJfez3u-YkWe-USIIScuiaBkOk_OfFdL7rcda7_f8fd33zsWn2_JetlI0gXWfjAU9oGZ9DH7EhAuMrqJUPkfHNXViL9LIgtBn1JgCAv7ZnRfvkqx5X1YT6gkMr6dmbkvE5AZ9EkvkG9QruRE3BC-DA8i3Lt5D1bqAUNtvSIdKY3hNV2Qr_hoGtDudWRQxHIZEO8y7j-Wx38S-RTPCfceyB2-9ylO2VHOOz_n-2YbPN2wlWbOIHc_6DOUuPj2U7OUU9rGwkLi_8jDiyfJOim1s0RK9sw_Ldi1xTMO-0uonk_AEFCTAHMyqxUdRqlM43YEZoq9vwJlpCFl10hG5dhe_1e91rEVi-YfkmpQ5Zvkv1uAYZ5yxf0eM-LaB0trrlfUmvVxZi2Wq1f9o9_rfm6gJ9yK0wfRtD-sT13K8fsfynjHgY39kLfrWlvkrtxx1IK4jfv3rrzcSdt-7n_Adztsf9BX76kR74Ge99ZqzDmPzC-OoTZ73kfc9a7-R6ZZpBtcyrRb4QA1yOZ5OcF7yYTwftMs9klZViPsaZrIuxGC8mspxyuZhOxFyWOFBLnvEiy_lizCeLyXQ0nc6knGSyLBYFL7MJm2RohNIjrU-GrgcDFUKHy3GeF_N8oEWJOqTrIudSC9sMo6ouxK_YDvySVg3LrglskmkVYrjhRBV1umi-WlZsYZN-_T3-2WEqVF-xYRdw-FywQef18u0FplGx7cqRdIZuIvp0fQyP3v2BMjK-T8dO95n-5Kcl_ycAAP__6O857A">