8#if !defined(ALIB_C20_MODULES) || ((ALIB_C20_MODULES != 0) && (ALIB_C20_MODULES != 1))
9# error "Symbol ALIB_C20_MODULES has to be given to the compiler as either 0 or 1"
37Box elvis( Scope&, ArgIterator arg, ArgIterator )
39 return (*arg).
Call<FIsTrue>() ? *arg : *(arg + 1);
44bool ElvisOperator::TryCompilation( CIBinaryOp& ciBinaryOp )
46 Box& lhs= * ciBinaryOp.ArgsBegin;
47 Box& rhs= *(ciBinaryOp.ArgsBegin + 1);
50 if( ciBinaryOp.Operator !=
A_CHAR(
"?:") || !lhs.IsSameType(rhs) )
53 ALIB_DBG( ciBinaryOp.DbgCallbackName =
"elvis"; )
56 if( ciBinaryOp.LhsIsConst )
58 if( lhs.Call<FIsTrue>() )
59 ciBinaryOp.TypeOrValue= lhs;
63 if( ciBinaryOp.RhsIsConst )
64 ciBinaryOp.TypeOrValue= rhs;
66 ciBinaryOp.NonConstArgIsResult= true;
72 ciBinaryOp.Callback = elvis;
73 ciBinaryOp.TypeOrValue= rhs;
decltype(std::declval< typename TFDecl::Signature >()(std::declval< Box & >(), std::declval< TArgs >()...)) Call(TArgs &&... args) const
expressions::CompilerPlugin CompilerPlugin
Type alias in namespace alib.
boxing::Box Box
Type alias in namespace alib.
expressions::Compiler Compiler
Type alias in namespace alib.
ALIB_DLL ElvisOperator(Compiler &compiler)