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 <kactivities-features.h>
0010 
0011 /********************************************************************
0012  *  Associative container's for_each (for hash, map, and similar )  *
0013  ********************************************************************/
0014 
0015 namespace kamd
0016 {
0017 namespace utils
0018 {
0019 namespace details
0020 { //_
0021 
0022 // Iterator Functions
0023 
0024 template<typename Iterator, typename Function>
0025 Function qt_for_each_assoc(Iterator start, Iterator end, Function f)
0026 {
0027     for (; start != end; ++start)
0028         f(start.key(), start.value());
0029 
0030     return f;
0031 }
0032 
0033 template<typename Iterator, typename Function>
0034 Function stl_for_each_assoc(Iterator start, Iterator end, Function f)
0035 {
0036     for (; start != end; ++start)
0037         f(start->first, start->second);
0038 
0039     return f;
0040 }
0041 
0042 // Container functions
0043 
0044 template<typename Container, typename Function>
0045 Function _for_each_assoc_helper_container(const Container &c, Function f, decltype(&Container::constBegin) *)
0046 {
0047     // STL will never have methods with camelCase :)
0048     return qt_for_each_assoc(c.constBegin(), c.constEnd(), f);
0049 }
0050 
0051 template<typename Container, typename Function, typename Default>
0052 Function _for_each_assoc_helper_container(const Container &c, Function f, Default *)
0053 {
0054     return stl_for_each_assoc(c.cbegin(), c.cend(), f);
0055 }
0056 
0057 } //^ namespace details
0058 
0059 template<typename Container, typename Function>
0060 Function for_each_assoc(const Container &c, Function f)
0061 {
0062     return details::_for_each_assoc_helper_container<Container, Function>(c, f, nullptr);
0063 }
0064 
0065 } // namespace utils
0066 } // namespace kamd