diff options
author | Daniel Baumann <daniel.baumann@progress-linux.org> | 2024-04-27 18:24:20 +0000 |
---|---|---|
committer | Daniel Baumann <daniel.baumann@progress-linux.org> | 2024-04-27 18:24:20 +0000 |
commit | 483eb2f56657e8e7f419ab1a4fab8dce9ade8609 (patch) | |
tree | e5d88d25d870d5dedacb6bbdbe2a966086a0a5cf /src/boost/libs/hof/example/in.cpp | |
parent | Initial commit. (diff) | |
download | ceph-483eb2f56657e8e7f419ab1a4fab8dce9ade8609.tar.xz ceph-483eb2f56657e8e7f419ab1a4fab8dce9ade8609.zip |
Adding upstream version 14.2.21.upstream/14.2.21upstream
Signed-off-by: Daniel Baumann <daniel.baumann@progress-linux.org>
Diffstat (limited to 'src/boost/libs/hof/example/in.cpp')
-rw-r--r-- | src/boost/libs/hof/example/in.cpp | 81 |
1 files changed, 81 insertions, 0 deletions
diff --git a/src/boost/libs/hof/example/in.cpp b/src/boost/libs/hof/example/in.cpp new file mode 100644 index 00000000..a8954140 --- /dev/null +++ b/src/boost/libs/hof/example/in.cpp @@ -0,0 +1,81 @@ +/*============================================================================= + 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; + +} + |