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"
19 module ALib.Expressions.Impl;
20 import ALib.Characters.Functions;
36Box elvis( Scope&, ArgIterator arg, ArgIterator )
37{
return (*arg).
Call<FIsTrue>() ? *arg : *(arg + 1); }
41bool ElvisOperator::TryCompilation( CIBinaryOp& ciBinaryOp ) {
42 Box& lhs= * ciBinaryOp.ArgsBegin;
43 Box& rhs= *(ciBinaryOp.ArgsBegin + 1);
46 if( ciBinaryOp.Operator !=
A_CHAR(
"?:") || !lhs.IsSameType(rhs) )
49 ALIB_DBG( ciBinaryOp.DbgCallbackName =
"elvis"; )
52 if( ciBinaryOp.LhsIsConst ) {
53 if( lhs.Call<FIsTrue>() )
54 ciBinaryOp.TypeOrValue= lhs;
57 if( ciBinaryOp.RhsIsConst )
58 ciBinaryOp.TypeOrValue= rhs;
60 ciBinaryOp.NonConstArgIsResult= true;
66 ciBinaryOp.Callback = elvis;
67 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)