Skip to content

Commit eb47bb2

Browse files
authored
Merge pull request #11840 from gottesmm/pr-f328c5f39fd98eb366086253b10e0d6bd653d517
2 parents 1e2ff54 + 7248221 commit eb47bb2

File tree

1 file changed

+18
-2
lines changed

1 file changed

+18
-2
lines changed

include/swift/Basic/STLExtras.h

Lines changed: 18 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -219,17 +219,33 @@ inline void set_union_for_each(const Container1 &C1, const Container2 &C2,
219219
set_union_for_each(C1.begin(), C1.end(), C2.begin(), C2.end(), f);
220220
}
221221

222+
/// If \p it is equal to \p end, then return \p defaultIter. Otherwise, return
223+
/// std::next(\p it).
224+
template <typename Iterator>
225+
inline Iterator next_or_default(Iterator it, Iterator end,
226+
Iterator defaultIter) {
227+
return (it == end) ? defaultIter : std::next(it);
228+
}
229+
230+
/// If \p it is equal to \p begin, then return \p defaultIter. Otherwise, return
231+
/// std::prev(\p it).
232+
template <typename Iterator>
233+
inline Iterator prev_or_default(Iterator it, Iterator begin,
234+
Iterator defaultIter) {
235+
return (it == begin) ? defaultIter : std::prev(it);
236+
}
237+
222238
/// Takes an iterator and an iterator pointing to the end of the iterator range.
223239
/// If the iterator already points to the end of its range, simply return it,
224240
/// otherwise return the next element.
225241
template <typename Iterator>
226242
inline Iterator next_or_end(Iterator it, Iterator end) {
227-
return (it == end) ? end : std::next(it);
243+
return next_or_default(it, end, end);
228244
}
229245

230246
template <typename Iterator>
231247
inline Iterator prev_or_begin(Iterator it, Iterator begin) {
232-
return (it == begin) ? begin : std::prev(it);
248+
return prev_or_default(it, begin, begin);
233249
}
234250

235251
/// @}

0 commit comments

Comments
 (0)