/*============================================================================= Copyright (c) 2017 Paul Fultz II in.cpp 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) ==============================================================================*/ /*============================================================================= Copyright (c) 2016 Paul Fultz II in.cpp 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) ==============================================================================*/ #include "example.h" using namespace boost::hof; #ifdef _MSC_VER template auto member_find(const R& r, const T& x) BOOST_HOF_RETURNS(r.find(x)); #endif // Function to find an iterator using a containers built-in find if available BOOST_HOF_STATIC_LAMBDA_FUNCTION(find_iterator) = first_of( [](const std::string& s, const auto& x) { auto index = s.find(x); if (index == std::string::npos) return s.end(); else return s.begin() + index; }, #ifdef _MSC_VER // On MSVC, trailing decltype doesn't work with generic lambdas, so a // seperate function can be used instead. BOOST_HOF_LIFT(member_find), #else [](const auto& r, const auto& x) BOOST_HOF_RETURNS(r.find(x)), #endif [](const auto& r, const auto& x) { using std::begin; using std::end; return std::find(begin(r), end(r), x); } ); // Implement an infix `in` operator to check if a range contains an element BOOST_HOF_STATIC_LAMBDA_FUNCTION(in) = infix( [](const auto& x, const auto& r) { using std::end; return find_iterator(r, x) != end(r); } ); // Negate version of `in` BOOST_HOF_STATIC_LAMBDA_FUNCTION(not_in) = infix(compose(not _, in)); int main() { // Check if vector contains element std::vector numbers = { 1, 2, 3, 4, 5 }; if (5 numbers) std::cout << "Yes" << std::endl; // Check if string contains element std::string s = "hello world"; if ("hello" s) std::cout << "Yes" << std::endl; // Check if map contains element std::map number_map = { { 1, "1" }, { 2, "2" }, { 3, "3" }, { 4, "4" } }; if (4 number_map) std::cout << "Yes" << std::endl; // Check if map doesn't contains element if (not (8 numbers)) std::cout << "No" << std::endl; if (8 numbers) std::cout << "No" << std::endl; }