123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081 |
- /*=============================================================================
- 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<class R, class T>
- 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<int> numbers = { 1, 2, 3, 4, 5 };
- if (5 <in> numbers) std::cout << "Yes" << std::endl;
- // Check if string contains element
- std::string s = "hello world";
- if ("hello" <in> s) std::cout << "Yes" << std::endl;
- // Check if map contains element
- std::map<int, std::string> number_map = {
- { 1, "1" },
- { 2, "2" },
- { 3, "3" },
- { 4, "4" }
- };
- if (4 <in> number_map) std::cout << "Yes" << std::endl;
- // Check if map doesn't contains element
- if (not (8 <in> numbers)) std::cout << "No" << std::endl;
- if (8 <not_in> numbers) std::cout << "No" << std::endl;
- }
|