00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015
00016
00017
00018
00019
00020
00021
00022
00023
00024
00025
00026
00027
00028
00029
00030
00031
00032
00033
00034
00035
00036
00037
00038
00039 #ifndef _GLIBCXX_PARALLEL_FIND_FUNCTIONS_H
00040 #define _GLIBCXX_PARALLEL_FIND_FUNCTIONS_H 1
00041
00042 #include <parallel/tags.h>
00043 #include <parallel/basic_iterator.h>
00044 #include <bits/stl_pair.h>
00045
00046 namespace __gnu_parallel
00047 {
00048
00049 struct generic_find_selector
00050 { };
00051
00052
00053
00054
00055
00056 struct find_if_selector : public generic_find_selector
00057 {
00058
00059
00060
00061
00062
00063 template<typename RandomAccessIterator1, typename RandomAccessIterator2,
00064 typename Pred>
00065 bool
00066 operator()(RandomAccessIterator1 i1, RandomAccessIterator2 i2, Pred pred)
00067 { return pred(*i1); }
00068
00069
00070
00071
00072
00073
00074
00075 template<typename RandomAccessIterator1, typename RandomAccessIterator2,
00076 typename Pred>
00077 std::pair<RandomAccessIterator1, RandomAccessIterator2>
00078 sequential_algorithm(RandomAccessIterator1 begin1,
00079 RandomAccessIterator1 end1,
00080 RandomAccessIterator2 begin2, Pred pred)
00081 { return std::make_pair(find_if(begin1, end1, pred,
00082 sequential_tag()), begin2); }
00083 };
00084
00085
00086 struct adjacent_find_selector : public generic_find_selector
00087 {
00088
00089
00090
00091
00092
00093 template<typename RandomAccessIterator1, typename RandomAccessIterator2,
00094 typename Pred>
00095 bool
00096 operator()(RandomAccessIterator1 i1, RandomAccessIterator2 i2, Pred pred)
00097 {
00098
00099 return pred(*i1, *(i1 + 1));
00100 }
00101
00102
00103
00104
00105
00106
00107
00108 template<typename RandomAccessIterator1, typename RandomAccessIterator2,
00109 typename Pred>
00110 std::pair<RandomAccessIterator1, RandomAccessIterator2>
00111 sequential_algorithm(RandomAccessIterator1 begin1,
00112 RandomAccessIterator1 end1,
00113 RandomAccessIterator2 begin2, Pred pred)
00114 {
00115
00116 RandomAccessIterator1 spot = adjacent_find(begin1, end1 + 1,
00117 pred, sequential_tag());
00118 if (spot == (end1 + 1))
00119 spot = end1;
00120 return std::make_pair(spot, begin2);
00121 }
00122 };
00123
00124
00125 struct mismatch_selector : public generic_find_selector
00126 {
00127
00128
00129
00130
00131
00132
00133 template<typename RandomAccessIterator1, typename RandomAccessIterator2,
00134 typename Pred>
00135 bool
00136 operator()(RandomAccessIterator1 i1, RandomAccessIterator2 i2, Pred pred)
00137 { return !pred(*i1, *i2); }
00138
00139
00140
00141
00142
00143
00144
00145
00146 template<typename RandomAccessIterator1, typename RandomAccessIterator2,
00147 typename Pred>
00148 std::pair<RandomAccessIterator1, RandomAccessIterator2>
00149 sequential_algorithm(RandomAccessIterator1 begin1,
00150 RandomAccessIterator1 end1,
00151 RandomAccessIterator2 begin2, Pred pred)
00152 { return mismatch(begin1, end1, begin2, pred, sequential_tag()); }
00153 };
00154
00155
00156
00157 template<typename ForwardIterator>
00158 struct find_first_of_selector : public generic_find_selector
00159 {
00160 ForwardIterator begin;
00161 ForwardIterator end;
00162
00163 explicit find_first_of_selector(ForwardIterator begin, ForwardIterator end)
00164 : begin(begin), end(end) { }
00165
00166
00167
00168
00169
00170 template<typename RandomAccessIterator1, typename RandomAccessIterator2,
00171 typename Pred>
00172 bool
00173 operator()(RandomAccessIterator1 i1, RandomAccessIterator2 i2, Pred pred)
00174 {
00175 for (ForwardIterator pos_in_candidates = begin;
00176 pos_in_candidates != end; ++pos_in_candidates)
00177 if (pred(*i1, *pos_in_candidates))
00178 return true;
00179 return false;
00180 }
00181
00182
00183
00184
00185
00186
00187 template<typename RandomAccessIterator1, typename RandomAccessIterator2,
00188 typename Pred>
00189 std::pair<RandomAccessIterator1, RandomAccessIterator2>
00190 sequential_algorithm(RandomAccessIterator1 begin1,
00191 RandomAccessIterator1 end1,
00192 RandomAccessIterator2 begin2, Pred pred)
00193 { return std::make_pair(find_first_of(begin1, end1, begin, end, pred,
00194 sequential_tag()), begin2); }
00195 };
00196 }
00197
00198 #endif