/* Zeta API - Z/functions/class.hpp ______ ______________ ___ |__ / | ___|___ ___|/ \ / /__| __| | | / - \ /______|_____| |__| /__/ \__\ Copyright (C) 2006-2024 Manuel Sainz de Baranda y Goñi. Released under the terms of the GNU Lesser General Public License v3. */ #ifndef Z_functions_class_HPP #define Z_functions_class_HPP #include #include #include #include namespace Zeta { template static Z_INLINE USize member_offset(t c::*member) Z_NOTHROW { return (&reinterpret_cast(reinterpret_cast(sizeof(c))->*member) - reinterpret_cast(sizeof(c))); } typedef void *(* DefaultInstantiator)(); typedef void (* DefaultConstructor )(void *object); typedef void (* Deleter )(void *object); typedef void (* Destructor )(void *object); # if Z_DIALECT_HAS(CPP11, LAMBDA) template static Z_CT(CPP11) typename TypeIf< Type::is_class && Type::is_default_constructible, DefaultConstructor >::type default_constructor() Z_NOTHROW {return [](void *object) -> void {new (object) t;};} template static Z_CT(CPP11) typename TypeIf< !Type::is_class || !Type::is_default_constructible, DefaultConstructor >::type default_constructor() Z_NOTHROW {return Z_NULL;} template static Z_CT(CPP11) typename TypeIf< Type::is_class && Type::is_default_constructible, DefaultInstantiator >::type default_instantiator() Z_NOTHROW {return []() -> void* {return new t();};} template static Z_CT(CPP11) typename TypeIf< !Type::is_class || !Type::is_default_constructible, DefaultInstantiator >::type default_instantiator() Z_NOTHROW {return Z_NULL;} template static Z_CT(CPP11) Destructor destructor() Z_NOTHROW {return [](void *object) -> void {reinterpret_cast(object)->~t();};} template static Z_CT(CPP11) Deleter deleter() Z_NOTHROW {return [](void *object) -> void {delete reinterpret_cast(object);};} # endif } #endif // Z_functions_class_HPP