ALib C++ Framework
by
Library Version: 2605 R0
Documentation generated by doxygen
Loading...
Searching...
No Matches
elvisoperator.cpp
1//! @cond NO_DOX
2namespace alib { namespace expressions { namespace plugins {
3
5: CompilerPlugin("ALib Elvis", compiler, CompilePriorities::ElvisOperator ) {}
6
7namespace {
8
9Box elvis( Scope&, ArgIterator arg, ArgIterator )
10{ return (*arg).Call<FIsTrue>() ? *arg : *(arg + 1); }
11
12} // anonymous namespace
13
14bool ElvisOperator::TryCompilation( CIBinaryOp& ciBinaryOp ) {
15 Box& lhs= * ciBinaryOp.ArgsBegin;
16 Box& rhs= *(ciBinaryOp.ArgsBegin + 1);
17
18 // not Elvis operator A_CHAR("A ?: B") ?
19 if( ciBinaryOp.Operator != A_CHAR("?:") || !lhs.IsSameType(rhs) )
20 return false;
21
22 ALIB_DBG( ciBinaryOp.DbgCallbackName = "elvis"; )
23
24 // constant A?
25 if( ciBinaryOp.LhsIsConst ) {
26 if( lhs.Call<FIsTrue>() )
27 ciBinaryOp.TypeOrValue= lhs;
28 else {
29 // constant B?
30 if( ciBinaryOp.RhsIsConst )
31 ciBinaryOp.TypeOrValue= rhs;
32 else
33 ciBinaryOp.NonConstArgIsResult= true;
34 }
35 return true;
36 }
37
38 // non constant A
39 ciBinaryOp.Callback = elvis;
40 ciBinaryOp.TypeOrValue= rhs;
41
42 return true;
43}
44
45}}} // namespace [alib::expressions::detail]
46//! @endcond
#define A_CHAR(STR)
#define ALIB_DBG(...)
decltype(std::declval< typename TFDecl::Signature >()(std::declval< Box & >(), std::declval< TArgs >()...)) Call(TArgs &&... args) const
Definition box.hpp:964
Definition alox.cpp:14
boxing::Box Box
Type alias in namespace #"%alib".
Definition box.hpp:1128
expressions::Compiler Compiler
Type alias in namespace #"%alib".
Definition compiler.hpp:535
expressions::CompilerPlugin CompilerPlugin
Type alias in namespace #"%alib".