An iterator for traversing all the arguments of a KernelArgsArray.
| 276 | |
| 277 | // An iterator for traversing all the arguments of a KernelArgsArray. |
| 278 | class KernelArgIterator { |
| 279 | public: |
| 280 | KernelArgIterator(int number_of_argument_addresses, |
| 281 | int number_of_shared_memory_arguments, |
| 282 | const void *const *arg_addresses_data, |
| 283 | const size_t *arg_sizes_data, |
| 284 | const size_t *shmem_bytes_data, |
| 285 | const size_t *shmem_indices_data) |
| 286 | : arg_index_(0), |
| 287 | number_of_arguments_(number_of_argument_addresses + |
| 288 | number_of_shared_memory_arguments), |
| 289 | arg_address_iter_(arg_addresses_data), |
| 290 | arg_size_iter_(arg_sizes_data), |
| 291 | shmem_bytes_iter_(shmem_bytes_data), |
| 292 | shmem_indices_iter_(shmem_indices_data), |
| 293 | shmem_indices_end_(shmem_indices_data + |
| 294 | number_of_shared_memory_arguments) {} |
| 295 | |
| 296 | // Returns true if another argument is present in the iterator. |
| 297 | bool has_next() { return arg_index_ < number_of_arguments_; } |
| 298 | |
| 299 | // Returns the next argument in the iterator. |
| 300 | // |
| 301 | // Returns a default-constructed KernelArg if there is no next argument. |
| 302 | KernelArg next() { |
| 303 | KernelArg result = {}; |
| 304 | if (!has_next()) { |
| 305 | return result; |
| 306 | } else if ((shmem_indices_iter_ != shmem_indices_end_) && |
| 307 | (arg_index_ == *shmem_indices_iter_)) { |
| 308 | result.is_shared = true; |
| 309 | result.address = nullptr; |
| 310 | result.size = *shmem_bytes_iter_; |
| 311 | ++shmem_indices_iter_; |
| 312 | ++shmem_bytes_iter_; |
| 313 | } else { |
| 314 | result.is_shared = false; |
| 315 | result.address = *arg_address_iter_; |
| 316 | result.size = *arg_size_iter_; |
| 317 | ++arg_address_iter_; |
| 318 | ++arg_size_iter_; |
| 319 | } |
| 320 | ++arg_index_; |
| 321 | return result; |
| 322 | } |
| 323 | |
| 324 | private: |
| 325 | size_t arg_index_; |
| 326 | size_t number_of_arguments_; |
| 327 | const void *const *arg_address_iter_; |
| 328 | const size_t *arg_size_iter_; |
| 329 | const size_t *shmem_bytes_iter_; |
| 330 | const size_t *shmem_indices_iter_; |
| 331 | const size_t *const shmem_indices_end_; |
| 332 | }; |
| 333 | |
| 334 | // Base class for KernelArgsArray. |
| 335 | // |