// Fragment of <new>, shared between dlib and libc++

// Define these here, to avoid dependency on yvals.h for libc++.
#define _XMN_GLUE3_B(x,y,z) x##y##z
#define _XMN_GLUE3(x,y,z) _XMN_GLUE3_B(x,y,z)

#if __has_feature(cxx_noexcept)
#define _XMN_NOEXCEPT noexcept
#else // no noexcept
#define _XMN_NOEXCEPT
#endif // has noexcept


// Declare a nothrow new for each heap memory
#pragma language = save
#pragma language = extended
#define __HEAP_MEM_HELPER1__(_Mem, _I)                                      \
  void _Mem *operator new _Mem(_XMN_GLUE3(__DATA_MEM, _I, _SIZE_TYPE__),    \
                               const std::nothrow_t&)                       \
    _XMN_NOEXCEPT;      // allocate or return null pointer
__HEAP_MEMORY_LIST1__()
#undef __HEAP_MEM_HELPER1__

// Define a placement new for each heap memory
#define __HEAP_MEM_HELPER1__(_Mem, _I)                                          \
  inline void _Mem *operator new _Mem(_XMN_GLUE3(__DATA_MEM, _I, _SIZE_TYPE__), \
                                      void _Mem *_Where) _XMN_NOEXCEPT          \
  {       /* construct with placement at _Where */                              \
    return _Where;                                                              \
  }
__HEAP_MEMORY_LIST1__()
#undef __HEAP_MEM_HELPER1__

// Declare a nothrow array new for each heap memory
#define __HEAP_MEM_HELPER1__(_Mem, _I)                                      \
  void _Mem *operator new[] _Mem(_XMN_GLUE3(__DATA_MEM, _I, _SIZE_TYPE__),  \
                                 const std::nothrow_t&)                     \
    _XMN_NOEXCEPT;      // allocate array or return null pointer
__HEAP_MEMORY_LIST1__()
#undef __HEAP_MEM_HELPER1__

// Define a placement array new for each heap memory
#define __HEAP_MEM_HELPER1__(_Mem, _I)                                      \
  inline void _Mem *operator new[] _Mem(                                    \
                                  _XMN_GLUE3(__DATA_MEM, _I, _SIZE_TYPE__), \
                                        void _Mem *_Where) _XMN_NOEXCEPT    \
  {       /* construct arrat with placement at _Where */                    \
    return _Where;                                                          \
  }
__HEAP_MEMORY_LIST1__()
#undef __HEAP_MEM_HELPER1__

#pragma language = restore
