#pragma once #include "udf_version.h" #include #include #include #include #if UDF_ABI_COMPATIBILITY_VERSION_CURRENT >= UDF_ABI_COMPATIBILITY_VERSION(2, 37) extern "C" void* UdfArrowAllocate(ui64 size); extern "C" void* UdfArrowReallocate(const void* mem, ui64 prevSize, ui64 size); extern "C" void UdfArrowFree(const void* mem, ui64 size); #endif #if UDF_ABI_COMPATIBILITY_VERSION_CURRENT >= UDF_ABI_COMPATIBILITY_VERSION(2, 8) extern "C" void* UdfAllocateWithSize(ui64 size); extern "C" void UdfFreeWithSize(const void* mem, ui64 size); extern "C" [[deprecated("Use UdfAllocateWithSize() instead")]] void* UdfAllocate(ui64 size); extern "C" [[deprecated("Use UdfFreeWithSize() instead")]] void UdfFree(const void* mem); #else extern "C" void* UdfAllocate(ui64 size); extern "C" void UdfFree(const void* mem); #endif namespace NYql { namespace NUdf { template struct TStdAllocatorForUdf { typedef Type value_type; typedef Type* pointer; typedef const Type* const_pointer; typedef Type& reference; typedef const Type& const_reference; typedef size_t size_type; typedef ptrdiff_t difference_type; TStdAllocatorForUdf() noexcept = default; ~TStdAllocatorForUdf() noexcept = default; template TStdAllocatorForUdf(const TStdAllocatorForUdf&) noexcept {}; template struct rebind { typedef TStdAllocatorForUdf other; }; template bool operator==(const TStdAllocatorForUdf&) const { return true; }; template bool operator!=(const TStdAllocatorForUdf&) const { return false; } static pointer allocate(size_type n, const void* = nullptr) { #if UDF_ABI_COMPATIBILITY_VERSION_CURRENT >= UDF_ABI_COMPATIBILITY_VERSION(2, 8) return static_cast(UdfAllocateWithSize(n * sizeof(value_type))); #else return static_cast(UdfAllocate(n * sizeof(value_type))); #endif } static void deallocate(const_pointer p, size_type n) noexcept { #if UDF_ABI_COMPATIBILITY_VERSION_CURRENT >= UDF_ABI_COMPATIBILITY_VERSION(2, 8) (void)(n); return UdfFreeWithSize(static_cast(p), n * sizeof(value_type)); #else (void)(n); return UdfFree(static_cast(p)); #endif } }; struct TWithUdfAllocator { void* operator new(size_t sz) { #if UDF_ABI_COMPATIBILITY_VERSION_CURRENT >= UDF_ABI_COMPATIBILITY_VERSION(2, 8) return UdfAllocateWithSize(sz); #else return UdfAllocate(sz); #endif } void* operator new[](size_t sz) { #if UDF_ABI_COMPATIBILITY_VERSION_CURRENT >= UDF_ABI_COMPATIBILITY_VERSION(2, 8) return UdfAllocateWithSize(sz); #else return UdfAllocate(sz); #endif } #if UDF_ABI_COMPATIBILITY_VERSION_CURRENT >= UDF_ABI_COMPATIBILITY_VERSION(2, 8) void operator delete(void *mem, std::size_t sz) noexcept { return UdfFreeWithSize(mem, sz); } void operator delete[](void *mem, std::size_t sz) noexcept { return UdfFreeWithSize(mem, sz); } #else void operator delete(void *mem) noexcept { return UdfFree(mem); } void operator delete[](void *mem) noexcept { return UdfFree(mem); } #endif }; } // namespace NUdf } // namespace NYql