@@ -219,17 +219,33 @@ inline void set_union_for_each(const Container1 &C1, const Container2 &C2,
219
219
set_union_for_each (C1.begin (), C1.end (), C2.begin (), C2.end (), f);
220
220
}
221
221
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
+
222
238
// / Takes an iterator and an iterator pointing to the end of the iterator range.
223
239
// / If the iterator already points to the end of its range, simply return it,
224
240
// / otherwise return the next element.
225
241
template <typename Iterator>
226
242
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);
228
244
}
229
245
230
246
template <typename Iterator>
231
247
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);
233
249
}
234
250
235
251
// / @}
0 commit comments