inline T read_single_value(const buffer &buffer, size_t index, command_queue &queue) { BOOST_ASSERT(index < buffer.size() / sizeof(T)); BOOST_ASSERT(buffer.get_context() == queue.get_context()); T value; queue.enqueue_read_buffer(buffer, sizeof(T) * index, sizeof(T), &value); return value; }
inline HostIterator copy_to_host(DeviceIterator first, DeviceIterator last, HostIterator result, command_queue &queue) { typedef typename std::iterator_traits<DeviceIterator>::value_type value_type; size_t count = iterator_range_size(first, last); if(count == 0){ return result; } const buffer &buffer = first.get_buffer(); size_t offset = first.get_index(); queue.enqueue_read_buffer(buffer, offset * sizeof(value_type), count * sizeof(value_type), ::boost::addressof(*result)); return iterator_plus_distance(result, count); }