8#ifndef INCLUDED_BSLSTL_FUNCTION_INVOKERUTIL
9#define INCLUDED_BSLSTL_FUNCTION_INVOKERUTIL
152#include <bslscm_version.h>
177#if BSLS_COMPILERFEATURES_SIMULATE_CPP11_FEATURES
183# define COMPILING_BSLSTL_FUNCTION_INVOKERUTIL_H
185# undef COMPILING_BSLSTL_FUNCTION_INVOKERUTIL_H
190#ifndef BSLS_PLATFORM_CMP_SUN
191#define BSLSTL_FUNCTION_INVOKERUTIL_CAST_RESULT(RET, X) static_cast<RET>(X)
193#define BSLSTL_FUNCTION_INVOKERUTIL_CAST_RESULT(RET, X) (RET)(X)
196#if defined(BSLMF_INVOKERESULT_SUPPORT_CPP17_SEMANTICS) \
197 && defined(BSLS_COMPILERFEATURES_SUPPORT_DECLTYPE) \
198 && defined(BSLS_COMPILERFEATURES_SUPPORT_RVALUE_REFERENCES) \
199 && defined(BSLS_LIBRARYFEATURES_HAS_CPP11_BASELINE_LIBRARY)
200#define BSLSTL_FUNCTION_INVOKERUTIL_SUPPORT_IS_FUNC_INVOCABLE
206#ifdef BSLSTL_FUNCTION_INVOKERUTIL_SUPPORT_IS_FUNC_INVOCABLE
209template <
class PROTOTYPE,
class FUNC>
210struct Function_InvokerUtil_IsFuncInvocable;
241#ifdef BSLSTL_FUNCTION_INVOKERUTIL_SUPPORT_IS_FUNC_INVOCABLE
266 template <
class PROTOTYPE,
class FUNC>
267 struct IsFuncInvocable
268 : Function_InvokerUtil_IsFuncInvocable<PROTOTYPE, FUNC> {
278 template <
class PROTOTYPE>
287 template <
class PROTOTYPE,
class FUNC>
323 static bool isNull(
const FUNC&);
334 static bool isNull(FUNC *f);
338template <
class CLASS,
class MEMTYPE>
349#if !BSLS_COMPILERFEATURES_SIMULATE_CPP11_FEATURES
355#ifdef BSLSTL_FUNCTION_INVOKERUTIL_SUPPORT_IS_FUNC_INVOCABLE
358template <
class VOID_TYPE,
class RET,
class FUNC,
class... ARGS>
359struct Function_InvokerUtil_IsFuncInvocableImp;
369template <
class RET,
class FUNC,
class... ARGS>
370struct Function_InvokerUtil_IsFuncInvocable<RET(ARGS...), FUNC>
371: Function_InvokerUtil_IsFuncInvocableImp<void, RET, FUNC, ARGS...> {
380struct Function_InvokerUtil_ForwardType;
383template <
class FROM,
class TO>
384struct Function_InvokerUtil_IsExplicitlyConvertible;
387template <
class FUNC,
class... ARGS>
388struct Function_InvokerUtil_ResultType;
400template <
class VOID_TYPE,
class RET,
class FUNC,
class... ARGS>
421template <
class RET,
class FUNC,
class... ARGS>
422struct Function_InvokerUtil_IsFuncInvocableImp<
423 typename
bslmf::VoidType<
424 typename Function_InvokerUtil_ResultType<FUNC, ARGS...>::type>::type,
429 bsl::is_void<RET>::value,
431 Function_InvokerUtil_IsExplicitlyConvertible<
432 typename Function_InvokerUtil_ResultType<FUNC, ARGS...>::type,
441template <
class VOID_TYPE,
class FUNC,
class... ARGS>
442struct Function_InvokerUtil_ResultTypeImp;
454template <
class FUNC,
class... ARGS>
455struct Function_InvokerUtil_ResultType
456: Function_InvokerUtil_ResultTypeImp<void, FUNC, ARGS...> {
476template <
class VOID_TYPE,
class FUNC,
class... ARGS>
477struct Function_InvokerUtil_ResultTypeImp {
480template <
class FUNC,
class... ARGS>
481struct Function_InvokerUtil_ResultTypeImp<
482 typename
bslmf::VoidType<
483 typename Function_InvokerUtil_ForwardType<ARGS>::Type...>::type,
487 typename bsl::add_lvalue_reference<typename bslalg::NothrowMovableUtil::
488 UnwrappedType<FUNC>::type>::type,
489 typename Function_InvokerUtil_ForwardType<ARGS>::Type...> {
508template <
class VOID_TYPE,
class ARG>
509struct Function_InvokerUtil_ForwardTypeImp;
523struct Function_InvokerUtil_ForwardType
524: Function_InvokerUtil_ForwardTypeImp<void, ARG> {
541template <
class VOID_TYPE,
class ARG>
542struct Function_InvokerUtil_ForwardTypeImp {
555struct Function_InvokerUtil_ForwardTypeImp<
556 typename
bslmf::VoidType<decltype(
557 bslmf::ForwardingTypeUtil<ARG>::forwardToTarget(
558 std::declval<typename bsl::add_lvalue_reference<
559 typename bslmf::ForwardingType<ARG>::Type>::type>()))>::type,
579template <
class VOID_TYPE,
class FROM,
class TO>
580struct Function_InvokerUtil_IsExplicitlyConvertibleImp;
588template <
class FROM,
class TO>
589struct Function_InvokerUtil_IsExplicitlyConvertible
590: Function_InvokerUtil_IsExplicitlyConvertibleImp<void, FROM, TO> {
597template <
class FROM_TO>
598struct Function_InvokerUtil_IsExplicitlyConvertible<FROM_TO, FROM_TO>
612template <
class VOID_TYPE,
class FROM,
class TO>
613struct Function_InvokerUtil_IsExplicitlyConvertibleImp :
bsl::false_type {
621template <
class FROM,
class TO>
622struct Function_InvokerUtil_IsExplicitlyConvertibleImp<
623 typename
bslmf::VoidType<decltype(
624 static_cast<TO>(std::declval<FROM>()))>::type,
645template <
int INVOCATION_TYPE,
class PROTOTYPE,
class FUNC>
648#if !BSLS_COMPILERFEATURES_SIMULATE_CPP11_FEATURES
653template <
class FUNC,
class RET,
class... ARGS>
655 RET(ARGS...), FUNC> {
666template <
class FUNC,
class RET,
class ARG0,
class... ARGS>
668 RET(ARG0, ARGS...), FUNC> {
703template <
class MEMBER_TYPE,
class CLASS_TYPE,
class RET,
class ARG0>
705 RET(ARG0), MEMBER_TYPE CLASS_TYPE::*> {
708 typedef MEMBER_TYPE CLASS_TYPE::* Func;
735template <
class FUNC,
class RET,
class... ARGS>
737 RET(ARGS...), FUNC> {
749template <
class FUNC,
class RET,
class... ARGS>
751 RET(ARGS...), FUNC> {
771template <
class PROTOTYPE>
779template <
class PROTOTYPE,
class FUNC>
793 static const int k_INVOCATION_TYPE =
797 Soo::IsInplaceFunc<FUNC>::value ? e_InplaceFunctor :
806 UwFuncType> DispatcherClass;
820 &DispatcherClass::invoke);
843template <
class CLASS,
class MEMTYPE>
856#if !BSLS_COMPILERFEATURES_SIMULATE_CPP11_FEATURES
858template <
class FUNC,
class RET,
class... ARGS>
861 RET(ARGS...), FUNC>::
878template <
class FUNC,
class RET,
class ARG0,
class... ARGS>
882 RET(ARG0, ARGS...), FUNC>::
895 RET, (
const_cast<Arg0Ref
>(obj).*f)(
899template <
class FUNC,
class RET,
class ARG0,
class... ARGS>
903 RET(ARG0, ARGS...), FUNC>::
916 RET, ((*
const_cast<Arg0Ref
>(obj)).*f)(
920template <
class FUNC,
class RET,
class ARG0,
class... ARGS>
923 RET(ARG0, ARGS...), FUNC>::
941 invokeImp(IsDirect(), f, obj,
945template <
class MEMBER_TYPE,
class CLASS_TYPE,
class RET,
class ARG0>
949 RET(ARG0), MEMBER_TYPE CLASS_TYPE::*>::
961 RET, (
const_cast<Arg0Ref
>(obj).*f));
964template <
class MEMBER_TYPE,
class CLASS_TYPE,
class RET,
class ARG0>
968 RET(ARG0), MEMBER_TYPE CLASS_TYPE::*>::
980 RET, ((*
const_cast<Arg0Ref
>(obj)).*f));
983template <
class MEMBER_TYPE,
class CLASS_TYPE,
class RET,
class ARG0>
986 RET(ARG0), MEMBER_TYPE CLASS_TYPE::*>::
987invoke(
const Function_Rep *rep,
998 const volatile CLASS_TYPE *
1001 Func f = *rep->targetRaw<Func,
true>();
1004 RET, invokeImp(IsDirect(), f, obj));
1007template <
class FUNC,
class RET,
class... ARGS>
1010 RET(ARGS...), FUNC>::
1014 FUNC& f = *rep->
targetRaw<FUNC,
true>();
1023template <
class FUNC,
class RET,
class... ARGS>
1026 RET(ARGS...), FUNC>::
1030 FUNC& f = *rep->
targetRaw<FUNC,
false>();
Definition bslmf_invokeresult.h:362
Provide a namespace for the forwardToTarget function.
Definition bslmf_forwardingtype.h:456
Imp::Type Type
Definition bslmf_forwardingtype.h:441
Definition bslstl_function_rep.h:132
void GenericInvoker()
Definition bslstl_function_rep.h:375
Definition bslstl_function_smallobjectoptimization.h:78
#define BSLA_NORETURN
Definition bsla_noreturn.h:169
#define BSLMF_ASSERT(expr)
Definition bslmf_assert.h:231
#define BSLS_IDENT(str)
BSLS_IDENT() - insert string into .comment binary segment (if supported)
Definition bsls_ident.h:238
#define BSLSTL_FUNCTION_INVOKERUTIL_CAST_RESULT(RET, X)
Definition bslstl_function_invokerutil.h:191
TP * targetRaw() const BSLS_KEYWORD_NOEXCEPT
Definition bslstl_function_rep.h:740
BloombergLP::bsls::Nullptr_Impl::Type nullptr_t
Definition bsls_nullptr.h:283
Definition bdlbb_blob.h:579
Definition bslstl_algorithm.h:84
Definition bslmf_addlvaluereference.h:128
Definition bslmf_conditional.h:123
Definition bslmf_integralconstant.h:261
Definition bslmf_isconvertible.h:875
Definition bslmf_ismemberpointer.h:143
NothrowMovableUtil_Traits< TYPE >::UnwrappedType type
Definition bslalg_nothrowmovableutil.h:376
static UnwrappedType< TYPE >::type & unwrap(TYPE &f)
Definition bslmf_functionpointertraits.h:163
Definition bslmf_memberfunctionpointertraits.h:164
Definition bslmf_memberfunctionpointertraits.h:150
t_TYPE type
Definition bslmf_movableref.h:1188
static bool isNull(MEMTYPE CLASS::*f)
Definition bslstl_function_invokerutil.h:318
static bool isNull(const FUNC &)
Return false.
Definition bslstl_function_invokerutil.h:831
static RET invoke(const Function_Rep *rep, typename bslmf::ForwardingType< ARG0 >::Type obj)
Definition bslstl_function_invokerutil.h:646
Definition bslstl_function_invokerutil.h:223
static GenericInvoker * invokerForFunc(const bsl::nullptr_t &)
Function_Rep::GenericInvoker GenericInvoker
Definition bslstl_function_invokerutil.h:239
@ e_Null
Definition bslstl_function_invokerutil.h:229
@ e_MemDataPtr
Definition bslstl_function_invokerutil.h:232
@ e_FunctionPtr
Definition bslstl_function_invokerutil.h:230
@ e_InplaceFunctor
Definition bslstl_function_invokerutil.h:233
@ e_OutofplaceFunctor
Definition bslstl_function_invokerutil.h:234
@ e_MemFunctionPtr
Definition bslstl_function_invokerutil.h:231
static GenericInvoker * invokerForFunc(const FUNC &f)
static BSLA_NORETURN void throwBadFunctionCall()