Files
pico/projects/Zeta/API/Z/classes/ObjectMemberFunction.hpp
2026-03-24 22:22:37 +00:00

149 lines
4.6 KiB
C++
Vendored

/* Zeta API - Z/classes/ObjectMemberFunction.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_classes_ObjectMemberFunction_HPP
#define Z_classes_ObjectMemberFunction_HPP
#include <Z/inspection/Z.h>
#include <Z/classes/MemberFunction.hpp>
#if Z_HAS(MemberFunction)
# define Z_HAS_ObjectMemberFunction 1
namespace Zeta {
template <class f> struct ObjectMemberFunction;
template <class r, class... p>
struct ObjectMemberFunction<r(p...)> : MemberFunction<r(p...)> {
NaT *object;
Z_INLINE ObjectMemberFunction() Z_NOTHROW
Z_DEFAULTED({})
# if Z_DIALECT_HAS(CPP11, INHERITING_CONSTRUCTORS)
using MemberFunction<r(p...)>::MemberFunction;
# else
template <class m, class e = typename TypeIf<
Type<m>::is_member_function_pointer &&
TypeIsSame<typename Type<m>::flow::to_function::end::to_unqualified, r(p...)>::value
>::type>
Z_INLINE ObjectMemberFunction(m function) Z_NOTHROW
: MemberFunction<r(p...)>(function) {}
# endif
# ifdef Z_NULLPTR
Z_CT(CPP11) ObjectMemberFunction(NullPtr) Z_NOTHROW
: MemberFunction<r(p...)>(nullptr), object(nullptr) {};
# endif
template <class o, class m, class e = typename TypeIf<
(Type<o>::is_void_pointer ||
(Type<o>::is_pointer &&
Type<o>::flow::pointee_type::is_class)) &&
Type<m>::is_member_function_pointer &&
TypeIsSame<typename Type<m>::flow::to_function::end::to_unqualified, r(p...)>::value
>::type>
Z_INLINE ObjectMemberFunction(o object, m function) Z_NOTHROW
: MemberFunction<r(p...)>(function), object(reinterpret_cast<NaT *>(object)) {}
template <class o, class m, class e = typename TypeIf<
Type<o>::is_class &&
Type<m>::is_member_function_pointer &&
TypeIsSame<typename Type<m>::flow::to_function::end::to_unqualified, r(p...)>::value
>::type>
Z_INLINE ObjectMemberFunction(const o &object, m function) Z_NOTHROW
: MemberFunction<r(p...)>(function), object(reinterpret_cast<NaT *>(&object)) {}
template <class o, class e = typename TypeIf<Type<o>::is_class>::type>
Z_INLINE operator o *() const Z_NOTHROW
{return reinterpret_cast<o *>(object);}
template <class o>
Z_INLINE typename TypeIf<Type<o>::is_class, ObjectMemberFunction &>::type
operator =(o *rhs) Z_NOTHROW
{
object = reinterpret_cast<NaT *>(rhs);
return *this;
}
template <class o>
Z_INLINE typename TypeIf<Type<o>::is_class, ObjectMemberFunction &>::type
operator =(const o &rhs) Z_NOTHROW
{
object = reinterpret_cast<NaT *>(&rhs);
return *this;
}
template <class m>
Z_INLINE typename TypeIf<
Type<m>::is_member_function_pointer &&
TypeIsSame<typename Type<m>::flow::to_function::end::to_unqualified, r(p...)>::value,
ObjectMemberFunction &>::type
operator =(m rhs) Z_NOTHROW
{
this->function = reinterpret_cast<r (NaT::*)(p...)>(rhs);
return *this;
}
Z_INLINE r operator ()(typename Type<p>::to_forwardable... arguments) const
{return (object->*this->function)(arguments...);}
template <class o>
Z_INLINE r operator ()(o *object, typename Type<p>::to_forwardable... arguments) const
{return (reinterpret_cast<NaT *>(object)->*this->function)(arguments...);}
template <class o>
Z_INLINE r operator ()(const o &object, typename Type<p>::to_forwardable... arguments) const
{return (reinterpret_cast<NaT *>(&object)->*this->function)(arguments...);}
template <class o, class m>
Z_INLINE typename TypeIf<
(Type<o>::is_void || Type<o>::is_class) &&
Type<m>::is_member_function_pointer &&
TypeIsSame<typename Type<m>::flow::to_function::end::to_unqualified, r(p...)>::value,
ObjectMemberFunction &>::type
set(o *object, m function) Z_NOTHROW
{
this->function = reinterpret_cast<r (NaT::*)(p...)>(function);
this->object = reinterpret_cast<NaT *>(&object);
return *this;
}
template <class o, class m>
Z_INLINE typename TypeIf<
Type<o>::is_class &&
Type<m>::is_member_function_pointer &&
TypeIsSame<typename Type<m>::flow::to_function::end::to_unqualified, r(p...)>::value,
ObjectMemberFunction &>::type
set(const o &object, m function) Z_NOTHROW
{
this->function = reinterpret_cast<r (NaT::*)(p...)>(function);
this->object = const_cast<NaT *>(reinterpret_cast<const NaT *>(&object));
return *this;
}
};
}
#endif
#endif // Z_classes_ObjectMemberFunction_HPP