diff --git a/library/include/DataDefs.h b/library/include/DataDefs.h index 174156e76..7d840a9ad 100644 --- a/library/include/DataDefs.h +++ b/library/include/DataDefs.h @@ -497,11 +497,25 @@ namespace df using DFHack::DfLinkedList; using DFHack::DfOtherVectors; + template + typename std::enable_if< + std::is_copy_assignable::value + >::type allocator_try_assign(void *out, const void *in) { + *(T*)out = *(const T*)in; + } + + template + typename std::enable_if< + !std::is_copy_assignable::value + >::type allocator_try_assign(void *out, const void *in) { + // assignment is not possible; do nothing + } + #pragma GCC diagnostic push #pragma GCC diagnostic ignored "-Wdelete-non-virtual-dtor" template void *allocator_fn(void *out, const void *in) { - if (out) { *(T*)out = *(const T*)in; return out; } + if (out) { allocator_try_assign(out, in); return out; } else if (in) { delete (T*)in; return (T*)in; } else return new T(); }