File indexing completed on 2024-05-19 05:29:33

0001 /*
0002  *   SPDX-FileCopyrightText: 2012-2016 Ivan Cukic <ivan.cukic@kde.org>
0003  *
0004  *   SPDX-License-Identifier: GPL-2.0-only OR GPL-3.0-only OR LicenseRef-KDE-Accepted-GPL
0005  */
0006 
0007 #pragma once
0008 
0009 #include <boost/range/adaptor/filtered.hpp>
0010 #include <boost/range/adaptor/transformed.hpp>
0011 #include <boost/range/algorithm/copy.hpp>
0012 
0013 /********************************************************************
0014  *  Syntactic sugar for converting ranges to collections            *
0015  ********************************************************************/
0016 
0017 namespace kamd
0018 {
0019 namespace utils
0020 {
0021 template<typename Collection, typename Range>
0022 __inline Collection as_collection(Range range)
0023 {
0024     Collection result;
0025 
0026     boost::copy(range, std::back_inserter(result));
0027 
0028     return result;
0029 }
0030 
0031 template<typename Member, typename... Args>
0032 __inline auto transformed(Member member, Args... args) -> decltype(boost::adaptors::transformed(std::bind(member, args..., std::placeholders::_1)))
0033 {
0034     return boost::adaptors::transformed(std::bind(member, args..., std::placeholders::_1));
0035 }
0036 
0037 template<typename Member, typename... Args>
0038 __inline auto filtered(Member member, Args... args) -> decltype(boost::adaptors::filtered(std::bind(member, args..., std::placeholders::_1)))
0039 {
0040     return boost::adaptors::filtered(std::bind(member, args..., std::placeholders::_1));
0041 }
0042 
0043 template<typename Class, typename Member>
0044 __inline auto filtered(Class *const self, Member member) -> decltype(boost::adaptors::filtered(std::bind(member, self, std::placeholders::_1)))
0045 {
0046     return boost::adaptors::filtered(std::bind(member, self, std::placeholders::_1));
0047 }
0048 
0049 } // namespace utils
0050 } // namespace kamd