diff --git a/library/DataStaticsFields.cpp b/library/DataStaticsFields.cpp index 8318b523d..ac2b415eb 100644 --- a/library/DataStaticsFields.cpp +++ b/library/DataStaticsFields.cpp @@ -17,6 +17,9 @@ namespace df { category##_identity identity_traits::identity(name); #define INTEGER_IDENTITY_TRAITS(type, name) NUMBER_IDENTITY_TRAITS(integer, type, name) #define FLOAT_IDENTITY_TRAITS(type) NUMBER_IDENTITY_TRAITS(float, type, #type) +#define OPAQUE_IDENTITY_TRAITS_NAME(type, name) \ + opaque_identity identity_traits::identity(sizeof(type), allocator_noassign_fn, name) +#define STL_OPAQUE_IDENTITY_TRAITS(type) OPAQUE_IDENTITY_TRAITS_NAME(std::type, #type) #ifndef STATIC_FIELDS_GROUP INTEGER_IDENTITY_TRAITS(char, "char"); @@ -42,13 +45,8 @@ namespace df { stl_bit_vector_identity identity_traits >::identity; bit_array_identity identity_traits >::identity; - static void *fstream_allocator_fn(void *out, const void *in) { - if (out) { /* *(T*)out = *(const T*)in;*/ return NULL; } - else if (in) { delete (std::fstream*)in; return (std::fstream*)in; } - else return new std::fstream(); - } - opaque_identity identity_traits::identity( - sizeof(std::fstream), fstream_allocator_fn, "fstream"); + STL_OPAQUE_IDENTITY_TRAITS(fstream); + STL_OPAQUE_IDENTITY_TRAITS(mutex); buffer_container_identity buffer_container_identity::base_instance; #endif diff --git a/library/include/DataDefs.h b/library/include/DataDefs.h index 7d840a9ad..0109f0fd0 100644 --- a/library/include/DataDefs.h +++ b/library/include/DataDefs.h @@ -528,6 +528,13 @@ namespace df else return new T(); } + template + void *allocator_noassign_fn(void *out, const void *in) { + if (out) { return NULL; } + else if (in) { delete (T*)in; return (T*)in; } + else return new T(); + } + template struct identity_traits { static compound_identity *get() { return &T::_identity; }