From d0250ae4261ad009167d12ec36b5d56a330f903a Mon Sep 17 00:00:00 2001 From: lethosor Date: Sun, 28 May 2023 13:08:06 -0400 Subject: [PATCH] Update allocator_try_assign() to match behavior of fstream allocator for non-copyable types Looks like the choice we have made here previously is to return NULL if attempting to allocate types that we cannot allocate. --- library/include/DataDefs.h | 10 +++++++--- 1 file changed, 7 insertions(+), 3 deletions(-) diff --git a/library/include/DataDefs.h b/library/include/DataDefs.h index 0109f0fd0..e03e9a0a8 100644 --- a/library/include/DataDefs.h +++ b/library/include/DataDefs.h @@ -499,23 +499,27 @@ namespace df template typename std::enable_if< - std::is_copy_assignable::value + std::is_copy_assignable::value, + void* >::type allocator_try_assign(void *out, const void *in) { *(T*)out = *(const T*)in; + return out; } template typename std::enable_if< - !std::is_copy_assignable::value + !std::is_copy_assignable::value, + void* >::type allocator_try_assign(void *out, const void *in) { // assignment is not possible; do nothing + return NULL; } #pragma GCC diagnostic push #pragma GCC diagnostic ignored "-Wdelete-non-virtual-dtor" template void *allocator_fn(void *out, const void *in) { - if (out) { allocator_try_assign(out, in); return out; } + if (out) { return allocator_try_assign(out, in); } else if (in) { delete (T*)in; return (T*)in; } else return new T(); }