#pragma once namespace pfc { class traits_default { public: enum { realloc_safe = false, needs_destructor = true, needs_constructor = true, constructor_may_fail = true }; }; class traits_default_movable { public: enum { realloc_safe = true, needs_destructor = true, needs_constructor = true, constructor_may_fail = true }; }; class traits_rawobject : public traits_default { public: enum { realloc_safe = true, needs_destructor = false, needs_constructor = false, constructor_may_fail = false }; }; class traits_vtable { public: enum { realloc_safe = true, needs_destructor = true, needs_constructor = true, constructor_may_fail = false }; }; template class traits_t : public traits_default {}; template class combine_traits { public: enum { realloc_safe = (traits1::realloc_safe && traits2::realloc_safe), needs_destructor = (traits1::needs_destructor || traits2::needs_destructor), needs_constructor = (traits1::needs_constructor || traits2::needs_constructor), constructor_may_fail = (traits1::constructor_may_fail || traits2::constructor_may_fail), }; }; template class traits_combined : public combine_traits,traits_t > {}; template class traits_t : public traits_rawobject {}; template<> class traits_t : public traits_rawobject {}; template<> class traits_t : public traits_rawobject {}; template<> class traits_t : public traits_rawobject {}; template<> class traits_t : public traits_rawobject {}; template<> class traits_t : public traits_rawobject {}; template<> class traits_t : public traits_rawobject {}; template<> class traits_t : public traits_rawobject {}; template<> class traits_t : public traits_rawobject {}; template<> class traits_t : public traits_rawobject {}; template<> class traits_t : public traits_rawobject {}; template<> class traits_t : public traits_rawobject {}; template<> class traits_t : public traits_rawobject {}; template<> class traits_t : public traits_rawobject {}; template<> class traits_t : public traits_rawobject {}; template<> class traits_t : public traits_rawobject {}; template<> class traits_t : public traits_rawobject {}; template class traits_t : public traits_t {}; }