Skip to content

Commit 205f5ff

Browse files
committed
Update searchers to return a pair of iterators
1 parent 782d766 commit 205f5ff

File tree

8 files changed

+176
-133
lines changed

8 files changed

+176
-133
lines changed

include/boost/algorithm/searching/boyer_moore.hpp

Lines changed: 18 additions & 14 deletions
Original file line numberDiff line numberDiff line change
@@ -75,25 +75,27 @@ mismatch on a character that _is_ in the pattern.
7575
/// \param corpus_last One past the end of the data to search
7676
///
7777
template <typename corpusIter>
78-
corpusIter operator () ( corpusIter corpus_first, corpusIter corpus_last ) const {
78+
std::pair<corpusIter, corpusIter>
79+
operator () ( corpusIter corpus_first, corpusIter corpus_last ) const {
7980
BOOST_STATIC_ASSERT (( boost::is_same<
8081
typename std::iterator_traits<patIter>::value_type,
8182
typename std::iterator_traits<corpusIter>::value_type>::value ));
8283

83-
if ( corpus_first == corpus_last ) return corpus_last; // if nothing to search, we didn't find it!
84-
if ( pat_first == pat_last ) return corpus_first; // empty pattern matches at start
84+
if ( corpus_first == corpus_last ) return std::make_pair(corpus_last, corpus_last); // if nothing to search, we didn't find it!
85+
if ( pat_first == pat_last ) return std::make_pair(corpus_first, corpus_first); // empty pattern matches at start
8586

8687
const difference_type k_corpus_length = std::distance ( corpus_first, corpus_last );
8788
// If the pattern is larger than the corpus, we can't find it!
8889
if ( k_corpus_length < k_pattern_length )
89-
return corpus_last;
90+
return std::make_pair(corpus_last, corpus_last);
9091

9192
// Do the search
92-
return this->do_search ( corpus_first, corpus_last );
93+
return this->do_search ( corpus_first, corpus_last );
9394
}
9495

9596
template <typename Range>
96-
typename boost::range_iterator<Range>::type operator () ( Range &r ) const {
97+
std::pair<typename boost::range_iterator<Range>::type, typename boost::range_iterator<Range>::type>
98+
operator () ( Range &r ) const {
9799
return (*this) (boost::begin(r), boost::end(r));
98100
}
99101

@@ -112,7 +114,8 @@ mismatch on a character that _is_ in the pattern.
112114
/// \param p A predicate used for the search comparisons.
113115
///
114116
template <typename corpusIter>
115-
corpusIter do_search ( corpusIter corpus_first, corpusIter corpus_last ) const {
117+
std::pair<corpusIter, corpusIter>
118+
do_search ( corpusIter corpus_first, corpusIter corpus_last ) const {
116119
/* ---- Do the matching ---- */
117120
corpusIter curPos = corpus_first;
118121
const corpusIter lastPos = corpus_last - k_pattern_length;
@@ -126,7 +129,7 @@ mismatch on a character that _is_ in the pattern.
126129
j--;
127130
// We matched - we're done!
128131
if ( j == 0 )
129-
return curPos;
132+
return std::make_pair(curPos, curPos + k_pattern_length);
130133
}
131134

132135
// Since we didn't match, figure out how far to skip forward
@@ -138,7 +141,7 @@ mismatch on a character that _is_ in the pattern.
138141
curPos += suffix_ [ j ];
139142
}
140143

141-
return corpus_last; // We didn't find anything
144+
return std::make_pair(corpus_last, corpus_last); // We didn't find anything
142145
}
143146

144147

@@ -211,7 +214,7 @@ mismatch on a character that _is_ in the pattern.
211214
/// \param pat_last One past the end of the data to search for
212215
///
213216
template <typename patIter, typename corpusIter>
214-
corpusIter boyer_moore_search (
217+
std::pair<corpusIter, corpusIter> boyer_moore_search (
215218
corpusIter corpus_first, corpusIter corpus_last,
216219
patIter pat_first, patIter pat_last )
217220
{
@@ -220,7 +223,7 @@ mismatch on a character that _is_ in the pattern.
220223
}
221224

222225
template <typename PatternRange, typename corpusIter>
223-
corpusIter boyer_moore_search (
226+
std::pair<corpusIter, corpusIter> boyer_moore_search (
224227
corpusIter corpus_first, corpusIter corpus_last, const PatternRange &pattern )
225228
{
226229
typedef typename boost::range_iterator<const PatternRange>::type pattern_iterator;
@@ -229,8 +232,9 @@ mismatch on a character that _is_ in the pattern.
229232
}
230233

231234
template <typename patIter, typename CorpusRange>
232-
typename boost::lazy_disable_if_c<
233-
boost::is_same<CorpusRange, patIter>::value, typename boost::range_iterator<CorpusRange> >
235+
typename boost::disable_if_c<
236+
boost::is_same<CorpusRange, patIter>::value,
237+
std::pair<typename boost::range_iterator<CorpusRange>::type, typename boost::range_iterator<CorpusRange>::type> >
234238
::type
235239
boyer_moore_search ( CorpusRange &corpus, patIter pat_first, patIter pat_last )
236240
{
@@ -239,7 +243,7 @@ mismatch on a character that _is_ in the pattern.
239243
}
240244

241245
template <typename PatternRange, typename CorpusRange>
242-
typename boost::range_iterator<CorpusRange>::type
246+
std::pair<typename boost::range_iterator<CorpusRange>::type, typename boost::range_iterator<CorpusRange>::type>
243247
boyer_moore_search ( CorpusRange &corpus, const PatternRange &pattern )
244248
{
245249
typedef typename boost::range_iterator<const PatternRange>::type pattern_iterator;

include/boost/algorithm/searching/boyer_moore_horspool.hpp

Lines changed: 18 additions & 15 deletions
Original file line numberDiff line numberDiff line change
@@ -64,33 +64,34 @@ namespace boost { namespace algorithm {
6464

6565
~boyer_moore_horspool () {}
6666

67-
/// \fn operator ( corpusIter corpus_first, corpusIter corpus_last, Pred p )
67+
/// \fn operator ( corpusIter corpus_first, corpusIter corpus_last)
6868
/// \brief Searches the corpus for the pattern that was passed into the constructor
6969
///
7070
/// \param corpus_first The start of the data to search (Random Access Iterator)
7171
/// \param corpus_last One past the end of the data to search
72-
/// \param p A predicate used for the search comparisons.
7372
///
7473
template <typename corpusIter>
75-
corpusIter operator () ( corpusIter corpus_first, corpusIter corpus_last ) const {
74+
std::pair<corpusIter, corpusIter>
75+
operator () ( corpusIter corpus_first, corpusIter corpus_last ) const {
7676
BOOST_STATIC_ASSERT (( boost::is_same<
7777
typename std::iterator_traits<patIter>::value_type,
7878
typename std::iterator_traits<corpusIter>::value_type>::value ));
7979

80-
if ( corpus_first == corpus_last ) return corpus_last; // if nothing to search, we didn't find it!
81-
if ( pat_first == pat_last ) return corpus_first; // empty pattern matches at start
80+
if ( corpus_first == corpus_last ) return std::make_pair(corpus_last, corpus_last); // if nothing to search, we didn't find it!
81+
if ( pat_first == pat_last ) return std::make_pair(corpus_first, corpus_first); // empty pattern matches at start
8282

8383
const difference_type k_corpus_length = std::distance ( corpus_first, corpus_last );
8484
// If the pattern is larger than the corpus, we can't find it!
8585
if ( k_corpus_length < k_pattern_length )
86-
return corpus_last;
86+
return std::make_pair(corpus_last, corpus_last);
8787

8888
// Do the search
8989
return this->do_search ( corpus_first, corpus_last );
9090
}
9191

9292
template <typename Range>
93-
typename boost::range_iterator<Range>::type operator () ( Range &r ) const {
93+
std::pair<typename boost::range_iterator<Range>::type, typename boost::range_iterator<Range>::type>
94+
operator () ( Range &r ) const {
9495
return (*this) (boost::begin(r), boost::end(r));
9596
}
9697

@@ -108,7 +109,8 @@ namespace boost { namespace algorithm {
108109
/// \param k_corpus_length The length of the corpus to search
109110
///
110111
template <typename corpusIter>
111-
corpusIter do_search ( corpusIter corpus_first, corpusIter corpus_last ) const {
112+
std::pair<corpusIter, corpusIter>
113+
do_search ( corpusIter corpus_first, corpusIter corpus_last ) const {
112114
corpusIter curPos = corpus_first;
113115
const corpusIter lastPos = corpus_last - k_pattern_length;
114116
while ( curPos <= lastPos ) {
@@ -117,14 +119,14 @@ namespace boost { namespace algorithm {
117119
while ( pat_first [j] == curPos [j] ) {
118120
// We matched - we're done!
119121
if ( j == 0 )
120-
return curPos;
122+
return std::make_pair(curPos, curPos + k_pattern_length);
121123
j--;
122124
}
123125

124126
curPos += skip_ [ curPos [ k_pattern_length - 1 ]];
125127
}
126128

127-
return corpus_last;
129+
return std::make_pair(corpus_last, corpus_last);
128130
}
129131
// \endcond
130132
};
@@ -142,7 +144,7 @@ namespace boost { namespace algorithm {
142144
/// \param pat_last One past the end of the data to search for
143145
///
144146
template <typename patIter, typename corpusIter>
145-
corpusIter boyer_moore_horspool_search (
147+
std::pair<corpusIter, corpusIter> boyer_moore_horspool_search (
146148
corpusIter corpus_first, corpusIter corpus_last,
147149
patIter pat_first, patIter pat_last )
148150
{
@@ -151,7 +153,7 @@ namespace boost { namespace algorithm {
151153
}
152154

153155
template <typename PatternRange, typename corpusIter>
154-
corpusIter boyer_moore_horspool_search (
156+
std::pair<corpusIter, corpusIter> boyer_moore_horspool_search (
155157
corpusIter corpus_first, corpusIter corpus_last, const PatternRange &pattern )
156158
{
157159
typedef typename boost::range_iterator<const PatternRange>::type pattern_iterator;
@@ -160,8 +162,9 @@ namespace boost { namespace algorithm {
160162
}
161163

162164
template <typename patIter, typename CorpusRange>
163-
typename boost::lazy_disable_if_c<
164-
boost::is_same<CorpusRange, patIter>::value, typename boost::range_iterator<CorpusRange> >
165+
typename boost::disable_if_c<
166+
boost::is_same<CorpusRange, patIter>::value,
167+
std::pair<typename boost::range_iterator<CorpusRange>::type, typename boost::range_iterator<CorpusRange>::type> >
165168
::type
166169
boyer_moore_horspool_search ( CorpusRange &corpus, patIter pat_first, patIter pat_last )
167170
{
@@ -170,7 +173,7 @@ namespace boost { namespace algorithm {
170173
}
171174

172175
template <typename PatternRange, typename CorpusRange>
173-
typename boost::range_iterator<CorpusRange>::type
176+
std::pair<typename boost::range_iterator<CorpusRange>::type, typename boost::range_iterator<CorpusRange>::type>
174177
boyer_moore_horspool_search ( CorpusRange &corpus, const PatternRange &pattern )
175178
{
176179
typedef typename boost::range_iterator<const PatternRange>::type pattern_iterator;

include/boost/algorithm/searching/knuth_morris_pratt.hpp

Lines changed: 19 additions & 14 deletions
Original file line numberDiff line numberDiff line change
@@ -69,23 +69,26 @@ namespace boost { namespace algorithm {
6969
/// \param p A predicate used for the search comparisons.
7070
///
7171
template <typename corpusIter>
72-
corpusIter operator () ( corpusIter corpus_first, corpusIter corpus_last ) const {
72+
std::pair<corpusIter, corpusIter>
73+
operator () ( corpusIter corpus_first, corpusIter corpus_last ) const {
7374
BOOST_STATIC_ASSERT (( boost::is_same<
7475
typename std::iterator_traits<patIter>::value_type,
7576
typename std::iterator_traits<corpusIter>::value_type>::value ));
76-
if ( corpus_first == corpus_last ) return corpus_last; // if nothing to search, we didn't find it!
77-
if ( pat_first == pat_last ) return corpus_first; // empty pattern matches at start
77+
78+
if ( corpus_first == corpus_last ) return std::make_pair(corpus_last, corpus_last); // if nothing to search, we didn't find it!
79+
if ( pat_first == pat_last ) return std::make_pair(corpus_first, corpus_first); // empty pattern matches at start
7880

7981
const difference_type k_corpus_length = std::distance ( corpus_first, corpus_last );
8082
// If the pattern is larger than the corpus, we can't find it!
8183
if ( k_corpus_length < k_pattern_length )
82-
return corpus_last;
84+
return std::make_pair(corpus_last, corpus_last);
8385

84-
return do_search ( corpus_first, corpus_last, k_corpus_length );
86+
return do_search ( corpus_first, corpus_last, k_corpus_length );
8587
}
8688

8789
template <typename Range>
88-
typename boost::range_iterator<Range>::type operator () ( Range &r ) const {
90+
std::pair<typename boost::range_iterator<Range>::type, typename boost::range_iterator<Range>::type>
91+
operator () ( Range &r ) const {
8992
return (*this) (boost::begin(r), boost::end(r));
9093
}
9194

@@ -103,7 +106,8 @@ namespace boost { namespace algorithm {
103106
/// \param p A predicate used for the search comparisons.
104107
///
105108
template <typename corpusIter>
106-
corpusIter do_search ( corpusIter corpus_first, corpusIter corpus_last,
109+
std::pair<corpusIter, corpusIter>
110+
do_search ( corpusIter corpus_first, corpusIter corpus_last,
107111
difference_type k_corpus_length ) const {
108112
difference_type match_start = 0; // position in the corpus that we're matching
109113

@@ -135,7 +139,7 @@ namespace boost { namespace algorithm {
135139
while ( match_start <= last_match ) {
136140
while ( pat_first [ idx ] == corpus_first [ match_start + idx ] ) {
137141
if ( ++idx == k_pattern_length )
138-
return corpus_first + match_start;
142+
return std::make_pair(corpus_first + match_start, corpus_first + match_start + k_pattern_length);
139143
}
140144
// Figure out where to start searching again
141145
// assert ( idx - skip_ [ idx ] > 0 ); // we're always moving forward
@@ -146,7 +150,7 @@ namespace boost { namespace algorithm {
146150
#endif
147151

148152
// We didn't find anything
149-
return corpus_last;
153+
return std::make_pair(corpus_last, corpus_last);
150154
}
151155

152156

@@ -202,7 +206,7 @@ namespace boost { namespace algorithm {
202206
/// \param pat_last One past the end of the data to search for
203207
///
204208
template <typename patIter, typename corpusIter>
205-
corpusIter knuth_morris_pratt_search (
209+
std::pair<corpusIter, corpusIter> knuth_morris_pratt_search (
206210
corpusIter corpus_first, corpusIter corpus_last,
207211
patIter pat_first, patIter pat_last )
208212
{
@@ -211,7 +215,7 @@ namespace boost { namespace algorithm {
211215
}
212216

213217
template <typename PatternRange, typename corpusIter>
214-
corpusIter knuth_morris_pratt_search (
218+
std::pair<corpusIter, corpusIter> knuth_morris_pratt_search (
215219
corpusIter corpus_first, corpusIter corpus_last, const PatternRange &pattern )
216220
{
217221
typedef typename boost::range_iterator<const PatternRange>::type pattern_iterator;
@@ -220,8 +224,9 @@ namespace boost { namespace algorithm {
220224
}
221225

222226
template <typename patIter, typename CorpusRange>
223-
typename boost::lazy_disable_if_c<
224-
boost::is_same<CorpusRange, patIter>::value, typename boost::range_iterator<CorpusRange> >
227+
typename boost::disable_if_c<
228+
boost::is_same<CorpusRange, patIter>::value,
229+
std::pair<typename boost::range_iterator<CorpusRange>::type, typename boost::range_iterator<CorpusRange>::type> >
225230
::type
226231
knuth_morris_pratt_search ( CorpusRange &corpus, patIter pat_first, patIter pat_last )
227232
{
@@ -230,7 +235,7 @@ namespace boost { namespace algorithm {
230235
}
231236

232237
template <typename PatternRange, typename CorpusRange>
233-
typename boost::range_iterator<CorpusRange>::type
238+
std::pair<typename boost::range_iterator<CorpusRange>::type, typename boost::range_iterator<CorpusRange>::type>
234239
knuth_morris_pratt_search ( CorpusRange &corpus, const PatternRange &pattern )
235240
{
236241
typedef typename boost::range_iterator<const PatternRange>::type pattern_iterator;

test/empty_search_test.cpp

Lines changed: 9 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -26,56 +26,56 @@ BOOST_AUTO_TEST_CASE( test_main )
2626
BOOST_CHECK (
2727
boost::algorithm::boyer_moore_search (
2828
cs.begin (), cs.end (), estr.begin (), estr.end ())
29-
== cs.begin ()
29+
== std::make_pair(cs.begin(), cs.begin())
3030
);
3131

3232
BOOST_CHECK (
3333
boost::algorithm::boyer_moore_horspool_search (
3434
cs.begin (), cs.end (), estr.begin (), estr.end ())
35-
== cs.begin ()
35+
== std::make_pair(cs.begin(), cs.begin())
3636
);
3737

3838
BOOST_CHECK (
3939
boost::algorithm::knuth_morris_pratt_search (
4040
cs.begin (), cs.end (), estr.begin (), estr.end ())
41-
== cs.begin ()
41+
== std::make_pair(cs.begin(), cs.begin())
4242
);
4343

4444
// empty corpus, non-empty pattern
4545
BOOST_CHECK (
4646
boost::algorithm::boyer_moore_search (
4747
estr.begin (), estr.end (), str.begin (), str.end ())
48-
== estr.end ()
48+
== std::make_pair(estr.end(), estr.end())
4949
);
5050

5151
BOOST_CHECK (
5252
boost::algorithm::boyer_moore_horspool_search (
5353
estr.begin (), estr.end (), str.begin (), str.end ())
54-
== estr.end ()
54+
== std::make_pair(estr.end(), estr.end())
5555
);
5656

5757
BOOST_CHECK (
5858
boost::algorithm::knuth_morris_pratt_search (
5959
estr.begin (), estr.end (), str.begin (), str.end ())
60-
== estr.end ()
60+
== std::make_pair(estr.end(), estr.end())
6161
);
6262

6363
// non-empty corpus, empty pattern
6464
BOOST_CHECK (
6565
boost::algorithm::boyer_moore_search (
6666
str.begin (), str.end (), estr.begin (), estr.end ())
67-
== str.begin ()
67+
== std::make_pair(str.begin(), str.begin())
6868
);
6969

7070
BOOST_CHECK (
7171
boost::algorithm::boyer_moore_horspool_search (
7272
str.begin (), str.end (), estr.begin (), estr.end ())
73-
== str.begin ()
73+
== std::make_pair(str.begin(), str.begin())
7474
);
7575

7676
BOOST_CHECK (
7777
boost::algorithm::knuth_morris_pratt_search (
7878
str.begin (), str.end (), estr.begin (), estr.end ())
79-
== str.begin ()
79+
== std::make_pair(str.begin(), str.begin())
8080
);
8181
}

0 commit comments

Comments
 (0)