1 /*******************************************************************************
2  * Copyright (c) 2008-2015 The Khronos Group Inc.
3  *
4  * Permission is hereby granted, free of charge, to any person obtaining a
5  * copy of this software and/or associated documentation files (the
6  * "Materials"), to deal in the Materials without restriction, including
7  * without limitation the rights to use, copy, modify, merge, publish,
8  * distribute, sublicense, and/or sell copies of the Materials, and to
9  * permit persons to whom the Materials are furnished to do so, subject to
10  * the following conditions:
11  *
12  * The above copyright notice and this permission notice shall be included
13  * in all copies or substantial portions of the Materials.
14  *
15  * MODIFICATIONS TO THIS FILE MAY MEAN IT NO LONGER ACCURATELY REFLECTS
16  * KHRONOS STANDARDS. THE UNMODIFIED, NORMATIVE VERSIONS OF KHRONOS
17  * SPECIFICATIONS AND HEADER INFORMATION ARE LOCATED AT
18  *    https://www.khronos.org/registry/
19  *
20  * THE MATERIALS ARE PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
21  * EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
22  * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.
23  * IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY
24  * CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT,
25  * TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE
26  * MATERIALS OR THE USE OR OTHER DEALINGS IN THE MATERIALS.
27  ******************************************************************************/
28 
29 /*! \file
30  *
31  *   \brief C++ bindings for OpenCL 1.0 (rev 48), OpenCL 1.1 (rev 33) and
32  *       OpenCL 1.2 (rev 15)
33  *   \author Benedict R. Gaster, Laurent Morichetti and Lee Howes
34  *
35  *   Additions and fixes from:
36  *       Brian Cole, March 3rd 2010 and April 2012
37  *       Matt Gruenke, April 2012.
38  *       Bruce Merry, February 2013.
39  *       Tom Deakin and Simon McIntosh-Smith, July 2013
40  *
41  *   \version 1.2.9
42  *   \date December 2015
43  *
44  *   Optional extension support
45  *
46  *         cl
47  *         cl_ext_device_fission
48  *				#define USE_CL_DEVICE_FISSION
49  */
50 
51 /*! \mainpage
52  * \section intro Introduction
53  * For many large applications C++ is the language of choice and so it seems
54  * reasonable to define C++ bindings for OpenCL.
55  *
56  *
57  * The interface is contained with a single C++ header file \em cl.hpp and all
58  * definitions are contained within the namespace \em cl. There is no additional
59  * requirement to include \em cl.h and to use either the C++ or original C
60  * bindings it is enough to simply include \em cl.hpp.
61  *
62  * The bindings themselves are lightweight and correspond closely to the
63  * underlying C API. Using the C++ bindings introduces no additional execution
64  * overhead.
65  *
66  * For detail documentation on the bindings see:
67  *
68  * The OpenCL C++ Wrapper API 1.2 (revision 09)
69  *  http://www.khronos.org/registry/cl/specs/opencl-cplusplus-1.2.pdf
70  *
71  * \section example Example
72  *
73  * The following example shows a general use case for the C++
74  * bindings, including support for the optional exception feature and
75  * also the supplied vector and string classes, see following sections for
76  * decriptions of these features.
77  *
78  * \code
79  * #define __CL_ENABLE_EXCEPTIONS
80  *
81  * #if defined(__APPLE__) || defined(__MACOSX)
82  * #include <OpenCL/cl.hpp>
83  * #else
84  * #include <CL/cl.hpp>
85  * #endif
86  * #include <cstdio>
87  * #include <cstdlib>
88  * #include <iostream>
89  *
90  *  const char * helloStr  = "__kernel void "
91  *                           "hello(void) "
92  *                           "{ "
93  *                           "  "
94  *                           "} ";
95  *
96  *  int
97  *  main(void)
98  *  {
99  *     cl_int err = CL_SUCCESS;
100  *     try {
101  *
102  *       std::vector<cl::Platform> platforms;
103  *       cl::Platform::get(&platforms);
104  *       if (platforms.size() == 0) {
105  *           std::cout << "Platform size 0\n";
106  *           return -1;
107  *       }
108  *
109  *       cl_context_properties properties[] =
110  *          { CL_CONTEXT_PLATFORM, (cl_context_properties)(platforms[0])(), 0};
111  *       cl::Context context(CL_DEVICE_TYPE_CPU, properties);
112  *
113  *       std::vector<cl::Device> devices = context.getInfo<CL_CONTEXT_DEVICES>();
114  *
115  *       cl::Program::Sources source(1,
116  *           std::make_pair(helloStr,strlen(helloStr)));
117  *       cl::Program program_ = cl::Program(context, source);
118  *       program_.build(devices);
119  *
120  *       cl::Kernel kernel(program_, "hello", &err);
121  *
122  *       cl::Event event;
123  *       cl::CommandQueue queue(context, devices[0], 0, &err);
124  *       queue.enqueueNDRangeKernel(
125  *           kernel,
126  *           cl::NullRange,
127  *           cl::NDRange(4,4),
128  *           cl::NullRange,
129  *           NULL,
130  *           &event);
131  *
132  *       event.wait();
133  *     }
134  *     catch (cl::Error err) {
135  *        std::cerr
136  *           << "ERROR: "
137  *           << err.what()
138  *           << "("
139  *           << err.err()
140  *           << ")"
141  *           << std::endl;
142  *     }
143  *
144  *    return EXIT_SUCCESS;
145  *  }
146  *
147  * \endcode
148  *
149  */
150 #ifndef CL_HPP_
151 #define CL_HPP_
152 
153 // The latest version of the OpenCL C++ bindings can be found on GitHub:
154 // -> https://github.com/KhronosGroup/OpenCL-CLHPP
155 #pragma message("This version of the OpenCL Host API C++ bindings is deprecated, please use cl2.hpp instead.")
156 
157 #ifdef _WIN32
158 
159 #include <malloc.h>
160 
161 #if defined(USE_DX_INTEROP)
162 #include <CL/cl_d3d10.h>
163 #include <CL/cl_dx9_media_sharing.h>
164 #endif
165 #endif // _WIN32
166 
167 #if defined(_MSC_VER)
168 #include <intrin.h>
169 #endif // _MSC_VER
170 
171 //
172 #if defined(USE_CL_DEVICE_FISSION)
173 #include <CL/cl_ext.h>
174 #endif
175 
176 #if defined(__APPLE__) || defined(__MACOSX)
177 #include <OpenCL/opencl.h>
178 #else
179 #include <CL/opencl.h>
180 #endif // !__APPLE__
181 
182 #if (_MSC_VER >= 1700) || (__cplusplus >= 201103L)
183 #define CL_HPP_RVALUE_REFERENCES_SUPPORTED
184 #define CL_HPP_CPP11_ATOMICS_SUPPORTED
185 #include <atomic>
186 #endif
187 
188 #if (__cplusplus >= 201103L)
189 #define CL_HPP_NOEXCEPT noexcept
190 #else
191 #define CL_HPP_NOEXCEPT
192 #endif
193 
194 
195 // To avoid accidentally taking ownership of core OpenCL types
196 // such as cl_kernel constructors are made explicit
197 // under OpenCL 1.2
198 #if defined(CL_VERSION_1_2) && !defined(CL_USE_DEPRECATED_OPENCL_1_1_APIS)
199 #define __CL_EXPLICIT_CONSTRUCTORS explicit
200 #else // #if defined(CL_USE_DEPRECATED_OPENCL_1_1_APIS)
201 #define __CL_EXPLICIT_CONSTRUCTORS
202 #endif // #if defined(CL_USE_DEPRECATED_OPENCL_1_1_APIS)
203 
204 // Define deprecated prefixes and suffixes to ensure compilation
205 // in case they are not pre-defined
206 #if !defined(CL_EXT_PREFIX__VERSION_1_1_DEPRECATED)
207 #define CL_EXT_PREFIX__VERSION_1_1_DEPRECATED
208 #endif // #if !defined(CL_EXT_PREFIX__VERSION_1_1_DEPRECATED)
209 #if !defined(CL_EXT_SUFFIX__VERSION_1_1_DEPRECATED)
210 #define CL_EXT_SUFFIX__VERSION_1_1_DEPRECATED
211 #endif // #if !defined(CL_EXT_PREFIX__VERSION_1_1_DEPRECATED)
212 
213 #if !defined(CL_CALLBACK)
214 #define CL_CALLBACK
215 #endif //CL_CALLBACK
216 
217 #include <utility>
218 #include <limits>
219 #include <iterator>
220 
221 #if defined(__CL_ENABLE_EXCEPTIONS)
222 #include <exception>
223 #endif // #if defined(__CL_ENABLE_EXCEPTIONS)
224 
225 #if !defined(__NO_STD_VECTOR)
226 #include <vector>
227 #endif
228 
229 #if !defined(__NO_STD_STRING)
230 #include <string>
231 #endif
232 
233 #if defined(__ANDROID__) || defined(linux) || defined(__APPLE__) || defined(__MACOSX)
234 #include <alloca.h>
235 #endif // linux
236 
237 #include <cstring>
238 
239 // Compiler specific weak linking
240 #ifndef CL_WEAK_ATTRIB_PREFIX
241 // C++17: use inline variables/functions
242 #if __cplusplus >= 201703L
243 #define CL_USE_INLINE
244 #endif
245 
246 #ifdef CL_USE_INLINE
247 #define CL_WEAK_ATTRIB_PREFIX inline
248 #define CL_WEAK_ATTRIB_SUFFIX
249 #elif _WIN32
250 #define CL_WEAK_ATTRIB_PREFIX __declspec(selectany)
251 #define CL_WEAK_ATTRIB_SUFFIX
252 #else // GCC, CLANG, etc.
253 #define CL_WEAK_ATTRIB_PREFIX
254 #define CL_WEAK_ATTRIB_SUFFIX __attribute__((weak))
255 #endif // CL_USE_INLINE
256 
257 #endif // CL_WEAK_ATTRIB_PREFIX
258 
259 /*! \namespace cl
260  *
261  * \brief The OpenCL C++ bindings are defined within this namespace.
262  *
263  */
264 namespace cl {
265 
266 class Memory;
267 
268 /**
269  * Deprecated APIs for 1.2
270  */
271 #if defined(CL_USE_DEPRECATED_OPENCL_1_1_APIS) || (defined(CL_VERSION_1_1) && !defined(CL_VERSION_1_2))
272 #define __INIT_CL_EXT_FCN_PTR(name) \
273     if(!pfn_##name) { \
274         pfn_##name = (PFN_##name) \
275             clGetExtensionFunctionAddress(#name); \
276         if(!pfn_##name) { \
277         } \
278     }
279 #endif // #if defined(CL_VERSION_1_1)
280 
281 #if defined(CL_VERSION_1_2)
282 #define __INIT_CL_EXT_FCN_PTR_PLATFORM(platform, name) \
283     if(!pfn_##name) { \
284         pfn_##name = (PFN_##name) \
285             clGetExtensionFunctionAddressForPlatform(platform, #name); \
286         if(!pfn_##name) { \
287         } \
288     }
289 #endif // #if defined(CL_VERSION_1_1)
290 
291 class Program;
292 class Device;
293 class Context;
294 class CommandQueue;
295 class Memory;
296 class Buffer;
297 
298 #if defined(__CL_ENABLE_EXCEPTIONS)
299 /*! \brief Exception class
300  *
301  *  This may be thrown by API functions when __CL_ENABLE_EXCEPTIONS is defined.
302  */
303 class Error : public std::exception
304 {
305 private:
306     cl_int err_;
307     const char * errStr_;
308 public:
309     /*! \brief Create a new CL error exception for a given error code
310      *  and corresponding message.
311      *
312      *  \param err error code value.
313      *
314      *  \param errStr a descriptive string that must remain in scope until
315      *                handling of the exception has concluded.  If set, it
316      *                will be returned by what().
317      */
Error(cl_int err,const char * errStr=NULL)318     Error(cl_int err, const char * errStr = NULL) : err_(err), errStr_(errStr)
319     {}
320 
~Error()321     ~Error() throw() {}
322 
323     /*! \brief Get error string associated with exception
324      *
325      * \return A memory pointer to the error message string.
326      */
what() const327     virtual const char * what() const throw ()
328     {
329         if (errStr_ == NULL) {
330             return "empty";
331         }
332         else {
333             return errStr_;
334         }
335     }
336 
337     /*! \brief Get error code associated with exception
338      *
339      *  \return The error code.
340      */
err(void) const341     cl_int err(void) const { return err_; }
342 };
343 
344 #define __ERR_STR(x) #x
345 #else
346 #define __ERR_STR(x) NULL
347 #endif // __CL_ENABLE_EXCEPTIONS
348 
349 
350 namespace detail
351 {
352 #if defined(__CL_ENABLE_EXCEPTIONS)
errHandler(cl_int err,const char * errStr=NULL)353 static inline cl_int errHandler (
354     cl_int err,
355     const char * errStr = NULL)
356 {
357     if (err != CL_SUCCESS) {
358         throw Error(err, errStr);
359     }
360     return err;
361 }
362 #else
363 static inline cl_int errHandler (cl_int err, const char * errStr = NULL)
364 {
365     (void) errStr; // suppress unused variable warning
366     return err;
367 }
368 #endif // __CL_ENABLE_EXCEPTIONS
369 }
370 
371 
372 
373 //! \cond DOXYGEN_DETAIL
374 #if !defined(__CL_USER_OVERRIDE_ERROR_STRINGS)
375 #define __GET_DEVICE_INFO_ERR               __ERR_STR(clGetDeviceInfo)
376 #define __GET_PLATFORM_INFO_ERR             __ERR_STR(clGetPlatformInfo)
377 #define __GET_DEVICE_IDS_ERR                __ERR_STR(clGetDeviceIDs)
378 #define __GET_PLATFORM_IDS_ERR              __ERR_STR(clGetPlatformIDs)
379 #define __GET_CONTEXT_INFO_ERR              __ERR_STR(clGetContextInfo)
380 #define __GET_EVENT_INFO_ERR                __ERR_STR(clGetEventInfo)
381 #define __GET_EVENT_PROFILE_INFO_ERR        __ERR_STR(clGetEventProfileInfo)
382 #define __GET_MEM_OBJECT_INFO_ERR           __ERR_STR(clGetMemObjectInfo)
383 #define __GET_IMAGE_INFO_ERR                __ERR_STR(clGetImageInfo)
384 #define __GET_SAMPLER_INFO_ERR              __ERR_STR(clGetSamplerInfo)
385 #define __GET_KERNEL_INFO_ERR               __ERR_STR(clGetKernelInfo)
386 #if defined(CL_VERSION_1_2)
387 #define __GET_KERNEL_ARG_INFO_ERR               __ERR_STR(clGetKernelArgInfo)
388 #endif // #if defined(CL_VERSION_1_2)
389 #define __GET_KERNEL_WORK_GROUP_INFO_ERR    __ERR_STR(clGetKernelWorkGroupInfo)
390 #define __GET_PROGRAM_INFO_ERR              __ERR_STR(clGetProgramInfo)
391 #define __GET_PROGRAM_BUILD_INFO_ERR        __ERR_STR(clGetProgramBuildInfo)
392 #define __GET_COMMAND_QUEUE_INFO_ERR        __ERR_STR(clGetCommandQueueInfo)
393 
394 #define __CREATE_CONTEXT_ERR                __ERR_STR(clCreateContext)
395 #define __CREATE_CONTEXT_FROM_TYPE_ERR      __ERR_STR(clCreateContextFromType)
396 #define __GET_SUPPORTED_IMAGE_FORMATS_ERR   __ERR_STR(clGetSupportedImageFormats)
397 
398 #define __CREATE_BUFFER_ERR                 __ERR_STR(clCreateBuffer)
399 #define __COPY_ERR                          __ERR_STR(cl::copy)
400 #define __CREATE_SUBBUFFER_ERR              __ERR_STR(clCreateSubBuffer)
401 #define __CREATE_GL_BUFFER_ERR              __ERR_STR(clCreateFromGLBuffer)
402 #define __CREATE_GL_RENDER_BUFFER_ERR       __ERR_STR(clCreateFromGLBuffer)
403 #define __GET_GL_OBJECT_INFO_ERR            __ERR_STR(clGetGLObjectInfo)
404 #if defined(CL_VERSION_1_2)
405 #define __CREATE_IMAGE_ERR                  __ERR_STR(clCreateImage)
406 #define __CREATE_GL_TEXTURE_ERR             __ERR_STR(clCreateFromGLTexture)
407 #define __IMAGE_DIMENSION_ERR               __ERR_STR(Incorrect image dimensions)
408 #endif // #if defined(CL_VERSION_1_2)
409 #define __CREATE_SAMPLER_ERR                __ERR_STR(clCreateSampler)
410 #define __SET_MEM_OBJECT_DESTRUCTOR_CALLBACK_ERR __ERR_STR(clSetMemObjectDestructorCallback)
411 
412 #define __CREATE_USER_EVENT_ERR             __ERR_STR(clCreateUserEvent)
413 #define __SET_USER_EVENT_STATUS_ERR         __ERR_STR(clSetUserEventStatus)
414 #define __SET_EVENT_CALLBACK_ERR            __ERR_STR(clSetEventCallback)
415 #define __WAIT_FOR_EVENTS_ERR               __ERR_STR(clWaitForEvents)
416 
417 #define __CREATE_KERNEL_ERR                 __ERR_STR(clCreateKernel)
418 #define __SET_KERNEL_ARGS_ERR               __ERR_STR(clSetKernelArg)
419 #define __CREATE_PROGRAM_WITH_SOURCE_ERR    __ERR_STR(clCreateProgramWithSource)
420 #define __CREATE_PROGRAM_WITH_BINARY_ERR    __ERR_STR(clCreateProgramWithBinary)
421 #if defined(CL_VERSION_1_2)
422 #define __CREATE_PROGRAM_WITH_BUILT_IN_KERNELS_ERR    __ERR_STR(clCreateProgramWithBuiltInKernels)
423 #endif // #if defined(CL_VERSION_1_2)
424 #define __BUILD_PROGRAM_ERR                 __ERR_STR(clBuildProgram)
425 #if defined(CL_VERSION_1_2)
426 #define __COMPILE_PROGRAM_ERR                  __ERR_STR(clCompileProgram)
427 #define __LINK_PROGRAM_ERR                  __ERR_STR(clLinkProgram)
428 #endif // #if defined(CL_VERSION_1_2)
429 #define __CREATE_KERNELS_IN_PROGRAM_ERR     __ERR_STR(clCreateKernelsInProgram)
430 
431 #define __CREATE_COMMAND_QUEUE_ERR          __ERR_STR(clCreateCommandQueue)
432 #define __SET_COMMAND_QUEUE_PROPERTY_ERR    __ERR_STR(clSetCommandQueueProperty)
433 #define __ENQUEUE_READ_BUFFER_ERR           __ERR_STR(clEnqueueReadBuffer)
434 #define __ENQUEUE_READ_BUFFER_RECT_ERR      __ERR_STR(clEnqueueReadBufferRect)
435 #define __ENQUEUE_WRITE_BUFFER_ERR          __ERR_STR(clEnqueueWriteBuffer)
436 #define __ENQUEUE_WRITE_BUFFER_RECT_ERR     __ERR_STR(clEnqueueWriteBufferRect)
437 #define __ENQEUE_COPY_BUFFER_ERR            __ERR_STR(clEnqueueCopyBuffer)
438 #define __ENQEUE_COPY_BUFFER_RECT_ERR       __ERR_STR(clEnqueueCopyBufferRect)
439 #define __ENQUEUE_FILL_BUFFER_ERR           __ERR_STR(clEnqueueFillBuffer)
440 #define __ENQUEUE_READ_IMAGE_ERR            __ERR_STR(clEnqueueReadImage)
441 #define __ENQUEUE_WRITE_IMAGE_ERR           __ERR_STR(clEnqueueWriteImage)
442 #define __ENQUEUE_COPY_IMAGE_ERR            __ERR_STR(clEnqueueCopyImage)
443 #define __ENQUEUE_FILL_IMAGE_ERR           __ERR_STR(clEnqueueFillImage)
444 #define __ENQUEUE_COPY_IMAGE_TO_BUFFER_ERR  __ERR_STR(clEnqueueCopyImageToBuffer)
445 #define __ENQUEUE_COPY_BUFFER_TO_IMAGE_ERR  __ERR_STR(clEnqueueCopyBufferToImage)
446 #define __ENQUEUE_MAP_BUFFER_ERR            __ERR_STR(clEnqueueMapBuffer)
447 #define __ENQUEUE_MAP_IMAGE_ERR             __ERR_STR(clEnqueueMapImage)
448 #define __ENQUEUE_UNMAP_MEM_OBJECT_ERR      __ERR_STR(clEnqueueUnMapMemObject)
449 #define __ENQUEUE_NDRANGE_KERNEL_ERR        __ERR_STR(clEnqueueNDRangeKernel)
450 #define __ENQUEUE_TASK_ERR                  __ERR_STR(clEnqueueTask)
451 #define __ENQUEUE_NATIVE_KERNEL             __ERR_STR(clEnqueueNativeKernel)
452 #if defined(CL_VERSION_1_2)
453 #define __ENQUEUE_MIGRATE_MEM_OBJECTS_ERR   __ERR_STR(clEnqueueMigrateMemObjects)
454 #endif // #if defined(CL_VERSION_1_2)
455 
456 #define __ENQUEUE_ACQUIRE_GL_ERR            __ERR_STR(clEnqueueAcquireGLObjects)
457 #define __ENQUEUE_RELEASE_GL_ERR            __ERR_STR(clEnqueueReleaseGLObjects)
458 
459 
460 #define __RETAIN_ERR                        __ERR_STR(Retain Object)
461 #define __RELEASE_ERR                       __ERR_STR(Release Object)
462 #define __FLUSH_ERR                         __ERR_STR(clFlush)
463 #define __FINISH_ERR                        __ERR_STR(clFinish)
464 #define __VECTOR_CAPACITY_ERR               __ERR_STR(Vector capacity error)
465 
466 /**
467  * CL 1.2 version that uses device fission.
468  */
469 #if defined(CL_VERSION_1_2)
470 #define __CREATE_SUB_DEVICES                __ERR_STR(clCreateSubDevices)
471 #else
472 #define __CREATE_SUB_DEVICES                __ERR_STR(clCreateSubDevicesEXT)
473 #endif // #if defined(CL_VERSION_1_2)
474 
475 /**
476  * Deprecated APIs for 1.2
477  */
478 #if defined(CL_USE_DEPRECATED_OPENCL_1_1_APIS) || (defined(CL_VERSION_1_1) && !defined(CL_VERSION_1_2))
479 #define __ENQUEUE_MARKER_ERR                __ERR_STR(clEnqueueMarker)
480 #define __ENQUEUE_WAIT_FOR_EVENTS_ERR       __ERR_STR(clEnqueueWaitForEvents)
481 #define __ENQUEUE_BARRIER_ERR               __ERR_STR(clEnqueueBarrier)
482 #define __UNLOAD_COMPILER_ERR               __ERR_STR(clUnloadCompiler)
483 #define __CREATE_GL_TEXTURE_2D_ERR          __ERR_STR(clCreateFromGLTexture2D)
484 #define __CREATE_GL_TEXTURE_3D_ERR          __ERR_STR(clCreateFromGLTexture3D)
485 #define __CREATE_IMAGE2D_ERR                __ERR_STR(clCreateImage2D)
486 #define __CREATE_IMAGE3D_ERR                __ERR_STR(clCreateImage3D)
487 #endif // #if defined(CL_VERSION_1_1)
488 
489 #endif // __CL_USER_OVERRIDE_ERROR_STRINGS
490 //! \endcond
491 
492 /**
493  * CL 1.2 marker and barrier commands
494  */
495 #if defined(CL_VERSION_1_2)
496 #define __ENQUEUE_MARKER_WAIT_LIST_ERR                __ERR_STR(clEnqueueMarkerWithWaitList)
497 #define __ENQUEUE_BARRIER_WAIT_LIST_ERR               __ERR_STR(clEnqueueBarrierWithWaitList)
498 #endif // #if defined(CL_VERSION_1_2)
499 
500 #if !defined(__USE_DEV_STRING) && !defined(__NO_STD_STRING)
501 typedef std::string STRING_CLASS;
502 #elif !defined(__USE_DEV_STRING)
503 
504 /*! \class string
505  * \brief Simple string class, that provides a limited subset of std::string
506  * functionality but avoids many of the issues that come with that class.
507 
508  *  \note Deprecated. Please use std::string as default or
509  *  re-define the string class to match the std::string
510  *  interface by defining STRING_CLASS
511  */
512 class CL_EXT_PREFIX__VERSION_1_1_DEPRECATED string
513 {
514 private:
515     ::size_t size_;
516     char * str_;
517 public:
518     //! \brief Constructs an empty string, allocating no memory.
string(void)519     string(void) : size_(0), str_(NULL)
520     {
521     }
522 
523     /*! \brief Constructs a string populated from an arbitrary value of
524      *  specified size.
525      *
526      *  An extra '\0' is added, in case none was contained in str.
527      *
528      *  \param str the initial value of the string instance.  Note that '\0'
529      *             characters receive no special treatment.  If NULL,
530      *             the string is left empty, with a size of 0.
531      *
532      *  \param size the number of characters to copy from str.
533      */
string(const char * str,::size_t size)534     string(const char * str, ::size_t size) :
535         size_(size),
536         str_(NULL)
537     {
538         if( size > 0 ) {
539             str_ = new char[size_+1];
540             if (str_ != NULL) {
541                 memcpy(str_, str, size_  * sizeof(char));
542                 str_[size_] = '\0';
543             }
544             else {
545                 size_ = 0;
546             }
547         }
548     }
549 
550     /*! \brief Constructs a string populated from a null-terminated value.
551      *
552      *  \param str the null-terminated initial value of the string instance.
553      *             If NULL, the string is left empty, with a size of 0.
554      */
string(const char * str)555     string(const char * str) :
556         size_(0),
557         str_(NULL)
558     {
559         if( str ) {
560             size_= ::strlen(str);
561         }
562         if( size_ > 0 ) {
563             str_ = new char[size_ + 1];
564             if (str_ != NULL) {
565                 memcpy(str_, str, (size_ + 1) * sizeof(char));
566             }
567         }
568     }
569 
resize(::size_t n)570     void resize( ::size_t n )
571     {
572         if( size_ == n ) {
573             return;
574         }
575         if (n == 0) {
576             if( str_ ) {
577                 delete [] str_;
578             }
579             str_ = NULL;
580             size_ = 0;
581         }
582         else {
583             char *newString = new char[n + 1];
584             ::size_t copySize = n;
585             if( size_ < n ) {
586                 copySize = size_;
587             }
588             size_ = n;
589 
590             if(str_) {
591                 memcpy(newString, str_, (copySize + 1) * sizeof(char));
592             }
593             if( copySize < size_ ) {
594                 memset(newString + copySize, 0, size_ - copySize);
595             }
596             newString[size_] = '\0';
597 
598             delete [] str_;
599             str_ = newString;
600         }
601     }
602 
operator [](::size_t pos) const603     const char& operator[] ( ::size_t pos ) const
604     {
605         return str_[pos];
606     }
607 
operator [](::size_t pos)608     char& operator[] ( ::size_t pos )
609     {
610         return str_[pos];
611     }
612 
613     /*! \brief Copies the value of another string to this one.
614      *
615      *  \param rhs the string to copy.
616      *
617      *  \returns a reference to the modified instance.
618      */
operator =(const string & rhs)619     string& operator=(const string& rhs)
620     {
621         if (this == &rhs) {
622             return *this;
623         }
624 
625         if( str_ != NULL ) {
626             delete [] str_;
627             str_ = NULL;
628             size_ = 0;
629         }
630 
631         if (rhs.size_ == 0 || rhs.str_ == NULL) {
632             str_ = NULL;
633             size_ = 0;
634         }
635         else {
636             str_ = new char[rhs.size_ + 1];
637             size_ = rhs.size_;
638 
639             if (str_ != NULL) {
640                 memcpy(str_, rhs.str_, (size_ + 1) * sizeof(char));
641             }
642             else {
643                 size_ = 0;
644             }
645         }
646 
647         return *this;
648     }
649 
650     /*! \brief Constructs a string by copying the value of another instance.
651      *
652      *  \param rhs the string to copy.
653      */
string(const string & rhs)654     string(const string& rhs) :
655         size_(0),
656         str_(NULL)
657     {
658         *this = rhs;
659     }
660 
661     //! \brief Destructor - frees memory used to hold the current value.
~string()662     ~string()
663     {
664         delete[] str_;
665         str_ = NULL;
666     }
667 
668     //! \brief Queries the length of the string, excluding any added '\0's.
size(void) const669     ::size_t size(void) const   { return size_; }
670 
671     //! \brief Queries the length of the string, excluding any added '\0's.
length(void) const672     ::size_t length(void) const { return size(); }
673 
674     /*! \brief Returns a pointer to the private copy held by this instance,
675      *  or "" if empty/unset.
676      */
c_str(void) const677     const char * c_str(void) const { return (str_) ? str_ : "";}
678 } CL_EXT_SUFFIX__VERSION_1_1_DEPRECATED;
679 typedef cl::string STRING_CLASS;
680 #endif // #elif !defined(__USE_DEV_STRING)
681 
682 #if !defined(__USE_DEV_VECTOR) && !defined(__NO_STD_VECTOR)
683 #define VECTOR_CLASS std::vector
684 #elif !defined(__USE_DEV_VECTOR)
685 #define VECTOR_CLASS cl::vector
686 
687 #if !defined(__MAX_DEFAULT_VECTOR_SIZE)
688 #define __MAX_DEFAULT_VECTOR_SIZE 10
689 #endif
690 
691 /*! \class vector
692  * \brief Fixed sized vector implementation that mirroring
693  *
694  *  \note Deprecated. Please use std::vector as default or
695  *  re-define the vector class to match the std::vector
696  *  interface by defining VECTOR_CLASS
697 
698  *  \note Not recommended for use with custom objects as
699  *  current implementation will construct N elements
700  *
701  * std::vector functionality.
702  *  \brief Fixed sized vector compatible with std::vector.
703  *
704  *  \note
705  *  This differs from std::vector<> not just in memory allocation,
706  *  but also in terms of when members are constructed, destroyed,
707  *  and assigned instead of being copy constructed.
708  *
709  *  \param T type of element contained in the vector.
710  *
711  *  \param N maximum size of the vector.
712  */
713 template <typename T, unsigned int N = __MAX_DEFAULT_VECTOR_SIZE>
714 class CL_EXT_PREFIX__VERSION_1_1_DEPRECATED vector
715 {
716 private:
717     T data_[N];
718     unsigned int size_;
719 
720 public:
721     //! \brief Constructs an empty vector with no memory allocated.
vector()722     vector() :
723         size_(static_cast<unsigned int>(0))
724     {}
725 
726     //! \brief Deallocates the vector's memory and destroys all of its elements.
~vector()727     ~vector()
728     {
729         clear();
730     }
731 
732     //! \brief Returns the number of elements currently contained.
size(void) const733     unsigned int size(void) const
734     {
735         return size_;
736     }
737 
738     /*! \brief Empties the vector of all elements.
739      *  \note
740      *  This does not deallocate memory but will invoke destructors
741      *  on contained elements.
742      */
clear()743     void clear()
744     {
745         while(!empty()) {
746             pop_back();
747         }
748     }
749 
750     /*! \brief Appends an element after the last valid element.
751      * Calling this on a vector that has reached capacity will throw an
752      * exception if exceptions are enabled.
753      */
push_back(const T & x)754     void push_back (const T& x)
755     {
756         if (size() < N) {
757             new (&data_[size_]) T(x);
758             size_++;
759         } else {
760             detail::errHandler(CL_MEM_OBJECT_ALLOCATION_FAILURE, __VECTOR_CAPACITY_ERR);
761         }
762     }
763 
764     /*! \brief Removes the last valid element from the vector.
765      * Calling this on an empty vector will throw an exception
766      * if exceptions are enabled.
767      */
pop_back(void)768     void pop_back(void)
769     {
770         if (size_ != 0) {
771             --size_;
772             data_[size_].~T();
773         } else {
774             detail::errHandler(CL_MEM_OBJECT_ALLOCATION_FAILURE, __VECTOR_CAPACITY_ERR);
775         }
776     }
777 
778     /*! \brief Constructs with a value copied from another.
779      *
780      *  \param vec the vector to copy.
781      */
vector(const vector<T,N> & vec)782     vector(const vector<T, N>& vec) :
783         size_(vec.size_)
784     {
785         if (size_ != 0) {
786             assign(vec.begin(), vec.end());
787         }
788     }
789 
790     /*! \brief Constructs with a specified number of initial elements.
791      *
792      *  \param size number of initial elements.
793      *
794      *  \param val value of initial elements.
795      */
vector(unsigned int size,const T & val=T ())796     vector(unsigned int size, const T& val = T()) :
797         size_(0)
798     {
799         for (unsigned int i = 0; i < size; i++) {
800             push_back(val);
801         }
802     }
803 
804     /*! \brief Overwrites the current content with that copied from another
805      *         instance.
806      *
807      *  \param rhs vector to copy.
808      *
809      *  \returns a reference to this.
810      */
operator =(const vector<T,N> & rhs)811     vector<T, N>& operator=(const vector<T, N>& rhs)
812     {
813         if (this == &rhs) {
814             return *this;
815         }
816 
817         if (rhs.size_ != 0) {
818             assign(rhs.begin(), rhs.end());
819         } else {
820             clear();
821         }
822 
823         return *this;
824     }
825 
826     /*! \brief Tests equality against another instance.
827      *
828      *  \param vec the vector against which to compare.
829      */
operator ==(vector<T,N> & vec)830     bool operator==(vector<T,N> &vec)
831     {
832         if (size() != vec.size()) {
833             return false;
834         }
835 
836         for( unsigned int i = 0; i < size(); ++i ) {
837             if( operator[](i) != vec[i] ) {
838                 return false;
839             }
840         }
841         return true;
842     }
843 
844     //! \brief Conversion operator to T*.
operator T*()845     operator T* ()             { return data_; }
846 
847     //! \brief Conversion operator to const T*.
operator const T*() const848     operator const T* () const { return data_; }
849 
850     //! \brief Tests whether this instance has any elements.
empty(void) const851     bool empty (void) const
852     {
853         return size_==0;
854     }
855 
856     //! \brief Returns the maximum number of elements this instance can hold.
max_size(void) const857     unsigned int max_size (void) const
858     {
859         return N;
860     }
861 
862     //! \brief Returns the maximum number of elements this instance can hold.
capacity() const863     unsigned int capacity () const
864     {
865         return N;
866     }
867 
868     //! \brief Resizes the vector to the given size
resize(unsigned int newSize,T fill=T ())869     void resize(unsigned int newSize, T fill = T())
870     {
871         if (newSize > N)
872         {
873             detail::errHandler(CL_MEM_OBJECT_ALLOCATION_FAILURE, __VECTOR_CAPACITY_ERR);
874         }
875         else
876         {
877             while (size_ < newSize)
878             {
879                 new (&data_[size_]) T(fill);
880                 size_++;
881             }
882             while (size_ > newSize)
883             {
884                 --size_;
885                 data_[size_].~T();
886             }
887         }
888     }
889 
890     /*! \brief Returns a reference to a given element.
891      *
892      *  \param index which element to access.     *
893      *  \note
894      *  The caller is responsible for ensuring index is >= 0 and < size().
895      */
operator [](int index)896     T& operator[](int index)
897     {
898         return data_[index];
899     }
900 
901     /*! \brief Returns a const reference to a given element.
902      *
903      *  \param index which element to access.
904      *
905      *  \note
906      *  The caller is responsible for ensuring index is >= 0 and < size().
907      */
operator [](int index) const908     const T& operator[](int index) const
909     {
910         return data_[index];
911     }
912 
913     /*! \brief Assigns elements of the vector based on a source iterator range.
914      *
915      *  \param start Beginning iterator of source range
916      *  \param end Enditerator of source range
917      *
918      *  \note
919      *  Will throw an exception if exceptions are enabled and size exceeded.
920      */
921     template<class I>
assign(I start,I end)922     void assign(I start, I end)
923     {
924         clear();
925         while(start != end) {
926             push_back(*start);
927             start++;
928         }
929     }
930 
931     /*! \class iterator
932      * \brief Const iterator class for vectors
933      */
934     class iterator
935     {
936     private:
937         const vector<T,N> *vec_;
938         int index_;
939 
940         /**
941          * Internal iterator constructor to capture reference
942          * to the vector it iterates over rather than taking
943          * the vector by copy.
944          */
iterator(const vector<T,N> & vec,int index)945         iterator (const vector<T,N> &vec, int index) :
946             vec_(&vec)
947         {
948             if( !vec.empty() ) {
949                 index_ = index;
950             } else {
951                 index_ = -1;
952             }
953         }
954 
955     public:
iterator(void)956         iterator(void) :
957             index_(-1),
958             vec_(NULL)
959         {
960         }
961 
iterator(const iterator & rhs)962         iterator(const iterator& rhs) :
963             vec_(rhs.vec_),
964             index_(rhs.index_)
965         {
966         }
967 
~iterator(void)968         ~iterator(void) {}
969 
begin(const cl::vector<T,N> & vec)970         static iterator begin(const cl::vector<T,N> &vec)
971         {
972             iterator i(vec, 0);
973 
974             return i;
975         }
976 
end(const cl::vector<T,N> & vec)977         static iterator end(const cl::vector<T,N> &vec)
978         {
979             iterator i(vec, vec.size());
980 
981             return i;
982         }
983 
operator ==(iterator i)984         bool operator==(iterator i)
985         {
986             return ((vec_ == i.vec_) &&
987                     (index_ == i.index_));
988         }
989 
operator !=(iterator i)990         bool operator!=(iterator i)
991         {
992             return (!(*this==i));
993         }
994 
operator ++()995         iterator& operator++()
996         {
997             ++index_;
998             return *this;
999         }
1000 
operator ++(int)1001         iterator operator++(int)
1002         {
1003             iterator retVal(*this);
1004             ++index_;
1005             return retVal;
1006         }
1007 
operator --()1008         iterator& operator--()
1009         {
1010             --index_;
1011             return *this;
1012         }
1013 
operator --(int)1014         iterator operator--(int)
1015         {
1016             iterator retVal(*this);
1017             --index_;
1018             return retVal;
1019         }
1020 
operator *() const1021         const T& operator *() const
1022         {
1023             return (*vec_)[index_];
1024         }
1025     };
1026 
begin(void)1027     iterator begin(void)
1028     {
1029         return iterator::begin(*this);
1030     }
1031 
begin(void) const1032     iterator begin(void) const
1033     {
1034         return iterator::begin(*this);
1035     }
1036 
end(void)1037     iterator end(void)
1038     {
1039         return iterator::end(*this);
1040     }
1041 
end(void) const1042     iterator end(void) const
1043     {
1044         return iterator::end(*this);
1045     }
1046 
front(void)1047     T& front(void)
1048     {
1049         return data_[0];
1050     }
1051 
back(void)1052     T& back(void)
1053     {
1054         return data_[size_];
1055     }
1056 
front(void) const1057     const T& front(void) const
1058     {
1059         return data_[0];
1060     }
1061 
back(void) const1062     const T& back(void) const
1063     {
1064         return data_[size_-1];
1065     }
1066 } CL_EXT_SUFFIX__VERSION_1_1_DEPRECATED;
1067 #endif // #if !defined(__USE_DEV_VECTOR) && !defined(__NO_STD_VECTOR)
1068 
1069 
1070 
1071 
1072 
1073 namespace detail {
1074 #define __DEFAULT_NOT_INITIALIZED 1
1075 #define __DEFAULT_BEING_INITIALIZED 2
1076 #define __DEFAULT_INITIALIZED 4
1077 
1078     /*
1079      * Compare and exchange primitives are needed for handling of defaults
1080     */
1081 
1082 #ifdef CL_HPP_CPP11_ATOMICS_SUPPORTED
compare_exchange(std::atomic<int> * dest,int exchange,int comparand)1083     inline int compare_exchange(std::atomic<int> * dest, int exchange, int comparand)
1084 #else // !CL_HPP_CPP11_ATOMICS_SUPPORTED
1085     inline int compare_exchange(volatile int * dest, int exchange, int comparand)
1086 #endif // !CL_HPP_CPP11_ATOMICS_SUPPORTED
1087     {
1088 #ifdef CL_HPP_CPP11_ATOMICS_SUPPORTED
1089         std::atomic_compare_exchange_strong(dest, &comparand, exchange);
1090         return comparand;
1091 #elif _MSC_VER
1092         return (int)(_InterlockedCompareExchange(
1093             (volatile long*)dest,
1094             (long)exchange,
1095             (long)comparand));
1096 #else // !_MSC_VER && !CL_HPP_CPP11_ATOMICS_SUPPORTED
1097         return (__sync_val_compare_and_swap(
1098             dest,
1099             comparand,
1100             exchange));
1101 #endif // !CL_HPP_CPP11_ATOMICS_SUPPORTED
1102     }
1103 
fence()1104     inline void fence() {
1105 #ifdef CL_HPP_CPP11_ATOMICS_SUPPORTED
1106         std::atomic_thread_fence(std::memory_order_seq_cst);
1107 #elif _MSC_VER // !CL_HPP_CPP11_ATOMICS_SUPPORTED
1108         _ReadWriteBarrier();
1109 #else // !_MSC_VER && !CL_HPP_CPP11_ATOMICS_SUPPORTED
1110         __sync_synchronize();
1111 #endif // !CL_HPP_CPP11_ATOMICS_SUPPORTED
1112     }
1113 } // namespace detail
1114 
1115 
1116 /*! \brief class used to interface between C++ and
1117  *  OpenCL C calls that require arrays of size_t values, whose
1118  *  size is known statically.
1119  */
1120 template <int N>
1121 class size_t
1122 {
1123 private:
1124     ::size_t data_[N];
1125 
1126 public:
1127     //! \brief Initialize size_t to all 0s
size_t()1128     size_t()
1129     {
1130         for( int i = 0; i < N; ++i ) {
1131             data_[i] = 0;
1132         }
1133     }
1134 
operator [](int index)1135     ::size_t& operator[](int index)
1136     {
1137         return data_[index];
1138     }
1139 
operator [](int index) const1140     const ::size_t& operator[](int index) const
1141     {
1142         return data_[index];
1143     }
1144 
1145     //! \brief Conversion operator to T*.
operator ::size_t*()1146     operator ::size_t* ()             { return data_; }
1147 
1148     //! \brief Conversion operator to const T*.
operator const::size_t*() const1149     operator const ::size_t* () const { return data_; }
1150 };
1151 
1152 namespace detail {
1153 
1154 // Generic getInfoHelper. The final parameter is used to guide overload
1155 // resolution: the actual parameter passed is an int, which makes this
1156 // a worse conversion sequence than a specialization that declares the
1157 // parameter as an int.
1158 template<typename Functor, typename T>
getInfoHelper(Functor f,cl_uint name,T * param,long)1159 inline cl_int getInfoHelper(Functor f, cl_uint name, T* param, long)
1160 {
1161     return f(name, sizeof(T), param, NULL);
1162 }
1163 
1164 // Specialized getInfoHelper for VECTOR_CLASS params
1165 template <typename Func, typename T>
getInfoHelper(Func f,cl_uint name,VECTOR_CLASS<T> * param,long)1166 inline cl_int getInfoHelper(Func f, cl_uint name, VECTOR_CLASS<T>* param, long)
1167 {
1168     ::size_t required;
1169     cl_int err = f(name, 0, NULL, &required);
1170     if (err != CL_SUCCESS) {
1171         return err;
1172     }
1173 
1174     T* value = (T*) alloca(required);
1175     err = f(name, required, value, NULL);
1176     if (err != CL_SUCCESS) {
1177         return err;
1178     }
1179 
1180     param->assign(&value[0], &value[required/sizeof(T)]);
1181     return CL_SUCCESS;
1182 }
1183 
1184 /* Specialization for reference-counted types. This depends on the
1185  * existence of Wrapper<T>::cl_type, and none of the other types having the
1186  * cl_type member. Note that simplify specifying the parameter as Wrapper<T>
1187  * does not work, because when using a derived type (e.g. Context) the generic
1188  * template will provide a better match.
1189  */
1190 template <typename Func, typename T>
getInfoHelper(Func f,cl_uint name,VECTOR_CLASS<T> * param,int,typename T::cl_type=0)1191 inline cl_int getInfoHelper(Func f, cl_uint name, VECTOR_CLASS<T>* param, int, typename T::cl_type = 0)
1192 {
1193     ::size_t required;
1194     cl_int err = f(name, 0, NULL, &required);
1195     if (err != CL_SUCCESS) {
1196         return err;
1197     }
1198 
1199     typename T::cl_type * value = (typename T::cl_type *) alloca(required);
1200     err = f(name, required, value, NULL);
1201     if (err != CL_SUCCESS) {
1202         return err;
1203     }
1204 
1205     ::size_t elements = required / sizeof(typename T::cl_type);
1206     param->assign(&value[0], &value[elements]);
1207     for (::size_t i = 0; i < elements; i++)
1208     {
1209         if (value[i] != NULL)
1210         {
1211             err = (*param)[i].retain();
1212             if (err != CL_SUCCESS) {
1213                 return err;
1214             }
1215         }
1216     }
1217     return CL_SUCCESS;
1218 }
1219 
1220 // Specialized for getInfo<CL_PROGRAM_BINARIES>
1221 template <typename Func>
getInfoHelper(Func f,cl_uint name,VECTOR_CLASS<char * > * param,int)1222 inline cl_int getInfoHelper(Func f, cl_uint name, VECTOR_CLASS<char *>* param, int)
1223 {
1224     cl_int err = f(name, param->size() * sizeof(char *), &(*param)[0], NULL);
1225 
1226     if (err != CL_SUCCESS) {
1227         return err;
1228     }
1229 
1230     return CL_SUCCESS;
1231 }
1232 
1233 // Specialized GetInfoHelper for STRING_CLASS params
1234 template <typename Func>
getInfoHelper(Func f,cl_uint name,STRING_CLASS * param,long)1235 inline cl_int getInfoHelper(Func f, cl_uint name, STRING_CLASS* param, long)
1236 {
1237 #if defined(__NO_STD_VECTOR) || defined(__NO_STD_STRING)
1238     ::size_t required;
1239     cl_int err = f(name, 0, NULL, &required);
1240     if (err != CL_SUCCESS) {
1241         return err;
1242     }
1243 
1244     char* value = (char*)alloca(required);
1245     err = f(name, required, value, NULL);
1246     if (err != CL_SUCCESS) {
1247         return err;
1248     }
1249 
1250     *param = value;
1251     return CL_SUCCESS;
1252 #else
1253     ::size_t required;
1254     cl_int err = f(name, 0, NULL, &required);
1255     if (err != CL_SUCCESS) {
1256         return err;
1257     }
1258 
1259     if (required > 0) {
1260         // std::string has a constant data member
1261         // a char vector does not
1262         VECTOR_CLASS<char> value(required);
1263         err = f(name, required, value.data(), NULL);
1264         if (err != CL_SUCCESS) {
1265             return err;
1266         }
1267         if (param) {
1268             param->assign(value.begin(), value.end() - 1u);
1269         }
1270     }
1271     else if (param) {
1272         param->assign("");
1273     }
1274 #endif
1275     return CL_SUCCESS;
1276 }
1277 
1278 // Specialized GetInfoHelper for cl::size_t params
1279 template <typename Func, ::size_t N>
getInfoHelper(Func f,cl_uint name,size_t<N> * param,long)1280 inline cl_int getInfoHelper(Func f, cl_uint name, size_t<N>* param, long)
1281 {
1282     ::size_t required;
1283     cl_int err = f(name, 0, NULL, &required);
1284     if (err != CL_SUCCESS) {
1285         return err;
1286     }
1287 
1288     ::size_t* value = (::size_t*) alloca(required);
1289     err = f(name, required, value, NULL);
1290     if (err != CL_SUCCESS) {
1291         return err;
1292     }
1293 
1294     for(int i = 0; i < N; ++i) {
1295         (*param)[i] = value[i];
1296     }
1297 
1298     return CL_SUCCESS;
1299 }
1300 
1301 template<typename T> struct ReferenceHandler;
1302 
1303 /* Specialization for reference-counted types. This depends on the
1304  * existence of Wrapper<T>::cl_type, and none of the other types having the
1305  * cl_type member. Note that simplify specifying the parameter as Wrapper<T>
1306  * does not work, because when using a derived type (e.g. Context) the generic
1307  * template will provide a better match.
1308  */
1309 template<typename Func, typename T>
getInfoHelper(Func f,cl_uint name,T * param,int,typename T::cl_type=0)1310 inline cl_int getInfoHelper(Func f, cl_uint name, T* param, int, typename T::cl_type = 0)
1311 {
1312     typename T::cl_type value;
1313     cl_int err = f(name, sizeof(value), &value, NULL);
1314     if (err != CL_SUCCESS) {
1315         return err;
1316     }
1317     *param = value;
1318     if (value != NULL)
1319     {
1320         err = param->retain();
1321         if (err != CL_SUCCESS) {
1322             return err;
1323         }
1324     }
1325     return CL_SUCCESS;
1326 }
1327 
1328 #define __PARAM_NAME_INFO_1_0(F) \
1329     F(cl_platform_info, CL_PLATFORM_PROFILE, STRING_CLASS) \
1330     F(cl_platform_info, CL_PLATFORM_VERSION, STRING_CLASS) \
1331     F(cl_platform_info, CL_PLATFORM_NAME, STRING_CLASS) \
1332     F(cl_platform_info, CL_PLATFORM_VENDOR, STRING_CLASS) \
1333     F(cl_platform_info, CL_PLATFORM_EXTENSIONS, STRING_CLASS) \
1334     \
1335     F(cl_device_info, CL_DEVICE_TYPE, cl_device_type) \
1336     F(cl_device_info, CL_DEVICE_VENDOR_ID, cl_uint) \
1337     F(cl_device_info, CL_DEVICE_MAX_COMPUTE_UNITS, cl_uint) \
1338     F(cl_device_info, CL_DEVICE_MAX_WORK_ITEM_DIMENSIONS, cl_uint) \
1339     F(cl_device_info, CL_DEVICE_MAX_WORK_GROUP_SIZE, ::size_t) \
1340     F(cl_device_info, CL_DEVICE_MAX_WORK_ITEM_SIZES, VECTOR_CLASS< ::size_t>) \
1341     F(cl_device_info, CL_DEVICE_PREFERRED_VECTOR_WIDTH_CHAR, cl_uint) \
1342     F(cl_device_info, CL_DEVICE_PREFERRED_VECTOR_WIDTH_SHORT, cl_uint) \
1343     F(cl_device_info, CL_DEVICE_PREFERRED_VECTOR_WIDTH_INT, cl_uint) \
1344     F(cl_device_info, CL_DEVICE_PREFERRED_VECTOR_WIDTH_LONG, cl_uint) \
1345     F(cl_device_info, CL_DEVICE_PREFERRED_VECTOR_WIDTH_FLOAT, cl_uint) \
1346     F(cl_device_info, CL_DEVICE_PREFERRED_VECTOR_WIDTH_DOUBLE, cl_uint) \
1347     F(cl_device_info, CL_DEVICE_MAX_CLOCK_FREQUENCY, cl_uint) \
1348     F(cl_device_info, CL_DEVICE_ADDRESS_BITS, cl_uint) \
1349     F(cl_device_info, CL_DEVICE_MAX_READ_IMAGE_ARGS, cl_uint) \
1350     F(cl_device_info, CL_DEVICE_MAX_WRITE_IMAGE_ARGS, cl_uint) \
1351     F(cl_device_info, CL_DEVICE_MAX_MEM_ALLOC_SIZE, cl_ulong) \
1352     F(cl_device_info, CL_DEVICE_IMAGE2D_MAX_WIDTH, ::size_t) \
1353     F(cl_device_info, CL_DEVICE_IMAGE2D_MAX_HEIGHT, ::size_t) \
1354     F(cl_device_info, CL_DEVICE_IMAGE3D_MAX_WIDTH, ::size_t) \
1355     F(cl_device_info, CL_DEVICE_IMAGE3D_MAX_HEIGHT, ::size_t) \
1356     F(cl_device_info, CL_DEVICE_IMAGE3D_MAX_DEPTH, ::size_t) \
1357     F(cl_device_info, CL_DEVICE_IMAGE_SUPPORT, cl_bool) \
1358     F(cl_device_info, CL_DEVICE_MAX_PARAMETER_SIZE, ::size_t) \
1359     F(cl_device_info, CL_DEVICE_MAX_SAMPLERS, cl_uint) \
1360     F(cl_device_info, CL_DEVICE_MEM_BASE_ADDR_ALIGN, cl_uint) \
1361     F(cl_device_info, CL_DEVICE_MIN_DATA_TYPE_ALIGN_SIZE, cl_uint) \
1362     F(cl_device_info, CL_DEVICE_SINGLE_FP_CONFIG, cl_device_fp_config) \
1363     F(cl_device_info, CL_DEVICE_DOUBLE_FP_CONFIG, cl_device_fp_config) \
1364     F(cl_device_info, CL_DEVICE_HALF_FP_CONFIG, cl_device_fp_config) \
1365     F(cl_device_info, CL_DEVICE_GLOBAL_MEM_CACHE_TYPE, cl_device_mem_cache_type) \
1366     F(cl_device_info, CL_DEVICE_GLOBAL_MEM_CACHELINE_SIZE, cl_uint)\
1367     F(cl_device_info, CL_DEVICE_GLOBAL_MEM_CACHE_SIZE, cl_ulong) \
1368     F(cl_device_info, CL_DEVICE_GLOBAL_MEM_SIZE, cl_ulong) \
1369     F(cl_device_info, CL_DEVICE_MAX_CONSTANT_BUFFER_SIZE, cl_ulong) \
1370     F(cl_device_info, CL_DEVICE_MAX_CONSTANT_ARGS, cl_uint) \
1371     F(cl_device_info, CL_DEVICE_LOCAL_MEM_TYPE, cl_device_local_mem_type) \
1372     F(cl_device_info, CL_DEVICE_LOCAL_MEM_SIZE, cl_ulong) \
1373     F(cl_device_info, CL_DEVICE_ERROR_CORRECTION_SUPPORT, cl_bool) \
1374     F(cl_device_info, CL_DEVICE_PROFILING_TIMER_RESOLUTION, ::size_t) \
1375     F(cl_device_info, CL_DEVICE_ENDIAN_LITTLE, cl_bool) \
1376     F(cl_device_info, CL_DEVICE_AVAILABLE, cl_bool) \
1377     F(cl_device_info, CL_DEVICE_COMPILER_AVAILABLE, cl_bool) \
1378     F(cl_device_info, CL_DEVICE_EXECUTION_CAPABILITIES, cl_device_exec_capabilities) \
1379     F(cl_device_info, CL_DEVICE_QUEUE_PROPERTIES, cl_command_queue_properties) \
1380     F(cl_device_info, CL_DEVICE_PLATFORM, cl_platform_id) \
1381     F(cl_device_info, CL_DEVICE_NAME, STRING_CLASS) \
1382     F(cl_device_info, CL_DEVICE_VENDOR, STRING_CLASS) \
1383     F(cl_device_info, CL_DRIVER_VERSION, STRING_CLASS) \
1384     F(cl_device_info, CL_DEVICE_PROFILE, STRING_CLASS) \
1385     F(cl_device_info, CL_DEVICE_VERSION, STRING_CLASS) \
1386     F(cl_device_info, CL_DEVICE_EXTENSIONS, STRING_CLASS) \
1387     \
1388     F(cl_context_info, CL_CONTEXT_REFERENCE_COUNT, cl_uint) \
1389     F(cl_context_info, CL_CONTEXT_DEVICES, VECTOR_CLASS<Device>) \
1390     F(cl_context_info, CL_CONTEXT_PROPERTIES, VECTOR_CLASS<cl_context_properties>) \
1391     \
1392     F(cl_event_info, CL_EVENT_COMMAND_QUEUE, cl::CommandQueue) \
1393     F(cl_event_info, CL_EVENT_COMMAND_TYPE, cl_command_type) \
1394     F(cl_event_info, CL_EVENT_REFERENCE_COUNT, cl_uint) \
1395     F(cl_event_info, CL_EVENT_COMMAND_EXECUTION_STATUS, cl_int) \
1396     \
1397     F(cl_profiling_info, CL_PROFILING_COMMAND_QUEUED, cl_ulong) \
1398     F(cl_profiling_info, CL_PROFILING_COMMAND_SUBMIT, cl_ulong) \
1399     F(cl_profiling_info, CL_PROFILING_COMMAND_START, cl_ulong) \
1400     F(cl_profiling_info, CL_PROFILING_COMMAND_END, cl_ulong) \
1401     \
1402     F(cl_mem_info, CL_MEM_TYPE, cl_mem_object_type) \
1403     F(cl_mem_info, CL_MEM_FLAGS, cl_mem_flags) \
1404     F(cl_mem_info, CL_MEM_SIZE, ::size_t) \
1405     F(cl_mem_info, CL_MEM_HOST_PTR, void*) \
1406     F(cl_mem_info, CL_MEM_MAP_COUNT, cl_uint) \
1407     F(cl_mem_info, CL_MEM_REFERENCE_COUNT, cl_uint) \
1408     F(cl_mem_info, CL_MEM_CONTEXT, cl::Context) \
1409     \
1410     F(cl_image_info, CL_IMAGE_FORMAT, cl_image_format) \
1411     F(cl_image_info, CL_IMAGE_ELEMENT_SIZE, ::size_t) \
1412     F(cl_image_info, CL_IMAGE_ROW_PITCH, ::size_t) \
1413     F(cl_image_info, CL_IMAGE_SLICE_PITCH, ::size_t) \
1414     F(cl_image_info, CL_IMAGE_WIDTH, ::size_t) \
1415     F(cl_image_info, CL_IMAGE_HEIGHT, ::size_t) \
1416     F(cl_image_info, CL_IMAGE_DEPTH, ::size_t) \
1417     \
1418     F(cl_sampler_info, CL_SAMPLER_REFERENCE_COUNT, cl_uint) \
1419     F(cl_sampler_info, CL_SAMPLER_CONTEXT, cl::Context) \
1420     F(cl_sampler_info, CL_SAMPLER_NORMALIZED_COORDS, cl_bool) \
1421     F(cl_sampler_info, CL_SAMPLER_ADDRESSING_MODE, cl_addressing_mode) \
1422     F(cl_sampler_info, CL_SAMPLER_FILTER_MODE, cl_filter_mode) \
1423     \
1424     F(cl_program_info, CL_PROGRAM_REFERENCE_COUNT, cl_uint) \
1425     F(cl_program_info, CL_PROGRAM_CONTEXT, cl::Context) \
1426     F(cl_program_info, CL_PROGRAM_NUM_DEVICES, cl_uint) \
1427     F(cl_program_info, CL_PROGRAM_DEVICES, VECTOR_CLASS<Device>) \
1428     F(cl_program_info, CL_PROGRAM_SOURCE, STRING_CLASS) \
1429     F(cl_program_info, CL_PROGRAM_BINARY_SIZES, VECTOR_CLASS< ::size_t>) \
1430     F(cl_program_info, CL_PROGRAM_BINARIES, VECTOR_CLASS<char *>) \
1431     \
1432     F(cl_program_build_info, CL_PROGRAM_BUILD_STATUS, cl_build_status) \
1433     F(cl_program_build_info, CL_PROGRAM_BUILD_OPTIONS, STRING_CLASS) \
1434     F(cl_program_build_info, CL_PROGRAM_BUILD_LOG, STRING_CLASS) \
1435     \
1436     F(cl_kernel_info, CL_KERNEL_FUNCTION_NAME, STRING_CLASS) \
1437     F(cl_kernel_info, CL_KERNEL_NUM_ARGS, cl_uint) \
1438     F(cl_kernel_info, CL_KERNEL_REFERENCE_COUNT, cl_uint) \
1439     F(cl_kernel_info, CL_KERNEL_CONTEXT, cl::Context) \
1440     F(cl_kernel_info, CL_KERNEL_PROGRAM, cl::Program) \
1441     \
1442     F(cl_kernel_work_group_info, CL_KERNEL_WORK_GROUP_SIZE, ::size_t) \
1443     F(cl_kernel_work_group_info, CL_KERNEL_COMPILE_WORK_GROUP_SIZE, cl::size_t<3>) \
1444     F(cl_kernel_work_group_info, CL_KERNEL_LOCAL_MEM_SIZE, cl_ulong) \
1445     \
1446     F(cl_command_queue_info, CL_QUEUE_CONTEXT, cl::Context) \
1447     F(cl_command_queue_info, CL_QUEUE_DEVICE, cl::Device) \
1448     F(cl_command_queue_info, CL_QUEUE_REFERENCE_COUNT, cl_uint) \
1449     F(cl_command_queue_info, CL_QUEUE_PROPERTIES, cl_command_queue_properties)
1450 
1451 #if defined(CL_VERSION_1_1)
1452 #define __PARAM_NAME_INFO_1_1(F) \
1453     F(cl_context_info, CL_CONTEXT_NUM_DEVICES, cl_uint)\
1454     F(cl_device_info, CL_DEVICE_PREFERRED_VECTOR_WIDTH_HALF, cl_uint) \
1455     F(cl_device_info, CL_DEVICE_NATIVE_VECTOR_WIDTH_CHAR, cl_uint) \
1456     F(cl_device_info, CL_DEVICE_NATIVE_VECTOR_WIDTH_SHORT, cl_uint) \
1457     F(cl_device_info, CL_DEVICE_NATIVE_VECTOR_WIDTH_INT, cl_uint) \
1458     F(cl_device_info, CL_DEVICE_NATIVE_VECTOR_WIDTH_LONG, cl_uint) \
1459     F(cl_device_info, CL_DEVICE_NATIVE_VECTOR_WIDTH_FLOAT, cl_uint) \
1460     F(cl_device_info, CL_DEVICE_NATIVE_VECTOR_WIDTH_DOUBLE, cl_uint) \
1461     F(cl_device_info, CL_DEVICE_NATIVE_VECTOR_WIDTH_HALF, cl_uint) \
1462     F(cl_device_info, CL_DEVICE_HOST_UNIFIED_MEMORY, cl_bool) \
1463     F(cl_device_info, CL_DEVICE_OPENCL_C_VERSION, STRING_CLASS) \
1464     \
1465     F(cl_mem_info, CL_MEM_ASSOCIATED_MEMOBJECT, cl::Memory) \
1466     F(cl_mem_info, CL_MEM_OFFSET, ::size_t) \
1467     \
1468     F(cl_kernel_work_group_info, CL_KERNEL_PREFERRED_WORK_GROUP_SIZE_MULTIPLE, ::size_t) \
1469     F(cl_kernel_work_group_info, CL_KERNEL_PRIVATE_MEM_SIZE, cl_ulong) \
1470     \
1471     F(cl_event_info, CL_EVENT_CONTEXT, cl::Context)
1472 #endif // CL_VERSION_1_1
1473 
1474 
1475 #if defined(CL_VERSION_1_2)
1476 #define __PARAM_NAME_INFO_1_2(F) \
1477     F(cl_image_info, CL_IMAGE_ARRAY_SIZE, ::size_t) \
1478     F(cl_image_info, CL_IMAGE_BUFFER, cl::Buffer) \
1479     F(cl_image_info, CL_IMAGE_NUM_MIP_LEVELS, cl_uint) \
1480     F(cl_image_info, CL_IMAGE_NUM_SAMPLES, cl_uint) \
1481     \
1482     F(cl_program_info, CL_PROGRAM_NUM_KERNELS, ::size_t) \
1483     F(cl_program_info, CL_PROGRAM_KERNEL_NAMES, STRING_CLASS) \
1484     \
1485     F(cl_program_build_info, CL_PROGRAM_BINARY_TYPE, cl_program_binary_type) \
1486     \
1487     F(cl_kernel_info, CL_KERNEL_ATTRIBUTES, STRING_CLASS) \
1488     \
1489     F(cl_kernel_arg_info, CL_KERNEL_ARG_ADDRESS_QUALIFIER, cl_kernel_arg_address_qualifier) \
1490     F(cl_kernel_arg_info, CL_KERNEL_ARG_ACCESS_QUALIFIER, cl_kernel_arg_access_qualifier) \
1491     F(cl_kernel_arg_info, CL_KERNEL_ARG_TYPE_NAME, STRING_CLASS) \
1492     F(cl_kernel_arg_info, CL_KERNEL_ARG_TYPE_QUALIFIER, cl_kernel_arg_type_qualifier) \
1493     F(cl_kernel_arg_info, CL_KERNEL_ARG_NAME, STRING_CLASS) \
1494     \
1495     F(cl_device_info, CL_DEVICE_IMAGE_MAX_BUFFER_SIZE, ::size_t) \
1496     F(cl_device_info, CL_DEVICE_IMAGE_MAX_ARRAY_SIZE, ::size_t) \
1497     F(cl_device_info, CL_DEVICE_LINKER_AVAILABLE, cl_bool) \
1498     F(cl_device_info, CL_DEVICE_BUILT_IN_KERNELS, STRING_CLASS) \
1499     F(cl_device_info, CL_DEVICE_PRINTF_BUFFER_SIZE, ::size_t) \
1500     F(cl_device_info, CL_DEVICE_PREFERRED_INTEROP_USER_SYNC, cl_bool) \
1501     F(cl_device_info, CL_DEVICE_PARENT_DEVICE, cl_device_id) \
1502     F(cl_device_info, CL_DEVICE_PARTITION_MAX_SUB_DEVICES, cl_uint) \
1503     F(cl_device_info, CL_DEVICE_PARTITION_PROPERTIES, VECTOR_CLASS<cl_device_partition_property>) \
1504     F(cl_device_info, CL_DEVICE_PARTITION_AFFINITY_DOMAIN, cl_device_affinity_domain) \
1505     F(cl_device_info, CL_DEVICE_PARTITION_TYPE, VECTOR_CLASS<cl_device_partition_property>)  \
1506     F(cl_device_info, CL_DEVICE_REFERENCE_COUNT, cl_uint)
1507 #endif // #if defined(CL_VERSION_1_2)
1508 
1509 #if defined(USE_CL_DEVICE_FISSION)
1510 #define __PARAM_NAME_DEVICE_FISSION(F) \
1511     F(cl_device_info, CL_DEVICE_PARENT_DEVICE_EXT, cl_device_id) \
1512     F(cl_device_info, CL_DEVICE_PARTITION_TYPES_EXT, VECTOR_CLASS<cl_device_partition_property_ext>) \
1513     F(cl_device_info, CL_DEVICE_AFFINITY_DOMAINS_EXT, VECTOR_CLASS<cl_device_partition_property_ext>) \
1514     F(cl_device_info, CL_DEVICE_REFERENCE_COUNT_EXT , cl_uint) \
1515     F(cl_device_info, CL_DEVICE_PARTITION_STYLE_EXT, VECTOR_CLASS<cl_device_partition_property_ext>)
1516 #endif // USE_CL_DEVICE_FISSION
1517 
1518 template <typename enum_type, cl_int Name>
1519 struct param_traits {};
1520 
1521 #define __CL_DECLARE_PARAM_TRAITS(token, param_name, T) \
1522 struct token;                                        \
1523 template<>                                           \
1524 struct param_traits<detail:: token,param_name>       \
1525 {                                                    \
1526     enum { value = param_name };                     \
1527     typedef T param_type;                            \
1528 };
1529 
1530 __PARAM_NAME_INFO_1_0(__CL_DECLARE_PARAM_TRAITS)
1531 #if defined(CL_VERSION_1_1)
1532 __PARAM_NAME_INFO_1_1(__CL_DECLARE_PARAM_TRAITS)
1533 #endif // CL_VERSION_1_1
1534 #if defined(CL_VERSION_1_2)
1535 __PARAM_NAME_INFO_1_2(__CL_DECLARE_PARAM_TRAITS)
1536 #endif // CL_VERSION_1_1
1537 
1538 #if defined(USE_CL_DEVICE_FISSION)
1539 __PARAM_NAME_DEVICE_FISSION(__CL_DECLARE_PARAM_TRAITS);
1540 #endif // USE_CL_DEVICE_FISSION
1541 
1542 #ifdef CL_PLATFORM_ICD_SUFFIX_KHR
__CL_DECLARE_PARAM_TRAITS(cl_platform_info,CL_PLATFORM_ICD_SUFFIX_KHR,STRING_CLASS)1543 __CL_DECLARE_PARAM_TRAITS(cl_platform_info, CL_PLATFORM_ICD_SUFFIX_KHR, STRING_CLASS)
1544 #endif
1545 
1546 #ifdef CL_DEVICE_PROFILING_TIMER_OFFSET_AMD
1547 __CL_DECLARE_PARAM_TRAITS(cl_device_info, CL_DEVICE_PROFILING_TIMER_OFFSET_AMD, cl_ulong)
1548 #endif
1549 
1550 #ifdef CL_DEVICE_GLOBAL_FREE_MEMORY_AMD
1551 __CL_DECLARE_PARAM_TRAITS(cl_device_info, CL_DEVICE_GLOBAL_FREE_MEMORY_AMD, VECTOR_CLASS< ::size_t>)
1552 #endif
1553 #ifdef CL_DEVICE_SIMD_PER_COMPUTE_UNIT_AMD
1554 __CL_DECLARE_PARAM_TRAITS(cl_device_info, CL_DEVICE_SIMD_PER_COMPUTE_UNIT_AMD, cl_uint)
1555 #endif
1556 #ifdef CL_DEVICE_SIMD_WIDTH_AMD
1557 __CL_DECLARE_PARAM_TRAITS(cl_device_info, CL_DEVICE_SIMD_WIDTH_AMD, cl_uint)
1558 #endif
1559 #ifdef CL_DEVICE_SIMD_INSTRUCTION_WIDTH_AMD
1560 __CL_DECLARE_PARAM_TRAITS(cl_device_info, CL_DEVICE_SIMD_INSTRUCTION_WIDTH_AMD, cl_uint)
1561 #endif
1562 #ifdef CL_DEVICE_WAVEFRONT_WIDTH_AMD
1563 __CL_DECLARE_PARAM_TRAITS(cl_device_info, CL_DEVICE_WAVEFRONT_WIDTH_AMD, cl_uint)
1564 #endif
1565 #ifdef CL_DEVICE_GLOBAL_MEM_CHANNELS_AMD
1566 __CL_DECLARE_PARAM_TRAITS(cl_device_info, CL_DEVICE_GLOBAL_MEM_CHANNELS_AMD, cl_uint)
1567 #endif
1568 #ifdef CL_DEVICE_GLOBAL_MEM_CHANNEL_BANKS_AMD
1569 __CL_DECLARE_PARAM_TRAITS(cl_device_info, CL_DEVICE_GLOBAL_MEM_CHANNEL_BANKS_AMD, cl_uint)
1570 #endif
1571 #ifdef CL_DEVICE_GLOBAL_MEM_CHANNEL_BANK_WIDTH_AMD
1572 __CL_DECLARE_PARAM_TRAITS(cl_device_info, CL_DEVICE_GLOBAL_MEM_CHANNEL_BANK_WIDTH_AMD, cl_uint)
1573 #endif
1574 #ifdef CL_DEVICE_LOCAL_MEM_SIZE_PER_COMPUTE_UNIT_AMD
1575 __CL_DECLARE_PARAM_TRAITS(cl_device_info, CL_DEVICE_LOCAL_MEM_SIZE_PER_COMPUTE_UNIT_AMD, cl_uint)
1576 #endif
1577 #ifdef CL_DEVICE_LOCAL_MEM_BANKS_AMD
1578 __CL_DECLARE_PARAM_TRAITS(cl_device_info, CL_DEVICE_LOCAL_MEM_BANKS_AMD, cl_uint)
1579 #endif
1580 
1581 #ifdef CL_DEVICE_COMPUTE_CAPABILITY_MAJOR_NV
1582 __CL_DECLARE_PARAM_TRAITS(cl_device_info, CL_DEVICE_COMPUTE_CAPABILITY_MAJOR_NV, cl_uint)
1583 #endif
1584 #ifdef CL_DEVICE_COMPUTE_CAPABILITY_MINOR_NV
1585 __CL_DECLARE_PARAM_TRAITS(cl_device_info, CL_DEVICE_COMPUTE_CAPABILITY_MINOR_NV, cl_uint)
1586 #endif
1587 #ifdef CL_DEVICE_REGISTERS_PER_BLOCK_NV
1588 __CL_DECLARE_PARAM_TRAITS(cl_device_info, CL_DEVICE_REGISTERS_PER_BLOCK_NV, cl_uint)
1589 #endif
1590 #ifdef CL_DEVICE_WARP_SIZE_NV
1591 __CL_DECLARE_PARAM_TRAITS(cl_device_info, CL_DEVICE_WARP_SIZE_NV, cl_uint)
1592 #endif
1593 #ifdef CL_DEVICE_GPU_OVERLAP_NV
1594 __CL_DECLARE_PARAM_TRAITS(cl_device_info, CL_DEVICE_GPU_OVERLAP_NV, cl_bool)
1595 #endif
1596 #ifdef CL_DEVICE_KERNEL_EXEC_TIMEOUT_NV
1597 __CL_DECLARE_PARAM_TRAITS(cl_device_info, CL_DEVICE_KERNEL_EXEC_TIMEOUT_NV, cl_bool)
1598 #endif
1599 #ifdef CL_DEVICE_INTEGRATED_MEMORY_NV
1600 __CL_DECLARE_PARAM_TRAITS(cl_device_info, CL_DEVICE_INTEGRATED_MEMORY_NV, cl_bool)
1601 #endif
1602 
1603 // Convenience functions
1604 
1605 template <typename Func, typename T>
1606 inline cl_int
1607 getInfo(Func f, cl_uint name, T* param)
1608 {
1609     return getInfoHelper(f, name, param, 0);
1610 }
1611 
1612 template <typename Func, typename Arg0>
1613 struct GetInfoFunctor0
1614 {
1615     Func f_; const Arg0& arg0_;
operator ()cl::detail::GetInfoFunctor01616     cl_int operator ()(
1617         cl_uint param, ::size_t size, void* value, ::size_t* size_ret)
1618     { return f_(arg0_, param, size, value, size_ret); }
1619 };
1620 
1621 template <typename Func, typename Arg0, typename Arg1>
1622 struct GetInfoFunctor1
1623 {
1624     Func f_; const Arg0& arg0_; const Arg1& arg1_;
operator ()cl::detail::GetInfoFunctor11625     cl_int operator ()(
1626         cl_uint param, ::size_t size, void* value, ::size_t* size_ret)
1627     { return f_(arg0_, arg1_, param, size, value, size_ret); }
1628 };
1629 
1630 template <typename Func, typename Arg0, typename T>
1631 inline cl_int
getInfo(Func f,const Arg0 & arg0,cl_uint name,T * param)1632 getInfo(Func f, const Arg0& arg0, cl_uint name, T* param)
1633 {
1634     GetInfoFunctor0<Func, Arg0> f0 = { f, arg0 };
1635     return getInfoHelper(f0, name, param, 0);
1636 }
1637 
1638 template <typename Func, typename Arg0, typename Arg1, typename T>
1639 inline cl_int
getInfo(Func f,const Arg0 & arg0,const Arg1 & arg1,cl_uint name,T * param)1640 getInfo(Func f, const Arg0& arg0, const Arg1& arg1, cl_uint name, T* param)
1641 {
1642     GetInfoFunctor1<Func, Arg0, Arg1> f0 = { f, arg0, arg1 };
1643     return getInfoHelper(f0, name, param, 0);
1644 }
1645 
1646 template<typename T>
1647 struct ReferenceHandler
1648 { };
1649 
1650 #if defined(CL_VERSION_1_2)
1651 /**
1652  * OpenCL 1.2 devices do have retain/release.
1653  */
1654 template <>
1655 struct ReferenceHandler<cl_device_id>
1656 {
1657     /**
1658      * Retain the device.
1659      * \param device A valid device created using createSubDevices
1660      * \return
1661      *   CL_SUCCESS if the function executed successfully.
1662      *   CL_INVALID_DEVICE if device was not a valid subdevice
1663      *   CL_OUT_OF_RESOURCES
1664      *   CL_OUT_OF_HOST_MEMORY
1665      */
retaincl::detail::ReferenceHandler1666     static cl_int retain(cl_device_id device)
1667     { return ::clRetainDevice(device); }
1668     /**
1669      * Retain the device.
1670      * \param device A valid device created using createSubDevices
1671      * \return
1672      *   CL_SUCCESS if the function executed successfully.
1673      *   CL_INVALID_DEVICE if device was not a valid subdevice
1674      *   CL_OUT_OF_RESOURCES
1675      *   CL_OUT_OF_HOST_MEMORY
1676      */
releasecl::detail::ReferenceHandler1677     static cl_int release(cl_device_id device)
1678     { return ::clReleaseDevice(device); }
1679 };
1680 #else // #if defined(CL_VERSION_1_2)
1681 /**
1682  * OpenCL 1.1 devices do not have retain/release.
1683  */
1684 template <>
1685 struct ReferenceHandler<cl_device_id>
1686 {
1687     // cl_device_id does not have retain().
retaincl::detail::ReferenceHandler1688     static cl_int retain(cl_device_id)
1689     { return CL_SUCCESS; }
1690     // cl_device_id does not have release().
releasecl::detail::ReferenceHandler1691     static cl_int release(cl_device_id)
1692     { return CL_SUCCESS; }
1693 };
1694 #endif // #if defined(CL_VERSION_1_2)
1695 
1696 template <>
1697 struct ReferenceHandler<cl_platform_id>
1698 {
1699     // cl_platform_id does not have retain().
retaincl::detail::ReferenceHandler1700     static cl_int retain(cl_platform_id)
1701     { return CL_SUCCESS; }
1702     // cl_platform_id does not have release().
releasecl::detail::ReferenceHandler1703     static cl_int release(cl_platform_id)
1704     { return CL_SUCCESS; }
1705 };
1706 
1707 template <>
1708 struct ReferenceHandler<cl_context>
1709 {
retaincl::detail::ReferenceHandler1710     static cl_int retain(cl_context context)
1711     { return ::clRetainContext(context); }
releasecl::detail::ReferenceHandler1712     static cl_int release(cl_context context)
1713     { return ::clReleaseContext(context); }
1714 };
1715 
1716 template <>
1717 struct ReferenceHandler<cl_command_queue>
1718 {
retaincl::detail::ReferenceHandler1719     static cl_int retain(cl_command_queue queue)
1720     { return ::clRetainCommandQueue(queue); }
releasecl::detail::ReferenceHandler1721     static cl_int release(cl_command_queue queue)
1722     { return ::clReleaseCommandQueue(queue); }
1723 };
1724 
1725 template <>
1726 struct ReferenceHandler<cl_mem>
1727 {
retaincl::detail::ReferenceHandler1728     static cl_int retain(cl_mem memory)
1729     { return ::clRetainMemObject(memory); }
releasecl::detail::ReferenceHandler1730     static cl_int release(cl_mem memory)
1731     { return ::clReleaseMemObject(memory); }
1732 };
1733 
1734 template <>
1735 struct ReferenceHandler<cl_sampler>
1736 {
retaincl::detail::ReferenceHandler1737     static cl_int retain(cl_sampler sampler)
1738     { return ::clRetainSampler(sampler); }
releasecl::detail::ReferenceHandler1739     static cl_int release(cl_sampler sampler)
1740     { return ::clReleaseSampler(sampler); }
1741 };
1742 
1743 template <>
1744 struct ReferenceHandler<cl_program>
1745 {
retaincl::detail::ReferenceHandler1746     static cl_int retain(cl_program program)
1747     { return ::clRetainProgram(program); }
releasecl::detail::ReferenceHandler1748     static cl_int release(cl_program program)
1749     { return ::clReleaseProgram(program); }
1750 };
1751 
1752 template <>
1753 struct ReferenceHandler<cl_kernel>
1754 {
retaincl::detail::ReferenceHandler1755     static cl_int retain(cl_kernel kernel)
1756     { return ::clRetainKernel(kernel); }
releasecl::detail::ReferenceHandler1757     static cl_int release(cl_kernel kernel)
1758     { return ::clReleaseKernel(kernel); }
1759 };
1760 
1761 template <>
1762 struct ReferenceHandler<cl_event>
1763 {
retaincl::detail::ReferenceHandler1764     static cl_int retain(cl_event event)
1765     { return ::clRetainEvent(event); }
releasecl::detail::ReferenceHandler1766     static cl_int release(cl_event event)
1767     { return ::clReleaseEvent(event); }
1768 };
1769 
1770 
1771 // Extracts version number with major in the upper 16 bits, minor in the lower 16
getVersion(const char * versionInfo)1772 static cl_uint getVersion(const char *versionInfo)
1773 {
1774     int highVersion = 0;
1775     int lowVersion = 0;
1776     int index = 7;
1777     while(versionInfo[index] != '.' ) {
1778         highVersion *= 10;
1779         highVersion += versionInfo[index]-'0';
1780         ++index;
1781     }
1782     ++index;
1783     while(versionInfo[index] != ' ' &&  versionInfo[index] != '\0') {
1784         lowVersion *= 10;
1785         lowVersion += versionInfo[index]-'0';
1786         ++index;
1787     }
1788     return (highVersion << 16) | lowVersion;
1789 }
1790 
getPlatformVersion(cl_platform_id platform)1791 static cl_uint getPlatformVersion(cl_platform_id platform)
1792 {
1793     ::size_t size = 0;
1794     clGetPlatformInfo(platform, CL_PLATFORM_VERSION, 0, NULL, &size);
1795     char *versionInfo = (char *) alloca(size);
1796     clGetPlatformInfo(platform, CL_PLATFORM_VERSION, size, &versionInfo[0], &size);
1797     return getVersion(versionInfo);
1798 }
1799 
getDevicePlatformVersion(cl_device_id device)1800 static cl_uint getDevicePlatformVersion(cl_device_id device)
1801 {
1802     cl_platform_id platform;
1803     clGetDeviceInfo(device, CL_DEVICE_PLATFORM, sizeof(platform), &platform, NULL);
1804     return getPlatformVersion(platform);
1805 }
1806 
1807 #if defined(CL_VERSION_1_2) && defined(CL_USE_DEPRECATED_OPENCL_1_1_APIS)
getContextPlatformVersion(cl_context context)1808 static cl_uint getContextPlatformVersion(cl_context context)
1809 {
1810     // The platform cannot be queried directly, so we first have to grab a
1811     // device and obtain its context
1812     ::size_t size = 0;
1813     clGetContextInfo(context, CL_CONTEXT_DEVICES, 0, NULL, &size);
1814     if (size == 0)
1815         return 0;
1816     cl_device_id *devices = (cl_device_id *) alloca(size);
1817     clGetContextInfo(context, CL_CONTEXT_DEVICES, size, devices, NULL);
1818     return getDevicePlatformVersion(devices[0]);
1819 }
1820 #endif // #if defined(CL_VERSION_1_2) && defined(CL_USE_DEPRECATED_OPENCL_1_1_APIS)
1821 
1822 template <typename T>
1823 class Wrapper
1824 {
1825 public:
1826     typedef T cl_type;
1827 
1828 protected:
1829     cl_type object_;
1830 
1831 public:
Wrapper()1832     Wrapper() : object_(NULL) { }
1833 
Wrapper(const cl_type & obj)1834     Wrapper(const cl_type &obj) : object_(obj) { }
1835 
~Wrapper()1836     ~Wrapper()
1837     {
1838         if (object_ != NULL) { release(); }
1839     }
1840 
Wrapper(const Wrapper<cl_type> & rhs)1841     Wrapper(const Wrapper<cl_type>& rhs)
1842     {
1843         object_ = rhs.object_;
1844         if (object_ != NULL) { detail::errHandler(retain(), __RETAIN_ERR); }
1845     }
1846 
1847 #if defined(CL_HPP_RVALUE_REFERENCES_SUPPORTED)
Wrapper(Wrapper<cl_type> && rhs)1848     Wrapper(Wrapper<cl_type>&& rhs) CL_HPP_NOEXCEPT
1849     {
1850         object_ = rhs.object_;
1851         rhs.object_ = NULL;
1852     }
1853 #endif
1854 
operator =(const Wrapper<cl_type> & rhs)1855     Wrapper<cl_type>& operator = (const Wrapper<cl_type>& rhs)
1856     {
1857         if (this != &rhs) {
1858             if (object_ != NULL) { detail::errHandler(release(), __RELEASE_ERR); }
1859             object_ = rhs.object_;
1860             if (object_ != NULL) { detail::errHandler(retain(), __RETAIN_ERR); }
1861         }
1862         return *this;
1863     }
1864 
1865 #if defined(CL_HPP_RVALUE_REFERENCES_SUPPORTED)
operator =(Wrapper<cl_type> && rhs)1866     Wrapper<cl_type>& operator = (Wrapper<cl_type>&& rhs)
1867     {
1868         if (this != &rhs) {
1869             if (object_ != NULL) { detail::errHandler(release(), __RELEASE_ERR); }
1870             object_ = rhs.object_;
1871             rhs.object_ = NULL;
1872         }
1873         return *this;
1874     }
1875 #endif
1876 
operator =(const cl_type & rhs)1877     Wrapper<cl_type>& operator = (const cl_type &rhs)
1878     {
1879         if (object_ != NULL) { detail::errHandler(release(), __RELEASE_ERR); }
1880         object_ = rhs;
1881         return *this;
1882     }
1883 
operator ()() const1884     cl_type operator ()() const { return object_; }
1885 
operator ()()1886     cl_type& operator ()() { return object_; }
1887 
1888 protected:
1889     template<typename Func, typename U>
1890     friend inline cl_int getInfoHelper(Func, cl_uint, U*, int, typename U::cl_type);
1891 
retain() const1892     cl_int retain() const
1893     {
1894         return ReferenceHandler<cl_type>::retain(object_);
1895     }
1896 
release() const1897     cl_int release() const
1898     {
1899         return ReferenceHandler<cl_type>::release(object_);
1900     }
1901 };
1902 
1903 template <>
1904 class Wrapper<cl_device_id>
1905 {
1906 public:
1907     typedef cl_device_id cl_type;
1908 
1909 protected:
1910     cl_type object_;
1911     bool referenceCountable_;
1912 
isReferenceCountable(cl_device_id device)1913     static bool isReferenceCountable(cl_device_id device)
1914     {
1915         bool retVal = false;
1916         if (device != NULL) {
1917             int version = getDevicePlatformVersion(device);
1918             if(version > ((1 << 16) + 1)) {
1919                 retVal = true;
1920             }
1921         }
1922         return retVal;
1923     }
1924 
1925 public:
Wrapper()1926     Wrapper() : object_(NULL), referenceCountable_(false)
1927     {
1928     }
1929 
Wrapper(const cl_type & obj)1930     Wrapper(const cl_type &obj) : object_(obj), referenceCountable_(false)
1931     {
1932         referenceCountable_ = isReferenceCountable(obj);
1933     }
1934 
~Wrapper()1935     ~Wrapper()
1936     {
1937         if (object_ != NULL) { release(); }
1938     }
1939 
Wrapper(const Wrapper<cl_type> & rhs)1940     Wrapper(const Wrapper<cl_type>& rhs)
1941     {
1942         object_ = rhs.object_;
1943         referenceCountable_ = isReferenceCountable(object_);
1944         if (object_ != NULL) { detail::errHandler(retain(), __RETAIN_ERR); }
1945     }
1946 
1947 #if defined(CL_HPP_RVALUE_REFERENCES_SUPPORTED)
Wrapper(Wrapper<cl_type> && rhs)1948     Wrapper(Wrapper<cl_type>&& rhs) CL_HPP_NOEXCEPT
1949     {
1950         object_ = rhs.object_;
1951         referenceCountable_ = rhs.referenceCountable_;
1952         rhs.object_ = NULL;
1953         rhs.referenceCountable_ = false;
1954     }
1955 #endif
1956 
operator =(const Wrapper<cl_type> & rhs)1957     Wrapper<cl_type>& operator = (const Wrapper<cl_type>& rhs)
1958     {
1959         if (this != &rhs) {
1960             if (object_ != NULL) { detail::errHandler(release(), __RELEASE_ERR); }
1961             object_ = rhs.object_;
1962             referenceCountable_ = rhs.referenceCountable_;
1963             if (object_ != NULL) { detail::errHandler(retain(), __RETAIN_ERR); }
1964         }
1965         return *this;
1966     }
1967 
1968 #if defined(CL_HPP_RVALUE_REFERENCES_SUPPORTED)
operator =(Wrapper<cl_type> && rhs)1969     Wrapper<cl_type>& operator = (Wrapper<cl_type>&& rhs)
1970     {
1971         if (this != &rhs) {
1972             if (object_ != NULL) { detail::errHandler(release(), __RELEASE_ERR); }
1973             object_ = rhs.object_;
1974             referenceCountable_ = rhs.referenceCountable_;
1975             rhs.object_ = NULL;
1976             rhs.referenceCountable_ = false;
1977         }
1978         return *this;
1979     }
1980 #endif
1981 
operator =(const cl_type & rhs)1982     Wrapper<cl_type>& operator = (const cl_type &rhs)
1983     {
1984         if (object_ != NULL) { detail::errHandler(release(), __RELEASE_ERR); }
1985         object_ = rhs;
1986         referenceCountable_ = isReferenceCountable(object_);
1987         return *this;
1988     }
1989 
operator ()() const1990     cl_type operator ()() const { return object_; }
1991 
operator ()()1992     cl_type& operator ()() { return object_; }
1993 
1994 protected:
1995     template<typename Func, typename U>
1996     friend inline cl_int getInfoHelper(Func, cl_uint, U*, int, typename U::cl_type);
1997 
1998     template<typename Func, typename U>
1999     friend inline cl_int getInfoHelper(Func, cl_uint, VECTOR_CLASS<U>*, int, typename U::cl_type);
2000 
retain() const2001     cl_int retain() const
2002     {
2003         if( referenceCountable_ ) {
2004             return ReferenceHandler<cl_type>::retain(object_);
2005         }
2006         else {
2007             return CL_SUCCESS;
2008         }
2009     }
2010 
release() const2011     cl_int release() const
2012     {
2013         if( referenceCountable_ ) {
2014             return ReferenceHandler<cl_type>::release(object_);
2015         }
2016         else {
2017             return CL_SUCCESS;
2018         }
2019     }
2020 };
2021 
2022 } // namespace detail
2023 //! \endcond
2024 
2025 /*! \stuct ImageFormat
2026  *  \brief Adds constructors and member functions for cl_image_format.
2027  *
2028  *  \see cl_image_format
2029  */
2030 struct ImageFormat : public cl_image_format
2031 {
2032     //! \brief Default constructor - performs no initialization.
ImageFormatcl::ImageFormat2033     ImageFormat(){}
2034 
2035     //! \brief Initializing constructor.
ImageFormatcl::ImageFormat2036     ImageFormat(cl_channel_order order, cl_channel_type type)
2037     {
2038         image_channel_order = order;
2039         image_channel_data_type = type;
2040     }
2041 
2042     //! \brief Assignment operator.
operator =cl::ImageFormat2043     ImageFormat& operator = (const ImageFormat& rhs)
2044     {
2045         if (this != &rhs) {
2046             this->image_channel_data_type = rhs.image_channel_data_type;
2047             this->image_channel_order     = rhs.image_channel_order;
2048         }
2049         return *this;
2050     }
2051 };
2052 
2053 /*! \brief Class interface for cl_device_id.
2054  *
2055  *  \note Copies of these objects are inexpensive, since they don't 'own'
2056  *        any underlying resources or data structures.
2057  *
2058  *  \see cl_device_id
2059  */
2060 class Device : public detail::Wrapper<cl_device_id>
2061 {
2062 public:
2063     //! \brief Default constructor - initializes to NULL.
Device()2064     Device() : detail::Wrapper<cl_type>() { }
2065 
2066     /*! \brief Constructor from cl_device_id.
2067      *
2068      *  This simply copies the device ID value, which is an inexpensive operation.
2069      */
Device(const cl_device_id & device)2070     __CL_EXPLICIT_CONSTRUCTORS Device(const cl_device_id &device) : detail::Wrapper<cl_type>(device) { }
2071 
2072     /*! \brief Returns the first device on the default context.
2073      *
2074      *  \see Context::getDefault()
2075      */
2076     static Device getDefault(cl_int * err = NULL);
2077 
2078     /*! \brief Assignment operator from cl_device_id.
2079      *
2080      *  This simply copies the device ID value, which is an inexpensive operation.
2081      */
operator =(const cl_device_id & rhs)2082     Device& operator = (const cl_device_id& rhs)
2083     {
2084         detail::Wrapper<cl_type>::operator=(rhs);
2085         return *this;
2086     }
2087 
2088     /*! \brief Copy constructor to forward copy to the superclass correctly.
2089      * Required for MSVC.
2090      */
Device(const Device & dev)2091     Device(const Device& dev) : detail::Wrapper<cl_type>(dev) {}
2092 
2093     /*! \brief Copy assignment to forward copy to the superclass correctly.
2094      * Required for MSVC.
2095      */
operator =(const Device & dev)2096     Device& operator = (const Device &dev)
2097     {
2098         detail::Wrapper<cl_type>::operator=(dev);
2099         return *this;
2100     }
2101 
2102 #if defined(CL_HPP_RVALUE_REFERENCES_SUPPORTED)
2103     /*! \brief Move constructor to forward move to the superclass correctly.
2104      * Required for MSVC.
2105      */
Device(Device && dev)2106     Device(Device&& dev) CL_HPP_NOEXCEPT : detail::Wrapper<cl_type>(std::move(dev)) {}
2107 
2108     /*! \brief Move assignment to forward move to the superclass correctly.
2109      * Required for MSVC.
2110      */
operator =(Device && dev)2111     Device& operator = (Device &&dev)
2112     {
2113         detail::Wrapper<cl_type>::operator=(std::move(dev));
2114         return *this;
2115     }
2116 #endif // #if defined(CL_HPP_RVALUE_REFERENCES_SUPPORTED)
2117 
2118     //! \brief Wrapper for clGetDeviceInfo().
2119     template <typename T>
getInfo(cl_device_info name,T * param) const2120     cl_int getInfo(cl_device_info name, T* param) const
2121     {
2122         return detail::errHandler(
2123             detail::getInfo(&::clGetDeviceInfo, object_, name, param),
2124             __GET_DEVICE_INFO_ERR);
2125     }
2126 
2127     //! \brief Wrapper for clGetDeviceInfo() that returns by value.
2128     template <cl_int name> typename
2129     detail::param_traits<detail::cl_device_info, name>::param_type
getInfo(cl_int * err=NULL) const2130     getInfo(cl_int* err = NULL) const
2131     {
2132         typename detail::param_traits<
2133             detail::cl_device_info, name>::param_type param;
2134         cl_int result = getInfo(name, &param);
2135         if (err != NULL) {
2136             *err = result;
2137         }
2138         return param;
2139     }
2140 
2141     /**
2142      * CL 1.2 version
2143      */
2144 #if defined(CL_VERSION_1_2)
2145     //! \brief Wrapper for clCreateSubDevicesEXT().
createSubDevices(const cl_device_partition_property * properties,VECTOR_CLASS<Device> * devices)2146     cl_int createSubDevices(
2147         const cl_device_partition_property * properties,
2148         VECTOR_CLASS<Device>* devices)
2149     {
2150         cl_uint n = 0;
2151         cl_int err = clCreateSubDevices(object_, properties, 0, NULL, &n);
2152         if (err != CL_SUCCESS) {
2153             return detail::errHandler(err, __CREATE_SUB_DEVICES);
2154         }
2155 
2156         cl_device_id* ids = (cl_device_id*) alloca(n * sizeof(cl_device_id));
2157         err = clCreateSubDevices(object_, properties, n, ids, NULL);
2158         if (err != CL_SUCCESS) {
2159             return detail::errHandler(err, __CREATE_SUB_DEVICES);
2160         }
2161 
2162         devices->assign(&ids[0], &ids[n]);
2163         return CL_SUCCESS;
2164     }
2165 #endif // #if defined(CL_VERSION_1_2)
2166 
2167 /**
2168  * CL 1.1 version that uses device fission.
2169  */
2170 #if defined(CL_VERSION_1_1)
2171 #if defined(USE_CL_DEVICE_FISSION)
createSubDevices(const cl_device_partition_property_ext * properties,VECTOR_CLASS<Device> * devices)2172     cl_int createSubDevices(
2173         const cl_device_partition_property_ext * properties,
2174         VECTOR_CLASS<Device>* devices)
2175     {
2176         typedef CL_API_ENTRY cl_int
2177             ( CL_API_CALL * PFN_clCreateSubDevicesEXT)(
2178                 cl_device_id /*in_device*/,
2179                 const cl_device_partition_property_ext * /* properties */,
2180                 cl_uint /*num_entries*/,
2181                 cl_device_id * /*out_devices*/,
2182                 cl_uint * /*num_devices*/ ) CL_EXT_SUFFIX__VERSION_1_1;
2183 
2184         static PFN_clCreateSubDevicesEXT pfn_clCreateSubDevicesEXT = NULL;
2185         __INIT_CL_EXT_FCN_PTR(clCreateSubDevicesEXT);
2186 
2187         cl_uint n = 0;
2188         cl_int err = pfn_clCreateSubDevicesEXT(object_, properties, 0, NULL, &n);
2189         if (err != CL_SUCCESS) {
2190             return detail::errHandler(err, __CREATE_SUB_DEVICES);
2191         }
2192 
2193         cl_device_id* ids = (cl_device_id*) alloca(n * sizeof(cl_device_id));
2194         err = pfn_clCreateSubDevicesEXT(object_, properties, n, ids, NULL);
2195         if (err != CL_SUCCESS) {
2196             return detail::errHandler(err, __CREATE_SUB_DEVICES);
2197         }
2198 
2199         devices->assign(&ids[0], &ids[n]);
2200         return CL_SUCCESS;
2201     }
2202 #endif // #if defined(USE_CL_DEVICE_FISSION)
2203 #endif // #if defined(CL_VERSION_1_1)
2204 };
2205 
2206 /*! \brief Class interface for cl_platform_id.
2207  *
2208  *  \note Copies of these objects are inexpensive, since they don't 'own'
2209  *        any underlying resources or data structures.
2210  *
2211  *  \see cl_platform_id
2212  */
2213 class Platform : public detail::Wrapper<cl_platform_id>
2214 {
2215 public:
2216     //! \brief Default constructor - initializes to NULL.
Platform()2217     Platform() : detail::Wrapper<cl_type>()  { }
2218 
2219     /*! \brief Constructor from cl_platform_id.
2220      *
2221      *  This simply copies the platform ID value, which is an inexpensive operation.
2222      */
Platform(const cl_platform_id & platform)2223     __CL_EXPLICIT_CONSTRUCTORS Platform(const cl_platform_id &platform) : detail::Wrapper<cl_type>(platform) { }
2224 
2225     /*! \brief Assignment operator from cl_platform_id.
2226      *
2227      *  This simply copies the platform ID value, which is an inexpensive operation.
2228      */
operator =(const cl_platform_id & rhs)2229     Platform& operator = (const cl_platform_id& rhs)
2230     {
2231         detail::Wrapper<cl_type>::operator=(rhs);
2232         return *this;
2233     }
2234 
2235     //! \brief Wrapper for clGetPlatformInfo().
getInfo(cl_platform_info name,STRING_CLASS * param) const2236     cl_int getInfo(cl_platform_info name, STRING_CLASS* param) const
2237     {
2238         return detail::errHandler(
2239             detail::getInfo(&::clGetPlatformInfo, object_, name, param),
2240             __GET_PLATFORM_INFO_ERR);
2241     }
2242 
2243     //! \brief Wrapper for clGetPlatformInfo() that returns by value.
2244     template <cl_int name> typename
2245     detail::param_traits<detail::cl_platform_info, name>::param_type
getInfo(cl_int * err=NULL) const2246     getInfo(cl_int* err = NULL) const
2247     {
2248         typename detail::param_traits<
2249             detail::cl_platform_info, name>::param_type param;
2250         cl_int result = getInfo(name, &param);
2251         if (err != NULL) {
2252             *err = result;
2253         }
2254         return param;
2255     }
2256 
2257     /*! \brief Gets a list of devices for this platform.
2258      *
2259      *  Wraps clGetDeviceIDs().
2260      */
getDevices(cl_device_type type,VECTOR_CLASS<Device> * devices) const2261     cl_int getDevices(
2262         cl_device_type type,
2263         VECTOR_CLASS<Device>* devices) const
2264     {
2265         cl_uint n = 0;
2266         if( devices == NULL ) {
2267             return detail::errHandler(CL_INVALID_ARG_VALUE, __GET_DEVICE_IDS_ERR);
2268         }
2269         cl_int err = ::clGetDeviceIDs(object_, type, 0, NULL, &n);
2270         if (err != CL_SUCCESS) {
2271             return detail::errHandler(err, __GET_DEVICE_IDS_ERR);
2272         }
2273 
2274         cl_device_id* ids = (cl_device_id*) alloca(n * sizeof(cl_device_id));
2275         err = ::clGetDeviceIDs(object_, type, n, ids, NULL);
2276         if (err != CL_SUCCESS) {
2277             return detail::errHandler(err, __GET_DEVICE_IDS_ERR);
2278         }
2279 
2280         devices->assign(&ids[0], &ids[n]);
2281         return CL_SUCCESS;
2282     }
2283 
2284 #if defined(USE_DX_INTEROP)
2285    /*! \brief Get the list of available D3D10 devices.
2286      *
2287      *  \param d3d_device_source.
2288      *
2289      *  \param d3d_object.
2290      *
2291      *  \param d3d_device_set.
2292      *
2293      *  \param devices returns a vector of OpenCL D3D10 devices found. The cl::Device
2294      *  values returned in devices can be used to identify a specific OpenCL
2295      *  device. If \a devices argument is NULL, this argument is ignored.
2296      *
2297      *  \return One of the following values:
2298      *    - CL_SUCCESS if the function is executed successfully.
2299      *
2300      *  The application can query specific capabilities of the OpenCL device(s)
2301      *  returned by cl::getDevices. This can be used by the application to
2302      *  determine which device(s) to use.
2303      *
2304      * \note In the case that exceptions are enabled and a return value
2305      * other than CL_SUCCESS is generated, then cl::Error exception is
2306      * generated.
2307      */
getDevices(cl_d3d10_device_source_khr d3d_device_source,void * d3d_object,cl_d3d10_device_set_khr d3d_device_set,VECTOR_CLASS<Device> * devices) const2308     cl_int getDevices(
2309         cl_d3d10_device_source_khr d3d_device_source,
2310         void *                     d3d_object,
2311         cl_d3d10_device_set_khr    d3d_device_set,
2312         VECTOR_CLASS<Device>* devices) const
2313     {
2314         typedef CL_API_ENTRY cl_int (CL_API_CALL *PFN_clGetDeviceIDsFromD3D10KHR)(
2315             cl_platform_id platform,
2316             cl_d3d10_device_source_khr d3d_device_source,
2317             void * d3d_object,
2318             cl_d3d10_device_set_khr d3d_device_set,
2319             cl_uint num_entries,
2320             cl_device_id * devices,
2321             cl_uint* num_devices);
2322 
2323         if( devices == NULL ) {
2324             return detail::errHandler(CL_INVALID_ARG_VALUE, __GET_DEVICE_IDS_ERR);
2325         }
2326 
2327         static PFN_clGetDeviceIDsFromD3D10KHR pfn_clGetDeviceIDsFromD3D10KHR = NULL;
2328         __INIT_CL_EXT_FCN_PTR_PLATFORM(object_, clGetDeviceIDsFromD3D10KHR);
2329 
2330         cl_uint n = 0;
2331         cl_int err = pfn_clGetDeviceIDsFromD3D10KHR(
2332             object_,
2333             d3d_device_source,
2334             d3d_object,
2335             d3d_device_set,
2336             0,
2337             NULL,
2338             &n);
2339         if (err != CL_SUCCESS) {
2340             return detail::errHandler(err, __GET_DEVICE_IDS_ERR);
2341         }
2342 
2343         cl_device_id* ids = (cl_device_id*) alloca(n * sizeof(cl_device_id));
2344         err = pfn_clGetDeviceIDsFromD3D10KHR(
2345             object_,
2346             d3d_device_source,
2347             d3d_object,
2348             d3d_device_set,
2349             n,
2350             ids,
2351             NULL);
2352         if (err != CL_SUCCESS) {
2353             return detail::errHandler(err, __GET_DEVICE_IDS_ERR);
2354         }
2355 
2356         devices->assign(&ids[0], &ids[n]);
2357         return CL_SUCCESS;
2358     }
2359 #endif
2360 
2361     /*! \brief Gets a list of available platforms.
2362      *
2363      *  Wraps clGetPlatformIDs().
2364      */
get(VECTOR_CLASS<Platform> * platforms)2365     static cl_int get(
2366         VECTOR_CLASS<Platform>* platforms)
2367     {
2368         cl_uint n = 0;
2369 
2370         if( platforms == NULL ) {
2371             return detail::errHandler(CL_INVALID_ARG_VALUE, __GET_PLATFORM_IDS_ERR);
2372         }
2373 
2374         cl_int err = ::clGetPlatformIDs(0, NULL, &n);
2375         if (err != CL_SUCCESS) {
2376             return detail::errHandler(err, __GET_PLATFORM_IDS_ERR);
2377         }
2378 
2379         cl_platform_id* ids = (cl_platform_id*) alloca(
2380             n * sizeof(cl_platform_id));
2381         err = ::clGetPlatformIDs(n, ids, NULL);
2382         if (err != CL_SUCCESS) {
2383             return detail::errHandler(err, __GET_PLATFORM_IDS_ERR);
2384         }
2385 
2386         platforms->assign(&ids[0], &ids[n]);
2387         return CL_SUCCESS;
2388     }
2389 
2390     /*! \brief Gets the first available platform.
2391      *
2392      *  Wraps clGetPlatformIDs(), returning the first result.
2393      */
get(Platform * platform)2394     static cl_int get(
2395         Platform * platform)
2396     {
2397         cl_uint n = 0;
2398 
2399         if( platform == NULL ) {
2400             return detail::errHandler(CL_INVALID_ARG_VALUE, __GET_PLATFORM_IDS_ERR);
2401         }
2402 
2403         cl_int err = ::clGetPlatformIDs(0, NULL, &n);
2404         if (err != CL_SUCCESS) {
2405             return detail::errHandler(err, __GET_PLATFORM_IDS_ERR);
2406         }
2407 
2408         cl_platform_id* ids = (cl_platform_id*) alloca(
2409             n * sizeof(cl_platform_id));
2410         err = ::clGetPlatformIDs(n, ids, NULL);
2411         if (err != CL_SUCCESS) {
2412             return detail::errHandler(err, __GET_PLATFORM_IDS_ERR);
2413         }
2414 
2415         *platform = ids[0];
2416         return CL_SUCCESS;
2417     }
2418 
2419     /*! \brief Gets the first available platform, returning it by value.
2420      *
2421      *  Wraps clGetPlatformIDs(), returning the first result.
2422      */
get(cl_int * errResult=NULL)2423     static Platform get(
2424         cl_int * errResult = NULL)
2425     {
2426         Platform platform;
2427         cl_uint n = 0;
2428         cl_int err = ::clGetPlatformIDs(0, NULL, &n);
2429         if (err != CL_SUCCESS) {
2430             detail::errHandler(err, __GET_PLATFORM_IDS_ERR);
2431             if (errResult != NULL) {
2432                 *errResult = err;
2433             }
2434             return Platform();
2435         }
2436 
2437         cl_platform_id* ids = (cl_platform_id*) alloca(
2438             n * sizeof(cl_platform_id));
2439         err = ::clGetPlatformIDs(n, ids, NULL);
2440 
2441         if (err != CL_SUCCESS) {
2442             detail::errHandler(err, __GET_PLATFORM_IDS_ERR);
2443             if (errResult != NULL) {
2444                 *errResult = err;
2445             }
2446             return Platform();
2447         }
2448 
2449 
2450         return Platform(ids[0]);
2451     }
2452 
getDefault(cl_int * errResult=NULL)2453     static Platform getDefault(
2454         cl_int *errResult = NULL )
2455     {
2456         return get(errResult);
2457     }
2458 
2459 
2460 #if defined(CL_VERSION_1_2)
2461     //! \brief Wrapper for clUnloadCompiler().
2462     cl_int
unloadCompiler()2463     unloadCompiler()
2464     {
2465         return ::clUnloadPlatformCompiler(object_);
2466     }
2467 #endif // #if defined(CL_VERSION_1_2)
2468 }; // class Platform
2469 
2470 /**
2471  * Deprecated APIs for 1.2
2472  */
2473 #if defined(CL_USE_DEPRECATED_OPENCL_1_1_APIS) || (defined(CL_VERSION_1_1) && !defined(CL_VERSION_1_2))
2474 /**
2475  * Unload the OpenCL compiler.
2476  * \note Deprecated for OpenCL 1.2. Use Platform::unloadCompiler instead.
2477  */
2478 inline CL_EXT_PREFIX__VERSION_1_1_DEPRECATED cl_int
2479 UnloadCompiler() CL_EXT_SUFFIX__VERSION_1_1_DEPRECATED;
2480 inline cl_int
UnloadCompiler()2481 UnloadCompiler()
2482 {
2483     return ::clUnloadCompiler();
2484 }
2485 #endif // #if defined(CL_VERSION_1_1)
2486 
2487 /*! \brief Class interface for cl_context.
2488  *
2489  *  \note Copies of these objects are shallow, meaning that the copy will refer
2490  *        to the same underlying cl_context as the original.  For details, see
2491  *        clRetainContext() and clReleaseContext().
2492  *
2493  *  \see cl_context
2494  */
2495 class Context
2496     : public detail::Wrapper<cl_context>
2497 {
2498 private:
2499 
2500 #ifdef CL_HPP_CPP11_ATOMICS_SUPPORTED
2501     static std::atomic<int> default_initialized_;
2502 #else // !CL_HPP_CPP11_ATOMICS_SUPPORTED
2503     static volatile int default_initialized_;
2504 #endif // !CL_HPP_CPP11_ATOMICS_SUPPORTED
2505     static Context default_;
2506     static volatile cl_int default_error_;
2507 public:
2508     /*! \brief Constructs a context including a list of specified devices.
2509      *
2510      *  Wraps clCreateContext().
2511      */
Context(const VECTOR_CLASS<Device> & devices,cl_context_properties * properties=NULL,void (CL_CALLBACK * notifyFptr)(const char *,const void *,::size_t,void *)=NULL,void * data=NULL,cl_int * err=NULL)2512     Context(
2513         const VECTOR_CLASS<Device>& devices,
2514         cl_context_properties* properties = NULL,
2515         void (CL_CALLBACK * notifyFptr)(
2516             const char *,
2517             const void *,
2518             ::size_t,
2519             void *) = NULL,
2520         void* data = NULL,
2521         cl_int* err = NULL)
2522     {
2523         cl_int error;
2524 
2525         ::size_t numDevices = devices.size();
2526         cl_device_id* deviceIDs = (cl_device_id*) alloca(numDevices * sizeof(cl_device_id));
2527         for( ::size_t deviceIndex = 0; deviceIndex < numDevices; ++deviceIndex ) {
2528             deviceIDs[deviceIndex] = (devices[deviceIndex])();
2529         }
2530 
2531         object_ = ::clCreateContext(
2532             properties, (cl_uint) numDevices,
2533             deviceIDs,
2534             notifyFptr, data, &error);
2535 
2536         detail::errHandler(error, __CREATE_CONTEXT_ERR);
2537         if (err != NULL) {
2538             *err = error;
2539         }
2540     }
2541 
Context(const Device & device,cl_context_properties * properties=NULL,void (CL_CALLBACK * notifyFptr)(const char *,const void *,::size_t,void *)=NULL,void * data=NULL,cl_int * err=NULL)2542     Context(
2543         const Device& device,
2544         cl_context_properties* properties = NULL,
2545         void (CL_CALLBACK * notifyFptr)(
2546             const char *,
2547             const void *,
2548             ::size_t,
2549             void *) = NULL,
2550         void* data = NULL,
2551         cl_int* err = NULL)
2552     {
2553         cl_int error;
2554 
2555         cl_device_id deviceID = device();
2556 
2557         object_ = ::clCreateContext(
2558             properties, 1,
2559             &deviceID,
2560             notifyFptr, data, &error);
2561 
2562         detail::errHandler(error, __CREATE_CONTEXT_ERR);
2563         if (err != NULL) {
2564             *err = error;
2565         }
2566     }
2567 
2568     /*! \brief Constructs a context including all or a subset of devices of a specified type.
2569      *
2570      *  Wraps clCreateContextFromType().
2571      */
Context(cl_device_type type,cl_context_properties * properties=NULL,void (CL_CALLBACK * notifyFptr)(const char *,const void *,::size_t,void *)=NULL,void * data=NULL,cl_int * err=NULL)2572     Context(
2573         cl_device_type type,
2574         cl_context_properties* properties = NULL,
2575         void (CL_CALLBACK * notifyFptr)(
2576             const char *,
2577             const void *,
2578             ::size_t,
2579             void *) = NULL,
2580         void* data = NULL,
2581         cl_int* err = NULL)
2582     {
2583         cl_int error;
2584 
2585 #if !defined(__APPLE__) && !defined(__MACOS)
2586         cl_context_properties prop[4] = {CL_CONTEXT_PLATFORM, 0, 0, 0 };
2587 
2588         if (properties == NULL) {
2589             // Get a valid platform ID as we cannot send in a blank one
2590             VECTOR_CLASS<Platform> platforms;
2591             error = Platform::get(&platforms);
2592             if (error != CL_SUCCESS) {
2593                 detail::errHandler(error, __CREATE_CONTEXT_FROM_TYPE_ERR);
2594                 if (err != NULL) {
2595                     *err = error;
2596                 }
2597                 return;
2598             }
2599 
2600             // Check the platforms we found for a device of our specified type
2601             cl_context_properties platform_id = 0;
2602             for (unsigned int i = 0; i < platforms.size(); i++) {
2603 
2604                 VECTOR_CLASS<Device> devices;
2605 
2606 #if defined(__CL_ENABLE_EXCEPTIONS)
2607                 try {
2608 #endif
2609 
2610                     error = platforms[i].getDevices(type, &devices);
2611 
2612 #if defined(__CL_ENABLE_EXCEPTIONS)
2613                 } catch (Error &) {}
2614     // Catch if exceptions are enabled as we don't want to exit if first platform has no devices of type
2615     // We do error checking next anyway, and can throw there if needed
2616 #endif
2617 
2618                 // Only squash CL_SUCCESS and CL_DEVICE_NOT_FOUND
2619                 if (error != CL_SUCCESS && error != CL_DEVICE_NOT_FOUND) {
2620                     detail::errHandler(error, __CREATE_CONTEXT_FROM_TYPE_ERR);
2621                     if (err != NULL) {
2622                         *err = error;
2623                     }
2624                 }
2625 
2626                 if (devices.size() > 0) {
2627                     platform_id = (cl_context_properties)platforms[i]();
2628                     break;
2629                 }
2630             }
2631 
2632             if (platform_id == 0) {
2633                 detail::errHandler(CL_DEVICE_NOT_FOUND, __CREATE_CONTEXT_FROM_TYPE_ERR);
2634                 if (err != NULL) {
2635                     *err = CL_DEVICE_NOT_FOUND;
2636                 }
2637                 return;
2638             }
2639 
2640             prop[1] = platform_id;
2641             properties = &prop[0];
2642         }
2643 #endif
2644         object_ = ::clCreateContextFromType(
2645             properties, type, notifyFptr, data, &error);
2646 
2647         detail::errHandler(error, __CREATE_CONTEXT_FROM_TYPE_ERR);
2648         if (err != NULL) {
2649             *err = error;
2650         }
2651     }
2652 
2653     /*! \brief Copy constructor to forward copy to the superclass correctly.
2654      * Required for MSVC.
2655      */
Context(const Context & ctx)2656     Context(const Context& ctx) : detail::Wrapper<cl_type>(ctx) {}
2657 
2658     /*! \brief Copy assignment to forward copy to the superclass correctly.
2659      * Required for MSVC.
2660      */
operator =(const Context & ctx)2661     Context& operator = (const Context &ctx)
2662     {
2663         detail::Wrapper<cl_type>::operator=(ctx);
2664         return *this;
2665     }
2666 
2667 #if defined(CL_HPP_RVALUE_REFERENCES_SUPPORTED)
2668     /*! \brief Move constructor to forward move to the superclass correctly.
2669      * Required for MSVC.
2670      */
Context(Context && ctx)2671     Context(Context&& ctx) CL_HPP_NOEXCEPT : detail::Wrapper<cl_type>(std::move(ctx)) {}
2672 
2673     /*! \brief Move assignment to forward move to the superclass correctly.
2674      * Required for MSVC.
2675      */
operator =(Context && ctx)2676     Context& operator = (Context &&ctx)
2677     {
2678         detail::Wrapper<cl_type>::operator=(std::move(ctx));
2679         return *this;
2680     }
2681 #endif // #if defined(CL_HPP_RVALUE_REFERENCES_SUPPORTED)
2682 
2683     /*! \brief Returns a singleton context including all devices of CL_DEVICE_TYPE_DEFAULT.
2684      *
2685      *  \note All calls to this function return the same cl_context as the first.
2686      */
getDefault(cl_int * err=NULL)2687     static Context getDefault(cl_int * err = NULL)
2688     {
2689         int state = detail::compare_exchange(
2690             &default_initialized_,
2691             __DEFAULT_BEING_INITIALIZED, __DEFAULT_NOT_INITIALIZED);
2692 
2693         if (state & __DEFAULT_INITIALIZED) {
2694             if (err != NULL) {
2695                 *err = default_error_;
2696             }
2697             return default_;
2698         }
2699 
2700         if (state & __DEFAULT_BEING_INITIALIZED) {
2701               // Assume writes will propagate eventually...
2702               while(default_initialized_ != __DEFAULT_INITIALIZED) {
2703                   detail::fence();
2704               }
2705 
2706             if (err != NULL) {
2707                 *err = default_error_;
2708             }
2709             return default_;
2710         }
2711 
2712         cl_int error;
2713         default_ = Context(
2714             CL_DEVICE_TYPE_DEFAULT,
2715             NULL,
2716             NULL,
2717             NULL,
2718             &error);
2719 
2720         detail::fence();
2721 
2722         default_error_ = error;
2723         // Assume writes will propagate eventually...
2724         default_initialized_ = __DEFAULT_INITIALIZED;
2725 
2726         detail::fence();
2727 
2728         if (err != NULL) {
2729             *err = default_error_;
2730         }
2731         return default_;
2732 
2733     }
2734 
2735     //! \brief Default constructor - initializes to NULL.
Context()2736     Context() : detail::Wrapper<cl_type>() { }
2737 
2738     /*! \brief Constructor from cl_context - takes ownership.
2739      *
2740      *  This effectively transfers ownership of a refcount on the cl_context
2741      *  into the new Context object.
2742      */
Context(const cl_context & context)2743     __CL_EXPLICIT_CONSTRUCTORS Context(const cl_context& context) : detail::Wrapper<cl_type>(context) { }
2744 
2745     /*! \brief Assignment operator from cl_context - takes ownership.
2746      *
2747      *  This effectively transfers ownership of a refcount on the rhs and calls
2748      *  clReleaseContext() on the value previously held by this instance.
2749      */
operator =(const cl_context & rhs)2750     Context& operator = (const cl_context& rhs)
2751     {
2752         detail::Wrapper<cl_type>::operator=(rhs);
2753         return *this;
2754     }
2755 
2756     //! \brief Wrapper for clGetContextInfo().
2757     template <typename T>
getInfo(cl_context_info name,T * param) const2758     cl_int getInfo(cl_context_info name, T* param) const
2759     {
2760         return detail::errHandler(
2761             detail::getInfo(&::clGetContextInfo, object_, name, param),
2762             __GET_CONTEXT_INFO_ERR);
2763     }
2764 
2765     //! \brief Wrapper for clGetContextInfo() that returns by value.
2766     template <cl_int name> typename
2767     detail::param_traits<detail::cl_context_info, name>::param_type
getInfo(cl_int * err=NULL) const2768     getInfo(cl_int* err = NULL) const
2769     {
2770         typename detail::param_traits<
2771             detail::cl_context_info, name>::param_type param;
2772         cl_int result = getInfo(name, &param);
2773         if (err != NULL) {
2774             *err = result;
2775         }
2776         return param;
2777     }
2778 
2779     /*! \brief Gets a list of supported image formats.
2780      *
2781      *  Wraps clGetSupportedImageFormats().
2782      */
getSupportedImageFormats(cl_mem_flags flags,cl_mem_object_type type,VECTOR_CLASS<ImageFormat> * formats) const2783     cl_int getSupportedImageFormats(
2784         cl_mem_flags flags,
2785         cl_mem_object_type type,
2786         VECTOR_CLASS<ImageFormat>* formats) const
2787     {
2788         cl_uint numEntries;
2789 
2790         if (!formats) {
2791             return CL_SUCCESS;
2792         }
2793 
2794         cl_int err = ::clGetSupportedImageFormats(
2795             object_,
2796             flags,
2797             type,
2798             0,
2799             NULL,
2800             &numEntries);
2801         if (err != CL_SUCCESS) {
2802             return detail::errHandler(err, __GET_SUPPORTED_IMAGE_FORMATS_ERR);
2803         }
2804 
2805         if (numEntries > 0) {
2806             ImageFormat* value = (ImageFormat*)
2807                 alloca(numEntries * sizeof(ImageFormat));
2808             err = ::clGetSupportedImageFormats(
2809                 object_,
2810                 flags,
2811                 type,
2812                 numEntries,
2813                 (cl_image_format*)value,
2814                 NULL);
2815             if (err != CL_SUCCESS) {
2816                 return detail::errHandler(err, __GET_SUPPORTED_IMAGE_FORMATS_ERR);
2817             }
2818 
2819             formats->assign(&value[0], &value[numEntries]);
2820         }
2821         else {
2822             formats->clear();
2823         }
2824         return CL_SUCCESS;
2825     }
2826 };
2827 
getDefault(cl_int * err)2828 inline Device Device::getDefault(cl_int * err)
2829 {
2830     cl_int error;
2831     Device device;
2832 
2833     Context context = Context::getDefault(&error);
2834     detail::errHandler(error, __CREATE_CONTEXT_ERR);
2835 
2836     if (error != CL_SUCCESS) {
2837         if (err != NULL) {
2838             *err = error;
2839         }
2840     }
2841     else {
2842         device = context.getInfo<CL_CONTEXT_DEVICES>()[0];
2843         if (err != NULL) {
2844             *err = CL_SUCCESS;
2845         }
2846     }
2847 
2848     return device;
2849 }
2850 
2851 #ifdef CL_HPP_CPP11_ATOMICS_SUPPORTED
2852 CL_WEAK_ATTRIB_PREFIX std::atomic<int> CL_WEAK_ATTRIB_SUFFIX Context::default_initialized_;
2853 #else // !CL_HPP_CPP11_ATOMICS_SUPPORTED
2854 CL_WEAK_ATTRIB_PREFIX volatile int CL_WEAK_ATTRIB_SUFFIX Context::default_initialized_ = __DEFAULT_NOT_INITIALIZED;
2855 #endif // !CL_HPP_CPP11_ATOMICS_SUPPORTED
2856 
2857 CL_WEAK_ATTRIB_PREFIX Context CL_WEAK_ATTRIB_SUFFIX Context::default_;
2858 CL_WEAK_ATTRIB_PREFIX volatile cl_int CL_WEAK_ATTRIB_SUFFIX Context::default_error_ = CL_SUCCESS;
2859 
2860 /*! \brief Class interface for cl_event.
2861  *
2862  *  \note Copies of these objects are shallow, meaning that the copy will refer
2863  *        to the same underlying cl_event as the original.  For details, see
2864  *        clRetainEvent() and clReleaseEvent().
2865  *
2866  *  \see cl_event
2867  */
2868 class Event : public detail::Wrapper<cl_event>
2869 {
2870 public:
2871     //! \brief Default constructor - initializes to NULL.
Event()2872     Event() : detail::Wrapper<cl_type>() { }
2873 
2874     /*! \brief Constructor from cl_event - takes ownership.
2875      *
2876      *  This effectively transfers ownership of a refcount on the cl_event
2877      *  into the new Event object.
2878      */
Event(const cl_event & event)2879     __CL_EXPLICIT_CONSTRUCTORS Event(const cl_event& event) : detail::Wrapper<cl_type>(event) { }
2880 
2881     /*! \brief Assignment operator from cl_event - takes ownership.
2882      *
2883      *  This effectively transfers ownership of a refcount on the rhs and calls
2884      *  clReleaseEvent() on the value previously held by this instance.
2885      */
operator =(const cl_event & rhs)2886     Event& operator = (const cl_event& rhs)
2887     {
2888         detail::Wrapper<cl_type>::operator=(rhs);
2889         return *this;
2890     }
2891 
2892     //! \brief Wrapper for clGetEventInfo().
2893     template <typename T>
getInfo(cl_event_info name,T * param) const2894     cl_int getInfo(cl_event_info name, T* param) const
2895     {
2896         return detail::errHandler(
2897             detail::getInfo(&::clGetEventInfo, object_, name, param),
2898             __GET_EVENT_INFO_ERR);
2899     }
2900 
2901     //! \brief Wrapper for clGetEventInfo() that returns by value.
2902     template <cl_int name> typename
2903     detail::param_traits<detail::cl_event_info, name>::param_type
getInfo(cl_int * err=NULL) const2904     getInfo(cl_int* err = NULL) const
2905     {
2906         typename detail::param_traits<
2907             detail::cl_event_info, name>::param_type param;
2908         cl_int result = getInfo(name, &param);
2909         if (err != NULL) {
2910             *err = result;
2911         }
2912         return param;
2913     }
2914 
2915     //! \brief Wrapper for clGetEventProfilingInfo().
2916     template <typename T>
getProfilingInfo(cl_profiling_info name,T * param) const2917     cl_int getProfilingInfo(cl_profiling_info name, T* param) const
2918     {
2919         return detail::errHandler(detail::getInfo(
2920             &::clGetEventProfilingInfo, object_, name, param),
2921             __GET_EVENT_PROFILE_INFO_ERR);
2922     }
2923 
2924     //! \brief Wrapper for clGetEventProfilingInfo() that returns by value.
2925     template <cl_int name> typename
2926     detail::param_traits<detail::cl_profiling_info, name>::param_type
getProfilingInfo(cl_int * err=NULL) const2927     getProfilingInfo(cl_int* err = NULL) const
2928     {
2929         typename detail::param_traits<
2930             detail::cl_profiling_info, name>::param_type param;
2931         cl_int result = getProfilingInfo(name, &param);
2932         if (err != NULL) {
2933             *err = result;
2934         }
2935         return param;
2936     }
2937 
2938     /*! \brief Blocks the calling thread until this event completes.
2939      *
2940      *  Wraps clWaitForEvents().
2941      */
wait() const2942     cl_int wait() const
2943     {
2944         return detail::errHandler(
2945             ::clWaitForEvents(1, &object_),
2946             __WAIT_FOR_EVENTS_ERR);
2947     }
2948 
2949 #if defined(CL_VERSION_1_1)
2950     /*! \brief Registers a user callback function for a specific command execution status.
2951      *
2952      *  Wraps clSetEventCallback().
2953      */
setCallback(cl_int type,void (CL_CALLBACK * pfn_notify)(cl_event,cl_int,void *),void * user_data=NULL)2954     cl_int setCallback(
2955         cl_int type,
2956         void (CL_CALLBACK * pfn_notify)(cl_event, cl_int, void *),
2957         void * user_data = NULL)
2958     {
2959         return detail::errHandler(
2960             ::clSetEventCallback(
2961                 object_,
2962                 type,
2963                 pfn_notify,
2964                 user_data),
2965             __SET_EVENT_CALLBACK_ERR);
2966     }
2967 #endif
2968 
2969     /*! \brief Blocks the calling thread until every event specified is complete.
2970      *
2971      *  Wraps clWaitForEvents().
2972      */
2973     static cl_int
waitForEvents(const VECTOR_CLASS<Event> & events)2974     waitForEvents(const VECTOR_CLASS<Event>& events)
2975     {
2976         return detail::errHandler(
2977             ::clWaitForEvents(
2978                 (cl_uint) events.size(), (events.size() > 0) ? (cl_event*)&events.front() : NULL),
2979             __WAIT_FOR_EVENTS_ERR);
2980     }
2981 };
2982 
2983 #if defined(CL_VERSION_1_1)
2984 /*! \brief Class interface for user events (a subset of cl_event's).
2985  *
2986  *  See Event for details about copy semantics, etc.
2987  */
2988 class UserEvent : public Event
2989 {
2990 public:
2991     /*! \brief Constructs a user event on a given context.
2992      *
2993      *  Wraps clCreateUserEvent().
2994      */
UserEvent(const Context & context,cl_int * err=NULL)2995     UserEvent(
2996         const Context& context,
2997         cl_int * err = NULL)
2998     {
2999         cl_int error;
3000         object_ = ::clCreateUserEvent(
3001             context(),
3002             &error);
3003 
3004         detail::errHandler(error, __CREATE_USER_EVENT_ERR);
3005         if (err != NULL) {
3006             *err = error;
3007         }
3008     }
3009 
3010     //! \brief Default constructor - initializes to NULL.
UserEvent()3011     UserEvent() : Event() { }
3012 
3013     /*! \brief Sets the execution status of a user event object.
3014      *
3015      *  Wraps clSetUserEventStatus().
3016      */
setStatus(cl_int status)3017     cl_int setStatus(cl_int status)
3018     {
3019         return detail::errHandler(
3020             ::clSetUserEventStatus(object_,status),
3021             __SET_USER_EVENT_STATUS_ERR);
3022     }
3023 };
3024 #endif
3025 
3026 /*! \brief Blocks the calling thread until every event specified is complete.
3027  *
3028  *  Wraps clWaitForEvents().
3029  */
3030 inline static cl_int
WaitForEvents(const VECTOR_CLASS<Event> & events)3031 WaitForEvents(const VECTOR_CLASS<Event>& events)
3032 {
3033     return detail::errHandler(
3034         ::clWaitForEvents(
3035             (cl_uint) events.size(), (events.size() > 0) ? (cl_event*)&events.front() : NULL),
3036         __WAIT_FOR_EVENTS_ERR);
3037 }
3038 
3039 /*! \brief Class interface for cl_mem.
3040  *
3041  *  \note Copies of these objects are shallow, meaning that the copy will refer
3042  *        to the same underlying cl_mem as the original.  For details, see
3043  *        clRetainMemObject() and clReleaseMemObject().
3044  *
3045  *  \see cl_mem
3046  */
3047 class Memory : public detail::Wrapper<cl_mem>
3048 {
3049 public:
3050     //! \brief Default constructor - initializes to NULL.
Memory()3051     Memory() : detail::Wrapper<cl_type>() { }
3052 
3053     /*! \brief Constructor from cl_mem - takes ownership.
3054      *
3055      *  This effectively transfers ownership of a refcount on the cl_mem
3056      *  into the new Memory object.
3057      */
Memory(const cl_mem & memory)3058     __CL_EXPLICIT_CONSTRUCTORS Memory(const cl_mem& memory) : detail::Wrapper<cl_type>(memory) { }
3059 
3060     /*! \brief Assignment operator from cl_mem - takes ownership.
3061      *
3062      *  This effectively transfers ownership of a refcount on the rhs and calls
3063      *  clReleaseMemObject() on the value previously held by this instance.
3064      */
operator =(const cl_mem & rhs)3065     Memory& operator = (const cl_mem& rhs)
3066     {
3067         detail::Wrapper<cl_type>::operator=(rhs);
3068         return *this;
3069     }
3070 
3071     /*! \brief Copy constructor to forward copy to the superclass correctly.
3072      * Required for MSVC.
3073      */
Memory(const Memory & mem)3074     Memory(const Memory& mem) : detail::Wrapper<cl_type>(mem) {}
3075 
3076     /*! \brief Copy assignment to forward copy to the superclass correctly.
3077      * Required for MSVC.
3078      */
operator =(const Memory & mem)3079     Memory& operator = (const Memory &mem)
3080     {
3081         detail::Wrapper<cl_type>::operator=(mem);
3082         return *this;
3083     }
3084 
3085 #if defined(CL_HPP_RVALUE_REFERENCES_SUPPORTED)
3086     /*! \brief Move constructor to forward move to the superclass correctly.
3087      * Required for MSVC.
3088      */
Memory(Memory && mem)3089     Memory(Memory&& mem) CL_HPP_NOEXCEPT : detail::Wrapper<cl_type>(std::move(mem)) {}
3090 
3091     /*! \brief Move assignment to forward move to the superclass correctly.
3092      * Required for MSVC.
3093      */
operator =(Memory && mem)3094     Memory& operator = (Memory &&mem)
3095     {
3096         detail::Wrapper<cl_type>::operator=(std::move(mem));
3097         return *this;
3098     }
3099 #endif // #if defined(CL_HPP_RVALUE_REFERENCES_SUPPORTED)
3100 
3101     //! \brief Wrapper for clGetMemObjectInfo().
3102     template <typename T>
getInfo(cl_mem_info name,T * param) const3103     cl_int getInfo(cl_mem_info name, T* param) const
3104     {
3105         return detail::errHandler(
3106             detail::getInfo(&::clGetMemObjectInfo, object_, name, param),
3107             __GET_MEM_OBJECT_INFO_ERR);
3108     }
3109 
3110     //! \brief Wrapper for clGetMemObjectInfo() that returns by value.
3111     template <cl_int name> typename
3112     detail::param_traits<detail::cl_mem_info, name>::param_type
getInfo(cl_int * err=NULL) const3113     getInfo(cl_int* err = NULL) const
3114     {
3115         typename detail::param_traits<
3116             detail::cl_mem_info, name>::param_type param;
3117         cl_int result = getInfo(name, &param);
3118         if (err != NULL) {
3119             *err = result;
3120         }
3121         return param;
3122     }
3123 
3124 #if defined(CL_VERSION_1_1)
3125     /*! \brief Registers a callback function to be called when the memory object
3126      *         is no longer needed.
3127      *
3128      *  Wraps clSetMemObjectDestructorCallback().
3129      *
3130      *  Repeated calls to this function, for a given cl_mem value, will append
3131      *  to the list of functions called (in reverse order) when memory object's
3132      *  resources are freed and the memory object is deleted.
3133      *
3134      *  \note
3135      *  The registered callbacks are associated with the underlying cl_mem
3136      *  value - not the Memory class instance.
3137      */
setDestructorCallback(void (CL_CALLBACK * pfn_notify)(cl_mem,void *),void * user_data=NULL)3138     cl_int setDestructorCallback(
3139         void (CL_CALLBACK * pfn_notify)(cl_mem, void *),
3140         void * user_data = NULL)
3141     {
3142         return detail::errHandler(
3143             ::clSetMemObjectDestructorCallback(
3144                 object_,
3145                 pfn_notify,
3146                 user_data),
3147             __SET_MEM_OBJECT_DESTRUCTOR_CALLBACK_ERR);
3148     }
3149 #endif
3150 
3151 };
3152 
3153 // Pre-declare copy functions
3154 class Buffer;
3155 template< typename IteratorType >
3156 cl_int copy( IteratorType startIterator, IteratorType endIterator, cl::Buffer &buffer );
3157 template< typename IteratorType >
3158 cl_int copy( const cl::Buffer &buffer, IteratorType startIterator, IteratorType endIterator );
3159 template< typename IteratorType >
3160 cl_int copy( const CommandQueue &queue, IteratorType startIterator, IteratorType endIterator, cl::Buffer &buffer );
3161 template< typename IteratorType >
3162 cl_int copy( const CommandQueue &queue, const cl::Buffer &buffer, IteratorType startIterator, IteratorType endIterator );
3163 
3164 
3165 /*! \brief Class interface for Buffer Memory Objects.
3166  *
3167  *  See Memory for details about copy semantics, etc.
3168  *
3169  *  \see Memory
3170  */
3171 class Buffer : public Memory
3172 {
3173 public:
3174 
3175     /*! \brief Constructs a Buffer in a specified context.
3176      *
3177      *  Wraps clCreateBuffer().
3178      *
3179      *  \param host_ptr Storage to be used if the CL_MEM_USE_HOST_PTR flag was
3180      *                  specified.  Note alignment & exclusivity requirements.
3181      */
Buffer(const Context & context,cl_mem_flags flags,::size_t size,void * host_ptr=NULL,cl_int * err=NULL)3182     Buffer(
3183         const Context& context,
3184         cl_mem_flags flags,
3185         ::size_t size,
3186         void* host_ptr = NULL,
3187         cl_int* err = NULL)
3188     {
3189         cl_int error;
3190         object_ = ::clCreateBuffer(context(), flags, size, host_ptr, &error);
3191 
3192         detail::errHandler(error, __CREATE_BUFFER_ERR);
3193         if (err != NULL) {
3194             *err = error;
3195         }
3196     }
3197 
3198     /*! \brief Constructs a Buffer in the default context.
3199      *
3200      *  Wraps clCreateBuffer().
3201      *
3202      *  \param host_ptr Storage to be used if the CL_MEM_USE_HOST_PTR flag was
3203      *                  specified.  Note alignment & exclusivity requirements.
3204      *
3205      *  \see Context::getDefault()
3206      */
Buffer(cl_mem_flags flags,::size_t size,void * host_ptr=NULL,cl_int * err=NULL)3207     Buffer(
3208          cl_mem_flags flags,
3209         ::size_t size,
3210         void* host_ptr = NULL,
3211         cl_int* err = NULL)
3212     {
3213         cl_int error;
3214 
3215         Context context = Context::getDefault(err);
3216 
3217         object_ = ::clCreateBuffer(context(), flags, size, host_ptr, &error);
3218 
3219         detail::errHandler(error, __CREATE_BUFFER_ERR);
3220         if (err != NULL) {
3221             *err = error;
3222         }
3223     }
3224 
3225     /*!
3226      * \brief Construct a Buffer from a host container via iterators.
3227      * IteratorType must be random access.
3228      * If useHostPtr is specified iterators must represent contiguous data.
3229      */
3230     template< typename IteratorType >
Buffer(IteratorType startIterator,IteratorType endIterator,bool readOnly,bool useHostPtr=false,cl_int * err=NULL)3231     Buffer(
3232         IteratorType startIterator,
3233         IteratorType endIterator,
3234         bool readOnly,
3235         bool useHostPtr = false,
3236         cl_int* err = NULL)
3237     {
3238         typedef typename std::iterator_traits<IteratorType>::value_type DataType;
3239         cl_int error;
3240 
3241         cl_mem_flags flags = 0;
3242         if( readOnly ) {
3243             flags |= CL_MEM_READ_ONLY;
3244         }
3245         else {
3246             flags |= CL_MEM_READ_WRITE;
3247         }
3248         if( useHostPtr ) {
3249             flags |= CL_MEM_USE_HOST_PTR;
3250         }
3251 
3252         ::size_t size = sizeof(DataType)*(endIterator - startIterator);
3253 
3254         Context context = Context::getDefault(err);
3255 
3256         if( useHostPtr ) {
3257             object_ = ::clCreateBuffer(context(), flags, size, static_cast<DataType*>(&*startIterator), &error);
3258         } else {
3259             object_ = ::clCreateBuffer(context(), flags, size, 0, &error);
3260         }
3261 
3262         detail::errHandler(error, __CREATE_BUFFER_ERR);
3263         if (err != NULL) {
3264             *err = error;
3265         }
3266 
3267         if( !useHostPtr ) {
3268             error = cl::copy(startIterator, endIterator, *this);
3269             detail::errHandler(error, __CREATE_BUFFER_ERR);
3270             if (err != NULL) {
3271                 *err = error;
3272             }
3273         }
3274     }
3275 
3276     /*!
3277      * \brief Construct a Buffer from a host container via iterators using a specified context.
3278      * IteratorType must be random access.
3279      * If useHostPtr is specified iterators must represent contiguous data.
3280      */
3281     template< typename IteratorType >
3282     Buffer(const Context &context, IteratorType startIterator, IteratorType endIterator,
3283         bool readOnly, bool useHostPtr = false, cl_int* err = NULL);
3284 
3285     /*!
3286     * \brief Construct a Buffer from a host container via iterators using a specified queue.
3287     * If useHostPtr is specified iterators must represent contiguous data.
3288     */
3289     template< typename IteratorType >
3290     Buffer(const CommandQueue &queue, IteratorType startIterator, IteratorType endIterator,
3291         bool readOnly, bool useHostPtr = false, cl_int* err = NULL);
3292 
3293     //! \brief Default constructor - initializes to NULL.
Buffer()3294     Buffer() : Memory() { }
3295 
3296     /*! \brief Constructor from cl_mem - takes ownership.
3297      *
3298      *  See Memory for further details.
3299      */
Buffer(const cl_mem & buffer)3300     __CL_EXPLICIT_CONSTRUCTORS Buffer(const cl_mem& buffer) : Memory(buffer) { }
3301 
3302     /*! \brief Assignment from cl_mem - performs shallow copy.
3303      *
3304      *  See Memory for further details.
3305      */
operator =(const cl_mem & rhs)3306     Buffer& operator = (const cl_mem& rhs)
3307     {
3308         Memory::operator=(rhs);
3309         return *this;
3310     }
3311 
3312     /*! \brief Copy constructor to forward copy to the superclass correctly.
3313      * Required for MSVC.
3314      */
Buffer(const Buffer & buf)3315     Buffer(const Buffer& buf) : Memory(buf) {}
3316 
3317     /*! \brief Copy assignment to forward copy to the superclass correctly.
3318      * Required for MSVC.
3319      */
operator =(const Buffer & buf)3320     Buffer& operator = (const Buffer &buf)
3321     {
3322         Memory::operator=(buf);
3323         return *this;
3324     }
3325 
3326 #if defined(CL_HPP_RVALUE_REFERENCES_SUPPORTED)
3327     /*! \brief Move constructor to forward move to the superclass correctly.
3328      * Required for MSVC.
3329      */
Buffer(Buffer && buf)3330     Buffer(Buffer&& buf) CL_HPP_NOEXCEPT : Memory(std::move(buf)) {}
3331 
3332     /*! \brief Move assignment to forward move to the superclass correctly.
3333      * Required for MSVC.
3334      */
operator =(Buffer && buf)3335     Buffer& operator = (Buffer &&buf)
3336     {
3337         Memory::operator=(std::move(buf));
3338         return *this;
3339     }
3340 #endif // #if defined(CL_HPP_RVALUE_REFERENCES_SUPPORTED)
3341 
3342 #if defined(CL_VERSION_1_1)
3343     /*! \brief Creates a new buffer object from this.
3344      *
3345      *  Wraps clCreateSubBuffer().
3346      */
createSubBuffer(cl_mem_flags flags,cl_buffer_create_type buffer_create_type,const void * buffer_create_info,cl_int * err=NULL)3347     Buffer createSubBuffer(
3348         cl_mem_flags flags,
3349         cl_buffer_create_type buffer_create_type,
3350         const void * buffer_create_info,
3351         cl_int * err = NULL)
3352     {
3353         Buffer result;
3354         cl_int error;
3355         result.object_ = ::clCreateSubBuffer(
3356             object_,
3357             flags,
3358             buffer_create_type,
3359             buffer_create_info,
3360             &error);
3361 
3362         detail::errHandler(error, __CREATE_SUBBUFFER_ERR);
3363         if (err != NULL) {
3364             *err = error;
3365         }
3366 
3367         return result;
3368     }
3369 #endif
3370 };
3371 
3372 #if defined (USE_DX_INTEROP)
3373 /*! \brief Class interface for creating OpenCL buffers from ID3D10Buffer's.
3374  *
3375  *  This is provided to facilitate interoperability with Direct3D.
3376  *
3377  *  See Memory for details about copy semantics, etc.
3378  *
3379  *  \see Memory
3380  */
3381 class BufferD3D10 : public Buffer
3382 {
3383 public:
3384     typedef CL_API_ENTRY cl_mem (CL_API_CALL *PFN_clCreateFromD3D10BufferKHR)(
3385     cl_context context, cl_mem_flags flags, ID3D10Buffer*  buffer,
3386     cl_int* errcode_ret);
3387 
3388     /*! \brief Constructs a BufferD3D10, in a specified context, from a
3389      *         given ID3D10Buffer.
3390      *
3391      *  Wraps clCreateFromD3D10BufferKHR().
3392      */
BufferD3D10(const Context & context,cl_mem_flags flags,ID3D10Buffer * bufobj,cl_int * err=NULL)3393     BufferD3D10(
3394         const Context& context,
3395         cl_mem_flags flags,
3396         ID3D10Buffer* bufobj,
3397         cl_int * err = NULL)
3398     {
3399         static PFN_clCreateFromD3D10BufferKHR pfn_clCreateFromD3D10BufferKHR = NULL;
3400 
3401 #if defined(CL_VERSION_1_2)
3402         vector<cl_context_properties> props = context.getInfo<CL_CONTEXT_PROPERTIES>();
3403         cl_platform platform = -1;
3404         for( int i = 0; i < props.size(); ++i ) {
3405             if( props[i] == CL_CONTEXT_PLATFORM ) {
3406                 platform = props[i+1];
3407             }
3408         }
3409         __INIT_CL_EXT_FCN_PTR_PLATFORM(platform, clCreateFromD3D10BufferKHR);
3410 #endif
3411 #if defined(CL_VERSION_1_1)
3412         __INIT_CL_EXT_FCN_PTR(clCreateFromD3D10BufferKHR);
3413 #endif
3414 
3415         cl_int error;
3416         object_ = pfn_clCreateFromD3D10BufferKHR(
3417             context(),
3418             flags,
3419             bufobj,
3420             &error);
3421 
3422         detail::errHandler(error, __CREATE_GL_BUFFER_ERR);
3423         if (err != NULL) {
3424             *err = error;
3425         }
3426     }
3427 
3428     //! \brief Default constructor - initializes to NULL.
BufferD3D10()3429     BufferD3D10() : Buffer() { }
3430 
3431     /*! \brief Constructor from cl_mem - takes ownership.
3432      *
3433      *  See Memory for further details.
3434      */
BufferD3D10(const cl_mem & buffer)3435     __CL_EXPLICIT_CONSTRUCTORS BufferD3D10(const cl_mem& buffer) : Buffer(buffer) { }
3436 
3437     /*! \brief Assignment from cl_mem - performs shallow copy.
3438      *
3439      *  See Memory for further details.
3440      */
operator =(const cl_mem & rhs)3441     BufferD3D10& operator = (const cl_mem& rhs)
3442     {
3443         Buffer::operator=(rhs);
3444         return *this;
3445     }
3446 
3447     /*! \brief Copy constructor to forward copy to the superclass correctly.
3448     * Required for MSVC.
3449     */
BufferD3D10(const BufferD3D10 & buf)3450     BufferD3D10(const BufferD3D10& buf) : Buffer(buf) {}
3451 
3452     /*! \brief Copy assignment to forward copy to the superclass correctly.
3453     * Required for MSVC.
3454     */
operator =(const BufferD3D10 & buf)3455     BufferD3D10& operator = (const BufferD3D10 &buf)
3456     {
3457         Buffer::operator=(buf);
3458         return *this;
3459     }
3460 
3461 #if defined(CL_HPP_RVALUE_REFERENCES_SUPPORTED)
3462     /*! \brief Move constructor to forward move to the superclass correctly.
3463     * Required for MSVC.
3464     */
BufferD3D10(BufferD3D10 && buf)3465     BufferD3D10(BufferD3D10&& buf) CL_HPP_NOEXCEPT : Buffer(std::move(buf)) {}
3466 
3467     /*! \brief Move assignment to forward move to the superclass correctly.
3468     * Required for MSVC.
3469     */
operator =(BufferD3D10 && buf)3470     BufferD3D10& operator = (BufferD3D10 &&buf)
3471     {
3472         Buffer::operator=(std::move(buf));
3473         return *this;
3474     }
3475 #endif // #if defined(CL_HPP_RVALUE_REFERENCES_SUPPORTED)
3476 };
3477 #endif
3478 
3479 /*! \brief Class interface for GL Buffer Memory Objects.
3480  *
3481  *  This is provided to facilitate interoperability with OpenGL.
3482  *
3483  *  See Memory for details about copy semantics, etc.
3484  *
3485  *  \see Memory
3486  */
3487 class BufferGL : public Buffer
3488 {
3489 public:
3490     /*! \brief Constructs a BufferGL in a specified context, from a given
3491      *         GL buffer.
3492      *
3493      *  Wraps clCreateFromGLBuffer().
3494      */
BufferGL(const Context & context,cl_mem_flags flags,cl_GLuint bufobj,cl_int * err=NULL)3495     BufferGL(
3496         const Context& context,
3497         cl_mem_flags flags,
3498         cl_GLuint bufobj,
3499         cl_int * err = NULL)
3500     {
3501         cl_int error;
3502         object_ = ::clCreateFromGLBuffer(
3503             context(),
3504             flags,
3505             bufobj,
3506             &error);
3507 
3508         detail::errHandler(error, __CREATE_GL_BUFFER_ERR);
3509         if (err != NULL) {
3510             *err = error;
3511         }
3512     }
3513 
3514     //! \brief Default constructor - initializes to NULL.
BufferGL()3515     BufferGL() : Buffer() { }
3516 
3517     /*! \brief Constructor from cl_mem - takes ownership.
3518      *
3519      *  See Memory for further details.
3520      */
BufferGL(const cl_mem & buffer)3521     __CL_EXPLICIT_CONSTRUCTORS BufferGL(const cl_mem& buffer) : Buffer(buffer) { }
3522 
3523     /*! \brief Assignment from cl_mem - performs shallow copy.
3524      *
3525      *  See Memory for further details.
3526      */
operator =(const cl_mem & rhs)3527     BufferGL& operator = (const cl_mem& rhs)
3528     {
3529         Buffer::operator=(rhs);
3530         return *this;
3531     }
3532 
3533     /*! \brief Copy constructor to forward copy to the superclass correctly.
3534     * Required for MSVC.
3535     */
BufferGL(const BufferGL & buf)3536     BufferGL(const BufferGL& buf) : Buffer(buf) {}
3537 
3538     /*! \brief Copy assignment to forward copy to the superclass correctly.
3539     * Required for MSVC.
3540     */
operator =(const BufferGL & buf)3541     BufferGL& operator = (const BufferGL &buf)
3542     {
3543         Buffer::operator=(buf);
3544         return *this;
3545     }
3546 
3547 #if defined(CL_HPP_RVALUE_REFERENCES_SUPPORTED)
3548     /*! \brief Move constructor to forward move to the superclass correctly.
3549     * Required for MSVC.
3550     */
BufferGL(BufferGL && buf)3551     BufferGL(BufferGL&& buf) CL_HPP_NOEXCEPT : Buffer(std::move(buf)) {}
3552 
3553     /*! \brief Move assignment to forward move to the superclass correctly.
3554     * Required for MSVC.
3555     */
operator =(BufferGL && buf)3556     BufferGL& operator = (BufferGL &&buf)
3557     {
3558         Buffer::operator=(std::move(buf));
3559         return *this;
3560     }
3561 #endif // #if defined(CL_HPP_RVALUE_REFERENCES_SUPPORTED)
3562 
3563     //! \brief Wrapper for clGetGLObjectInfo().
getObjectInfo(cl_gl_object_type * type,cl_GLuint * gl_object_name)3564     cl_int getObjectInfo(
3565         cl_gl_object_type *type,
3566         cl_GLuint * gl_object_name)
3567     {
3568         return detail::errHandler(
3569             ::clGetGLObjectInfo(object_,type,gl_object_name),
3570             __GET_GL_OBJECT_INFO_ERR);
3571     }
3572 };
3573 
3574 /*! \brief C++ base class for Image Memory objects.
3575  *
3576  *  See Memory for details about copy semantics, etc.
3577  *
3578  *  \see Memory
3579  */
3580 class Image : public Memory
3581 {
3582 protected:
3583     //! \brief Default constructor - initializes to NULL.
Image()3584     Image() : Memory() { }
3585 
3586     /*! \brief Constructor from cl_mem - takes ownership.
3587      *
3588      *  See Memory for further details.
3589      */
Image(const cl_mem & image)3590     __CL_EXPLICIT_CONSTRUCTORS Image(const cl_mem& image) : Memory(image) { }
3591 
3592     /*! \brief Assignment from cl_mem - performs shallow copy.
3593      *
3594      *  See Memory for further details.
3595      */
operator =(const cl_mem & rhs)3596     Image& operator = (const cl_mem& rhs)
3597     {
3598         Memory::operator=(rhs);
3599         return *this;
3600     }
3601 
3602     /*! \brief Copy constructor to forward copy to the superclass correctly.
3603      * Required for MSVC.
3604      */
Image(const Image & img)3605     Image(const Image& img) : Memory(img) {}
3606 
3607     /*! \brief Copy assignment to forward copy to the superclass correctly.
3608      * Required for MSVC.
3609      */
operator =(const Image & img)3610     Image& operator = (const Image &img)
3611     {
3612         Memory::operator=(img);
3613         return *this;
3614     }
3615 
3616 #if defined(CL_HPP_RVALUE_REFERENCES_SUPPORTED)
3617     /*! \brief Move constructor to forward move to the superclass correctly.
3618      * Required for MSVC.
3619      */
Image(Image && img)3620     Image(Image&& img) CL_HPP_NOEXCEPT : Memory(std::move(img)) {}
3621 
3622     /*! \brief Move assignment to forward move to the superclass correctly.
3623      * Required for MSVC.
3624      */
operator =(Image && img)3625     Image& operator = (Image &&img)
3626     {
3627         Memory::operator=(std::move(img));
3628         return *this;
3629     }
3630 #endif // #if defined(CL_HPP_RVALUE_REFERENCES_SUPPORTED)
3631 
3632 public:
3633     //! \brief Wrapper for clGetImageInfo().
3634     template <typename T>
getImageInfo(cl_image_info name,T * param) const3635     cl_int getImageInfo(cl_image_info name, T* param) const
3636     {
3637         return detail::errHandler(
3638             detail::getInfo(&::clGetImageInfo, object_, name, param),
3639             __GET_IMAGE_INFO_ERR);
3640     }
3641 
3642     //! \brief Wrapper for clGetImageInfo() that returns by value.
3643     template <cl_int name> typename
3644     detail::param_traits<detail::cl_image_info, name>::param_type
getImageInfo(cl_int * err=NULL) const3645     getImageInfo(cl_int* err = NULL) const
3646     {
3647         typename detail::param_traits<
3648             detail::cl_image_info, name>::param_type param;
3649         cl_int result = getImageInfo(name, &param);
3650         if (err != NULL) {
3651             *err = result;
3652         }
3653         return param;
3654     }
3655 };
3656 
3657 #if defined(CL_VERSION_1_2)
3658 /*! \brief Class interface for 1D Image Memory objects.
3659  *
3660  *  See Memory for details about copy semantics, etc.
3661  *
3662  *  \see Memory
3663  */
3664 class Image1D : public Image
3665 {
3666 public:
3667     /*! \brief Constructs a 1D Image in a specified context.
3668      *
3669      *  Wraps clCreateImage().
3670      */
Image1D(const Context & context,cl_mem_flags flags,ImageFormat format,::size_t width,void * host_ptr=NULL,cl_int * err=NULL)3671     Image1D(
3672         const Context& context,
3673         cl_mem_flags flags,
3674         ImageFormat format,
3675         ::size_t width,
3676         void* host_ptr = NULL,
3677         cl_int* err = NULL)
3678     {
3679         cl_int error;
3680         cl_image_desc desc =
3681         {
3682             CL_MEM_OBJECT_IMAGE1D,
3683             width,
3684             0, 0, 0, 0, 0, 0, 0, 0
3685         };
3686         object_ = ::clCreateImage(
3687             context(),
3688             flags,
3689             &format,
3690             &desc,
3691             host_ptr,
3692             &error);
3693 
3694         detail::errHandler(error, __CREATE_IMAGE_ERR);
3695         if (err != NULL) {
3696             *err = error;
3697         }
3698     }
3699 
3700     //! \brief Default constructor - initializes to NULL.
Image1D()3701     Image1D() { }
3702 
3703     /*! \brief Constructor from cl_mem - takes ownership.
3704      *
3705      *  See Memory for further details.
3706      */
Image1D(const cl_mem & image1D)3707     __CL_EXPLICIT_CONSTRUCTORS Image1D(const cl_mem& image1D) : Image(image1D) { }
3708 
3709     /*! \brief Assignment from cl_mem - performs shallow copy.
3710      *
3711      *  See Memory for further details.
3712      */
operator =(const cl_mem & rhs)3713     Image1D& operator = (const cl_mem& rhs)
3714     {
3715         Image::operator=(rhs);
3716         return *this;
3717     }
3718 
3719     /*! \brief Copy constructor to forward copy to the superclass correctly.
3720      * Required for MSVC.
3721      */
Image1D(const Image1D & img)3722     Image1D(const Image1D& img) : Image(img) {}
3723 
3724     /*! \brief Copy assignment to forward copy to the superclass correctly.
3725      * Required for MSVC.
3726      */
operator =(const Image1D & img)3727     Image1D& operator = (const Image1D &img)
3728     {
3729         Image::operator=(img);
3730         return *this;
3731     }
3732 
3733 #if defined(CL_HPP_RVALUE_REFERENCES_SUPPORTED)
3734     /*! \brief Move constructor to forward move to the superclass correctly.
3735      * Required for MSVC.
3736      */
Image1D(Image1D && img)3737     Image1D(Image1D&& img) CL_HPP_NOEXCEPT : Image(std::move(img)) {}
3738 
3739     /*! \brief Move assignment to forward move to the superclass correctly.
3740      * Required for MSVC.
3741      */
operator =(Image1D && img)3742     Image1D& operator = (Image1D &&img)
3743     {
3744         Image::operator=(std::move(img));
3745         return *this;
3746     }
3747 #endif // #if defined(CL_HPP_RVALUE_REFERENCES_SUPPORTED)
3748 };
3749 
3750 /*! \class Image1DBuffer
3751  * \brief Image interface for 1D buffer images.
3752  */
3753 class Image1DBuffer : public Image
3754 {
3755 public:
Image1DBuffer(const Context & context,cl_mem_flags flags,ImageFormat format,::size_t width,const Buffer & buffer,cl_int * err=NULL)3756     Image1DBuffer(
3757         const Context& context,
3758         cl_mem_flags flags,
3759         ImageFormat format,
3760         ::size_t width,
3761         const Buffer &buffer,
3762         cl_int* err = NULL)
3763     {
3764         cl_int error;
3765         cl_image_desc desc =
3766         {
3767             CL_MEM_OBJECT_IMAGE1D_BUFFER,
3768             width,
3769             0, 0, 0, 0, 0, 0, 0,
3770             buffer()
3771         };
3772         object_ = ::clCreateImage(
3773             context(),
3774             flags,
3775             &format,
3776             &desc,
3777             NULL,
3778             &error);
3779 
3780         detail::errHandler(error, __CREATE_IMAGE_ERR);
3781         if (err != NULL) {
3782             *err = error;
3783         }
3784     }
3785 
Image1DBuffer()3786     Image1DBuffer() { }
3787 
Image1DBuffer(const cl_mem & image1D)3788     __CL_EXPLICIT_CONSTRUCTORS Image1DBuffer(const cl_mem& image1D) : Image(image1D) { }
3789 
operator =(const cl_mem & rhs)3790     Image1DBuffer& operator = (const cl_mem& rhs)
3791     {
3792         Image::operator=(rhs);
3793         return *this;
3794     }
3795 
3796     /*! \brief Copy constructor to forward copy to the superclass correctly.
3797      * Required for MSVC.
3798      */
Image1DBuffer(const Image1DBuffer & img)3799     Image1DBuffer(const Image1DBuffer& img) : Image(img) {}
3800 
3801     /*! \brief Copy assignment to forward copy to the superclass correctly.
3802      * Required for MSVC.
3803      */
operator =(const Image1DBuffer & img)3804     Image1DBuffer& operator = (const Image1DBuffer &img)
3805     {
3806         Image::operator=(img);
3807         return *this;
3808     }
3809 
3810 #if defined(CL_HPP_RVALUE_REFERENCES_SUPPORTED)
3811     /*! \brief Move constructor to forward move to the superclass correctly.
3812      * Required for MSVC.
3813      */
Image1DBuffer(Image1DBuffer && img)3814     Image1DBuffer(Image1DBuffer&& img) CL_HPP_NOEXCEPT : Image(std::move(img)) {}
3815 
3816     /*! \brief Move assignment to forward move to the superclass correctly.
3817      * Required for MSVC.
3818      */
operator =(Image1DBuffer && img)3819     Image1DBuffer& operator = (Image1DBuffer &&img)
3820     {
3821         Image::operator=(std::move(img));
3822         return *this;
3823     }
3824 #endif // #if defined(CL_HPP_RVALUE_REFERENCES_SUPPORTED)
3825 };
3826 
3827 /*! \class Image1DArray
3828  * \brief Image interface for arrays of 1D images.
3829  */
3830 class Image1DArray : public Image
3831 {
3832 public:
Image1DArray(const Context & context,cl_mem_flags flags,ImageFormat format,::size_t arraySize,::size_t width,::size_t rowPitch,void * host_ptr=NULL,cl_int * err=NULL)3833     Image1DArray(
3834         const Context& context,
3835         cl_mem_flags flags,
3836         ImageFormat format,
3837         ::size_t arraySize,
3838         ::size_t width,
3839         ::size_t rowPitch,
3840         void* host_ptr = NULL,
3841         cl_int* err = NULL)
3842     {
3843         cl_int error;
3844         cl_image_desc desc =
3845         {
3846             CL_MEM_OBJECT_IMAGE1D_ARRAY,
3847             width,
3848             0, 0,  // height, depth (unused)
3849             arraySize,
3850             rowPitch,
3851             0, 0, 0, 0
3852         };
3853         object_ = ::clCreateImage(
3854             context(),
3855             flags,
3856             &format,
3857             &desc,
3858             host_ptr,
3859             &error);
3860 
3861         detail::errHandler(error, __CREATE_IMAGE_ERR);
3862         if (err != NULL) {
3863             *err = error;
3864         }
3865     }
3866 
Image1DArray()3867     Image1DArray() { }
3868 
Image1DArray(const cl_mem & imageArray)3869     __CL_EXPLICIT_CONSTRUCTORS Image1DArray(const cl_mem& imageArray) : Image(imageArray) { }
3870 
operator =(const cl_mem & rhs)3871     Image1DArray& operator = (const cl_mem& rhs)
3872     {
3873         Image::operator=(rhs);
3874         return *this;
3875     }
3876 
3877     /*! \brief Copy constructor to forward copy to the superclass correctly.
3878      * Required for MSVC.
3879      */
Image1DArray(const Image1DArray & img)3880     Image1DArray(const Image1DArray& img) : Image(img) {}
3881 
3882     /*! \brief Copy assignment to forward copy to the superclass correctly.
3883      * Required for MSVC.
3884      */
operator =(const Image1DArray & img)3885     Image1DArray& operator = (const Image1DArray &img)
3886     {
3887         Image::operator=(img);
3888         return *this;
3889     }
3890 
3891 #if defined(CL_HPP_RVALUE_REFERENCES_SUPPORTED)
3892     /*! \brief Move constructor to forward move to the superclass correctly.
3893      * Required for MSVC.
3894      */
Image1DArray(Image1DArray && img)3895     Image1DArray(Image1DArray&& img) CL_HPP_NOEXCEPT : Image(std::move(img)) {}
3896 
3897     /*! \brief Move assignment to forward move to the superclass correctly.
3898      * Required for MSVC.
3899      */
operator =(Image1DArray && img)3900     Image1DArray& operator = (Image1DArray &&img)
3901     {
3902         Image::operator=(std::move(img));
3903         return *this;
3904     }
3905 #endif // #if defined(CL_HPP_RVALUE_REFERENCES_SUPPORTED)
3906 };
3907 #endif // #if defined(CL_VERSION_1_2)
3908 
3909 
3910 /*! \brief Class interface for 2D Image Memory objects.
3911  *
3912  *  See Memory for details about copy semantics, etc.
3913  *
3914  *  \see Memory
3915  */
3916 class Image2D : public Image
3917 {
3918 public:
3919     /*! \brief Constructs a 1D Image in a specified context.
3920      *
3921      *  Wraps clCreateImage().
3922      */
Image2D(const Context & context,cl_mem_flags flags,ImageFormat format,::size_t width,::size_t height,::size_t row_pitch=0,void * host_ptr=NULL,cl_int * err=NULL)3923     Image2D(
3924         const Context& context,
3925         cl_mem_flags flags,
3926         ImageFormat format,
3927         ::size_t width,
3928         ::size_t height,
3929         ::size_t row_pitch = 0,
3930         void* host_ptr = NULL,
3931         cl_int* err = NULL)
3932     {
3933         cl_int error;
3934         bool useCreateImage;
3935 
3936 #if defined(CL_VERSION_1_2) && defined(CL_USE_DEPRECATED_OPENCL_1_1_APIS)
3937         // Run-time decision based on the actual platform
3938         {
3939             cl_uint version = detail::getContextPlatformVersion(context());
3940             useCreateImage = (version >= 0x10002); // OpenCL 1.2 or above
3941         }
3942 #elif defined(CL_VERSION_1_2)
3943         useCreateImage = true;
3944 #else
3945         useCreateImage = false;
3946 #endif
3947 
3948 #if defined(CL_VERSION_1_2)
3949         if (useCreateImage)
3950         {
3951             cl_image_desc desc =
3952             {
3953                 CL_MEM_OBJECT_IMAGE2D,
3954                 width,
3955                 height,
3956                 0, 0, // depth, array size (unused)
3957                 row_pitch,
3958                 0, 0, 0, 0
3959             };
3960             object_ = ::clCreateImage(
3961                 context(),
3962                 flags,
3963                 &format,
3964                 &desc,
3965                 host_ptr,
3966                 &error);
3967 
3968             detail::errHandler(error, __CREATE_IMAGE_ERR);
3969             if (err != NULL) {
3970                 *err = error;
3971             }
3972         }
3973 #endif // #if defined(CL_VERSION_1_2)
3974 #if !defined(CL_VERSION_1_2) || defined(CL_USE_DEPRECATED_OPENCL_1_1_APIS)
3975         if (!useCreateImage)
3976         {
3977             object_ = ::clCreateImage2D(
3978                 context(), flags,&format, width, height, row_pitch, host_ptr, &error);
3979 
3980             detail::errHandler(error, __CREATE_IMAGE2D_ERR);
3981             if (err != NULL) {
3982                 *err = error;
3983             }
3984         }
3985 #endif // #if !defined(CL_VERSION_1_2) || defined(CL_USE_DEPRECATED_OPENCL_1_1_APIS)
3986     }
3987 
3988     //! \brief Default constructor - initializes to NULL.
Image2D()3989     Image2D() { }
3990 
3991     /*! \brief Constructor from cl_mem - takes ownership.
3992      *
3993      *  See Memory for further details.
3994      */
Image2D(const cl_mem & image2D)3995     __CL_EXPLICIT_CONSTRUCTORS Image2D(const cl_mem& image2D) : Image(image2D) { }
3996 
3997     /*! \brief Assignment from cl_mem - performs shallow copy.
3998      *
3999      *  See Memory for further details.
4000      */
operator =(const cl_mem & rhs)4001     Image2D& operator = (const cl_mem& rhs)
4002     {
4003         Image::operator=(rhs);
4004         return *this;
4005     }
4006 
4007     /*! \brief Copy constructor to forward copy to the superclass correctly.
4008      * Required for MSVC.
4009      */
Image2D(const Image2D & img)4010     Image2D(const Image2D& img) : Image(img) {}
4011 
4012     /*! \brief Copy assignment to forward copy to the superclass correctly.
4013      * Required for MSVC.
4014      */
operator =(const Image2D & img)4015     Image2D& operator = (const Image2D &img)
4016     {
4017         Image::operator=(img);
4018         return *this;
4019     }
4020 
4021 #if defined(CL_HPP_RVALUE_REFERENCES_SUPPORTED)
4022     /*! \brief Move constructor to forward move to the superclass correctly.
4023      * Required for MSVC.
4024      */
Image2D(Image2D && img)4025     Image2D(Image2D&& img) CL_HPP_NOEXCEPT : Image(std::move(img)) {}
4026 
4027     /*! \brief Move assignment to forward move to the superclass correctly.
4028      * Required for MSVC.
4029      */
operator =(Image2D && img)4030     Image2D& operator = (Image2D &&img)
4031     {
4032         Image::operator=(std::move(img));
4033         return *this;
4034     }
4035 #endif // #if defined(CL_HPP_RVALUE_REFERENCES_SUPPORTED)
4036 };
4037 
4038 
4039 #if !defined(CL_VERSION_1_2)
4040 /*! \brief Class interface for GL 2D Image Memory objects.
4041  *
4042  *  This is provided to facilitate interoperability with OpenGL.
4043  *
4044  *  See Memory for details about copy semantics, etc.
4045  *
4046  *  \see Memory
4047  *  \note Deprecated for OpenCL 1.2. Please use ImageGL instead.
4048  */
4049 class CL_EXT_PREFIX__VERSION_1_1_DEPRECATED Image2DGL CL_EXT_SUFFIX__VERSION_1_1_DEPRECATED : public Image2D
4050 {
4051 public:
4052     /*! \brief Constructs an Image2DGL in a specified context, from a given
4053      *         GL Texture.
4054      *
4055      *  Wraps clCreateFromGLTexture2D().
4056      */
Image2DGL(const Context & context,cl_mem_flags flags,cl_GLenum target,cl_GLint miplevel,cl_GLuint texobj,cl_int * err=NULL)4057     Image2DGL(
4058         const Context& context,
4059         cl_mem_flags flags,
4060         cl_GLenum target,
4061         cl_GLint  miplevel,
4062         cl_GLuint texobj,
4063         cl_int * err = NULL)
4064     {
4065         cl_int error;
4066         object_ = ::clCreateFromGLTexture2D(
4067             context(),
4068             flags,
4069             target,
4070             miplevel,
4071             texobj,
4072             &error);
4073 
4074         detail::errHandler(error, __CREATE_GL_TEXTURE_2D_ERR);
4075         if (err != NULL) {
4076             *err = error;
4077         }
4078 
4079     }
4080 
4081     //! \brief Default constructor - initializes to NULL.
Image2DGL()4082     Image2DGL() : Image2D() { }
4083 
4084     /*! \brief Constructor from cl_mem - takes ownership.
4085      *
4086      *  See Memory for further details.
4087      */
Image2DGL(const cl_mem & image)4088     __CL_EXPLICIT_CONSTRUCTORS Image2DGL(const cl_mem& image) : Image2D(image) { }
4089 
4090     /*! \brief Assignment from cl_mem - performs shallow copy.
4091      *
4092      *  See Memory for further details.
4093      */
operator =(const cl_mem & rhs)4094     Image2DGL& operator = (const cl_mem& rhs)
4095     {
4096         Image2D::operator=(rhs);
4097         return *this;
4098     }
4099 
4100     /*! \brief Copy constructor to forward copy to the superclass correctly.
4101      * Required for MSVC.
4102      */
Image2DGL(const Image2DGL & img)4103     Image2DGL(const Image2DGL& img) : Image2D(img) {}
4104 
4105     /*! \brief Copy assignment to forward copy to the superclass correctly.
4106      * Required for MSVC.
4107      */
operator =(const Image2DGL & img)4108     Image2DGL& operator = (const Image2DGL &img)
4109     {
4110         Image2D::operator=(img);
4111         return *this;
4112     }
4113 
4114 #if defined(CL_HPP_RVALUE_REFERENCES_SUPPORTED)
4115     /*! \brief Move constructor to forward move to the superclass correctly.
4116      * Required for MSVC.
4117      */
Image2DGL(Image2DGL && img)4118     Image2DGL(Image2DGL&& img) CL_HPP_NOEXCEPT : Image2D(std::move(img)) {}
4119 
4120     /*! \brief Move assignment to forward move to the superclass correctly.
4121      * Required for MSVC.
4122      */
operator =(Image2DGL && img)4123     Image2DGL& operator = (Image2DGL &&img)
4124     {
4125         Image2D::operator=(std::move(img));
4126         return *this;
4127     }
4128 #endif // #if defined(CL_HPP_RVALUE_REFERENCES_SUPPORTED)
4129 };
4130 #endif // #if !defined(CL_VERSION_1_2)
4131 
4132 #if defined(CL_VERSION_1_2)
4133 /*! \class Image2DArray
4134  * \brief Image interface for arrays of 2D images.
4135  */
4136 class Image2DArray : public Image
4137 {
4138 public:
Image2DArray(const Context & context,cl_mem_flags flags,ImageFormat format,::size_t arraySize,::size_t width,::size_t height,::size_t rowPitch,::size_t slicePitch,void * host_ptr=NULL,cl_int * err=NULL)4139     Image2DArray(
4140         const Context& context,
4141         cl_mem_flags flags,
4142         ImageFormat format,
4143         ::size_t arraySize,
4144         ::size_t width,
4145         ::size_t height,
4146         ::size_t rowPitch,
4147         ::size_t slicePitch,
4148         void* host_ptr = NULL,
4149         cl_int* err = NULL)
4150     {
4151         cl_int error;
4152         cl_image_desc desc =
4153         {
4154             CL_MEM_OBJECT_IMAGE2D_ARRAY,
4155             width,
4156             height,
4157             0,       // depth (unused)
4158             arraySize,
4159             rowPitch,
4160             slicePitch,
4161             0, 0, 0
4162         };
4163         object_ = ::clCreateImage(
4164             context(),
4165             flags,
4166             &format,
4167             &desc,
4168             host_ptr,
4169             &error);
4170 
4171         detail::errHandler(error, __CREATE_IMAGE_ERR);
4172         if (err != NULL) {
4173             *err = error;
4174         }
4175     }
4176 
Image2DArray()4177     Image2DArray() { }
4178 
Image2DArray(const cl_mem & imageArray)4179     __CL_EXPLICIT_CONSTRUCTORS Image2DArray(const cl_mem& imageArray) : Image(imageArray) { }
4180 
operator =(const cl_mem & rhs)4181     Image2DArray& operator = (const cl_mem& rhs)
4182     {
4183         Image::operator=(rhs);
4184         return *this;
4185     }
4186 
4187     /*! \brief Copy constructor to forward copy to the superclass correctly.
4188      * Required for MSVC.
4189      */
Image2DArray(const Image2DArray & img)4190     Image2DArray(const Image2DArray& img) : Image(img) {}
4191 
4192     /*! \brief Copy assignment to forward copy to the superclass correctly.
4193      * Required for MSVC.
4194      */
operator =(const Image2DArray & img)4195     Image2DArray& operator = (const Image2DArray &img)
4196     {
4197         Image::operator=(img);
4198         return *this;
4199     }
4200 
4201 #if defined(CL_HPP_RVALUE_REFERENCES_SUPPORTED)
4202     /*! \brief Move constructor to forward move to the superclass correctly.
4203      * Required for MSVC.
4204      */
Image2DArray(Image2DArray && img)4205     Image2DArray(Image2DArray&& img) CL_HPP_NOEXCEPT : Image(std::move(img)) {}
4206 
4207     /*! \brief Move assignment to forward move to the superclass correctly.
4208      * Required for MSVC.
4209      */
operator =(Image2DArray && img)4210     Image2DArray& operator = (Image2DArray &&img)
4211     {
4212         Image::operator=(std::move(img));
4213         return *this;
4214     }
4215 #endif // #if defined(CL_HPP_RVALUE_REFERENCES_SUPPORTED)
4216 };
4217 #endif // #if defined(CL_VERSION_1_2)
4218 
4219 /*! \brief Class interface for 3D Image Memory objects.
4220  *
4221  *  See Memory for details about copy semantics, etc.
4222  *
4223  *  \see Memory
4224  */
4225 class Image3D : public Image
4226 {
4227 public:
4228     /*! \brief Constructs a 3D Image in a specified context.
4229      *
4230      *  Wraps clCreateImage().
4231      */
Image3D(const Context & context,cl_mem_flags flags,ImageFormat format,::size_t width,::size_t height,::size_t depth,::size_t row_pitch=0,::size_t slice_pitch=0,void * host_ptr=NULL,cl_int * err=NULL)4232     Image3D(
4233         const Context& context,
4234         cl_mem_flags flags,
4235         ImageFormat format,
4236         ::size_t width,
4237         ::size_t height,
4238         ::size_t depth,
4239         ::size_t row_pitch = 0,
4240         ::size_t slice_pitch = 0,
4241         void* host_ptr = NULL,
4242         cl_int* err = NULL)
4243     {
4244         cl_int error;
4245         bool useCreateImage;
4246 
4247 #if defined(CL_VERSION_1_2) && defined(CL_USE_DEPRECATED_OPENCL_1_1_APIS)
4248         // Run-time decision based on the actual platform
4249         {
4250             cl_uint version = detail::getContextPlatformVersion(context());
4251             useCreateImage = (version >= 0x10002); // OpenCL 1.2 or above
4252         }
4253 #elif defined(CL_VERSION_1_2)
4254         useCreateImage = true;
4255 #else
4256         useCreateImage = false;
4257 #endif
4258 
4259 #if defined(CL_VERSION_1_2)
4260         if (useCreateImage)
4261         {
4262             cl_image_desc desc =
4263             {
4264                 CL_MEM_OBJECT_IMAGE3D,
4265                 width,
4266                 height,
4267                 depth,
4268                 0,      // array size (unused)
4269                 row_pitch,
4270                 slice_pitch,
4271                 0, 0, 0
4272             };
4273             object_ = ::clCreateImage(
4274                 context(),
4275                 flags,
4276                 &format,
4277                 &desc,
4278                 host_ptr,
4279                 &error);
4280 
4281             detail::errHandler(error, __CREATE_IMAGE_ERR);
4282             if (err != NULL) {
4283                 *err = error;
4284             }
4285         }
4286 #endif  // #if defined(CL_VERSION_1_2)
4287 #if !defined(CL_VERSION_1_2) || defined(CL_USE_DEPRECATED_OPENCL_1_1_APIS)
4288         if (!useCreateImage)
4289         {
4290             object_ = ::clCreateImage3D(
4291                 context(), flags, &format, width, height, depth, row_pitch,
4292                 slice_pitch, host_ptr, &error);
4293 
4294             detail::errHandler(error, __CREATE_IMAGE3D_ERR);
4295             if (err != NULL) {
4296                 *err = error;
4297             }
4298         }
4299 #endif // #if !defined(CL_VERSION_1_2) || defined(CL_USE_DEPRECATED_OPENCL_1_1_APIS)
4300     }
4301 
4302     //! \brief Default constructor - initializes to NULL.
Image3D()4303     Image3D() : Image() { }
4304 
4305     /*! \brief Constructor from cl_mem - takes ownership.
4306      *
4307      *  See Memory for further details.
4308      */
Image3D(const cl_mem & image3D)4309     __CL_EXPLICIT_CONSTRUCTORS Image3D(const cl_mem& image3D) : Image(image3D) { }
4310 
4311     /*! \brief Assignment from cl_mem - performs shallow copy.
4312      *
4313      *  See Memory for further details.
4314      */
operator =(const cl_mem & rhs)4315     Image3D& operator = (const cl_mem& rhs)
4316     {
4317         Image::operator=(rhs);
4318         return *this;
4319     }
4320 
4321     /*! \brief Copy constructor to forward copy to the superclass correctly.
4322      * Required for MSVC.
4323      */
Image3D(const Image3D & img)4324     Image3D(const Image3D& img) : Image(img) {}
4325 
4326     /*! \brief Copy assignment to forward copy to the superclass correctly.
4327      * Required for MSVC.
4328      */
operator =(const Image3D & img)4329     Image3D& operator = (const Image3D &img)
4330     {
4331         Image::operator=(img);
4332         return *this;
4333     }
4334 
4335 #if defined(CL_HPP_RVALUE_REFERENCES_SUPPORTED)
4336     /*! \brief Move constructor to forward move to the superclass correctly.
4337      * Required for MSVC.
4338      */
Image3D(Image3D && img)4339     Image3D(Image3D&& img) CL_HPP_NOEXCEPT : Image(std::move(img)) {}
4340 
4341     /*! \brief Move assignment to forward move to the superclass correctly.
4342      * Required for MSVC.
4343      */
operator =(Image3D && img)4344     Image3D& operator = (Image3D &&img)
4345     {
4346         Image::operator=(std::move(img));
4347         return *this;
4348     }
4349 #endif // #if defined(CL_HPP_RVALUE_REFERENCES_SUPPORTED)
4350 };
4351 
4352 #if !defined(CL_VERSION_1_2)
4353 /*! \brief Class interface for GL 3D Image Memory objects.
4354  *
4355  *  This is provided to facilitate interoperability with OpenGL.
4356  *
4357  *  See Memory for details about copy semantics, etc.
4358  *
4359  *  \see Memory
4360  */
4361 class Image3DGL : public Image3D
4362 {
4363 public:
4364     /*! \brief Constructs an Image3DGL in a specified context, from a given
4365      *         GL Texture.
4366      *
4367      *  Wraps clCreateFromGLTexture3D().
4368      */
Image3DGL(const Context & context,cl_mem_flags flags,cl_GLenum target,cl_GLint miplevel,cl_GLuint texobj,cl_int * err=NULL)4369     Image3DGL(
4370         const Context& context,
4371         cl_mem_flags flags,
4372         cl_GLenum target,
4373         cl_GLint  miplevel,
4374         cl_GLuint texobj,
4375         cl_int * err = NULL)
4376     {
4377         cl_int error;
4378         object_ = ::clCreateFromGLTexture3D(
4379             context(),
4380             flags,
4381             target,
4382             miplevel,
4383             texobj,
4384             &error);
4385 
4386         detail::errHandler(error, __CREATE_GL_TEXTURE_3D_ERR);
4387         if (err != NULL) {
4388             *err = error;
4389         }
4390     }
4391 
4392     //! \brief Default constructor - initializes to NULL.
Image3DGL()4393     Image3DGL() : Image3D() { }
4394 
4395     /*! \brief Constructor from cl_mem - takes ownership.
4396      *
4397      *  See Memory for further details.
4398      */
Image3DGL(const cl_mem & image)4399     __CL_EXPLICIT_CONSTRUCTORS Image3DGL(const cl_mem& image) : Image3D(image) { }
4400 
4401     /*! \brief Assignment from cl_mem - performs shallow copy.
4402      *
4403      *  See Memory for further details.
4404      */
operator =(const cl_mem & rhs)4405     Image3DGL& operator = (const cl_mem& rhs)
4406     {
4407         Image3D::operator=(rhs);
4408         return *this;
4409     }
4410 
4411     /*! \brief Copy constructor to forward copy to the superclass correctly.
4412      * Required for MSVC.
4413      */
Image3DGL(const Image3DGL & img)4414     Image3DGL(const Image3DGL& img) : Image3D(img) {}
4415 
4416     /*! \brief Copy assignment to forward copy to the superclass correctly.
4417      * Required for MSVC.
4418      */
operator =(const Image3DGL & img)4419     Image3DGL& operator = (const Image3DGL &img)
4420     {
4421         Image3D::operator=(img);
4422         return *this;
4423     }
4424 
4425 #if defined(CL_HPP_RVALUE_REFERENCES_SUPPORTED)
4426     /*! \brief Move constructor to forward move to the superclass correctly.
4427      * Required for MSVC.
4428      */
Image3DGL(Image3DGL && img)4429     Image3DGL(Image3DGL&& img) CL_HPP_NOEXCEPT : Image3D(std::move(img)) {}
4430 
4431     /*! \brief Move assignment to forward move to the superclass correctly.
4432      * Required for MSVC.
4433      */
operator =(Image3DGL && img)4434     Image3DGL& operator = (Image3DGL &&img)
4435     {
4436         Image3D::operator=(std::move(img));
4437         return *this;
4438     }
4439 #endif // #if defined(CL_HPP_RVALUE_REFERENCES_SUPPORTED)
4440 };
4441 #endif // #if !defined(CL_VERSION_1_2)
4442 
4443 #if defined(CL_VERSION_1_2)
4444 /*! \class ImageGL
4445  * \brief general image interface for GL interop.
4446  * We abstract the 2D and 3D GL images into a single instance here
4447  * that wraps all GL sourced images on the grounds that setup information
4448  * was performed by OpenCL anyway.
4449  */
4450 class ImageGL : public Image
4451 {
4452 public:
ImageGL(const Context & context,cl_mem_flags flags,cl_GLenum target,cl_GLint miplevel,cl_GLuint texobj,cl_int * err=NULL)4453     ImageGL(
4454         const Context& context,
4455         cl_mem_flags flags,
4456         cl_GLenum target,
4457         cl_GLint  miplevel,
4458         cl_GLuint texobj,
4459         cl_int * err = NULL)
4460     {
4461         cl_int error;
4462         object_ = ::clCreateFromGLTexture(
4463             context(),
4464             flags,
4465             target,
4466             miplevel,
4467             texobj,
4468             &error);
4469 
4470         detail::errHandler(error, __CREATE_GL_TEXTURE_ERR);
4471         if (err != NULL) {
4472             *err = error;
4473         }
4474     }
4475 
ImageGL()4476     ImageGL() : Image() { }
4477 
ImageGL(const cl_mem & image)4478     __CL_EXPLICIT_CONSTRUCTORS ImageGL(const cl_mem& image) : Image(image) { }
4479 
operator =(const cl_mem & rhs)4480     ImageGL& operator = (const cl_mem& rhs)
4481     {
4482         Image::operator=(rhs);
4483         return *this;
4484     }
4485 
4486     /*! \brief Copy constructor to forward copy to the superclass correctly.
4487      * Required for MSVC.
4488      */
ImageGL(const ImageGL & img)4489     ImageGL(const ImageGL& img) : Image(img) {}
4490 
4491     /*! \brief Copy assignment to forward copy to the superclass correctly.
4492      * Required for MSVC.
4493      */
operator =(const ImageGL & img)4494     ImageGL& operator = (const ImageGL &img)
4495     {
4496         Image::operator=(img);
4497         return *this;
4498     }
4499 
4500 #if defined(CL_HPP_RVALUE_REFERENCES_SUPPORTED)
4501     /*! \brief Move constructor to forward move to the superclass correctly.
4502      * Required for MSVC.
4503      */
ImageGL(ImageGL && img)4504     ImageGL(ImageGL&& img) CL_HPP_NOEXCEPT : Image(std::move(img)) {}
4505 
4506     /*! \brief Move assignment to forward move to the superclass correctly.
4507      * Required for MSVC.
4508      */
operator =(ImageGL && img)4509     ImageGL& operator = (ImageGL &&img)
4510     {
4511         Image::operator=(std::move(img));
4512         return *this;
4513     }
4514 #endif // #if defined(CL_HPP_RVALUE_REFERENCES_SUPPORTED)
4515 };
4516 #endif // #if defined(CL_VERSION_1_2)
4517 
4518 /*! \brief Class interface for GL Render Buffer Memory Objects.
4519 *
4520 *  This is provided to facilitate interoperability with OpenGL.
4521 *
4522 *  See Memory for details about copy semantics, etc.
4523 *
4524 *  \see Memory
4525 */
4526 class BufferRenderGL :
4527 #if defined(CL_VERSION_1_2)
4528     public ImageGL
4529 #else // #if defined(CL_VERSION_1_2)
4530     public Image2DGL
4531 #endif //#if defined(CL_VERSION_1_2)
4532 {
4533 public:
4534     /*! \brief Constructs a BufferRenderGL in a specified context, from a given
4535     *         GL Renderbuffer.
4536     *
4537     *  Wraps clCreateFromGLRenderbuffer().
4538     */
BufferRenderGL(const Context & context,cl_mem_flags flags,cl_GLuint bufobj,cl_int * err=NULL)4539     BufferRenderGL(
4540         const Context& context,
4541         cl_mem_flags flags,
4542         cl_GLuint bufobj,
4543         cl_int * err = NULL)
4544     {
4545         cl_int error;
4546         object_ = ::clCreateFromGLRenderbuffer(
4547             context(),
4548             flags,
4549             bufobj,
4550             &error);
4551 
4552         detail::errHandler(error, __CREATE_GL_RENDER_BUFFER_ERR);
4553         if (err != NULL) {
4554             *err = error;
4555         }
4556     }
4557 
4558     //! \brief Default constructor - initializes to NULL.
4559 #if defined(CL_VERSION_1_2)
BufferRenderGL()4560     BufferRenderGL() : ImageGL() {};
4561 #else // #if defined(CL_VERSION_1_2)
BufferRenderGL()4562     BufferRenderGL() : Image2DGL() {};
4563 #endif //#if defined(CL_VERSION_1_2)
4564 
4565     /*! \brief Constructor from cl_mem - takes ownership.
4566     *
4567     *  See Memory for further details.
4568     */
4569 #if defined(CL_VERSION_1_2)
BufferRenderGL(const cl_mem & buffer)4570     __CL_EXPLICIT_CONSTRUCTORS BufferRenderGL(const cl_mem& buffer) : ImageGL(buffer) { }
4571 #else // #if defined(CL_VERSION_1_2)
BufferRenderGL(const cl_mem & buffer)4572     __CL_EXPLICIT_CONSTRUCTORS BufferRenderGL(const cl_mem& buffer) : Image2DGL(buffer) { }
4573 #endif //#if defined(CL_VERSION_1_2)
4574 
4575 
4576     /*! \brief Assignment from cl_mem - performs shallow copy.
4577     *
4578     *  See Memory for further details.
4579     */
operator =(const cl_mem & rhs)4580     BufferRenderGL& operator = (const cl_mem& rhs)
4581     {
4582 #if defined(CL_VERSION_1_2)
4583         ImageGL::operator=(rhs);
4584 #else // #if defined(CL_VERSION_1_2)
4585         Image2DGL::operator=(rhs);
4586 #endif //#if defined(CL_VERSION_1_2)
4587 
4588         return *this;
4589     }
4590 
4591     /*! \brief Copy constructor to forward copy to the superclass correctly.
4592     * Required for MSVC.
4593     */
4594 #if defined(CL_VERSION_1_2)
BufferRenderGL(const BufferRenderGL & buf)4595     BufferRenderGL(const BufferRenderGL& buf) : ImageGL(buf) {}
4596 #else // #if defined(CL_VERSION_1_2)
BufferRenderGL(const BufferRenderGL & buf)4597     BufferRenderGL(const BufferRenderGL& buf) : Image2DGL(buf) {}
4598 #endif //#if defined(CL_VERSION_1_2)
4599 
4600     /*! \brief Copy assignment to forward copy to the superclass correctly.
4601     * Required for MSVC.
4602     */
operator =(const BufferRenderGL & rhs)4603     BufferRenderGL& operator = (const BufferRenderGL &rhs)
4604     {
4605 #if defined(CL_VERSION_1_2)
4606         ImageGL::operator=(rhs);
4607 #else // #if defined(CL_VERSION_1_2)
4608         Image2DGL::operator=(rhs);
4609 #endif //#if defined(CL_VERSION_1_2)
4610         return *this;
4611     }
4612 
4613 #if defined(CL_HPP_RVALUE_REFERENCES_SUPPORTED)
4614     /*! \brief Move constructor to forward move to the superclass correctly.
4615     * Required for MSVC.
4616     */
4617 #if defined(CL_VERSION_1_2)
BufferRenderGL(BufferRenderGL && buf)4618     BufferRenderGL(BufferRenderGL&& buf) CL_HPP_NOEXCEPT : ImageGL(std::move(buf)) {}
4619 #else // #if defined(CL_VERSION_1_2)
BufferRenderGL(BufferRenderGL && buf)4620     BufferRenderGL(BufferRenderGL&& buf) CL_HPP_NOEXCEPT : Image2DGL(std::move(buf)) {}
4621 #endif //#if defined(CL_VERSION_1_2)
4622 
4623 
4624     /*! \brief Move assignment to forward move to the superclass correctly.
4625     * Required for MSVC.
4626     */
operator =(BufferRenderGL && buf)4627     BufferRenderGL& operator = (BufferRenderGL &&buf)
4628     {
4629 #if defined(CL_VERSION_1_2)
4630         ImageGL::operator=(std::move(buf));
4631 #else // #if defined(CL_VERSION_1_2)
4632         Image2DGL::operator=(std::move(buf));
4633 #endif //#if defined(CL_VERSION_1_2)
4634 
4635         return *this;
4636     }
4637 #endif // #if defined(CL_HPP_RVALUE_REFERENCES_SUPPORTED)
4638 
4639     //! \brief Wrapper for clGetGLObjectInfo().
getObjectInfo(cl_gl_object_type * type,cl_GLuint * gl_object_name)4640     cl_int getObjectInfo(
4641         cl_gl_object_type *type,
4642         cl_GLuint * gl_object_name)
4643     {
4644         return detail::errHandler(
4645             ::clGetGLObjectInfo(object_, type, gl_object_name),
4646             __GET_GL_OBJECT_INFO_ERR);
4647     }
4648 };
4649 
4650 /*! \brief Class interface for cl_sampler.
4651  *
4652  *  \note Copies of these objects are shallow, meaning that the copy will refer
4653  *        to the same underlying cl_sampler as the original.  For details, see
4654  *        clRetainSampler() and clReleaseSampler().
4655  *
4656  *  \see cl_sampler
4657  */
4658 class Sampler : public detail::Wrapper<cl_sampler>
4659 {
4660 public:
4661     //! \brief Default constructor - initializes to NULL.
Sampler()4662     Sampler() { }
4663 
4664     /*! \brief Constructs a Sampler in a specified context.
4665      *
4666      *  Wraps clCreateSampler().
4667      */
Sampler(const Context & context,cl_bool normalized_coords,cl_addressing_mode addressing_mode,cl_filter_mode filter_mode,cl_int * err=NULL)4668     Sampler(
4669         const Context& context,
4670         cl_bool normalized_coords,
4671         cl_addressing_mode addressing_mode,
4672         cl_filter_mode filter_mode,
4673         cl_int* err = NULL)
4674     {
4675         cl_int error;
4676         object_ = ::clCreateSampler(
4677             context(),
4678             normalized_coords,
4679             addressing_mode,
4680             filter_mode,
4681             &error);
4682 
4683         detail::errHandler(error, __CREATE_SAMPLER_ERR);
4684         if (err != NULL) {
4685             *err = error;
4686         }
4687     }
4688 
4689     /*! \brief Constructor from cl_sampler - takes ownership.
4690      *
4691      *  This effectively transfers ownership of a refcount on the cl_sampler
4692      *  into the new Sampler object.
4693      */
Sampler(const cl_sampler & sampler)4694     __CL_EXPLICIT_CONSTRUCTORS Sampler(const cl_sampler& sampler) : detail::Wrapper<cl_type>(sampler) { }
4695 
4696     /*! \brief Assignment operator from cl_sampler - takes ownership.
4697      *
4698      *  This effectively transfers ownership of a refcount on the rhs and calls
4699      *  clReleaseSampler() on the value previously held by this instance.
4700      */
operator =(const cl_sampler & rhs)4701     Sampler& operator = (const cl_sampler& rhs)
4702     {
4703         detail::Wrapper<cl_type>::operator=(rhs);
4704         return *this;
4705     }
4706 
4707     /*! \brief Copy constructor to forward copy to the superclass correctly.
4708      * Required for MSVC.
4709      */
Sampler(const Sampler & sam)4710     Sampler(const Sampler& sam) : detail::Wrapper<cl_type>(sam) {}
4711 
4712     /*! \brief Copy assignment to forward copy to the superclass correctly.
4713      * Required for MSVC.
4714      */
operator =(const Sampler & sam)4715     Sampler& operator = (const Sampler &sam)
4716     {
4717         detail::Wrapper<cl_type>::operator=(sam);
4718         return *this;
4719     }
4720 
4721 #if defined(CL_HPP_RVALUE_REFERENCES_SUPPORTED)
4722     /*! \brief Move constructor to forward move to the superclass correctly.
4723      * Required for MSVC.
4724      */
Sampler(Sampler && sam)4725     Sampler(Sampler&& sam) CL_HPP_NOEXCEPT : detail::Wrapper<cl_type>(std::move(sam)) {}
4726 
4727     /*! \brief Move assignment to forward move to the superclass correctly.
4728      * Required for MSVC.
4729      */
operator =(Sampler && sam)4730     Sampler& operator = (Sampler &&sam)
4731     {
4732         detail::Wrapper<cl_type>::operator=(std::move(sam));
4733         return *this;
4734     }
4735 #endif // #if defined(CL_HPP_RVALUE_REFERENCES_SUPPORTED)
4736 
4737     //! \brief Wrapper for clGetSamplerInfo().
4738     template <typename T>
getInfo(cl_sampler_info name,T * param) const4739     cl_int getInfo(cl_sampler_info name, T* param) const
4740     {
4741         return detail::errHandler(
4742             detail::getInfo(&::clGetSamplerInfo, object_, name, param),
4743             __GET_SAMPLER_INFO_ERR);
4744     }
4745 
4746     //! \brief Wrapper for clGetSamplerInfo() that returns by value.
4747     template <cl_int name> typename
4748     detail::param_traits<detail::cl_sampler_info, name>::param_type
getInfo(cl_int * err=NULL) const4749     getInfo(cl_int* err = NULL) const
4750     {
4751         typename detail::param_traits<
4752             detail::cl_sampler_info, name>::param_type param;
4753         cl_int result = getInfo(name, &param);
4754         if (err != NULL) {
4755             *err = result;
4756         }
4757         return param;
4758     }
4759 };
4760 
4761 class Program;
4762 class CommandQueue;
4763 class Kernel;
4764 
4765 //! \brief Class interface for specifying NDRange values.
4766 class NDRange
4767 {
4768 private:
4769     size_t<3> sizes_;
4770     cl_uint dimensions_;
4771 
4772 public:
4773     //! \brief Default constructor - resulting range has zero dimensions.
NDRange()4774     NDRange()
4775         : dimensions_(0)
4776     { }
4777 
4778     //! \brief Constructs one-dimensional range.
NDRange(::size_t size0)4779     NDRange(::size_t size0)
4780         : dimensions_(1)
4781     {
4782         sizes_[0] = size0;
4783     }
4784 
4785     //! \brief Constructs two-dimensional range.
NDRange(::size_t size0,::size_t size1)4786     NDRange(::size_t size0, ::size_t size1)
4787         : dimensions_(2)
4788     {
4789         sizes_[0] = size0;
4790         sizes_[1] = size1;
4791     }
4792 
4793     //! \brief Constructs three-dimensional range.
NDRange(::size_t size0,::size_t size1,::size_t size2)4794     NDRange(::size_t size0, ::size_t size1, ::size_t size2)
4795         : dimensions_(3)
4796     {
4797         sizes_[0] = size0;
4798         sizes_[1] = size1;
4799         sizes_[2] = size2;
4800     }
4801 
4802     /*! \brief Conversion operator to const ::size_t *.
4803      *
4804      *  \returns a pointer to the size of the first dimension.
4805      */
operator const::size_t*() const4806     operator const ::size_t*() const {
4807         return (const ::size_t*) sizes_;
4808     }
4809 
4810     //! \brief Queries the number of dimensions in the range.
dimensions() const4811     ::size_t dimensions() const { return dimensions_; }
4812 };
4813 
4814 //! \brief A zero-dimensional range.
4815 static const NDRange NullRange;
4816 
4817 //! \brief Local address wrapper for use with Kernel::setArg
4818 struct LocalSpaceArg
4819 {
4820     ::size_t size_;
4821 };
4822 
4823 namespace detail {
4824 
4825 template <typename T>
4826 struct KernelArgumentHandler
4827 {
sizecl::detail::KernelArgumentHandler4828     static ::size_t size(const T&) { return sizeof(T); }
ptrcl::detail::KernelArgumentHandler4829     static const T* ptr(const T& value) { return &value; }
4830 };
4831 
4832 template <>
4833 struct KernelArgumentHandler<LocalSpaceArg>
4834 {
sizecl::detail::KernelArgumentHandler4835     static ::size_t size(const LocalSpaceArg& value) { return value.size_; }
ptrcl::detail::KernelArgumentHandler4836     static const void* ptr(const LocalSpaceArg&) { return NULL; }
4837 };
4838 
4839 }
4840 //! \endcond
4841 
4842 /*! __local
4843  * \brief Helper function for generating LocalSpaceArg objects.
4844  * Deprecated. Replaced with Local.
4845  */
4846 inline CL_EXT_PREFIX__VERSION_1_1_DEPRECATED LocalSpaceArg
4847 __local(::size_t size) CL_EXT_SUFFIX__VERSION_1_1_DEPRECATED;
4848 inline LocalSpaceArg
__local(::size_t size)4849 __local(::size_t size)
4850 {
4851     LocalSpaceArg ret = { size };
4852     return ret;
4853 }
4854 
4855 /*! Local
4856  * \brief Helper function for generating LocalSpaceArg objects.
4857  */
4858 inline LocalSpaceArg
Local(::size_t size)4859 Local(::size_t size)
4860 {
4861     LocalSpaceArg ret = { size };
4862     return ret;
4863 }
4864 
4865 //class KernelFunctor;
4866 
4867 /*! \brief Class interface for cl_kernel.
4868  *
4869  *  \note Copies of these objects are shallow, meaning that the copy will refer
4870  *        to the same underlying cl_kernel as the original.  For details, see
4871  *        clRetainKernel() and clReleaseKernel().
4872  *
4873  *  \see cl_kernel
4874  */
4875 class Kernel : public detail::Wrapper<cl_kernel>
4876 {
4877 public:
4878     inline Kernel(const Program& program, const char* name, cl_int* err = NULL);
4879 
4880     //! \brief Default constructor - initializes to NULL.
Kernel()4881     Kernel() { }
4882 
4883     /*! \brief Constructor from cl_kernel - takes ownership.
4884      *
4885      *  This effectively transfers ownership of a refcount on the cl_kernel
4886      *  into the new Kernel object.
4887      */
Kernel(const cl_kernel & kernel)4888     __CL_EXPLICIT_CONSTRUCTORS Kernel(const cl_kernel& kernel) : detail::Wrapper<cl_type>(kernel) { }
4889 
4890     /*! \brief Assignment operator from cl_kernel - takes ownership.
4891      *
4892      *  This effectively transfers ownership of a refcount on the rhs and calls
4893      *  clReleaseKernel() on the value previously held by this instance.
4894      */
operator =(const cl_kernel & rhs)4895     Kernel& operator = (const cl_kernel& rhs)
4896     {
4897         detail::Wrapper<cl_type>::operator=(rhs);
4898         return *this;
4899     }
4900 
4901     /*! \brief Copy constructor to forward copy to the superclass correctly.
4902      * Required for MSVC.
4903      */
Kernel(const Kernel & kernel)4904     Kernel(const Kernel& kernel) : detail::Wrapper<cl_type>(kernel) {}
4905 
4906     /*! \brief Copy assignment to forward copy to the superclass correctly.
4907      * Required for MSVC.
4908      */
operator =(const Kernel & kernel)4909     Kernel& operator = (const Kernel &kernel)
4910     {
4911         detail::Wrapper<cl_type>::operator=(kernel);
4912         return *this;
4913     }
4914 
4915 #if defined(CL_HPP_RVALUE_REFERENCES_SUPPORTED)
4916     /*! \brief Move constructor to forward move to the superclass correctly.
4917      * Required for MSVC.
4918      */
Kernel(Kernel && kernel)4919     Kernel(Kernel&& kernel) CL_HPP_NOEXCEPT : detail::Wrapper<cl_type>(std::move(kernel)) {}
4920 
4921     /*! \brief Move assignment to forward move to the superclass correctly.
4922      * Required for MSVC.
4923      */
operator =(Kernel && kernel)4924     Kernel& operator = (Kernel &&kernel)
4925     {
4926         detail::Wrapper<cl_type>::operator=(std::move(kernel));
4927         return *this;
4928     }
4929 #endif // #if defined(CL_HPP_RVALUE_REFERENCES_SUPPORTED)
4930 
4931     template <typename T>
getInfo(cl_kernel_info name,T * param) const4932     cl_int getInfo(cl_kernel_info name, T* param) const
4933     {
4934         return detail::errHandler(
4935             detail::getInfo(&::clGetKernelInfo, object_, name, param),
4936             __GET_KERNEL_INFO_ERR);
4937     }
4938 
4939     template <cl_int name> typename
4940     detail::param_traits<detail::cl_kernel_info, name>::param_type
getInfo(cl_int * err=NULL) const4941     getInfo(cl_int* err = NULL) const
4942     {
4943         typename detail::param_traits<
4944             detail::cl_kernel_info, name>::param_type param;
4945         cl_int result = getInfo(name, &param);
4946         if (err != NULL) {
4947             *err = result;
4948         }
4949         return param;
4950     }
4951 
4952 #if defined(CL_VERSION_1_2)
4953     template <typename T>
getArgInfo(cl_uint argIndex,cl_kernel_arg_info name,T * param) const4954     cl_int getArgInfo(cl_uint argIndex, cl_kernel_arg_info name, T* param) const
4955     {
4956         return detail::errHandler(
4957             detail::getInfo(&::clGetKernelArgInfo, object_, argIndex, name, param),
4958             __GET_KERNEL_ARG_INFO_ERR);
4959     }
4960 
4961     template <cl_int name> typename
4962     detail::param_traits<detail::cl_kernel_arg_info, name>::param_type
getArgInfo(cl_uint argIndex,cl_int * err=NULL) const4963     getArgInfo(cl_uint argIndex, cl_int* err = NULL) const
4964     {
4965         typename detail::param_traits<
4966             detail::cl_kernel_arg_info, name>::param_type param;
4967         cl_int result = getArgInfo(argIndex, name, &param);
4968         if (err != NULL) {
4969             *err = result;
4970         }
4971         return param;
4972     }
4973 #endif // #if defined(CL_VERSION_1_2)
4974 
4975     template <typename T>
getWorkGroupInfo(const Device & device,cl_kernel_work_group_info name,T * param) const4976     cl_int getWorkGroupInfo(
4977         const Device& device, cl_kernel_work_group_info name, T* param) const
4978     {
4979         return detail::errHandler(
4980             detail::getInfo(
4981                 &::clGetKernelWorkGroupInfo, object_, device(), name, param),
4982                 __GET_KERNEL_WORK_GROUP_INFO_ERR);
4983     }
4984 
4985     template <cl_int name> typename
4986     detail::param_traits<detail::cl_kernel_work_group_info, name>::param_type
getWorkGroupInfo(const Device & device,cl_int * err=NULL) const4987         getWorkGroupInfo(const Device& device, cl_int* err = NULL) const
4988     {
4989         typename detail::param_traits<
4990         detail::cl_kernel_work_group_info, name>::param_type param;
4991         cl_int result = getWorkGroupInfo(device, name, &param);
4992         if (err != NULL) {
4993             *err = result;
4994         }
4995         return param;
4996     }
4997 
4998     template <typename T>
setArg(cl_uint index,const T & value)4999     cl_int setArg(cl_uint index, const T &value)
5000     {
5001         return detail::errHandler(
5002             ::clSetKernelArg(
5003                 object_,
5004                 index,
5005                 detail::KernelArgumentHandler<T>::size(value),
5006                 detail::KernelArgumentHandler<T>::ptr(value)),
5007             __SET_KERNEL_ARGS_ERR);
5008     }
5009 
setArg(cl_uint index,::size_t size,const void * argPtr)5010     cl_int setArg(cl_uint index, ::size_t size, const void* argPtr)
5011     {
5012         return detail::errHandler(
5013             ::clSetKernelArg(object_, index, size, argPtr),
5014             __SET_KERNEL_ARGS_ERR);
5015     }
5016 };
5017 
5018 /*! \class Program
5019  * \brief Program interface that implements cl_program.
5020  */
5021 class Program : public detail::Wrapper<cl_program>
5022 {
5023 public:
5024     typedef VECTOR_CLASS<std::pair<const void*, ::size_t> > Binaries;
5025     typedef VECTOR_CLASS<std::pair<const char*, ::size_t> > Sources;
5026 
Program(const STRING_CLASS & source,bool build=false,cl_int * err=NULL)5027     Program(
5028         const STRING_CLASS& source,
5029         bool build = false,
5030         cl_int* err = NULL)
5031     {
5032         cl_int error;
5033 
5034         const char * strings = source.c_str();
5035         const ::size_t length  = source.size();
5036 
5037         Context context = Context::getDefault(err);
5038 
5039         object_ = ::clCreateProgramWithSource(
5040             context(), (cl_uint)1, &strings, &length, &error);
5041 
5042         detail::errHandler(error, __CREATE_PROGRAM_WITH_SOURCE_ERR);
5043 
5044         if (error == CL_SUCCESS && build) {
5045 
5046             error = ::clBuildProgram(
5047                 object_,
5048                 0,
5049                 NULL,
5050                 "",
5051                 NULL,
5052                 NULL);
5053 
5054             detail::errHandler(error, __BUILD_PROGRAM_ERR);
5055         }
5056 
5057         if (err != NULL) {
5058             *err = error;
5059         }
5060     }
5061 
Program(const Context & context,const STRING_CLASS & source,bool build=false,cl_int * err=NULL)5062     Program(
5063         const Context& context,
5064         const STRING_CLASS& source,
5065         bool build = false,
5066         cl_int* err = NULL)
5067     {
5068         cl_int error;
5069 
5070         const char * strings = source.c_str();
5071         const ::size_t length  = source.size();
5072 
5073         object_ = ::clCreateProgramWithSource(
5074             context(), (cl_uint)1, &strings, &length, &error);
5075 
5076         detail::errHandler(error, __CREATE_PROGRAM_WITH_SOURCE_ERR);
5077 
5078         if (error == CL_SUCCESS && build) {
5079 
5080             error = ::clBuildProgram(
5081                 object_,
5082                 0,
5083                 NULL,
5084                 "",
5085                 NULL,
5086                 NULL);
5087 
5088             detail::errHandler(error, __BUILD_PROGRAM_ERR);
5089         }
5090 
5091         if (err != NULL) {
5092             *err = error;
5093         }
5094     }
5095 
Program(const Context & context,const Sources & sources,cl_int * err=NULL)5096     Program(
5097         const Context& context,
5098         const Sources& sources,
5099         cl_int* err = NULL)
5100     {
5101         cl_int error;
5102 
5103         const ::size_t n = (::size_t)sources.size();
5104         ::size_t* lengths = (::size_t*) alloca(n * sizeof(::size_t));
5105         const char** strings = (const char**) alloca(n * sizeof(const char*));
5106 
5107         for (::size_t i = 0; i < n; ++i) {
5108             strings[i] = sources[(int)i].first;
5109             lengths[i] = sources[(int)i].second;
5110         }
5111 
5112         object_ = ::clCreateProgramWithSource(
5113             context(), (cl_uint)n, strings, lengths, &error);
5114 
5115         detail::errHandler(error, __CREATE_PROGRAM_WITH_SOURCE_ERR);
5116         if (err != NULL) {
5117             *err = error;
5118         }
5119     }
5120 
5121     /**
5122      * Construct a program object from a list of devices and a per-device list of binaries.
5123      * \param context A valid OpenCL context in which to construct the program.
5124      * \param devices A vector of OpenCL device objects for which the program will be created.
5125      * \param binaries A vector of pairs of a pointer to a binary object and its length.
5126      * \param binaryStatus An optional vector that on completion will be resized to
5127      *   match the size of binaries and filled with values to specify if each binary
5128      *   was successfully loaded.
5129      *   Set to CL_SUCCESS if the binary was successfully loaded.
5130      *   Set to CL_INVALID_VALUE if the length is 0 or the binary pointer is NULL.
5131      *   Set to CL_INVALID_BINARY if the binary provided is not valid for the matching device.
5132      * \param err if non-NULL will be set to CL_SUCCESS on successful operation or one of the following errors:
5133      *   CL_INVALID_CONTEXT if context is not a valid context.
5134      *   CL_INVALID_VALUE if the length of devices is zero; or if the length of binaries does not match the length of devices;
5135      *     or if any entry in binaries is NULL or has length 0.
5136      *   CL_INVALID_DEVICE if OpenCL devices listed in devices are not in the list of devices associated with context.
5137      *   CL_INVALID_BINARY if an invalid program binary was encountered for any device. binaryStatus will return specific status for each device.
5138      *   CL_OUT_OF_HOST_MEMORY if there is a failure to allocate resources required by the OpenCL implementation on the host.
5139      */
Program(const Context & context,const VECTOR_CLASS<Device> & devices,const Binaries & binaries,VECTOR_CLASS<cl_int> * binaryStatus=NULL,cl_int * err=NULL)5140     Program(
5141         const Context& context,
5142         const VECTOR_CLASS<Device>& devices,
5143         const Binaries& binaries,
5144         VECTOR_CLASS<cl_int>* binaryStatus = NULL,
5145         cl_int* err = NULL)
5146     {
5147         cl_int error;
5148 
5149         const ::size_t numDevices = devices.size();
5150 
5151         // Catch size mismatch early and return
5152         if(binaries.size() != numDevices) {
5153             error = CL_INVALID_VALUE;
5154             detail::errHandler(error, __CREATE_PROGRAM_WITH_BINARY_ERR);
5155             if (err != NULL) {
5156                 *err = error;
5157             }
5158             return;
5159         }
5160 
5161         ::size_t* lengths = (::size_t*) alloca(numDevices * sizeof(::size_t));
5162         const unsigned char** images = (const unsigned char**) alloca(numDevices * sizeof(const unsigned char**));
5163 
5164         for (::size_t i = 0; i < numDevices; ++i) {
5165             images[i] = (const unsigned char*)binaries[i].first;
5166             lengths[i] = binaries[(int)i].second;
5167         }
5168 
5169         cl_device_id* deviceIDs = (cl_device_id*) alloca(numDevices * sizeof(cl_device_id));
5170         for( ::size_t deviceIndex = 0; deviceIndex < numDevices; ++deviceIndex ) {
5171             deviceIDs[deviceIndex] = (devices[deviceIndex])();
5172         }
5173 
5174         if(binaryStatus) {
5175             binaryStatus->resize(numDevices);
5176         }
5177 
5178         object_ = ::clCreateProgramWithBinary(
5179             context(), (cl_uint) devices.size(),
5180             deviceIDs,
5181             lengths, images, (binaryStatus != NULL && numDevices > 0)
5182                ? &binaryStatus->front()
5183                : NULL, &error);
5184 
5185         detail::errHandler(error, __CREATE_PROGRAM_WITH_BINARY_ERR);
5186         if (err != NULL) {
5187             *err = error;
5188         }
5189     }
5190 
5191 
5192 #if defined(CL_VERSION_1_2)
5193     /**
5194      * Create program using builtin kernels.
5195      * \param kernelNames Semi-colon separated list of builtin kernel names
5196      */
Program(const Context & context,const VECTOR_CLASS<Device> & devices,const STRING_CLASS & kernelNames,cl_int * err=NULL)5197     Program(
5198         const Context& context,
5199         const VECTOR_CLASS<Device>& devices,
5200         const STRING_CLASS& kernelNames,
5201         cl_int* err = NULL)
5202     {
5203         cl_int error;
5204 
5205 
5206         ::size_t numDevices = devices.size();
5207         cl_device_id* deviceIDs = (cl_device_id*) alloca(numDevices * sizeof(cl_device_id));
5208         for( ::size_t deviceIndex = 0; deviceIndex < numDevices; ++deviceIndex ) {
5209             deviceIDs[deviceIndex] = (devices[deviceIndex])();
5210         }
5211 
5212         object_ = ::clCreateProgramWithBuiltInKernels(
5213             context(),
5214             (cl_uint) devices.size(),
5215             deviceIDs,
5216             kernelNames.c_str(),
5217             &error);
5218 
5219         detail::errHandler(error, __CREATE_PROGRAM_WITH_BUILT_IN_KERNELS_ERR);
5220         if (err != NULL) {
5221             *err = error;
5222         }
5223     }
5224 #endif // #if defined(CL_VERSION_1_2)
5225 
Program()5226     Program() { }
5227 
Program(const cl_program & program)5228     __CL_EXPLICIT_CONSTRUCTORS Program(const cl_program& program) : detail::Wrapper<cl_type>(program) { }
5229 
operator =(const cl_program & rhs)5230     Program& operator = (const cl_program& rhs)
5231     {
5232         detail::Wrapper<cl_type>::operator=(rhs);
5233         return *this;
5234     }
5235 
5236     /*! \brief Copy constructor to forward copy to the superclass correctly.
5237      * Required for MSVC.
5238      */
Program(const Program & program)5239     Program(const Program& program) : detail::Wrapper<cl_type>(program) {}
5240 
5241     /*! \brief Copy assignment to forward copy to the superclass correctly.
5242      * Required for MSVC.
5243      */
operator =(const Program & program)5244     Program& operator = (const Program &program)
5245     {
5246         detail::Wrapper<cl_type>::operator=(program);
5247         return *this;
5248     }
5249 
5250 #if defined(CL_HPP_RVALUE_REFERENCES_SUPPORTED)
5251     /*! \brief Move constructor to forward move to the superclass correctly.
5252      * Required for MSVC.
5253      */
Program(Program && program)5254     Program(Program&& program) CL_HPP_NOEXCEPT : detail::Wrapper<cl_type>(std::move(program)) {}
5255 
5256     /*! \brief Move assignment to forward move to the superclass correctly.
5257      * Required for MSVC.
5258      */
operator =(Program && program)5259     Program& operator = (Program &&program)
5260     {
5261         detail::Wrapper<cl_type>::operator=(std::move(program));
5262         return *this;
5263     }
5264 #endif // #if defined(CL_HPP_RVALUE_REFERENCES_SUPPORTED)
5265 
build(const VECTOR_CLASS<Device> & devices,const char * options=NULL,void (CL_CALLBACK * notifyFptr)(cl_program,void *)=NULL,void * data=NULL) const5266     cl_int build(
5267         const VECTOR_CLASS<Device>& devices,
5268         const char* options = NULL,
5269         void (CL_CALLBACK * notifyFptr)(cl_program, void *) = NULL,
5270         void* data = NULL) const
5271     {
5272         ::size_t numDevices = devices.size();
5273         cl_device_id* deviceIDs = (cl_device_id*) alloca(numDevices * sizeof(cl_device_id));
5274         for( ::size_t deviceIndex = 0; deviceIndex < numDevices; ++deviceIndex ) {
5275             deviceIDs[deviceIndex] = (devices[deviceIndex])();
5276         }
5277 
5278         return detail::errHandler(
5279             ::clBuildProgram(
5280                 object_,
5281                 (cl_uint)
5282                 devices.size(),
5283                 deviceIDs,
5284                 options,
5285                 notifyFptr,
5286                 data),
5287                 __BUILD_PROGRAM_ERR);
5288     }
5289 
build(const char * options=NULL,void (CL_CALLBACK * notifyFptr)(cl_program,void *)=NULL,void * data=NULL) const5290     cl_int build(
5291         const char* options = NULL,
5292         void (CL_CALLBACK * notifyFptr)(cl_program, void *) = NULL,
5293         void* data = NULL) const
5294     {
5295         return detail::errHandler(
5296             ::clBuildProgram(
5297                 object_,
5298                 0,
5299                 NULL,
5300                 options,
5301                 notifyFptr,
5302                 data),
5303                 __BUILD_PROGRAM_ERR);
5304     }
5305 
5306 #if defined(CL_VERSION_1_2)
compile(const char * options=NULL,void (CL_CALLBACK * notifyFptr)(cl_program,void *)=NULL,void * data=NULL) const5307     cl_int compile(
5308         const char* options = NULL,
5309         void (CL_CALLBACK * notifyFptr)(cl_program, void *) = NULL,
5310         void* data = NULL) const
5311     {
5312         return detail::errHandler(
5313             ::clCompileProgram(
5314                 object_,
5315                 0,
5316                 NULL,
5317                 options,
5318                 0,
5319                 NULL,
5320                 NULL,
5321                 notifyFptr,
5322                 data),
5323                 __COMPILE_PROGRAM_ERR);
5324     }
5325 #endif
5326 
5327     template <typename T>
getInfo(cl_program_info name,T * param) const5328     cl_int getInfo(cl_program_info name, T* param) const
5329     {
5330         return detail::errHandler(
5331             detail::getInfo(&::clGetProgramInfo, object_, name, param),
5332             __GET_PROGRAM_INFO_ERR);
5333     }
5334 
5335     template <cl_int name> typename
5336     detail::param_traits<detail::cl_program_info, name>::param_type
getInfo(cl_int * err=NULL) const5337     getInfo(cl_int* err = NULL) const
5338     {
5339         typename detail::param_traits<
5340             detail::cl_program_info, name>::param_type param;
5341         cl_int result = getInfo(name, &param);
5342         if (err != NULL) {
5343             *err = result;
5344         }
5345         return param;
5346     }
5347 
5348     template <typename T>
getBuildInfo(const Device & device,cl_program_build_info name,T * param) const5349     cl_int getBuildInfo(
5350         const Device& device, cl_program_build_info name, T* param) const
5351     {
5352         return detail::errHandler(
5353             detail::getInfo(
5354                 &::clGetProgramBuildInfo, object_, device(), name, param),
5355                 __GET_PROGRAM_BUILD_INFO_ERR);
5356     }
5357 
5358     template <cl_int name> typename
5359     detail::param_traits<detail::cl_program_build_info, name>::param_type
getBuildInfo(const Device & device,cl_int * err=NULL) const5360     getBuildInfo(const Device& device, cl_int* err = NULL) const
5361     {
5362         typename detail::param_traits<
5363             detail::cl_program_build_info, name>::param_type param;
5364         cl_int result = getBuildInfo(device, name, &param);
5365         if (err != NULL) {
5366             *err = result;
5367         }
5368         return param;
5369     }
5370 
createKernels(VECTOR_CLASS<Kernel> * kernels)5371     cl_int createKernels(VECTOR_CLASS<Kernel>* kernels)
5372     {
5373         cl_uint numKernels;
5374         cl_int err = ::clCreateKernelsInProgram(object_, 0, NULL, &numKernels);
5375         if (err != CL_SUCCESS) {
5376             return detail::errHandler(err, __CREATE_KERNELS_IN_PROGRAM_ERR);
5377         }
5378 
5379         Kernel* value = (Kernel*) alloca(numKernels * sizeof(Kernel));
5380         err = ::clCreateKernelsInProgram(
5381             object_, numKernels, (cl_kernel*) value, NULL);
5382         if (err != CL_SUCCESS) {
5383             return detail::errHandler(err, __CREATE_KERNELS_IN_PROGRAM_ERR);
5384         }
5385 
5386         kernels->assign(&value[0], &value[numKernels]);
5387         return CL_SUCCESS;
5388     }
5389 };
5390 
5391 #if defined(CL_VERSION_1_2)
linkProgram(Program input1,Program input2,const char * options=NULL,void (CL_CALLBACK * notifyFptr)(cl_program,void *)=NULL,void * data=NULL,cl_int * err=NULL)5392 inline Program linkProgram(
5393     Program input1,
5394     Program input2,
5395     const char* options = NULL,
5396     void (CL_CALLBACK * notifyFptr)(cl_program, void *) = NULL,
5397     void* data = NULL,
5398     cl_int* err = NULL)
5399 {
5400     cl_int error_local = CL_SUCCESS;
5401 
5402     cl_program programs[2] = { input1(), input2() };
5403 
5404     Context ctx = input1.getInfo<CL_PROGRAM_CONTEXT>(&error_local);
5405     if(error_local!=CL_SUCCESS) {
5406         detail::errHandler(error_local, __LINK_PROGRAM_ERR);
5407     }
5408 
5409     cl_program prog = ::clLinkProgram(
5410         ctx(),
5411         0,
5412         NULL,
5413         options,
5414         2,
5415         programs,
5416         notifyFptr,
5417         data,
5418         &error_local);
5419 
5420     detail::errHandler(error_local,__COMPILE_PROGRAM_ERR);
5421     if (err != NULL) {
5422         *err = error_local;
5423     }
5424 
5425     return Program(prog);
5426 }
5427 
linkProgram(VECTOR_CLASS<Program> inputPrograms,const char * options=NULL,void (CL_CALLBACK * notifyFptr)(cl_program,void *)=NULL,void * data=NULL,cl_int * err=NULL)5428 inline Program linkProgram(
5429     VECTOR_CLASS<Program> inputPrograms,
5430     const char* options = NULL,
5431     void (CL_CALLBACK * notifyFptr)(cl_program, void *) = NULL,
5432     void* data = NULL,
5433     cl_int* err = NULL)
5434 {
5435     cl_int error_local = CL_SUCCESS;
5436 
5437     cl_program * programs = (cl_program*) alloca(inputPrograms.size() * sizeof(cl_program));
5438 
5439     if (programs != NULL) {
5440         for (unsigned int i = 0; i < inputPrograms.size(); i++) {
5441           programs[i] = inputPrograms[i]();
5442         }
5443     }
5444 
5445     Context ctx;
5446     if(inputPrograms.size() > 0) {
5447         ctx = inputPrograms[0].getInfo<CL_PROGRAM_CONTEXT>(&error_local);
5448         if(error_local!=CL_SUCCESS) {
5449             detail::errHandler(error_local, __LINK_PROGRAM_ERR);
5450         }
5451     }
5452     cl_program prog = ::clLinkProgram(
5453         ctx(),
5454         0,
5455         NULL,
5456         options,
5457         (cl_uint)inputPrograms.size(),
5458         programs,
5459         notifyFptr,
5460         data,
5461         &error_local);
5462 
5463     detail::errHandler(error_local,__COMPILE_PROGRAM_ERR);
5464     if (err != NULL) {
5465         *err = error_local;
5466     }
5467 
5468     return Program(prog);
5469 }
5470 #endif
5471 
5472 template<>
getInfo(cl_int * err) const5473 inline VECTOR_CLASS<char *> cl::Program::getInfo<CL_PROGRAM_BINARIES>(cl_int* err) const
5474 {
5475     VECTOR_CLASS< ::size_t> sizes = getInfo<CL_PROGRAM_BINARY_SIZES>();
5476     VECTOR_CLASS<char *> binaries;
5477     for (VECTOR_CLASS< ::size_t>::iterator s = sizes.begin(); s != sizes.end(); ++s)
5478     {
5479         char *ptr = NULL;
5480         if (*s != 0)
5481             ptr = new char[*s];
5482         binaries.push_back(ptr);
5483     }
5484 
5485     cl_int result = getInfo(CL_PROGRAM_BINARIES, &binaries);
5486     if (err != NULL) {
5487         *err = result;
5488     }
5489     return binaries;
5490 }
5491 
Kernel(const Program & program,const char * name,cl_int * err)5492 inline Kernel::Kernel(const Program& program, const char* name, cl_int* err)
5493 {
5494     cl_int error;
5495 
5496     object_ = ::clCreateKernel(program(), name, &error);
5497     detail::errHandler(error, __CREATE_KERNEL_ERR);
5498 
5499     if (err != NULL) {
5500         *err = error;
5501     }
5502 
5503 }
5504 
5505 /*! \class CommandQueue
5506  * \brief CommandQueue interface for cl_command_queue.
5507  */
5508 class CommandQueue : public detail::Wrapper<cl_command_queue>
5509 {
5510 private:
5511 #ifdef CL_HPP_CPP11_ATOMICS_SUPPORTED
5512     static std::atomic<int> default_initialized_;
5513 #else // !CL_HPP_CPP11_ATOMICS_SUPPORTED
5514     static volatile int default_initialized_;
5515 #endif // !CL_HPP_CPP11_ATOMICS_SUPPORTED
5516     static CommandQueue default_;
5517     static volatile cl_int default_error_;
5518 public:
CommandQueue(cl_command_queue_properties properties,cl_int * err=NULL)5519    CommandQueue(
5520         cl_command_queue_properties properties,
5521         cl_int* err = NULL)
5522     {
5523         cl_int error;
5524 
5525         Context context = Context::getDefault(&error);
5526         detail::errHandler(error, __CREATE_CONTEXT_ERR);
5527 
5528         if (error != CL_SUCCESS) {
5529             if (err != NULL) {
5530                 *err = error;
5531             }
5532         }
5533         else {
5534             Device device = context.getInfo<CL_CONTEXT_DEVICES>()[0];
5535 
5536             object_ = ::clCreateCommandQueue(
5537                 context(), device(), properties, &error);
5538 
5539             detail::errHandler(error, __CREATE_COMMAND_QUEUE_ERR);
5540             if (err != NULL) {
5541                 *err = error;
5542             }
5543         }
5544     }
5545     /*!
5546     * \brief Constructs a CommandQueue for an implementation defined device in the given context
5547     */
CommandQueue(const Context & context,cl_command_queue_properties properties=0,cl_int * err=NULL)5548     explicit CommandQueue(
5549         const Context& context,
5550         cl_command_queue_properties properties = 0,
5551         cl_int* err = NULL)
5552     {
5553         cl_int error;
5554         VECTOR_CLASS<cl::Device> devices;
5555         error = context.getInfo(CL_CONTEXT_DEVICES, &devices);
5556 
5557         detail::errHandler(error, __CREATE_CONTEXT_ERR);
5558 
5559         if (error != CL_SUCCESS)
5560         {
5561             if (err != NULL) {
5562                 *err = error;
5563             }
5564             return;
5565         }
5566 
5567         object_ = ::clCreateCommandQueue(context(), devices[0](), properties, &error);
5568 
5569         detail::errHandler(error, __CREATE_COMMAND_QUEUE_ERR);
5570 
5571         if (err != NULL) {
5572             *err = error;
5573         }
5574 
5575     }
5576 
CommandQueue(const Context & context,const Device & device,cl_command_queue_properties properties=0,cl_int * err=NULL)5577     CommandQueue(
5578         const Context& context,
5579         const Device& device,
5580         cl_command_queue_properties properties = 0,
5581         cl_int* err = NULL)
5582     {
5583         cl_int error;
5584         object_ = ::clCreateCommandQueue(
5585             context(), device(), properties, &error);
5586 
5587         detail::errHandler(error, __CREATE_COMMAND_QUEUE_ERR);
5588         if (err != NULL) {
5589             *err = error;
5590         }
5591     }
5592 
5593     /*! \brief Copy constructor to forward copy to the superclass correctly.
5594      * Required for MSVC.
5595      */
CommandQueue(const CommandQueue & queue)5596     CommandQueue(const CommandQueue& queue) : detail::Wrapper<cl_type>(queue) {}
5597 
5598     /*! \brief Copy assignment to forward copy to the superclass correctly.
5599      * Required for MSVC.
5600      */
operator =(const CommandQueue & queue)5601     CommandQueue& operator = (const CommandQueue &queue)
5602     {
5603         detail::Wrapper<cl_type>::operator=(queue);
5604         return *this;
5605     }
5606 
5607 #if defined(CL_HPP_RVALUE_REFERENCES_SUPPORTED)
5608     /*! \brief Move constructor to forward move to the superclass correctly.
5609      * Required for MSVC.
5610      */
CommandQueue(CommandQueue && queue)5611     CommandQueue(CommandQueue&& queue) CL_HPP_NOEXCEPT : detail::Wrapper<cl_type>(std::move(queue)) {}
5612 
5613     /*! \brief Move assignment to forward move to the superclass correctly.
5614      * Required for MSVC.
5615      */
operator =(CommandQueue && queue)5616     CommandQueue& operator = (CommandQueue &&queue)
5617     {
5618         detail::Wrapper<cl_type>::operator=(std::move(queue));
5619         return *this;
5620     }
5621 #endif // #if defined(CL_HPP_RVALUE_REFERENCES_SUPPORTED)
5622 
getDefault(cl_int * err=NULL)5623     static CommandQueue getDefault(cl_int * err = NULL)
5624     {
5625         int state = detail::compare_exchange(
5626             &default_initialized_,
5627             __DEFAULT_BEING_INITIALIZED, __DEFAULT_NOT_INITIALIZED);
5628 
5629         if (state & __DEFAULT_INITIALIZED) {
5630             if (err != NULL) {
5631                 *err = default_error_;
5632             }
5633             return default_;
5634         }
5635 
5636         if (state & __DEFAULT_BEING_INITIALIZED) {
5637               // Assume writes will propagate eventually...
5638               while(default_initialized_ != __DEFAULT_INITIALIZED) {
5639                   detail::fence();
5640               }
5641 
5642             if (err != NULL) {
5643                 *err = default_error_;
5644             }
5645             return default_;
5646         }
5647 
5648         cl_int error;
5649 
5650         Context context = Context::getDefault(&error);
5651         detail::errHandler(error, __CREATE_COMMAND_QUEUE_ERR);
5652 
5653         if (error != CL_SUCCESS) {
5654             if (err != NULL) {
5655                 *err = error;
5656             }
5657         }
5658         else {
5659             Device device = context.getInfo<CL_CONTEXT_DEVICES>()[0];
5660 
5661             default_ = CommandQueue(context, device, 0, &error);
5662 
5663             detail::errHandler(error, __CREATE_COMMAND_QUEUE_ERR);
5664             if (err != NULL) {
5665                 *err = error;
5666             }
5667         }
5668 
5669         detail::fence();
5670 
5671         default_error_ = error;
5672         // Assume writes will propagate eventually...
5673         default_initialized_ = __DEFAULT_INITIALIZED;
5674 
5675         detail::fence();
5676 
5677         if (err != NULL) {
5678             *err = default_error_;
5679         }
5680         return default_;
5681 
5682     }
5683 
CommandQueue()5684     CommandQueue() { }
5685 
CommandQueue(const cl_command_queue & commandQueue)5686     __CL_EXPLICIT_CONSTRUCTORS CommandQueue(const cl_command_queue& commandQueue) : detail::Wrapper<cl_type>(commandQueue) { }
5687 
operator =(const cl_command_queue & rhs)5688     CommandQueue& operator = (const cl_command_queue& rhs)
5689     {
5690         detail::Wrapper<cl_type>::operator=(rhs);
5691         return *this;
5692     }
5693 
5694     template <typename T>
getInfo(cl_command_queue_info name,T * param) const5695     cl_int getInfo(cl_command_queue_info name, T* param) const
5696     {
5697         return detail::errHandler(
5698             detail::getInfo(
5699                 &::clGetCommandQueueInfo, object_, name, param),
5700                 __GET_COMMAND_QUEUE_INFO_ERR);
5701     }
5702 
5703     template <cl_int name> typename
5704     detail::param_traits<detail::cl_command_queue_info, name>::param_type
getInfo(cl_int * err=NULL) const5705     getInfo(cl_int* err = NULL) const
5706     {
5707         typename detail::param_traits<
5708             detail::cl_command_queue_info, name>::param_type param;
5709         cl_int result = getInfo(name, &param);
5710         if (err != NULL) {
5711             *err = result;
5712         }
5713         return param;
5714     }
5715 
enqueueReadBuffer(const Buffer & buffer,cl_bool blocking,::size_t offset,::size_t size,void * ptr,const VECTOR_CLASS<Event> * events=NULL,Event * event=NULL) const5716     cl_int enqueueReadBuffer(
5717         const Buffer& buffer,
5718         cl_bool blocking,
5719         ::size_t offset,
5720         ::size_t size,
5721         void* ptr,
5722         const VECTOR_CLASS<Event>* events = NULL,
5723         Event* event = NULL) const
5724     {
5725         cl_event tmp;
5726         cl_int err = detail::errHandler(
5727             ::clEnqueueReadBuffer(
5728                 object_, buffer(), blocking, offset, size,
5729                 ptr,
5730                 (events != NULL) ? (cl_uint) events->size() : 0,
5731                 (events != NULL && events->size() > 0) ? (cl_event*) &events->front() : NULL,
5732                 (event != NULL) ? &tmp : NULL),
5733             __ENQUEUE_READ_BUFFER_ERR);
5734 
5735         if (event != NULL && err == CL_SUCCESS)
5736             *event = tmp;
5737 
5738         return err;
5739     }
5740 
enqueueWriteBuffer(const Buffer & buffer,cl_bool blocking,::size_t offset,::size_t size,const void * ptr,const VECTOR_CLASS<Event> * events=NULL,Event * event=NULL) const5741     cl_int enqueueWriteBuffer(
5742         const Buffer& buffer,
5743         cl_bool blocking,
5744         ::size_t offset,
5745         ::size_t size,
5746         const void* ptr,
5747         const VECTOR_CLASS<Event>* events = NULL,
5748         Event* event = NULL) const
5749     {
5750         cl_event tmp;
5751         cl_int err = detail::errHandler(
5752             ::clEnqueueWriteBuffer(
5753                 object_, buffer(), blocking, offset, size,
5754                 ptr,
5755                 (events != NULL) ? (cl_uint) events->size() : 0,
5756                 (events != NULL && events->size() > 0) ? (cl_event*) &events->front() : NULL,
5757                 (event != NULL) ? &tmp : NULL),
5758                 __ENQUEUE_WRITE_BUFFER_ERR);
5759 
5760         if (event != NULL && err == CL_SUCCESS)
5761             *event = tmp;
5762 
5763         return err;
5764     }
5765 
enqueueCopyBuffer(const Buffer & src,const Buffer & dst,::size_t src_offset,::size_t dst_offset,::size_t size,const VECTOR_CLASS<Event> * events=NULL,Event * event=NULL) const5766     cl_int enqueueCopyBuffer(
5767         const Buffer& src,
5768         const Buffer& dst,
5769         ::size_t src_offset,
5770         ::size_t dst_offset,
5771         ::size_t size,
5772         const VECTOR_CLASS<Event>* events = NULL,
5773         Event* event = NULL) const
5774     {
5775         cl_event tmp;
5776         cl_int err = detail::errHandler(
5777             ::clEnqueueCopyBuffer(
5778                 object_, src(), dst(), src_offset, dst_offset, size,
5779                 (events != NULL) ? (cl_uint) events->size() : 0,
5780                 (events != NULL && events->size() > 0) ? (cl_event*) &events->front() : NULL,
5781                 (event != NULL) ? &tmp : NULL),
5782             __ENQEUE_COPY_BUFFER_ERR);
5783 
5784         if (event != NULL && err == CL_SUCCESS)
5785             *event = tmp;
5786 
5787         return err;
5788     }
5789 #if defined(CL_VERSION_1_1)
5790 
enqueueReadBufferRect(const Buffer & buffer,cl_bool blocking,const size_t<3> & buffer_offset,const size_t<3> & host_offset,const size_t<3> & region,::size_t buffer_row_pitch,::size_t buffer_slice_pitch,::size_t host_row_pitch,::size_t host_slice_pitch,void * ptr,const VECTOR_CLASS<Event> * events=NULL,Event * event=NULL) const5791     cl_int enqueueReadBufferRect(
5792         const Buffer& buffer,
5793         cl_bool blocking,
5794         const size_t<3>& buffer_offset,
5795         const size_t<3>& host_offset,
5796         const size_t<3>& region,
5797         ::size_t buffer_row_pitch,
5798         ::size_t buffer_slice_pitch,
5799         ::size_t host_row_pitch,
5800         ::size_t host_slice_pitch,
5801         void *ptr,
5802         const VECTOR_CLASS<Event>* events = NULL,
5803         Event* event = NULL) const
5804     {
5805         cl_event tmp;
5806         cl_int err = detail::errHandler(
5807             ::clEnqueueReadBufferRect(
5808                 object_,
5809                 buffer(),
5810                 blocking,
5811                 (const ::size_t *)buffer_offset,
5812                 (const ::size_t *)host_offset,
5813                 (const ::size_t *)region,
5814                 buffer_row_pitch,
5815                 buffer_slice_pitch,
5816                 host_row_pitch,
5817                 host_slice_pitch,
5818                 ptr,
5819                 (events != NULL) ? (cl_uint) events->size() : 0,
5820                 (events != NULL && events->size() > 0) ? (cl_event*) &events->front() : NULL,
5821                 (event != NULL) ? &tmp : NULL),
5822                 __ENQUEUE_READ_BUFFER_RECT_ERR);
5823 
5824         if (event != NULL && err == CL_SUCCESS)
5825             *event = tmp;
5826 
5827         return err;
5828     }
5829 
enqueueWriteBufferRect(const Buffer & buffer,cl_bool blocking,const size_t<3> & buffer_offset,const size_t<3> & host_offset,const size_t<3> & region,::size_t buffer_row_pitch,::size_t buffer_slice_pitch,::size_t host_row_pitch,::size_t host_slice_pitch,const void * ptr,const VECTOR_CLASS<Event> * events=NULL,Event * event=NULL) const5830     cl_int enqueueWriteBufferRect(
5831         const Buffer& buffer,
5832         cl_bool blocking,
5833         const size_t<3>& buffer_offset,
5834         const size_t<3>& host_offset,
5835         const size_t<3>& region,
5836         ::size_t buffer_row_pitch,
5837         ::size_t buffer_slice_pitch,
5838         ::size_t host_row_pitch,
5839         ::size_t host_slice_pitch,
5840         const void *ptr,
5841         const VECTOR_CLASS<Event>* events = NULL,
5842         Event* event = NULL) const
5843     {
5844         cl_event tmp;
5845         cl_int err = detail::errHandler(
5846             ::clEnqueueWriteBufferRect(
5847                 object_,
5848                 buffer(),
5849                 blocking,
5850                 (const ::size_t *)buffer_offset,
5851                 (const ::size_t *)host_offset,
5852                 (const ::size_t *)region,
5853                 buffer_row_pitch,
5854                 buffer_slice_pitch,
5855                 host_row_pitch,
5856                 host_slice_pitch,
5857                 ptr,
5858                 (events != NULL) ? (cl_uint) events->size() : 0,
5859                 (events != NULL && events->size() > 0) ? (cl_event*) &events->front() : NULL,
5860                 (event != NULL) ? &tmp : NULL),
5861                 __ENQUEUE_WRITE_BUFFER_RECT_ERR);
5862 
5863         if (event != NULL && err == CL_SUCCESS)
5864             *event = tmp;
5865 
5866         return err;
5867     }
5868 
enqueueCopyBufferRect(const Buffer & src,const Buffer & dst,const size_t<3> & src_origin,const size_t<3> & dst_origin,const size_t<3> & region,::size_t src_row_pitch,::size_t src_slice_pitch,::size_t dst_row_pitch,::size_t dst_slice_pitch,const VECTOR_CLASS<Event> * events=NULL,Event * event=NULL) const5869     cl_int enqueueCopyBufferRect(
5870         const Buffer& src,
5871         const Buffer& dst,
5872         const size_t<3>& src_origin,
5873         const size_t<3>& dst_origin,
5874         const size_t<3>& region,
5875         ::size_t src_row_pitch,
5876         ::size_t src_slice_pitch,
5877         ::size_t dst_row_pitch,
5878         ::size_t dst_slice_pitch,
5879         const VECTOR_CLASS<Event>* events = NULL,
5880         Event* event = NULL) const
5881     {
5882         cl_event tmp;
5883         cl_int err = detail::errHandler(
5884             ::clEnqueueCopyBufferRect(
5885                 object_,
5886                 src(),
5887                 dst(),
5888                 (const ::size_t *)src_origin,
5889                 (const ::size_t *)dst_origin,
5890                 (const ::size_t *)region,
5891                 src_row_pitch,
5892                 src_slice_pitch,
5893                 dst_row_pitch,
5894                 dst_slice_pitch,
5895                 (events != NULL) ? (cl_uint) events->size() : 0,
5896                 (events != NULL && events->size() > 0) ? (cl_event*) &events->front() : NULL,
5897                 (event != NULL) ? &tmp : NULL),
5898             __ENQEUE_COPY_BUFFER_RECT_ERR);
5899 
5900         if (event != NULL && err == CL_SUCCESS)
5901             *event = tmp;
5902 
5903         return err;
5904     }
5905 #endif //if defined(CL_VERSION_1_1)
5906 
5907 #if defined(CL_VERSION_1_2)
5908     /**
5909      * Enqueue a command to fill a buffer object with a pattern
5910      * of a given size. The pattern is specified a as vector.
5911      * \tparam PatternType The datatype of the pattern field.
5912      *     The pattern type must be an accepted OpenCL data type.
5913      */
5914     template<typename PatternType>
enqueueFillBuffer(const Buffer & buffer,PatternType pattern,::size_t offset,::size_t size,const VECTOR_CLASS<Event> * events=NULL,Event * event=NULL) const5915     cl_int enqueueFillBuffer(
5916         const Buffer& buffer,
5917         PatternType pattern,
5918         ::size_t offset,
5919         ::size_t size,
5920         const VECTOR_CLASS<Event>* events = NULL,
5921         Event* event = NULL) const
5922     {
5923         cl_event tmp;
5924         cl_int err = detail::errHandler(
5925             ::clEnqueueFillBuffer(
5926                 object_,
5927                 buffer(),
5928                 static_cast<void*>(&pattern),
5929                 sizeof(PatternType),
5930                 offset,
5931                 size,
5932                 (events != NULL) ? (cl_uint) events->size() : 0,
5933                 (events != NULL && events->size() > 0) ? (cl_event*) &events->front() : NULL,
5934                 (event != NULL) ? &tmp : NULL),
5935                 __ENQUEUE_FILL_BUFFER_ERR);
5936 
5937         if (event != NULL && err == CL_SUCCESS)
5938             *event = tmp;
5939 
5940         return err;
5941     }
5942 #endif // #if defined(CL_VERSION_1_2)
5943 
enqueueReadImage(const Image & image,cl_bool blocking,const size_t<3> & origin,const size_t<3> & region,::size_t row_pitch,::size_t slice_pitch,void * ptr,const VECTOR_CLASS<Event> * events=NULL,Event * event=NULL) const5944     cl_int enqueueReadImage(
5945         const Image& image,
5946         cl_bool blocking,
5947         const size_t<3>& origin,
5948         const size_t<3>& region,
5949         ::size_t row_pitch,
5950         ::size_t slice_pitch,
5951         void* ptr,
5952         const VECTOR_CLASS<Event>* events = NULL,
5953         Event* event = NULL) const
5954     {
5955         cl_event tmp;
5956         cl_int err = detail::errHandler(
5957             ::clEnqueueReadImage(
5958                 object_, image(), blocking, (const ::size_t *) origin,
5959                 (const ::size_t *) region, row_pitch, slice_pitch, ptr,
5960                 (events != NULL) ? (cl_uint) events->size() : 0,
5961                 (events != NULL && events->size() > 0) ? (cl_event*) &events->front() : NULL,
5962                 (event != NULL) ? &tmp : NULL),
5963             __ENQUEUE_READ_IMAGE_ERR);
5964 
5965         if (event != NULL && err == CL_SUCCESS)
5966             *event = tmp;
5967 
5968         return err;
5969     }
5970 
enqueueWriteImage(const Image & image,cl_bool blocking,const size_t<3> & origin,const size_t<3> & region,::size_t row_pitch,::size_t slice_pitch,const void * ptr,const VECTOR_CLASS<Event> * events=NULL,Event * event=NULL) const5971     cl_int enqueueWriteImage(
5972         const Image& image,
5973         cl_bool blocking,
5974         const size_t<3>& origin,
5975         const size_t<3>& region,
5976         ::size_t row_pitch,
5977         ::size_t slice_pitch,
5978         const void* ptr,
5979         const VECTOR_CLASS<Event>* events = NULL,
5980         Event* event = NULL) const
5981     {
5982         cl_event tmp;
5983         cl_int err = detail::errHandler(
5984             ::clEnqueueWriteImage(
5985                 object_, image(), blocking, (const ::size_t *) origin,
5986                 (const ::size_t *) region, row_pitch, slice_pitch, ptr,
5987                 (events != NULL) ? (cl_uint) events->size() : 0,
5988                 (events != NULL && events->size() > 0) ? (cl_event*) &events->front() : NULL,
5989                 (event != NULL) ? &tmp : NULL),
5990             __ENQUEUE_WRITE_IMAGE_ERR);
5991 
5992         if (event != NULL && err == CL_SUCCESS)
5993             *event = tmp;
5994 
5995         return err;
5996     }
5997 
enqueueCopyImage(const Image & src,const Image & dst,const size_t<3> & src_origin,const size_t<3> & dst_origin,const size_t<3> & region,const VECTOR_CLASS<Event> * events=NULL,Event * event=NULL) const5998     cl_int enqueueCopyImage(
5999         const Image& src,
6000         const Image& dst,
6001         const size_t<3>& src_origin,
6002         const size_t<3>& dst_origin,
6003         const size_t<3>& region,
6004         const VECTOR_CLASS<Event>* events = NULL,
6005         Event* event = NULL) const
6006     {
6007         cl_event tmp;
6008         cl_int err = detail::errHandler(
6009             ::clEnqueueCopyImage(
6010                 object_, src(), dst(), (const ::size_t *) src_origin,
6011                 (const ::size_t *)dst_origin, (const ::size_t *) region,
6012                 (events != NULL) ? (cl_uint) events->size() : 0,
6013                 (events != NULL && events->size() > 0) ? (cl_event*) &events->front() : NULL,
6014                 (event != NULL) ? &tmp : NULL),
6015             __ENQUEUE_COPY_IMAGE_ERR);
6016 
6017         if (event != NULL && err == CL_SUCCESS)
6018             *event = tmp;
6019 
6020         return err;
6021     }
6022 
6023 #if defined(CL_VERSION_1_2)
6024     /**
6025      * Enqueue a command to fill an image object with a specified color.
6026      * \param fillColor is the color to use to fill the image.
6027      *     This is a four component RGBA floating-point color value if
6028      *     the image channel data type is not an unnormalized signed or
6029      *     unsigned data type.
6030      */
enqueueFillImage(const Image & image,cl_float4 fillColor,const size_t<3> & origin,const size_t<3> & region,const VECTOR_CLASS<Event> * events=NULL,Event * event=NULL) const6031     cl_int enqueueFillImage(
6032         const Image& image,
6033         cl_float4 fillColor,
6034         const size_t<3>& origin,
6035         const size_t<3>& region,
6036         const VECTOR_CLASS<Event>* events = NULL,
6037         Event* event = NULL) const
6038     {
6039         cl_event tmp;
6040         cl_int err = detail::errHandler(
6041             ::clEnqueueFillImage(
6042                 object_,
6043                 image(),
6044                 static_cast<void*>(&fillColor),
6045                 (const ::size_t *) origin,
6046                 (const ::size_t *) region,
6047                 (events != NULL) ? (cl_uint) events->size() : 0,
6048                 (events != NULL && events->size() > 0) ? (cl_event*) &events->front() : NULL,
6049                 (event != NULL) ? &tmp : NULL),
6050                 __ENQUEUE_FILL_IMAGE_ERR);
6051 
6052         if (event != NULL && err == CL_SUCCESS)
6053             *event = tmp;
6054 
6055         return err;
6056     }
6057 
6058     /**
6059      * Enqueue a command to fill an image object with a specified color.
6060      * \param fillColor is the color to use to fill the image.
6061      *     This is a four component RGBA signed integer color value if
6062      *     the image channel data type is an unnormalized signed integer
6063      *     type.
6064      */
enqueueFillImage(const Image & image,cl_int4 fillColor,const size_t<3> & origin,const size_t<3> & region,const VECTOR_CLASS<Event> * events=NULL,Event * event=NULL) const6065     cl_int enqueueFillImage(
6066         const Image& image,
6067         cl_int4 fillColor,
6068         const size_t<3>& origin,
6069         const size_t<3>& region,
6070         const VECTOR_CLASS<Event>* events = NULL,
6071         Event* event = NULL) const
6072     {
6073         cl_event tmp;
6074         cl_int err = detail::errHandler(
6075             ::clEnqueueFillImage(
6076                 object_,
6077                 image(),
6078                 static_cast<void*>(&fillColor),
6079                 (const ::size_t *) origin,
6080                 (const ::size_t *) region,
6081                 (events != NULL) ? (cl_uint) events->size() : 0,
6082                 (events != NULL && events->size() > 0) ? (cl_event*) &events->front() : NULL,
6083                 (event != NULL) ? &tmp : NULL),
6084                 __ENQUEUE_FILL_IMAGE_ERR);
6085 
6086         if (event != NULL && err == CL_SUCCESS)
6087             *event = tmp;
6088 
6089         return err;
6090     }
6091 
6092     /**
6093      * Enqueue a command to fill an image object with a specified color.
6094      * \param fillColor is the color to use to fill the image.
6095      *     This is a four component RGBA unsigned integer color value if
6096      *     the image channel data type is an unnormalized unsigned integer
6097      *     type.
6098      */
enqueueFillImage(const Image & image,cl_uint4 fillColor,const size_t<3> & origin,const size_t<3> & region,const VECTOR_CLASS<Event> * events=NULL,Event * event=NULL) const6099     cl_int enqueueFillImage(
6100         const Image& image,
6101         cl_uint4 fillColor,
6102         const size_t<3>& origin,
6103         const size_t<3>& region,
6104         const VECTOR_CLASS<Event>* events = NULL,
6105         Event* event = NULL) const
6106     {
6107         cl_event tmp;
6108         cl_int err = detail::errHandler(
6109             ::clEnqueueFillImage(
6110                 object_,
6111                 image(),
6112                 static_cast<void*>(&fillColor),
6113                 (const ::size_t *) origin,
6114                 (const ::size_t *) region,
6115                 (events != NULL) ? (cl_uint) events->size() : 0,
6116                 (events != NULL && events->size() > 0) ? (cl_event*) &events->front() : NULL,
6117                 (event != NULL) ? &tmp : NULL),
6118                 __ENQUEUE_FILL_IMAGE_ERR);
6119 
6120         if (event != NULL && err == CL_SUCCESS)
6121             *event = tmp;
6122 
6123         return err;
6124     }
6125 #endif // #if defined(CL_VERSION_1_2)
6126 
enqueueCopyImageToBuffer(const Image & src,const Buffer & dst,const size_t<3> & src_origin,const size_t<3> & region,::size_t dst_offset,const VECTOR_CLASS<Event> * events=NULL,Event * event=NULL) const6127     cl_int enqueueCopyImageToBuffer(
6128         const Image& src,
6129         const Buffer& dst,
6130         const size_t<3>& src_origin,
6131         const size_t<3>& region,
6132         ::size_t dst_offset,
6133         const VECTOR_CLASS<Event>* events = NULL,
6134         Event* event = NULL) const
6135     {
6136         cl_event tmp;
6137         cl_int err = detail::errHandler(
6138             ::clEnqueueCopyImageToBuffer(
6139                 object_, src(), dst(), (const ::size_t *) src_origin,
6140                 (const ::size_t *) region, dst_offset,
6141                 (events != NULL) ? (cl_uint) events->size() : 0,
6142                 (events != NULL && events->size() > 0) ? (cl_event*) &events->front() : NULL,
6143                 (event != NULL) ? &tmp : NULL),
6144             __ENQUEUE_COPY_IMAGE_TO_BUFFER_ERR);
6145 
6146         if (event != NULL && err == CL_SUCCESS)
6147             *event = tmp;
6148 
6149         return err;
6150     }
6151 
enqueueCopyBufferToImage(const Buffer & src,const Image & dst,::size_t src_offset,const size_t<3> & dst_origin,const size_t<3> & region,const VECTOR_CLASS<Event> * events=NULL,Event * event=NULL) const6152     cl_int enqueueCopyBufferToImage(
6153         const Buffer& src,
6154         const Image& dst,
6155         ::size_t src_offset,
6156         const size_t<3>& dst_origin,
6157         const size_t<3>& region,
6158         const VECTOR_CLASS<Event>* events = NULL,
6159         Event* event = NULL) const
6160     {
6161         cl_event tmp;
6162         cl_int err = detail::errHandler(
6163             ::clEnqueueCopyBufferToImage(
6164                 object_, src(), dst(), src_offset,
6165                 (const ::size_t *) dst_origin, (const ::size_t *) region,
6166                 (events != NULL) ? (cl_uint) events->size() : 0,
6167                 (events != NULL && events->size() > 0) ? (cl_event*) &events->front() : NULL,
6168                 (event != NULL) ? &tmp : NULL),
6169             __ENQUEUE_COPY_BUFFER_TO_IMAGE_ERR);
6170 
6171         if (event != NULL && err == CL_SUCCESS)
6172             *event = tmp;
6173 
6174         return err;
6175     }
6176 
enqueueMapBuffer(const Buffer & buffer,cl_bool blocking,cl_map_flags flags,::size_t offset,::size_t size,const VECTOR_CLASS<Event> * events=NULL,Event * event=NULL,cl_int * err=NULL) const6177     void* enqueueMapBuffer(
6178         const Buffer& buffer,
6179         cl_bool blocking,
6180         cl_map_flags flags,
6181         ::size_t offset,
6182         ::size_t size,
6183         const VECTOR_CLASS<Event>* events = NULL,
6184         Event* event = NULL,
6185         cl_int* err = NULL) const
6186     {
6187         cl_event tmp;
6188         cl_int error;
6189         void * result = ::clEnqueueMapBuffer(
6190             object_, buffer(), blocking, flags, offset, size,
6191             (events != NULL) ? (cl_uint) events->size() : 0,
6192             (events != NULL && events->size() > 0) ? (cl_event*) &events->front() : NULL,
6193             (event != NULL) ? &tmp : NULL,
6194             &error);
6195 
6196         detail::errHandler(error, __ENQUEUE_MAP_BUFFER_ERR);
6197         if (err != NULL) {
6198             *err = error;
6199         }
6200         if (event != NULL && error == CL_SUCCESS)
6201             *event = tmp;
6202 
6203         return result;
6204     }
6205 
enqueueMapImage(const Image & buffer,cl_bool blocking,cl_map_flags flags,const size_t<3> & origin,const size_t<3> & region,::size_t * row_pitch,::size_t * slice_pitch,const VECTOR_CLASS<Event> * events=NULL,Event * event=NULL,cl_int * err=NULL) const6206     void* enqueueMapImage(
6207         const Image& buffer,
6208         cl_bool blocking,
6209         cl_map_flags flags,
6210         const size_t<3>& origin,
6211         const size_t<3>& region,
6212         ::size_t * row_pitch,
6213         ::size_t * slice_pitch,
6214         const VECTOR_CLASS<Event>* events = NULL,
6215         Event* event = NULL,
6216         cl_int* err = NULL) const
6217     {
6218         cl_event tmp;
6219         cl_int error;
6220         void * result = ::clEnqueueMapImage(
6221             object_, buffer(), blocking, flags,
6222             (const ::size_t *) origin, (const ::size_t *) region,
6223             row_pitch, slice_pitch,
6224             (events != NULL) ? (cl_uint) events->size() : 0,
6225             (events != NULL && events->size() > 0) ? (cl_event*) &events->front() : NULL,
6226             (event != NULL) ? &tmp : NULL,
6227             &error);
6228 
6229         detail::errHandler(error, __ENQUEUE_MAP_IMAGE_ERR);
6230         if (err != NULL) {
6231               *err = error;
6232         }
6233         if (event != NULL && error == CL_SUCCESS)
6234             *event = tmp;
6235         return result;
6236     }
6237 
enqueueUnmapMemObject(const Memory & memory,void * mapped_ptr,const VECTOR_CLASS<Event> * events=NULL,Event * event=NULL) const6238     cl_int enqueueUnmapMemObject(
6239         const Memory& memory,
6240         void* mapped_ptr,
6241         const VECTOR_CLASS<Event>* events = NULL,
6242         Event* event = NULL) const
6243     {
6244         cl_event tmp;
6245         cl_int err = detail::errHandler(
6246             ::clEnqueueUnmapMemObject(
6247                 object_, memory(), mapped_ptr,
6248                 (events != NULL) ? (cl_uint) events->size() : 0,
6249                 (events != NULL && events->size() > 0) ? (cl_event*) &events->front() : NULL,
6250                 (event != NULL) ? &tmp : NULL),
6251             __ENQUEUE_UNMAP_MEM_OBJECT_ERR);
6252 
6253         if (event != NULL && err == CL_SUCCESS)
6254             *event = tmp;
6255 
6256         return err;
6257     }
6258 
6259 #if defined(CL_VERSION_1_2)
6260     /**
6261      * Enqueues a marker command which waits for either a list of events to complete,
6262      * or all previously enqueued commands to complete.
6263      *
6264      * Enqueues a marker command which waits for either a list of events to complete,
6265      * or if the list is empty it waits for all commands previously enqueued in command_queue
6266      * to complete before it completes. This command returns an event which can be waited on,
6267      * i.e. this event can be waited on to insure that all events either in the event_wait_list
6268      * or all previously enqueued commands, queued before this command to command_queue,
6269      * have completed.
6270      */
enqueueMarkerWithWaitList(const VECTOR_CLASS<Event> * events=0,Event * event=0) const6271     cl_int enqueueMarkerWithWaitList(
6272         const VECTOR_CLASS<Event> *events = 0,
6273         Event *event = 0) const
6274     {
6275         cl_event tmp;
6276         cl_int err = detail::errHandler(
6277             ::clEnqueueMarkerWithWaitList(
6278                 object_,
6279                 (events != NULL) ? (cl_uint) events->size() : 0,
6280                 (events != NULL && events->size() > 0) ? (cl_event*) &events->front() : NULL,
6281                 (event != NULL) ? &tmp : NULL),
6282             __ENQUEUE_MARKER_WAIT_LIST_ERR);
6283 
6284         if (event != NULL && err == CL_SUCCESS)
6285             *event = tmp;
6286 
6287         return err;
6288     }
6289 
6290     /**
6291      * A synchronization point that enqueues a barrier operation.
6292      *
6293      * Enqueues a barrier command which waits for either a list of events to complete,
6294      * or if the list is empty it waits for all commands previously enqueued in command_queue
6295      * to complete before it completes. This command blocks command execution, that is, any
6296      * following commands enqueued after it do not execute until it completes. This command
6297      * returns an event which can be waited on, i.e. this event can be waited on to insure that
6298      * all events either in the event_wait_list or all previously enqueued commands, queued
6299      * before this command to command_queue, have completed.
6300      */
enqueueBarrierWithWaitList(const VECTOR_CLASS<Event> * events=0,Event * event=0) const6301     cl_int enqueueBarrierWithWaitList(
6302         const VECTOR_CLASS<Event> *events = 0,
6303         Event *event = 0) const
6304     {
6305         cl_event tmp;
6306         cl_int err = detail::errHandler(
6307             ::clEnqueueBarrierWithWaitList(
6308                 object_,
6309                 (events != NULL) ? (cl_uint) events->size() : 0,
6310                 (events != NULL && events->size() > 0) ? (cl_event*) &events->front() : NULL,
6311                 (event != NULL) ? &tmp : NULL),
6312             __ENQUEUE_BARRIER_WAIT_LIST_ERR);
6313 
6314         if (event != NULL && err == CL_SUCCESS)
6315             *event = tmp;
6316 
6317         return err;
6318     }
6319 
6320     /**
6321      * Enqueues a command to indicate with which device a set of memory objects
6322      * should be associated.
6323      */
enqueueMigrateMemObjects(const VECTOR_CLASS<Memory> & memObjects,cl_mem_migration_flags flags,const VECTOR_CLASS<Event> * events=NULL,Event * event=NULL) const6324     cl_int enqueueMigrateMemObjects(
6325         const VECTOR_CLASS<Memory> &memObjects,
6326         cl_mem_migration_flags flags,
6327         const VECTOR_CLASS<Event>* events = NULL,
6328         Event* event = NULL
6329         ) const
6330     {
6331         cl_event tmp;
6332 
6333         cl_mem* localMemObjects = static_cast<cl_mem*>(alloca(memObjects.size() * sizeof(cl_mem)));
6334         for( int i = 0; i < (int)memObjects.size(); ++i ) {
6335             localMemObjects[i] = memObjects[i]();
6336         }
6337 
6338 
6339         cl_int err = detail::errHandler(
6340             ::clEnqueueMigrateMemObjects(
6341                 object_,
6342                 (cl_uint)memObjects.size(),
6343                 static_cast<const cl_mem*>(localMemObjects),
6344                 flags,
6345                 (events != NULL) ? (cl_uint) events->size() : 0,
6346                 (events != NULL && events->size() > 0) ? (cl_event*) &events->front() : NULL,
6347                 (event != NULL) ? &tmp : NULL),
6348             __ENQUEUE_UNMAP_MEM_OBJECT_ERR);
6349 
6350         if (event != NULL && err == CL_SUCCESS)
6351             *event = tmp;
6352 
6353         return err;
6354     }
6355 #endif // #if defined(CL_VERSION_1_2)
6356 
enqueueNDRangeKernel(const Kernel & kernel,const NDRange & offset,const NDRange & global,const NDRange & local=NullRange,const VECTOR_CLASS<Event> * events=NULL,Event * event=NULL) const6357     cl_int enqueueNDRangeKernel(
6358         const Kernel& kernel,
6359         const NDRange& offset,
6360         const NDRange& global,
6361         const NDRange& local = NullRange,
6362         const VECTOR_CLASS<Event>* events = NULL,
6363         Event* event = NULL) const
6364     {
6365         cl_event tmp;
6366         cl_int err = detail::errHandler(
6367             ::clEnqueueNDRangeKernel(
6368                 object_, kernel(), (cl_uint) global.dimensions(),
6369                 offset.dimensions() != 0 ? (const ::size_t*) offset : NULL,
6370                 (const ::size_t*) global,
6371                 local.dimensions() != 0 ? (const ::size_t*) local : NULL,
6372                 (events != NULL) ? (cl_uint) events->size() : 0,
6373                 (events != NULL && events->size() > 0) ? (cl_event*) &events->front() : NULL,
6374                 (event != NULL) ? &tmp : NULL),
6375             __ENQUEUE_NDRANGE_KERNEL_ERR);
6376 
6377         if (event != NULL && err == CL_SUCCESS)
6378             *event = tmp;
6379 
6380         return err;
6381     }
6382 
enqueueTask(const Kernel & kernel,const VECTOR_CLASS<Event> * events=NULL,Event * event=NULL) const6383     cl_int enqueueTask(
6384         const Kernel& kernel,
6385         const VECTOR_CLASS<Event>* events = NULL,
6386         Event* event = NULL) const
6387     {
6388         cl_event tmp;
6389         cl_int err = detail::errHandler(
6390             ::clEnqueueTask(
6391                 object_, kernel(),
6392                 (events != NULL) ? (cl_uint) events->size() : 0,
6393                 (events != NULL && events->size() > 0) ? (cl_event*) &events->front() : NULL,
6394                 (event != NULL) ? &tmp : NULL),
6395             __ENQUEUE_TASK_ERR);
6396 
6397         if (event != NULL && err == CL_SUCCESS)
6398             *event = tmp;
6399 
6400         return err;
6401     }
6402 
enqueueNativeKernel(void (CL_CALLBACK * userFptr)(void *),std::pair<void *,::size_t> args,const VECTOR_CLASS<Memory> * mem_objects=NULL,const VECTOR_CLASS<const void * > * mem_locs=NULL,const VECTOR_CLASS<Event> * events=NULL,Event * event=NULL) const6403     cl_int enqueueNativeKernel(
6404         void (CL_CALLBACK *userFptr)(void *),
6405         std::pair<void*, ::size_t> args,
6406         const VECTOR_CLASS<Memory>* mem_objects = NULL,
6407         const VECTOR_CLASS<const void*>* mem_locs = NULL,
6408         const VECTOR_CLASS<Event>* events = NULL,
6409         Event* event = NULL) const
6410     {
6411         cl_mem * mems = (mem_objects != NULL && mem_objects->size() > 0)
6412             ? (cl_mem*) alloca(mem_objects->size() * sizeof(cl_mem))
6413             : NULL;
6414 
6415         if (mems != NULL) {
6416             for (unsigned int i = 0; i < mem_objects->size(); i++) {
6417                 mems[i] = ((*mem_objects)[i])();
6418             }
6419         }
6420 
6421         cl_event tmp;
6422         cl_int err = detail::errHandler(
6423             ::clEnqueueNativeKernel(
6424                 object_, userFptr, args.first, args.second,
6425                 (mem_objects != NULL) ? (cl_uint) mem_objects->size() : 0,
6426                 mems,
6427                 (mem_locs != NULL && mem_locs->size() > 0) ? (const void **) &mem_locs->front() : NULL,
6428                 (events != NULL) ? (cl_uint) events->size() : 0,
6429                 (events != NULL && events->size() > 0) ? (cl_event*) &events->front() : NULL,
6430                 (event != NULL) ? &tmp : NULL),
6431             __ENQUEUE_NATIVE_KERNEL);
6432 
6433         if (event != NULL && err == CL_SUCCESS)
6434             *event = tmp;
6435 
6436         return err;
6437     }
6438 
6439 /**
6440  * Deprecated APIs for 1.2
6441  */
6442 #if defined(CL_USE_DEPRECATED_OPENCL_1_1_APIS) || (defined(CL_VERSION_1_1) && !defined(CL_VERSION_1_2))
6443     CL_EXT_PREFIX__VERSION_1_1_DEPRECATED
enqueueMarker(Event * event=NULL) const6444     cl_int enqueueMarker(Event* event = NULL) const CL_EXT_SUFFIX__VERSION_1_1_DEPRECATED
6445     {
6446         cl_event tmp;
6447         cl_int err = detail::errHandler(
6448             ::clEnqueueMarker(
6449                 object_,
6450                 (event != NULL) ? &tmp : NULL),
6451             __ENQUEUE_MARKER_ERR);
6452 
6453         if (event != NULL && err == CL_SUCCESS)
6454             *event = tmp;
6455 
6456         return err;
6457     }
6458 
6459     CL_EXT_PREFIX__VERSION_1_1_DEPRECATED
enqueueWaitForEvents(const VECTOR_CLASS<Event> & events) const6460     cl_int enqueueWaitForEvents(const VECTOR_CLASS<Event>& events) const CL_EXT_SUFFIX__VERSION_1_1_DEPRECATED
6461     {
6462         return detail::errHandler(
6463             ::clEnqueueWaitForEvents(
6464                 object_,
6465                 (cl_uint) events.size(),
6466                 events.size() > 0 ? (const cl_event*) &events.front() : NULL),
6467             __ENQUEUE_WAIT_FOR_EVENTS_ERR);
6468     }
6469 #endif // #if defined(CL_VERSION_1_1)
6470 
enqueueAcquireGLObjects(const VECTOR_CLASS<Memory> * mem_objects=NULL,const VECTOR_CLASS<Event> * events=NULL,Event * event=NULL) const6471     cl_int enqueueAcquireGLObjects(
6472          const VECTOR_CLASS<Memory>* mem_objects = NULL,
6473          const VECTOR_CLASS<Event>* events = NULL,
6474          Event* event = NULL) const
6475      {
6476         cl_event tmp;
6477         cl_int err = detail::errHandler(
6478              ::clEnqueueAcquireGLObjects(
6479                  object_,
6480                  (mem_objects != NULL) ? (cl_uint) mem_objects->size() : 0,
6481                  (mem_objects != NULL && mem_objects->size() > 0) ? (const cl_mem *) &mem_objects->front(): NULL,
6482                  (events != NULL) ? (cl_uint) events->size() : 0,
6483                  (events != NULL && events->size() > 0) ? (cl_event*) &events->front() : NULL,
6484                  (event != NULL) ? &tmp : NULL),
6485              __ENQUEUE_ACQUIRE_GL_ERR);
6486 
6487         if (event != NULL && err == CL_SUCCESS)
6488             *event = tmp;
6489 
6490         return err;
6491      }
6492 
enqueueReleaseGLObjects(const VECTOR_CLASS<Memory> * mem_objects=NULL,const VECTOR_CLASS<Event> * events=NULL,Event * event=NULL) const6493     cl_int enqueueReleaseGLObjects(
6494          const VECTOR_CLASS<Memory>* mem_objects = NULL,
6495          const VECTOR_CLASS<Event>* events = NULL,
6496          Event* event = NULL) const
6497      {
6498         cl_event tmp;
6499         cl_int err = detail::errHandler(
6500              ::clEnqueueReleaseGLObjects(
6501                  object_,
6502                  (mem_objects != NULL) ? (cl_uint) mem_objects->size() : 0,
6503                  (mem_objects != NULL && mem_objects->size() > 0) ? (const cl_mem *) &mem_objects->front(): NULL,
6504                  (events != NULL) ? (cl_uint) events->size() : 0,
6505                  (events != NULL && events->size() > 0) ? (cl_event*) &events->front() : NULL,
6506                  (event != NULL) ? &tmp : NULL),
6507              __ENQUEUE_RELEASE_GL_ERR);
6508 
6509         if (event != NULL && err == CL_SUCCESS)
6510             *event = tmp;
6511 
6512         return err;
6513      }
6514 
6515 #if defined (USE_DX_INTEROP)
6516 typedef CL_API_ENTRY cl_int (CL_API_CALL *PFN_clEnqueueAcquireD3D10ObjectsKHR)(
6517     cl_command_queue command_queue, cl_uint num_objects,
6518     const cl_mem* mem_objects, cl_uint num_events_in_wait_list,
6519     const cl_event* event_wait_list, cl_event* event);
6520 typedef CL_API_ENTRY cl_int (CL_API_CALL *PFN_clEnqueueReleaseD3D10ObjectsKHR)(
6521     cl_command_queue command_queue, cl_uint num_objects,
6522     const cl_mem* mem_objects,  cl_uint num_events_in_wait_list,
6523     const cl_event* event_wait_list, cl_event* event);
6524 
enqueueAcquireD3D10Objects(const VECTOR_CLASS<Memory> * mem_objects=NULL,const VECTOR_CLASS<Event> * events=NULL,Event * event=NULL) const6525     cl_int enqueueAcquireD3D10Objects(
6526          const VECTOR_CLASS<Memory>* mem_objects = NULL,
6527          const VECTOR_CLASS<Event>* events = NULL,
6528          Event* event = NULL) const
6529     {
6530         static PFN_clEnqueueAcquireD3D10ObjectsKHR pfn_clEnqueueAcquireD3D10ObjectsKHR = NULL;
6531 #if defined(CL_VERSION_1_2)
6532         cl_context context = getInfo<CL_QUEUE_CONTEXT>();
6533         cl::Device device(getInfo<CL_QUEUE_DEVICE>());
6534         cl_platform_id platform = device.getInfo<CL_DEVICE_PLATFORM>();
6535         __INIT_CL_EXT_FCN_PTR_PLATFORM(platform, clEnqueueAcquireD3D10ObjectsKHR);
6536 #endif
6537 #if defined(CL_VERSION_1_1)
6538         __INIT_CL_EXT_FCN_PTR(clEnqueueAcquireD3D10ObjectsKHR);
6539 #endif
6540 
6541         cl_event tmp;
6542         cl_int err = detail::errHandler(
6543              pfn_clEnqueueAcquireD3D10ObjectsKHR(
6544                  object_,
6545                  (mem_objects != NULL) ? (cl_uint) mem_objects->size() : 0,
6546                  (mem_objects != NULL && mem_objects->size() > 0) ? (const cl_mem *) &mem_objects->front(): NULL,
6547                  (events != NULL) ? (cl_uint) events->size() : 0,
6548                  (events != NULL) ? (cl_event*) &events->front() : NULL,
6549                  (event != NULL) ? &tmp : NULL),
6550              __ENQUEUE_ACQUIRE_GL_ERR);
6551 
6552         if (event != NULL && err == CL_SUCCESS)
6553             *event = tmp;
6554 
6555         return err;
6556      }
6557 
enqueueReleaseD3D10Objects(const VECTOR_CLASS<Memory> * mem_objects=NULL,const VECTOR_CLASS<Event> * events=NULL,Event * event=NULL) const6558     cl_int enqueueReleaseD3D10Objects(
6559          const VECTOR_CLASS<Memory>* mem_objects = NULL,
6560          const VECTOR_CLASS<Event>* events = NULL,
6561          Event* event = NULL) const
6562     {
6563         static PFN_clEnqueueReleaseD3D10ObjectsKHR pfn_clEnqueueReleaseD3D10ObjectsKHR = NULL;
6564 #if defined(CL_VERSION_1_2)
6565         cl_context context = getInfo<CL_QUEUE_CONTEXT>();
6566         cl::Device device(getInfo<CL_QUEUE_DEVICE>());
6567         cl_platform_id platform = device.getInfo<CL_DEVICE_PLATFORM>();
6568         __INIT_CL_EXT_FCN_PTR_PLATFORM(platform, clEnqueueReleaseD3D10ObjectsKHR);
6569 #endif // #if defined(CL_VERSION_1_2)
6570 #if defined(CL_VERSION_1_1)
6571         __INIT_CL_EXT_FCN_PTR(clEnqueueReleaseD3D10ObjectsKHR);
6572 #endif // #if defined(CL_VERSION_1_1)
6573 
6574         cl_event tmp;
6575         cl_int err = detail::errHandler(
6576             pfn_clEnqueueReleaseD3D10ObjectsKHR(
6577                 object_,
6578                 (mem_objects != NULL) ? (cl_uint) mem_objects->size() : 0,
6579                 (mem_objects != NULL && mem_objects->size() > 0) ? (const cl_mem *) &mem_objects->front(): NULL,
6580                 (events != NULL) ? (cl_uint) events->size() : 0,
6581                 (events != NULL && events->size() > 0) ? (cl_event*) &events->front() : NULL,
6582                 (event != NULL) ? &tmp : NULL),
6583             __ENQUEUE_RELEASE_GL_ERR);
6584 
6585         if (event != NULL && err == CL_SUCCESS)
6586             *event = tmp;
6587 
6588         return err;
6589     }
6590 #endif
6591 
6592 /**
6593  * Deprecated APIs for 1.2
6594  */
6595 #if defined(CL_USE_DEPRECATED_OPENCL_1_1_APIS) || (defined(CL_VERSION_1_1) && !defined(CL_VERSION_1_2))
6596     CL_EXT_PREFIX__VERSION_1_1_DEPRECATED
enqueueBarrier() const6597     cl_int enqueueBarrier() const CL_EXT_SUFFIX__VERSION_1_1_DEPRECATED
6598     {
6599         return detail::errHandler(
6600             ::clEnqueueBarrier(object_),
6601             __ENQUEUE_BARRIER_ERR);
6602     }
6603 #endif // #if defined(CL_VERSION_1_1)
6604 
flush() const6605     cl_int flush() const
6606     {
6607         return detail::errHandler(::clFlush(object_), __FLUSH_ERR);
6608     }
6609 
finish() const6610     cl_int finish() const
6611     {
6612         return detail::errHandler(::clFinish(object_), __FINISH_ERR);
6613     }
6614 };
6615 
6616 #ifdef CL_HPP_CPP11_ATOMICS_SUPPORTED
6617 CL_WEAK_ATTRIB_PREFIX std::atomic<int> CL_WEAK_ATTRIB_SUFFIX CommandQueue::default_initialized_;
6618 #else // !CL_HPP_CPP11_ATOMICS_SUPPORTED
6619 CL_WEAK_ATTRIB_PREFIX volatile int CL_WEAK_ATTRIB_SUFFIX CommandQueue::default_initialized_ = __DEFAULT_NOT_INITIALIZED;
6620 #endif // !CL_HPP_CPP11_ATOMICS_SUPPORTED
6621 
6622 CL_WEAK_ATTRIB_PREFIX CommandQueue CL_WEAK_ATTRIB_SUFFIX CommandQueue::default_;
6623 CL_WEAK_ATTRIB_PREFIX volatile cl_int CL_WEAK_ATTRIB_SUFFIX CommandQueue::default_error_ = CL_SUCCESS;
6624 
6625 template< typename IteratorType >
Buffer(const Context & context,IteratorType startIterator,IteratorType endIterator,bool readOnly,bool useHostPtr,cl_int * err)6626 Buffer::Buffer(
6627     const Context &context,
6628     IteratorType startIterator,
6629     IteratorType endIterator,
6630     bool readOnly,
6631     bool useHostPtr,
6632     cl_int* err)
6633 {
6634     typedef typename std::iterator_traits<IteratorType>::value_type DataType;
6635     cl_int error;
6636 
6637     cl_mem_flags flags = 0;
6638     if( readOnly ) {
6639         flags |= CL_MEM_READ_ONLY;
6640     }
6641     else {
6642         flags |= CL_MEM_READ_WRITE;
6643     }
6644     if( useHostPtr ) {
6645         flags |= CL_MEM_USE_HOST_PTR;
6646     }
6647 
6648     ::size_t size = sizeof(DataType)*(endIterator - startIterator);
6649 
6650     if( useHostPtr ) {
6651         object_ = ::clCreateBuffer(context(), flags, size, static_cast<DataType*>(&*startIterator), &error);
6652     } else {
6653         object_ = ::clCreateBuffer(context(), flags, size, 0, &error);
6654     }
6655 
6656     detail::errHandler(error, __CREATE_BUFFER_ERR);
6657     if (err != NULL) {
6658         *err = error;
6659     }
6660 
6661     if( !useHostPtr ) {
6662         CommandQueue queue(context, 0, &error);
6663         detail::errHandler(error, __CREATE_BUFFER_ERR);
6664         if (err != NULL) {
6665             *err = error;
6666         }
6667 
6668         error = cl::copy(queue, startIterator, endIterator, *this);
6669         detail::errHandler(error, __CREATE_BUFFER_ERR);
6670         if (err != NULL) {
6671             *err = error;
6672         }
6673     }
6674 }
6675 
6676 template< typename IteratorType >
Buffer(const CommandQueue & queue,IteratorType startIterator,IteratorType endIterator,bool readOnly,bool useHostPtr,cl_int * err)6677 Buffer::Buffer(
6678     const CommandQueue &queue,
6679     IteratorType startIterator,
6680     IteratorType endIterator,
6681     bool readOnly,
6682     bool useHostPtr,
6683     cl_int* err)
6684 {
6685     typedef typename std::iterator_traits<IteratorType>::value_type DataType;
6686     cl_int error;
6687 
6688     cl_mem_flags flags = 0;
6689     if (readOnly) {
6690         flags |= CL_MEM_READ_ONLY;
6691     }
6692     else {
6693         flags |= CL_MEM_READ_WRITE;
6694     }
6695     if (useHostPtr) {
6696         flags |= CL_MEM_USE_HOST_PTR;
6697     }
6698 
6699     ::size_t size = sizeof(DataType)*(endIterator - startIterator);
6700 
6701     Context context = queue.getInfo<CL_QUEUE_CONTEXT>();
6702 
6703     if (useHostPtr) {
6704         object_ = ::clCreateBuffer(context(), flags, size, static_cast<DataType*>(&*startIterator), &error);
6705     }
6706     else {
6707         object_ = ::clCreateBuffer(context(), flags, size, 0, &error);
6708     }
6709 
6710     detail::errHandler(error, __CREATE_BUFFER_ERR);
6711     if (err != NULL) {
6712         *err = error;
6713     }
6714 
6715     if (!useHostPtr) {
6716         error = cl::copy(queue, startIterator, endIterator, *this);
6717         detail::errHandler(error, __CREATE_BUFFER_ERR);
6718         if (err != NULL) {
6719             *err = error;
6720         }
6721     }
6722 }
6723 
enqueueReadBuffer(const Buffer & buffer,cl_bool blocking,::size_t offset,::size_t size,void * ptr,const VECTOR_CLASS<Event> * events=NULL,Event * event=NULL)6724 inline cl_int enqueueReadBuffer(
6725     const Buffer& buffer,
6726     cl_bool blocking,
6727     ::size_t offset,
6728     ::size_t size,
6729     void* ptr,
6730     const VECTOR_CLASS<Event>* events = NULL,
6731     Event* event = NULL)
6732 {
6733     cl_int error;
6734     CommandQueue queue = CommandQueue::getDefault(&error);
6735 
6736     if (error != CL_SUCCESS) {
6737         return error;
6738     }
6739 
6740     return queue.enqueueReadBuffer(buffer, blocking, offset, size, ptr, events, event);
6741 }
6742 
enqueueWriteBuffer(const Buffer & buffer,cl_bool blocking,::size_t offset,::size_t size,const void * ptr,const VECTOR_CLASS<Event> * events=NULL,Event * event=NULL)6743 inline cl_int enqueueWriteBuffer(
6744         const Buffer& buffer,
6745         cl_bool blocking,
6746         ::size_t offset,
6747         ::size_t size,
6748         const void* ptr,
6749         const VECTOR_CLASS<Event>* events = NULL,
6750         Event* event = NULL)
6751 {
6752     cl_int error;
6753     CommandQueue queue = CommandQueue::getDefault(&error);
6754 
6755     if (error != CL_SUCCESS) {
6756         return error;
6757     }
6758 
6759     return queue.enqueueWriteBuffer(buffer, blocking, offset, size, ptr, events, event);
6760 }
6761 
enqueueMapBuffer(const Buffer & buffer,cl_bool blocking,cl_map_flags flags,::size_t offset,::size_t size,const VECTOR_CLASS<Event> * events=NULL,Event * event=NULL,cl_int * err=NULL)6762 inline void* enqueueMapBuffer(
6763         const Buffer& buffer,
6764         cl_bool blocking,
6765         cl_map_flags flags,
6766         ::size_t offset,
6767         ::size_t size,
6768         const VECTOR_CLASS<Event>* events = NULL,
6769         Event* event = NULL,
6770         cl_int* err = NULL)
6771 {
6772     cl_int error;
6773     CommandQueue queue = CommandQueue::getDefault(&error);
6774     detail::errHandler(error, __ENQUEUE_MAP_BUFFER_ERR);
6775     if (err != NULL) {
6776         *err = error;
6777     }
6778 
6779     void * result = ::clEnqueueMapBuffer(
6780             queue(), buffer(), blocking, flags, offset, size,
6781             (events != NULL) ? (cl_uint) events->size() : 0,
6782             (events != NULL && events->size() > 0) ? (cl_event*) &events->front() : NULL,
6783             (cl_event*) event,
6784             &error);
6785 
6786     detail::errHandler(error, __ENQUEUE_MAP_BUFFER_ERR);
6787     if (err != NULL) {
6788         *err = error;
6789     }
6790     return result;
6791 }
6792 
enqueueUnmapMemObject(const Memory & memory,void * mapped_ptr,const VECTOR_CLASS<Event> * events=NULL,Event * event=NULL)6793 inline cl_int enqueueUnmapMemObject(
6794     const Memory& memory,
6795     void* mapped_ptr,
6796     const VECTOR_CLASS<Event>* events = NULL,
6797     Event* event = NULL)
6798 {
6799     cl_int error;
6800     CommandQueue queue = CommandQueue::getDefault(&error);
6801     detail::errHandler(error, __ENQUEUE_MAP_BUFFER_ERR);
6802     if (error != CL_SUCCESS) {
6803         return error;
6804     }
6805 
6806     cl_event tmp;
6807     cl_int err = detail::errHandler(
6808         ::clEnqueueUnmapMemObject(
6809             queue(), memory(), mapped_ptr,
6810             (events != NULL) ? (cl_uint) events->size() : 0,
6811             (events != NULL && events->size() > 0) ? (cl_event*) &events->front() : NULL,
6812             (event != NULL) ? &tmp : NULL),
6813         __ENQUEUE_UNMAP_MEM_OBJECT_ERR);
6814 
6815     if (event != NULL && err == CL_SUCCESS)
6816         *event = tmp;
6817 
6818     return err;
6819 }
6820 
enqueueCopyBuffer(const Buffer & src,const Buffer & dst,::size_t src_offset,::size_t dst_offset,::size_t size,const VECTOR_CLASS<Event> * events=NULL,Event * event=NULL)6821 inline cl_int enqueueCopyBuffer(
6822         const Buffer& src,
6823         const Buffer& dst,
6824         ::size_t src_offset,
6825         ::size_t dst_offset,
6826         ::size_t size,
6827         const VECTOR_CLASS<Event>* events = NULL,
6828         Event* event = NULL)
6829 {
6830     cl_int error;
6831     CommandQueue queue = CommandQueue::getDefault(&error);
6832 
6833     if (error != CL_SUCCESS) {
6834         return error;
6835     }
6836 
6837     return queue.enqueueCopyBuffer(src, dst, src_offset, dst_offset, size, events, event);
6838 }
6839 
6840 /**
6841  * Blocking copy operation between iterators and a buffer.
6842  * Host to Device.
6843  * Uses default command queue.
6844  */
6845 template< typename IteratorType >
copy(IteratorType startIterator,IteratorType endIterator,cl::Buffer & buffer)6846 inline cl_int copy( IteratorType startIterator, IteratorType endIterator, cl::Buffer &buffer )
6847 {
6848     cl_int error;
6849     CommandQueue queue = CommandQueue::getDefault(&error);
6850     if (error != CL_SUCCESS)
6851         return error;
6852 
6853     return cl::copy(queue, startIterator, endIterator, buffer);
6854 }
6855 
6856 /**
6857  * Blocking copy operation between iterators and a buffer.
6858  * Device to Host.
6859  * Uses default command queue.
6860  */
6861 template< typename IteratorType >
copy(const cl::Buffer & buffer,IteratorType startIterator,IteratorType endIterator)6862 inline cl_int copy( const cl::Buffer &buffer, IteratorType startIterator, IteratorType endIterator )
6863 {
6864     cl_int error;
6865     CommandQueue queue = CommandQueue::getDefault(&error);
6866     if (error != CL_SUCCESS)
6867         return error;
6868 
6869     return cl::copy(queue, buffer, startIterator, endIterator);
6870 }
6871 
6872 /**
6873  * Blocking copy operation between iterators and a buffer.
6874  * Host to Device.
6875  * Uses specified queue.
6876  */
6877 template< typename IteratorType >
copy(const CommandQueue & queue,IteratorType startIterator,IteratorType endIterator,cl::Buffer & buffer)6878 inline cl_int copy( const CommandQueue &queue, IteratorType startIterator, IteratorType endIterator, cl::Buffer &buffer )
6879 {
6880     typedef typename std::iterator_traits<IteratorType>::value_type DataType;
6881     cl_int error;
6882 
6883     ::size_t length = endIterator-startIterator;
6884     ::size_t byteLength = length*sizeof(DataType);
6885 
6886     DataType *pointer =
6887         static_cast<DataType*>(queue.enqueueMapBuffer(buffer, CL_TRUE, CL_MAP_WRITE, 0, byteLength, 0, 0, &error));
6888     // if exceptions enabled, enqueueMapBuffer will throw
6889     if( error != CL_SUCCESS ) {
6890         return error;
6891     }
6892 #if defined(_MSC_VER)
6893     std::copy(
6894         startIterator,
6895         endIterator,
6896         stdext::checked_array_iterator<DataType*>(
6897             pointer, length));
6898 #else
6899     std::copy(startIterator, endIterator, pointer);
6900 #endif
6901     Event endEvent;
6902     error = queue.enqueueUnmapMemObject(buffer, pointer, 0, &endEvent);
6903     // if exceptions enabled, enqueueUnmapMemObject will throw
6904     if( error != CL_SUCCESS ) {
6905         return error;
6906     }
6907     endEvent.wait();
6908     return CL_SUCCESS;
6909 }
6910 
6911 /**
6912  * Blocking copy operation between iterators and a buffer.
6913  * Device to Host.
6914  * Uses specified queue.
6915  */
6916 template< typename IteratorType >
copy(const CommandQueue & queue,const cl::Buffer & buffer,IteratorType startIterator,IteratorType endIterator)6917 inline cl_int copy( const CommandQueue &queue, const cl::Buffer &buffer, IteratorType startIterator, IteratorType endIterator )
6918 {
6919     typedef typename std::iterator_traits<IteratorType>::value_type DataType;
6920     cl_int error;
6921 
6922     ::size_t length = endIterator-startIterator;
6923     ::size_t byteLength = length*sizeof(DataType);
6924 
6925     DataType *pointer =
6926         static_cast<DataType*>(queue.enqueueMapBuffer(buffer, CL_TRUE, CL_MAP_READ, 0, byteLength, 0, 0, &error));
6927     // if exceptions enabled, enqueueMapBuffer will throw
6928     if( error != CL_SUCCESS ) {
6929         return error;
6930     }
6931     std::copy(pointer, pointer + length, startIterator);
6932     Event endEvent;
6933     error = queue.enqueueUnmapMemObject(buffer, pointer, 0, &endEvent);
6934     // if exceptions enabled, enqueueUnmapMemObject will throw
6935     if( error != CL_SUCCESS ) {
6936         return error;
6937     }
6938     endEvent.wait();
6939     return CL_SUCCESS;
6940 }
6941 
6942 #if defined(CL_VERSION_1_1)
enqueueReadBufferRect(const Buffer & buffer,cl_bool blocking,const size_t<3> & buffer_offset,const size_t<3> & host_offset,const size_t<3> & region,::size_t buffer_row_pitch,::size_t buffer_slice_pitch,::size_t host_row_pitch,::size_t host_slice_pitch,void * ptr,const VECTOR_CLASS<Event> * events=NULL,Event * event=NULL)6943 inline cl_int enqueueReadBufferRect(
6944     const Buffer& buffer,
6945     cl_bool blocking,
6946     const size_t<3>& buffer_offset,
6947     const size_t<3>& host_offset,
6948     const size_t<3>& region,
6949     ::size_t buffer_row_pitch,
6950     ::size_t buffer_slice_pitch,
6951     ::size_t host_row_pitch,
6952     ::size_t host_slice_pitch,
6953     void *ptr,
6954     const VECTOR_CLASS<Event>* events = NULL,
6955     Event* event = NULL)
6956 {
6957     cl_int error;
6958     CommandQueue queue = CommandQueue::getDefault(&error);
6959 
6960     if (error != CL_SUCCESS) {
6961         return error;
6962     }
6963 
6964     return queue.enqueueReadBufferRect(
6965         buffer,
6966         blocking,
6967         buffer_offset,
6968         host_offset,
6969         region,
6970         buffer_row_pitch,
6971         buffer_slice_pitch,
6972         host_row_pitch,
6973         host_slice_pitch,
6974         ptr,
6975         events,
6976         event);
6977 }
6978 
enqueueWriteBufferRect(const Buffer & buffer,cl_bool blocking,const size_t<3> & buffer_offset,const size_t<3> & host_offset,const size_t<3> & region,::size_t buffer_row_pitch,::size_t buffer_slice_pitch,::size_t host_row_pitch,::size_t host_slice_pitch,const void * ptr,const VECTOR_CLASS<Event> * events=NULL,Event * event=NULL)6979 inline cl_int enqueueWriteBufferRect(
6980     const Buffer& buffer,
6981     cl_bool blocking,
6982     const size_t<3>& buffer_offset,
6983     const size_t<3>& host_offset,
6984     const size_t<3>& region,
6985     ::size_t buffer_row_pitch,
6986     ::size_t buffer_slice_pitch,
6987     ::size_t host_row_pitch,
6988     ::size_t host_slice_pitch,
6989     const void *ptr,
6990     const VECTOR_CLASS<Event>* events = NULL,
6991     Event* event = NULL)
6992 {
6993     cl_int error;
6994     CommandQueue queue = CommandQueue::getDefault(&error);
6995 
6996     if (error != CL_SUCCESS) {
6997         return error;
6998     }
6999 
7000     return queue.enqueueWriteBufferRect(
7001         buffer,
7002         blocking,
7003         buffer_offset,
7004         host_offset,
7005         region,
7006         buffer_row_pitch,
7007         buffer_slice_pitch,
7008         host_row_pitch,
7009         host_slice_pitch,
7010         ptr,
7011         events,
7012         event);
7013 }
7014 
enqueueCopyBufferRect(const Buffer & src,const Buffer & dst,const size_t<3> & src_origin,const size_t<3> & dst_origin,const size_t<3> & region,::size_t src_row_pitch,::size_t src_slice_pitch,::size_t dst_row_pitch,::size_t dst_slice_pitch,const VECTOR_CLASS<Event> * events=NULL,Event * event=NULL)7015 inline cl_int enqueueCopyBufferRect(
7016     const Buffer& src,
7017     const Buffer& dst,
7018     const size_t<3>& src_origin,
7019     const size_t<3>& dst_origin,
7020     const size_t<3>& region,
7021     ::size_t src_row_pitch,
7022     ::size_t src_slice_pitch,
7023     ::size_t dst_row_pitch,
7024     ::size_t dst_slice_pitch,
7025     const VECTOR_CLASS<Event>* events = NULL,
7026     Event* event = NULL)
7027 {
7028     cl_int error;
7029     CommandQueue queue = CommandQueue::getDefault(&error);
7030 
7031     if (error != CL_SUCCESS) {
7032         return error;
7033     }
7034 
7035     return queue.enqueueCopyBufferRect(
7036         src,
7037         dst,
7038         src_origin,
7039         dst_origin,
7040         region,
7041         src_row_pitch,
7042         src_slice_pitch,
7043         dst_row_pitch,
7044         dst_slice_pitch,
7045         events,
7046         event);
7047 }
7048 #endif
7049 
enqueueReadImage(const Image & image,cl_bool blocking,const size_t<3> & origin,const size_t<3> & region,::size_t row_pitch,::size_t slice_pitch,void * ptr,const VECTOR_CLASS<Event> * events=NULL,Event * event=NULL)7050 inline cl_int enqueueReadImage(
7051     const Image& image,
7052     cl_bool blocking,
7053     const size_t<3>& origin,
7054     const size_t<3>& region,
7055     ::size_t row_pitch,
7056     ::size_t slice_pitch,
7057     void* ptr,
7058     const VECTOR_CLASS<Event>* events = NULL,
7059     Event* event = NULL)
7060 {
7061     cl_int error;
7062     CommandQueue queue = CommandQueue::getDefault(&error);
7063 
7064     if (error != CL_SUCCESS) {
7065         return error;
7066     }
7067 
7068     return queue.enqueueReadImage(
7069         image,
7070         blocking,
7071         origin,
7072         region,
7073         row_pitch,
7074         slice_pitch,
7075         ptr,
7076         events,
7077         event);
7078 }
7079 
enqueueWriteImage(const Image & image,cl_bool blocking,const size_t<3> & origin,const size_t<3> & region,::size_t row_pitch,::size_t slice_pitch,const void * ptr,const VECTOR_CLASS<Event> * events=NULL,Event * event=NULL)7080 inline cl_int enqueueWriteImage(
7081     const Image& image,
7082     cl_bool blocking,
7083     const size_t<3>& origin,
7084     const size_t<3>& region,
7085     ::size_t row_pitch,
7086     ::size_t slice_pitch,
7087     const void* ptr,
7088     const VECTOR_CLASS<Event>* events = NULL,
7089     Event* event = NULL)
7090 {
7091     cl_int error;
7092     CommandQueue queue = CommandQueue::getDefault(&error);
7093 
7094     if (error != CL_SUCCESS) {
7095         return error;
7096     }
7097 
7098     return queue.enqueueWriteImage(
7099         image,
7100         blocking,
7101         origin,
7102         region,
7103         row_pitch,
7104         slice_pitch,
7105         ptr,
7106         events,
7107         event);
7108 }
7109 
enqueueCopyImage(const Image & src,const Image & dst,const size_t<3> & src_origin,const size_t<3> & dst_origin,const size_t<3> & region,const VECTOR_CLASS<Event> * events=NULL,Event * event=NULL)7110 inline cl_int enqueueCopyImage(
7111     const Image& src,
7112     const Image& dst,
7113     const size_t<3>& src_origin,
7114     const size_t<3>& dst_origin,
7115     const size_t<3>& region,
7116     const VECTOR_CLASS<Event>* events = NULL,
7117     Event* event = NULL)
7118 {
7119     cl_int error;
7120     CommandQueue queue = CommandQueue::getDefault(&error);
7121 
7122     if (error != CL_SUCCESS) {
7123         return error;
7124     }
7125 
7126     return queue.enqueueCopyImage(
7127         src,
7128         dst,
7129         src_origin,
7130         dst_origin,
7131         region,
7132         events,
7133         event);
7134 }
7135 
enqueueCopyImageToBuffer(const Image & src,const Buffer & dst,const size_t<3> & src_origin,const size_t<3> & region,::size_t dst_offset,const VECTOR_CLASS<Event> * events=NULL,Event * event=NULL)7136 inline cl_int enqueueCopyImageToBuffer(
7137     const Image& src,
7138     const Buffer& dst,
7139     const size_t<3>& src_origin,
7140     const size_t<3>& region,
7141     ::size_t dst_offset,
7142     const VECTOR_CLASS<Event>* events = NULL,
7143     Event* event = NULL)
7144 {
7145     cl_int error;
7146     CommandQueue queue = CommandQueue::getDefault(&error);
7147 
7148     if (error != CL_SUCCESS) {
7149         return error;
7150     }
7151 
7152     return queue.enqueueCopyImageToBuffer(
7153         src,
7154         dst,
7155         src_origin,
7156         region,
7157         dst_offset,
7158         events,
7159         event);
7160 }
7161 
enqueueCopyBufferToImage(const Buffer & src,const Image & dst,::size_t src_offset,const size_t<3> & dst_origin,const size_t<3> & region,const VECTOR_CLASS<Event> * events=NULL,Event * event=NULL)7162 inline cl_int enqueueCopyBufferToImage(
7163     const Buffer& src,
7164     const Image& dst,
7165     ::size_t src_offset,
7166     const size_t<3>& dst_origin,
7167     const size_t<3>& region,
7168     const VECTOR_CLASS<Event>* events = NULL,
7169     Event* event = NULL)
7170 {
7171     cl_int error;
7172     CommandQueue queue = CommandQueue::getDefault(&error);
7173 
7174     if (error != CL_SUCCESS) {
7175         return error;
7176     }
7177 
7178     return queue.enqueueCopyBufferToImage(
7179         src,
7180         dst,
7181         src_offset,
7182         dst_origin,
7183         region,
7184         events,
7185         event);
7186 }
7187 
7188 
flush(void)7189 inline cl_int flush(void)
7190 {
7191     cl_int error;
7192     CommandQueue queue = CommandQueue::getDefault(&error);
7193 
7194     if (error != CL_SUCCESS) {
7195         return error;
7196     }
7197 
7198     return queue.flush();
7199 }
7200 
finish(void)7201 inline cl_int finish(void)
7202 {
7203     cl_int error;
7204     CommandQueue queue = CommandQueue::getDefault(&error);
7205 
7206     if (error != CL_SUCCESS) {
7207         return error;
7208     }
7209 
7210 
7211     return queue.finish();
7212 }
7213 
7214 // Kernel Functor support
7215 // New interface as of September 2011
7216 // Requires the C++11 std::tr1::function (note do not support TR1)
7217 // Visual Studio 2010 and GCC 4.2
7218 
7219 struct EnqueueArgs
7220 {
7221     CommandQueue queue_;
7222     const NDRange offset_;
7223     const NDRange global_;
7224     const NDRange local_;
7225     VECTOR_CLASS<Event> events_;
7226 
EnqueueArgscl::EnqueueArgs7227     EnqueueArgs(NDRange global) :
7228       queue_(CommandQueue::getDefault()),
7229       offset_(NullRange),
7230       global_(global),
7231       local_(NullRange)
7232     {
7233 
7234     }
7235 
EnqueueArgscl::EnqueueArgs7236     EnqueueArgs(NDRange global, NDRange local) :
7237       queue_(CommandQueue::getDefault()),
7238       offset_(NullRange),
7239       global_(global),
7240       local_(local)
7241     {
7242 
7243     }
7244 
EnqueueArgscl::EnqueueArgs7245     EnqueueArgs(NDRange offset, NDRange global, NDRange local) :
7246       queue_(CommandQueue::getDefault()),
7247       offset_(offset),
7248       global_(global),
7249       local_(local)
7250     {
7251 
7252     }
7253 
EnqueueArgscl::EnqueueArgs7254     EnqueueArgs(Event e, NDRange global) :
7255       queue_(CommandQueue::getDefault()),
7256       offset_(NullRange),
7257       global_(global),
7258       local_(NullRange)
7259     {
7260         events_.push_back(e);
7261     }
7262 
EnqueueArgscl::EnqueueArgs7263     EnqueueArgs(Event e, NDRange global, NDRange local) :
7264       queue_(CommandQueue::getDefault()),
7265       offset_(NullRange),
7266       global_(global),
7267       local_(local)
7268     {
7269         events_.push_back(e);
7270     }
7271 
EnqueueArgscl::EnqueueArgs7272     EnqueueArgs(Event e, NDRange offset, NDRange global, NDRange local) :
7273       queue_(CommandQueue::getDefault()),
7274       offset_(offset),
7275       global_(global),
7276       local_(local)
7277     {
7278         events_.push_back(e);
7279     }
7280 
EnqueueArgscl::EnqueueArgs7281     EnqueueArgs(const VECTOR_CLASS<Event> &events, NDRange global) :
7282       queue_(CommandQueue::getDefault()),
7283       offset_(NullRange),
7284       global_(global),
7285       local_(NullRange),
7286       events_(events)
7287     {
7288 
7289     }
7290 
EnqueueArgscl::EnqueueArgs7291     EnqueueArgs(const VECTOR_CLASS<Event> &events, NDRange global, NDRange local) :
7292       queue_(CommandQueue::getDefault()),
7293       offset_(NullRange),
7294       global_(global),
7295       local_(local),
7296       events_(events)
7297     {
7298 
7299     }
7300 
EnqueueArgscl::EnqueueArgs7301     EnqueueArgs(const VECTOR_CLASS<Event> &events, NDRange offset, NDRange global, NDRange local) :
7302       queue_(CommandQueue::getDefault()),
7303       offset_(offset),
7304       global_(global),
7305       local_(local),
7306       events_(events)
7307     {
7308 
7309     }
7310 
EnqueueArgscl::EnqueueArgs7311     EnqueueArgs(CommandQueue &queue, NDRange global) :
7312       queue_(queue),
7313       offset_(NullRange),
7314       global_(global),
7315       local_(NullRange)
7316     {
7317 
7318     }
7319 
EnqueueArgscl::EnqueueArgs7320     EnqueueArgs(CommandQueue &queue, NDRange global, NDRange local) :
7321       queue_(queue),
7322       offset_(NullRange),
7323       global_(global),
7324       local_(local)
7325     {
7326 
7327     }
7328 
EnqueueArgscl::EnqueueArgs7329     EnqueueArgs(CommandQueue &queue, NDRange offset, NDRange global, NDRange local) :
7330       queue_(queue),
7331       offset_(offset),
7332       global_(global),
7333       local_(local)
7334     {
7335 
7336     }
7337 
EnqueueArgscl::EnqueueArgs7338     EnqueueArgs(CommandQueue &queue, Event e, NDRange global) :
7339       queue_(queue),
7340       offset_(NullRange),
7341       global_(global),
7342       local_(NullRange)
7343     {
7344         events_.push_back(e);
7345     }
7346 
EnqueueArgscl::EnqueueArgs7347     EnqueueArgs(CommandQueue &queue, Event e, NDRange global, NDRange local) :
7348       queue_(queue),
7349       offset_(NullRange),
7350       global_(global),
7351       local_(local)
7352     {
7353         events_.push_back(e);
7354     }
7355 
EnqueueArgscl::EnqueueArgs7356     EnqueueArgs(CommandQueue &queue, Event e, NDRange offset, NDRange global, NDRange local) :
7357       queue_(queue),
7358       offset_(offset),
7359       global_(global),
7360       local_(local)
7361     {
7362         events_.push_back(e);
7363     }
7364 
EnqueueArgscl::EnqueueArgs7365     EnqueueArgs(CommandQueue &queue, const VECTOR_CLASS<Event> &events, NDRange global) :
7366       queue_(queue),
7367       offset_(NullRange),
7368       global_(global),
7369       local_(NullRange),
7370       events_(events)
7371     {
7372 
7373     }
7374 
EnqueueArgscl::EnqueueArgs7375     EnqueueArgs(CommandQueue &queue, const VECTOR_CLASS<Event> &events, NDRange global, NDRange local) :
7376       queue_(queue),
7377       offset_(NullRange),
7378       global_(global),
7379       local_(local),
7380       events_(events)
7381     {
7382 
7383     }
7384 
EnqueueArgscl::EnqueueArgs7385     EnqueueArgs(CommandQueue &queue, const VECTOR_CLASS<Event> &events, NDRange offset, NDRange global, NDRange local) :
7386       queue_(queue),
7387       offset_(offset),
7388       global_(global),
7389       local_(local),
7390       events_(events)
7391     {
7392 
7393     }
7394 };
7395 
7396 namespace detail {
7397 
7398 class NullType {};
7399 
7400 template<int index, typename T0>
7401 struct SetArg
7402 {
setcl::detail::SetArg7403     static void set (Kernel kernel, T0 arg)
7404     {
7405         kernel.setArg(index, arg);
7406     }
7407 };
7408 
7409 template<int index>
7410 struct SetArg<index, NullType>
7411 {
setcl::detail::SetArg7412     static void set (Kernel, NullType)
7413     {
7414     }
7415 };
7416 
7417 template <
7418    typename T0,   typename T1,   typename T2,   typename T3,
7419    typename T4,   typename T5,   typename T6,   typename T7,
7420    typename T8,   typename T9,   typename T10,   typename T11,
7421    typename T12,   typename T13,   typename T14,   typename T15,
7422    typename T16,   typename T17,   typename T18,   typename T19,
7423    typename T20,   typename T21,   typename T22,   typename T23,
7424    typename T24,   typename T25,   typename T26,   typename T27,
7425    typename T28,   typename T29,   typename T30,   typename T31
7426 >
7427 class KernelFunctorGlobal
7428 {
7429 private:
7430     Kernel kernel_;
7431 
7432 public:
KernelFunctorGlobal(Kernel kernel)7433    KernelFunctorGlobal(
7434         Kernel kernel) :
7435             kernel_(kernel)
7436     {}
7437 
KernelFunctorGlobal(const Program & program,const STRING_CLASS name,cl_int * err=NULL)7438    KernelFunctorGlobal(
7439         const Program& program,
7440         const STRING_CLASS name,
7441         cl_int * err = NULL) :
7442             kernel_(program, name.c_str(), err)
7443     {}
7444 
operator ()(const EnqueueArgs & args,T0 t0,T1 t1=NullType (),T2 t2=NullType (),T3 t3=NullType (),T4 t4=NullType (),T5 t5=NullType (),T6 t6=NullType (),T7 t7=NullType (),T8 t8=NullType (),T9 t9=NullType (),T10 t10=NullType (),T11 t11=NullType (),T12 t12=NullType (),T13 t13=NullType (),T14 t14=NullType (),T15 t15=NullType (),T16 t16=NullType (),T17 t17=NullType (),T18 t18=NullType (),T19 t19=NullType (),T20 t20=NullType (),T21 t21=NullType (),T22 t22=NullType (),T23 t23=NullType (),T24 t24=NullType (),T25 t25=NullType (),T26 t26=NullType (),T27 t27=NullType (),T28 t28=NullType (),T29 t29=NullType (),T30 t30=NullType (),T31 t31=NullType ())7445     Event operator() (
7446         const EnqueueArgs& args,
7447         T0 t0,
7448         T1 t1 = NullType(),
7449         T2 t2 = NullType(),
7450         T3 t3 = NullType(),
7451         T4 t4 = NullType(),
7452         T5 t5 = NullType(),
7453         T6 t6 = NullType(),
7454         T7 t7 = NullType(),
7455         T8 t8 = NullType(),
7456         T9 t9 = NullType(),
7457         T10 t10 = NullType(),
7458         T11 t11 = NullType(),
7459         T12 t12 = NullType(),
7460         T13 t13 = NullType(),
7461         T14 t14 = NullType(),
7462         T15 t15 = NullType(),
7463         T16 t16 = NullType(),
7464         T17 t17 = NullType(),
7465         T18 t18 = NullType(),
7466         T19 t19 = NullType(),
7467         T20 t20 = NullType(),
7468         T21 t21 = NullType(),
7469         T22 t22 = NullType(),
7470         T23 t23 = NullType(),
7471         T24 t24 = NullType(),
7472         T25 t25 = NullType(),
7473         T26 t26 = NullType(),
7474         T27 t27 = NullType(),
7475         T28 t28 = NullType(),
7476         T29 t29 = NullType(),
7477         T30 t30 = NullType(),
7478         T31 t31 = NullType()
7479         )
7480     {
7481         Event event;
7482         SetArg<0, T0>::set(kernel_, t0);
7483         SetArg<1, T1>::set(kernel_, t1);
7484         SetArg<2, T2>::set(kernel_, t2);
7485         SetArg<3, T3>::set(kernel_, t3);
7486         SetArg<4, T4>::set(kernel_, t4);
7487         SetArg<5, T5>::set(kernel_, t5);
7488         SetArg<6, T6>::set(kernel_, t6);
7489         SetArg<7, T7>::set(kernel_, t7);
7490         SetArg<8, T8>::set(kernel_, t8);
7491         SetArg<9, T9>::set(kernel_, t9);
7492         SetArg<10, T10>::set(kernel_, t10);
7493         SetArg<11, T11>::set(kernel_, t11);
7494         SetArg<12, T12>::set(kernel_, t12);
7495         SetArg<13, T13>::set(kernel_, t13);
7496         SetArg<14, T14>::set(kernel_, t14);
7497         SetArg<15, T15>::set(kernel_, t15);
7498         SetArg<16, T16>::set(kernel_, t16);
7499         SetArg<17, T17>::set(kernel_, t17);
7500         SetArg<18, T18>::set(kernel_, t18);
7501         SetArg<19, T19>::set(kernel_, t19);
7502         SetArg<20, T20>::set(kernel_, t20);
7503         SetArg<21, T21>::set(kernel_, t21);
7504         SetArg<22, T22>::set(kernel_, t22);
7505         SetArg<23, T23>::set(kernel_, t23);
7506         SetArg<24, T24>::set(kernel_, t24);
7507         SetArg<25, T25>::set(kernel_, t25);
7508         SetArg<26, T26>::set(kernel_, t26);
7509         SetArg<27, T27>::set(kernel_, t27);
7510         SetArg<28, T28>::set(kernel_, t28);
7511         SetArg<29, T29>::set(kernel_, t29);
7512         SetArg<30, T30>::set(kernel_, t30);
7513         SetArg<31, T31>::set(kernel_, t31);
7514 
7515         args.queue_.enqueueNDRangeKernel(
7516             kernel_,
7517             args.offset_,
7518             args.global_,
7519             args.local_,
7520             &args.events_,
7521             &event);
7522 
7523         return event;
7524     }
7525 
7526 };
7527 
7528 //------------------------------------------------------------------------------------------------------
7529 
7530 
7531 template<
7532 	typename T0,
7533 	typename T1,
7534 	typename T2,
7535 	typename T3,
7536 	typename T4,
7537 	typename T5,
7538 	typename T6,
7539 	typename T7,
7540 	typename T8,
7541 	typename T9,
7542 	typename T10,
7543 	typename T11,
7544 	typename T12,
7545 	typename T13,
7546 	typename T14,
7547 	typename T15,
7548 	typename T16,
7549 	typename T17,
7550 	typename T18,
7551 	typename T19,
7552 	typename T20,
7553 	typename T21,
7554 	typename T22,
7555 	typename T23,
7556 	typename T24,
7557 	typename T25,
7558 	typename T26,
7559 	typename T27,
7560 	typename T28,
7561 	typename T29,
7562 	typename T30,
7563 	typename T31>
7564 struct functionImplementation_
7565 {
7566 	typedef detail::KernelFunctorGlobal<
7567 		T0,
7568 		T1,
7569 		T2,
7570 		T3,
7571 		T4,
7572 		T5,
7573 		T6,
7574 		T7,
7575 		T8,
7576 		T9,
7577 		T10,
7578 		T11,
7579 		T12,
7580 		T13,
7581 		T14,
7582 		T15,
7583 		T16,
7584 		T17,
7585 		T18,
7586 		T19,
7587 		T20,
7588 		T21,
7589 		T22,
7590 		T23,
7591 		T24,
7592 		T25,
7593 		T26,
7594 		T27,
7595 		T28,
7596 		T29,
7597 		T30,
7598 		T31> FunctorType;
7599 
7600     FunctorType functor_;
7601 
functionImplementation_cl::detail::functionImplementation_7602     functionImplementation_(const FunctorType &functor) :
7603         functor_(functor)
7604     {
7605 
7606         #if (defined(_WIN32) && defined(_VARIADIC_MAX) && (_VARIADIC_MAX < 32))
7607         // Fail variadic expansion for dev11
7608         static_assert(0, "Visual Studio has a hard limit of argument count for a std::function expansion. Please define _VARIADIC_MAX to be 10. If you need more arguments than that VC12 and below cannot support it.");
7609         #endif
7610 
7611     }
7612 
7613 	//! \brief Return type of the functor
7614 	typedef Event result_type;
7615 
7616 	//! \brief Function signature of kernel functor with no event dependency.
7617 	typedef Event type_(
7618 		const EnqueueArgs&,
7619 		T0,
7620 		T1,
7621 		T2,
7622 		T3,
7623 		T4,
7624 		T5,
7625 		T6,
7626 		T7,
7627 		T8,
7628 		T9,
7629 		T10,
7630 		T11,
7631 		T12,
7632 		T13,
7633 		T14,
7634 		T15,
7635 		T16,
7636 		T17,
7637 		T18,
7638 		T19,
7639 		T20,
7640 		T21,
7641 		T22,
7642 		T23,
7643 		T24,
7644 		T25,
7645 		T26,
7646 		T27,
7647 		T28,
7648 		T29,
7649 		T30,
7650 		T31);
7651 
operator ()cl::detail::functionImplementation_7652 	Event operator()(
7653 		const EnqueueArgs& enqueueArgs,
7654 		T0 arg0,
7655 		T1 arg1,
7656 		T2 arg2,
7657 		T3 arg3,
7658 		T4 arg4,
7659 		T5 arg5,
7660 		T6 arg6,
7661 		T7 arg7,
7662 		T8 arg8,
7663 		T9 arg9,
7664 		T10 arg10,
7665 		T11 arg11,
7666 		T12 arg12,
7667 		T13 arg13,
7668 		T14 arg14,
7669 		T15 arg15,
7670 		T16 arg16,
7671 		T17 arg17,
7672 		T18 arg18,
7673 		T19 arg19,
7674 		T20 arg20,
7675 		T21 arg21,
7676 		T22 arg22,
7677 		T23 arg23,
7678 		T24 arg24,
7679 		T25 arg25,
7680 		T26 arg26,
7681 		T27 arg27,
7682 		T28 arg28,
7683 		T29 arg29,
7684 		T30 arg30,
7685 		T31 arg31)
7686 	{
7687 		return functor_(
7688 			enqueueArgs,
7689 			arg0,
7690 			arg1,
7691 			arg2,
7692 			arg3,
7693 			arg4,
7694 			arg5,
7695 			arg6,
7696 			arg7,
7697 			arg8,
7698 			arg9,
7699 			arg10,
7700 			arg11,
7701 			arg12,
7702 			arg13,
7703 			arg14,
7704 			arg15,
7705 			arg16,
7706 			arg17,
7707 			arg18,
7708 			arg19,
7709 			arg20,
7710 			arg21,
7711 			arg22,
7712 			arg23,
7713 			arg24,
7714 			arg25,
7715 			arg26,
7716 			arg27,
7717 			arg28,
7718 			arg29,
7719 			arg30,
7720 			arg31);
7721 	}
7722 
7723 
7724 };
7725 
7726 template<
7727 	typename T0,
7728 	typename T1,
7729 	typename T2,
7730 	typename T3,
7731 	typename T4,
7732 	typename T5,
7733 	typename T6,
7734 	typename T7,
7735 	typename T8,
7736 	typename T9,
7737 	typename T10,
7738 	typename T11,
7739 	typename T12,
7740 	typename T13,
7741 	typename T14,
7742 	typename T15,
7743 	typename T16,
7744 	typename T17,
7745 	typename T18,
7746 	typename T19,
7747 	typename T20,
7748 	typename T21,
7749 	typename T22,
7750 	typename T23,
7751 	typename T24,
7752 	typename T25,
7753 	typename T26,
7754 	typename T27,
7755 	typename T28,
7756 	typename T29,
7757 	typename T30>
7758 struct functionImplementation_
7759 <	T0,
7760 	T1,
7761 	T2,
7762 	T3,
7763 	T4,
7764 	T5,
7765 	T6,
7766 	T7,
7767 	T8,
7768 	T9,
7769 	T10,
7770 	T11,
7771 	T12,
7772 	T13,
7773 	T14,
7774 	T15,
7775 	T16,
7776 	T17,
7777 	T18,
7778 	T19,
7779 	T20,
7780 	T21,
7781 	T22,
7782 	T23,
7783 	T24,
7784 	T25,
7785 	T26,
7786 	T27,
7787 	T28,
7788 	T29,
7789 	T30,
7790 	NullType>
7791 {
7792 	typedef detail::KernelFunctorGlobal<
7793 		T0,
7794 		T1,
7795 		T2,
7796 		T3,
7797 		T4,
7798 		T5,
7799 		T6,
7800 		T7,
7801 		T8,
7802 		T9,
7803 		T10,
7804 		T11,
7805 		T12,
7806 		T13,
7807 		T14,
7808 		T15,
7809 		T16,
7810 		T17,
7811 		T18,
7812 		T19,
7813 		T20,
7814 		T21,
7815 		T22,
7816 		T23,
7817 		T24,
7818 		T25,
7819 		T26,
7820 		T27,
7821 		T28,
7822 		T29,
7823 		T30,
7824 		NullType> FunctorType;
7825 
7826     FunctorType functor_;
7827 
functionImplementation_cl::detail::functionImplementation_7828     functionImplementation_(const FunctorType &functor) :
7829         functor_(functor)
7830     {
7831 
7832         #if (defined(_WIN32) && defined(_VARIADIC_MAX) && (_VARIADIC_MAX < 31))
7833         // Fail variadic expansion for dev11
7834         static_assert(0, "Visual Studio has a hard limit of argument count for a std::function expansion. Please define _VARIADIC_MAX to be 10. If you need more arguments than that VC12 and below cannot support it.");
7835         #endif
7836 
7837     }
7838 
7839 	//! \brief Return type of the functor
7840 	typedef Event result_type;
7841 
7842 	//! \brief Function signature of kernel functor with no event dependency.
7843 	typedef Event type_(
7844 		const EnqueueArgs&,
7845 		T0,
7846 		T1,
7847 		T2,
7848 		T3,
7849 		T4,
7850 		T5,
7851 		T6,
7852 		T7,
7853 		T8,
7854 		T9,
7855 		T10,
7856 		T11,
7857 		T12,
7858 		T13,
7859 		T14,
7860 		T15,
7861 		T16,
7862 		T17,
7863 		T18,
7864 		T19,
7865 		T20,
7866 		T21,
7867 		T22,
7868 		T23,
7869 		T24,
7870 		T25,
7871 		T26,
7872 		T27,
7873 		T28,
7874 		T29,
7875 		T30);
7876 
operator ()cl::detail::functionImplementation_7877 	Event operator()(
7878 		const EnqueueArgs& enqueueArgs,
7879 		T0 arg0,
7880 		T1 arg1,
7881 		T2 arg2,
7882 		T3 arg3,
7883 		T4 arg4,
7884 		T5 arg5,
7885 		T6 arg6,
7886 		T7 arg7,
7887 		T8 arg8,
7888 		T9 arg9,
7889 		T10 arg10,
7890 		T11 arg11,
7891 		T12 arg12,
7892 		T13 arg13,
7893 		T14 arg14,
7894 		T15 arg15,
7895 		T16 arg16,
7896 		T17 arg17,
7897 		T18 arg18,
7898 		T19 arg19,
7899 		T20 arg20,
7900 		T21 arg21,
7901 		T22 arg22,
7902 		T23 arg23,
7903 		T24 arg24,
7904 		T25 arg25,
7905 		T26 arg26,
7906 		T27 arg27,
7907 		T28 arg28,
7908 		T29 arg29,
7909 		T30 arg30)
7910 	{
7911 		return functor_(
7912 			enqueueArgs,
7913 			arg0,
7914 			arg1,
7915 			arg2,
7916 			arg3,
7917 			arg4,
7918 			arg5,
7919 			arg6,
7920 			arg7,
7921 			arg8,
7922 			arg9,
7923 			arg10,
7924 			arg11,
7925 			arg12,
7926 			arg13,
7927 			arg14,
7928 			arg15,
7929 			arg16,
7930 			arg17,
7931 			arg18,
7932 			arg19,
7933 			arg20,
7934 			arg21,
7935 			arg22,
7936 			arg23,
7937 			arg24,
7938 			arg25,
7939 			arg26,
7940 			arg27,
7941 			arg28,
7942 			arg29,
7943 			arg30);
7944 	}
7945 
7946 
7947 };
7948 
7949 template<
7950 	typename T0,
7951 	typename T1,
7952 	typename T2,
7953 	typename T3,
7954 	typename T4,
7955 	typename T5,
7956 	typename T6,
7957 	typename T7,
7958 	typename T8,
7959 	typename T9,
7960 	typename T10,
7961 	typename T11,
7962 	typename T12,
7963 	typename T13,
7964 	typename T14,
7965 	typename T15,
7966 	typename T16,
7967 	typename T17,
7968 	typename T18,
7969 	typename T19,
7970 	typename T20,
7971 	typename T21,
7972 	typename T22,
7973 	typename T23,
7974 	typename T24,
7975 	typename T25,
7976 	typename T26,
7977 	typename T27,
7978 	typename T28,
7979 	typename T29>
7980 struct functionImplementation_
7981 <	T0,
7982 	T1,
7983 	T2,
7984 	T3,
7985 	T4,
7986 	T5,
7987 	T6,
7988 	T7,
7989 	T8,
7990 	T9,
7991 	T10,
7992 	T11,
7993 	T12,
7994 	T13,
7995 	T14,
7996 	T15,
7997 	T16,
7998 	T17,
7999 	T18,
8000 	T19,
8001 	T20,
8002 	T21,
8003 	T22,
8004 	T23,
8005 	T24,
8006 	T25,
8007 	T26,
8008 	T27,
8009 	T28,
8010 	T29,
8011 	NullType,
8012 	NullType>
8013 {
8014 	typedef detail::KernelFunctorGlobal<
8015 		T0,
8016 		T1,
8017 		T2,
8018 		T3,
8019 		T4,
8020 		T5,
8021 		T6,
8022 		T7,
8023 		T8,
8024 		T9,
8025 		T10,
8026 		T11,
8027 		T12,
8028 		T13,
8029 		T14,
8030 		T15,
8031 		T16,
8032 		T17,
8033 		T18,
8034 		T19,
8035 		T20,
8036 		T21,
8037 		T22,
8038 		T23,
8039 		T24,
8040 		T25,
8041 		T26,
8042 		T27,
8043 		T28,
8044 		T29,
8045 		NullType,
8046 		NullType> FunctorType;
8047 
8048     FunctorType functor_;
8049 
functionImplementation_cl::detail::functionImplementation_8050     functionImplementation_(const FunctorType &functor) :
8051         functor_(functor)
8052     {
8053 
8054         #if (defined(_WIN32) && defined(_VARIADIC_MAX) && (_VARIADIC_MAX < 30))
8055         // Fail variadic expansion for dev11
8056         static_assert(0, "Visual Studio has a hard limit of argument count for a std::function expansion. Please define _VARIADIC_MAX to be 10. If you need more arguments than that VC12 and below cannot support it.");
8057         #endif
8058 
8059     }
8060 
8061 	//! \brief Return type of the functor
8062 	typedef Event result_type;
8063 
8064 	//! \brief Function signature of kernel functor with no event dependency.
8065 	typedef Event type_(
8066 		const EnqueueArgs&,
8067 		T0,
8068 		T1,
8069 		T2,
8070 		T3,
8071 		T4,
8072 		T5,
8073 		T6,
8074 		T7,
8075 		T8,
8076 		T9,
8077 		T10,
8078 		T11,
8079 		T12,
8080 		T13,
8081 		T14,
8082 		T15,
8083 		T16,
8084 		T17,
8085 		T18,
8086 		T19,
8087 		T20,
8088 		T21,
8089 		T22,
8090 		T23,
8091 		T24,
8092 		T25,
8093 		T26,
8094 		T27,
8095 		T28,
8096 		T29);
8097 
operator ()cl::detail::functionImplementation_8098 	Event operator()(
8099 		const EnqueueArgs& enqueueArgs,
8100 		T0 arg0,
8101 		T1 arg1,
8102 		T2 arg2,
8103 		T3 arg3,
8104 		T4 arg4,
8105 		T5 arg5,
8106 		T6 arg6,
8107 		T7 arg7,
8108 		T8 arg8,
8109 		T9 arg9,
8110 		T10 arg10,
8111 		T11 arg11,
8112 		T12 arg12,
8113 		T13 arg13,
8114 		T14 arg14,
8115 		T15 arg15,
8116 		T16 arg16,
8117 		T17 arg17,
8118 		T18 arg18,
8119 		T19 arg19,
8120 		T20 arg20,
8121 		T21 arg21,
8122 		T22 arg22,
8123 		T23 arg23,
8124 		T24 arg24,
8125 		T25 arg25,
8126 		T26 arg26,
8127 		T27 arg27,
8128 		T28 arg28,
8129 		T29 arg29)
8130 	{
8131 		return functor_(
8132 			enqueueArgs,
8133 			arg0,
8134 			arg1,
8135 			arg2,
8136 			arg3,
8137 			arg4,
8138 			arg5,
8139 			arg6,
8140 			arg7,
8141 			arg8,
8142 			arg9,
8143 			arg10,
8144 			arg11,
8145 			arg12,
8146 			arg13,
8147 			arg14,
8148 			arg15,
8149 			arg16,
8150 			arg17,
8151 			arg18,
8152 			arg19,
8153 			arg20,
8154 			arg21,
8155 			arg22,
8156 			arg23,
8157 			arg24,
8158 			arg25,
8159 			arg26,
8160 			arg27,
8161 			arg28,
8162 			arg29);
8163 	}
8164 
8165 
8166 };
8167 
8168 template<
8169 	typename T0,
8170 	typename T1,
8171 	typename T2,
8172 	typename T3,
8173 	typename T4,
8174 	typename T5,
8175 	typename T6,
8176 	typename T7,
8177 	typename T8,
8178 	typename T9,
8179 	typename T10,
8180 	typename T11,
8181 	typename T12,
8182 	typename T13,
8183 	typename T14,
8184 	typename T15,
8185 	typename T16,
8186 	typename T17,
8187 	typename T18,
8188 	typename T19,
8189 	typename T20,
8190 	typename T21,
8191 	typename T22,
8192 	typename T23,
8193 	typename T24,
8194 	typename T25,
8195 	typename T26,
8196 	typename T27,
8197 	typename T28>
8198 struct functionImplementation_
8199 <	T0,
8200 	T1,
8201 	T2,
8202 	T3,
8203 	T4,
8204 	T5,
8205 	T6,
8206 	T7,
8207 	T8,
8208 	T9,
8209 	T10,
8210 	T11,
8211 	T12,
8212 	T13,
8213 	T14,
8214 	T15,
8215 	T16,
8216 	T17,
8217 	T18,
8218 	T19,
8219 	T20,
8220 	T21,
8221 	T22,
8222 	T23,
8223 	T24,
8224 	T25,
8225 	T26,
8226 	T27,
8227 	T28,
8228 	NullType,
8229 	NullType,
8230 	NullType>
8231 {
8232 	typedef detail::KernelFunctorGlobal<
8233 		T0,
8234 		T1,
8235 		T2,
8236 		T3,
8237 		T4,
8238 		T5,
8239 		T6,
8240 		T7,
8241 		T8,
8242 		T9,
8243 		T10,
8244 		T11,
8245 		T12,
8246 		T13,
8247 		T14,
8248 		T15,
8249 		T16,
8250 		T17,
8251 		T18,
8252 		T19,
8253 		T20,
8254 		T21,
8255 		T22,
8256 		T23,
8257 		T24,
8258 		T25,
8259 		T26,
8260 		T27,
8261 		T28,
8262 		NullType,
8263 		NullType,
8264 		NullType> FunctorType;
8265 
8266     FunctorType functor_;
8267 
functionImplementation_cl::detail::functionImplementation_8268     functionImplementation_(const FunctorType &functor) :
8269         functor_(functor)
8270     {
8271 
8272         #if (defined(_WIN32) && defined(_VARIADIC_MAX) && (_VARIADIC_MAX < 29))
8273         // Fail variadic expansion for dev11
8274         static_assert(0, "Visual Studio has a hard limit of argument count for a std::function expansion. Please define _VARIADIC_MAX to be 10. If you need more arguments than that VC12 and below cannot support it.");
8275         #endif
8276 
8277     }
8278 
8279 	//! \brief Return type of the functor
8280 	typedef Event result_type;
8281 
8282 	//! \brief Function signature of kernel functor with no event dependency.
8283 	typedef Event type_(
8284 		const EnqueueArgs&,
8285 		T0,
8286 		T1,
8287 		T2,
8288 		T3,
8289 		T4,
8290 		T5,
8291 		T6,
8292 		T7,
8293 		T8,
8294 		T9,
8295 		T10,
8296 		T11,
8297 		T12,
8298 		T13,
8299 		T14,
8300 		T15,
8301 		T16,
8302 		T17,
8303 		T18,
8304 		T19,
8305 		T20,
8306 		T21,
8307 		T22,
8308 		T23,
8309 		T24,
8310 		T25,
8311 		T26,
8312 		T27,
8313 		T28);
8314 
operator ()cl::detail::functionImplementation_8315 	Event operator()(
8316 		const EnqueueArgs& enqueueArgs,
8317 		T0 arg0,
8318 		T1 arg1,
8319 		T2 arg2,
8320 		T3 arg3,
8321 		T4 arg4,
8322 		T5 arg5,
8323 		T6 arg6,
8324 		T7 arg7,
8325 		T8 arg8,
8326 		T9 arg9,
8327 		T10 arg10,
8328 		T11 arg11,
8329 		T12 arg12,
8330 		T13 arg13,
8331 		T14 arg14,
8332 		T15 arg15,
8333 		T16 arg16,
8334 		T17 arg17,
8335 		T18 arg18,
8336 		T19 arg19,
8337 		T20 arg20,
8338 		T21 arg21,
8339 		T22 arg22,
8340 		T23 arg23,
8341 		T24 arg24,
8342 		T25 arg25,
8343 		T26 arg26,
8344 		T27 arg27,
8345 		T28 arg28)
8346 	{
8347 		return functor_(
8348 			enqueueArgs,
8349 			arg0,
8350 			arg1,
8351 			arg2,
8352 			arg3,
8353 			arg4,
8354 			arg5,
8355 			arg6,
8356 			arg7,
8357 			arg8,
8358 			arg9,
8359 			arg10,
8360 			arg11,
8361 			arg12,
8362 			arg13,
8363 			arg14,
8364 			arg15,
8365 			arg16,
8366 			arg17,
8367 			arg18,
8368 			arg19,
8369 			arg20,
8370 			arg21,
8371 			arg22,
8372 			arg23,
8373 			arg24,
8374 			arg25,
8375 			arg26,
8376 			arg27,
8377 			arg28);
8378 	}
8379 
8380 
8381 };
8382 
8383 template<
8384 	typename T0,
8385 	typename T1,
8386 	typename T2,
8387 	typename T3,
8388 	typename T4,
8389 	typename T5,
8390 	typename T6,
8391 	typename T7,
8392 	typename T8,
8393 	typename T9,
8394 	typename T10,
8395 	typename T11,
8396 	typename T12,
8397 	typename T13,
8398 	typename T14,
8399 	typename T15,
8400 	typename T16,
8401 	typename T17,
8402 	typename T18,
8403 	typename T19,
8404 	typename T20,
8405 	typename T21,
8406 	typename T22,
8407 	typename T23,
8408 	typename T24,
8409 	typename T25,
8410 	typename T26,
8411 	typename T27>
8412 struct functionImplementation_
8413 <	T0,
8414 	T1,
8415 	T2,
8416 	T3,
8417 	T4,
8418 	T5,
8419 	T6,
8420 	T7,
8421 	T8,
8422 	T9,
8423 	T10,
8424 	T11,
8425 	T12,
8426 	T13,
8427 	T14,
8428 	T15,
8429 	T16,
8430 	T17,
8431 	T18,
8432 	T19,
8433 	T20,
8434 	T21,
8435 	T22,
8436 	T23,
8437 	T24,
8438 	T25,
8439 	T26,
8440 	T27,
8441 	NullType,
8442 	NullType,
8443 	NullType,
8444 	NullType>
8445 {
8446 	typedef detail::KernelFunctorGlobal<
8447 		T0,
8448 		T1,
8449 		T2,
8450 		T3,
8451 		T4,
8452 		T5,
8453 		T6,
8454 		T7,
8455 		T8,
8456 		T9,
8457 		T10,
8458 		T11,
8459 		T12,
8460 		T13,
8461 		T14,
8462 		T15,
8463 		T16,
8464 		T17,
8465 		T18,
8466 		T19,
8467 		T20,
8468 		T21,
8469 		T22,
8470 		T23,
8471 		T24,
8472 		T25,
8473 		T26,
8474 		T27,
8475 		NullType,
8476 		NullType,
8477 		NullType,
8478 		NullType> FunctorType;
8479 
8480     FunctorType functor_;
8481 
functionImplementation_cl::detail::functionImplementation_8482     functionImplementation_(const FunctorType &functor) :
8483         functor_(functor)
8484     {
8485 
8486         #if (defined(_WIN32) && defined(_VARIADIC_MAX) && (_VARIADIC_MAX < 28))
8487         // Fail variadic expansion for dev11
8488         static_assert(0, "Visual Studio has a hard limit of argument count for a std::function expansion. Please define _VARIADIC_MAX to be 10. If you need more arguments than that VC12 and below cannot support it.");
8489         #endif
8490 
8491     }
8492 
8493 	//! \brief Return type of the functor
8494 	typedef Event result_type;
8495 
8496 	//! \brief Function signature of kernel functor with no event dependency.
8497 	typedef Event type_(
8498 		const EnqueueArgs&,
8499 		T0,
8500 		T1,
8501 		T2,
8502 		T3,
8503 		T4,
8504 		T5,
8505 		T6,
8506 		T7,
8507 		T8,
8508 		T9,
8509 		T10,
8510 		T11,
8511 		T12,
8512 		T13,
8513 		T14,
8514 		T15,
8515 		T16,
8516 		T17,
8517 		T18,
8518 		T19,
8519 		T20,
8520 		T21,
8521 		T22,
8522 		T23,
8523 		T24,
8524 		T25,
8525 		T26,
8526 		T27);
8527 
operator ()cl::detail::functionImplementation_8528 	Event operator()(
8529 		const EnqueueArgs& enqueueArgs,
8530 		T0 arg0,
8531 		T1 arg1,
8532 		T2 arg2,
8533 		T3 arg3,
8534 		T4 arg4,
8535 		T5 arg5,
8536 		T6 arg6,
8537 		T7 arg7,
8538 		T8 arg8,
8539 		T9 arg9,
8540 		T10 arg10,
8541 		T11 arg11,
8542 		T12 arg12,
8543 		T13 arg13,
8544 		T14 arg14,
8545 		T15 arg15,
8546 		T16 arg16,
8547 		T17 arg17,
8548 		T18 arg18,
8549 		T19 arg19,
8550 		T20 arg20,
8551 		T21 arg21,
8552 		T22 arg22,
8553 		T23 arg23,
8554 		T24 arg24,
8555 		T25 arg25,
8556 		T26 arg26,
8557 		T27 arg27)
8558 	{
8559 		return functor_(
8560 			enqueueArgs,
8561 			arg0,
8562 			arg1,
8563 			arg2,
8564 			arg3,
8565 			arg4,
8566 			arg5,
8567 			arg6,
8568 			arg7,
8569 			arg8,
8570 			arg9,
8571 			arg10,
8572 			arg11,
8573 			arg12,
8574 			arg13,
8575 			arg14,
8576 			arg15,
8577 			arg16,
8578 			arg17,
8579 			arg18,
8580 			arg19,
8581 			arg20,
8582 			arg21,
8583 			arg22,
8584 			arg23,
8585 			arg24,
8586 			arg25,
8587 			arg26,
8588 			arg27);
8589 	}
8590 
8591 
8592 };
8593 
8594 template<
8595 	typename T0,
8596 	typename T1,
8597 	typename T2,
8598 	typename T3,
8599 	typename T4,
8600 	typename T5,
8601 	typename T6,
8602 	typename T7,
8603 	typename T8,
8604 	typename T9,
8605 	typename T10,
8606 	typename T11,
8607 	typename T12,
8608 	typename T13,
8609 	typename T14,
8610 	typename T15,
8611 	typename T16,
8612 	typename T17,
8613 	typename T18,
8614 	typename T19,
8615 	typename T20,
8616 	typename T21,
8617 	typename T22,
8618 	typename T23,
8619 	typename T24,
8620 	typename T25,
8621 	typename T26>
8622 struct functionImplementation_
8623 <	T0,
8624 	T1,
8625 	T2,
8626 	T3,
8627 	T4,
8628 	T5,
8629 	T6,
8630 	T7,
8631 	T8,
8632 	T9,
8633 	T10,
8634 	T11,
8635 	T12,
8636 	T13,
8637 	T14,
8638 	T15,
8639 	T16,
8640 	T17,
8641 	T18,
8642 	T19,
8643 	T20,
8644 	T21,
8645 	T22,
8646 	T23,
8647 	T24,
8648 	T25,
8649 	T26,
8650 	NullType,
8651 	NullType,
8652 	NullType,
8653 	NullType,
8654 	NullType>
8655 {
8656 	typedef detail::KernelFunctorGlobal<
8657 		T0,
8658 		T1,
8659 		T2,
8660 		T3,
8661 		T4,
8662 		T5,
8663 		T6,
8664 		T7,
8665 		T8,
8666 		T9,
8667 		T10,
8668 		T11,
8669 		T12,
8670 		T13,
8671 		T14,
8672 		T15,
8673 		T16,
8674 		T17,
8675 		T18,
8676 		T19,
8677 		T20,
8678 		T21,
8679 		T22,
8680 		T23,
8681 		T24,
8682 		T25,
8683 		T26,
8684 		NullType,
8685 		NullType,
8686 		NullType,
8687 		NullType,
8688 		NullType> FunctorType;
8689 
8690     FunctorType functor_;
8691 
functionImplementation_cl::detail::functionImplementation_8692     functionImplementation_(const FunctorType &functor) :
8693         functor_(functor)
8694     {
8695 
8696         #if (defined(_WIN32) && defined(_VARIADIC_MAX) && (_VARIADIC_MAX < 27))
8697         // Fail variadic expansion for dev11
8698         static_assert(0, "Visual Studio has a hard limit of argument count for a std::function expansion. Please define _VARIADIC_MAX to be 10. If you need more arguments than that VC12 and below cannot support it.");
8699         #endif
8700 
8701     }
8702 
8703 	//! \brief Return type of the functor
8704 	typedef Event result_type;
8705 
8706 	//! \brief Function signature of kernel functor with no event dependency.
8707 	typedef Event type_(
8708 		const EnqueueArgs&,
8709 		T0,
8710 		T1,
8711 		T2,
8712 		T3,
8713 		T4,
8714 		T5,
8715 		T6,
8716 		T7,
8717 		T8,
8718 		T9,
8719 		T10,
8720 		T11,
8721 		T12,
8722 		T13,
8723 		T14,
8724 		T15,
8725 		T16,
8726 		T17,
8727 		T18,
8728 		T19,
8729 		T20,
8730 		T21,
8731 		T22,
8732 		T23,
8733 		T24,
8734 		T25,
8735 		T26);
8736 
operator ()cl::detail::functionImplementation_8737 	Event operator()(
8738 		const EnqueueArgs& enqueueArgs,
8739 		T0 arg0,
8740 		T1 arg1,
8741 		T2 arg2,
8742 		T3 arg3,
8743 		T4 arg4,
8744 		T5 arg5,
8745 		T6 arg6,
8746 		T7 arg7,
8747 		T8 arg8,
8748 		T9 arg9,
8749 		T10 arg10,
8750 		T11 arg11,
8751 		T12 arg12,
8752 		T13 arg13,
8753 		T14 arg14,
8754 		T15 arg15,
8755 		T16 arg16,
8756 		T17 arg17,
8757 		T18 arg18,
8758 		T19 arg19,
8759 		T20 arg20,
8760 		T21 arg21,
8761 		T22 arg22,
8762 		T23 arg23,
8763 		T24 arg24,
8764 		T25 arg25,
8765 		T26 arg26)
8766 	{
8767 		return functor_(
8768 			enqueueArgs,
8769 			arg0,
8770 			arg1,
8771 			arg2,
8772 			arg3,
8773 			arg4,
8774 			arg5,
8775 			arg6,
8776 			arg7,
8777 			arg8,
8778 			arg9,
8779 			arg10,
8780 			arg11,
8781 			arg12,
8782 			arg13,
8783 			arg14,
8784 			arg15,
8785 			arg16,
8786 			arg17,
8787 			arg18,
8788 			arg19,
8789 			arg20,
8790 			arg21,
8791 			arg22,
8792 			arg23,
8793 			arg24,
8794 			arg25,
8795 			arg26);
8796 	}
8797 
8798 
8799 };
8800 
8801 template<
8802 	typename T0,
8803 	typename T1,
8804 	typename T2,
8805 	typename T3,
8806 	typename T4,
8807 	typename T5,
8808 	typename T6,
8809 	typename T7,
8810 	typename T8,
8811 	typename T9,
8812 	typename T10,
8813 	typename T11,
8814 	typename T12,
8815 	typename T13,
8816 	typename T14,
8817 	typename T15,
8818 	typename T16,
8819 	typename T17,
8820 	typename T18,
8821 	typename T19,
8822 	typename T20,
8823 	typename T21,
8824 	typename T22,
8825 	typename T23,
8826 	typename T24,
8827 	typename T25>
8828 struct functionImplementation_
8829 <	T0,
8830 	T1,
8831 	T2,
8832 	T3,
8833 	T4,
8834 	T5,
8835 	T6,
8836 	T7,
8837 	T8,
8838 	T9,
8839 	T10,
8840 	T11,
8841 	T12,
8842 	T13,
8843 	T14,
8844 	T15,
8845 	T16,
8846 	T17,
8847 	T18,
8848 	T19,
8849 	T20,
8850 	T21,
8851 	T22,
8852 	T23,
8853 	T24,
8854 	T25,
8855 	NullType,
8856 	NullType,
8857 	NullType,
8858 	NullType,
8859 	NullType,
8860 	NullType>
8861 {
8862 	typedef detail::KernelFunctorGlobal<
8863 		T0,
8864 		T1,
8865 		T2,
8866 		T3,
8867 		T4,
8868 		T5,
8869 		T6,
8870 		T7,
8871 		T8,
8872 		T9,
8873 		T10,
8874 		T11,
8875 		T12,
8876 		T13,
8877 		T14,
8878 		T15,
8879 		T16,
8880 		T17,
8881 		T18,
8882 		T19,
8883 		T20,
8884 		T21,
8885 		T22,
8886 		T23,
8887 		T24,
8888 		T25,
8889 		NullType,
8890 		NullType,
8891 		NullType,
8892 		NullType,
8893 		NullType,
8894 		NullType> FunctorType;
8895 
8896     FunctorType functor_;
8897 
functionImplementation_cl::detail::functionImplementation_8898     functionImplementation_(const FunctorType &functor) :
8899         functor_(functor)
8900     {
8901 
8902         #if (defined(_WIN32) && defined(_VARIADIC_MAX) && (_VARIADIC_MAX < 26))
8903         // Fail variadic expansion for dev11
8904         static_assert(0, "Visual Studio has a hard limit of argument count for a std::function expansion. Please define _VARIADIC_MAX to be 10. If you need more arguments than that VC12 and below cannot support it.");
8905         #endif
8906 
8907     }
8908 
8909 	//! \brief Return type of the functor
8910 	typedef Event result_type;
8911 
8912 	//! \brief Function signature of kernel functor with no event dependency.
8913 	typedef Event type_(
8914 		const EnqueueArgs&,
8915 		T0,
8916 		T1,
8917 		T2,
8918 		T3,
8919 		T4,
8920 		T5,
8921 		T6,
8922 		T7,
8923 		T8,
8924 		T9,
8925 		T10,
8926 		T11,
8927 		T12,
8928 		T13,
8929 		T14,
8930 		T15,
8931 		T16,
8932 		T17,
8933 		T18,
8934 		T19,
8935 		T20,
8936 		T21,
8937 		T22,
8938 		T23,
8939 		T24,
8940 		T25);
8941 
operator ()cl::detail::functionImplementation_8942 	Event operator()(
8943 		const EnqueueArgs& enqueueArgs,
8944 		T0 arg0,
8945 		T1 arg1,
8946 		T2 arg2,
8947 		T3 arg3,
8948 		T4 arg4,
8949 		T5 arg5,
8950 		T6 arg6,
8951 		T7 arg7,
8952 		T8 arg8,
8953 		T9 arg9,
8954 		T10 arg10,
8955 		T11 arg11,
8956 		T12 arg12,
8957 		T13 arg13,
8958 		T14 arg14,
8959 		T15 arg15,
8960 		T16 arg16,
8961 		T17 arg17,
8962 		T18 arg18,
8963 		T19 arg19,
8964 		T20 arg20,
8965 		T21 arg21,
8966 		T22 arg22,
8967 		T23 arg23,
8968 		T24 arg24,
8969 		T25 arg25)
8970 	{
8971 		return functor_(
8972 			enqueueArgs,
8973 			arg0,
8974 			arg1,
8975 			arg2,
8976 			arg3,
8977 			arg4,
8978 			arg5,
8979 			arg6,
8980 			arg7,
8981 			arg8,
8982 			arg9,
8983 			arg10,
8984 			arg11,
8985 			arg12,
8986 			arg13,
8987 			arg14,
8988 			arg15,
8989 			arg16,
8990 			arg17,
8991 			arg18,
8992 			arg19,
8993 			arg20,
8994 			arg21,
8995 			arg22,
8996 			arg23,
8997 			arg24,
8998 			arg25);
8999 	}
9000 
9001 
9002 };
9003 
9004 template<
9005 	typename T0,
9006 	typename T1,
9007 	typename T2,
9008 	typename T3,
9009 	typename T4,
9010 	typename T5,
9011 	typename T6,
9012 	typename T7,
9013 	typename T8,
9014 	typename T9,
9015 	typename T10,
9016 	typename T11,
9017 	typename T12,
9018 	typename T13,
9019 	typename T14,
9020 	typename T15,
9021 	typename T16,
9022 	typename T17,
9023 	typename T18,
9024 	typename T19,
9025 	typename T20,
9026 	typename T21,
9027 	typename T22,
9028 	typename T23,
9029 	typename T24>
9030 struct functionImplementation_
9031 <	T0,
9032 	T1,
9033 	T2,
9034 	T3,
9035 	T4,
9036 	T5,
9037 	T6,
9038 	T7,
9039 	T8,
9040 	T9,
9041 	T10,
9042 	T11,
9043 	T12,
9044 	T13,
9045 	T14,
9046 	T15,
9047 	T16,
9048 	T17,
9049 	T18,
9050 	T19,
9051 	T20,
9052 	T21,
9053 	T22,
9054 	T23,
9055 	T24,
9056 	NullType,
9057 	NullType,
9058 	NullType,
9059 	NullType,
9060 	NullType,
9061 	NullType,
9062 	NullType>
9063 {
9064 	typedef detail::KernelFunctorGlobal<
9065 		T0,
9066 		T1,
9067 		T2,
9068 		T3,
9069 		T4,
9070 		T5,
9071 		T6,
9072 		T7,
9073 		T8,
9074 		T9,
9075 		T10,
9076 		T11,
9077 		T12,
9078 		T13,
9079 		T14,
9080 		T15,
9081 		T16,
9082 		T17,
9083 		T18,
9084 		T19,
9085 		T20,
9086 		T21,
9087 		T22,
9088 		T23,
9089 		T24,
9090 		NullType,
9091 		NullType,
9092 		NullType,
9093 		NullType,
9094 		NullType,
9095 		NullType,
9096 		NullType> FunctorType;
9097 
9098     FunctorType functor_;
9099 
functionImplementation_cl::detail::functionImplementation_9100     functionImplementation_(const FunctorType &functor) :
9101         functor_(functor)
9102     {
9103 
9104         #if (defined(_WIN32) && defined(_VARIADIC_MAX) && (_VARIADIC_MAX < 25))
9105         // Fail variadic expansion for dev11
9106         static_assert(0, "Visual Studio has a hard limit of argument count for a std::function expansion. Please define _VARIADIC_MAX to be 10. If you need more arguments than that VC12 and below cannot support it.");
9107         #endif
9108 
9109     }
9110 
9111 	//! \brief Return type of the functor
9112 	typedef Event result_type;
9113 
9114 	//! \brief Function signature of kernel functor with no event dependency.
9115 	typedef Event type_(
9116 		const EnqueueArgs&,
9117 		T0,
9118 		T1,
9119 		T2,
9120 		T3,
9121 		T4,
9122 		T5,
9123 		T6,
9124 		T7,
9125 		T8,
9126 		T9,
9127 		T10,
9128 		T11,
9129 		T12,
9130 		T13,
9131 		T14,
9132 		T15,
9133 		T16,
9134 		T17,
9135 		T18,
9136 		T19,
9137 		T20,
9138 		T21,
9139 		T22,
9140 		T23,
9141 		T24);
9142 
operator ()cl::detail::functionImplementation_9143 	Event operator()(
9144 		const EnqueueArgs& enqueueArgs,
9145 		T0 arg0,
9146 		T1 arg1,
9147 		T2 arg2,
9148 		T3 arg3,
9149 		T4 arg4,
9150 		T5 arg5,
9151 		T6 arg6,
9152 		T7 arg7,
9153 		T8 arg8,
9154 		T9 arg9,
9155 		T10 arg10,
9156 		T11 arg11,
9157 		T12 arg12,
9158 		T13 arg13,
9159 		T14 arg14,
9160 		T15 arg15,
9161 		T16 arg16,
9162 		T17 arg17,
9163 		T18 arg18,
9164 		T19 arg19,
9165 		T20 arg20,
9166 		T21 arg21,
9167 		T22 arg22,
9168 		T23 arg23,
9169 		T24 arg24)
9170 	{
9171 		return functor_(
9172 			enqueueArgs,
9173 			arg0,
9174 			arg1,
9175 			arg2,
9176 			arg3,
9177 			arg4,
9178 			arg5,
9179 			arg6,
9180 			arg7,
9181 			arg8,
9182 			arg9,
9183 			arg10,
9184 			arg11,
9185 			arg12,
9186 			arg13,
9187 			arg14,
9188 			arg15,
9189 			arg16,
9190 			arg17,
9191 			arg18,
9192 			arg19,
9193 			arg20,
9194 			arg21,
9195 			arg22,
9196 			arg23,
9197 			arg24);
9198 	}
9199 
9200 
9201 };
9202 
9203 template<
9204 	typename T0,
9205 	typename T1,
9206 	typename T2,
9207 	typename T3,
9208 	typename T4,
9209 	typename T5,
9210 	typename T6,
9211 	typename T7,
9212 	typename T8,
9213 	typename T9,
9214 	typename T10,
9215 	typename T11,
9216 	typename T12,
9217 	typename T13,
9218 	typename T14,
9219 	typename T15,
9220 	typename T16,
9221 	typename T17,
9222 	typename T18,
9223 	typename T19,
9224 	typename T20,
9225 	typename T21,
9226 	typename T22,
9227 	typename T23>
9228 struct functionImplementation_
9229 <	T0,
9230 	T1,
9231 	T2,
9232 	T3,
9233 	T4,
9234 	T5,
9235 	T6,
9236 	T7,
9237 	T8,
9238 	T9,
9239 	T10,
9240 	T11,
9241 	T12,
9242 	T13,
9243 	T14,
9244 	T15,
9245 	T16,
9246 	T17,
9247 	T18,
9248 	T19,
9249 	T20,
9250 	T21,
9251 	T22,
9252 	T23,
9253 	NullType,
9254 	NullType,
9255 	NullType,
9256 	NullType,
9257 	NullType,
9258 	NullType,
9259 	NullType,
9260 	NullType>
9261 {
9262 	typedef detail::KernelFunctorGlobal<
9263 		T0,
9264 		T1,
9265 		T2,
9266 		T3,
9267 		T4,
9268 		T5,
9269 		T6,
9270 		T7,
9271 		T8,
9272 		T9,
9273 		T10,
9274 		T11,
9275 		T12,
9276 		T13,
9277 		T14,
9278 		T15,
9279 		T16,
9280 		T17,
9281 		T18,
9282 		T19,
9283 		T20,
9284 		T21,
9285 		T22,
9286 		T23,
9287 		NullType,
9288 		NullType,
9289 		NullType,
9290 		NullType,
9291 		NullType,
9292 		NullType,
9293 		NullType,
9294 		NullType> FunctorType;
9295 
9296     FunctorType functor_;
9297 
functionImplementation_cl::detail::functionImplementation_9298     functionImplementation_(const FunctorType &functor) :
9299         functor_(functor)
9300     {
9301 
9302         #if (defined(_WIN32) && defined(_VARIADIC_MAX) && (_VARIADIC_MAX < 24))
9303         // Fail variadic expansion for dev11
9304         static_assert(0, "Visual Studio has a hard limit of argument count for a std::function expansion. Please define _VARIADIC_MAX to be 10. If you need more arguments than that VC12 and below cannot support it.");
9305         #endif
9306 
9307     }
9308 
9309 	//! \brief Return type of the functor
9310 	typedef Event result_type;
9311 
9312 	//! \brief Function signature of kernel functor with no event dependency.
9313 	typedef Event type_(
9314 		const EnqueueArgs&,
9315 		T0,
9316 		T1,
9317 		T2,
9318 		T3,
9319 		T4,
9320 		T5,
9321 		T6,
9322 		T7,
9323 		T8,
9324 		T9,
9325 		T10,
9326 		T11,
9327 		T12,
9328 		T13,
9329 		T14,
9330 		T15,
9331 		T16,
9332 		T17,
9333 		T18,
9334 		T19,
9335 		T20,
9336 		T21,
9337 		T22,
9338 		T23);
9339 
operator ()cl::detail::functionImplementation_9340 	Event operator()(
9341 		const EnqueueArgs& enqueueArgs,
9342 		T0 arg0,
9343 		T1 arg1,
9344 		T2 arg2,
9345 		T3 arg3,
9346 		T4 arg4,
9347 		T5 arg5,
9348 		T6 arg6,
9349 		T7 arg7,
9350 		T8 arg8,
9351 		T9 arg9,
9352 		T10 arg10,
9353 		T11 arg11,
9354 		T12 arg12,
9355 		T13 arg13,
9356 		T14 arg14,
9357 		T15 arg15,
9358 		T16 arg16,
9359 		T17 arg17,
9360 		T18 arg18,
9361 		T19 arg19,
9362 		T20 arg20,
9363 		T21 arg21,
9364 		T22 arg22,
9365 		T23 arg23)
9366 	{
9367 		return functor_(
9368 			enqueueArgs,
9369 			arg0,
9370 			arg1,
9371 			arg2,
9372 			arg3,
9373 			arg4,
9374 			arg5,
9375 			arg6,
9376 			arg7,
9377 			arg8,
9378 			arg9,
9379 			arg10,
9380 			arg11,
9381 			arg12,
9382 			arg13,
9383 			arg14,
9384 			arg15,
9385 			arg16,
9386 			arg17,
9387 			arg18,
9388 			arg19,
9389 			arg20,
9390 			arg21,
9391 			arg22,
9392 			arg23);
9393 	}
9394 
9395 
9396 };
9397 
9398 template<
9399 	typename T0,
9400 	typename T1,
9401 	typename T2,
9402 	typename T3,
9403 	typename T4,
9404 	typename T5,
9405 	typename T6,
9406 	typename T7,
9407 	typename T8,
9408 	typename T9,
9409 	typename T10,
9410 	typename T11,
9411 	typename T12,
9412 	typename T13,
9413 	typename T14,
9414 	typename T15,
9415 	typename T16,
9416 	typename T17,
9417 	typename T18,
9418 	typename T19,
9419 	typename T20,
9420 	typename T21,
9421 	typename T22>
9422 struct functionImplementation_
9423 <	T0,
9424 	T1,
9425 	T2,
9426 	T3,
9427 	T4,
9428 	T5,
9429 	T6,
9430 	T7,
9431 	T8,
9432 	T9,
9433 	T10,
9434 	T11,
9435 	T12,
9436 	T13,
9437 	T14,
9438 	T15,
9439 	T16,
9440 	T17,
9441 	T18,
9442 	T19,
9443 	T20,
9444 	T21,
9445 	T22,
9446 	NullType,
9447 	NullType,
9448 	NullType,
9449 	NullType,
9450 	NullType,
9451 	NullType,
9452 	NullType,
9453 	NullType,
9454 	NullType>
9455 {
9456 	typedef detail::KernelFunctorGlobal<
9457 		T0,
9458 		T1,
9459 		T2,
9460 		T3,
9461 		T4,
9462 		T5,
9463 		T6,
9464 		T7,
9465 		T8,
9466 		T9,
9467 		T10,
9468 		T11,
9469 		T12,
9470 		T13,
9471 		T14,
9472 		T15,
9473 		T16,
9474 		T17,
9475 		T18,
9476 		T19,
9477 		T20,
9478 		T21,
9479 		T22,
9480 		NullType,
9481 		NullType,
9482 		NullType,
9483 		NullType,
9484 		NullType,
9485 		NullType,
9486 		NullType,
9487 		NullType,
9488 		NullType> FunctorType;
9489 
9490     FunctorType functor_;
9491 
functionImplementation_cl::detail::functionImplementation_9492     functionImplementation_(const FunctorType &functor) :
9493         functor_(functor)
9494     {
9495 
9496         #if (defined(_WIN32) && defined(_VARIADIC_MAX) && (_VARIADIC_MAX < 23))
9497         // Fail variadic expansion for dev11
9498         static_assert(0, "Visual Studio has a hard limit of argument count for a std::function expansion. Please define _VARIADIC_MAX to be 10. If you need more arguments than that VC12 and below cannot support it.");
9499         #endif
9500 
9501     }
9502 
9503 	//! \brief Return type of the functor
9504 	typedef Event result_type;
9505 
9506 	//! \brief Function signature of kernel functor with no event dependency.
9507 	typedef Event type_(
9508 		const EnqueueArgs&,
9509 		T0,
9510 		T1,
9511 		T2,
9512 		T3,
9513 		T4,
9514 		T5,
9515 		T6,
9516 		T7,
9517 		T8,
9518 		T9,
9519 		T10,
9520 		T11,
9521 		T12,
9522 		T13,
9523 		T14,
9524 		T15,
9525 		T16,
9526 		T17,
9527 		T18,
9528 		T19,
9529 		T20,
9530 		T21,
9531 		T22);
9532 
operator ()cl::detail::functionImplementation_9533 	Event operator()(
9534 		const EnqueueArgs& enqueueArgs,
9535 		T0 arg0,
9536 		T1 arg1,
9537 		T2 arg2,
9538 		T3 arg3,
9539 		T4 arg4,
9540 		T5 arg5,
9541 		T6 arg6,
9542 		T7 arg7,
9543 		T8 arg8,
9544 		T9 arg9,
9545 		T10 arg10,
9546 		T11 arg11,
9547 		T12 arg12,
9548 		T13 arg13,
9549 		T14 arg14,
9550 		T15 arg15,
9551 		T16 arg16,
9552 		T17 arg17,
9553 		T18 arg18,
9554 		T19 arg19,
9555 		T20 arg20,
9556 		T21 arg21,
9557 		T22 arg22)
9558 	{
9559 		return functor_(
9560 			enqueueArgs,
9561 			arg0,
9562 			arg1,
9563 			arg2,
9564 			arg3,
9565 			arg4,
9566 			arg5,
9567 			arg6,
9568 			arg7,
9569 			arg8,
9570 			arg9,
9571 			arg10,
9572 			arg11,
9573 			arg12,
9574 			arg13,
9575 			arg14,
9576 			arg15,
9577 			arg16,
9578 			arg17,
9579 			arg18,
9580 			arg19,
9581 			arg20,
9582 			arg21,
9583 			arg22);
9584 	}
9585 
9586 
9587 };
9588 
9589 template<
9590 	typename T0,
9591 	typename T1,
9592 	typename T2,
9593 	typename T3,
9594 	typename T4,
9595 	typename T5,
9596 	typename T6,
9597 	typename T7,
9598 	typename T8,
9599 	typename T9,
9600 	typename T10,
9601 	typename T11,
9602 	typename T12,
9603 	typename T13,
9604 	typename T14,
9605 	typename T15,
9606 	typename T16,
9607 	typename T17,
9608 	typename T18,
9609 	typename T19,
9610 	typename T20,
9611 	typename T21>
9612 struct functionImplementation_
9613 <	T0,
9614 	T1,
9615 	T2,
9616 	T3,
9617 	T4,
9618 	T5,
9619 	T6,
9620 	T7,
9621 	T8,
9622 	T9,
9623 	T10,
9624 	T11,
9625 	T12,
9626 	T13,
9627 	T14,
9628 	T15,
9629 	T16,
9630 	T17,
9631 	T18,
9632 	T19,
9633 	T20,
9634 	T21,
9635 	NullType,
9636 	NullType,
9637 	NullType,
9638 	NullType,
9639 	NullType,
9640 	NullType,
9641 	NullType,
9642 	NullType,
9643 	NullType,
9644 	NullType>
9645 {
9646 	typedef detail::KernelFunctorGlobal<
9647 		T0,
9648 		T1,
9649 		T2,
9650 		T3,
9651 		T4,
9652 		T5,
9653 		T6,
9654 		T7,
9655 		T8,
9656 		T9,
9657 		T10,
9658 		T11,
9659 		T12,
9660 		T13,
9661 		T14,
9662 		T15,
9663 		T16,
9664 		T17,
9665 		T18,
9666 		T19,
9667 		T20,
9668 		T21,
9669 		NullType,
9670 		NullType,
9671 		NullType,
9672 		NullType,
9673 		NullType,
9674 		NullType,
9675 		NullType,
9676 		NullType,
9677 		NullType,
9678 		NullType> FunctorType;
9679 
9680     FunctorType functor_;
9681 
functionImplementation_cl::detail::functionImplementation_9682     functionImplementation_(const FunctorType &functor) :
9683         functor_(functor)
9684     {
9685 
9686         #if (defined(_WIN32) && defined(_VARIADIC_MAX) && (_VARIADIC_MAX < 22))
9687         // Fail variadic expansion for dev11
9688         static_assert(0, "Visual Studio has a hard limit of argument count for a std::function expansion. Please define _VARIADIC_MAX to be 10. If you need more arguments than that VC12 and below cannot support it.");
9689         #endif
9690 
9691     }
9692 
9693 	//! \brief Return type of the functor
9694 	typedef Event result_type;
9695 
9696 	//! \brief Function signature of kernel functor with no event dependency.
9697 	typedef Event type_(
9698 		const EnqueueArgs&,
9699 		T0,
9700 		T1,
9701 		T2,
9702 		T3,
9703 		T4,
9704 		T5,
9705 		T6,
9706 		T7,
9707 		T8,
9708 		T9,
9709 		T10,
9710 		T11,
9711 		T12,
9712 		T13,
9713 		T14,
9714 		T15,
9715 		T16,
9716 		T17,
9717 		T18,
9718 		T19,
9719 		T20,
9720 		T21);
9721 
operator ()cl::detail::functionImplementation_9722 	Event operator()(
9723 		const EnqueueArgs& enqueueArgs,
9724 		T0 arg0,
9725 		T1 arg1,
9726 		T2 arg2,
9727 		T3 arg3,
9728 		T4 arg4,
9729 		T5 arg5,
9730 		T6 arg6,
9731 		T7 arg7,
9732 		T8 arg8,
9733 		T9 arg9,
9734 		T10 arg10,
9735 		T11 arg11,
9736 		T12 arg12,
9737 		T13 arg13,
9738 		T14 arg14,
9739 		T15 arg15,
9740 		T16 arg16,
9741 		T17 arg17,
9742 		T18 arg18,
9743 		T19 arg19,
9744 		T20 arg20,
9745 		T21 arg21)
9746 	{
9747 		return functor_(
9748 			enqueueArgs,
9749 			arg0,
9750 			arg1,
9751 			arg2,
9752 			arg3,
9753 			arg4,
9754 			arg5,
9755 			arg6,
9756 			arg7,
9757 			arg8,
9758 			arg9,
9759 			arg10,
9760 			arg11,
9761 			arg12,
9762 			arg13,
9763 			arg14,
9764 			arg15,
9765 			arg16,
9766 			arg17,
9767 			arg18,
9768 			arg19,
9769 			arg20,
9770 			arg21);
9771 	}
9772 
9773 
9774 };
9775 
9776 template<
9777 	typename T0,
9778 	typename T1,
9779 	typename T2,
9780 	typename T3,
9781 	typename T4,
9782 	typename T5,
9783 	typename T6,
9784 	typename T7,
9785 	typename T8,
9786 	typename T9,
9787 	typename T10,
9788 	typename T11,
9789 	typename T12,
9790 	typename T13,
9791 	typename T14,
9792 	typename T15,
9793 	typename T16,
9794 	typename T17,
9795 	typename T18,
9796 	typename T19,
9797 	typename T20>
9798 struct functionImplementation_
9799 <	T0,
9800 	T1,
9801 	T2,
9802 	T3,
9803 	T4,
9804 	T5,
9805 	T6,
9806 	T7,
9807 	T8,
9808 	T9,
9809 	T10,
9810 	T11,
9811 	T12,
9812 	T13,
9813 	T14,
9814 	T15,
9815 	T16,
9816 	T17,
9817 	T18,
9818 	T19,
9819 	T20,
9820 	NullType,
9821 	NullType,
9822 	NullType,
9823 	NullType,
9824 	NullType,
9825 	NullType,
9826 	NullType,
9827 	NullType,
9828 	NullType,
9829 	NullType,
9830 	NullType>
9831 {
9832 	typedef detail::KernelFunctorGlobal<
9833 		T0,
9834 		T1,
9835 		T2,
9836 		T3,
9837 		T4,
9838 		T5,
9839 		T6,
9840 		T7,
9841 		T8,
9842 		T9,
9843 		T10,
9844 		T11,
9845 		T12,
9846 		T13,
9847 		T14,
9848 		T15,
9849 		T16,
9850 		T17,
9851 		T18,
9852 		T19,
9853 		T20,
9854 		NullType,
9855 		NullType,
9856 		NullType,
9857 		NullType,
9858 		NullType,
9859 		NullType,
9860 		NullType,
9861 		NullType,
9862 		NullType,
9863 		NullType,
9864 		NullType> FunctorType;
9865 
9866     FunctorType functor_;
9867 
functionImplementation_cl::detail::functionImplementation_9868     functionImplementation_(const FunctorType &functor) :
9869         functor_(functor)
9870     {
9871 
9872         #if (defined(_WIN32) && defined(_VARIADIC_MAX) && (_VARIADIC_MAX < 21))
9873         // Fail variadic expansion for dev11
9874         static_assert(0, "Visual Studio has a hard limit of argument count for a std::function expansion. Please define _VARIADIC_MAX to be 10. If you need more arguments than that VC12 and below cannot support it.");
9875         #endif
9876 
9877     }
9878 
9879 	//! \brief Return type of the functor
9880 	typedef Event result_type;
9881 
9882 	//! \brief Function signature of kernel functor with no event dependency.
9883 	typedef Event type_(
9884 		const EnqueueArgs&,
9885 		T0,
9886 		T1,
9887 		T2,
9888 		T3,
9889 		T4,
9890 		T5,
9891 		T6,
9892 		T7,
9893 		T8,
9894 		T9,
9895 		T10,
9896 		T11,
9897 		T12,
9898 		T13,
9899 		T14,
9900 		T15,
9901 		T16,
9902 		T17,
9903 		T18,
9904 		T19,
9905 		T20);
9906 
operator ()cl::detail::functionImplementation_9907 	Event operator()(
9908 		const EnqueueArgs& enqueueArgs,
9909 		T0 arg0,
9910 		T1 arg1,
9911 		T2 arg2,
9912 		T3 arg3,
9913 		T4 arg4,
9914 		T5 arg5,
9915 		T6 arg6,
9916 		T7 arg7,
9917 		T8 arg8,
9918 		T9 arg9,
9919 		T10 arg10,
9920 		T11 arg11,
9921 		T12 arg12,
9922 		T13 arg13,
9923 		T14 arg14,
9924 		T15 arg15,
9925 		T16 arg16,
9926 		T17 arg17,
9927 		T18 arg18,
9928 		T19 arg19,
9929 		T20 arg20)
9930 	{
9931 		return functor_(
9932 			enqueueArgs,
9933 			arg0,
9934 			arg1,
9935 			arg2,
9936 			arg3,
9937 			arg4,
9938 			arg5,
9939 			arg6,
9940 			arg7,
9941 			arg8,
9942 			arg9,
9943 			arg10,
9944 			arg11,
9945 			arg12,
9946 			arg13,
9947 			arg14,
9948 			arg15,
9949 			arg16,
9950 			arg17,
9951 			arg18,
9952 			arg19,
9953 			arg20);
9954 	}
9955 
9956 
9957 };
9958 
9959 template<
9960 	typename T0,
9961 	typename T1,
9962 	typename T2,
9963 	typename T3,
9964 	typename T4,
9965 	typename T5,
9966 	typename T6,
9967 	typename T7,
9968 	typename T8,
9969 	typename T9,
9970 	typename T10,
9971 	typename T11,
9972 	typename T12,
9973 	typename T13,
9974 	typename T14,
9975 	typename T15,
9976 	typename T16,
9977 	typename T17,
9978 	typename T18,
9979 	typename T19>
9980 struct functionImplementation_
9981 <	T0,
9982 	T1,
9983 	T2,
9984 	T3,
9985 	T4,
9986 	T5,
9987 	T6,
9988 	T7,
9989 	T8,
9990 	T9,
9991 	T10,
9992 	T11,
9993 	T12,
9994 	T13,
9995 	T14,
9996 	T15,
9997 	T16,
9998 	T17,
9999 	T18,
10000 	T19,
10001 	NullType,
10002 	NullType,
10003 	NullType,
10004 	NullType,
10005 	NullType,
10006 	NullType,
10007 	NullType,
10008 	NullType,
10009 	NullType,
10010 	NullType,
10011 	NullType,
10012 	NullType>
10013 {
10014 	typedef detail::KernelFunctorGlobal<
10015 		T0,
10016 		T1,
10017 		T2,
10018 		T3,
10019 		T4,
10020 		T5,
10021 		T6,
10022 		T7,
10023 		T8,
10024 		T9,
10025 		T10,
10026 		T11,
10027 		T12,
10028 		T13,
10029 		T14,
10030 		T15,
10031 		T16,
10032 		T17,
10033 		T18,
10034 		T19,
10035 		NullType,
10036 		NullType,
10037 		NullType,
10038 		NullType,
10039 		NullType,
10040 		NullType,
10041 		NullType,
10042 		NullType,
10043 		NullType,
10044 		NullType,
10045 		NullType,
10046 		NullType> FunctorType;
10047 
10048     FunctorType functor_;
10049 
functionImplementation_cl::detail::functionImplementation_10050     functionImplementation_(const FunctorType &functor) :
10051         functor_(functor)
10052     {
10053 
10054         #if (defined(_WIN32) && defined(_VARIADIC_MAX) && (_VARIADIC_MAX < 20))
10055         // Fail variadic expansion for dev11
10056         static_assert(0, "Visual Studio has a hard limit of argument count for a std::function expansion. Please define _VARIADIC_MAX to be 10. If you need more arguments than that VC12 and below cannot support it.");
10057         #endif
10058 
10059     }
10060 
10061 	//! \brief Return type of the functor
10062 	typedef Event result_type;
10063 
10064 	//! \brief Function signature of kernel functor with no event dependency.
10065 	typedef Event type_(
10066 		const EnqueueArgs&,
10067 		T0,
10068 		T1,
10069 		T2,
10070 		T3,
10071 		T4,
10072 		T5,
10073 		T6,
10074 		T7,
10075 		T8,
10076 		T9,
10077 		T10,
10078 		T11,
10079 		T12,
10080 		T13,
10081 		T14,
10082 		T15,
10083 		T16,
10084 		T17,
10085 		T18,
10086 		T19);
10087 
operator ()cl::detail::functionImplementation_10088 	Event operator()(
10089 		const EnqueueArgs& enqueueArgs,
10090 		T0 arg0,
10091 		T1 arg1,
10092 		T2 arg2,
10093 		T3 arg3,
10094 		T4 arg4,
10095 		T5 arg5,
10096 		T6 arg6,
10097 		T7 arg7,
10098 		T8 arg8,
10099 		T9 arg9,
10100 		T10 arg10,
10101 		T11 arg11,
10102 		T12 arg12,
10103 		T13 arg13,
10104 		T14 arg14,
10105 		T15 arg15,
10106 		T16 arg16,
10107 		T17 arg17,
10108 		T18 arg18,
10109 		T19 arg19)
10110 	{
10111 		return functor_(
10112 			enqueueArgs,
10113 			arg0,
10114 			arg1,
10115 			arg2,
10116 			arg3,
10117 			arg4,
10118 			arg5,
10119 			arg6,
10120 			arg7,
10121 			arg8,
10122 			arg9,
10123 			arg10,
10124 			arg11,
10125 			arg12,
10126 			arg13,
10127 			arg14,
10128 			arg15,
10129 			arg16,
10130 			arg17,
10131 			arg18,
10132 			arg19);
10133 	}
10134 
10135 
10136 };
10137 
10138 template<
10139 	typename T0,
10140 	typename T1,
10141 	typename T2,
10142 	typename T3,
10143 	typename T4,
10144 	typename T5,
10145 	typename T6,
10146 	typename T7,
10147 	typename T8,
10148 	typename T9,
10149 	typename T10,
10150 	typename T11,
10151 	typename T12,
10152 	typename T13,
10153 	typename T14,
10154 	typename T15,
10155 	typename T16,
10156 	typename T17,
10157 	typename T18>
10158 struct functionImplementation_
10159 <	T0,
10160 	T1,
10161 	T2,
10162 	T3,
10163 	T4,
10164 	T5,
10165 	T6,
10166 	T7,
10167 	T8,
10168 	T9,
10169 	T10,
10170 	T11,
10171 	T12,
10172 	T13,
10173 	T14,
10174 	T15,
10175 	T16,
10176 	T17,
10177 	T18,
10178 	NullType,
10179 	NullType,
10180 	NullType,
10181 	NullType,
10182 	NullType,
10183 	NullType,
10184 	NullType,
10185 	NullType,
10186 	NullType,
10187 	NullType,
10188 	NullType,
10189 	NullType,
10190 	NullType>
10191 {
10192 	typedef detail::KernelFunctorGlobal<
10193 		T0,
10194 		T1,
10195 		T2,
10196 		T3,
10197 		T4,
10198 		T5,
10199 		T6,
10200 		T7,
10201 		T8,
10202 		T9,
10203 		T10,
10204 		T11,
10205 		T12,
10206 		T13,
10207 		T14,
10208 		T15,
10209 		T16,
10210 		T17,
10211 		T18,
10212 		NullType,
10213 		NullType,
10214 		NullType,
10215 		NullType,
10216 		NullType,
10217 		NullType,
10218 		NullType,
10219 		NullType,
10220 		NullType,
10221 		NullType,
10222 		NullType,
10223 		NullType,
10224 		NullType> FunctorType;
10225 
10226     FunctorType functor_;
10227 
functionImplementation_cl::detail::functionImplementation_10228     functionImplementation_(const FunctorType &functor) :
10229         functor_(functor)
10230     {
10231 
10232         #if (defined(_WIN32) && defined(_VARIADIC_MAX) && (_VARIADIC_MAX < 19))
10233         // Fail variadic expansion for dev11
10234         static_assert(0, "Visual Studio has a hard limit of argument count for a std::function expansion. Please define _VARIADIC_MAX to be 10. If you need more arguments than that VC12 and below cannot support it.");
10235         #endif
10236 
10237     }
10238 
10239 	//! \brief Return type of the functor
10240 	typedef Event result_type;
10241 
10242 	//! \brief Function signature of kernel functor with no event dependency.
10243 	typedef Event type_(
10244 		const EnqueueArgs&,
10245 		T0,
10246 		T1,
10247 		T2,
10248 		T3,
10249 		T4,
10250 		T5,
10251 		T6,
10252 		T7,
10253 		T8,
10254 		T9,
10255 		T10,
10256 		T11,
10257 		T12,
10258 		T13,
10259 		T14,
10260 		T15,
10261 		T16,
10262 		T17,
10263 		T18);
10264 
operator ()cl::detail::functionImplementation_10265 	Event operator()(
10266 		const EnqueueArgs& enqueueArgs,
10267 		T0 arg0,
10268 		T1 arg1,
10269 		T2 arg2,
10270 		T3 arg3,
10271 		T4 arg4,
10272 		T5 arg5,
10273 		T6 arg6,
10274 		T7 arg7,
10275 		T8 arg8,
10276 		T9 arg9,
10277 		T10 arg10,
10278 		T11 arg11,
10279 		T12 arg12,
10280 		T13 arg13,
10281 		T14 arg14,
10282 		T15 arg15,
10283 		T16 arg16,
10284 		T17 arg17,
10285 		T18 arg18)
10286 	{
10287 		return functor_(
10288 			enqueueArgs,
10289 			arg0,
10290 			arg1,
10291 			arg2,
10292 			arg3,
10293 			arg4,
10294 			arg5,
10295 			arg6,
10296 			arg7,
10297 			arg8,
10298 			arg9,
10299 			arg10,
10300 			arg11,
10301 			arg12,
10302 			arg13,
10303 			arg14,
10304 			arg15,
10305 			arg16,
10306 			arg17,
10307 			arg18);
10308 	}
10309 
10310 
10311 };
10312 
10313 template<
10314 	typename T0,
10315 	typename T1,
10316 	typename T2,
10317 	typename T3,
10318 	typename T4,
10319 	typename T5,
10320 	typename T6,
10321 	typename T7,
10322 	typename T8,
10323 	typename T9,
10324 	typename T10,
10325 	typename T11,
10326 	typename T12,
10327 	typename T13,
10328 	typename T14,
10329 	typename T15,
10330 	typename T16,
10331 	typename T17>
10332 struct functionImplementation_
10333 <	T0,
10334 	T1,
10335 	T2,
10336 	T3,
10337 	T4,
10338 	T5,
10339 	T6,
10340 	T7,
10341 	T8,
10342 	T9,
10343 	T10,
10344 	T11,
10345 	T12,
10346 	T13,
10347 	T14,
10348 	T15,
10349 	T16,
10350 	T17,
10351 	NullType,
10352 	NullType,
10353 	NullType,
10354 	NullType,
10355 	NullType,
10356 	NullType,
10357 	NullType,
10358 	NullType,
10359 	NullType,
10360 	NullType,
10361 	NullType,
10362 	NullType,
10363 	NullType,
10364 	NullType>
10365 {
10366 	typedef detail::KernelFunctorGlobal<
10367 		T0,
10368 		T1,
10369 		T2,
10370 		T3,
10371 		T4,
10372 		T5,
10373 		T6,
10374 		T7,
10375 		T8,
10376 		T9,
10377 		T10,
10378 		T11,
10379 		T12,
10380 		T13,
10381 		T14,
10382 		T15,
10383 		T16,
10384 		T17,
10385 		NullType,
10386 		NullType,
10387 		NullType,
10388 		NullType,
10389 		NullType,
10390 		NullType,
10391 		NullType,
10392 		NullType,
10393 		NullType,
10394 		NullType,
10395 		NullType,
10396 		NullType,
10397 		NullType,
10398 		NullType> FunctorType;
10399 
10400     FunctorType functor_;
10401 
functionImplementation_cl::detail::functionImplementation_10402     functionImplementation_(const FunctorType &functor) :
10403         functor_(functor)
10404     {
10405 
10406         #if (defined(_WIN32) && defined(_VARIADIC_MAX) && (_VARIADIC_MAX < 18))
10407         // Fail variadic expansion for dev11
10408         static_assert(0, "Visual Studio has a hard limit of argument count for a std::function expansion. Please define _VARIADIC_MAX to be 10. If you need more arguments than that VC12 and below cannot support it.");
10409         #endif
10410 
10411     }
10412 
10413 	//! \brief Return type of the functor
10414 	typedef Event result_type;
10415 
10416 	//! \brief Function signature of kernel functor with no event dependency.
10417 	typedef Event type_(
10418 		const EnqueueArgs&,
10419 		T0,
10420 		T1,
10421 		T2,
10422 		T3,
10423 		T4,
10424 		T5,
10425 		T6,
10426 		T7,
10427 		T8,
10428 		T9,
10429 		T10,
10430 		T11,
10431 		T12,
10432 		T13,
10433 		T14,
10434 		T15,
10435 		T16,
10436 		T17);
10437 
operator ()cl::detail::functionImplementation_10438 	Event operator()(
10439 		const EnqueueArgs& enqueueArgs,
10440 		T0 arg0,
10441 		T1 arg1,
10442 		T2 arg2,
10443 		T3 arg3,
10444 		T4 arg4,
10445 		T5 arg5,
10446 		T6 arg6,
10447 		T7 arg7,
10448 		T8 arg8,
10449 		T9 arg9,
10450 		T10 arg10,
10451 		T11 arg11,
10452 		T12 arg12,
10453 		T13 arg13,
10454 		T14 arg14,
10455 		T15 arg15,
10456 		T16 arg16,
10457 		T17 arg17)
10458 	{
10459 		return functor_(
10460 			enqueueArgs,
10461 			arg0,
10462 			arg1,
10463 			arg2,
10464 			arg3,
10465 			arg4,
10466 			arg5,
10467 			arg6,
10468 			arg7,
10469 			arg8,
10470 			arg9,
10471 			arg10,
10472 			arg11,
10473 			arg12,
10474 			arg13,
10475 			arg14,
10476 			arg15,
10477 			arg16,
10478 			arg17);
10479 	}
10480 
10481 
10482 };
10483 
10484 template<
10485 	typename T0,
10486 	typename T1,
10487 	typename T2,
10488 	typename T3,
10489 	typename T4,
10490 	typename T5,
10491 	typename T6,
10492 	typename T7,
10493 	typename T8,
10494 	typename T9,
10495 	typename T10,
10496 	typename T11,
10497 	typename T12,
10498 	typename T13,
10499 	typename T14,
10500 	typename T15,
10501 	typename T16>
10502 struct functionImplementation_
10503 <	T0,
10504 	T1,
10505 	T2,
10506 	T3,
10507 	T4,
10508 	T5,
10509 	T6,
10510 	T7,
10511 	T8,
10512 	T9,
10513 	T10,
10514 	T11,
10515 	T12,
10516 	T13,
10517 	T14,
10518 	T15,
10519 	T16,
10520 	NullType,
10521 	NullType,
10522 	NullType,
10523 	NullType,
10524 	NullType,
10525 	NullType,
10526 	NullType,
10527 	NullType,
10528 	NullType,
10529 	NullType,
10530 	NullType,
10531 	NullType,
10532 	NullType,
10533 	NullType,
10534 	NullType>
10535 {
10536 	typedef detail::KernelFunctorGlobal<
10537 		T0,
10538 		T1,
10539 		T2,
10540 		T3,
10541 		T4,
10542 		T5,
10543 		T6,
10544 		T7,
10545 		T8,
10546 		T9,
10547 		T10,
10548 		T11,
10549 		T12,
10550 		T13,
10551 		T14,
10552 		T15,
10553 		T16,
10554 		NullType,
10555 		NullType,
10556 		NullType,
10557 		NullType,
10558 		NullType,
10559 		NullType,
10560 		NullType,
10561 		NullType,
10562 		NullType,
10563 		NullType,
10564 		NullType,
10565 		NullType,
10566 		NullType,
10567 		NullType,
10568 		NullType> FunctorType;
10569 
10570     FunctorType functor_;
10571 
functionImplementation_cl::detail::functionImplementation_10572     functionImplementation_(const FunctorType &functor) :
10573         functor_(functor)
10574     {
10575 
10576         #if (defined(_WIN32) && defined(_VARIADIC_MAX) && (_VARIADIC_MAX < 17))
10577         // Fail variadic expansion for dev11
10578         static_assert(0, "Visual Studio has a hard limit of argument count for a std::function expansion. Please define _VARIADIC_MAX to be 10. If you need more arguments than that VC12 and below cannot support it.");
10579         #endif
10580 
10581     }
10582 
10583 	//! \brief Return type of the functor
10584 	typedef Event result_type;
10585 
10586 	//! \brief Function signature of kernel functor with no event dependency.
10587 	typedef Event type_(
10588 		const EnqueueArgs&,
10589 		T0,
10590 		T1,
10591 		T2,
10592 		T3,
10593 		T4,
10594 		T5,
10595 		T6,
10596 		T7,
10597 		T8,
10598 		T9,
10599 		T10,
10600 		T11,
10601 		T12,
10602 		T13,
10603 		T14,
10604 		T15,
10605 		T16);
10606 
operator ()cl::detail::functionImplementation_10607 	Event operator()(
10608 		const EnqueueArgs& enqueueArgs,
10609 		T0 arg0,
10610 		T1 arg1,
10611 		T2 arg2,
10612 		T3 arg3,
10613 		T4 arg4,
10614 		T5 arg5,
10615 		T6 arg6,
10616 		T7 arg7,
10617 		T8 arg8,
10618 		T9 arg9,
10619 		T10 arg10,
10620 		T11 arg11,
10621 		T12 arg12,
10622 		T13 arg13,
10623 		T14 arg14,
10624 		T15 arg15,
10625 		T16 arg16)
10626 	{
10627 		return functor_(
10628 			enqueueArgs,
10629 			arg0,
10630 			arg1,
10631 			arg2,
10632 			arg3,
10633 			arg4,
10634 			arg5,
10635 			arg6,
10636 			arg7,
10637 			arg8,
10638 			arg9,
10639 			arg10,
10640 			arg11,
10641 			arg12,
10642 			arg13,
10643 			arg14,
10644 			arg15,
10645 			arg16);
10646 	}
10647 
10648 
10649 };
10650 
10651 template<
10652 	typename T0,
10653 	typename T1,
10654 	typename T2,
10655 	typename T3,
10656 	typename T4,
10657 	typename T5,
10658 	typename T6,
10659 	typename T7,
10660 	typename T8,
10661 	typename T9,
10662 	typename T10,
10663 	typename T11,
10664 	typename T12,
10665 	typename T13,
10666 	typename T14,
10667 	typename T15>
10668 struct functionImplementation_
10669 <	T0,
10670 	T1,
10671 	T2,
10672 	T3,
10673 	T4,
10674 	T5,
10675 	T6,
10676 	T7,
10677 	T8,
10678 	T9,
10679 	T10,
10680 	T11,
10681 	T12,
10682 	T13,
10683 	T14,
10684 	T15,
10685 	NullType,
10686 	NullType,
10687 	NullType,
10688 	NullType,
10689 	NullType,
10690 	NullType,
10691 	NullType,
10692 	NullType,
10693 	NullType,
10694 	NullType,
10695 	NullType,
10696 	NullType,
10697 	NullType,
10698 	NullType,
10699 	NullType,
10700 	NullType>
10701 {
10702 	typedef detail::KernelFunctorGlobal<
10703 		T0,
10704 		T1,
10705 		T2,
10706 		T3,
10707 		T4,
10708 		T5,
10709 		T6,
10710 		T7,
10711 		T8,
10712 		T9,
10713 		T10,
10714 		T11,
10715 		T12,
10716 		T13,
10717 		T14,
10718 		T15,
10719 		NullType,
10720 		NullType,
10721 		NullType,
10722 		NullType,
10723 		NullType,
10724 		NullType,
10725 		NullType,
10726 		NullType,
10727 		NullType,
10728 		NullType,
10729 		NullType,
10730 		NullType,
10731 		NullType,
10732 		NullType,
10733 		NullType,
10734 		NullType> FunctorType;
10735 
10736     FunctorType functor_;
10737 
functionImplementation_cl::detail::functionImplementation_10738     functionImplementation_(const FunctorType &functor) :
10739         functor_(functor)
10740     {
10741 
10742         #if (defined(_WIN32) && defined(_VARIADIC_MAX) && (_VARIADIC_MAX < 16))
10743         // Fail variadic expansion for dev11
10744         static_assert(0, "Visual Studio has a hard limit of argument count for a std::function expansion. Please define _VARIADIC_MAX to be 10. If you need more arguments than that VC12 and below cannot support it.");
10745         #endif
10746 
10747     }
10748 
10749 	//! \brief Return type of the functor
10750 	typedef Event result_type;
10751 
10752 	//! \brief Function signature of kernel functor with no event dependency.
10753 	typedef Event type_(
10754 		const EnqueueArgs&,
10755 		T0,
10756 		T1,
10757 		T2,
10758 		T3,
10759 		T4,
10760 		T5,
10761 		T6,
10762 		T7,
10763 		T8,
10764 		T9,
10765 		T10,
10766 		T11,
10767 		T12,
10768 		T13,
10769 		T14,
10770 		T15);
10771 
operator ()cl::detail::functionImplementation_10772 	Event operator()(
10773 		const EnqueueArgs& enqueueArgs,
10774 		T0 arg0,
10775 		T1 arg1,
10776 		T2 arg2,
10777 		T3 arg3,
10778 		T4 arg4,
10779 		T5 arg5,
10780 		T6 arg6,
10781 		T7 arg7,
10782 		T8 arg8,
10783 		T9 arg9,
10784 		T10 arg10,
10785 		T11 arg11,
10786 		T12 arg12,
10787 		T13 arg13,
10788 		T14 arg14,
10789 		T15 arg15)
10790 	{
10791 		return functor_(
10792 			enqueueArgs,
10793 			arg0,
10794 			arg1,
10795 			arg2,
10796 			arg3,
10797 			arg4,
10798 			arg5,
10799 			arg6,
10800 			arg7,
10801 			arg8,
10802 			arg9,
10803 			arg10,
10804 			arg11,
10805 			arg12,
10806 			arg13,
10807 			arg14,
10808 			arg15);
10809 	}
10810 
10811 
10812 };
10813 
10814 template<
10815 	typename T0,
10816 	typename T1,
10817 	typename T2,
10818 	typename T3,
10819 	typename T4,
10820 	typename T5,
10821 	typename T6,
10822 	typename T7,
10823 	typename T8,
10824 	typename T9,
10825 	typename T10,
10826 	typename T11,
10827 	typename T12,
10828 	typename T13,
10829 	typename T14>
10830 struct functionImplementation_
10831 <	T0,
10832 	T1,
10833 	T2,
10834 	T3,
10835 	T4,
10836 	T5,
10837 	T6,
10838 	T7,
10839 	T8,
10840 	T9,
10841 	T10,
10842 	T11,
10843 	T12,
10844 	T13,
10845 	T14,
10846 	NullType,
10847 	NullType,
10848 	NullType,
10849 	NullType,
10850 	NullType,
10851 	NullType,
10852 	NullType,
10853 	NullType,
10854 	NullType,
10855 	NullType,
10856 	NullType,
10857 	NullType,
10858 	NullType,
10859 	NullType,
10860 	NullType,
10861 	NullType,
10862 	NullType>
10863 {
10864 	typedef detail::KernelFunctorGlobal<
10865 		T0,
10866 		T1,
10867 		T2,
10868 		T3,
10869 		T4,
10870 		T5,
10871 		T6,
10872 		T7,
10873 		T8,
10874 		T9,
10875 		T10,
10876 		T11,
10877 		T12,
10878 		T13,
10879 		T14,
10880 		NullType,
10881 		NullType,
10882 		NullType,
10883 		NullType,
10884 		NullType,
10885 		NullType,
10886 		NullType,
10887 		NullType,
10888 		NullType,
10889 		NullType,
10890 		NullType,
10891 		NullType,
10892 		NullType,
10893 		NullType,
10894 		NullType,
10895 		NullType,
10896 		NullType> FunctorType;
10897 
10898     FunctorType functor_;
10899 
functionImplementation_cl::detail::functionImplementation_10900     functionImplementation_(const FunctorType &functor) :
10901         functor_(functor)
10902     {
10903 
10904         #if (defined(_WIN32) && defined(_VARIADIC_MAX) && (_VARIADIC_MAX < 15))
10905         // Fail variadic expansion for dev11
10906         static_assert(0, "Visual Studio has a hard limit of argument count for a std::function expansion. Please define _VARIADIC_MAX to be 10. If you need more arguments than that VC12 and below cannot support it.");
10907         #endif
10908 
10909     }
10910 
10911 	//! \brief Return type of the functor
10912 	typedef Event result_type;
10913 
10914 	//! \brief Function signature of kernel functor with no event dependency.
10915 	typedef Event type_(
10916 		const EnqueueArgs&,
10917 		T0,
10918 		T1,
10919 		T2,
10920 		T3,
10921 		T4,
10922 		T5,
10923 		T6,
10924 		T7,
10925 		T8,
10926 		T9,
10927 		T10,
10928 		T11,
10929 		T12,
10930 		T13,
10931 		T14);
10932 
operator ()cl::detail::functionImplementation_10933 	Event operator()(
10934 		const EnqueueArgs& enqueueArgs,
10935 		T0 arg0,
10936 		T1 arg1,
10937 		T2 arg2,
10938 		T3 arg3,
10939 		T4 arg4,
10940 		T5 arg5,
10941 		T6 arg6,
10942 		T7 arg7,
10943 		T8 arg8,
10944 		T9 arg9,
10945 		T10 arg10,
10946 		T11 arg11,
10947 		T12 arg12,
10948 		T13 arg13,
10949 		T14 arg14)
10950 	{
10951 		return functor_(
10952 			enqueueArgs,
10953 			arg0,
10954 			arg1,
10955 			arg2,
10956 			arg3,
10957 			arg4,
10958 			arg5,
10959 			arg6,
10960 			arg7,
10961 			arg8,
10962 			arg9,
10963 			arg10,
10964 			arg11,
10965 			arg12,
10966 			arg13,
10967 			arg14);
10968 	}
10969 
10970 
10971 };
10972 
10973 template<
10974 	typename T0,
10975 	typename T1,
10976 	typename T2,
10977 	typename T3,
10978 	typename T4,
10979 	typename T5,
10980 	typename T6,
10981 	typename T7,
10982 	typename T8,
10983 	typename T9,
10984 	typename T10,
10985 	typename T11,
10986 	typename T12,
10987 	typename T13>
10988 struct functionImplementation_
10989 <	T0,
10990 	T1,
10991 	T2,
10992 	T3,
10993 	T4,
10994 	T5,
10995 	T6,
10996 	T7,
10997 	T8,
10998 	T9,
10999 	T10,
11000 	T11,
11001 	T12,
11002 	T13,
11003 	NullType,
11004 	NullType,
11005 	NullType,
11006 	NullType,
11007 	NullType,
11008 	NullType,
11009 	NullType,
11010 	NullType,
11011 	NullType,
11012 	NullType,
11013 	NullType,
11014 	NullType,
11015 	NullType,
11016 	NullType,
11017 	NullType,
11018 	NullType,
11019 	NullType,
11020 	NullType>
11021 {
11022 	typedef detail::KernelFunctorGlobal<
11023 		T0,
11024 		T1,
11025 		T2,
11026 		T3,
11027 		T4,
11028 		T5,
11029 		T6,
11030 		T7,
11031 		T8,
11032 		T9,
11033 		T10,
11034 		T11,
11035 		T12,
11036 		T13,
11037 		NullType,
11038 		NullType,
11039 		NullType,
11040 		NullType,
11041 		NullType,
11042 		NullType,
11043 		NullType,
11044 		NullType,
11045 		NullType,
11046 		NullType,
11047 		NullType,
11048 		NullType,
11049 		NullType,
11050 		NullType,
11051 		NullType,
11052 		NullType,
11053 		NullType,
11054 		NullType> FunctorType;
11055 
11056     FunctorType functor_;
11057 
functionImplementation_cl::detail::functionImplementation_11058     functionImplementation_(const FunctorType &functor) :
11059         functor_(functor)
11060     {
11061 
11062         #if (defined(_WIN32) && defined(_VARIADIC_MAX) && (_VARIADIC_MAX < 14))
11063         // Fail variadic expansion for dev11
11064         static_assert(0, "Visual Studio has a hard limit of argument count for a std::function expansion. Please define _VARIADIC_MAX to be 10. If you need more arguments than that VC12 and below cannot support it.");
11065         #endif
11066 
11067     }
11068 
11069 	//! \brief Return type of the functor
11070 	typedef Event result_type;
11071 
11072 	//! \brief Function signature of kernel functor with no event dependency.
11073 	typedef Event type_(
11074 		const EnqueueArgs&,
11075 		T0,
11076 		T1,
11077 		T2,
11078 		T3,
11079 		T4,
11080 		T5,
11081 		T6,
11082 		T7,
11083 		T8,
11084 		T9,
11085 		T10,
11086 		T11,
11087 		T12,
11088 		T13);
11089 
operator ()cl::detail::functionImplementation_11090 	Event operator()(
11091 		const EnqueueArgs& enqueueArgs,
11092 		T0 arg0,
11093 		T1 arg1,
11094 		T2 arg2,
11095 		T3 arg3,
11096 		T4 arg4,
11097 		T5 arg5,
11098 		T6 arg6,
11099 		T7 arg7,
11100 		T8 arg8,
11101 		T9 arg9,
11102 		T10 arg10,
11103 		T11 arg11,
11104 		T12 arg12,
11105 		T13 arg13)
11106 	{
11107 		return functor_(
11108 			enqueueArgs,
11109 			arg0,
11110 			arg1,
11111 			arg2,
11112 			arg3,
11113 			arg4,
11114 			arg5,
11115 			arg6,
11116 			arg7,
11117 			arg8,
11118 			arg9,
11119 			arg10,
11120 			arg11,
11121 			arg12,
11122 			arg13);
11123 	}
11124 
11125 
11126 };
11127 
11128 template<
11129 	typename T0,
11130 	typename T1,
11131 	typename T2,
11132 	typename T3,
11133 	typename T4,
11134 	typename T5,
11135 	typename T6,
11136 	typename T7,
11137 	typename T8,
11138 	typename T9,
11139 	typename T10,
11140 	typename T11,
11141 	typename T12>
11142 struct functionImplementation_
11143 <	T0,
11144 	T1,
11145 	T2,
11146 	T3,
11147 	T4,
11148 	T5,
11149 	T6,
11150 	T7,
11151 	T8,
11152 	T9,
11153 	T10,
11154 	T11,
11155 	T12,
11156 	NullType,
11157 	NullType,
11158 	NullType,
11159 	NullType,
11160 	NullType,
11161 	NullType,
11162 	NullType,
11163 	NullType,
11164 	NullType,
11165 	NullType,
11166 	NullType,
11167 	NullType,
11168 	NullType,
11169 	NullType,
11170 	NullType,
11171 	NullType,
11172 	NullType,
11173 	NullType,
11174 	NullType>
11175 {
11176 	typedef detail::KernelFunctorGlobal<
11177 		T0,
11178 		T1,
11179 		T2,
11180 		T3,
11181 		T4,
11182 		T5,
11183 		T6,
11184 		T7,
11185 		T8,
11186 		T9,
11187 		T10,
11188 		T11,
11189 		T12,
11190 		NullType,
11191 		NullType,
11192 		NullType,
11193 		NullType,
11194 		NullType,
11195 		NullType,
11196 		NullType,
11197 		NullType,
11198 		NullType,
11199 		NullType,
11200 		NullType,
11201 		NullType,
11202 		NullType,
11203 		NullType,
11204 		NullType,
11205 		NullType,
11206 		NullType,
11207 		NullType,
11208 		NullType> FunctorType;
11209 
11210     FunctorType functor_;
11211 
functionImplementation_cl::detail::functionImplementation_11212     functionImplementation_(const FunctorType &functor) :
11213         functor_(functor)
11214     {
11215 
11216         #if (defined(_WIN32) && defined(_VARIADIC_MAX) && (_VARIADIC_MAX < 13))
11217         // Fail variadic expansion for dev11
11218         static_assert(0, "Visual Studio has a hard limit of argument count for a std::function expansion. Please define _VARIADIC_MAX to be 10. If you need more arguments than that VC12 and below cannot support it.");
11219         #endif
11220 
11221     }
11222 
11223 	//! \brief Return type of the functor
11224 	typedef Event result_type;
11225 
11226 	//! \brief Function signature of kernel functor with no event dependency.
11227 	typedef Event type_(
11228 		const EnqueueArgs&,
11229 		T0,
11230 		T1,
11231 		T2,
11232 		T3,
11233 		T4,
11234 		T5,
11235 		T6,
11236 		T7,
11237 		T8,
11238 		T9,
11239 		T10,
11240 		T11,
11241 		T12);
11242 
operator ()cl::detail::functionImplementation_11243 	Event operator()(
11244 		const EnqueueArgs& enqueueArgs,
11245 		T0 arg0,
11246 		T1 arg1,
11247 		T2 arg2,
11248 		T3 arg3,
11249 		T4 arg4,
11250 		T5 arg5,
11251 		T6 arg6,
11252 		T7 arg7,
11253 		T8 arg8,
11254 		T9 arg9,
11255 		T10 arg10,
11256 		T11 arg11,
11257 		T12 arg12)
11258 	{
11259 		return functor_(
11260 			enqueueArgs,
11261 			arg0,
11262 			arg1,
11263 			arg2,
11264 			arg3,
11265 			arg4,
11266 			arg5,
11267 			arg6,
11268 			arg7,
11269 			arg8,
11270 			arg9,
11271 			arg10,
11272 			arg11,
11273 			arg12);
11274 	}
11275 
11276 
11277 };
11278 
11279 template<
11280 	typename T0,
11281 	typename T1,
11282 	typename T2,
11283 	typename T3,
11284 	typename T4,
11285 	typename T5,
11286 	typename T6,
11287 	typename T7,
11288 	typename T8,
11289 	typename T9,
11290 	typename T10,
11291 	typename T11>
11292 struct functionImplementation_
11293 <	T0,
11294 	T1,
11295 	T2,
11296 	T3,
11297 	T4,
11298 	T5,
11299 	T6,
11300 	T7,
11301 	T8,
11302 	T9,
11303 	T10,
11304 	T11,
11305 	NullType,
11306 	NullType,
11307 	NullType,
11308 	NullType,
11309 	NullType,
11310 	NullType,
11311 	NullType,
11312 	NullType,
11313 	NullType,
11314 	NullType,
11315 	NullType,
11316 	NullType,
11317 	NullType,
11318 	NullType,
11319 	NullType,
11320 	NullType,
11321 	NullType,
11322 	NullType,
11323 	NullType,
11324 	NullType>
11325 {
11326 	typedef detail::KernelFunctorGlobal<
11327 		T0,
11328 		T1,
11329 		T2,
11330 		T3,
11331 		T4,
11332 		T5,
11333 		T6,
11334 		T7,
11335 		T8,
11336 		T9,
11337 		T10,
11338 		T11,
11339 		NullType,
11340 		NullType,
11341 		NullType,
11342 		NullType,
11343 		NullType,
11344 		NullType,
11345 		NullType,
11346 		NullType,
11347 		NullType,
11348 		NullType,
11349 		NullType,
11350 		NullType,
11351 		NullType,
11352 		NullType,
11353 		NullType,
11354 		NullType,
11355 		NullType,
11356 		NullType,
11357 		NullType,
11358 		NullType> FunctorType;
11359 
11360     FunctorType functor_;
11361 
functionImplementation_cl::detail::functionImplementation_11362     functionImplementation_(const FunctorType &functor) :
11363         functor_(functor)
11364     {
11365 
11366         #if (defined(_WIN32) && defined(_VARIADIC_MAX) && (_VARIADIC_MAX < 12))
11367         // Fail variadic expansion for dev11
11368         static_assert(0, "Visual Studio has a hard limit of argument count for a std::function expansion. Please define _VARIADIC_MAX to be 10. If you need more arguments than that VC12 and below cannot support it.");
11369         #endif
11370 
11371     }
11372 
11373 	//! \brief Return type of the functor
11374 	typedef Event result_type;
11375 
11376 	//! \brief Function signature of kernel functor with no event dependency.
11377 	typedef Event type_(
11378 		const EnqueueArgs&,
11379 		T0,
11380 		T1,
11381 		T2,
11382 		T3,
11383 		T4,
11384 		T5,
11385 		T6,
11386 		T7,
11387 		T8,
11388 		T9,
11389 		T10,
11390 		T11);
11391 
operator ()cl::detail::functionImplementation_11392 	Event operator()(
11393 		const EnqueueArgs& enqueueArgs,
11394 		T0 arg0,
11395 		T1 arg1,
11396 		T2 arg2,
11397 		T3 arg3,
11398 		T4 arg4,
11399 		T5 arg5,
11400 		T6 arg6,
11401 		T7 arg7,
11402 		T8 arg8,
11403 		T9 arg9,
11404 		T10 arg10,
11405 		T11 arg11)
11406 	{
11407 		return functor_(
11408 			enqueueArgs,
11409 			arg0,
11410 			arg1,
11411 			arg2,
11412 			arg3,
11413 			arg4,
11414 			arg5,
11415 			arg6,
11416 			arg7,
11417 			arg8,
11418 			arg9,
11419 			arg10,
11420 			arg11);
11421 	}
11422 
11423 
11424 };
11425 
11426 template<
11427 	typename T0,
11428 	typename T1,
11429 	typename T2,
11430 	typename T3,
11431 	typename T4,
11432 	typename T5,
11433 	typename T6,
11434 	typename T7,
11435 	typename T8,
11436 	typename T9,
11437 	typename T10>
11438 struct functionImplementation_
11439 <	T0,
11440 	T1,
11441 	T2,
11442 	T3,
11443 	T4,
11444 	T5,
11445 	T6,
11446 	T7,
11447 	T8,
11448 	T9,
11449 	T10,
11450 	NullType,
11451 	NullType,
11452 	NullType,
11453 	NullType,
11454 	NullType,
11455 	NullType,
11456 	NullType,
11457 	NullType,
11458 	NullType,
11459 	NullType,
11460 	NullType,
11461 	NullType,
11462 	NullType,
11463 	NullType,
11464 	NullType,
11465 	NullType,
11466 	NullType,
11467 	NullType,
11468 	NullType,
11469 	NullType,
11470 	NullType>
11471 {
11472 	typedef detail::KernelFunctorGlobal<
11473 		T0,
11474 		T1,
11475 		T2,
11476 		T3,
11477 		T4,
11478 		T5,
11479 		T6,
11480 		T7,
11481 		T8,
11482 		T9,
11483 		T10,
11484 		NullType,
11485 		NullType,
11486 		NullType,
11487 		NullType,
11488 		NullType,
11489 		NullType,
11490 		NullType,
11491 		NullType,
11492 		NullType,
11493 		NullType,
11494 		NullType,
11495 		NullType,
11496 		NullType,
11497 		NullType,
11498 		NullType,
11499 		NullType,
11500 		NullType,
11501 		NullType,
11502 		NullType,
11503 		NullType,
11504 		NullType> FunctorType;
11505 
11506     FunctorType functor_;
11507 
functionImplementation_cl::detail::functionImplementation_11508     functionImplementation_(const FunctorType &functor) :
11509         functor_(functor)
11510     {
11511 
11512         #if (defined(_WIN32) && defined(_VARIADIC_MAX) && (_VARIADIC_MAX < 11))
11513         // Fail variadic expansion for dev11
11514         static_assert(0, "Visual Studio has a hard limit of argument count for a std::function expansion. Please define _VARIADIC_MAX to be 10. If you need more arguments than that VC12 and below cannot support it.");
11515         #endif
11516 
11517     }
11518 
11519 	//! \brief Return type of the functor
11520 	typedef Event result_type;
11521 
11522 	//! \brief Function signature of kernel functor with no event dependency.
11523 	typedef Event type_(
11524 		const EnqueueArgs&,
11525 		T0,
11526 		T1,
11527 		T2,
11528 		T3,
11529 		T4,
11530 		T5,
11531 		T6,
11532 		T7,
11533 		T8,
11534 		T9,
11535 		T10);
11536 
operator ()cl::detail::functionImplementation_11537 	Event operator()(
11538 		const EnqueueArgs& enqueueArgs,
11539 		T0 arg0,
11540 		T1 arg1,
11541 		T2 arg2,
11542 		T3 arg3,
11543 		T4 arg4,
11544 		T5 arg5,
11545 		T6 arg6,
11546 		T7 arg7,
11547 		T8 arg8,
11548 		T9 arg9,
11549 		T10 arg10)
11550 	{
11551 		return functor_(
11552 			enqueueArgs,
11553 			arg0,
11554 			arg1,
11555 			arg2,
11556 			arg3,
11557 			arg4,
11558 			arg5,
11559 			arg6,
11560 			arg7,
11561 			arg8,
11562 			arg9,
11563 			arg10);
11564 	}
11565 
11566 
11567 };
11568 
11569 template<
11570 	typename T0,
11571 	typename T1,
11572 	typename T2,
11573 	typename T3,
11574 	typename T4,
11575 	typename T5,
11576 	typename T6,
11577 	typename T7,
11578 	typename T8,
11579 	typename T9>
11580 struct functionImplementation_
11581 <	T0,
11582 	T1,
11583 	T2,
11584 	T3,
11585 	T4,
11586 	T5,
11587 	T6,
11588 	T7,
11589 	T8,
11590 	T9,
11591 	NullType,
11592 	NullType,
11593 	NullType,
11594 	NullType,
11595 	NullType,
11596 	NullType,
11597 	NullType,
11598 	NullType,
11599 	NullType,
11600 	NullType,
11601 	NullType,
11602 	NullType,
11603 	NullType,
11604 	NullType,
11605 	NullType,
11606 	NullType,
11607 	NullType,
11608 	NullType,
11609 	NullType,
11610 	NullType,
11611 	NullType,
11612 	NullType>
11613 {
11614 	typedef detail::KernelFunctorGlobal<
11615 		T0,
11616 		T1,
11617 		T2,
11618 		T3,
11619 		T4,
11620 		T5,
11621 		T6,
11622 		T7,
11623 		T8,
11624 		T9,
11625 		NullType,
11626 		NullType,
11627 		NullType,
11628 		NullType,
11629 		NullType,
11630 		NullType,
11631 		NullType,
11632 		NullType,
11633 		NullType,
11634 		NullType,
11635 		NullType,
11636 		NullType,
11637 		NullType,
11638 		NullType,
11639 		NullType,
11640 		NullType,
11641 		NullType,
11642 		NullType,
11643 		NullType,
11644 		NullType,
11645 		NullType,
11646 		NullType> FunctorType;
11647 
11648     FunctorType functor_;
11649 
functionImplementation_cl::detail::functionImplementation_11650     functionImplementation_(const FunctorType &functor) :
11651         functor_(functor)
11652     {
11653 
11654         #if (defined(_WIN32) && defined(_VARIADIC_MAX) && (_VARIADIC_MAX < 10))
11655         // Fail variadic expansion for dev11
11656         static_assert(0, "Visual Studio has a hard limit of argument count for a std::function expansion. Please define _VARIADIC_MAX to be 10. If you need more arguments than that VC12 and below cannot support it.");
11657         #endif
11658 
11659     }
11660 
11661 	//! \brief Return type of the functor
11662 	typedef Event result_type;
11663 
11664 	//! \brief Function signature of kernel functor with no event dependency.
11665 	typedef Event type_(
11666 		const EnqueueArgs&,
11667 		T0,
11668 		T1,
11669 		T2,
11670 		T3,
11671 		T4,
11672 		T5,
11673 		T6,
11674 		T7,
11675 		T8,
11676 		T9);
11677 
operator ()cl::detail::functionImplementation_11678 	Event operator()(
11679 		const EnqueueArgs& enqueueArgs,
11680 		T0 arg0,
11681 		T1 arg1,
11682 		T2 arg2,
11683 		T3 arg3,
11684 		T4 arg4,
11685 		T5 arg5,
11686 		T6 arg6,
11687 		T7 arg7,
11688 		T8 arg8,
11689 		T9 arg9)
11690 	{
11691 		return functor_(
11692 			enqueueArgs,
11693 			arg0,
11694 			arg1,
11695 			arg2,
11696 			arg3,
11697 			arg4,
11698 			arg5,
11699 			arg6,
11700 			arg7,
11701 			arg8,
11702 			arg9);
11703 	}
11704 
11705 
11706 };
11707 
11708 template<
11709 	typename T0,
11710 	typename T1,
11711 	typename T2,
11712 	typename T3,
11713 	typename T4,
11714 	typename T5,
11715 	typename T6,
11716 	typename T7,
11717 	typename T8>
11718 struct functionImplementation_
11719 <	T0,
11720 	T1,
11721 	T2,
11722 	T3,
11723 	T4,
11724 	T5,
11725 	T6,
11726 	T7,
11727 	T8,
11728 	NullType,
11729 	NullType,
11730 	NullType,
11731 	NullType,
11732 	NullType,
11733 	NullType,
11734 	NullType,
11735 	NullType,
11736 	NullType,
11737 	NullType,
11738 	NullType,
11739 	NullType,
11740 	NullType,
11741 	NullType,
11742 	NullType,
11743 	NullType,
11744 	NullType,
11745 	NullType,
11746 	NullType,
11747 	NullType,
11748 	NullType,
11749 	NullType,
11750 	NullType>
11751 {
11752 	typedef detail::KernelFunctorGlobal<
11753 		T0,
11754 		T1,
11755 		T2,
11756 		T3,
11757 		T4,
11758 		T5,
11759 		T6,
11760 		T7,
11761 		T8,
11762 		NullType,
11763 		NullType,
11764 		NullType,
11765 		NullType,
11766 		NullType,
11767 		NullType,
11768 		NullType,
11769 		NullType,
11770 		NullType,
11771 		NullType,
11772 		NullType,
11773 		NullType,
11774 		NullType,
11775 		NullType,
11776 		NullType,
11777 		NullType,
11778 		NullType,
11779 		NullType,
11780 		NullType,
11781 		NullType,
11782 		NullType,
11783 		NullType,
11784 		NullType> FunctorType;
11785 
11786     FunctorType functor_;
11787 
functionImplementation_cl::detail::functionImplementation_11788     functionImplementation_(const FunctorType &functor) :
11789         functor_(functor)
11790     {
11791 
11792         #if (defined(_WIN32) && defined(_VARIADIC_MAX) && (_VARIADIC_MAX < 9))
11793         // Fail variadic expansion for dev11
11794         static_assert(0, "Visual Studio has a hard limit of argument count for a std::function expansion. Please define _VARIADIC_MAX to be 10. If you need more arguments than that VC12 and below cannot support it.");
11795         #endif
11796 
11797     }
11798 
11799 	//! \brief Return type of the functor
11800 	typedef Event result_type;
11801 
11802 	//! \brief Function signature of kernel functor with no event dependency.
11803 	typedef Event type_(
11804 		const EnqueueArgs&,
11805 		T0,
11806 		T1,
11807 		T2,
11808 		T3,
11809 		T4,
11810 		T5,
11811 		T6,
11812 		T7,
11813 		T8);
11814 
operator ()cl::detail::functionImplementation_11815 	Event operator()(
11816 		const EnqueueArgs& enqueueArgs,
11817 		T0 arg0,
11818 		T1 arg1,
11819 		T2 arg2,
11820 		T3 arg3,
11821 		T4 arg4,
11822 		T5 arg5,
11823 		T6 arg6,
11824 		T7 arg7,
11825 		T8 arg8)
11826 	{
11827 		return functor_(
11828 			enqueueArgs,
11829 			arg0,
11830 			arg1,
11831 			arg2,
11832 			arg3,
11833 			arg4,
11834 			arg5,
11835 			arg6,
11836 			arg7,
11837 			arg8);
11838 	}
11839 
11840 
11841 };
11842 
11843 template<
11844 	typename T0,
11845 	typename T1,
11846 	typename T2,
11847 	typename T3,
11848 	typename T4,
11849 	typename T5,
11850 	typename T6,
11851 	typename T7>
11852 struct functionImplementation_
11853 <	T0,
11854 	T1,
11855 	T2,
11856 	T3,
11857 	T4,
11858 	T5,
11859 	T6,
11860 	T7,
11861 	NullType,
11862 	NullType,
11863 	NullType,
11864 	NullType,
11865 	NullType,
11866 	NullType,
11867 	NullType,
11868 	NullType,
11869 	NullType,
11870 	NullType,
11871 	NullType,
11872 	NullType,
11873 	NullType,
11874 	NullType,
11875 	NullType,
11876 	NullType,
11877 	NullType,
11878 	NullType,
11879 	NullType,
11880 	NullType,
11881 	NullType,
11882 	NullType,
11883 	NullType,
11884 	NullType>
11885 {
11886 	typedef detail::KernelFunctorGlobal<
11887 		T0,
11888 		T1,
11889 		T2,
11890 		T3,
11891 		T4,
11892 		T5,
11893 		T6,
11894 		T7,
11895 		NullType,
11896 		NullType,
11897 		NullType,
11898 		NullType,
11899 		NullType,
11900 		NullType,
11901 		NullType,
11902 		NullType,
11903 		NullType,
11904 		NullType,
11905 		NullType,
11906 		NullType,
11907 		NullType,
11908 		NullType,
11909 		NullType,
11910 		NullType,
11911 		NullType,
11912 		NullType,
11913 		NullType,
11914 		NullType,
11915 		NullType,
11916 		NullType,
11917 		NullType,
11918 		NullType> FunctorType;
11919 
11920     FunctorType functor_;
11921 
functionImplementation_cl::detail::functionImplementation_11922     functionImplementation_(const FunctorType &functor) :
11923         functor_(functor)
11924     {
11925 
11926         #if (defined(_WIN32) && defined(_VARIADIC_MAX) && (_VARIADIC_MAX < 8))
11927         // Fail variadic expansion for dev11
11928         static_assert(0, "Visual Studio has a hard limit of argument count for a std::function expansion. Please define _VARIADIC_MAX to be 10. If you need more arguments than that VC12 and below cannot support it.");
11929         #endif
11930 
11931     }
11932 
11933 	//! \brief Return type of the functor
11934 	typedef Event result_type;
11935 
11936 	//! \brief Function signature of kernel functor with no event dependency.
11937 	typedef Event type_(
11938 		const EnqueueArgs&,
11939 		T0,
11940 		T1,
11941 		T2,
11942 		T3,
11943 		T4,
11944 		T5,
11945 		T6,
11946 		T7);
11947 
operator ()cl::detail::functionImplementation_11948 	Event operator()(
11949 		const EnqueueArgs& enqueueArgs,
11950 		T0 arg0,
11951 		T1 arg1,
11952 		T2 arg2,
11953 		T3 arg3,
11954 		T4 arg4,
11955 		T5 arg5,
11956 		T6 arg6,
11957 		T7 arg7)
11958 	{
11959 		return functor_(
11960 			enqueueArgs,
11961 			arg0,
11962 			arg1,
11963 			arg2,
11964 			arg3,
11965 			arg4,
11966 			arg5,
11967 			arg6,
11968 			arg7);
11969 	}
11970 
11971 
11972 };
11973 
11974 template<
11975 	typename T0,
11976 	typename T1,
11977 	typename T2,
11978 	typename T3,
11979 	typename T4,
11980 	typename T5,
11981 	typename T6>
11982 struct functionImplementation_
11983 <	T0,
11984 	T1,
11985 	T2,
11986 	T3,
11987 	T4,
11988 	T5,
11989 	T6,
11990 	NullType,
11991 	NullType,
11992 	NullType,
11993 	NullType,
11994 	NullType,
11995 	NullType,
11996 	NullType,
11997 	NullType,
11998 	NullType,
11999 	NullType,
12000 	NullType,
12001 	NullType,
12002 	NullType,
12003 	NullType,
12004 	NullType,
12005 	NullType,
12006 	NullType,
12007 	NullType,
12008 	NullType,
12009 	NullType,
12010 	NullType,
12011 	NullType,
12012 	NullType,
12013 	NullType,
12014 	NullType>
12015 {
12016 	typedef detail::KernelFunctorGlobal<
12017 		T0,
12018 		T1,
12019 		T2,
12020 		T3,
12021 		T4,
12022 		T5,
12023 		T6,
12024 		NullType,
12025 		NullType,
12026 		NullType,
12027 		NullType,
12028 		NullType,
12029 		NullType,
12030 		NullType,
12031 		NullType,
12032 		NullType,
12033 		NullType,
12034 		NullType,
12035 		NullType,
12036 		NullType,
12037 		NullType,
12038 		NullType,
12039 		NullType,
12040 		NullType,
12041 		NullType,
12042 		NullType,
12043 		NullType,
12044 		NullType,
12045 		NullType,
12046 		NullType,
12047 		NullType,
12048 		NullType> FunctorType;
12049 
12050     FunctorType functor_;
12051 
functionImplementation_cl::detail::functionImplementation_12052     functionImplementation_(const FunctorType &functor) :
12053         functor_(functor)
12054     {
12055 
12056         #if (defined(_WIN32) && defined(_VARIADIC_MAX) && (_VARIADIC_MAX < 7))
12057         // Fail variadic expansion for dev11
12058         static_assert(0, "Visual Studio has a hard limit of argument count for a std::function expansion. Please define _VARIADIC_MAX to be 10. If you need more arguments than that VC12 and below cannot support it.");
12059         #endif
12060 
12061     }
12062 
12063 	//! \brief Return type of the functor
12064 	typedef Event result_type;
12065 
12066 	//! \brief Function signature of kernel functor with no event dependency.
12067 	typedef Event type_(
12068 		const EnqueueArgs&,
12069 		T0,
12070 		T1,
12071 		T2,
12072 		T3,
12073 		T4,
12074 		T5,
12075 		T6);
12076 
operator ()cl::detail::functionImplementation_12077 	Event operator()(
12078 		const EnqueueArgs& enqueueArgs,
12079 		T0 arg0,
12080 		T1 arg1,
12081 		T2 arg2,
12082 		T3 arg3,
12083 		T4 arg4,
12084 		T5 arg5,
12085 		T6 arg6)
12086 	{
12087 		return functor_(
12088 			enqueueArgs,
12089 			arg0,
12090 			arg1,
12091 			arg2,
12092 			arg3,
12093 			arg4,
12094 			arg5,
12095 			arg6);
12096 	}
12097 
12098 
12099 };
12100 
12101 template<
12102 	typename T0,
12103 	typename T1,
12104 	typename T2,
12105 	typename T3,
12106 	typename T4,
12107 	typename T5>
12108 struct functionImplementation_
12109 <	T0,
12110 	T1,
12111 	T2,
12112 	T3,
12113 	T4,
12114 	T5,
12115 	NullType,
12116 	NullType,
12117 	NullType,
12118 	NullType,
12119 	NullType,
12120 	NullType,
12121 	NullType,
12122 	NullType,
12123 	NullType,
12124 	NullType,
12125 	NullType,
12126 	NullType,
12127 	NullType,
12128 	NullType,
12129 	NullType,
12130 	NullType,
12131 	NullType,
12132 	NullType,
12133 	NullType,
12134 	NullType,
12135 	NullType,
12136 	NullType,
12137 	NullType,
12138 	NullType,
12139 	NullType,
12140 	NullType>
12141 {
12142 	typedef detail::KernelFunctorGlobal<
12143 		T0,
12144 		T1,
12145 		T2,
12146 		T3,
12147 		T4,
12148 		T5,
12149 		NullType,
12150 		NullType,
12151 		NullType,
12152 		NullType,
12153 		NullType,
12154 		NullType,
12155 		NullType,
12156 		NullType,
12157 		NullType,
12158 		NullType,
12159 		NullType,
12160 		NullType,
12161 		NullType,
12162 		NullType,
12163 		NullType,
12164 		NullType,
12165 		NullType,
12166 		NullType,
12167 		NullType,
12168 		NullType,
12169 		NullType,
12170 		NullType,
12171 		NullType,
12172 		NullType,
12173 		NullType,
12174 		NullType> FunctorType;
12175 
12176     FunctorType functor_;
12177 
functionImplementation_cl::detail::functionImplementation_12178     functionImplementation_(const FunctorType &functor) :
12179         functor_(functor)
12180     {
12181 
12182         #if (defined(_WIN32) && defined(_VARIADIC_MAX) && (_VARIADIC_MAX < 6))
12183         // Fail variadic expansion for dev11
12184         static_assert(0, "Visual Studio has a hard limit of argument count for a std::function expansion. Please define _VARIADIC_MAX to be 10. If you need more arguments than that VC12 and below cannot support it.");
12185         #endif
12186 
12187     }
12188 
12189 	//! \brief Return type of the functor
12190 	typedef Event result_type;
12191 
12192 	//! \brief Function signature of kernel functor with no event dependency.
12193 	typedef Event type_(
12194 		const EnqueueArgs&,
12195 		T0,
12196 		T1,
12197 		T2,
12198 		T3,
12199 		T4,
12200 		T5);
12201 
operator ()cl::detail::functionImplementation_12202 	Event operator()(
12203 		const EnqueueArgs& enqueueArgs,
12204 		T0 arg0,
12205 		T1 arg1,
12206 		T2 arg2,
12207 		T3 arg3,
12208 		T4 arg4,
12209 		T5 arg5)
12210 	{
12211 		return functor_(
12212 			enqueueArgs,
12213 			arg0,
12214 			arg1,
12215 			arg2,
12216 			arg3,
12217 			arg4,
12218 			arg5);
12219 	}
12220 
12221 
12222 };
12223 
12224 template<
12225 	typename T0,
12226 	typename T1,
12227 	typename T2,
12228 	typename T3,
12229 	typename T4>
12230 struct functionImplementation_
12231 <	T0,
12232 	T1,
12233 	T2,
12234 	T3,
12235 	T4,
12236 	NullType,
12237 	NullType,
12238 	NullType,
12239 	NullType,
12240 	NullType,
12241 	NullType,
12242 	NullType,
12243 	NullType,
12244 	NullType,
12245 	NullType,
12246 	NullType,
12247 	NullType,
12248 	NullType,
12249 	NullType,
12250 	NullType,
12251 	NullType,
12252 	NullType,
12253 	NullType,
12254 	NullType,
12255 	NullType,
12256 	NullType,
12257 	NullType,
12258 	NullType,
12259 	NullType,
12260 	NullType,
12261 	NullType,
12262 	NullType>
12263 {
12264 	typedef detail::KernelFunctorGlobal<
12265 		T0,
12266 		T1,
12267 		T2,
12268 		T3,
12269 		T4,
12270 		NullType,
12271 		NullType,
12272 		NullType,
12273 		NullType,
12274 		NullType,
12275 		NullType,
12276 		NullType,
12277 		NullType,
12278 		NullType,
12279 		NullType,
12280 		NullType,
12281 		NullType,
12282 		NullType,
12283 		NullType,
12284 		NullType,
12285 		NullType,
12286 		NullType,
12287 		NullType,
12288 		NullType,
12289 		NullType,
12290 		NullType,
12291 		NullType,
12292 		NullType,
12293 		NullType,
12294 		NullType,
12295 		NullType,
12296 		NullType> FunctorType;
12297 
12298     FunctorType functor_;
12299 
functionImplementation_cl::detail::functionImplementation_12300     functionImplementation_(const FunctorType &functor) :
12301         functor_(functor)
12302     {
12303 
12304         #if (defined(_WIN32) && defined(_VARIADIC_MAX) && (_VARIADIC_MAX < 5))
12305         // Fail variadic expansion for dev11
12306         static_assert(0, "Visual Studio has a hard limit of argument count for a std::function expansion. Please define _VARIADIC_MAX to be 10. If you need more arguments than that VC12 and below cannot support it.");
12307         #endif
12308 
12309     }
12310 
12311 	//! \brief Return type of the functor
12312 	typedef Event result_type;
12313 
12314 	//! \brief Function signature of kernel functor with no event dependency.
12315 	typedef Event type_(
12316 		const EnqueueArgs&,
12317 		T0,
12318 		T1,
12319 		T2,
12320 		T3,
12321 		T4);
12322 
operator ()cl::detail::functionImplementation_12323 	Event operator()(
12324 		const EnqueueArgs& enqueueArgs,
12325 		T0 arg0,
12326 		T1 arg1,
12327 		T2 arg2,
12328 		T3 arg3,
12329 		T4 arg4)
12330 	{
12331 		return functor_(
12332 			enqueueArgs,
12333 			arg0,
12334 			arg1,
12335 			arg2,
12336 			arg3,
12337 			arg4);
12338 	}
12339 
12340 
12341 };
12342 
12343 template<
12344 	typename T0,
12345 	typename T1,
12346 	typename T2,
12347 	typename T3>
12348 struct functionImplementation_
12349 <	T0,
12350 	T1,
12351 	T2,
12352 	T3,
12353 	NullType,
12354 	NullType,
12355 	NullType,
12356 	NullType,
12357 	NullType,
12358 	NullType,
12359 	NullType,
12360 	NullType,
12361 	NullType,
12362 	NullType,
12363 	NullType,
12364 	NullType,
12365 	NullType,
12366 	NullType,
12367 	NullType,
12368 	NullType,
12369 	NullType,
12370 	NullType,
12371 	NullType,
12372 	NullType,
12373 	NullType,
12374 	NullType,
12375 	NullType,
12376 	NullType,
12377 	NullType,
12378 	NullType,
12379 	NullType,
12380 	NullType>
12381 {
12382 	typedef detail::KernelFunctorGlobal<
12383 		T0,
12384 		T1,
12385 		T2,
12386 		T3,
12387 		NullType,
12388 		NullType,
12389 		NullType,
12390 		NullType,
12391 		NullType,
12392 		NullType,
12393 		NullType,
12394 		NullType,
12395 		NullType,
12396 		NullType,
12397 		NullType,
12398 		NullType,
12399 		NullType,
12400 		NullType,
12401 		NullType,
12402 		NullType,
12403 		NullType,
12404 		NullType,
12405 		NullType,
12406 		NullType,
12407 		NullType,
12408 		NullType,
12409 		NullType,
12410 		NullType,
12411 		NullType,
12412 		NullType,
12413 		NullType,
12414 		NullType> FunctorType;
12415 
12416     FunctorType functor_;
12417 
functionImplementation_cl::detail::functionImplementation_12418     functionImplementation_(const FunctorType &functor) :
12419         functor_(functor)
12420     {
12421 
12422         #if (defined(_WIN32) && defined(_VARIADIC_MAX) && (_VARIADIC_MAX < 4))
12423         // Fail variadic expansion for dev11
12424         static_assert(0, "Visual Studio has a hard limit of argument count for a std::function expansion. Please define _VARIADIC_MAX to be 10. If you need more arguments than that VC12 and below cannot support it.");
12425         #endif
12426 
12427     }
12428 
12429 	//! \brief Return type of the functor
12430 	typedef Event result_type;
12431 
12432 	//! \brief Function signature of kernel functor with no event dependency.
12433 	typedef Event type_(
12434 		const EnqueueArgs&,
12435 		T0,
12436 		T1,
12437 		T2,
12438 		T3);
12439 
operator ()cl::detail::functionImplementation_12440 	Event operator()(
12441 		const EnqueueArgs& enqueueArgs,
12442 		T0 arg0,
12443 		T1 arg1,
12444 		T2 arg2,
12445 		T3 arg3)
12446 	{
12447 		return functor_(
12448 			enqueueArgs,
12449 			arg0,
12450 			arg1,
12451 			arg2,
12452 			arg3);
12453 	}
12454 
12455 
12456 };
12457 
12458 template<
12459 	typename T0,
12460 	typename T1,
12461 	typename T2>
12462 struct functionImplementation_
12463 <	T0,
12464 	T1,
12465 	T2,
12466 	NullType,
12467 	NullType,
12468 	NullType,
12469 	NullType,
12470 	NullType,
12471 	NullType,
12472 	NullType,
12473 	NullType,
12474 	NullType,
12475 	NullType,
12476 	NullType,
12477 	NullType,
12478 	NullType,
12479 	NullType,
12480 	NullType,
12481 	NullType,
12482 	NullType,
12483 	NullType,
12484 	NullType,
12485 	NullType,
12486 	NullType,
12487 	NullType,
12488 	NullType,
12489 	NullType,
12490 	NullType,
12491 	NullType,
12492 	NullType,
12493 	NullType,
12494 	NullType>
12495 {
12496 	typedef detail::KernelFunctorGlobal<
12497 		T0,
12498 		T1,
12499 		T2,
12500 		NullType,
12501 		NullType,
12502 		NullType,
12503 		NullType,
12504 		NullType,
12505 		NullType,
12506 		NullType,
12507 		NullType,
12508 		NullType,
12509 		NullType,
12510 		NullType,
12511 		NullType,
12512 		NullType,
12513 		NullType,
12514 		NullType,
12515 		NullType,
12516 		NullType,
12517 		NullType,
12518 		NullType,
12519 		NullType,
12520 		NullType,
12521 		NullType,
12522 		NullType,
12523 		NullType,
12524 		NullType,
12525 		NullType,
12526 		NullType,
12527 		NullType,
12528 		NullType> FunctorType;
12529 
12530     FunctorType functor_;
12531 
functionImplementation_cl::detail::functionImplementation_12532     functionImplementation_(const FunctorType &functor) :
12533         functor_(functor)
12534     {
12535 
12536         #if (defined(_WIN32) && defined(_VARIADIC_MAX) && (_VARIADIC_MAX < 3))
12537         // Fail variadic expansion for dev11
12538         static_assert(0, "Visual Studio has a hard limit of argument count for a std::function expansion. Please define _VARIADIC_MAX to be 10. If you need more arguments than that VC12 and below cannot support it.");
12539         #endif
12540 
12541     }
12542 
12543 	//! \brief Return type of the functor
12544 	typedef Event result_type;
12545 
12546 	//! \brief Function signature of kernel functor with no event dependency.
12547 	typedef Event type_(
12548 		const EnqueueArgs&,
12549 		T0,
12550 		T1,
12551 		T2);
12552 
operator ()cl::detail::functionImplementation_12553 	Event operator()(
12554 		const EnqueueArgs& enqueueArgs,
12555 		T0 arg0,
12556 		T1 arg1,
12557 		T2 arg2)
12558 	{
12559 		return functor_(
12560 			enqueueArgs,
12561 			arg0,
12562 			arg1,
12563 			arg2);
12564 	}
12565 
12566 
12567 };
12568 
12569 template<
12570 	typename T0,
12571 	typename T1>
12572 struct functionImplementation_
12573 <	T0,
12574 	T1,
12575 	NullType,
12576 	NullType,
12577 	NullType,
12578 	NullType,
12579 	NullType,
12580 	NullType,
12581 	NullType,
12582 	NullType,
12583 	NullType,
12584 	NullType,
12585 	NullType,
12586 	NullType,
12587 	NullType,
12588 	NullType,
12589 	NullType,
12590 	NullType,
12591 	NullType,
12592 	NullType,
12593 	NullType,
12594 	NullType,
12595 	NullType,
12596 	NullType,
12597 	NullType,
12598 	NullType,
12599 	NullType,
12600 	NullType,
12601 	NullType,
12602 	NullType,
12603 	NullType,
12604 	NullType>
12605 {
12606 	typedef detail::KernelFunctorGlobal<
12607 		T0,
12608 		T1,
12609 		NullType,
12610 		NullType,
12611 		NullType,
12612 		NullType,
12613 		NullType,
12614 		NullType,
12615 		NullType,
12616 		NullType,
12617 		NullType,
12618 		NullType,
12619 		NullType,
12620 		NullType,
12621 		NullType,
12622 		NullType,
12623 		NullType,
12624 		NullType,
12625 		NullType,
12626 		NullType,
12627 		NullType,
12628 		NullType,
12629 		NullType,
12630 		NullType,
12631 		NullType,
12632 		NullType,
12633 		NullType,
12634 		NullType,
12635 		NullType,
12636 		NullType,
12637 		NullType,
12638 		NullType> FunctorType;
12639 
12640     FunctorType functor_;
12641 
functionImplementation_cl::detail::functionImplementation_12642     functionImplementation_(const FunctorType &functor) :
12643         functor_(functor)
12644     {
12645 
12646         #if (defined(_WIN32) && defined(_VARIADIC_MAX) && (_VARIADIC_MAX < 2))
12647         // Fail variadic expansion for dev11
12648         static_assert(0, "Visual Studio has a hard limit of argument count for a std::function expansion. Please define _VARIADIC_MAX to be 10. If you need more arguments than that VC12 and below cannot support it.");
12649         #endif
12650 
12651     }
12652 
12653 	//! \brief Return type of the functor
12654 	typedef Event result_type;
12655 
12656 	//! \brief Function signature of kernel functor with no event dependency.
12657 	typedef Event type_(
12658 		const EnqueueArgs&,
12659 		T0,
12660 		T1);
12661 
operator ()cl::detail::functionImplementation_12662 	Event operator()(
12663 		const EnqueueArgs& enqueueArgs,
12664 		T0 arg0,
12665 		T1 arg1)
12666 	{
12667 		return functor_(
12668 			enqueueArgs,
12669 			arg0,
12670 			arg1);
12671 	}
12672 
12673 
12674 };
12675 
12676 template<
12677 	typename T0>
12678 struct functionImplementation_
12679 <	T0,
12680 	NullType,
12681 	NullType,
12682 	NullType,
12683 	NullType,
12684 	NullType,
12685 	NullType,
12686 	NullType,
12687 	NullType,
12688 	NullType,
12689 	NullType,
12690 	NullType,
12691 	NullType,
12692 	NullType,
12693 	NullType,
12694 	NullType,
12695 	NullType,
12696 	NullType,
12697 	NullType,
12698 	NullType,
12699 	NullType,
12700 	NullType,
12701 	NullType,
12702 	NullType,
12703 	NullType,
12704 	NullType,
12705 	NullType,
12706 	NullType,
12707 	NullType,
12708 	NullType,
12709 	NullType,
12710 	NullType>
12711 {
12712 	typedef detail::KernelFunctorGlobal<
12713 		T0,
12714 		NullType,
12715 		NullType,
12716 		NullType,
12717 		NullType,
12718 		NullType,
12719 		NullType,
12720 		NullType,
12721 		NullType,
12722 		NullType,
12723 		NullType,
12724 		NullType,
12725 		NullType,
12726 		NullType,
12727 		NullType,
12728 		NullType,
12729 		NullType,
12730 		NullType,
12731 		NullType,
12732 		NullType,
12733 		NullType,
12734 		NullType,
12735 		NullType,
12736 		NullType,
12737 		NullType,
12738 		NullType,
12739 		NullType,
12740 		NullType,
12741 		NullType,
12742 		NullType,
12743 		NullType,
12744 		NullType> FunctorType;
12745 
12746     FunctorType functor_;
12747 
functionImplementation_cl::detail::functionImplementation_12748     functionImplementation_(const FunctorType &functor) :
12749         functor_(functor)
12750     {
12751 
12752         #if (defined(_WIN32) && defined(_VARIADIC_MAX) && (_VARIADIC_MAX < 1))
12753         // Fail variadic expansion for dev11
12754         static_assert(0, "Visual Studio has a hard limit of argument count for a std::function expansion. Please define _VARIADIC_MAX to be 10. If you need more arguments than that VC12 and below cannot support it.");
12755         #endif
12756 
12757     }
12758 
12759 	//! \brief Return type of the functor
12760 	typedef Event result_type;
12761 
12762 	//! \brief Function signature of kernel functor with no event dependency.
12763 	typedef Event type_(
12764 		const EnqueueArgs&,
12765 		T0);
12766 
operator ()cl::detail::functionImplementation_12767 	Event operator()(
12768 		const EnqueueArgs& enqueueArgs,
12769 		T0 arg0)
12770 	{
12771 		return functor_(
12772 			enqueueArgs,
12773 			arg0);
12774 	}
12775 
12776 
12777 };
12778 
12779 
12780 
12781 
12782 
12783 } // namespace detail
12784 
12785 //----------------------------------------------------------------------------------------------
12786 
12787 template <
12788    typename T0,   typename T1 = detail::NullType,   typename T2 = detail::NullType,
12789    typename T3 = detail::NullType,   typename T4 = detail::NullType,
12790    typename T5 = detail::NullType,   typename T6 = detail::NullType,
12791    typename T7 = detail::NullType,   typename T8 = detail::NullType,
12792    typename T9 = detail::NullType,   typename T10 = detail::NullType,
12793    typename T11 = detail::NullType,   typename T12 = detail::NullType,
12794    typename T13 = detail::NullType,   typename T14 = detail::NullType,
12795    typename T15 = detail::NullType,   typename T16 = detail::NullType,
12796    typename T17 = detail::NullType,   typename T18 = detail::NullType,
12797    typename T19 = detail::NullType,   typename T20 = detail::NullType,
12798    typename T21 = detail::NullType,   typename T22 = detail::NullType,
12799    typename T23 = detail::NullType,   typename T24 = detail::NullType,
12800    typename T25 = detail::NullType,   typename T26 = detail::NullType,
12801    typename T27 = detail::NullType,   typename T28 = detail::NullType,
12802    typename T29 = detail::NullType,   typename T30 = detail::NullType,
12803    typename T31 = detail::NullType
12804 >
12805 struct make_kernel :
12806     public detail::functionImplementation_<
12807                T0,   T1,   T2,   T3,
12808                T4,   T5,   T6,   T7,
12809                T8,   T9,   T10,   T11,
12810                T12,   T13,   T14,   T15,
12811                T16,   T17,   T18,   T19,
12812                T20,   T21,   T22,   T23,
12813                T24,   T25,   T26,   T27,
12814                T28,   T29,   T30,   T31
12815     >
12816 {
12817 public:
12818     typedef detail::KernelFunctorGlobal<
12819                T0,   T1,   T2,   T3,
12820                T4,   T5,   T6,   T7,
12821                T8,   T9,   T10,   T11,
12822                T12,   T13,   T14,   T15,
12823                T16,   T17,   T18,   T19,
12824                T20,   T21,   T22,   T23,
12825                T24,   T25,   T26,   T27,
12826                T28,   T29,   T30,   T31
12827     > FunctorType;
12828 
make_kernelcl::make_kernel12829     make_kernel(
12830         const Program& program,
12831         const STRING_CLASS name,
12832         cl_int * err = NULL) :
12833            detail::functionImplementation_<
12834                     T0,   T1,   T2,   T3,
12835                        T4,   T5,   T6,   T7,
12836                        T8,   T9,   T10,   T11,
12837                        T12,   T13,   T14,   T15,
12838                        T16,   T17,   T18,   T19,
12839                        T20,   T21,   T22,   T23,
12840                        T24,   T25,   T26,   T27,
12841                        T28,   T29,   T30,   T31
12842            >(
12843             FunctorType(program, name, err))
12844     {}
12845 
make_kernelcl::make_kernel12846     make_kernel(
12847         const Kernel kernel) :
12848            detail::functionImplementation_<
12849                     T0,   T1,   T2,   T3,
12850                        T4,   T5,   T6,   T7,
12851                        T8,   T9,   T10,   T11,
12852                        T12,   T13,   T14,   T15,
12853                        T16,   T17,   T18,   T19,
12854                        T20,   T21,   T22,   T23,
12855                        T24,   T25,   T26,   T27,
12856                        T28,   T29,   T30,   T31
12857            >(
12858             FunctorType(kernel))
12859     {}
12860 };
12861 
12862 
12863 //----------------------------------------------------------------------------------------------------------------------
12864 
12865 #undef __ERR_STR
12866 #if !defined(__CL_USER_OVERRIDE_ERROR_STRINGS)
12867 #undef __GET_DEVICE_INFO_ERR
12868 #undef __GET_PLATFORM_INFO_ERR
12869 #undef __GET_DEVICE_IDS_ERR
12870 #undef __GET_CONTEXT_INFO_ERR
12871 #undef __GET_EVENT_INFO_ERR
12872 #undef __GET_EVENT_PROFILE_INFO_ERR
12873 #undef __GET_MEM_OBJECT_INFO_ERR
12874 #undef __GET_IMAGE_INFO_ERR
12875 #undef __GET_SAMPLER_INFO_ERR
12876 #undef __GET_KERNEL_INFO_ERR
12877 #undef __GET_KERNEL_ARG_INFO_ERR
12878 #undef __GET_KERNEL_WORK_GROUP_INFO_ERR
12879 #undef __GET_PROGRAM_INFO_ERR
12880 #undef __GET_PROGRAM_BUILD_INFO_ERR
12881 #undef __GET_COMMAND_QUEUE_INFO_ERR
12882 
12883 #undef __CREATE_CONTEXT_ERR
12884 #undef __CREATE_CONTEXT_FROM_TYPE_ERR
12885 #undef __GET_SUPPORTED_IMAGE_FORMATS_ERR
12886 
12887 #undef __CREATE_BUFFER_ERR
12888 #undef __CREATE_SUBBUFFER_ERR
12889 #undef __CREATE_IMAGE2D_ERR
12890 #undef __CREATE_IMAGE3D_ERR
12891 #undef __CREATE_SAMPLER_ERR
12892 #undef __SET_MEM_OBJECT_DESTRUCTOR_CALLBACK_ERR
12893 
12894 #undef __CREATE_USER_EVENT_ERR
12895 #undef __SET_USER_EVENT_STATUS_ERR
12896 #undef __SET_EVENT_CALLBACK_ERR
12897 #undef __SET_PRINTF_CALLBACK_ERR
12898 
12899 #undef __WAIT_FOR_EVENTS_ERR
12900 
12901 #undef __CREATE_KERNEL_ERR
12902 #undef __SET_KERNEL_ARGS_ERR
12903 #undef __CREATE_PROGRAM_WITH_SOURCE_ERR
12904 #undef __CREATE_PROGRAM_WITH_BINARY_ERR
12905 #undef __CREATE_PROGRAM_WITH_BUILT_IN_KERNELS_ERR
12906 #undef __BUILD_PROGRAM_ERR
12907 #undef __CREATE_KERNELS_IN_PROGRAM_ERR
12908 
12909 #undef __CREATE_COMMAND_QUEUE_ERR
12910 #undef __SET_COMMAND_QUEUE_PROPERTY_ERR
12911 #undef __ENQUEUE_READ_BUFFER_ERR
12912 #undef __ENQUEUE_WRITE_BUFFER_ERR
12913 #undef __ENQUEUE_READ_BUFFER_RECT_ERR
12914 #undef __ENQUEUE_WRITE_BUFFER_RECT_ERR
12915 #undef __ENQEUE_COPY_BUFFER_ERR
12916 #undef __ENQEUE_COPY_BUFFER_RECT_ERR
12917 #undef __ENQUEUE_READ_IMAGE_ERR
12918 #undef __ENQUEUE_WRITE_IMAGE_ERR
12919 #undef __ENQUEUE_COPY_IMAGE_ERR
12920 #undef __ENQUEUE_COPY_IMAGE_TO_BUFFER_ERR
12921 #undef __ENQUEUE_COPY_BUFFER_TO_IMAGE_ERR
12922 #undef __ENQUEUE_MAP_BUFFER_ERR
12923 #undef __ENQUEUE_MAP_IMAGE_ERR
12924 #undef __ENQUEUE_UNMAP_MEM_OBJECT_ERR
12925 #undef __ENQUEUE_NDRANGE_KERNEL_ERR
12926 #undef __ENQUEUE_TASK_ERR
12927 #undef __ENQUEUE_NATIVE_KERNEL
12928 
12929 #undef __CL_EXPLICIT_CONSTRUCTORS
12930 
12931 #undef __UNLOAD_COMPILER_ERR
12932 #endif //__CL_USER_OVERRIDE_ERROR_STRINGS
12933 
12934 #undef __CL_FUNCTION_TYPE
12935 
12936 // Extensions
12937 /**
12938  * Deprecated APIs for 1.2
12939  */
12940 #if defined(CL_VERSION_1_1)
12941 #undef __INIT_CL_EXT_FCN_PTR
12942 #endif // #if defined(CL_VERSION_1_1)
12943 #undef __CREATE_SUB_DEVICES
12944 
12945 #if defined(USE_CL_DEVICE_FISSION)
12946 #undef __PARAM_NAME_DEVICE_FISSION
12947 #endif // USE_CL_DEVICE_FISSION
12948 
12949 #undef __DEFAULT_NOT_INITIALIZED
12950 #undef __DEFAULT_BEING_INITIALIZED
12951 #undef __DEFAULT_INITIALIZED
12952 
12953 #undef CL_HPP_RVALUE_REFERENCES_SUPPORTED
12954 #undef CL_HPP_NOEXCEPT
12955 
12956 } // namespace cl
12957 
12958 #endif // CL_HPP_
12959