1 /* 2 * Copyright 2008-2013 NVIDIA Corporation 3 * 4 * Licensed under the Apache License, Version 2.0 (the "License"); 5 * you may not use this file except in compliance with the License. 6 * You may obtain a copy of the License at 7 * 8 * http://www.apache.org/licenses/LICENSE-2.0 9 * 10 * Unless required by applicable law or agreed to in writing, software 11 * distributed under the License is distributed on an "AS IS" BASIS, 12 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 13 * See the License for the specific language governing permissions and 14 * limitations under the License. 15 */ 16 17 #pragma once 18 19 #include <thrust/detail/config.h> 20 #include <thrust/system/detail/generic/tag.h> 21 #include <thrust/pair.h> 22 23 namespace thrust 24 { 25 namespace system 26 { 27 namespace detail 28 { 29 namespace generic 30 { 31 32 33 template<typename ExecutionPolicy, 34 typename InputIterator1, 35 typename InputIterator2, 36 typename OutputIterator> 37 __host__ __device__ 38 OutputIterator set_difference(thrust::execution_policy<ExecutionPolicy> &exec, 39 InputIterator1 first1, 40 InputIterator1 last1, 41 InputIterator2 first2, 42 InputIterator2 last2, 43 OutputIterator result); 44 45 46 // XXX it is an error to call this function; it has no implementation 47 template<typename ExecutionPolicy, 48 typename InputIterator1, 49 typename InputIterator2, 50 typename OutputIterator, 51 typename StrictWeakOrdering> 52 __host__ __device__ 53 OutputIterator set_difference(thrust::execution_policy<ExecutionPolicy> &exec, 54 InputIterator1 first1, 55 InputIterator1 last1, 56 InputIterator2 first2, 57 InputIterator2 last2, 58 OutputIterator result, 59 StrictWeakOrdering comp); 60 61 62 template<typename ExecutionPolicy, 63 typename InputIterator1, 64 typename InputIterator2, 65 typename InputIterator3, 66 typename InputIterator4, 67 typename OutputIterator1, 68 typename OutputIterator2> 69 __host__ __device__ 70 thrust::pair<OutputIterator1,OutputIterator2> 71 set_difference_by_key(thrust::execution_policy<ExecutionPolicy> &exec, 72 InputIterator1 keys_first1, 73 InputIterator1 keys_last1, 74 InputIterator2 keys_first2, 75 InputIterator2 keys_last2, 76 InputIterator3 values_first1, 77 InputIterator4 values_first2, 78 OutputIterator1 keys_result, 79 OutputIterator2 values_result); 80 81 82 template<typename ExecutionPolicy, 83 typename InputIterator1, 84 typename InputIterator2, 85 typename InputIterator3, 86 typename InputIterator4, 87 typename OutputIterator1, 88 typename OutputIterator2, 89 typename StrictWeakOrdering> 90 __host__ __device__ 91 thrust::pair<OutputIterator1,OutputIterator2> 92 set_difference_by_key(thrust::execution_policy<ExecutionPolicy> &exec, 93 InputIterator1 keys_first1, 94 InputIterator1 keys_last1, 95 InputIterator2 keys_first2, 96 InputIterator2 keys_last2, 97 InputIterator3 values_first1, 98 InputIterator4 values_first2, 99 OutputIterator1 keys_result, 100 OutputIterator2 values_result, 101 StrictWeakOrdering comp); 102 103 104 template<typename ExecutionPolicy, 105 typename InputIterator1, 106 typename InputIterator2, 107 typename OutputIterator> 108 __host__ __device__ 109 OutputIterator set_intersection(thrust::execution_policy<ExecutionPolicy> &system, 110 InputIterator1 first1, 111 InputIterator1 last1, 112 InputIterator2 first2, 113 InputIterator2 last2, 114 OutputIterator result); 115 116 117 // XXX it is an error to call this function; it has no implementation 118 template<typename ExecutionPolicy, 119 typename InputIterator1, 120 typename InputIterator2, 121 typename OutputIterator, 122 typename StrictWeakOrdering> 123 __host__ __device__ 124 OutputIterator set_intersection(thrust::execution_policy<StrictWeakOrdering> &system, 125 InputIterator1 first1, 126 InputIterator1 last1, 127 InputIterator2 first2, 128 InputIterator2 last2, 129 OutputIterator result, 130 StrictWeakOrdering comp); 131 132 133 template<typename ExecutionPolicy, 134 typename InputIterator1, 135 typename InputIterator2, 136 typename InputIterator3, 137 typename OutputIterator1, 138 typename OutputIterator2> 139 __host__ __device__ 140 thrust::pair<OutputIterator1,OutputIterator2> 141 set_intersection_by_key(thrust::execution_policy<ExecutionPolicy> &system, 142 InputIterator1 keys_first1, 143 InputIterator1 keys_last1, 144 InputIterator2 keys_first2, 145 InputIterator2 keys_last2, 146 InputIterator3 values_first1, 147 OutputIterator1 keys_result, 148 OutputIterator2 values_result); 149 150 151 template<typename ExecutionPolicy, 152 typename InputIterator1, 153 typename InputIterator2, 154 typename InputIterator3, 155 typename OutputIterator1, 156 typename OutputIterator2, 157 typename StrictWeakOrdering> 158 __host__ __device__ 159 thrust::pair<OutputIterator1,OutputIterator2> 160 set_intersection_by_key(thrust::execution_policy<ExecutionPolicy> &system, 161 InputIterator1 keys_first1, 162 InputIterator1 keys_last1, 163 InputIterator2 keys_first2, 164 InputIterator2 keys_last2, 165 InputIterator3 values_first1, 166 OutputIterator1 keys_result, 167 OutputIterator2 values_result, 168 StrictWeakOrdering comp); 169 170 171 template<typename ExecutionPolicy, 172 typename InputIterator1, 173 typename InputIterator2, 174 typename OutputIterator> 175 __host__ __device__ 176 OutputIterator set_symmetric_difference(thrust::execution_policy<ExecutionPolicy> &system, 177 InputIterator1 first1, 178 InputIterator1 last1, 179 InputIterator2 first2, 180 InputIterator2 last2, 181 OutputIterator result); 182 183 184 // XXX it is an error to call this function; it has no implementation 185 template<typename ExecutionPolicy, 186 typename InputIterator1, 187 typename InputIterator2, 188 typename OutputIterator, 189 typename StrictWeakOrdering> 190 __host__ __device__ 191 OutputIterator set_symmetric_difference(thrust::execution_policy<ExecutionPolicy> &system, 192 InputIterator1 first1, 193 InputIterator1 last1, 194 InputIterator2 first2, 195 InputIterator2 last2, 196 OutputIterator result, 197 StrictWeakOrdering comp); 198 199 200 template<typename ExecutionPolicy, 201 typename InputIterator1, 202 typename InputIterator2, 203 typename InputIterator3, 204 typename InputIterator4, 205 typename OutputIterator1, 206 typename OutputIterator2> 207 __host__ __device__ 208 thrust::pair<OutputIterator1,OutputIterator2> 209 set_symmetric_difference_by_key(thrust::execution_policy<ExecutionPolicy> &system, 210 InputIterator1 keys_first1, 211 InputIterator1 keys_last1, 212 InputIterator2 keys_first2, 213 InputIterator2 keys_last2, 214 InputIterator3 values_first1, 215 InputIterator4 values_first2, 216 OutputIterator1 keys_result, 217 OutputIterator2 values_result); 218 219 220 template<typename ExecutionPolicy, 221 typename InputIterator1, 222 typename InputIterator2, 223 typename InputIterator3, 224 typename InputIterator4, 225 typename OutputIterator1, 226 typename OutputIterator2, 227 typename StrictWeakOrdering> 228 __host__ __device__ 229 thrust::pair<OutputIterator1,OutputIterator2> 230 set_symmetric_difference_by_key(thrust::execution_policy<ExecutionPolicy> &system, 231 InputIterator1 keys_first1, 232 InputIterator1 keys_last1, 233 InputIterator2 keys_first2, 234 InputIterator2 keys_last2, 235 InputIterator3 values_first1, 236 InputIterator4 values_first2, 237 OutputIterator1 keys_result, 238 OutputIterator2 values_result, 239 StrictWeakOrdering comp); 240 241 242 template<typename ExecutionPolicy, 243 typename InputIterator1, 244 typename InputIterator2, 245 typename OutputIterator> 246 __host__ __device__ 247 OutputIterator set_union(thrust::execution_policy<ExecutionPolicy> &system, 248 InputIterator1 first1, 249 InputIterator1 last1, 250 InputIterator2 first2, 251 InputIterator2 last2, 252 OutputIterator result); 253 254 255 // XXX it is an error to call this function; it has no implementation 256 template<typename ExecutionPolicy, 257 typename InputIterator1, 258 typename InputIterator2, 259 typename OutputIterator, 260 typename StrictWeakOrdering> 261 __host__ __device__ 262 OutputIterator set_union(thrust::execution_policy<ExecutionPolicy> &system, 263 InputIterator1 first1, 264 InputIterator1 last1, 265 InputIterator2 first2, 266 InputIterator2 last2, 267 OutputIterator result, 268 StrictWeakOrdering comp); 269 270 271 template<typename ExecutionPolicy, 272 typename InputIterator1, 273 typename InputIterator2, 274 typename InputIterator3, 275 typename InputIterator4, 276 typename OutputIterator1, 277 typename OutputIterator2> 278 __host__ __device__ 279 thrust::pair<OutputIterator1,OutputIterator2> 280 set_union_by_key(thrust::execution_policy<ExecutionPolicy> &system, 281 InputIterator1 keys_first1, 282 InputIterator1 keys_last1, 283 InputIterator2 keys_first2, 284 InputIterator2 keys_last2, 285 InputIterator3 values_first1, 286 InputIterator4 values_first2, 287 OutputIterator1 keys_result, 288 OutputIterator2 values_result); 289 290 291 template<typename ExecutionPolicy, 292 typename InputIterator1, 293 typename InputIterator2, 294 typename InputIterator3, 295 typename InputIterator4, 296 typename OutputIterator1, 297 typename OutputIterator2, 298 typename StrictWeakOrdering> 299 __host__ __device__ 300 thrust::pair<OutputIterator1,OutputIterator2> 301 set_union_by_key(thrust::execution_policy<ExecutionPolicy> &system, 302 InputIterator1 keys_first1, 303 InputIterator1 keys_last1, 304 InputIterator2 keys_first2, 305 InputIterator2 keys_last2, 306 InputIterator3 values_first1, 307 InputIterator4 values_first2, 308 OutputIterator1 keys_result, 309 OutputIterator2 values_result, 310 StrictWeakOrdering comp); 311 312 313 } // end namespace generic 314 } // end namespace detail 315 } // end namespace system 316 } // end namespace thrust 317 318 #include <thrust/system/detail/generic/set_operations.inl> 319 320