/*===---- new - CUDA wrapper for <new> -------------------------------------===
 *
 * Permission is hereby granted, free of charge, to any person obtaining a copy
 * of this software and associated documentation files (the "Software"), to deal
 * in the Software without restriction, including without limitation the rights
 * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
 * copies of the Software, and to permit persons to whom the Software is
 * furnished to do so, subject to the following conditions:
 *
 * The above copyright notice and this permission notice shall be included in
 * all copies or substantial portions of the Software.
 *
 * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
 * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
 * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
 * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
 * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
 * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
 * THE SOFTWARE.
 *
 *===-----------------------------------------------------------------------===
 */

#ifndef __CLANG_CUDA_WRAPPERS_NEW
#define __CLANG_CUDA_WRAPPERS_NEW

#include_next <new>

#if !defined(__device__)
// The header has been included too early from the standard C++ library
// and CUDA-specific macros are not available yet.
// Undo the include guard and try again later.
#undef __CLANG_CUDA_WRAPPERS_NEW
#else

#pragma push_macro("CUDA_NOEXCEPT")
#if __cplusplus >= 201103L
#define CUDA_NOEXCEPT noexcept
#else
#define CUDA_NOEXCEPT
#endif

// Device overrides for non-placement new and delete.
__device__ inline void *operator new(__SIZE_TYPE__ size) {
  if (size == 0) {
    size = 1;
  }
  return ::malloc(size);
}
__device__ inline void *operator new(__SIZE_TYPE__ size,
                                     const std::nothrow_t &) CUDA_NOEXCEPT {
  return ::operator new(size);
}

__device__ inline void *operator new[](__SIZE_TYPE__ size) {
  return ::operator new(size);
}
__device__ inline void *operator new[](__SIZE_TYPE__ size,
                                       const std::nothrow_t &) {
  return ::operator new(size);
}

__device__ inline void operator delete(void* ptr) CUDA_NOEXCEPT {
  if (ptr) {
    ::free(ptr);
  }
}
__device__ inline void operator delete(void *ptr,
                                       const std::nothrow_t &) CUDA_NOEXCEPT {
  ::operator delete(ptr);
}

__device__ inline void operator delete[](void* ptr) CUDA_NOEXCEPT {
  ::operator delete(ptr);
}
__device__ inline void operator delete[](void *ptr,
                                         const std::nothrow_t &) CUDA_NOEXCEPT {
  ::operator delete(ptr);
}

// Sized delete, C++14 only.
#if __cplusplus >= 201402L
__device__ inline void operator delete(void *ptr,
                                       __SIZE_TYPE__ size) CUDA_NOEXCEPT {
  ::operator delete(ptr);
}
__device__ inline void operator delete[](void *ptr,
                                         __SIZE_TYPE__ size) CUDA_NOEXCEPT {
  ::operator delete(ptr);
}
#endif

// Device overrides for placement new and delete.
__device__ inline void *operator new(__SIZE_TYPE__, void *__ptr) CUDA_NOEXCEPT {
  return __ptr;
}
__device__ inline void *operator new[](__SIZE_TYPE__, void *__ptr) CUDA_NOEXCEPT {
  return __ptr;
}
__device__ inline void operator delete(void *, void *) CUDA_NOEXCEPT {}
__device__ inline void operator delete[](void *, void *) CUDA_NOEXCEPT {}

#pragma pop_macro("CUDA_NOEXCEPT")

#endif // __device__
#endif // include guard
