From 71935d8cd261e67dd4dc42287de8390fdc4bac02 Mon Sep 17 00:00:00 2001
From: Yichao Yu <yyc1992@gmail.com>
Date: Wed, 21 May 2014 09:03:08 -0400
Subject: [PATCH] get_int_info

---
 src/c_wrapper/utils.h     |  30 ++
 src/c_wrapper/wrap_cl.cpp | 695 ++++++++++++++++++--------------------
 2 files changed, 364 insertions(+), 361 deletions(-)

diff --git a/src/c_wrapper/utils.h b/src/c_wrapper/utils.h
index 1db38696..668b8e97 100644
--- a/src/c_wrapper/utils.h
+++ b/src/c_wrapper/utils.h
@@ -84,6 +84,14 @@ public:
 
 namespace pyopencl {
 
+template<typename T>
+static inline cl_bool
+cast_bool(const T &v)
+{
+    return v ? CL_TRUE : CL_FALSE;
+}
+
+
 // FIXME
 static inline char*
 _copy_str(const std::string& str)
@@ -91,6 +99,8 @@ _copy_str(const std::string& str)
     return strdup(str.c_str());
 }
 
+// {{{ GetInfo helpers
+
 template<typename T, typename... ArgTypes, typename... ArgTypes2>
 static inline pyopencl_buf<T>
 get_vec_info(cl_int (*func)(ArgTypes...), const char *name,
@@ -201,4 +211,24 @@ get_str_info(cl_int (*func)(ArgTypes...), const char *name,
 #define pyopencl_get_str_info(what, args...)                            \
     pyopencl::get_str_info(clGet##what##Info, "clGet" #what "Info", args)
 
+template<typename T, typename... ArgTypes, typename... ArgTypes2>
+static inline generic_info
+get_int_info(cl_int (*func)(ArgTypes...), const char *name,
+             const char *tpname, ArgTypes2&&... args)
+{
+    pyopencl_buf<T> param_value;
+    call_guarded(func, name, args..., sizeof(T), param_value.get(), NULL);
+    generic_info info;
+    info.dontfree = 0;
+    info.opaque_class = CLASS_NONE;
+    info.type = tpname;
+    info.value = (void*)param_value.release();
+    return info;
+}
+#define pyopencl_get_int_info(type, what, args...)                      \
+    pyopencl::get_int_info<type>(clGet##what##Info, "clGet" #what "Info", \
+                                 #type "*", args)
+
+// }}}
+
 }
diff --git a/src/c_wrapper/wrap_cl.cpp b/src/c_wrapper/wrap_cl.cpp
index bb6f8cf1..aa73a266 100644
--- a/src/c_wrapper/wrap_cl.cpp
+++ b/src/c_wrapper/wrap_cl.cpp
@@ -58,24 +58,6 @@
 // }}}
 
 
-// {{{ GetInfo helpers
-
-#define PYOPENCL_GET_INTEGRAL_INFO(WHAT, FIRST_ARG, SECOND_ARG, TYPE)   \
-  {                                                                     \
-    pyopencl_buf<TYPE> param_value;                                     \
-    pyopencl_call_guarded(clGet##WHAT##Info, FIRST_ARG, SECOND_ARG,     \
-                          sizeof(TYPE), param_value.get(), NULL);       \
-    generic_info info;                                                  \
-    info.dontfree = 0;                                                  \
-    info.opaque_class = CLASS_NONE;                                     \
-    info.type = #TYPE"*";                                               \
-    info.value = (void*)param_value.release();                          \
-    return info;                                                        \
-  }
-
-// }}}
-
-
 // {{{ event helpers
 
 #define PYOPENCL_PARSE_OBJECT_LIST(CLS, TYPE, OUT, NAME, NUM)   \
@@ -224,13 +206,6 @@ run_python_gc();                                \
 namespace pyopencl
 {
 
-template<typename T>
-static inline cl_bool
-cast_bool(const T &v)
-{
-    return v ? CL_TRUE : CL_FALSE;
-}
-
   class noncopyable {
     // non-copyable
 
@@ -415,193 +390,216 @@ cast_bool(const T &v)
 
       generic_info get_info(cl_device_info param_name) const
       {
-#define DEV_GET_INT_INF(TYPE) PYOPENCL_GET_INTEGRAL_INFO(Device, m_device, param_name, TYPE);
-
-        switch (param_name)
-          {
-          case CL_DEVICE_TYPE: DEV_GET_INT_INF(cl_device_type);
-          case CL_DEVICE_VENDOR_ID: DEV_GET_INT_INF(cl_uint);
-          case CL_DEVICE_MAX_COMPUTE_UNITS: DEV_GET_INT_INF(cl_uint);
-          case CL_DEVICE_MAX_WORK_ITEM_DIMENSIONS: DEV_GET_INT_INF(cl_uint);
-          case CL_DEVICE_MAX_WORK_GROUP_SIZE: DEV_GET_INT_INF(size_t);
-
-          case CL_DEVICE_MAX_WORK_ITEM_SIZES:
-              return pyopencl_get_array_info(size_t, Device,
-                                             m_device, param_name);
-
-          case CL_DEVICE_PREFERRED_VECTOR_WIDTH_CHAR: DEV_GET_INT_INF(cl_uint);
-          case CL_DEVICE_PREFERRED_VECTOR_WIDTH_SHORT: DEV_GET_INT_INF(cl_uint);
-          case CL_DEVICE_PREFERRED_VECTOR_WIDTH_INT: DEV_GET_INT_INF(cl_uint);
-          case CL_DEVICE_PREFERRED_VECTOR_WIDTH_LONG: DEV_GET_INT_INF(cl_uint);
-          case CL_DEVICE_PREFERRED_VECTOR_WIDTH_FLOAT: DEV_GET_INT_INF(cl_uint);
-          case CL_DEVICE_PREFERRED_VECTOR_WIDTH_DOUBLE: DEV_GET_INT_INF(cl_uint);
-
-          case CL_DEVICE_MAX_CLOCK_FREQUENCY: DEV_GET_INT_INF(cl_uint);
-          case CL_DEVICE_ADDRESS_BITS: DEV_GET_INT_INF(cl_uint);
-          case CL_DEVICE_MAX_READ_IMAGE_ARGS: DEV_GET_INT_INF(cl_uint);
-          case CL_DEVICE_MAX_WRITE_IMAGE_ARGS: DEV_GET_INT_INF(cl_uint);
-          case CL_DEVICE_MAX_MEM_ALLOC_SIZE: DEV_GET_INT_INF(cl_ulong);
-          case CL_DEVICE_IMAGE2D_MAX_WIDTH: DEV_GET_INT_INF(size_t);
-          case CL_DEVICE_IMAGE2D_MAX_HEIGHT: DEV_GET_INT_INF(size_t);
-          case CL_DEVICE_IMAGE3D_MAX_WIDTH: DEV_GET_INT_INF(size_t);
-          case CL_DEVICE_IMAGE3D_MAX_HEIGHT: DEV_GET_INT_INF(size_t);
-          case CL_DEVICE_IMAGE3D_MAX_DEPTH: DEV_GET_INT_INF(size_t);
-          case CL_DEVICE_IMAGE_SUPPORT: DEV_GET_INT_INF(cl_bool);
-          case CL_DEVICE_MAX_PARAMETER_SIZE: DEV_GET_INT_INF(size_t);
-          case CL_DEVICE_MAX_SAMPLERS: DEV_GET_INT_INF(cl_uint);
-          case CL_DEVICE_MEM_BASE_ADDR_ALIGN: DEV_GET_INT_INF(cl_uint);
-          case CL_DEVICE_MIN_DATA_TYPE_ALIGN_SIZE: DEV_GET_INT_INF(cl_uint);
-          case CL_DEVICE_SINGLE_FP_CONFIG: DEV_GET_INT_INF(cl_device_fp_config);
+#define DEV_GET_INT_INF(TYPE) pyopencl_get_int_info(TYPE, Device, m_device, param_name)
+        switch (param_name) {
+        case CL_DEVICE_TYPE:
+            return DEV_GET_INT_INF(cl_device_type);
+        case CL_DEVICE_MAX_WORK_GROUP_SIZE:
+            return DEV_GET_INT_INF(size_t);
+        case CL_DEVICE_MAX_WORK_ITEM_DIMENSIONS:
+        case CL_DEVICE_MAX_COMPUTE_UNITS:
+        case CL_DEVICE_VENDOR_ID:
+            return DEV_GET_INT_INF(cl_uint);
+
+        case CL_DEVICE_MAX_WORK_ITEM_SIZES:
+            return pyopencl_get_array_info(size_t, Device, m_device, param_name);
+
+        case CL_DEVICE_PREFERRED_VECTOR_WIDTH_CHAR:
+        case CL_DEVICE_PREFERRED_VECTOR_WIDTH_SHORT:
+        case CL_DEVICE_PREFERRED_VECTOR_WIDTH_INT:
+        case CL_DEVICE_PREFERRED_VECTOR_WIDTH_LONG:
+        case CL_DEVICE_PREFERRED_VECTOR_WIDTH_FLOAT:
+        case CL_DEVICE_PREFERRED_VECTOR_WIDTH_DOUBLE:
+
+        case CL_DEVICE_MAX_CLOCK_FREQUENCY:
+        case CL_DEVICE_ADDRESS_BITS:
+        case CL_DEVICE_MAX_READ_IMAGE_ARGS:
+        case CL_DEVICE_MAX_WRITE_IMAGE_ARGS:
+        case CL_DEVICE_MAX_SAMPLERS:
+        case CL_DEVICE_MEM_BASE_ADDR_ALIGN:
+        case CL_DEVICE_MIN_DATA_TYPE_ALIGN_SIZE:
+            return DEV_GET_INT_INF(cl_uint);
+
+        case CL_DEVICE_MAX_MEM_ALLOC_SIZE:
+            return DEV_GET_INT_INF(cl_ulong);
+
+        case CL_DEVICE_IMAGE2D_MAX_WIDTH:
+        case CL_DEVICE_IMAGE2D_MAX_HEIGHT:
+        case CL_DEVICE_IMAGE3D_MAX_WIDTH:
+        case CL_DEVICE_IMAGE3D_MAX_HEIGHT:
+        case CL_DEVICE_IMAGE3D_MAX_DEPTH:
+        case CL_DEVICE_MAX_PARAMETER_SIZE:
+            return DEV_GET_INT_INF(size_t);
+
+        case CL_DEVICE_IMAGE_SUPPORT:
+            return DEV_GET_INT_INF(cl_bool);
 #ifdef CL_DEVICE_DOUBLE_FP_CONFIG
-          case CL_DEVICE_DOUBLE_FP_CONFIG: DEV_GET_INT_INF(cl_device_fp_config);
+        case CL_DEVICE_DOUBLE_FP_CONFIG:
 #endif
 #ifdef CL_DEVICE_HALF_FP_CONFIG
-          case CL_DEVICE_HALF_FP_CONFIG: DEV_GET_INT_INF(cl_device_fp_config);
+        case CL_DEVICE_HALF_FP_CONFIG:
 #endif
+        case CL_DEVICE_SINGLE_FP_CONFIG:
+            return DEV_GET_INT_INF(cl_device_fp_config);
+
+        case CL_DEVICE_GLOBAL_MEM_CACHE_TYPE:
+            return DEV_GET_INT_INF(cl_device_mem_cache_type);
+        case CL_DEVICE_GLOBAL_MEM_CACHELINE_SIZE:
+            return DEV_GET_INT_INF(cl_uint);
+        case CL_DEVICE_GLOBAL_MEM_CACHE_SIZE:
+        case CL_DEVICE_GLOBAL_MEM_SIZE:
+        case CL_DEVICE_LOCAL_MEM_SIZE:
+        case CL_DEVICE_MAX_CONSTANT_BUFFER_SIZE:
+            return DEV_GET_INT_INF(cl_ulong);
+
+        case CL_DEVICE_MAX_CONSTANT_ARGS:
+            return DEV_GET_INT_INF(cl_uint);
+        case CL_DEVICE_LOCAL_MEM_TYPE:
+            return DEV_GET_INT_INF(cl_device_local_mem_type);
+        case CL_DEVICE_PROFILING_TIMER_RESOLUTION:
+            return DEV_GET_INT_INF(size_t);
+        case CL_DEVICE_ENDIAN_LITTLE:
+        case CL_DEVICE_AVAILABLE:
+        case CL_DEVICE_COMPILER_AVAILABLE:
+        case CL_DEVICE_ERROR_CORRECTION_SUPPORT:
+            return DEV_GET_INT_INF(cl_bool);
+        case CL_DEVICE_EXECUTION_CAPABILITIES:
+            return DEV_GET_INT_INF(cl_device_exec_capabilities);
+        case CL_DEVICE_QUEUE_PROPERTIES:
+            return DEV_GET_INT_INF(cl_command_queue_properties);
+
+        case CL_DEVICE_NAME:
+        case CL_DEVICE_VENDOR:
+        case CL_DRIVER_VERSION:
+        case CL_DEVICE_PROFILE:
+        case CL_DEVICE_VERSION:
+        case CL_DEVICE_EXTENSIONS:
+            return pyopencl_get_str_info(Device, m_device, param_name);
 
-          case CL_DEVICE_GLOBAL_MEM_CACHE_TYPE: DEV_GET_INT_INF(cl_device_mem_cache_type);
-          case CL_DEVICE_GLOBAL_MEM_CACHELINE_SIZE: DEV_GET_INT_INF(cl_uint);
-          case CL_DEVICE_GLOBAL_MEM_CACHE_SIZE: DEV_GET_INT_INF(cl_ulong);
-          case CL_DEVICE_GLOBAL_MEM_SIZE: DEV_GET_INT_INF(cl_ulong);
-
-          case CL_DEVICE_MAX_CONSTANT_BUFFER_SIZE: DEV_GET_INT_INF(cl_ulong);
-          case CL_DEVICE_MAX_CONSTANT_ARGS: DEV_GET_INT_INF(cl_uint);
-          case CL_DEVICE_LOCAL_MEM_TYPE: DEV_GET_INT_INF(cl_device_local_mem_type);
-          case CL_DEVICE_LOCAL_MEM_SIZE: DEV_GET_INT_INF(cl_ulong);
-          case CL_DEVICE_ERROR_CORRECTION_SUPPORT: DEV_GET_INT_INF(cl_bool);
-          case CL_DEVICE_PROFILING_TIMER_RESOLUTION: DEV_GET_INT_INF(size_t);
-          case CL_DEVICE_ENDIAN_LITTLE: DEV_GET_INT_INF(cl_bool);
-          case CL_DEVICE_AVAILABLE: DEV_GET_INT_INF(cl_bool);
-          case CL_DEVICE_COMPILER_AVAILABLE: DEV_GET_INT_INF(cl_bool);
-          case CL_DEVICE_EXECUTION_CAPABILITIES: DEV_GET_INT_INF(cl_device_exec_capabilities);
-          case CL_DEVICE_QUEUE_PROPERTIES: DEV_GET_INT_INF(cl_command_queue_properties);
-
-          case CL_DEVICE_NAME:
-          case CL_DEVICE_VENDOR:
-          case CL_DRIVER_VERSION:
-          case CL_DEVICE_PROFILE:
-          case CL_DEVICE_VERSION:
-          case CL_DEVICE_EXTENSIONS:
-              return pyopencl_get_str_info(Device, m_device, param_name);
-
-          case CL_DEVICE_PLATFORM:
-              return pyopencl_get_opaque_info(cl_platform_id, platform,
-                                              Device, m_device, param_name);
+        case CL_DEVICE_PLATFORM:
+            return pyopencl_get_opaque_info(cl_platform_id, platform,
+                                            Device, m_device, param_name);
 #if PYOPENCL_CL_VERSION >= 0x1010
-          case CL_DEVICE_PREFERRED_VECTOR_WIDTH_HALF: DEV_GET_INT_INF(cl_uint);
-
-          case CL_DEVICE_NATIVE_VECTOR_WIDTH_CHAR: DEV_GET_INT_INF(cl_uint);
-          case CL_DEVICE_NATIVE_VECTOR_WIDTH_SHORT: DEV_GET_INT_INF(cl_uint);
-          case CL_DEVICE_NATIVE_VECTOR_WIDTH_INT: DEV_GET_INT_INF(cl_uint);
-          case CL_DEVICE_NATIVE_VECTOR_WIDTH_LONG: DEV_GET_INT_INF(cl_uint);
-          case CL_DEVICE_NATIVE_VECTOR_WIDTH_FLOAT: DEV_GET_INT_INF(cl_uint);
-          case CL_DEVICE_NATIVE_VECTOR_WIDTH_DOUBLE: DEV_GET_INT_INF(cl_uint);
-          case CL_DEVICE_NATIVE_VECTOR_WIDTH_HALF: DEV_GET_INT_INF(cl_uint);
-
-          case CL_DEVICE_HOST_UNIFIED_MEMORY: DEV_GET_INT_INF(cl_bool);
-          case CL_DEVICE_OPENCL_C_VERSION:
+        case CL_DEVICE_PREFERRED_VECTOR_WIDTH_HALF:
+        case CL_DEVICE_NATIVE_VECTOR_WIDTH_CHAR:
+        case CL_DEVICE_NATIVE_VECTOR_WIDTH_SHORT:
+        case CL_DEVICE_NATIVE_VECTOR_WIDTH_INT:
+        case CL_DEVICE_NATIVE_VECTOR_WIDTH_LONG:
+        case CL_DEVICE_NATIVE_VECTOR_WIDTH_FLOAT:
+        case CL_DEVICE_NATIVE_VECTOR_WIDTH_DOUBLE:
+        case CL_DEVICE_NATIVE_VECTOR_WIDTH_HALF:
+            return DEV_GET_INT_INF(cl_uint);
+
+        case CL_DEVICE_HOST_UNIFIED_MEMORY:
+            return DEV_GET_INT_INF(cl_bool);
+        case CL_DEVICE_OPENCL_C_VERSION:
             return pyopencl_get_str_info(Device, m_device, param_name);
 #endif
 #ifdef CL_DEVICE_COMPUTE_CAPABILITY_MAJOR_NV
-          case CL_DEVICE_COMPUTE_CAPABILITY_MAJOR_NV:
-          case CL_DEVICE_COMPUTE_CAPABILITY_MINOR_NV:
-          case CL_DEVICE_REGISTERS_PER_BLOCK_NV:
-          case CL_DEVICE_WARP_SIZE_NV:
-            DEV_GET_INT_INF(cl_uint);
-          case CL_DEVICE_GPU_OVERLAP_NV:
-          case CL_DEVICE_KERNEL_EXEC_TIMEOUT_NV:
-          case CL_DEVICE_INTEGRATED_MEMORY_NV:
-            DEV_GET_INT_INF(cl_bool);
+        case CL_DEVICE_COMPUTE_CAPABILITY_MAJOR_NV:
+        case CL_DEVICE_COMPUTE_CAPABILITY_MINOR_NV:
+        case CL_DEVICE_REGISTERS_PER_BLOCK_NV:
+        case CL_DEVICE_WARP_SIZE_NV:
+            return DEV_GET_INT_INF(cl_uint);
+        case CL_DEVICE_GPU_OVERLAP_NV:
+        case CL_DEVICE_KERNEL_EXEC_TIMEOUT_NV:
+        case CL_DEVICE_INTEGRATED_MEMORY_NV:
+            return DEV_GET_INT_INF(cl_bool);
 #endif
 #if defined(cl_ext_device_fission) && defined(PYOPENCL_USE_DEVICE_FISSION)
-          case CL_DEVICE_PARENT_DEVICE_EXT:
-              return pyopencl_get_opaque_info(cl_device_id, device,
-                                              Device, m_device, param_name);
-          case CL_DEVICE_PARTITION_TYPES_EXT:
-          case CL_DEVICE_AFFINITY_DOMAINS_EXT:
-          case CL_DEVICE_PARTITION_STYLE_EXT:
-              return pyopencl_get_array_info(cl_device_partition_property_ext,
-                                             Device, m_device, param_name);
-          case CL_DEVICE_REFERENCE_COUNT_EXT: DEV_GET_INT_INF(cl_uint);
+        case CL_DEVICE_PARENT_DEVICE_EXT:
+            return pyopencl_get_opaque_info(cl_device_id, device,
+                                            Device, m_device, param_name);
+        case CL_DEVICE_PARTITION_TYPES_EXT:
+        case CL_DEVICE_AFFINITY_DOMAINS_EXT:
+        case CL_DEVICE_PARTITION_STYLE_EXT:
+            return pyopencl_get_array_info(cl_device_partition_property_ext,
+                                           Device, m_device, param_name);
+        case CL_DEVICE_REFERENCE_COUNT_EXT:
+            return DEV_GET_INT_INF(cl_uint);
 #endif
 #if PYOPENCL_CL_VERSION >= 0x1020
-          case CL_DEVICE_LINKER_AVAILABLE: DEV_GET_INT_INF(cl_bool);
-          case CL_DEVICE_BUILT_IN_KERNELS:
-              return pyopencl_get_str_info(Device, m_device, param_name);
-          case CL_DEVICE_IMAGE_MAX_BUFFER_SIZE: DEV_GET_INT_INF(size_t);
-          case CL_DEVICE_IMAGE_MAX_ARRAY_SIZE: DEV_GET_INT_INF(size_t);
-          case CL_DEVICE_PARENT_DEVICE:
-              return pyopencl_get_opaque_info(cl_device_id, device,
-                                              Device, m_device, param_name);
-          case CL_DEVICE_PARTITION_MAX_SUB_DEVICES: DEV_GET_INT_INF(cl_uint);
-          case CL_DEVICE_PARTITION_TYPE:
-          case CL_DEVICE_PARTITION_PROPERTIES:
-              return pyopencl_get_array_info(cl_device_partition_property,
-                                             Device, m_device, param_name);
-          case CL_DEVICE_PARTITION_AFFINITY_DOMAIN:
-              return pyopencl_get_array_info(cl_device_affinity_domain,
-                                             Device, m_device, param_name);
-          case CL_DEVICE_REFERENCE_COUNT: DEV_GET_INT_INF(cl_uint);
-          case CL_DEVICE_PREFERRED_INTEROP_USER_SYNC: DEV_GET_INT_INF(cl_bool);
-          case CL_DEVICE_PRINTF_BUFFER_SIZE: DEV_GET_INT_INF(cl_bool);
+        case CL_DEVICE_LINKER_AVAILABLE: return DEV_GET_INT_INF(cl_bool);
+        case CL_DEVICE_BUILT_IN_KERNELS:
+            return pyopencl_get_str_info(Device, m_device, param_name);
+        case CL_DEVICE_IMAGE_MAX_BUFFER_SIZE:
+        case CL_DEVICE_IMAGE_MAX_ARRAY_SIZE:
+            DEV_GET_INT_INF(size_t);
+        case CL_DEVICE_PARENT_DEVICE:
+            return pyopencl_get_opaque_info(cl_device_id, device,
+                                            Device, m_device, param_name);
+        case CL_DEVICE_PARTITION_MAX_SUB_DEVICES:
+            return DEV_GET_INT_INF(cl_uint);
+        case CL_DEVICE_PARTITION_TYPE:
+        case CL_DEVICE_PARTITION_PROPERTIES:
+            return pyopencl_get_array_info(cl_device_partition_property,
+                                           Device, m_device, param_name);
+        case CL_DEVICE_PARTITION_AFFINITY_DOMAIN:
+            return pyopencl_get_array_info(cl_device_affinity_domain,
+                                           Device, m_device, param_name);
+        case CL_DEVICE_REFERENCE_COUNT: DEV_GET_INT_INF(cl_uint);
+        case CL_DEVICE_PREFERRED_INTEROP_USER_SYNC:
+        case CL_DEVICE_PRINTF_BUFFER_SIZE:
+            DEV_GET_INT_INF(cl_bool);
 #endif
-          // {{{ AMD dev attrs
-          //
-          // types of AMD dev attrs divined from
-          // https://www.khronos.org/registry/cl/api/1.2/cl.hpp
+            // {{{ AMD dev attrs
+            //
+            // types of AMD dev attrs divined from
+            // https://www.khronos.org/registry/cl/api/1.2/cl.hpp
 #ifdef CL_DEVICE_PROFILING_TIMER_OFFSET_AMD
-          case CL_DEVICE_PROFILING_TIMER_OFFSET_AMD: DEV_GET_INT_INF(cl_ulong);
+        case CL_DEVICE_PROFILING_TIMER_OFFSET_AMD: DEV_GET_INT_INF(cl_ulong);
 #endif
-          /* FIXME
-             #ifdef CL_DEVICE_TOPOLOGY_AMD
-             case CL_DEVICE_TOPOLOGY_AMD:
-             #endif
-          */
+            /* FIXME
+               #ifdef CL_DEVICE_TOPOLOGY_AMD
+               case CL_DEVICE_TOPOLOGY_AMD:
+               #endif
+            */
 #ifdef CL_DEVICE_BOARD_NAME_AMD
-          case CL_DEVICE_BOARD_NAME_AMD: ;
-              return pyopencl_get_str_info(Device, m_device, param_name);
+        case CL_DEVICE_BOARD_NAME_AMD: ;
+            return pyopencl_get_str_info(Device, m_device, param_name);
 #endif
 #ifdef CL_DEVICE_GLOBAL_FREE_MEMORY_AMD
-          case CL_DEVICE_GLOBAL_FREE_MEMORY_AMD:
-              return pyopencl_get_array_info(size_t, Device,
-                                             m_device, param_name);
+        case CL_DEVICE_GLOBAL_FREE_MEMORY_AMD:
+            return pyopencl_get_array_info(size_t, Device,
+                                           m_device, param_name);
 #endif
 #ifdef CL_DEVICE_SIMD_PER_COMPUTE_UNIT_AMD
-          case CL_DEVICE_SIMD_PER_COMPUTE_UNIT_AMD: DEV_GET_INT_INF(cl_uint);
+        case CL_DEVICE_SIMD_PER_COMPUTE_UNIT_AMD:
 #endif
 #ifdef CL_DEVICE_SIMD_WIDTH_AMD
-          case CL_DEVICE_SIMD_WIDTH_AMD: DEV_GET_INT_INF(cl_uint);
+        case CL_DEVICE_SIMD_WIDTH_AMD:
 #endif
 #ifdef CL_DEVICE_SIMD_INSTRUCTION_WIDTH_AMD
-          case CL_DEVICE_SIMD_INSTRUCTION_WIDTH_AMD: DEV_GET_INT_INF(cl_uint);
+        case CL_DEVICE_SIMD_INSTRUCTION_WIDTH_AMD:
 #endif
 #ifdef CL_DEVICE_WAVEFRONT_WIDTH_AMD
-          case CL_DEVICE_WAVEFRONT_WIDTH_AMD: DEV_GET_INT_INF(cl_uint);
+        case CL_DEVICE_WAVEFRONT_WIDTH_AMD:
 #endif
 #ifdef CL_DEVICE_GLOBAL_MEM_CHANNELS_AMD
-          case CL_DEVICE_GLOBAL_MEM_CHANNELS_AMD: DEV_GET_INT_INF(cl_uint);
+        case CL_DEVICE_GLOBAL_MEM_CHANNELS_AMD:
 #endif
 #ifdef CL_DEVICE_GLOBAL_MEM_CHANNEL_BANKS_AMD
-          case CL_DEVICE_GLOBAL_MEM_CHANNEL_BANKS_AMD: DEV_GET_INT_INF(cl_uint);
+        case CL_DEVICE_GLOBAL_MEM_CHANNEL_BANKS_AMD:
 #endif
 #ifdef CL_DEVICE_GLOBAL_MEM_CHANNEL_BANK_WIDTH_AMD
-          case CL_DEVICE_GLOBAL_MEM_CHANNEL_BANK_WIDTH_AMD: DEV_GET_INT_INF(cl_uint);
+        case CL_DEVICE_GLOBAL_MEM_CHANNEL_BANK_WIDTH_AMD:
 #endif
 #ifdef CL_DEVICE_LOCAL_MEM_SIZE_PER_COMPUTE_UNIT_AMD
-          case CL_DEVICE_LOCAL_MEM_SIZE_PER_COMPUTE_UNIT_AMD: DEV_GET_INT_INF(cl_uint);
+        case CL_DEVICE_LOCAL_MEM_SIZE_PER_COMPUTE_UNIT_AMD:
 #endif
 #ifdef CL_DEVICE_LOCAL_MEM_BANKS_AMD
-          case CL_DEVICE_LOCAL_MEM_BANKS_AMD: DEV_GET_INT_INF(cl_uint);
+        case CL_DEVICE_LOCAL_MEM_BANKS_AMD:
 #endif
-          // }}}
 
 #ifdef CL_DEVICE_MAX_ATOMIC_COUNTERS_EXT
-          case CL_DEVICE_MAX_ATOMIC_COUNTERS_EXT: DEV_GET_INT_INF(cl_uint);
+        case CL_DEVICE_MAX_ATOMIC_COUNTERS_EXT:
 #endif
+            return DEV_GET_INT_INF(cl_uint);
+            // }}}
 
-          default:
+        default:
             throw error("Device.get_info", CL_INVALID_VALUE);
-          }
+        }
       }
 
     // TODO: sub-devices
@@ -708,67 +706,67 @@ cast_bool(const T &v)
 
       generic_info get_info(cl_context_info param_name) const
       {
-        switch (param_name)
-        {
-          case CL_CONTEXT_REFERENCE_COUNT:
-            PYOPENCL_GET_INTEGRAL_INFO(Context, m_context, param_name, cl_uint);
-
-          case CL_CONTEXT_DEVICES:
-              return pyopencl_get_opaque_array_info(
-                  cl_device_id, device, Context, m_context, param_name);
-          case CL_CONTEXT_PROPERTIES: {
-              auto result = pyopencl_get_vec_info(
-                  cl_context_properties, Context, m_context, param_name);
-              pyopencl_buf<generic_info> py_result(result.len() / 2);
-              size_t i = 0;
-              for (;i < py_result.len();i++) {
-                  cl_context_properties key = result[i * 2];
-                  if (key == 0)
-                      break;
-                  cl_context_properties value = result[i * 2 + 1];
-                  generic_info &info = py_result[i];
-                  info.dontfree = 0;
-                  info.opaque_class = CLASS_NONE;
-                  switch (key) {
-                  case CL_CONTEXT_PLATFORM:
-                      info.opaque_class = CLASS_PLATFORM;
-                      info.type = "void *";
-                      info.value = new platform(
-                          reinterpret_cast<cl_platform_id>(value));
-                      break;
+        switch (param_name) {
+        case CL_CONTEXT_REFERENCE_COUNT:
+            return pyopencl_get_int_info(cl_uint, Context,
+                                         m_context, param_name);
+        case CL_CONTEXT_DEVICES:
+            return pyopencl_get_opaque_array_info(
+                cl_device_id, device, Context, m_context, param_name);
+        case CL_CONTEXT_PROPERTIES: {
+            auto result = pyopencl_get_vec_info(
+                cl_context_properties, Context, m_context, param_name);
+            pyopencl_buf<generic_info> py_result(result.len() / 2);
+            size_t i = 0;
+            for (;i < py_result.len();i++) {
+                cl_context_properties key = result[i * 2];
+                if (key == 0)
+                    break;
+                cl_context_properties value = result[i * 2 + 1];
+                generic_info &info = py_result[i];
+                info.dontfree = 0;
+                info.opaque_class = CLASS_NONE;
+                switch (key) {
+                case CL_CONTEXT_PLATFORM:
+                    info.opaque_class = CLASS_PLATFORM;
+                    info.type = "void *";
+                    info.value = new platform(
+                        reinterpret_cast<cl_platform_id>(value));
+                    break;
 
 #if defined(PYOPENCL_GL_SHARING_VERSION) && (PYOPENCL_GL_SHARING_VERSION >= 1)
 #if defined(__APPLE__) && defined(HAVE_GL)
-                  case CL_CONTEXT_PROPERTY_USE_CGL_SHAREGROUP_APPLE:
+                case CL_CONTEXT_PROPERTY_USE_CGL_SHAREGROUP_APPLE:
 #else
-                  case CL_GL_CONTEXT_KHR:
-                  case CL_EGL_DISPLAY_KHR:
-                  case CL_GLX_DISPLAY_KHR:
-                  case CL_WGL_HDC_KHR:
-                  case CL_CGL_SHAREGROUP_KHR:
+                case CL_GL_CONTEXT_KHR:
+                case CL_EGL_DISPLAY_KHR:
+                case CL_GLX_DISPLAY_KHR:
+                case CL_WGL_HDC_KHR:
+                case CL_CGL_SHAREGROUP_KHR:
 #endif
-                      info.type = "intptr_t *";
-                      info.value = (void*)value;
-                      // we do not own this object
-                      info.dontfree = 1;
-                      break;
+                    info.type = "intptr_t *";
+                    info.value = (void*)value;
+                    // we do not own this object
+                    info.dontfree = 1;
+                    break;
 
 #endif
-                  default:
-                      throw error("Context.get_info", CL_INVALID_VALUE,
-                                  "unknown context_property key encountered");
-                  }
-              }
-              py_result.resize(i);
-              return pyopencl_convert_array_info(generic_info, py_result);
-          }
+                default:
+                    throw error("Context.get_info", CL_INVALID_VALUE,
+                                "unknown context_property key encountered");
+                }
+            }
+            py_result.resize(i);
+            return pyopencl_convert_array_info(generic_info, py_result);
+        }
 
 #if PYOPENCL_CL_VERSION >= 0x1010
-          case CL_CONTEXT_NUM_DEVICES:
-            PYOPENCL_GET_INTEGRAL_INFO(Context, m_context, param_name, cl_uint);
+        case CL_CONTEXT_NUM_DEVICES:
+            return pyopencl_get_int_info(cl_uint, Context,
+                                         m_context, param_name);
 #endif
 
-          default:
+        default:
             throw error("Context.get_info", CL_INVALID_VALUE);
         }
       }
@@ -846,13 +844,13 @@ cast_bool(const T &v)
             return pyopencl_get_opaque_info(cl_device_id, device,
                                             CommandQueue, m_queue, param_name);
         case CL_QUEUE_REFERENCE_COUNT:
-          PYOPENCL_GET_INTEGRAL_INFO(CommandQueue, m_queue, param_name,
-                                     cl_uint);
+            return pyopencl_get_int_info(cl_uint, CommandQueue,
+                                         m_queue, param_name);
         case CL_QUEUE_PROPERTIES:
-          PYOPENCL_GET_INTEGRAL_INFO(CommandQueue, m_queue, param_name,
-                                     cl_command_queue_properties);
+            return pyopencl_get_int_info(cl_command_queue_properties,
+                                         CommandQueue, m_queue, param_name);
         default:
-          throw error("CommandQueue.get_info", CL_INVALID_VALUE);
+            throw error("CommandQueue.get_info", CL_INVALID_VALUE);
         }
       }
 
@@ -927,14 +925,12 @@ cast_bool(const T &v)
             return pyopencl_get_opaque_info(cl_command_queue, command_queue,
                                             Event, m_event, param_name);
         case CL_EVENT_COMMAND_TYPE:
-            PYOPENCL_GET_INTEGRAL_INFO(Event, m_event, param_name,
-                cl_command_type);
+            return pyopencl_get_int_info(cl_command_type, Event,
+                                         m_event, param_name);
         case CL_EVENT_COMMAND_EXECUTION_STATUS:
-            PYOPENCL_GET_INTEGRAL_INFO(Event, m_event, param_name,
-                cl_int);
+            return pyopencl_get_int_info(cl_int, Event, m_event, param_name);
         case CL_EVENT_REFERENCE_COUNT:
-            PYOPENCL_GET_INTEGRAL_INFO(Event, m_event, param_name,
-                cl_uint);
+            return pyopencl_get_int_info(cl_uint, Event, m_event, param_name);
 #if PYOPENCL_CL_VERSION >= 0x1010
         case CL_EVENT_CONTEXT:
             return pyopencl_get_opaque_info(cl_context, context,
@@ -948,15 +944,14 @@ cast_bool(const T &v)
 
       generic_info get_profiling_info(cl_profiling_info param_name) const
       {
-        switch (param_name)
-        {
-          case CL_PROFILING_COMMAND_QUEUED:
-          case CL_PROFILING_COMMAND_SUBMIT:
-          case CL_PROFILING_COMMAND_START:
-          case CL_PROFILING_COMMAND_END:
-            PYOPENCL_GET_INTEGRAL_INFO(EventProfiling, m_event, param_name,
-                cl_ulong);
-          default:
+        switch (param_name) {
+        case CL_PROFILING_COMMAND_QUEUED:
+        case CL_PROFILING_COMMAND_SUBMIT:
+        case CL_PROFILING_COMMAND_START:
+        case CL_PROFILING_COMMAND_END:
+            return pyopencl_get_int_info(cl_ulong, EventProfiling,
+                                         m_event, param_name);
+        default:
             throw error("Event.get_profiling_info", CL_INVALID_VALUE);
         }
       }
@@ -989,26 +984,26 @@ cast_bool(const T &v)
         return param_value;
       }
 
-      generic_info get_info(cl_mem_info param_name) {
-        switch (param_name){
+      generic_info get_info(cl_mem_info param_name)
+      {
+          switch (param_name){
           case CL_MEM_TYPE:
-            PYOPENCL_GET_INTEGRAL_INFO(MemObject, data(), param_name,
-                cl_mem_object_type);
+              return pyopencl_get_int_info(cl_mem_object_type, MemObject,
+                                           data(), param_name);
           case CL_MEM_FLAGS:
-            PYOPENCL_GET_INTEGRAL_INFO(MemObject, data(), param_name,
-                cl_mem_flags);
+              return pyopencl_get_int_info(cl_mem_flags, MemObject,
+                                           data(), param_name);
           case CL_MEM_SIZE:
-            PYOPENCL_GET_INTEGRAL_INFO(MemObject, data(), param_name,
-                size_t);
+              return pyopencl_get_int_info(size_t, MemObject,
+                                           data(), param_name);
           case CL_MEM_HOST_PTR:
-            throw pyopencl::error("MemoryObject.get_info", CL_INVALID_VALUE,
-                "Use MemoryObject.get_host_array to get host pointer.");
+              throw pyopencl::error("MemoryObject.get_info", CL_INVALID_VALUE,
+                                    "Use MemoryObject.get_host_array to get "
+                                    "host pointer.");
           case CL_MEM_MAP_COUNT:
-            PYOPENCL_GET_INTEGRAL_INFO(MemObject, data(), param_name,
-                cl_uint);
           case CL_MEM_REFERENCE_COUNT:
-            PYOPENCL_GET_INTEGRAL_INFO(MemObject, data(), param_name,
-                cl_uint);
+              return pyopencl_get_int_info(cl_uint, MemObject,
+                                           data(), param_name);
           case CL_MEM_CONTEXT:
               return pyopencl_get_opaque_info(cl_context, context,
                                               MemObject, data(), param_name);
@@ -1028,12 +1023,12 @@ cast_bool(const T &v)
             //        return create_mem_object_wrapper(param_value);
             //      }
           case CL_MEM_OFFSET:
-            PYOPENCL_GET_INTEGRAL_INFO(MemObject, data(), param_name,
-                size_t);
+              return pyopencl_get_int_info(size_t, MemObject,
+                                           data(), param_name);
 #endif
 
           default:
-            throw error("MemoryObjectHolder.get_info", CL_INVALID_VALUE);
+              throw error("MemoryObjectHolder.get_info", CL_INVALID_VALUE);
         }
       }
   };
@@ -1174,21 +1169,20 @@ cast_bool(const T &v)
 
       generic_info get_image_info(cl_image_info param_name) const
       {
-        switch (param_name)
-        {
-          case CL_IMAGE_FORMAT:
-            PYOPENCL_GET_INTEGRAL_INFO(Image, data(), param_name,
-                cl_image_format);
-          case CL_IMAGE_ELEMENT_SIZE:
-          case CL_IMAGE_ROW_PITCH:
-          case CL_IMAGE_SLICE_PITCH:
-          case CL_IMAGE_WIDTH:
-          case CL_IMAGE_HEIGHT:
-          case CL_IMAGE_DEPTH:
+        switch (param_name) {
+        case CL_IMAGE_FORMAT:
+            return pyopencl_get_int_info(cl_image_format, Image,
+                                         data(), param_name);
+        case CL_IMAGE_ELEMENT_SIZE:
+        case CL_IMAGE_ROW_PITCH:
+        case CL_IMAGE_SLICE_PITCH:
+        case CL_IMAGE_WIDTH:
+        case CL_IMAGE_HEIGHT:
+        case CL_IMAGE_DEPTH:
 #if PYOPENCL_CL_VERSION >= 0x1020
-          case CL_IMAGE_ARRAY_SIZE:
+        case CL_IMAGE_ARRAY_SIZE:
 #endif
-            PYOPENCL_GET_INTEGRAL_INFO(Image, data(), param_name, size_t);
+            return pyopencl_get_int_info(size_t, Image, data(), param_name);
 
 #if PYOPENCL_CL_VERSION >= 0x1020
             // TODO:
@@ -1205,12 +1199,12 @@ cast_bool(const T &v)
             //        return create_mem_object_wrapper(param_value);
             //      }
 
-          case CL_IMAGE_NUM_MIP_LEVELS:
-          case CL_IMAGE_NUM_SAMPLES:
-            PYOPENCL_GET_INTEGRAL_INFO(Image, data(), param_name, cl_uint);
+        case CL_IMAGE_NUM_MIP_LEVELS:
+        case CL_IMAGE_NUM_SAMPLES:
+            return pyopencl_get_int_info(cl_uint, Image, data(), param_name);
 #endif
 
-          default:
+        default:
             throw error("MemoryObject.get_image_info", CL_INVALID_VALUE);
         }
       }
@@ -1615,16 +1609,14 @@ cast_bool(const T &v)
 
     generic_info get_gl_texture_info(cl_gl_texture_info param_name)
     {
-      switch (param_name)
-        {
-        case CL_GL_TEXTURE_TARGET:
-          PYOPENCL_GET_INTEGRAL_INFO(GLTexture, data(), param_name, GLenum);
-        case CL_GL_MIPMAP_LEVEL:
-          PYOPENCL_GET_INTEGRAL_INFO(GLTexture, data(), param_name, GLint);
-
-        default:
+      switch (param_name) {
+      case CL_GL_TEXTURE_TARGET:
+          return pyopencl_get_int_info(GLenum, GLTexture, data(), param_name);
+      case CL_GL_MIPMAP_LEVEL:
+          return pyopencl_get_int_info(GLint, GLTexture, data(), param_name);
+      default:
           throw error("MemoryObject.get_gl_texture_info", CL_INVALID_VALUE);
-        }
+      }
     }
   };
 
@@ -2017,25 +2009,24 @@ cast_bool(const T &v)
 
       generic_info get_info(cl_sampler_info param_name) const
       {
-        switch (param_name)
-        {
-          case CL_SAMPLER_REFERENCE_COUNT:
-            PYOPENCL_GET_INTEGRAL_INFO(Sampler, m_sampler, param_name,
-                cl_uint);
-          case CL_SAMPLER_CONTEXT:
-              return pyopencl_get_opaque_info(cl_context, context,
-                                              Sampler, m_sampler, param_name);
-          case CL_SAMPLER_ADDRESSING_MODE:
-            PYOPENCL_GET_INTEGRAL_INFO(Sampler, m_sampler, param_name,
-                cl_addressing_mode);
-          case CL_SAMPLER_FILTER_MODE:
-            PYOPENCL_GET_INTEGRAL_INFO(Sampler, m_sampler, param_name,
-                cl_filter_mode);
-          case CL_SAMPLER_NORMALIZED_COORDS:
-            PYOPENCL_GET_INTEGRAL_INFO(Sampler, m_sampler, param_name,
-                cl_bool);
+        switch (param_name) {
+        case CL_SAMPLER_REFERENCE_COUNT:
+            return pyopencl_get_int_info(cl_uint, Sampler,
+                                         m_sampler, param_name);
+        case CL_SAMPLER_CONTEXT:
+            return pyopencl_get_opaque_info(cl_context, context,
+                                            Sampler, m_sampler, param_name);
+        case CL_SAMPLER_ADDRESSING_MODE:
+            return pyopencl_get_int_info(cl_addressing_mode, Sampler,
+                                         m_sampler, param_name);
+        case CL_SAMPLER_FILTER_MODE:
+            return pyopencl_get_int_info(cl_filter_mode, Sampler,
+                                         m_sampler, param_name);
+        case CL_SAMPLER_NORMALIZED_COORDS:
+            return pyopencl_get_int_info(cl_bool, Sampler,
+                                         m_sampler, param_name);
 
-          default:
+        default:
             throw error("Sampler.get_info", CL_INVALID_VALUE);
         }
       }
@@ -2086,17 +2077,14 @@ cast_bool(const T &v)
 
       generic_info get_info(cl_program_info param_name) const
       {
-        switch (param_name)
-        {
-          case CL_PROGRAM_REFERENCE_COUNT:
-            PYOPENCL_GET_INTEGRAL_INFO(Program, m_program, param_name,
-                cl_uint);
+        switch (param_name) {
           case CL_PROGRAM_CONTEXT:
               return pyopencl_get_opaque_info(cl_context, context,
                                               Program, m_program, param_name);
+          case CL_PROGRAM_REFERENCE_COUNT:
           case CL_PROGRAM_NUM_DEVICES:
-            PYOPENCL_GET_INTEGRAL_INFO(Program, m_program, param_name,
-                cl_uint);
+              return pyopencl_get_int_info(cl_uint, Program,
+                                           m_program, param_name);
           case CL_PROGRAM_DEVICES:
               return pyopencl_get_opaque_array_info(
                   cl_device_id, device, Program, m_program, param_name);
@@ -2135,8 +2123,8 @@ cast_bool(const T &v)
 
 #if PYOPENCL_CL_VERSION >= 0x1020
           case CL_PROGRAM_NUM_KERNELS:
-            PYOPENCL_GET_INTEGRAL_INFO(Program, m_program, param_name,
-                size_t);
+              return pyopencl_get_int_info(size_t, Program,
+                                           m_program, param_name);
           case CL_PROGRAM_KERNEL_NAMES:
               return pyopencl_get_str_info(Program, m_program, param_name);
 #endif
@@ -2147,28 +2135,22 @@ cast_bool(const T &v)
       }
 
       generic_info get_build_info(device const &dev,
-          cl_program_build_info param_name) const
+                                  cl_program_build_info param_name) const
       {
-        switch (param_name)
-        {
-#define PYOPENCL_FIRST_ARG m_program, dev.data() // hackety hack
-          case CL_PROGRAM_BUILD_STATUS:
-            PYOPENCL_GET_INTEGRAL_INFO(ProgramBuild,
-                PYOPENCL_FIRST_ARG, param_name,
-                cl_build_status);
-          case CL_PROGRAM_BUILD_OPTIONS:
-          case CL_PROGRAM_BUILD_LOG:
+        switch (param_name) {
+        case CL_PROGRAM_BUILD_STATUS:
+            return pyopencl_get_int_info(cl_build_status, ProgramBuild,
+                                         m_program, dev.data(), param_name);
+        case CL_PROGRAM_BUILD_OPTIONS:
+        case CL_PROGRAM_BUILD_LOG:
             return pyopencl_get_str_info(ProgramBuild, m_program,
                                          dev.data(), param_name);
 #if PYOPENCL_CL_VERSION >= 0x1020
-          case CL_PROGRAM_BINARY_TYPE:
-            PYOPENCL_GET_INTEGRAL_INFO(ProgramBuild,
-                PYOPENCL_FIRST_ARG, param_name,
-                cl_program_binary_type);
+        case CL_PROGRAM_BINARY_TYPE:
+            return pyopencl_get_int_info(cl_program_binary_type, ProgramBuild,
+                                         m_program, dev.data(), param_name);
 #endif
-#undef PYOPENCL_FIRST_ARG
-
-          default:
+        default:
             throw error("Program.get_build_info", CL_INVALID_VALUE);
         }
       }
@@ -2425,53 +2407,44 @@ cast_bool(const T &v)
           return pyopencl_get_str_info(Kernel, m_kernel, param_name);
       case CL_KERNEL_NUM_ARGS:
       case CL_KERNEL_REFERENCE_COUNT:
-          PYOPENCL_GET_INTEGRAL_INFO(Kernel, m_kernel, param_name,
-                                     cl_uint);
-        case CL_KERNEL_CONTEXT:
-            return pyopencl_get_opaque_info(cl_context, context,
-                                            Kernel, m_kernel, param_name);
-        case CL_KERNEL_PROGRAM:
-            return pyopencl_get_opaque_info(cl_program, program,
-                                            Kernel, m_kernel, param_name);
+          return pyopencl_get_int_info(cl_uint, Kernel, m_kernel, param_name);
+      case CL_KERNEL_CONTEXT:
+          return pyopencl_get_opaque_info(cl_context, context,
+                                          Kernel, m_kernel, param_name);
+      case CL_KERNEL_PROGRAM:
+          return pyopencl_get_opaque_info(cl_program, program,
+                                          Kernel, m_kernel, param_name);
 #if PYOPENCL_CL_VERSION >= 0x1020
-        case CL_KERNEL_ATTRIBUTES:
-            return pyopencl_get_str_info(Kernel, m_kernel, param_name);
+      case CL_KERNEL_ATTRIBUTES:
+          return pyopencl_get_str_info(Kernel, m_kernel, param_name);
 #endif
-        default:
+      default:
           throw error("Kernel.get_info", CL_INVALID_VALUE);
-        }
+      }
     }
 
     generic_info get_work_group_info(cl_kernel_work_group_info param_name, device const &dev) const
     {
-      switch (param_name)
-        {
-#define PYOPENCL_FIRST_ARG m_kernel, dev.data() // hackety hack
-        case CL_KERNEL_WORK_GROUP_SIZE:
-          PYOPENCL_GET_INTEGRAL_INFO(KernelWorkGroup,
-                                     PYOPENCL_FIRST_ARG, param_name,
-                                     size_t);
-        case CL_KERNEL_COMPILE_WORK_GROUP_SIZE:
-            return pyopencl_get_array_info(size_t, KernelWorkGroup,
-                                           m_kernel, dev.data(), param_name);
-        case CL_KERNEL_LOCAL_MEM_SIZE:
+      switch (param_name) {
 #if PYOPENCL_CL_VERSION >= 0x1010
-        case CL_KERNEL_PRIVATE_MEM_SIZE:
+      case CL_KERNEL_PREFERRED_WORK_GROUP_SIZE_MULTIPLE:
 #endif
-          PYOPENCL_GET_INTEGRAL_INFO(KernelWorkGroup,
-                                     PYOPENCL_FIRST_ARG, param_name,
-                                     cl_ulong);
-
+      case CL_KERNEL_WORK_GROUP_SIZE:
+          return pyopencl_get_int_info(size_t, KernelWorkGroup,
+                                       m_kernel, dev.data(), param_name);
+      case CL_KERNEL_COMPILE_WORK_GROUP_SIZE:
+          return pyopencl_get_array_info(size_t, KernelWorkGroup,
+                                         m_kernel, dev.data(), param_name);
+      case CL_KERNEL_LOCAL_MEM_SIZE:
 #if PYOPENCL_CL_VERSION >= 0x1010
-        case CL_KERNEL_PREFERRED_WORK_GROUP_SIZE_MULTIPLE:
-          PYOPENCL_GET_INTEGRAL_INFO(KernelWorkGroup,
-                                     PYOPENCL_FIRST_ARG, param_name,
-                                     size_t);
+      case CL_KERNEL_PRIVATE_MEM_SIZE:
 #endif
-        default:
+          return pyopencl_get_int_info(cl_ulong, KernelWorkGroup,
+                                       m_kernel, dev.data(), param_name);
+
+      default:
           throw error("Kernel.get_work_group_info", CL_INVALID_VALUE);
-#undef PYOPENCL_FIRST_ARG
-        }
+      }
     }
 
     // #if PYOPENCL_CL_VERSION >= 0x1020
-- 
GitLab