File indexing completed on 2024-05-12 16:59:21

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