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