Adobe Source Libraries 1.49.0
A collection of C++ libraries.
Loading...
Searching...
No Matches
erase_if.hpp
Go to the documentation of this file.
1/*
2 Copyright 2013 Adobe
3 Distributed under the Boost Software License, Version 1.0.
4 (See accompanying file LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt)
5*/
6/**************************************************************************************************/
7
8#ifndef ADOBE_ALGORITHM_ERASE_IF_HPP
9#define ADOBE_ALGORITHM_ERASE_IF_HPP
10
11#include <adobe/config.hpp>
12
13#include <cassert>
14
15#include <boost/next_prior.hpp>
16#include <boost/range/begin.hpp>
17#include <boost/range/end.hpp>
18
22
23/**************************************************************************************************/
24
25namespace adobe {
26
27/**************************************************************************************************/
41/**************************************************************************************************/
42
43namespace implementation {
44
45
46template <typename T> // T models Container
47typename T::iterator erase(T& x, typename T::iterator f, typename T::iterator l, block_tag) {
48 return x.erase(f, l);
49}
50
51template <typename T> // T models Container
52typename T::iterator erase(T& x, typename T::iterator f, typename T::iterator l, node_tag) {
53 x.erase(f, l);
54 return l;
55}
56
57} // namespace implementation
58
59/**************************************************************************************************/
60
64template <typename T> // T models Container
65typename T::iterator erase(T& x, typename T::iterator f, typename T::iterator l) {
66 return implementation::erase(x, f, l, typename storage_category<T>::type());
67}
68
69/**************************************************************************************************/
70
74template <typename T, // T models Container
75 typename R>
76// R models Range(iterator(T), iterator(T))
77typename T::iterator erase(T& x, const R& r) {
78 return erase(x, boost::begin(r), boost::end(r));
79}
80
84
85template <typename T> // T models Container
86typename T::iterator erase(T& x, typename T::iterator f) {
87 assert(f != end(x) && "FATAL (sparent) : Attempt to erase the end of a container.");
88 return erase(x, f, boost::next(f));
89}
90
91/**************************************************************************************************/
92
93namespace implementation {
94
95template <typename T, // T models Container
96 typename P>
97// P models UnaryPredicate
98void erase_if(T& x, typename T::iterator f, typename T::iterator l, P p, block_tag) {
99 x.erase(adobe::remove_if(f, l, p), l);
100}
101
102template <typename T, // T models Container
103 typename P>
104// P models UnaryPredicate
105void erase_if(T& x, typename T::iterator f, typename T::iterator l, P p, node_tag) {
106 while (f != l) {
107 f = adobe::erase(x, find_range_if(f, l, p));
108 }
109}
110
111} // namespace implementation
112
113/**************************************************************************************************/
114
118
119template <typename T, // T models Container
120 typename P>
121// P models UnaryPredicate
122void erase_if(T& x, typename T::iterator f, typename T::iterator l, P p) {
123 implementation::erase_if(x, f, l, p, typename storage_category<T>::type());
124}
125
129
130template <typename T, // T models Container
131 typename P>
132// P models UnaryPredicate
133void erase_if(T& x, P p) {
134 erase_if(x, boost::begin(x), boost::end(x), p);
135}
136
137/**************************************************************************************************/
138
139} // namespace adobe
140
141/**************************************************************************************************/
142
143#endif
144
145/**************************************************************************************************/
T::iterator erase(T &x, typename T::iterator f, typename T::iterator l)
Definition erase_if.hpp:65
void erase_if(T &x, typename T::iterator f, typename T::iterator l, P p)
Definition erase_if.hpp:122
std::pair< I, I > find_range_if(I f, I l, P p)
Definition find.hpp:211
InputIterator remove_if(InputIterator first, InputIterator last, Predicate pred)
remove implementation
Definition remove.hpp:51