File indexing completed on 2024-11-24 04:52:54

0001 /* Copyright (C) 2006 - 2014 Jan Kundrát <jkt@flaska.net>
0002 
0003    This file is part of the Trojita Qt IMAP e-mail client,
0004    http://trojita.flaska.net/
0005 
0006    This program is free software; you can redistribute it and/or
0007    modify it under the terms of the GNU General Public License as
0008    published by the Free Software Foundation; either version 2 of
0009    the License or (at your option) version 3 or any later version
0010    accepted by the membership of KDE e.V. (or its successor approved
0011    by the membership of KDE e.V.), which shall act as a proxy
0012    defined in Section 14 of version 3 of the license.
0013 
0014    This program is distributed in the hope that it will be useful,
0015    but WITHOUT ANY WARRANTY; without even the implied warranty of
0016    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
0017    GNU General Public License for more details.
0018 
0019    You should have received a copy of the GNU General Public License
0020    along with this program.  If not, see <http://www.gnu.org/licenses/>.
0021 */
0022 
0023 #ifndef TROJITA_FIND_WITH_UNKNOWN_H
0024 #define TROJITA_FIND_WITH_UNKNOWN_H
0025 
0026 namespace Common {
0027 
0028 /** @short Perform a linear search between the pair of iterators and find a first occurrence of the specified value
0029 
0030 The function will completely ignore any items for which isUnknown returns true.
0031 
0032 If no item matching the specification is present in the sequence, a place where it can be inserted without violating these constraints is returned.
0033 */
0034 template <typename RandomAccessIterator, typename T, typename IsUnknown, typename LessThan>
0035 RandomAccessIterator linearLowerBoundWithUnknownElements(RandomAccessIterator begin, RandomAccessIterator end, const T &value, IsUnknown isUnknown, LessThan lessThan)
0036 {
0037     while (begin < end) {
0038         if (isUnknown(*begin)) {
0039             ++begin;
0040         } else if (lessThan(*begin, value)) {
0041             ++begin;
0042         } else {
0043             return begin;
0044         }
0045     }
0046     return begin;
0047 }
0048 
0049 template <typename RandomAccessIterator, typename T, typename IsUnknown, typename LessThan>
0050 RandomAccessIterator lowerBoundWithUnknownElements(RandomAccessIterator begin, RandomAccessIterator end, const T &value, IsUnknown isUnknown, LessThan lessThan)
0051 {
0052     RandomAccessIterator middle;
0053     int n = int(end - begin);
0054     int half;
0055 
0056     while (n > 0) {
0057         half = n >> 1;
0058         middle = begin + half;
0059         if (isUnknown(*middle)) {
0060             return linearLowerBoundWithUnknownElements(begin, begin + n, value, isUnknown, lessThan);
0061         }
0062         if (lessThan(*middle, value)) {
0063             begin = middle + 1;
0064             n -= half + 1;
0065         } else {
0066             n = half;
0067         }
0068     }
0069     return begin;
0070 }
0071 
0072 }
0073 
0074 #endif // TROJITA_FIND_WITH_UNKNOWN_H