exprtk_test.cpp 415 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879808182838485868788899091929394959697989910010110210310410510610710810911011111211311411511611711811912012112212312412512612712812913013113213313413513613713813914014114214314414514614714814915015115215315415515615715815916016116216316416516616716816917017117217317417517617717817918018118218318418518618718818919019119219319419519619719819920020120220320420520620720820921021121221321421521621721821922022122222322422522622722822923023123223323423523623723823924024124224324424524624724824925025125225325425525625725825926026126226326426526626726826927027127227327427527627727827928028128228328428528628728828929029129229329429529629729829930030130230330430530630730830931031131231331431531631731831932032132232332432532632732832933033133233333433533633733833934034134234334434534634734834935035135235335435535635735835936036136236336436536636736836937037137237337437537637737837938038138238338438538638738838939039139239339439539639739839940040140240340440540640740840941041141241341441541641741841942042142242342442542642742842943043143243343443543643743843944044144244344444544644744844945045145245345445545645745845946046146246346446546646746846947047147247347447547647747847948048148248348448548648748848949049149249349449549649749849950050150250350450550650750850951051151251351451551651751851952052152252352452552652752852953053153253353453553653753853954054154254354454554654754854955055155255355455555655755855956056156256356456556656756856957057157257357457557657757857958058158258358458558658758858959059159259359459559659759859960060160260360460560660760860961061161261361461561661761861962062162262362462562662762862963063163263363463563663763863964064164264364464564664764864965065165265365465565665765865966066166266366466566666766866967067167267367467567667767867968068168268368468568668768868969069169269369469569669769869970070170270370470570670770870971071171271371471571671771871972072172272372472572672772872973073173273373473573673773873974074174274374474574674774874975075175275375475575675775875976076176276376476576676776876977077177277377477577677777877978078178278378478578678778878979079179279379479579679779879980080180280380480580680780880981081181281381481581681781881982082182282382482582682782882983083183283383483583683783883984084184284384484584684784884985085185285385485585685785885986086186286386486586686786886987087187287387487587687787887988088188288388488588688788888989089189289389489589689789889990090190290390490590690790890991091191291391491591691791891992092192292392492592692792892993093193293393493593693793893994094194294394494594694794894995095195295395495595695795895996096196296396496596696796896997097197297397497597697797897998098198298398498598698798898999099199299399499599699799899910001001100210031004100510061007100810091010101110121013101410151016101710181019102010211022102310241025102610271028102910301031103210331034103510361037103810391040104110421043104410451046104710481049105010511052105310541055105610571058105910601061106210631064106510661067106810691070107110721073107410751076107710781079108010811082108310841085108610871088108910901091109210931094109510961097109810991100110111021103110411051106110711081109111011111112111311141115111611171118111911201121112211231124112511261127112811291130113111321133113411351136113711381139114011411142114311441145114611471148114911501151115211531154115511561157115811591160116111621163116411651166116711681169117011711172117311741175117611771178117911801181118211831184118511861187118811891190119111921193119411951196119711981199120012011202120312041205120612071208120912101211121212131214121512161217121812191220122112221223122412251226122712281229123012311232123312341235123612371238123912401241124212431244124512461247124812491250125112521253125412551256125712581259126012611262126312641265126612671268126912701271127212731274127512761277127812791280128112821283128412851286128712881289129012911292129312941295129612971298129913001301130213031304130513061307130813091310131113121313131413151316131713181319132013211322132313241325132613271328132913301331133213331334133513361337133813391340134113421343134413451346134713481349135013511352135313541355135613571358135913601361136213631364136513661367136813691370137113721373137413751376137713781379138013811382138313841385138613871388138913901391139213931394139513961397139813991400140114021403140414051406140714081409141014111412141314141415141614171418141914201421142214231424142514261427142814291430143114321433143414351436143714381439144014411442144314441445144614471448144914501451145214531454145514561457145814591460146114621463146414651466146714681469147014711472147314741475147614771478147914801481148214831484148514861487148814891490149114921493149414951496149714981499150015011502150315041505150615071508150915101511151215131514151515161517151815191520152115221523152415251526152715281529153015311532153315341535153615371538153915401541154215431544154515461547154815491550155115521553155415551556155715581559156015611562156315641565156615671568156915701571157215731574157515761577157815791580158115821583158415851586158715881589159015911592159315941595159615971598159916001601160216031604160516061607160816091610161116121613161416151616161716181619162016211622162316241625162616271628162916301631163216331634163516361637163816391640164116421643164416451646164716481649165016511652165316541655165616571658165916601661166216631664166516661667166816691670167116721673167416751676167716781679168016811682168316841685168616871688168916901691169216931694169516961697169816991700170117021703170417051706170717081709171017111712171317141715171617171718171917201721172217231724172517261727172817291730173117321733173417351736173717381739174017411742174317441745174617471748174917501751175217531754175517561757175817591760176117621763176417651766176717681769177017711772177317741775177617771778177917801781178217831784178517861787178817891790179117921793179417951796179717981799180018011802180318041805180618071808180918101811181218131814181518161817181818191820182118221823182418251826182718281829183018311832183318341835183618371838183918401841184218431844184518461847184818491850185118521853185418551856185718581859186018611862186318641865186618671868186918701871187218731874187518761877187818791880188118821883188418851886188718881889189018911892189318941895189618971898189919001901190219031904190519061907190819091910191119121913191419151916191719181919192019211922192319241925192619271928192919301931193219331934193519361937193819391940194119421943194419451946194719481949195019511952195319541955195619571958195919601961196219631964196519661967196819691970197119721973197419751976197719781979198019811982198319841985198619871988198919901991199219931994199519961997199819992000200120022003200420052006200720082009201020112012201320142015201620172018201920202021202220232024202520262027202820292030203120322033203420352036203720382039204020412042204320442045204620472048204920502051205220532054205520562057205820592060206120622063206420652066206720682069207020712072207320742075207620772078207920802081208220832084208520862087208820892090209120922093209420952096209720982099210021012102210321042105210621072108210921102111211221132114211521162117211821192120212121222123212421252126212721282129213021312132213321342135213621372138213921402141214221432144214521462147214821492150215121522153215421552156215721582159216021612162216321642165216621672168216921702171217221732174217521762177217821792180218121822183218421852186218721882189219021912192219321942195219621972198219922002201220222032204220522062207220822092210221122122213221422152216221722182219222022212222222322242225222622272228222922302231223222332234223522362237223822392240224122422243224422452246224722482249225022512252225322542255225622572258225922602261226222632264226522662267226822692270227122722273227422752276227722782279228022812282228322842285228622872288228922902291229222932294229522962297229822992300230123022303230423052306230723082309231023112312231323142315231623172318231923202321232223232324232523262327232823292330233123322333233423352336233723382339234023412342234323442345234623472348234923502351235223532354235523562357235823592360236123622363236423652366236723682369237023712372237323742375237623772378237923802381238223832384238523862387238823892390239123922393239423952396239723982399240024012402240324042405240624072408240924102411241224132414241524162417241824192420242124222423242424252426242724282429243024312432243324342435243624372438243924402441244224432444244524462447244824492450245124522453245424552456245724582459246024612462246324642465246624672468246924702471247224732474247524762477247824792480248124822483248424852486248724882489249024912492249324942495249624972498249925002501250225032504250525062507250825092510251125122513251425152516251725182519252025212522252325242525252625272528252925302531253225332534253525362537253825392540254125422543254425452546254725482549255025512552255325542555255625572558255925602561256225632564256525662567256825692570257125722573257425752576257725782579258025812582258325842585258625872588258925902591259225932594259525962597259825992600260126022603260426052606260726082609261026112612261326142615261626172618261926202621262226232624262526262627262826292630263126322633263426352636263726382639264026412642264326442645264626472648264926502651265226532654265526562657265826592660266126622663266426652666266726682669267026712672267326742675267626772678267926802681268226832684268526862687268826892690269126922693269426952696269726982699270027012702270327042705270627072708270927102711271227132714271527162717271827192720272127222723272427252726272727282729273027312732273327342735273627372738273927402741274227432744274527462747274827492750275127522753275427552756275727582759276027612762276327642765276627672768276927702771277227732774277527762777277827792780278127822783278427852786278727882789279027912792279327942795279627972798279928002801280228032804280528062807280828092810281128122813281428152816281728182819282028212822282328242825282628272828282928302831283228332834283528362837283828392840284128422843284428452846284728482849285028512852285328542855285628572858285928602861286228632864286528662867286828692870287128722873287428752876287728782879288028812882288328842885288628872888288928902891289228932894289528962897289828992900290129022903290429052906290729082909291029112912291329142915291629172918291929202921292229232924292529262927292829292930293129322933293429352936293729382939294029412942294329442945294629472948294929502951295229532954295529562957295829592960296129622963296429652966296729682969297029712972297329742975297629772978297929802981298229832984298529862987298829892990299129922993299429952996299729982999300030013002300330043005300630073008300930103011301230133014301530163017301830193020302130223023302430253026302730283029303030313032303330343035303630373038303930403041304230433044304530463047304830493050305130523053305430553056305730583059306030613062306330643065306630673068306930703071307230733074307530763077307830793080308130823083308430853086308730883089309030913092309330943095309630973098309931003101310231033104310531063107310831093110311131123113311431153116311731183119312031213122312331243125312631273128312931303131313231333134313531363137313831393140314131423143314431453146314731483149315031513152315331543155315631573158315931603161316231633164316531663167316831693170317131723173317431753176317731783179318031813182318331843185318631873188318931903191319231933194319531963197319831993200320132023203320432053206320732083209321032113212321332143215321632173218321932203221322232233224322532263227322832293230323132323233323432353236323732383239324032413242324332443245324632473248324932503251325232533254325532563257325832593260326132623263326432653266326732683269327032713272327332743275327632773278327932803281328232833284328532863287328832893290329132923293329432953296329732983299330033013302330333043305330633073308330933103311331233133314331533163317331833193320332133223323332433253326332733283329333033313332333333343335333633373338333933403341334233433344334533463347334833493350335133523353335433553356335733583359336033613362336333643365336633673368336933703371337233733374337533763377337833793380338133823383338433853386338733883389339033913392339333943395339633973398339934003401340234033404340534063407340834093410341134123413341434153416341734183419342034213422342334243425342634273428342934303431343234333434343534363437343834393440344134423443344434453446344734483449345034513452345334543455345634573458345934603461346234633464346534663467346834693470347134723473347434753476347734783479348034813482348334843485348634873488348934903491349234933494349534963497349834993500350135023503350435053506350735083509351035113512351335143515351635173518351935203521352235233524352535263527352835293530353135323533353435353536353735383539354035413542354335443545354635473548354935503551355235533554355535563557355835593560356135623563356435653566356735683569357035713572357335743575357635773578357935803581358235833584358535863587358835893590359135923593359435953596359735983599360036013602360336043605360636073608360936103611361236133614361536163617361836193620362136223623362436253626362736283629363036313632363336343635363636373638363936403641364236433644364536463647364836493650365136523653365436553656365736583659366036613662366336643665366636673668366936703671367236733674367536763677367836793680368136823683368436853686368736883689369036913692369336943695369636973698369937003701370237033704370537063707370837093710371137123713371437153716371737183719372037213722372337243725372637273728372937303731373237333734373537363737373837393740374137423743374437453746374737483749375037513752375337543755375637573758375937603761376237633764376537663767376837693770377137723773377437753776377737783779378037813782378337843785378637873788378937903791379237933794379537963797379837993800380138023803380438053806380738083809381038113812381338143815381638173818381938203821382238233824382538263827382838293830383138323833383438353836383738383839384038413842384338443845384638473848384938503851385238533854385538563857385838593860386138623863386438653866386738683869387038713872387338743875387638773878387938803881388238833884388538863887388838893890389138923893389438953896389738983899390039013902390339043905390639073908390939103911391239133914391539163917391839193920392139223923392439253926392739283929393039313932393339343935393639373938393939403941394239433944394539463947394839493950395139523953395439553956395739583959396039613962396339643965396639673968396939703971397239733974397539763977397839793980398139823983398439853986398739883989399039913992399339943995399639973998399940004001400240034004400540064007400840094010401140124013401440154016401740184019402040214022402340244025402640274028402940304031403240334034403540364037403840394040404140424043404440454046404740484049405040514052405340544055405640574058405940604061406240634064406540664067406840694070407140724073407440754076407740784079408040814082408340844085408640874088408940904091409240934094409540964097409840994100410141024103410441054106410741084109411041114112411341144115411641174118411941204121412241234124412541264127412841294130413141324133413441354136413741384139414041414142414341444145414641474148414941504151415241534154415541564157415841594160416141624163416441654166416741684169417041714172417341744175417641774178417941804181418241834184418541864187418841894190419141924193419441954196419741984199420042014202420342044205420642074208420942104211421242134214421542164217421842194220422142224223422442254226422742284229423042314232423342344235423642374238423942404241424242434244424542464247424842494250425142524253425442554256425742584259426042614262426342644265426642674268426942704271427242734274427542764277427842794280428142824283428442854286428742884289429042914292429342944295429642974298429943004301430243034304430543064307430843094310431143124313431443154316431743184319432043214322432343244325432643274328432943304331433243334334433543364337433843394340434143424343434443454346434743484349435043514352435343544355435643574358435943604361436243634364436543664367436843694370437143724373437443754376437743784379438043814382438343844385438643874388438943904391439243934394439543964397439843994400440144024403440444054406440744084409441044114412441344144415441644174418441944204421442244234424442544264427442844294430443144324433443444354436443744384439444044414442444344444445444644474448444944504451445244534454445544564457445844594460446144624463446444654466446744684469447044714472447344744475447644774478447944804481448244834484448544864487448844894490449144924493449444954496449744984499450045014502450345044505450645074508450945104511451245134514451545164517451845194520452145224523452445254526452745284529453045314532453345344535453645374538453945404541454245434544454545464547454845494550455145524553455445554556455745584559456045614562456345644565456645674568456945704571457245734574457545764577457845794580458145824583458445854586458745884589459045914592459345944595459645974598459946004601460246034604460546064607460846094610461146124613461446154616461746184619462046214622462346244625462646274628462946304631463246334634463546364637463846394640464146424643464446454646464746484649465046514652465346544655465646574658465946604661466246634664466546664667466846694670467146724673467446754676467746784679468046814682468346844685468646874688468946904691469246934694469546964697469846994700470147024703470447054706470747084709471047114712471347144715471647174718471947204721472247234724472547264727472847294730473147324733473447354736473747384739474047414742474347444745474647474748474947504751475247534754475547564757475847594760476147624763476447654766476747684769477047714772477347744775477647774778477947804781478247834784478547864787478847894790479147924793479447954796479747984799480048014802480348044805480648074808480948104811481248134814481548164817481848194820482148224823482448254826482748284829483048314832483348344835483648374838483948404841484248434844484548464847484848494850485148524853485448554856485748584859486048614862486348644865486648674868486948704871487248734874487548764877487848794880488148824883488448854886488748884889489048914892489348944895489648974898489949004901490249034904490549064907490849094910491149124913491449154916491749184919492049214922492349244925492649274928492949304931493249334934493549364937493849394940494149424943494449454946494749484949495049514952495349544955495649574958495949604961496249634964496549664967496849694970497149724973497449754976497749784979498049814982498349844985498649874988498949904991499249934994499549964997499849995000500150025003500450055006500750085009501050115012501350145015501650175018501950205021502250235024502550265027502850295030503150325033503450355036503750385039504050415042504350445045504650475048504950505051505250535054505550565057505850595060506150625063506450655066506750685069507050715072507350745075507650775078507950805081508250835084508550865087508850895090509150925093509450955096509750985099510051015102510351045105510651075108510951105111511251135114511551165117511851195120512151225123512451255126512751285129513051315132513351345135513651375138513951405141514251435144514551465147514851495150515151525153515451555156515751585159516051615162516351645165516651675168516951705171517251735174517551765177517851795180518151825183518451855186518751885189519051915192519351945195519651975198519952005201520252035204520552065207520852095210521152125213521452155216521752185219522052215222522352245225522652275228522952305231523252335234523552365237523852395240524152425243524452455246524752485249525052515252525352545255525652575258525952605261526252635264526552665267526852695270527152725273527452755276527752785279528052815282528352845285528652875288528952905291529252935294529552965297529852995300530153025303530453055306530753085309531053115312531353145315531653175318531953205321532253235324532553265327532853295330533153325333533453355336533753385339534053415342534353445345534653475348534953505351535253535354535553565357535853595360536153625363536453655366536753685369537053715372537353745375537653775378537953805381538253835384538553865387538853895390539153925393539453955396539753985399540054015402540354045405540654075408540954105411541254135414541554165417541854195420542154225423542454255426542754285429543054315432543354345435543654375438543954405441544254435444544554465447544854495450545154525453545454555456545754585459546054615462546354645465546654675468546954705471547254735474547554765477547854795480548154825483548454855486548754885489549054915492549354945495549654975498549955005501550255035504550555065507550855095510551155125513551455155516551755185519552055215522552355245525552655275528552955305531553255335534553555365537553855395540554155425543554455455546554755485549555055515552555355545555555655575558555955605561556255635564556555665567556855695570557155725573557455755576557755785579558055815582558355845585558655875588558955905591559255935594559555965597559855995600560156025603560456055606560756085609561056115612561356145615561656175618561956205621562256235624562556265627562856295630563156325633563456355636563756385639564056415642564356445645564656475648564956505651565256535654565556565657565856595660566156625663566456655666566756685669567056715672567356745675567656775678567956805681568256835684568556865687568856895690569156925693569456955696569756985699570057015702570357045705570657075708570957105711571257135714571557165717571857195720572157225723572457255726572757285729573057315732573357345735573657375738573957405741574257435744574557465747574857495750575157525753575457555756575757585759576057615762576357645765576657675768576957705771577257735774577557765777577857795780578157825783578457855786578757885789579057915792579357945795579657975798579958005801580258035804580558065807580858095810581158125813581458155816581758185819582058215822582358245825582658275828582958305831583258335834583558365837583858395840584158425843584458455846584758485849585058515852585358545855585658575858585958605861586258635864586558665867586858695870587158725873587458755876587758785879588058815882588358845885588658875888588958905891589258935894589558965897589858995900590159025903590459055906590759085909591059115912591359145915591659175918591959205921592259235924592559265927592859295930593159325933593459355936593759385939594059415942594359445945594659475948594959505951595259535954595559565957595859595960596159625963596459655966596759685969597059715972597359745975597659775978597959805981598259835984598559865987598859895990599159925993599459955996599759985999600060016002600360046005600660076008600960106011601260136014601560166017601860196020602160226023602460256026602760286029603060316032603360346035603660376038603960406041604260436044604560466047604860496050605160526053605460556056605760586059606060616062606360646065606660676068606960706071607260736074607560766077607860796080608160826083608460856086608760886089609060916092609360946095609660976098609961006101610261036104610561066107610861096110611161126113611461156116611761186119612061216122612361246125612661276128612961306131613261336134613561366137613861396140614161426143614461456146614761486149615061516152615361546155615661576158615961606161616261636164616561666167616861696170617161726173617461756176617761786179618061816182618361846185618661876188618961906191619261936194619561966197619861996200620162026203620462056206620762086209621062116212621362146215621662176218621962206221622262236224622562266227622862296230623162326233623462356236623762386239624062416242624362446245624662476248624962506251625262536254625562566257625862596260626162626263626462656266626762686269627062716272627362746275627662776278627962806281628262836284628562866287628862896290629162926293629462956296629762986299630063016302630363046305630663076308630963106311631263136314631563166317631863196320632163226323632463256326632763286329633063316332633363346335633663376338633963406341634263436344634563466347634863496350635163526353635463556356635763586359636063616362636363646365636663676368636963706371637263736374637563766377637863796380638163826383638463856386638763886389639063916392639363946395639663976398639964006401640264036404640564066407640864096410641164126413641464156416641764186419642064216422642364246425642664276428642964306431643264336434643564366437643864396440644164426443644464456446644764486449645064516452645364546455645664576458645964606461646264636464646564666467646864696470647164726473647464756476647764786479648064816482648364846485648664876488648964906491649264936494649564966497649864996500650165026503650465056506650765086509651065116512651365146515651665176518651965206521652265236524652565266527652865296530653165326533653465356536653765386539654065416542654365446545654665476548654965506551655265536554655565566557655865596560656165626563656465656566656765686569657065716572657365746575657665776578657965806581658265836584658565866587658865896590659165926593659465956596659765986599660066016602660366046605660666076608660966106611661266136614661566166617661866196620662166226623662466256626662766286629663066316632663366346635663666376638663966406641664266436644664566466647664866496650665166526653665466556656665766586659666066616662666366646665666666676668666966706671667266736674667566766677667866796680668166826683668466856686668766886689669066916692669366946695669666976698669967006701670267036704670567066707670867096710671167126713671467156716671767186719672067216722672367246725672667276728672967306731673267336734673567366737673867396740674167426743674467456746674767486749675067516752675367546755675667576758675967606761676267636764676567666767676867696770677167726773677467756776677767786779678067816782678367846785678667876788678967906791679267936794679567966797679867996800680168026803680468056806680768086809681068116812681368146815681668176818681968206821682268236824682568266827682868296830683168326833683468356836683768386839684068416842684368446845684668476848684968506851685268536854685568566857685868596860686168626863686468656866686768686869687068716872687368746875687668776878687968806881688268836884688568866887688868896890689168926893689468956896689768986899690069016902690369046905690669076908690969106911691269136914691569166917691869196920692169226923692469256926692769286929693069316932693369346935693669376938693969406941694269436944694569466947694869496950695169526953695469556956695769586959696069616962696369646965696669676968696969706971697269736974697569766977697869796980698169826983698469856986698769886989699069916992699369946995699669976998699970007001700270037004700570067007700870097010701170127013701470157016701770187019702070217022702370247025702670277028702970307031703270337034703570367037703870397040704170427043704470457046704770487049705070517052705370547055705670577058705970607061706270637064706570667067706870697070707170727073707470757076707770787079708070817082708370847085708670877088708970907091709270937094709570967097709870997100710171027103710471057106710771087109711071117112711371147115711671177118711971207121712271237124712571267127712871297130713171327133713471357136713771387139714071417142714371447145714671477148714971507151715271537154715571567157715871597160716171627163716471657166716771687169717071717172717371747175717671777178717971807181718271837184718571867187718871897190719171927193719471957196719771987199720072017202720372047205720672077208720972107211721272137214721572167217721872197220722172227223722472257226722772287229723072317232723372347235723672377238723972407241724272437244724572467247724872497250725172527253725472557256725772587259726072617262726372647265726672677268726972707271727272737274727572767277727872797280728172827283728472857286728772887289729072917292729372947295729672977298729973007301730273037304730573067307730873097310731173127313731473157316731773187319732073217322732373247325732673277328732973307331733273337334733573367337733873397340734173427343734473457346734773487349735073517352735373547355735673577358735973607361736273637364736573667367736873697370737173727373737473757376737773787379738073817382738373847385738673877388738973907391739273937394739573967397739873997400740174027403740474057406740774087409741074117412741374147415741674177418741974207421742274237424742574267427742874297430743174327433743474357436743774387439744074417442744374447445744674477448744974507451745274537454745574567457745874597460746174627463746474657466746774687469747074717472747374747475747674777478747974807481748274837484748574867487748874897490749174927493749474957496749774987499750075017502750375047505750675077508750975107511751275137514751575167517751875197520752175227523752475257526752775287529753075317532753375347535753675377538753975407541754275437544754575467547754875497550755175527553755475557556755775587559756075617562756375647565756675677568756975707571757275737574757575767577757875797580758175827583758475857586758775887589759075917592759375947595759675977598759976007601760276037604760576067607760876097610761176127613761476157616761776187619762076217622762376247625762676277628762976307631763276337634763576367637763876397640764176427643764476457646764776487649765076517652765376547655765676577658765976607661766276637664766576667667766876697670767176727673767476757676767776787679768076817682768376847685768676877688768976907691769276937694769576967697769876997700770177027703770477057706770777087709771077117712771377147715771677177718771977207721772277237724772577267727772877297730773177327733773477357736773777387739774077417742774377447745774677477748774977507751775277537754775577567757775877597760776177627763776477657766776777687769777077717772777377747775777677777778777977807781778277837784778577867787778877897790779177927793779477957796779777987799780078017802780378047805780678077808780978107811781278137814781578167817781878197820782178227823782478257826782778287829783078317832783378347835783678377838783978407841784278437844784578467847784878497850785178527853785478557856785778587859786078617862786378647865786678677868786978707871787278737874787578767877787878797880788178827883788478857886788778887889789078917892789378947895789678977898789979007901790279037904790579067907790879097910791179127913791479157916791779187919792079217922792379247925792679277928792979307931793279337934793579367937793879397940794179427943794479457946794779487949795079517952795379547955795679577958795979607961796279637964796579667967796879697970797179727973797479757976797779787979798079817982798379847985798679877988798979907991799279937994799579967997799879998000800180028003800480058006800780088009801080118012801380148015801680178018801980208021802280238024802580268027802880298030803180328033803480358036803780388039804080418042804380448045804680478048804980508051805280538054805580568057805880598060806180628063806480658066806780688069807080718072807380748075807680778078807980808081808280838084808580868087808880898090809180928093809480958096809780988099810081018102810381048105810681078108810981108111811281138114811581168117811881198120812181228123812481258126812781288129813081318132813381348135813681378138813981408141814281438144814581468147814881498150815181528153815481558156815781588159816081618162816381648165816681678168816981708171817281738174817581768177817881798180818181828183818481858186818781888189819081918192819381948195819681978198819982008201820282038204820582068207820882098210821182128213821482158216821782188219822082218222822382248225822682278228822982308231823282338234823582368237823882398240824182428243824482458246824782488249825082518252825382548255825682578258825982608261826282638264826582668267826882698270827182728273827482758276827782788279828082818282828382848285828682878288828982908291829282938294829582968297829882998300830183028303830483058306830783088309831083118312831383148315831683178318831983208321832283238324832583268327832883298330833183328333833483358336833783388339834083418342834383448345834683478348834983508351835283538354835583568357835883598360836183628363836483658366836783688369837083718372837383748375837683778378837983808381838283838384838583868387838883898390839183928393839483958396839783988399840084018402840384048405840684078408840984108411841284138414841584168417841884198420842184228423842484258426842784288429843084318432843384348435843684378438843984408441844284438444844584468447844884498450845184528453845484558456845784588459846084618462846384648465846684678468846984708471847284738474847584768477847884798480848184828483848484858486848784888489849084918492849384948495849684978498849985008501850285038504850585068507850885098510851185128513851485158516851785188519852085218522852385248525852685278528852985308531853285338534853585368537853885398540854185428543854485458546854785488549855085518552855385548555855685578558855985608561856285638564856585668567856885698570857185728573857485758576857785788579858085818582858385848585858685878588858985908591859285938594859585968597859885998600860186028603860486058606860786088609861086118612861386148615861686178618861986208621862286238624862586268627862886298630863186328633863486358636863786388639864086418642864386448645864686478648864986508651865286538654865586568657865886598660866186628663866486658666866786688669867086718672867386748675867686778678867986808681868286838684868586868687868886898690869186928693869486958696869786988699870087018702870387048705870687078708870987108711871287138714871587168717871887198720872187228723872487258726872787288729873087318732873387348735873687378738873987408741874287438744874587468747874887498750875187528753875487558756875787588759876087618762876387648765876687678768876987708771877287738774877587768777877887798780878187828783878487858786878787888789879087918792879387948795879687978798879988008801880288038804880588068807880888098810881188128813881488158816881788188819882088218822882388248825882688278828882988308831883288338834883588368837883888398840884188428843884488458846884788488849885088518852885388548855885688578858885988608861886288638864886588668867886888698870887188728873887488758876887788788879888088818882888388848885888688878888888988908891889288938894889588968897889888998900890189028903890489058906890789088909891089118912891389148915891689178918891989208921892289238924892589268927892889298930893189328933893489358936893789388939894089418942894389448945894689478948
  1. /*
  2. **************************************************************
  3. * C++ Mathematical Expression Toolkit Library *
  4. * *
  5. * Examples and Unit-Tests *
  6. * Author: Arash Partow (1999-2020) *
  7. * URL: http://www.partow.net/programming/exprtk/index.html *
  8. * *
  9. * Copyright notice: *
  10. * Free use of the Mathematical Expression Toolkit Library is *
  11. * permitted under the guidelines and in accordance with the *
  12. * most current version of the MIT License. *
  13. * http://www.opensource.org/licenses/MIT *
  14. * *
  15. **************************************************************
  16. */
  17. #include <cmath>
  18. #include <cstddef>
  19. #include <cstdio>
  20. #include <cstdlib>
  21. #include <deque>
  22. #include <fstream>
  23. #include <iostream>
  24. #include <numeric>
  25. #include <string>
  26. #include <vector>
  27. #include "exprtk.hpp"
  28. #ifdef exprtk_test_float32_type
  29. typedef float numeric_type;
  30. #else
  31. typedef double numeric_type;
  32. #endif
  33. typedef std::pair<std::string,numeric_type> test_t;
  34. static const test_t global_test_list[] =
  35. {
  36. // Note: Each of following tests must compile down
  37. // to a single literal node.
  38. test_t("0",0.0),
  39. test_t("1",1.0),
  40. test_t("2",2.0),
  41. test_t("3",3.0),
  42. test_t("4",4.0),
  43. test_t("5",5.0),
  44. test_t("6",6.0),
  45. test_t("7",7.0),
  46. test_t("8",8.0),
  47. test_t("9",9.0),
  48. test_t("12.12",12.12),
  49. test_t("123.123",123.123),
  50. test_t("1234.1234",1234.1234),
  51. test_t("12345.12345",12345.12345),
  52. test_t("123456.123456",123456.123456),
  53. test_t("0.0",0.0),
  54. test_t("1.0",1.0),
  55. test_t("2.0",2.0),
  56. test_t("3.0",3.0),
  57. test_t("4.0",4.0),
  58. test_t("5.0",5.0),
  59. test_t("6.0",6.0),
  60. test_t("7.0",7.0),
  61. test_t("8.0",8.0),
  62. test_t("9.0",9.0),
  63. test_t("0.0",0.0),
  64. test_t("1.1",1.1),
  65. test_t("2.2",2.2),
  66. test_t("3.3",3.3),
  67. test_t("4.4",4.4),
  68. test_t("5.5",5.5),
  69. test_t("6.6",6.6),
  70. test_t("7.7",7.7),
  71. test_t("8.8",8.8),
  72. test_t("9.9",9.9),
  73. test_t("+0",0.0),
  74. test_t("+1",1.0),
  75. test_t("+2",2.0),
  76. test_t("+3",3.0),
  77. test_t("+4",4.0),
  78. test_t("+5",5.0),
  79. test_t("+6",6.0),
  80. test_t("+7",7.0),
  81. test_t("+8",8.0),
  82. test_t("+9",9.0),
  83. test_t("+0.0",0.0),
  84. test_t("+1.0",1.0),
  85. test_t("+2.0",2.0),
  86. test_t("+3.0",3.0),
  87. test_t("+4.0",4.0),
  88. test_t("+5.0",5.0),
  89. test_t("+6.0",6.0),
  90. test_t("+7.0",7.0),
  91. test_t("+8.0",8.0),
  92. test_t("+9.0",9.0),
  93. test_t("+0.0",0.0),
  94. test_t("+1.1",1.1),
  95. test_t("+2.2",2.2),
  96. test_t("+3.3",3.3),
  97. test_t("+4.4",4.4),
  98. test_t("+5.5",5.5),
  99. test_t("+6.6",6.6),
  100. test_t("+7.7",7.7),
  101. test_t("+8.8",8.8),
  102. test_t("+9.9",9.9),
  103. test_t("-0",-0.0),
  104. test_t("-1",-1.0),
  105. test_t("-2",-2.0),
  106. test_t("-3",-3.0),
  107. test_t("-4",-4.0),
  108. test_t("-5",-5.0),
  109. test_t("-6",-6.0),
  110. test_t("-7",-7.0),
  111. test_t("-8",-8.0),
  112. test_t("-9",-9.0),
  113. test_t("-0.0",-0.0),
  114. test_t("-1.0",-1.0),
  115. test_t("-2.0",-2.0),
  116. test_t("-3.0",-3.0),
  117. test_t("-4.0",-4.0),
  118. test_t("-5.0",-5.0),
  119. test_t("-6.0",-6.0),
  120. test_t("-7.0",-7.0),
  121. test_t("-8.0",-8.0),
  122. test_t("-9.0",-9.0),
  123. test_t("-0.0",-0.0),
  124. test_t("-1.1",-1.1),
  125. test_t("-2.2",-2.2),
  126. test_t("-3.3",-3.3),
  127. test_t("-4.4",-4.4),
  128. test_t("-5.5",-5.5),
  129. test_t("-6.6",-6.6),
  130. test_t("-7.7",-7.7),
  131. test_t("-8.8",-8.8),
  132. test_t("-9.9",-9.9),
  133. test_t("0.0e+0" ,+0.0e+0),
  134. test_t("1.1e+1" ,+1.1e+1),
  135. test_t("2.2e+2" ,+2.2e+2),
  136. test_t("3.3e+3" ,+3.3e+3),
  137. test_t("4.4e+4" ,+4.4e+4),
  138. test_t("5.5e+5" ,+5.5e+5),
  139. test_t("6.6e+6" ,+6.6e+6),
  140. test_t("7.7e+7" ,+7.7e+7),
  141. test_t("8.8e+8" ,+8.8e+8),
  142. test_t("9.9e+9" ,+9.9e+9),
  143. test_t("-0.0e+0",-0.0e+0),
  144. test_t("-1.1e+1",-1.1e+1),
  145. test_t("-2.2e+2",-2.2e+2),
  146. test_t("-3.3e+3",-3.3e+3),
  147. test_t("-4.4e+4",-4.4e+4),
  148. test_t("-5.5e+5",-5.5e+5),
  149. test_t("-6.6e+6",-6.6e+6),
  150. test_t("-7.7e+7",-7.7e+7),
  151. test_t("-8.8e+8",-8.8e+8),
  152. test_t("-9.9e+9",-9.9e+9),
  153. test_t("0.0E+0" ,+0.0E+0),
  154. test_t("1.1E+1" ,+1.1E+1),
  155. test_t("2.2E+2" ,+2.2E+2),
  156. test_t("3.3E+3" ,+3.3E+3),
  157. test_t("4.4E+4" ,+4.4E+4),
  158. test_t("5.5E+5" ,+5.5E+5),
  159. test_t("6.6E+6" ,+6.6E+6),
  160. test_t("7.7E+7" ,+7.7E+7),
  161. test_t("8.8E+8" ,+8.8E+8),
  162. test_t("9.9E+9" ,+9.9E+9),
  163. test_t("-0.0E+0",-0.0E+0),
  164. test_t("-1.1E+1",-1.1E+1),
  165. test_t("-2.2E+2",-2.2E+2),
  166. test_t("-3.3E+3",-3.3E+3),
  167. test_t("-4.4E+4",-4.4E+4),
  168. test_t("-5.5E+5",-5.5E+5),
  169. test_t("-6.6E+6",-6.6E+6),
  170. test_t("-7.7E+7",-7.7E+7),
  171. test_t("-8.8E+8",-8.8E+8),
  172. test_t("-9.9E+9",-9.9E+9),
  173. test_t("(0)",0.0),
  174. test_t("(1)",1.0),
  175. test_t("(2)",2.0),
  176. test_t("(3)",3.0),
  177. test_t("(4)",4.0),
  178. test_t("(5)",5.0),
  179. test_t("(6)",6.0),
  180. test_t("(7)",7.0),
  181. test_t("(8)",8.0),
  182. test_t("(9)",9.0),
  183. test_t("(0.0)",0.0),
  184. test_t("(1.0)",1.0),
  185. test_t("(2.0)",2.0),
  186. test_t("(3.0)",3.0),
  187. test_t("(4.0)",4.0),
  188. test_t("(5.0)",5.0),
  189. test_t("(6.0)",6.0),
  190. test_t("(7.0)",7.0),
  191. test_t("(8.0)",8.0),
  192. test_t("(9.0)",9.0),
  193. test_t("(0.0)",0.0),
  194. test_t("(1.1)",1.1),
  195. test_t("(2.2)",2.2),
  196. test_t("(3.3)",3.3),
  197. test_t("(4.4)",4.4),
  198. test_t("(5.5)",5.5),
  199. test_t("(6.6)",6.6),
  200. test_t("(7.7)",7.7),
  201. test_t("(8.8)",8.8),
  202. test_t("(9.9)",9.9),
  203. test_t("(+0)" ,0.0),
  204. test_t("(+1)" ,1.0),
  205. test_t("(+2)" ,2.0),
  206. test_t("(+3)" ,3.0),
  207. test_t("(+4)" ,4.0),
  208. test_t("(+5)" ,5.0),
  209. test_t("(+6)" ,6.0),
  210. test_t("(+7)" ,7.0),
  211. test_t("(+8)" ,8.0),
  212. test_t("(+9)" ,9.0),
  213. test_t("(+0.0)",0.0),
  214. test_t("(+1.0)",1.0),
  215. test_t("(+2.0)",2.0),
  216. test_t("(+3.0)",3.0),
  217. test_t("(+4.0)",4.0),
  218. test_t("(+5.0)",5.0),
  219. test_t("(+6.0)",6.0),
  220. test_t("(+7.0)",7.0),
  221. test_t("(+8.0)",8.0),
  222. test_t("(+9.0)",9.0),
  223. test_t("(+0.0)",0.0),
  224. test_t("(+1.1)",1.1),
  225. test_t("(+2.2)",2.2),
  226. test_t("(+3.3)",3.3),
  227. test_t("(+4.4)",4.4),
  228. test_t("(+5.5)",5.5),
  229. test_t("(+6.6)",6.6),
  230. test_t("(+7.7)",7.7),
  231. test_t("(+8.8)",8.8),
  232. test_t("(+9.9)",9.9),
  233. test_t("(-0)" ,-0.0),
  234. test_t("(-1)" ,-1.0),
  235. test_t("(-2)" ,-2.0),
  236. test_t("(-3)" ,-3.0),
  237. test_t("(-4)" ,-4.0),
  238. test_t("(-5)" ,-5.0),
  239. test_t("(-6)" ,-6.0),
  240. test_t("(-7)" ,-7.0),
  241. test_t("(-8)" ,-8.0),
  242. test_t("(-9)" ,-9.0),
  243. test_t("(-0.0)",-0.0),
  244. test_t("(-1.0)",-1.0),
  245. test_t("(-2.0)",-2.0),
  246. test_t("(-3.0)",-3.0),
  247. test_t("(-4.0)",-4.0),
  248. test_t("(-5.0)",-5.0),
  249. test_t("(-6.0)",-6.0),
  250. test_t("(-7.0)",-7.0),
  251. test_t("(-8.0)",-8.0),
  252. test_t("(-9.0)",-9.0),
  253. test_t("(-0.0)",-0.0),
  254. test_t("(-1.1)",-1.1),
  255. test_t("(-2.2)",-2.2),
  256. test_t("(-3.3)",-3.3),
  257. test_t("(-4.4)",-4.4),
  258. test_t("(-5.5)",-5.5),
  259. test_t("(-6.6)",-6.6),
  260. test_t("(-7.7)",-7.7),
  261. test_t("(-8.8)",-8.8),
  262. test_t("(-9.9)",-9.9),
  263. test_t("-(1.1)",-1.1),
  264. test_t("-(1.1+2.2)",-3.3),
  265. test_t("1234567890",1234567890),
  266. test_t("123456789.0",123456789.0),
  267. test_t("+1234567890",1234567890),
  268. test_t("+123456789.0",123456789.0),
  269. test_t("-1234567890",-1234567890),
  270. test_t("-123456789.0",-123456789.0),
  271. test_t("1234.567890",1234.567890),
  272. test_t("-1234.567890",-1234.567890),
  273. test_t("0+9",9.0),
  274. test_t("1+8",9.0),
  275. test_t("2+7",9.0),
  276. test_t("3+6",9.0),
  277. test_t("4+5",9.0),
  278. test_t("5+4",9.0),
  279. test_t("6+3",9.0),
  280. test_t("7+2",9.0),
  281. test_t("8+1",9.0),
  282. test_t("9+0",9.0),
  283. test_t(" 0 + 9 ",9.0),
  284. test_t(" 1 + 8 ",9.0),
  285. test_t(" 2 + 7 ",9.0),
  286. test_t(" 3 + 6 ",9.0),
  287. test_t(" 4 + 5 ",9.0),
  288. test_t(" 5 + 4 ",9.0),
  289. test_t(" 6 + 3 ",9.0),
  290. test_t(" 7 + 2 ",9.0),
  291. test_t(" 8 + 1 ",9.0),
  292. test_t(" 9 + 0 ",9.0),
  293. test_t("( 0 + 9 )",9.0),
  294. test_t("( 1 + 8 )",9.0),
  295. test_t("( 2 + 7 )",9.0),
  296. test_t("( 3 + 6 )",9.0),
  297. test_t("( 4 + 5 )",9.0),
  298. test_t("( 5 + 4 )",9.0),
  299. test_t("( 6 + 3 )",9.0),
  300. test_t("( 7 + 2 )",9.0),
  301. test_t("( 8 + 1 )",9.0),
  302. test_t("( 9 + 0 )",9.0),
  303. test_t("1E1+1",11.0),
  304. test_t("1e1+1",11.0),
  305. test_t("1E1-1", 9.0),
  306. test_t("1e1-1", 9.0),
  307. test_t("1E01+1",11.0),
  308. test_t("1e01+1",11.0),
  309. test_t("1E01-1", 9.0),
  310. test_t("1e01-1", 9.0),
  311. test_t("1+2",+3.0),
  312. test_t("1-2",-1.0),
  313. test_t("1*2",+2.0),
  314. test_t("1/2",+0.5),
  315. test_t("1.1+2.2", +3.3),
  316. test_t("1.1-2.2", -1.1),
  317. test_t("1.1*2.2",+2.42),
  318. test_t("1.1/2.2", +0.5),
  319. test_t("0-9",-9.0),
  320. test_t("1-8",-7.0),
  321. test_t("2-7",-5.0),
  322. test_t("3-6",-3.0),
  323. test_t("4-5",-1.0),
  324. test_t("5-4",+1.0),
  325. test_t("6-3",+3.0),
  326. test_t("7-2",+5.0),
  327. test_t("8-1",+7.0),
  328. test_t("9-0",+9.0),
  329. test_t("2.*3",+6.0),
  330. test_t("2.*3.",+6.0),
  331. test_t("2.+3",+5.0),
  332. test_t("2.+3.",+5.0),
  333. test_t("123.*456.",+56088.0),
  334. test_t(" 0 - 9 ",-9.0),
  335. test_t(" 1 - 8 ",-7.0),
  336. test_t(" 2 - 7 ",-5.0),
  337. test_t(" 3 - 6 ",-3.0),
  338. test_t(" 4 - 5 ",-1.0),
  339. test_t(" 5 - 4 ",+1.0),
  340. test_t(" 6 - 3 ",+3.0),
  341. test_t(" 7 - 2 ",+5.0),
  342. test_t(" 8 - 1 ",+7.0),
  343. test_t(" 9 - 0 ",+9.0),
  344. test_t("( 0 - 9 )",-9.0),
  345. test_t("( 1 - 8 )",-7.0),
  346. test_t("( 2 - 7 )",-5.0),
  347. test_t("( 3 - 6 )",-3.0),
  348. test_t("( 4 - 5 )",-1.0),
  349. test_t("( 5 - 4 )",+1.0),
  350. test_t("( 6 - 3 )",+3.0),
  351. test_t("( 7 - 2 )",+5.0),
  352. test_t("( 8 - 1 )",+7.0),
  353. test_t("( 9 - 0 )",+9.0),
  354. test_t("-(1+2)",-3.0),
  355. test_t("+(1+2)",+3.0),
  356. test_t("+(1-2)",-1.0),
  357. test_t("-(1-2)",+1.0),
  358. test_t("(-3*-6)",+18.0),
  359. test_t("(-6*-3)",+18.0),
  360. test_t("-(-3*-6)",-18.0),
  361. test_t("-(-6*-3)",-18.0),
  362. test_t("1.1+2.2+3.3",+6.6),
  363. test_t("+1.1+2.2+3.3",+6.6),
  364. test_t("-1.1-2.2-3.3",-6.6),
  365. test_t("1.1*2.2*3.3",+7.986),
  366. test_t("+1.1*2.2*3.3",+7.986),
  367. test_t("-1.1*-2.2*-3.3",-7.986),
  368. test_t("1 + 1/2",+1.5),
  369. test_t("1 + (1/2)",+1.5),
  370. test_t("1.1 + 1.1/2.2",+1.6),
  371. test_t("1.1 + (1.1/2.2)",+1.6),
  372. test_t("2 * 1/2",+1.0),
  373. test_t("2 * (1/2)",+1.0),
  374. test_t("2.2 * 1.1/2.2",+1.1),
  375. test_t("2.2 * (1.1/2.2)",+1.1),
  376. test_t("1^2",1.0),
  377. test_t("2^1",2.0),
  378. test_t("2^3",8.0),
  379. test_t("-2^3",-8.0),
  380. test_t("-2^4",-16.0),
  381. test_t("(-2)^3",-8.0),
  382. test_t("(-2)^4",+16.0),
  383. test_t("3^2^4",43046721.0),
  384. test_t("1.1^2.2",1.23328630055466251099),
  385. test_t("2.2^1.1",2.3804822576003541627),
  386. test_t("2.2^3.3",13.48946876053338489127),
  387. test_t("3.3^2.2^1.1",17.15193942371376191362),
  388. test_t("+3.3^2.2^1.1",17.15193942371376191362),
  389. test_t("3.3^+2.2^1.1",17.15193942371376191362),
  390. test_t("3.3^2.2^+1.1",17.15193942371376191362),
  391. test_t("3.3^2.2^-1.1",1.65127293793867959137),
  392. test_t("+3.3^+2.2^-1.1",1.65127293793867959137),
  393. test_t("1.1^(1.1 * 2.2)",1.25941916576299080582),
  394. test_t("2.2^(1.1 * 3.3)",17.49823848953534759743),
  395. test_t("3.3^(1.1 * 2.2)",17.98058156638874965269),
  396. test_t("1.1^-2.2/1.1",0.73712884727743375853),
  397. test_t("1.1^+2.2/1.1",1.121169364140602282717273261774),
  398. test_t("1.1^2.2/+1.1",1.121169364140602282717273261774),
  399. test_t("1.1^+2.2/+1.1",1.121169364140602282717273261774),
  400. test_t("1.1^+2.2/-1.1",-1.121169364140602282717273261774),
  401. test_t("1.1^2.2/-1.1",-1.121169364140602282717273261774),
  402. test_t("1.1^+2.2/-1.1",-1.121169364140602282717273261774),
  403. test_t("+1.1^-2.2/1.1",0.73712884727743375853),
  404. test_t("+1.1^+2.2/1.1",1.121169364140602282717273261774),
  405. test_t("+1.1^2.2/+1.1",1.121169364140602282717273261774),
  406. test_t("+1.1^+2.2/+1.1",1.121169364140602282717273261774),
  407. test_t("+1.1^+2.2/-1.1",-1.121169364140602282717273261774),
  408. test_t("+1.1^2.2/-1.1",-1.121169364140602282717273261774),
  409. test_t("+1.1^+2.2/-1.1",-1.121169364140602282717273261774),
  410. test_t("equal(1.23^3,(1.23 * 1.23 * 1.23))",1.0),
  411. test_t("equal(1.23^-3,1/(1.23 * 1.23 * 1.23))",1.0),
  412. test_t("equal((2.1 + 1.23^3),(2.1 + [1.23 * 1.23 * 1.23]))",1.0),
  413. test_t("equal((2.1 - 1.23^3),(2.1 - [1.23 * 1.23 * 1.23]))",1.0),
  414. test_t("equal((2.1 * 1.23^3),(2.1 * [1.23 * 1.23 * 1.23]))",1.0),
  415. test_t("equal((2.1 / 1.23^3),(2.1 / [1.23 * 1.23 * 1.23]))",1.0),
  416. test_t("equal((1.23^3 + 2.1),({1.23 * 1.23 * 1.23} + 2.1))",1.0),
  417. test_t("equal((1.23^3 - 2.1),({1.23 * 1.23 * 1.23} - 2.1))",1.0),
  418. test_t("equal((1.23^3 * 2.1),({1.23 * 1.23 * 1.23} * 2.1))",1.0),
  419. test_t("equal((1.23^3 / 2.1),({1.23 * 1.23 * 1.23} / 2.1))",1.0),
  420. test_t("equal(1.0^(1.0/2.0),sqrt(1.0))",1.0),
  421. test_t("equal(1.0^(1.0/2.0),root(1.0,2.0))",1.0),
  422. test_t("equal(1.0^(1.0/3.0),root(1.0,3.0))",1.0),
  423. test_t("equal(1.0^(1.0/4.0),root(1.0,4.0))",1.0),
  424. test_t("equal(1.0^(1.0/5.0),root(1.0,5.0))",1.0),
  425. test_t("equal(1.0^(1.0/6.0),root(1.0,6.0))",1.0),
  426. test_t("equal(1.0^(1.0/7.0),root(1.0,7.0))",1.0),
  427. test_t("equal(1.0^(1.0/8.0),root(1.0,8.0))",1.0),
  428. test_t("equal(1.0^(1.0/9.0),root(1.0,9.0))",1.0),
  429. test_t("equal(2.0^(1.0/2.0),sqrt(2.0))",1.0),
  430. test_t("equal(2.0^(1.0/2.0),root(2.0,2.0))",1.0),
  431. test_t("equal(3.0^(1.0/3.0),root(3.0,3.0))",1.0),
  432. test_t("equal(4.0^(1.0/4.0),root(4.0,4.0))",1.0),
  433. test_t("equal(5.0^(1.0/5.0),root(5.0,5.0))",1.0),
  434. test_t("equal(6.0^(1.0/6.0),root(6.0,6.0))",1.0),
  435. test_t("equal(7.0^(1.0/7.0),root(7.0,7.0))",1.0),
  436. test_t("equal(8.0^(1.0/8.0),root(8.0,8.0))",1.0),
  437. test_t("equal(9.0^(1.0/9.0),root(9.0,9.0))",1.0),
  438. test_t("1 < 2", 1.0),
  439. test_t("1 <= 2", 1.0),
  440. test_t("1.1 <= 2.2", 1.0),
  441. test_t("(1.0 + 0.1) <= (2.0 + 0.2)", 1.0),
  442. test_t("1 > 2", 0.0),
  443. test_t("1 >= 2", 0.0),
  444. test_t("1.1 >= 2.2", 0.0),
  445. test_t("(1.0 + 0.1) >= (2.0 + 0.2)", 0.0),
  446. test_t("1 <> 2", 1.0),
  447. test_t("1 != 2", 1.0),
  448. test_t("1.1 <> 2.2", 1.0),
  449. test_t("1.1 != 2.2", 1.0),
  450. test_t("(1.0 + 0.1) <> (2.0 + 0.2)", 1.0),
  451. test_t("(1.0 + 0.1) != (2.0 + 0.2)", 1.0),
  452. test_t("1 == 1", 1.0),
  453. test_t("1.1 == 1.1", 1.0),
  454. test_t("1 = 1", 1.0),
  455. test_t("1.1 = 1.1", 1.0),
  456. test_t("1 <> 1", 0.0),
  457. test_t("1 != 1", 0.0),
  458. test_t("1.1 <> 1.1", 0.0),
  459. test_t("1.1 != 1.1", 0.0),
  460. test_t("(1.0 + 0.1) <> (1.0 + 0.1)", 0.0),
  461. test_t("(1.0 + 0.1) != (1.0 + 0.1)", 0.0),
  462. test_t("equal(1.1,1.1)",1.0),
  463. test_t("equal(1.1,2.2)",0.0),
  464. test_t("not_equal(1.1,1.1)",0.0),
  465. test_t("not_equal(1.1,2.2)",1.0),
  466. test_t("1 and 1",1.0),
  467. test_t("1 and 0",0.0),
  468. test_t("0 and 1",0.0),
  469. test_t("0 and 0",0.0),
  470. test_t("1.0 and 1.0",1.0),
  471. test_t("1.0 and 0.0",0.0),
  472. test_t("0.0 and 1.0",0.0),
  473. test_t("0.0 and 0.0",0.0),
  474. test_t("(1 and 1)",1.0),
  475. test_t("(1 and 0)",0.0),
  476. test_t("(0 and 1)",0.0),
  477. test_t("(0 and 0)",0.0),
  478. test_t("(1.0 and 1.0)",1.0),
  479. test_t("(1.0 and 0.0)",0.0),
  480. test_t("(0.0 and 1.0)",0.0),
  481. test_t("(0.0 and 0.0)",0.0),
  482. test_t("1 or 1",1.0),
  483. test_t("1 or 0",1.0),
  484. test_t("0 or 1",1.0),
  485. test_t("0 or 0",0.0),
  486. test_t("1.0 or 1.0",1.0),
  487. test_t("1.0 or 0.0",1.0),
  488. test_t("0.0 or 1.0",1.0),
  489. test_t("0.0 or 0.0",0.0),
  490. test_t("(1 or 1)",1.0),
  491. test_t("(1 or 0)",1.0),
  492. test_t("(0 or 1)",1.0),
  493. test_t("(0 or 0)",0.0),
  494. test_t("(1.0 or 1.0)",1.0),
  495. test_t("(1.0 or 0.0)",1.0),
  496. test_t("(0.0 or 1.0)",1.0),
  497. test_t("(0.0 or 0.0)",0.0),
  498. test_t("1 nand 1",0.0),
  499. test_t("1 nand 0",1.0),
  500. test_t("0 nand 1",1.0),
  501. test_t("0 nand 0",1.0),
  502. test_t("1.0 nand 1.0",0.0),
  503. test_t("1.0 nand 0.0",1.0),
  504. test_t("0.0 nand 1.0",1.0),
  505. test_t("0.0 nand 0.0",1.0),
  506. test_t("(1 nand 1)",0.0),
  507. test_t("(1 nand 0)",1.0),
  508. test_t("(0 nand 1)",1.0),
  509. test_t("(0 nand 0)",1.0),
  510. test_t("(1.0 nand 1.0)",0.0),
  511. test_t("(1.0 nand 0.0)",1.0),
  512. test_t("(0.0 nand 1.0)",1.0),
  513. test_t("(0.0 nand 0.0)",1.0),
  514. test_t("1 nor 1",0.0),
  515. test_t("1 nor 0",0.0),
  516. test_t("0 nor 1",0.0),
  517. test_t("0 nor 0",1.0),
  518. test_t("1.0 nor 1.0",0.0),
  519. test_t("1.0 nor 0.0",0.0),
  520. test_t("0.0 nor 1.0",0.0),
  521. test_t("0.0 nor 0.0",1.0),
  522. test_t("(1 nor 1)",0.0),
  523. test_t("(1 nor 0)",0.0),
  524. test_t("(0 nor 1)",0.0),
  525. test_t("(0 nor 0)",1.0),
  526. test_t("(1.0 nor 1.0)",0.0),
  527. test_t("(1.0 nor 0.0)",0.0),
  528. test_t("(0.0 nor 1.0)",0.0),
  529. test_t("(0.0 nor 0.0)",1.0),
  530. test_t("0 xor 0",0.0),
  531. test_t("0 xor 1",1.0),
  532. test_t("1 xor 0",1.0),
  533. test_t("1 xor 1",0.0),
  534. test_t("0.0 xor 0.0",0.0),
  535. test_t("0.0 xor 1.0",1.0),
  536. test_t("1.0 xor 0.0",1.0),
  537. test_t("1.0 xor 1.0",0.0),
  538. test_t("(0 xor 0)",0.0),
  539. test_t("(0 xor 1)",1.0),
  540. test_t("(1 xor 0)",1.0),
  541. test_t("(1 xor 1)",0.0),
  542. test_t("(0.0 xor 0.0)",0.0),
  543. test_t("(0.0 xor 1.0)",1.0),
  544. test_t("(1.0 xor 0.0)",1.0),
  545. test_t("(1.0 xor 1.0)",0.0),
  546. test_t("1 & 1",1.0),
  547. test_t("1 & 0",0.0),
  548. test_t("0 & 1",0.0),
  549. test_t("0 & 0",0.0),
  550. test_t("1.0 & 1.0",1.0),
  551. test_t("1.0 & 0.0",0.0),
  552. test_t("0.0 & 1.0",0.0),
  553. test_t("0.0 & 0.0",0.0),
  554. test_t("(1 & 1)",1.0),
  555. test_t("(1 & 0)",0.0),
  556. test_t("(0 & 1)",0.0),
  557. test_t("(0 & 0)",0.0),
  558. test_t("(1.0 & 1.0)",1.0),
  559. test_t("(1.0 & 0.0)",0.0),
  560. test_t("(0.0 & 1.0)",0.0),
  561. test_t("(0.0 & 0.0)",0.0),
  562. test_t("1 | 1",1.0),
  563. test_t("1 | 0",1.0),
  564. test_t("0 | 1",1.0),
  565. test_t("0 | 0",0.0),
  566. test_t("1.0 | 1.0",1.0),
  567. test_t("1.0 | 0.0",1.0),
  568. test_t("0.0 | 1.0",1.0),
  569. test_t("0.0 | 0.0",0.0),
  570. test_t("(1 | 1)",1.0),
  571. test_t("(1 | 0)",1.0),
  572. test_t("(0 | 1)",1.0),
  573. test_t("(0 | 0)",0.0),
  574. test_t("(1.0 | 1.0)",1.0),
  575. test_t("(1.0 | 0.0)",1.0),
  576. test_t("(0.0 | 1.0)",1.0),
  577. test_t("(0.0 | 0.0)",0.0),
  578. test_t("(1 nand 1) == not(1 and 1)",1.0),
  579. test_t("(1 nand 0) == not(1 and 0)",1.0),
  580. test_t("(0 nand 1) == not(0 and 1)",1.0),
  581. test_t("(0 nand 0) == not(0 and 0)",1.0),
  582. test_t("(1 nor 1) == not(1 or 1)",1.0),
  583. test_t("(1 nor 0) == not(1 or 0)",1.0),
  584. test_t("(0 nor 1) == not(0 or 1)",1.0),
  585. test_t("(0 nor 0) == not(0 or 0)",1.0),
  586. test_t("(1.0 nand 1.0) == not(1.0 and 1.0)",1.0),
  587. test_t("(1.0 nand 0.0) == not(1.0 and 0.0)",1.0),
  588. test_t("(0.0 nand 1.0) == not(0.0 and 1.0)",1.0),
  589. test_t("(0.0 nand 0.0) == not(0.0 and 0.0)",1.0),
  590. test_t("(1.0 nor 1.0) == not(1.0 or 1.0)",1.0),
  591. test_t("(1.0 nor 0.0) == not(1.0 or 0.0)",1.0),
  592. test_t("(0.0 nor 1.0) == not(0.0 or 1.0)",1.0),
  593. test_t("(0.0 nor 0.0) == not(0.0 or 0.0)",1.0),
  594. test_t("(1 nand 1) == not(1 & 1)",1.0),
  595. test_t("(1 nand 0) == not(1 & 0)",1.0),
  596. test_t("(0 nand 1) == not(0 & 1)",1.0),
  597. test_t("(0 nand 0) == not(0 & 0)",1.0),
  598. test_t("(1 nor 1) == not(1 | 1)",1.0),
  599. test_t("(1 nor 0) == not(1 | 0)",1.0),
  600. test_t("(0 nor 1) == not(0 | 1)",1.0),
  601. test_t("(0 nor 0) == not(0 | 0)",1.0),
  602. test_t("(1.0 nand 1.0) == not(1.0 & 1.0)",1.0),
  603. test_t("(1.0 nand 0.0) == not(1.0 & 0.0)",1.0),
  604. test_t("(0.0 nand 1.0) == not(0.0 & 1.0)",1.0),
  605. test_t("(0.0 nand 0.0) == not(0.0 & 0.0)",1.0),
  606. test_t("(1.0 nor 1.0) == not(1.0 | 1.0)",1.0),
  607. test_t("(1.0 nor 0.0) == not(1.0 | 0.0)",1.0),
  608. test_t("(0.0 nor 1.0) == not(0.0 | 1.0)",1.0),
  609. test_t("(0.0 nor 0.0) == not(0.0 | 0.0)",1.0),
  610. test_t("mand(1,1)",1.0),
  611. test_t("mand(1,0)",0.0),
  612. test_t("mand(0,1)",0.0),
  613. test_t("mand(0,0)",0.0),
  614. test_t("mand(1.0,1.0)",1.0),
  615. test_t("mand(1.0,0.0)",0.0),
  616. test_t("mand(0.0,1.0)",0.0),
  617. test_t("mand(0.0,0.0)",0.0),
  618. test_t("mor(1,1)",1.0),
  619. test_t("mor(1,0)",1.0),
  620. test_t("mor(0,1)",1.0),
  621. test_t("mor(0,0)",0.0),
  622. test_t("mor(1.0,1.0)",1.0),
  623. test_t("mor(1.0,0.0)",1.0),
  624. test_t("mor(0.0,1.0)",1.0),
  625. test_t("mor(0.0,0.0)",0.0),
  626. test_t("(1 nand 1) == not(mand(1,1))",1.0),
  627. test_t("(1 nand 0) == not(mand(1,0))",1.0),
  628. test_t("(0 nand 1) == not(mand(0,1))",1.0),
  629. test_t("(0 nand 0) == not(mand(0,0))",1.0),
  630. test_t("(1 nor 1) == not(mor(1,1))",1.0),
  631. test_t("(1 nor 0) == not(mor(1,0))",1.0),
  632. test_t("(0 nor 1) == not(mor(0,1))",1.0),
  633. test_t("(0 nor 0) == not(mor(0,0))",1.0),
  634. test_t("(1.0 nand 1.0) == not(mand(1.0,1.0))",1.0),
  635. test_t("(1.0 nand 0.0) == not(mand(1.0,0.0))",1.0),
  636. test_t("(0.0 nand 1.0) == not(mand(0.0,1.0))",1.0),
  637. test_t("(0.0 nand 0.0) == not(mand(0.0,0.0))",1.0),
  638. test_t("(1.0 nor 1.0) == not(mor(1.0,1.0))",1.0),
  639. test_t("(1.0 nor 0.0) == not(mor(1.0,0.0))",1.0),
  640. test_t("(0.0 nor 1.0) == not(mor(0.0,1.0))",1.0),
  641. test_t("(0.0 nor 0.0) == not(mor(0.0,0.0))",1.0),
  642. test_t("abs(1)",1.0),
  643. test_t("abs(-1)",1.0),
  644. test_t("abs(1.0)",1.0),
  645. test_t("abs(-1.0)",1.0),
  646. test_t("min(1,2)",1.0),
  647. test_t("min(1,2,3)",1.0),
  648. test_t("min(1,2,3,4)",1.0),
  649. test_t("min(1,2,3,4,5)",1.0),
  650. test_t("min(1,2,3,4,5,6)",1.0),
  651. test_t("min(1.1,2.2)",1.1),
  652. test_t("min(1.1,2.2,3.3)",1.1),
  653. test_t("min(1.1,2.2,3.3,4.4)",1.1),
  654. test_t("min(1.1,2.2,3.3,4.4,5.5)",1.1),
  655. test_t("min(1.1,2.2,3.3,4.4,5.5,6.6)",1.1),
  656. test_t("min(min(1,2),min(3,4))",1.0),
  657. test_t("max(1,2)",2.0),
  658. test_t("max(1,2,3)",3.0),
  659. test_t("max(1,2,3,4)",4.0),
  660. test_t("max(1,2,3,4,5)",5.0),
  661. test_t("max(1,2,3,4,5,6)",6.0),
  662. test_t("max(1.1,2.2)",2.2),
  663. test_t("max(1.1,2.2,3.3)",3.3),
  664. test_t("max(1.1,2.2,3.3,4.4)",4.4),
  665. test_t("max(1.1,2.2,3.3,4.4,5.5)",5.5),
  666. test_t("max(1.1,2.2,3.3,4.4,5.5,6.6)",6.6),
  667. test_t("max(max(1,2),max(3,4))",4.0),
  668. test_t("avg(1,2)",1.5),
  669. test_t("avg(1,2,3)",2.0),
  670. test_t("avg(1,2,3,4)",2.5),
  671. test_t("avg(1,2,3,4,5)",3.0),
  672. test_t("avg(1.1,2.2)",1.65),
  673. test_t("avg(1.1,2.2,3.3)",2.2),
  674. test_t("avg(1.1,2.2,3.3,4.4)",2.75),
  675. test_t("avg(1.1,2.2,3.3,4.4,5.5)",3.3),
  676. test_t("avg(1.1,2.2,3.3,4.4,5.5,6.6)",3.85),
  677. test_t("sum(1,2)",3.0),
  678. test_t("sum(1,2,3)",6.0),
  679. test_t("sum(1,2,3,4)",10),
  680. test_t("sum(1,2,3,4,5)",15.0),
  681. test_t("sum(1,2,3,4,5,6)",21),
  682. test_t("sum(1.1,2.2)",3.3),
  683. test_t("sum(1.1,2.2,3.3)",6.6),
  684. test_t("sum(1.1,2.2,3.3,4.4)",11.0),
  685. test_t("sum(1.1,2.2,3.3,4.4,5.5)",16.5),
  686. test_t("sum(1.1,2.2,3.3,4.4,5.5,6.6)",23.1),
  687. test_t("mul(1,2)",2.0),
  688. test_t("mul(1,2,3)",6.0),
  689. test_t("mul(1,2,3,4)",24.0),
  690. test_t("mul(1,2,3,4,5)",120.0),
  691. test_t("mul(1,2,3,4,5,6)",720.0),
  692. test_t("mul(1.1,2.2)",2.42),
  693. test_t("mul(1.1,2.2,3.3)",7.986),
  694. test_t("mul(1.1,2.2,3.3,4.4)",35.1384),
  695. test_t("mul(1.1,2.2,3.3,4.4,5.5)",193.2612),
  696. test_t("mul(1.1,2.2,3.3,4.4,5.5,6.6)",1275.52392),
  697. test_t("equal(sum(1.1,2.2,3.3,4.4,5.5,6.6,7.7,8.8,9.9),(1.1+2.2+3.3+4.4+5.5+6.6+7.7+8.8+9.9))",1.0),
  698. test_t("equal(mul(1.1,2.2,3.3,4.4,5.5,6.6,7.7,8.8,9.9),(1.1*2.2*3.3*4.4*5.5*6.6*7.7*8.8*9.9))",1.0),
  699. test_t("equal(min(1.1,2.2,3.3,4.4,5.5,6.6,7.7,8.8,9.9),1.1)",1.0),
  700. test_t("equal(max(1.1,2.2,3.3,4.4,5.5,6.6,7.7,8.8,9.9),9.9)",1.0),
  701. test_t("equal(avg(1.1,2.2,3.3,4.4,5.5,6.6,7.7,8.8,9.9),5.5)",1.0),
  702. test_t("floor(1.0)",1.0),
  703. test_t("floor(1.1)",1.0),
  704. test_t("floor(-1.0)",-1.0),
  705. test_t("floor(-1.1)",-2.0),
  706. test_t("ceil(1.0)",1.0),
  707. test_t("ceil(1.1)",2.0),
  708. test_t("ceil(-1.0)",-1.0),
  709. test_t("ceil(-1.1)",-1.0),
  710. test_t("round(1.1)",1.0),
  711. test_t("round(1.49)",1.0),
  712. test_t("round(1.5)",2.0),
  713. test_t("round(1.9)",2.0),
  714. test_t("roundn(1/3,2)",0.33),
  715. test_t("roundn(1/3,5)",0.33333),
  716. test_t("roundn(2/3,2)",0.67),
  717. test_t("roundn(2/3,5)",0.66667),
  718. test_t("roundn(1.0/3.0,2.0)",0.33),
  719. test_t("roundn(1.0/3.0,5.0)",0.33333),
  720. test_t("roundn(2.0/3.0,2.0)",0.67),
  721. test_t("roundn(2.0/3.0,5.0)",0.66667),
  722. test_t("cos(0.0)",1.0),
  723. test_t("sin(0.0)",0.0),
  724. test_t("equal(sin(pi/4.0),cos(pi/4.0))",1.0),
  725. test_t("equal(sin(pi/6.0),cos(pi/3.0))",1.0),
  726. test_t("(sin(pi/4.0) - cos(pi/4.0)) <= epsilon",1.0),
  727. test_t("(cos(pi/3.0) - sin(pi/6.0)) <= epsilon",1.0),
  728. test_t("sin(deg2rad(30))",0.5),
  729. test_t("cos(deg2rad(60))",0.5),
  730. test_t("sin(deg2rad(30)) + cos(deg2rad(60))",1.0),
  731. test_t("equal(sin(deg2rad(30))/cos(deg2rad(30)),tan(deg2rad(30)))",1.0),
  732. test_t("equal(sinh(pi),11.5487393572577483779773343153884) ",1.0),
  733. test_t("equal(asinh(11.5487393572577483779773343153884),pi)",1.0),
  734. test_t("equal(cosh(pi),11.5919532755215206277517520525601) ",1.0),
  735. test_t("equal(acosh(11.5919532755215206277517520525601),pi)",1.0),
  736. test_t("equal(tanh(pi),0.99627207622074994426469058001253) ",1.0),
  737. test_t("equal(atanh(0.99627207622074994426469058001253),pi)",1.0),
  738. test_t("exp(1.0)",2.71828182845904523536028747135266249775724),
  739. test_t("exp(0.0)",1.0),
  740. test_t("log(2.7182818284590451)",1.0),
  741. test_t("log10(10.0)",1.0),
  742. test_t("frac(12.34) + trunc(12.34)",12.34),
  743. test_t("hypot(3.0,4.0)",5.0),
  744. test_t("hypot(1.0,sqrt(3.0))",2.0),
  745. test_t("if(1 < 2, 3, 4)",3.0),
  746. test_t("if(1.1 < 2.2, 3.3, 4.4)",3.3),
  747. test_t("if((1.0+1.1) < (2.0+1.2), 3.3, 4.4)",3.3),
  748. test_t("if(1 = 2, 3, 4)",4.0),
  749. test_t("if(1.1 = 2.2, 3.3, 4.4)",4.4),
  750. test_t("if((1.0+1.1) = (2.0+1.2), 3.3, 4.4)",4.4),
  751. test_t("if(1 == 2, 3, 4)",4.0),
  752. test_t("if(1.1 == 2.2, 3.3, 4.4)",4.4),
  753. test_t("if((1.0+1.1) == (2.0+1.2), 3.3, 4.4)",4.4),
  754. test_t("if(1 >= 2, 3, 4)",4.0),
  755. test_t("if(1.1 >= 2.2, 3.3, 4.4)",4.4),
  756. test_t("if((1.0+1.1) >= (2.0+1.2), 3.3, 4.4)",4.4),
  757. test_t("if(((1.0 + 2.0) == 3.0) and ((4.0 + 5.0) < 9.0),1,2)",2.0),
  758. test_t("(3.0 - 1.0 - 2.0) == ((3.0 - 1.0) - 2.0)",1.0),
  759. test_t("true == true",1.0),
  760. test_t("false == false",1.0),
  761. test_t("true != false",1.0),
  762. test_t("false != true",1.0),
  763. test_t("(1 < 2) == true",1.0),
  764. test_t("(1 > 2) == false",1.0),
  765. test_t("true == (1 < 2)",1.0),
  766. test_t("false == (1 > 2)",1.0),
  767. test_t("(1 > 2) != true",1.0),
  768. test_t("(1 < 2) != false",1.0),
  769. test_t("true != (1 > 2)",1.0),
  770. test_t("false != (1 < 2)",1.0),
  771. test_t("(true and true) == true",1.0),
  772. test_t("(false and false) == false",1.0),
  773. test_t("(true or true) == true",1.0),
  774. test_t("(false or false) == false",1.0),
  775. test_t("(true and false) == false",1.0),
  776. test_t("(false and true) == false",1.0),
  777. test_t("(true or false) == true",1.0),
  778. test_t("(false or true) == true",1.0),
  779. test_t("(true & true) == true",1.0),
  780. test_t("(false & false) == false",1.0),
  781. test_t("(true | true) == true",1.0),
  782. test_t("(false | false) == false",1.0),
  783. test_t("(true & false) == false",1.0),
  784. test_t("(false & true) == false",1.0),
  785. test_t("(true | false) == true",1.0),
  786. test_t("(false | true) == true",1.0),
  787. test_t("clamp(-1,1,+1)",1.0),
  788. test_t("clamp(-1,-1.5,+1.0)",-1.0),
  789. test_t("clamp(-1,+1.5,+1.0)",+1.0),
  790. test_t("clamp(-1,-1.5,+1.0) + clamp(-1,+1.5,+1.0)",0.0),
  791. test_t("inrange(-2,1,+2) == ((-2 <= 1) and (1 <= +2))",1.0),
  792. test_t("inrange(-2,1,+2) == if(({-2 <= 1} and [1 <= +2]),1.0,0.0)",1.0),
  793. test_t("sgn( 0)", 0.0),
  794. test_t("sgn(+3)",+1.0),
  795. test_t("sgn(-3)",-1.0),
  796. test_t("equal($f00(1.1,2.2,3.3),(1.1+2.2)/3.3)",1.0),
  797. test_t("equal($f01(1.1,2.2,3.3),(1.1+2.2)*3.3)",1.0),
  798. test_t("equal($f02(1.1,2.2,3.3),(1.1+2.2)-3.3)",1.0),
  799. test_t("equal($f03(1.1,2.2,3.3),(1.1+2.2)+3.3)",1.0),
  800. test_t("equal($f04(1.1,2.2,3.3),(1.1-2.2)+3.3)",1.0),
  801. test_t("equal($f05(1.1,2.2,3.3),(1.1-2.2)/3.3)",1.0),
  802. test_t("equal($f06(1.1,2.2,3.3),(1.1-2.2)*3.3)",1.0),
  803. test_t("equal($f07(1.1,2.2,3.3),(1.1*2.2)+3.3)",1.0),
  804. test_t("equal($f08(1.1,2.2,3.3),(1.1*2.2)-3.3)",1.0),
  805. test_t("equal($f09(1.1,2.2,3.3),(1.1*2.2)/3.3)",1.0),
  806. test_t("equal($f10(1.1,2.2,3.3),(1.1*2.2)*3.3)",1.0),
  807. test_t("equal($f11(1.1,2.2,3.3),(1.1/2.2)+3.3)",1.0),
  808. test_t("equal($f12(1.1,2.2,3.3),(1.1/2.2)-3.3)",1.0),
  809. test_t("equal($f13(1.1,2.2,3.3),(1.1/2.2)/3.3)",1.0),
  810. test_t("equal($f14(1.1,2.2,3.3),(1.1/2.2)*3.3)",1.0),
  811. test_t("equal($f15(1.1,2.2,3.3),1.1/(2.2+3.3))",1.0),
  812. test_t("equal($f16(1.1,2.2,3.3),1.1/(2.2-3.3))",1.0),
  813. test_t("equal($f17(1.1,2.2,3.3),1.1/(2.2*3.3))",1.0),
  814. test_t("equal($f18(1.1,2.2,3.3),1.1/(2.2/3.3))",1.0),
  815. test_t("equal($f19(1.1,2.2,3.3),1.1*(2.2+3.3))",1.0),
  816. test_t("equal($f20(1.1,2.2,3.3),1.1*(2.2-3.3))",1.0),
  817. test_t("equal($f21(1.1,2.2,3.3),1.1*(2.2*3.3))",1.0),
  818. test_t("equal($f22(1.1,2.2,3.3),1.1*(2.2/3.3))",1.0),
  819. test_t("equal($f23(1.1,2.2,3.3),1.1-(2.2+3.3))",1.0),
  820. test_t("equal($f24(1.1,2.2,3.3),1.1-(2.2-3.3))",1.0),
  821. test_t("equal($f25(1.1,2.2,3.3),1.1-(2.2/3.3))",1.0),
  822. test_t("equal($f26(1.1,2.2,3.3),1.1-(2.2*3.3))",1.0),
  823. test_t("equal($f27(1.1,2.2,3.3),1.1+(2.2*3.3))",1.0),
  824. test_t("equal($f28(1.1,2.2,3.3),1.1+(2.2/3.3))",1.0),
  825. test_t("equal($f29(1.1,2.2,3.3),1.1+(2.2+3.3))",1.0),
  826. test_t("equal($f30(1.1,2.2,3.3),1.1+(2.2-3.3))",1.0),
  827. test_t("equal($f31(1.1,2.2,3.3),1.1*2.2^2+3.3)",1.0),
  828. test_t("equal($f32(1.1,2.2,3.3),1.1*2.2^3+3.3)",1.0),
  829. test_t("equal($f33(1.1,2.2,3.3),1.1*2.2^4+3.3)",1.0),
  830. test_t("equal($f34(1.1,2.2,3.3),1.1*2.2^5+3.3)",1.0),
  831. test_t("equal($f35(1.1,2.2,3.3),1.1*2.2^6+3.3)",1.0),
  832. test_t("equal($f36(1.1,2.2,3.3),1.1*2.2^7+3.3)",1.0),
  833. test_t("equal($f37(1.1,2.2,3.3),1.1*2.2^8+3.3)",1.0),
  834. test_t("equal($f38(1.1,2.2,3.3),1.1*2.2^9+3.3)",1.0),
  835. test_t("equal($f39(1.1,2.2,3.3),1.1*log(2.2)+3.3)",1.0),
  836. test_t("equal($f40(1.1,2.2,3.3),1.1*log(2.2)-3.3)",1.0),
  837. test_t("equal($f41(1.1,2.2,3.3),1.1*log10(2.2)+3.3)",1.0),
  838. test_t("equal($f42(1.1,2.2,3.3),1.1*log10(2.2)-3.3)",1.0),
  839. test_t("equal($f43(1.1,2.2,3.3),1.1*sin(2.2)+3.3)",1.0),
  840. test_t("equal($f44(1.1,2.2,3.3),1.1*sin(2.2)-3.3)",1.0),
  841. test_t("equal($f45(1.1,2.2,3.3),1.1*cos(2.2)+3.3)",1.0),
  842. test_t("equal($f46(1.1,2.2,3.3),1.1*cos(2.2)-3.3)",1.0),
  843. test_t("equal($f47(1.1,2.2,3.3),if(0!=1.1,2.2,3.3))",1.0),
  844. test_t("equal($f48(1.1,2.2,3.3,4.4),1.1+((2.2+3.3)/4.4))",1.0),
  845. test_t("equal($f49(1.1,2.2,3.3,4.4),1.1+((2.2+3.3)*4.4))",1.0),
  846. test_t("equal($f50(1.1,2.2,3.3,4.4),1.1+((2.2-3.3)/4.4))",1.0),
  847. test_t("equal($f51(1.1,2.2,3.3,4.4),1.1+((2.2-3.3)*4.4))",1.0),
  848. test_t("equal($f52(1.1,2.2,3.3,4.4),1.1+((2.2*3.3)/4.4))",1.0),
  849. test_t("equal($f53(1.1,2.2,3.3,4.4),1.1+((2.2*3.3)*4.4))",1.0),
  850. test_t("equal($f54(1.1,2.2,3.3,4.4),1.1+((2.2/3.3)+4.4))",1.0),
  851. test_t("equal($f55(1.1,2.2,3.3,4.4),1.1+((2.2/3.3)/4.4))",1.0),
  852. test_t("equal($f56(1.1,2.2,3.3,4.4),1.1+((2.2/3.3)*4.4))",1.0),
  853. test_t("equal($f57(1.1,2.2,3.3,4.4),1.1-((2.2+3.3)/4.4))",1.0),
  854. test_t("equal($f58(1.1,2.2,3.3,4.4),1.1-((2.2+3.3)*4.4))",1.0),
  855. test_t("equal($f59(1.1,2.2,3.3,4.4),1.1-((2.2-3.3)/4.4))",1.0),
  856. test_t("equal($f60(1.1,2.2,3.3,4.4),1.1-((2.2-3.3)*4.4))",1.0),
  857. test_t("equal($f61(1.1,2.2,3.3,4.4),1.1-((2.2*3.3)/4.4))",1.0),
  858. test_t("equal($f62(1.1,2.2,3.3,4.4),1.1-((2.2*3.3)*4.4))",1.0),
  859. test_t("equal($f63(1.1,2.2,3.3,4.4),1.1-((2.2/3.3)/4.4))",1.0),
  860. test_t("equal($f64(1.1,2.2,3.3,4.4),1.1-((2.2/3.3)*4.4))",1.0),
  861. test_t("equal($f65(1.1,2.2,3.3,4.4),((1.1+2.2)*3.3)-4.4)",1.0),
  862. test_t("equal($f66(1.1,2.2,3.3,4.4),((1.1-2.2)*3.3)-4.4)",1.0),
  863. test_t("equal($f67(1.1,2.2,3.3,4.4),((1.1*2.2)*3.3)-4.4)",1.0),
  864. test_t("equal($f68(1.1,2.2,3.3,4.4),((1.1/2.2)*3.3)-4.4)",1.0),
  865. test_t("equal($f69(1.1,2.2,3.3,4.4),((1.1+2.2)/3.3)-4.4)",1.0),
  866. test_t("equal($f70(1.1,2.2,3.3,4.4),((1.1-2.2)/3.3)-4.4)",1.0),
  867. test_t("equal($f71(1.1,2.2,3.3,4.4),((1.1*2.2)/3.3)-4.4)",1.0),
  868. test_t("equal($f72(1.1,2.2,3.3,4.4),((1.1/2.2)/3.3)-4.4)",1.0),
  869. test_t("equal($f73(1.1,2.2,3.3,4.4),(1.1*2.2)+(3.3*4.4))",1.0),
  870. test_t("equal($f74(1.1,2.2,3.3,4.4),(1.1*2.2)-(3.3*4.4))",1.0),
  871. test_t("equal($f75(1.1,2.2,3.3,4.4),(1.1*2.2)+(3.3/4.4))",1.0),
  872. test_t("equal($f76(1.1,2.2,3.3,4.4),(1.1*2.2)-(3.3/4.4))",1.0),
  873. test_t("equal($f77(1.1,2.2,3.3,4.4),(1.1/2.2)+(3.3/4.4))",1.0),
  874. test_t("equal($f78(1.1,2.2,3.3,4.4),(1.1/2.2)-(3.3/4.4))",1.0),
  875. test_t("equal($f79(1.1,2.2,3.3,4.4),(1.1/2.2)-(3.3*4.4))",1.0),
  876. test_t("equal($f80(1.1,2.2,3.3,4.4),1.1/(2.2+(3.3*4.4)))",1.0),
  877. test_t("equal($f81(1.1,2.2,3.3,4.4),1.1/(2.2-(3.3*4.4)))",1.0),
  878. test_t("equal($f82(1.1,2.2,3.3,4.4),1.1*(2.2+(3.3*4.4)))",1.0),
  879. test_t("equal($f83(1.1,2.2,3.3,4.4),1.1*(2.2-(3.3*4.4)))",1.0),
  880. test_t("equal($f84(1.1,2.2,3.3,4.4),1.1*2.2^2+3.3*4.4^2)",1.0),
  881. test_t("equal($f85(1.1,2.2,3.3,4.4),1.1*2.2^3+3.3*4.4^3)",1.0),
  882. test_t("equal($f86(1.1,2.2,3.3,4.4),1.1*2.2^4+3.3*4.4^4)",1.0),
  883. test_t("equal($f87(1.1,2.2,3.3,4.4),1.1*2.2^5+3.3*4.4^5)",1.0),
  884. test_t("equal($f88(1.1,2.2,3.3,4.4),1.1*2.2^6+3.3*4.4^6)",1.0),
  885. test_t("equal($f89(1.1,2.2,3.3,4.4),1.1*2.2^7+3.3*4.4^7)",1.0),
  886. test_t("equal($f90(1.1,2.2,3.3,4.4),1.1*2.2^8+3.3*4.4^8)",1.0),
  887. test_t("equal($f91(1.1,2.2,3.3,4.4),1.1*2.2^9+3.3*4.4^9)",1.0),
  888. test_t("equal($f92(1.1,2.2,3.3,4.4),if(1.1 and 2.2,3.3,4.4))",1.0),
  889. test_t("equal($f93(1.1,2.2,3.3,4.4),if(1.1 or 2.2,3.3,4.4))",1.0),
  890. test_t("equal($f94(1.1,2.2,3.3,4.4),if(1.1 < 2.2,3.3,4.4))",1.0),
  891. test_t("equal($f95(1.1,2.2,3.3,4.4),if(1.1 <= 2.2,3.3,4.4))",1.0),
  892. test_t("equal($f96(1.1,2.2,3.3,4.4),if(1.1 > 2.2,3.3,4.4))",1.0),
  893. test_t("equal($f97(1.1,2.2,3.3,4.4),if(1.1 >= 2.2,3.3,4.4))",1.0),
  894. test_t("equal($f98(1.1,2.2,3.3,4.4),if(equal(1.1,2.2),3.3,4.4))",1.0),
  895. test_t("equal($f99(1.1,2.2,3.3,4.4),1.1*sin(2.2)+3.3*cos(4.4))",1.0),
  896. test_t("equal((48.0/2.0*(9.0+3.0)),288.0)",1.0),
  897. test_t("equal((48.0/2.0(9.0+3.0)),288.0)",1.0),
  898. test_t("equal((6.0/2.0(1.0+2.0)),9.0)",1.0),
  899. test_t("1+2+3+4+5+6+7+8+9+0",45.0),
  900. test_t("1 + 2 + 3 + 4 + 5 + 6 + 7 + 8 + 9 + 0",45.0),
  901. test_t("1.0 + 2.0 + 3.0 + 4.0 + 5.0 + 6.0 + 7.0 + 8.0 + 9.0 + 0.0",45.0),
  902. test_t("(1+2)+(3+4)+(5+6)+(7+8)+(9+0)",45.0),
  903. test_t("(1-2)+(3-4)+(5-6)+(7-8)+(9-0)",+5.0),
  904. test_t("(1+2)-(3+4)-(5+6)-(7+8)-(9+0)",-39.0),
  905. test_t("(1.0+2.0)+(3.0+4.0)+(5.0+6.0)+(7.0+8.0)+(9.0+0.0)",45.0),
  906. test_t("(1.0-2.0)+(3.0-4.0)+(5.0-6.0)+(7.0-8.0)+(9.0-0.0)",+5.0),
  907. test_t("(1.0+2.0)-(3.0+4.0)-(5.0+6.0)-(7.0+8.0)-(9.0+0.0)",-39.0),
  908. test_t("[(1.0+2.0)+[3.0+4.0]+(5.0+6.0)]+([7.0+8.0]+(9.0+0.0))",45.0),
  909. test_t("([1.0-2.0]+(3.0-4.0)+[5.0-6.0])+[(7.0-8.0)+[9.0-0.0]]",+5.0),
  910. test_t("((1.0+2.0))-[(3.0+4.0)]-((5.0+6.0))-[(7.0+8.0)]-((9.0+0.0))",-39.0),
  911. test_t("{[(1.0+2.0)+[3.0+4.0]+({5.0+6.0})]}+({[7.0+8.0]+(9.0+0.0)})",45.0),
  912. test_t("{([1.0-2.0]+(3.0-4.0)+[5.0-6.0])}+[({+7.0}-{+8.0})+[{+9.0-0.0}]]",+5.0),
  913. test_t("((+1.0+2.0))-[({+3.0+4.0})]-(({+5.0+6.0}))-[({+7.0}+8.0)]-(({+9.0}+{0.0}))",-39.0),
  914. test_t("1+2-3*4/5+6-7*8/9+0",0.37777777777777777778),
  915. test_t("1.1+2.2-3.3*4.4/5.5+6.6-7.7*8.8/9.9+0.0",0.41555555555555555556),
  916. test_t("(1+2)-(3*4)/(5+6)-(7*8)/(9+0)",-4.31313131313131313131),
  917. test_t("1/1+1/2+1/3+1/4+1/5+1/6+1/7+1/8+1/9",2.82896825396825396825),
  918. test_t("(1/1)+(1/2)+(1/3)+(1/4)+(1/5)+(1/6)+(1/7)+(1/8)+(1/9)",2.82896825396825396825),
  919. test_t("1.0/1.0+1.0/2.0+1.0/3.0+1.0/4.0+1.0/5.0+1.0/6.0+1.0/7.0+1.0/8.0+1.0/9",2.82896825396825396825),
  920. test_t("(1.0/1.0)+(1.0/2.0)+(1.0/3.0)+(1.0/4.0)+(1.0/5.0)+(1.0/6.0)+(1.0/7.0)+(1.0/8.0)+(1.0/9)",2.82896825396825396825),
  921. test_t("1/1*1/2*1/3*1/4*1/5*1/6*1/7*1/8*1/9",0.00000275573192239859),
  922. test_t("(1/1)*(1/2)*(1/3)*(1/4)*(1/5)*(1/6)*(1/7)*(1/8)*(1/9)",0.00000275573192239859),
  923. test_t("1.0/1.0*1.0/2.0*1.0/3.0*1.0/4.0*1.0/5.0*1.0/6.0*1.0/7.0*1.0/8.0*1.0/9",0.00000275573192239859),
  924. test_t("(1.0/1.0)*(1.0/2.0)*(1.0/3.0)*(1.0/4.0)*(1.0/5.0)*(1.0/6.0)*(1.0/7.0)*(1.0/8.0)*(1.0/9)",0.00000275573192239859),
  925. test_t("equal(poly01(1.2345,2.2,1.1),(2.2*1.2345^1+1.1))",1.0),
  926. test_t("equal(poly02(1.2345,3.3,2.2,1.1),(3.3*1.2345^2+2.2*1.2345^1+1.1))",1.0),
  927. test_t("equal(poly03(1.2345,4.4,3.3,2.2,1.1),(4.4*1.2345^3+3.3*1.2345^2+2.2*1.2345^1+1.1))",1.0),
  928. test_t("equal(poly04(1.2345,5.5,4.4,3.3,2.2,1.1),(5.5*1.2345^4+4.4*1.2345^3+3.3*1.2345^2+2.2*1.2345^1+1.1))",1.0),
  929. test_t("equal(poly05(1.2345,6.6,5.5,4.4,3.3,2.2,1.1),(6.6*1.2345^5+5.5*1.2345^4+4.4*1.2345^3+3.3*1.2345^2+2.2*1.2345^1+1.1))",1.0),
  930. test_t("equal(poly06(1.2345,7.7,6.6,5.5,4.4,3.3,2.2,1.1),(7.7*1.2345^6+6.6*1.2345^5+5.5*1.2345^4+4.4*1.2345^3+3.3*1.2345^2+2.2*1.2345^1+1.1))",1.0),
  931. test_t("equal(poly07(1.2345,8.8,7.7,6.6,5.5,4.4,3.3,2.2,1.1),(8.8*1.2345^7+7.7*1.2345^6+6.6*1.2345^5+5.5*1.2345^4+4.4*1.2345^3+3.3*1.2345^2+2.2*1.2345^1+1.1))",1.0),
  932. test_t("equal(poly08(1.2345,9.9,8.8,7.7,6.6,5.5,4.4,3.3,2.2,1.1),(9.9*1.2345^8+8.8*1.2345^7+7.7*1.2345^6+6.6*1.2345^5+5.5*1.2345^4+4.4*1.2345^3+3.3*1.2345^2+2.2*1.2345^1+1.1))",1.0),
  933. test_t("equal(poly09(1.2345,1.1,9.9,8.8,7.7,6.6,5.5,4.4,3.3,2.2,1.1),(1.1*1.2345^9+9.9*1.2345^8+8.8*1.2345^7+7.7*1.2345^6+6.6*1.2345^5+5.5*1.2345^4+4.4*1.2345^3+3.3*1.2345^2+2.2*1.2345^1+1.1))",1.0),
  934. test_t("equal(poly10(1.37,2.2,1.1,9.9,8.8,7.7,6.6,5.5,4.4,3.3,2.2,1.1),(2.2*1.37^10+1.1*1.37^9+9.9*1.37^8+8.8*1.37^7+7.7*1.37^6+6.6*1.37^5+5.5*1.37^4+4.4*1.37^3+3.3*1.37^2+2.2*1.37^1+1.1))",1.0),
  935. test_t("equal(poly11(1.37,3.3,2.2,1.1,9.9,8.8,7.7,6.6,5.5,4.4,3.3,2.2,1.1),(3.3*1.37^11+2.2*1.37^10+1.1*1.37^9+9.9*1.37^8+8.8*1.37^7+7.7*1.37^6+6.6*1.37^5+5.5*1.37^4+4.4*1.37^3+3.3*1.37^2+2.2*1.37^1+1.1))",1.0),
  936. test_t("equal(poly12(1.37,4.4,3.3,2.2,1.1,9.9,8.8,7.7,6.6,5.5,4.4,3.3,2.2,1.1),(4.4*1.37^12+3.3*1.37^11+2.2*1.37^10+1.1*1.37^9+9.9*1.37^8+8.8*1.37^7+7.7*1.37^6+6.6*1.37^5+5.5*1.37^4+4.4*1.37^3+3.3*1.37^2+2.2*1.37^1+1.1))",1.0),
  937. test_t("equal(\t \n(\n \r1.1\t\t - \n\n 2.2\n\n/\r3.3\t),(1.1-2.2/3.3))",1.0),
  938. test_t("equal((pi^2^3),(pi^8))",1.0),
  939. test_t("equal((pi^(2^3)),(pi^8))",1.0),
  940. test_t("equal(pi^2^3-pi^8,0)",1.0),
  941. test_t("equal((2*pi^2^3),2*(pi^8))",1.0),
  942. test_t("equal((pi^2^3*2),2*(pi^8))",1.0),
  943. test_t("equal((pi^2^3/2),(pi^8)/2)",1.0),
  944. test_t("equal((pi^2.2^3.3),(pi^13.4894687605338489))",1.0),
  945. test_t("equal((pi^(2.2^3.3)),(pi^13.4894687605338489))",1.0),
  946. test_t("equal((2.2*pi^2.2^3.3),2.2*(pi^13.4894687605338489))",1.0),
  947. test_t("equal((pi^2.2^3.3*2),2*(pi^13.4894687605338489))",1.0),
  948. test_t("equal((pi^2.2^3.3/2.2),(pi^13.4894687605338489)/2.2)",1.0),
  949. test_t("equal((pi^-2^3),1/(pi^8))",1.0),
  950. test_t("equal((pi^(-2^3)),1/(pi^8))",1.0),
  951. test_t("equal((pi^2^-3),(pi^(1/8)))",1.0),
  952. test_t("equal((pi^(2^-3)),(pi^(1/8)))",1.0),
  953. test_t("equal((pi^-2^-3),1/(pi^(1/8)))",1.0),
  954. test_t("equal((pi^(-2^-3)),1/(pi^(1/8)))",1.0),
  955. test_t("equal((-pi^2^3),(-pi^8))",1.0),
  956. test_t("equal((-pi^(2^3)),(-pi^8))",1.0),
  957. test_t("equal(-pi^2^3--pi^8,0)",1.0),
  958. test_t("equal((2*-pi^2^3),2*(-pi^8))",1.0),
  959. test_t("equal((-pi^2^3*2),2*(-pi^8))",1.0),
  960. test_t("equal((-pi^2^3/2),(-pi^8)/2)",1.0),
  961. test_t("equal((-pi^2.2^3.3),(-pi^13.4894687605338489))",1.0),
  962. test_t("equal((-pi^(2.2^3.3)),(-pi^13.4894687605338489))",1.0),
  963. test_t("equal((2.2*-pi^2.2^3.3),2.2*(-pi^13.4894687605338489))",1.0),
  964. test_t("equal((-pi^2.2^3.3*2),2*(-pi^13.4894687605338489))",1.0),
  965. test_t("equal((-pi^2.2^3.3/2.2),(-pi^13.4894687605338489)/2.2)",1.0),
  966. test_t("equal((-pi^-2^3),1/(-pi^8))",1.0),
  967. test_t("equal((-pi^(-2^3)),1/(-pi^8))",1.0),
  968. test_t("equal((-pi^2^-3),(-pi^(1/8)))",1.0),
  969. test_t("equal((-pi^(2^-3)),(-pi^(1/8)))",1.0),
  970. test_t("equal((-pi^-2^-3),1/(-pi^(1/8)))",1.0),
  971. test_t("equal((-pi^(-2^-3)),1/(-pi^(1/8)))",1.0),
  972. test_t("equal((+pi^+2^+3),(+pi^+8))",1.0),
  973. test_t("equal((+pi^(2^3)),(+pi^+8))",1.0),
  974. test_t("equal(+pi^+2^+3-+pi^+8,0)",1.0),
  975. test_t("equal((+2*+pi^+2^+3),+2*(+pi^+8))",1.0),
  976. test_t("equal((+pi^+2^+3*+2),+2*(+pi^+8))",1.0),
  977. test_t("equal((+pi^+2^+3/+2),(+pi^+8)/+2)",1.0),
  978. test_t("equal((+pi^+2.2^+3.3),(+pi^+13.4894687605338489))",1.0),
  979. test_t("equal((+pi^(+2.2^+3.3)),(+pi^+13.4894687605338489))",1.0),
  980. test_t("equal((+2.2*+pi^+2.2^+3.3),+2.2*(+pi^+13.4894687605338489))",1.0),
  981. test_t("equal((+pi^+2.2^+3.3*+2),+2*(+pi^+13.4894687605338489))",1.0),
  982. test_t("equal((+pi^+2.2^+3.3/+2.2),(+pi^+13.4894687605338489)/+2.2)",1.0),
  983. test_t("equal((+pi^-2^3),1/(+pi^+8))",1.0),
  984. test_t("equal((+pi^(-2^3)),1/(+pi^+8))",1.0),
  985. test_t("equal((+pi^2^-3),(+pi^(+1/+8)))",1.0),
  986. test_t("equal((+pi^(2^-3)),(+pi^(+1/+8)))",1.0),
  987. test_t("equal((+pi^-2^-3),1/(+pi^(+1/+8)))",1.0),
  988. test_t("equal((+pi^(-2^-3)),1/(+pi^(+1/+8)))",1.0),
  989. test_t("equal((-pi^+2^+3),(-pi^+8))",1.0),
  990. test_t("equal((-pi^(2^3)),(-pi^+8))",1.0),
  991. test_t("equal(-pi^+2^+3--pi^+8,0)",1.0),
  992. test_t("equal((+2*-pi^+2^+3),2*(-pi^+8))",1.0),
  993. test_t("equal((-pi^+2^+3*2),2*(-pi^+8))",1.0),
  994. test_t("equal((-pi^+2^+3/+2),(-pi^+8)/+2)",1.0),
  995. test_t("equal((-pi^+2.2^+3.3),(-pi^+13.4894687605338489))",1.0),
  996. test_t("equal((-pi^(2.2^3.3)),(-pi^+13.4894687605338489))",1.0),
  997. test_t("equal((+2.2*-pi^+2.2^+3.3),2.2*(-pi^+13.4894687605338489))",1.0),
  998. test_t("equal((-pi^+2.2^+3.3*2),2*(-pi^+13.4894687605338489))",1.0),
  999. test_t("equal((-pi^+2.2^+3.3/+2.2),(-pi^+13.4894687605338489)/+2.2)",1.0),
  1000. test_t("equal((-pi^-2^3),1/(-pi^+8))",1.0),
  1001. test_t("equal((-pi^(-2^3)),1/(-pi^+8))",1.0),
  1002. test_t("equal((-pi^2^-3),(-pi^(+1/+8)))",1.0),
  1003. test_t("equal((-pi^(2^-3)),(-pi^(+1/+8)))",1.0),
  1004. test_t("equal((-pi^-2^-3),1/(-pi^(+1/+8)))",1.0),
  1005. test_t("equal((-pi^(-2^-3)),1/(-pi^(+1/+8)))",1.0),
  1006. test_t("switch { case (1 <= 2) : 1; default: 1.12345; }",1.0),
  1007. test_t("switch { case (1 > 2) : 0; case (1 <= 2) : 1; default: 1.12345; }",1.0),
  1008. test_t("switch { case (1 <= 2) : switch { case (1 <= 2) : 1; default: 1.12345; }; default: 1.12345; }",1.0),
  1009. test_t("switch { case [1 <= 2] : 1; default: 1.12345; }",1.0),
  1010. test_t("switch { case [1 > 2] : 0; case [1 <= 2] : 1; default: 1.12345; }",1.0),
  1011. test_t("switch { case [1 <= 2] : switch { case [1 <= 2] : 1; default: 1.12345; }; default: 1.12345; }",1.0),
  1012. test_t("switch { case {1 <= 2} : 1; default: 1.12345; }",1.0),
  1013. test_t("switch { case {1 > 2} : 0; case {1 <= 2} : 1; default: 1.12345; }",1.0),
  1014. test_t("switch { case {1 <= 2} : switch { case {1 <= 2} : 1; default: 1.12345; }; default: 1.12345; }",1.0),
  1015. test_t("switch { case [(1 <= 2)] : {1}; default: 1.12345; }",1.0),
  1016. test_t("switch { case ([1 > 2]) : [0]; case ([1 <= 2]) : 1; default: 1.12345; }",1.0),
  1017. test_t("switch { case {(1 <= 2)} : switch { case ({1 <= 2}) : 1; default: 1.12345; }; default: 1.12345; }",1.0),
  1018. test_t("switch { case 1 > 1 : 1; case 2 > 2 : 2; case 3 = 3 : 3; case 4 > 4 : 4; default : 5; }",3.0),
  1019. test_t("repeat 1.1 + 2.2 until (1 < 2)",3.3),
  1020. test_t("repeat (1.1 + 2.2) until (1 < 2)",3.3),
  1021. test_t("repeat 1.1 + 2.2; until (1 < 2)",3.3),
  1022. test_t("repeat (1.1 + 2.2); until (1 < 2)",3.3),
  1023. test_t("repeat 1.1234; 1 < 2; 1.1 + 2.2 until (1 < 2)",3.3),
  1024. test_t("repeat 1.1234; 1 < 2; (1.1 + 2.2) until (1 < 2)",3.3),
  1025. test_t("repeat 1.1234; 1 < 2; 1.1 + 2.2; until (1 < 2)",3.3),
  1026. test_t("repeat 1.1234; 1 < 2; (1.1 + 2.2); until (1 < 2)",3.3),
  1027. test_t("[*] { case 1 < 2 : 1 / 2; case (1 < 3) : 2 / 2; case 1 < 4 : 3 / 2; case (1 < 5) : 4 / 2; }",2.0),
  1028. test_t(" 0 ? 1 : 2",2.0),
  1029. test_t(" 1 ? 3 : 4",3.0),
  1030. test_t("(0 ? 1 : 2) == 2",1.0),
  1031. test_t("(1 ? 3 : 4) == 3",1.0),
  1032. test_t("[(0)] ? [(1)] : [(2)]",2.0),
  1033. test_t("([(0)] ? [(1)] : [(2)]) == 2",1.0),
  1034. test_t("([(1)] ? [(3)] : [(4)]) == 3",1.0),
  1035. test_t("(1 < 2 ? 3 : 4) == 3",1.0),
  1036. test_t("(1 > 2 ? 3 : 4) == 4",1.0),
  1037. test_t("(1 < 2 ? 3 + 5 : 4) == 8",1.0),
  1038. test_t("(1 > 2 ? 3 : 4 + 5) == 9",1.0),
  1039. test_t("(2 < 3 + 3 ? 7 : 9) == 7",1.0),
  1040. test_t("(1 + 1 < 3 ? 7 : 9) == 7",1.0),
  1041. test_t("(1 + 1 < 3 + 3 ? 7 : 9) == 7",1.0),
  1042. test_t("(2 > 3 + 3 ? 7 : 9) == 9",1.0),
  1043. test_t("(1 + 1 > 3 ? 7 : 9) == 9",1.0),
  1044. test_t("(1 + 1 > 3 + 3 ? 7 : 9) == 9",1.0),
  1045. test_t("(2 < (3 + 3) ? 7 : 9) == 7",1.0),
  1046. test_t("((1 + 1) < 3 ? 7 : 9) == 7",1.0),
  1047. test_t("((1 + 1) < (3 + 3) ? 7 : 9) == 7",1.0),
  1048. test_t("(min(1,2) ? 1 + 3 : 1 + 4) == 4",1.0),
  1049. test_t("(min(0,1) ? 1 + 3 : 1 + 4) == 5",1.0),
  1050. test_t("if (1 < 2) 3; == 3",1.0),
  1051. test_t("if (1 > 2) 3; == null",1.0),
  1052. test_t("if (1 < 2) 3; else 4; == 3",1.0),
  1053. test_t("if (1 > 2) 3; else 4; == 4",1.0),
  1054. test_t("if (1 < 2) 3; else {1+2; 4;} == 3",1.0),
  1055. test_t("if (1 > 2) 3; else {1+2; 4;} == 4",1.0),
  1056. test_t("if (1 < 2) 3; else if (1 < 2) 4; == 3",1.0),
  1057. test_t("if (1 > 2) 3; else if (1 < 2) 4; == 4",1.0),
  1058. test_t("if (1 > 2) 3; else if (1 > 2) 4; == null",1.0),
  1059. test_t("if (1 < 2) 3; else if (1 < 2) {1+2; 4;} == 3",1.0),
  1060. test_t("if (1 > 2) 3; else if (1 < 2) {1+2; 4;} == 4",1.0),
  1061. test_t("if (1 > 2) 3; else if (1 > 2) {1+2; 4;} == null",1.0),
  1062. test_t("if (1 < 2) { 1+2; 3;} == 3",1.0),
  1063. test_t("if (1 > 2) { 1+2; 3;} == null",1.0),
  1064. test_t("if (1 < 2) { 1+2; 3;} else 4; == 3",1.0),
  1065. test_t("if (1 > 2) { 1+2; 3;} else 4; == 4",1.0),
  1066. test_t("if (1 < 2) { 1+2; 3;} else {1+2; 4;} == 3",1.0),
  1067. test_t("if (1 > 2) { 1+2; 3;} else {1+2; 4;} == 4",1.0),
  1068. test_t("if (1 < 2) { 1+2; 3;} else if (1 < 2) 4; == 3",1.0),
  1069. test_t("if (1 > 2) { 1+2; 3;} else if (1 < 2) 4; == 4",1.0),
  1070. test_t("if (1 > 2) { 1+2; 3;} else if (1 > 2) 4; == null",1.0),
  1071. test_t("if (1 < 2) { 1+2; 3;} else if (1 < 2) {1+2; 4;} == 3",1.0),
  1072. test_t("if (1 > 2) { 1+2; 3;} else if (1 < 2) {1+2; 4;} == 4",1.0),
  1073. test_t("if (1 > 2) { 1+2; 3;} else if (1 > 2) {1+2; 4;} == null",1.0)
  1074. };
  1075. static const std::size_t global_test_list_size = sizeof(global_test_list) / sizeof(test_t);
  1076. template <typename T>
  1077. inline bool not_equal_impl(const T& t1,
  1078. const T& t2,
  1079. const T& epsilon = 0.0000000001/*std::numeric_limits<T>::epsilon()*/)
  1080. {
  1081. if (t1 != t1) return true;
  1082. if (t2 != t2) return true;
  1083. T diff = std::abs(t1 - t2);
  1084. T eps_norm = (std::max(T(1),std::max(std::abs(t1),std::abs(t2))) * epsilon);
  1085. return diff > eps_norm;
  1086. }
  1087. template <typename T>
  1088. inline bool not_equal(const T& t0, const T& t1,
  1089. const T& epsilon = T(0.0000000001))
  1090. {
  1091. return not_equal_impl(t0,t1,epsilon);
  1092. }
  1093. inline bool not_equal(const float& t0, const float& t1, const float& epsilon = 0.000001f)
  1094. {
  1095. return not_equal_impl(t0,t1,epsilon);
  1096. }
  1097. template <typename T>
  1098. inline bool test_expression(const std::string& expression_string, const T& expected_result)
  1099. {
  1100. exprtk::symbol_table<T> symbol_table;
  1101. symbol_table.add_constants();
  1102. exprtk::polynomial<T, 1> poly01;
  1103. exprtk::polynomial<T, 2> poly02;
  1104. exprtk::polynomial<T, 3> poly03;
  1105. exprtk::polynomial<T, 4> poly04;
  1106. exprtk::polynomial<T, 5> poly05;
  1107. exprtk::polynomial<T, 6> poly06;
  1108. exprtk::polynomial<T, 7> poly07;
  1109. exprtk::polynomial<T, 8> poly08;
  1110. exprtk::polynomial<T, 9> poly09;
  1111. exprtk::polynomial<T,10> poly10;
  1112. exprtk::polynomial<T,11> poly11;
  1113. exprtk::polynomial<T,12> poly12;
  1114. symbol_table.add_function("poly01", poly01);
  1115. symbol_table.add_function("poly02", poly02);
  1116. symbol_table.add_function("poly03", poly03);
  1117. symbol_table.add_function("poly04", poly04);
  1118. symbol_table.add_function("poly05", poly05);
  1119. symbol_table.add_function("poly06", poly06);
  1120. symbol_table.add_function("poly07", poly07);
  1121. symbol_table.add_function("poly08", poly08);
  1122. symbol_table.add_function("poly09", poly09);
  1123. symbol_table.add_function("poly10", poly10);
  1124. symbol_table.add_function("poly11", poly11);
  1125. symbol_table.add_function("poly12", poly12);
  1126. exprtk::expression<T> expression;
  1127. expression.register_symbol_table(symbol_table);
  1128. {
  1129. exprtk::parser<T> parser;
  1130. if (!parser.compile(expression_string,expression))
  1131. {
  1132. printf("test_expression() - Error: %s Expression: %s\n",
  1133. parser.error().c_str(),
  1134. expression_string.c_str());
  1135. return false;
  1136. }
  1137. }
  1138. if (!exprtk::expression_helper<T>::is_constant(expression))
  1139. {
  1140. printf("test_expression() - Error: Expression did not compile to a constant! Expression: %s\n",
  1141. expression_string.c_str());
  1142. return false;
  1143. }
  1144. T result = expression.value();
  1145. if (not_equal(result,expected_result))
  1146. {
  1147. printf("test_expression() - Computation Error: Expression: [%s]\tExpected: %19.15f\tResult: %19.15f\n",
  1148. expression_string.c_str(),
  1149. (double)expected_result,
  1150. (double)result);
  1151. return false;
  1152. }
  1153. return true;
  1154. }
  1155. template <typename T>
  1156. inline bool run_test00()
  1157. {
  1158. const std::size_t rounds = 10;
  1159. for (std::size_t r = 0; r < rounds; ++r)
  1160. {
  1161. bool result = true;
  1162. for (std::size_t i = 0; i < global_test_list_size; ++i)
  1163. {
  1164. if (!test_expression<T>(global_test_list[i].first,T(global_test_list[i].second)))
  1165. {
  1166. result = false;
  1167. }
  1168. }
  1169. if (!result)
  1170. {
  1171. return false;
  1172. }
  1173. }
  1174. return true;
  1175. }
  1176. template <typename T>
  1177. struct test_xy
  1178. {
  1179. test_xy(const std::string& e, const T& v0, const T& v1, const T& r)
  1180. : expr(e),
  1181. x(v0),
  1182. y(v1),
  1183. result(r)
  1184. {}
  1185. std::string expr;
  1186. T x;
  1187. T y;
  1188. T result;
  1189. };
  1190. template <typename T>
  1191. struct test_xyzw
  1192. {
  1193. test_xyzw(const std::string& e, const T& v0, const T& v1, const T& v2, const T& v3, const T& r)
  1194. : expr(e),
  1195. x(v0),
  1196. y(v1),
  1197. z(v2),
  1198. w(v3),
  1199. result(r)
  1200. {}
  1201. std::string expr;
  1202. T x;
  1203. T y;
  1204. T z;
  1205. T w;
  1206. T result;
  1207. };
  1208. template <typename T>
  1209. inline bool run_test01()
  1210. {
  1211. {
  1212. static const test_xy<T> test_list[] =
  1213. {
  1214. test_xy<T>("x + y" ,T(2.2),T(3.3),T(5.5 )),
  1215. test_xy<T>("x - y" ,T(3.3),T(2.2),T(1.1 )),
  1216. test_xy<T>("x * y" ,T(3.3),T(2.2),T(7.26 )),
  1217. test_xy<T>("x / y" ,T(3.3),T(2.2),T(1.5 )),
  1218. test_xy<T>("(x + y) * (x + y)" ,T(2.2),T(3.3),T(30.25)),
  1219. test_xy<T>("(x + y) / (x + y)" ,T(2.2),T(3.3),T(1.0 )),
  1220. test_xy<T>("x + y > x and x + y > y" ,T(2.2),T(3.3),T(1.0)),
  1221. test_xy<T>("1 + (x + y)" ,T(2.2),T(3.3),T(6.5 )),
  1222. test_xy<T>("(x + y) - 1" ,T(2.2),T(3.3),T(4.5 )),
  1223. test_xy<T>("1 + (x + y) * 2" ,T(2.2),T(3.3),T(12.0 )),
  1224. test_xy<T>("2 * (x + y) - 1" ,T(2.2),T(3.3),T(10.0 )),
  1225. test_xy<T>("y + (x + 1)" ,T(2.2),T(3.3),T(6.5 )),
  1226. test_xy<T>("(x + 1) + y" ,T(2.2),T(3.3),T(6.5 )),
  1227. test_xy<T>("2 * x" ,T(2.2),T(0.0),T(4.4)),
  1228. test_xy<T>("x * 2" ,T(2.2),T(0.0),T(4.4)),
  1229. test_xy<T>("1.1 + x",T(2.2),T(0.0),T(3.3)),
  1230. test_xy<T>("x + 1.1",T(2.2),T(0.0),T(3.3)),
  1231. test_xy<T>("x * 1 == x" ,T(2.0),T(3.0),T(1.0)),
  1232. test_xy<T>("1 * x == x" ,T(2.0),T(3.0),T(1.0)),
  1233. test_xy<T>("y * 1 == y" ,T(2.0),T(3.0),T(1.0)),
  1234. test_xy<T>("1 * y == y" ,T(2.0),T(3.0),T(1.0)),
  1235. test_xy<T>("x * 0 == 0" ,T(2.0),T(3.0),T(1.0)),
  1236. test_xy<T>("0 * x == 0" ,T(2.0),T(3.0),T(1.0)),
  1237. test_xy<T>("y * 0 == 0" ,T(2.0),T(3.0),T(1.0)),
  1238. test_xy<T>("0 * y == 0" ,T(2.0),T(3.0),T(1.0)),
  1239. test_xy<T>("x + 1 == 1 + x",T(2.0),T(3.0),T(1.0)),
  1240. test_xy<T>("y + 1 == 1 + y",T(2.0),T(3.0),T(1.0)),
  1241. test_xy<T>("x + y == y + x",T(2.0),T(3.0),T(1.0)),
  1242. test_xy<T>("x * y == y * x",T(2.0),T(3.0),T(1.0)),
  1243. test_xy<T>("x < y" ,T(2.0),T(3.0),T(1.0)),
  1244. test_xy<T>("y > x" ,T(2.0),T(3.0),T(1.0)),
  1245. test_xy<T>("x <= y" ,T(2.0),T(3.0),T(1.0)),
  1246. test_xy<T>("y >= x" ,T(2.0),T(3.0),T(1.0)),
  1247. test_xy<T>("x + y > y" ,T(2.0),T(3.0),T(1.0)),
  1248. test_xy<T>("x + y > x" ,T(2.0),T(3.0),T(1.0)),
  1249. test_xy<T>("x * y > y" ,T(2.0),T(3.0),T(1.0)),
  1250. test_xy<T>("x * y > x" ,T(2.0),T(3.0),T(1.0)),
  1251. test_xy<T>("(x + y) > y" ,T(2.0),T(3.0),T(1.0)),
  1252. test_xy<T>("(x + y) > x" ,T(2.0),T(3.0),T(1.0)),
  1253. test_xy<T>("(x * y) > y" ,T(2.0),T(3.0),T(1.0)),
  1254. test_xy<T>("(x * y) > x" ,T(2.0),T(3.0),T(1.0)),
  1255. test_xy<T>("(2x + 3y) == (2*x + 3*y)" ,T(2.0),T(3.0),T(1.0)),
  1256. test_xy<T>("2(x + y) == (2*x + 2*y)" ,T(2.0),T(3.0),T(1.0)),
  1257. test_xy<T>(" (x + y)3 == (3*x + 3*y)" ,T(2.0),T(3.0),T(1.0)),
  1258. test_xy<T>("2x + 3y == 2*x + 3*y" ,T(2.0),T(3.0),T(1.0)),
  1259. test_xy<T>("2(x + y) == 2*x + 2*y" ,T(2.0),T(3.0),T(1.0)),
  1260. test_xy<T>(" (x + y)3 == 3*x + 3*y" ,T(2.0),T(3.0),T(1.0)),
  1261. test_xy<T>(" (x)y == (x*y)" ,T(2.0),T(3.0),T(1.0)),
  1262. test_xy<T>(" x(y) == (x*y)" ,T(2.0),T(3.0),T(1.0)),
  1263. test_xy<T>(" (x) y == (x*y)" ,T(2.0),T(3.0),T(1.0)),
  1264. test_xy<T>(" x (y) == (x*y)" ,T(2.0),T(3.0),T(1.0)),
  1265. test_xy<T>(" ((x) y) == (x*y)" ,T(2.0),T(3.0),T(1.0)),
  1266. test_xy<T>(" (x (y)) == (x*y)" ,T(2.0),T(3.0),T(1.0)),
  1267. test_xy<T>(" (x)3 == (x*3)" ,T(2.0),T(3.0),T(1.0)),
  1268. test_xy<T>(" x(3) == (x*3)" ,T(2.0),T(3.0),T(1.0)),
  1269. test_xy<T>(" (x) 3 == (x*3)" ,T(2.0),T(3.0),T(1.0)),
  1270. test_xy<T>(" x (3) == (x*3)" ,T(2.0),T(3.0),T(1.0)),
  1271. test_xy<T>(" ((x) 3) == (x*3)" ,T(2.0),T(3.0),T(1.0)),
  1272. test_xy<T>(" (x (3)) == (x*3)" ,T(2.0),T(3.0),T(1.0)),
  1273. test_xy<T>(" (2)y == (2*y)" ,T(2.0),T(3.0),T(1.0)),
  1274. test_xy<T>(" 2(y) == (2*y)" ,T(2.0),T(3.0),T(1.0)),
  1275. test_xy<T>(" (2) y == (2*y)" ,T(2.0),T(3.0),T(1.0)),
  1276. test_xy<T>(" 2 (y) == (2*y)" ,T(2.0),T(3.0),T(1.0)),
  1277. test_xy<T>(" ((2) y) == (2*y)" ,T(2.0),T(3.0),T(1.0)),
  1278. test_xy<T>(" (2 (y)) == (2*y)" ,T(2.0),T(3.0),T(1.0)),
  1279. test_xy<T>("var a := 2; (a)(3) == 6" ,T(2.0),T(3.0),T(1.0)),
  1280. test_xy<T>("var a := 2; (A){3} == 6" ,T(2.0),T(3.0),T(1.0)),
  1281. test_xy<T>("var a := 2; (a)[3] == 6" ,T(2.0),T(3.0),T(1.0)),
  1282. test_xy<T>("var a := 2; {a}(3) == 6" ,T(2.0),T(3.0),T(1.0)),
  1283. test_xy<T>("var a := 2; {a}{3} == 6" ,T(2.0),T(3.0),T(1.0)),
  1284. test_xy<T>("var a := 2; {a}[3] == 6" ,T(2.0),T(3.0),T(1.0)),
  1285. test_xy<T>("var a := 2; var b := 3; (a)(b) == 6" ,T(2.0),T(3.0),T(1.0)),
  1286. test_xy<T>("var a := 2; var b := 3; (a){B} == 6" ,T(2.0),T(3.0),T(1.0)),
  1287. test_xy<T>("var a := 2; var b := 3; (a)[b] == 6" ,T(2.0),T(3.0),T(1.0)),
  1288. test_xy<T>("var a := 2; var b := 3; {a}(b) == 6" ,T(2.0),T(3.0),T(1.0)),
  1289. test_xy<T>("var a := 2; var b := 3; {a}{b} == 6" ,T(2.0),T(3.0),T(1.0)),
  1290. test_xy<T>("var a := 2; var b := 3; {a}[b] == 6" ,T(2.0),T(3.0),T(1.0)),
  1291. test_xy<T>("var a := 2; (a)(a+1) == 6" ,T(2.0),T(3.0),T(1.0)),
  1292. test_xy<T>("var a := 2; (a){a+1} == 6" ,T(2.0),T(3.0),T(1.0)),
  1293. test_xy<T>("var a := 2; (a)[a+1] == 6" ,T(2.0),T(3.0),T(1.0)),
  1294. test_xy<T>("var a := 2; {a}(a+1) == 6" ,T(2.0),T(3.0),T(1.0)),
  1295. test_xy<T>("var a := 2; {a}{a+1} == 6" ,T(2.0),T(3.0),T(1.0)),
  1296. test_xy<T>("var a := 2; {a}[a+1] == 6" ,T(2.0),T(3.0),T(1.0)),
  1297. test_xy<T>("var a := 2; var b := 3; (b-1)(b) == 6" ,T(2.0),T(3.0),T(1.0)),
  1298. test_xy<T>("var a := 2; var b := 3; (b-1){b} == 6" ,T(2.0),T(3.0),T(1.0)),
  1299. test_xy<T>("var a := 2; var b := 3; (b-1)[b] == 6" ,T(2.0),T(3.0),T(1.0)),
  1300. test_xy<T>("var a := 2; var b := 3; {b-1}(b) == 6" ,T(2.0),T(3.0),T(1.0)),
  1301. test_xy<T>("var a := 2; var b := 3; {b-1}{b} == 6" ,T(2.0),T(3.0),T(1.0)),
  1302. test_xy<T>("var a := 2; var b := 3; {b-1}[b] == 6" ,T(2.0),T(3.0),T(1.0)),
  1303. test_xy<T>("equal(x^2.2^1.1,17.15193942371376191362)" ,T(3.3),T(0.0),T(1.0)),
  1304. test_xy<T>("equal(3.3^x^1.1,17.15193942371376191362)" ,T(2.2),T(0.0),T(1.0)),
  1305. test_xy<T>("equal(3.3^2.2^x,17.15193942371376191362)" ,T(1.1),T(0.0),T(1.0)),
  1306. test_xy<T>("equal(x^2.2^y,17.15193942371376191362)" ,T(3.3),T(1.1),T(1.0)),
  1307. test_xy<T>("equal(x^y^1.1,17.15193942371376191362)" ,T(3.3),T(2.2),T(1.0)),
  1308. test_xy<T>("equal(3.3^x^y,17.15193942371376191362)" ,T(2.2),T(1.1),T(1.0)),
  1309. test_xy<T>("equal(x+y^3/7,x+(y*y*y)/7)",T(2.0),T(3.0),T(1.0)),
  1310. test_xy<T>("equal(1-x^3+y^2*7,1-(x*x*x)+(y*y)*7)",T(2.0),T(3.0),T(1.0)),
  1311. test_xy<T>("equal( x^0,1)",T(12.34),T(0.0),T(1.0)),
  1312. test_xy<T>("equal( x^1,x)",T(12.34),T(0.0),T(1.0)),
  1313. test_xy<T>("equal( x^2,x*x)",T(12.34),T(0.0),T(1.0)),
  1314. test_xy<T>("equal( x^3,x*x*x)",T(12.34),T(0.0),T(1.0)),
  1315. test_xy<T>("equal( x^4,x*x*x*x)",T(12.34),T(0.0),T(1.0)),
  1316. test_xy<T>("equal( x^5,x*x*x*x*x)",T(12.34),T(0.0),T(1.0)),
  1317. test_xy<T>("equal( x^6,x*x*x*x*x*x)",T(12.34),T(0.0),T(1.0)),
  1318. test_xy<T>("equal( x^7,x*x*x*x*x*x*x)",T(12.34),T(0.0),T(1.0)),
  1319. test_xy<T>("equal( x^8,x*x*x*x*x*x*x*x)",T(12.34),T(0.0),T(1.0)),
  1320. test_xy<T>("equal( x^9,x*x*x*x*x*x*x*x*x)",T(12.34),T(0.0),T(1.0)),
  1321. test_xy<T>("equal(x^10,x*x*x*x*x*x*x*x*x*x)",T(12.34),T(0.0),T(1.0)),
  1322. test_xy<T>("equal(x^11,x*x*x*x*x*x*x*x*x*x*x)",T(12.34),T(0.0),T(1.0)),
  1323. test_xy<T>("equal(x^12,x*x*x*x*x*x*x*x*x*x*x*x)",T(12.34),T(0.0),T(1.0)),
  1324. test_xy<T>("equal(x^13,x*x*x*x*x*x*x*x*x*x*x*x*x)",T(12.34),T(0.0),T(1.0)),
  1325. test_xy<T>("equal(x^14,x*x*x*x*x*x*x*x*x*x*x*x*x*x)",T(12.34),T(0.0),T(1.0)),
  1326. test_xy<T>("equal(x^15,x*x*x*x*x*x*x*x*x*x*x*x*x*x*x)",T(12.34),T(0.0),T(1.0)),
  1327. test_xy<T>("equal(x^16,x*x*x*x*x*x*x*x*x*x*x*x*x*x*x*x)",T(12.34),T(0.0),T(1.0)),
  1328. test_xy<T>("equal(x^17,x*x*x*x*x*x*x*x*x*x*x*x*x*x*x*x*x)",T(12.34),T(0.0),T(1.0)),
  1329. test_xy<T>("equal(x^18,x*x*x*x*x*x*x*x*x*x*x*x*x*x*x*x*x*x)",T(12.34),T(0.0),T(1.0)),
  1330. test_xy<T>("equal(x^19,x*x*x*x*x*x*x*x*x*x*x*x*x*x*x*x*x*x*x)",T(12.34),T(0.0),T(1.0)),
  1331. test_xy<T>("equal(x^20,x*x*x*x*x*x*x*x*x*x*x*x*x*x*x*x*x*x*x*x)",T(12.34),T(0.0),T(1.0)),
  1332. test_xy<T>("equal(x^21,x*x*x*x*x*x*x*x*x*x*x*x*x*x*x*x*x*x*x*x*x)",T(12.34),T(0.0),T(1.0)),
  1333. test_xy<T>("equal(x^22,x*x*x*x*x*x*x*x*x*x*x*x*x*x*x*x*x*x*x*x*x*x)",T(12.34),T(0.0),T(1.0)),
  1334. test_xy<T>("equal(x^23,x*x*x*x*x*x*x*x*x*x*x*x*x*x*x*x*x*x*x*x*x*x*x)",T(12.34),T(0.0),T(1.0)),
  1335. test_xy<T>("equal(x^24,x*x*x*x*x*x*x*x*x*x*x*x*x*x*x*x*x*x*x*x*x*x*x*x)",T(12.34),T(0.0),T(1.0)),
  1336. test_xy<T>("equal(x^25,x*x*x*x*x*x*x*x*x*x*x*x*x*x*x*x*x*x*x*x*x*x*x*x*x)",T(12.34),T(0.0),T(1.0)),
  1337. test_xy<T>("equal( y^0,1)",T(0.0),T(12.34),T(1.0)),
  1338. test_xy<T>("equal( y^1,y)",T(0.0),T(12.34),T(1.0)),
  1339. test_xy<T>("equal( y^2,y*y)",T(0.0),T(12.34),T(1.0)),
  1340. test_xy<T>("equal( y^3,y*y*y)",T(0.0),T(12.34),T(1.0)),
  1341. test_xy<T>("equal( y^4,y*y*y*y)",T(0.0),T(12.34),T(1.0)),
  1342. test_xy<T>("equal( y^5,y*y*y*y*y)",T(0.0),T(12.34),T(1.0)),
  1343. test_xy<T>("equal( y^6,y*y*y*y*y*y)",T(0.0),T(12.34),T(1.0)),
  1344. test_xy<T>("equal( y^7,y*y*y*y*y*y*y)",T(0.0),T(12.34),T(1.0)),
  1345. test_xy<T>("equal( y^8,y*y*y*y*y*y*y*y)",T(0.0),T(12.34),T(1.0)),
  1346. test_xy<T>("equal( y^9,y*y*y*y*y*y*y*y*y)",T(0.0),T(12.34),T(1.0)),
  1347. test_xy<T>("equal(y^10,y*y*y*y*y*y*y*y*y*y)",T(0.0),T(12.34),T(1.0)),
  1348. test_xy<T>("equal(y^11,y*y*y*y*y*y*y*y*y*y*y)",T(0.0),T(12.34),T(1.0)),
  1349. test_xy<T>("equal(y^12,y*y*y*y*y*y*y*y*y*y*y*y)",T(0.0),T(12.34),T(1.0)),
  1350. test_xy<T>("equal(y^13,y*y*y*y*y*y*y*y*y*y*y*y*y)",T(0.0),T(12.34),T(1.0)),
  1351. test_xy<T>("equal(y^14,y*y*y*y*y*y*y*y*y*y*y*y*y*y)",T(0.0),T(12.34),T(1.0)),
  1352. test_xy<T>("equal(y^15,y*y*y*y*y*y*y*y*y*y*y*y*y*y*y)",T(0.0),T(12.34),T(1.0)),
  1353. test_xy<T>("equal(y^16,y*y*y*y*y*y*y*y*y*y*y*y*y*y*y*y)",T(0.0),T(12.34),T(1.0)),
  1354. test_xy<T>("equal(y^17,y*y*y*y*y*y*y*y*y*y*y*y*y*y*y*y*y)",T(0.0),T(12.34),T(1.0)),
  1355. test_xy<T>("equal(y^18,y*y*y*y*y*y*y*y*y*y*y*y*y*y*y*y*y*y)",T(0.0),T(12.34),T(1.0)),
  1356. test_xy<T>("equal(y^19,y*y*y*y*y*y*y*y*y*y*y*y*y*y*y*y*y*y*y)",T(0.0),T(12.34),T(1.0)),
  1357. test_xy<T>("equal(y^20,y*y*y*y*y*y*y*y*y*y*y*y*y*y*y*y*y*y*y*y)",T(0.0),T(12.34),T(1.0)),
  1358. test_xy<T>("equal(y^21,y*y*y*y*y*y*y*y*y*y*y*y*y*y*y*y*y*y*y*y*y)",T(0.0),T(12.34),T(1.0)),
  1359. test_xy<T>("equal(y^22,y*y*y*y*y*y*y*y*y*y*y*y*y*y*y*y*y*y*y*y*y*y)",T(0.0),T(12.34),T(1.0)),
  1360. test_xy<T>("equal(y^23,y*y*y*y*y*y*y*y*y*y*y*y*y*y*y*y*y*y*y*y*y*y*y)",T(0.0),T(12.34),T(1.0)),
  1361. test_xy<T>("equal(y^24,y*y*y*y*y*y*y*y*y*y*y*y*y*y*y*y*y*y*y*y*y*y*y*y)",T(0.0),T(12.34),T(1.0)),
  1362. test_xy<T>("equal(y^25,y*y*y*y*y*y*y*y*y*y*y*y*y*y*y*y*y*y*y*y*y*y*y*y*y)",T(0.0),T(12.34),T(1.0)),
  1363. test_xy<T>("equal( x^-0,1/1)",T(12.34),T(0.0),T(1.0)),
  1364. test_xy<T>("equal( x^-1,1/(x))",T(12.34),T(0.0),T(1.0)),
  1365. test_xy<T>("equal( x^-2,1/(x*x))",T(12.34),T(0.0),T(1.0)),
  1366. test_xy<T>("equal( x^-3,1/(x*x*x))",T(12.34),T(0.0),T(1.0)),
  1367. test_xy<T>("equal( x^-4,1/(x*x*x*x))",T(12.34),T(0.0),T(1.0)),
  1368. test_xy<T>("equal( x^-5,1/(x*x*x*x*x))",T(12.34),T(0.0),T(1.0)),
  1369. test_xy<T>("equal( x^-6,1/(x*x*x*x*x*x))",T(12.34),T(0.0),T(1.0)),
  1370. test_xy<T>("equal( x^-7,1/(x*x*x*x*x*x*x))",T(12.34),T(0.0),T(1.0)),
  1371. test_xy<T>("equal( x^-8,1/(x*x*x*x*x*x*x*x))",T(12.34),T(0.0),T(1.0)),
  1372. test_xy<T>("equal( x^-9,1/(x*x*x*x*x*x*x*x*x))",T(12.34),T(0.0),T(1.0)),
  1373. test_xy<T>("equal(x^-10,1/(x*x*x*x*x*x*x*x*x*x))",T(12.34),T(0.0),T(1.0)),
  1374. test_xy<T>("equal(x^-11,1/(x*x*x*x*x*x*x*x*x*x*x))",T(12.34),T(0.0),T(1.0)),
  1375. test_xy<T>("equal(x^-12,1/(x*x*x*x*x*x*x*x*x*x*x*x))",T(12.34),T(0.0),T(1.0)),
  1376. test_xy<T>("equal(x^-13,1/(x*x*x*x*x*x*x*x*x*x*x*x*x))",T(12.34),T(0.0),T(1.0)),
  1377. test_xy<T>("equal(x^-14,1/(x*x*x*x*x*x*x*x*x*x*x*x*x*x))",T(12.34),T(0.0),T(1.0)),
  1378. test_xy<T>("equal(x^-15,1/(x*x*x*x*x*x*x*x*x*x*x*x*x*x*x))",T(12.34),T(0.0),T(1.0)),
  1379. test_xy<T>("equal(x^-16,1/(x*x*x*x*x*x*x*x*x*x*x*x*x*x*x*x))",T(12.34),T(0.0),T(1.0)),
  1380. test_xy<T>("equal(x^-17,1/(x*x*x*x*x*x*x*x*x*x*x*x*x*x*x*x*x))",T(12.34),T(0.0),T(1.0)),
  1381. test_xy<T>("equal(x^-18,1/(x*x*x*x*x*x*x*x*x*x*x*x*x*x*x*x*x*x))",T(12.34),T(0.0),T(1.0)),
  1382. test_xy<T>("equal(x^-19,1/(x*x*x*x*x*x*x*x*x*x*x*x*x*x*x*x*x*x*x))",T(12.34),T(0.0),T(1.0)),
  1383. test_xy<T>("equal(x^-20,1/(x*x*x*x*x*x*x*x*x*x*x*x*x*x*x*x*x*x*x*x))",T(12.34),T(0.0),T(1.0)),
  1384. test_xy<T>("equal(x^-21,1/(x*x*x*x*x*x*x*x*x*x*x*x*x*x*x*x*x*x*x*x*x))",T(12.34),T(0.0),T(1.0)),
  1385. test_xy<T>("equal(x^-22,1/(x*x*x*x*x*x*x*x*x*x*x*x*x*x*x*x*x*x*x*x*x*x))",T(12.34),T(0.0),T(1.0)),
  1386. test_xy<T>("equal(x^-23,1/(x*x*x*x*x*x*x*x*x*x*x*x*x*x*x*x*x*x*x*x*x*x*x))",T(12.34),T(0.0),T(1.0)),
  1387. test_xy<T>("equal(x^-24,1/(x*x*x*x*x*x*x*x*x*x*x*x*x*x*x*x*x*x*x*x*x*x*x*x))",T(12.34),T(0.0),T(1.0)),
  1388. test_xy<T>("equal(x^-25,1/(x*x*x*x*x*x*x*x*x*x*x*x*x*x*x*x*x*x*x*x*x*x*x*x*x))",T(12.34),T(0.0),T(1.0)),
  1389. test_xy<T>("equal( y^-0,1/1)",T(0.0),T(12.34),T(1.0)),
  1390. test_xy<T>("equal( y^-1,1/(y))",T(0.0),T(12.34),T(1.0)),
  1391. test_xy<T>("equal( y^-2,1/(y*y))",T(0.0),T(12.34),T(1.0)),
  1392. test_xy<T>("equal( y^-3,1/(y*y*y))",T(0.0),T(12.34),T(1.0)),
  1393. test_xy<T>("equal( y^-4,1/(y*y*y*y))",T(0.0),T(12.34),T(1.0)),
  1394. test_xy<T>("equal( y^-5,1/(y*y*y*y*y))",T(0.0),T(12.34),T(1.0)),
  1395. test_xy<T>("equal( y^-6,1/(y*y*y*y*y*y))",T(0.0),T(12.34),T(1.0)),
  1396. test_xy<T>("equal( y^-7,1/(y*y*y*y*y*y*y))",T(0.0),T(12.34),T(1.0)),
  1397. test_xy<T>("equal( y^-8,1/(y*y*y*y*y*y*y*y))",T(0.0),T(12.34),T(1.0)),
  1398. test_xy<T>("equal( y^-9,1/(y*y*y*y*y*y*y*y*y))",T(0.0),T(12.34),T(1.0)),
  1399. test_xy<T>("equal(y^-10,1/(y*y*y*y*y*y*y*y*y*y))",T(0.0),T(12.34),T(1.0)),
  1400. test_xy<T>("equal(y^-11,1/(y*y*y*y*y*y*y*y*y*y*y))",T(0.0),T(12.34),T(1.0)),
  1401. test_xy<T>("equal(y^-12,1/(y*y*y*y*y*y*y*y*y*y*y*y))",T(0.0),T(12.34),T(1.0)),
  1402. test_xy<T>("equal(y^-13,1/(y*y*y*y*y*y*y*y*y*y*y*y*y))",T(0.0),T(12.34),T(1.0)),
  1403. test_xy<T>("equal(y^-14,1/(y*y*y*y*y*y*y*y*y*y*y*y*y*y))",T(0.0),T(12.34),T(1.0)),
  1404. test_xy<T>("equal(y^-15,1/(y*y*y*y*y*y*y*y*y*y*y*y*y*y*y))",T(0.0),T(12.34),T(1.0)),
  1405. test_xy<T>("equal(y^-16,1/(y*y*y*y*y*y*y*y*y*y*y*y*y*y*y*y))",T(0.0),T(12.34),T(1.0)),
  1406. test_xy<T>("equal(y^-17,1/(y*y*y*y*y*y*y*y*y*y*y*y*y*y*y*y*y))",T(0.0),T(12.34),T(1.0)),
  1407. test_xy<T>("equal(y^-18,1/(y*y*y*y*y*y*y*y*y*y*y*y*y*y*y*y*y*y))",T(0.0),T(12.34),T(1.0)),
  1408. test_xy<T>("equal(y^-19,1/(y*y*y*y*y*y*y*y*y*y*y*y*y*y*y*y*y*y*y))",T(0.0),T(12.34),T(1.0)),
  1409. test_xy<T>("equal(y^-20,1/(y*y*y*y*y*y*y*y*y*y*y*y*y*y*y*y*y*y*y*y))",T(0.0),T(12.34),T(1.0)),
  1410. test_xy<T>("equal(y^-21,1/(y*y*y*y*y*y*y*y*y*y*y*y*y*y*y*y*y*y*y*y*y))",T(0.0),T(12.34),T(1.0)),
  1411. test_xy<T>("equal(y^-22,1/(y*y*y*y*y*y*y*y*y*y*y*y*y*y*y*y*y*y*y*y*y*y))",T(0.0),T(12.34),T(1.0)),
  1412. test_xy<T>("equal(y^-23,1/(y*y*y*y*y*y*y*y*y*y*y*y*y*y*y*y*y*y*y*y*y*y*y))",T(0.0),T(12.34),T(1.0)),
  1413. test_xy<T>("equal(y^-24,1/(y*y*y*y*y*y*y*y*y*y*y*y*y*y*y*y*y*y*y*y*y*y*y*y))",T(0.0),T(12.34),T(1.0)),
  1414. test_xy<T>("equal(y^-25,1/(y*y*y*y*y*y*y*y*y*y*y*y*y*y*y*y*y*y*y*y*y*y*y*y*y))",T(0.0),T(12.34),T(1.0)),
  1415. test_xy<T>("(2 + x) + 7",T(3.0),T(0.0),T((2.0 + 3.0) + 7.0)),
  1416. test_xy<T>("(2 + x) - 7",T(3.0),T(0.0),T((2.0 + 3.0) - 7.0)),
  1417. test_xy<T>("(2 - x) + 7",T(3.0),T(0.0),T((2.0 - 3.0) + 7.0)),
  1418. test_xy<T>("(2 - x) - 7",T(3.0),T(0.0),T((2.0 - 3.0) - 7.0)),
  1419. test_xy<T>("(2 * x) * 7",T(3.0),T(0.0),T((2.0 * 3.0) * 7.0)),
  1420. test_xy<T>("(2 * x) / 7",T(3.0),T(0.0),T((2.0 * 3.0) / 7.0)),
  1421. test_xy<T>("(2 / x) * 7",T(3.0),T(0.0),T((2.0 / 3.0) * 7.0)),
  1422. test_xy<T>("(2 / x) / 7",T(3.0),T(0.0),T((2.0 / 3.0) / 7.0)),
  1423. test_xy<T>("2 + (x + 7)",T(3.0),T(0.0),T(2.0 + (3.0 + 7.0))),
  1424. test_xy<T>("2 + (x - 7)",T(3.0),T(0.0),T(2.0 + (3.0 - 7.0))),
  1425. test_xy<T>("2 - (x + 7)",T(3.0),T(0.0),T(2.0 - (3.0 + 7.0))),
  1426. test_xy<T>("2 - (x - 7)",T(3.0),T(0.0),T(2.0 - (3.0 - 7.0))),
  1427. test_xy<T>("2 * (x * 7)",T(3.0),T(0.0),T(2.0 * (3.0 * 7.0))),
  1428. test_xy<T>("2 * (x / 7)",T(3.0),T(0.0),T(2.0 * (3.0 / 7.0))),
  1429. test_xy<T>("2 / (x * 7)",T(3.0),T(0.0),T(2.0 / (3.0 * 7.0))),
  1430. test_xy<T>("2 / (x / 7)",T(3.0),T(0.0),T(2.0 / (3.0 / 7.0))),
  1431. test_xy<T>("2 + (7 + x)",T(3.0),T(0.0),T(2.0 + (7.0 + 3.0))),
  1432. test_xy<T>("2 + (7 - x)",T(3.0),T(0.0),T(2.0 + (7.0 - 3.0))),
  1433. test_xy<T>("2 - (7 + x)",T(3.0),T(0.0),T(2.0 - (7.0 + 3.0))),
  1434. test_xy<T>("2 - (7 - x)",T(3.0),T(0.0),T(2.0 - (7.0 - 3.0))),
  1435. test_xy<T>("2 * (7 * x)",T(3.0),T(0.0),T(2.0 * (7.0 * 3.0))),
  1436. test_xy<T>("2 * (7 / x)",T(3.0),T(0.0),T(2.0 * (7.0 / 3.0))),
  1437. test_xy<T>("2 / (7 * x)",T(3.0),T(0.0),T(2.0 / (7.0 * 3.0))),
  1438. test_xy<T>("2 / (7 / x)",T(3.0),T(0.0),T(2.0 / (7.0 / 3.0))),
  1439. test_xy<T>("(x + 2) + 7",T(3.0),T(0.0),T((3.0 + 2.0) + 7.0)),
  1440. test_xy<T>("(x + 2) - 7",T(3.0),T(0.0),T((3.0 + 2.0) - 7.0)),
  1441. test_xy<T>("(x - 2) + 7",T(3.0),T(0.0),T((3.0 - 2.0) + 7.0)),
  1442. test_xy<T>("(x - 2) - 7",T(3.0),T(0.0),T((3.0 - 2.0) - 7.0)),
  1443. test_xy<T>("(x * 2) * 7",T(3.0),T(0.0),T((3.0 * 2.0) * 7.0)),
  1444. test_xy<T>("(x * 2) / 7",T(3.0),T(0.0),T((3.0 * 2.0) / 7.0)),
  1445. test_xy<T>("(x / 2) * 7",T(3.0),T(0.0),T((3.0 / 2.0) * 7.0)),
  1446. test_xy<T>("(x / 2) / 7",T(3.0),T(0.0),T((3.0 / 2.0) / 7.0)),
  1447. test_xy<T>("((2 + x) + (3 + y))",T(7.0),T(9.0),T(((2.0 + 7.0) + (3.0 + 9.0)))),
  1448. test_xy<T>("((2 + x) - (3 + y))",T(7.0),T(9.0),T(((2.0 + 7.0) - (3.0 + 9.0)))),
  1449. test_xy<T>("((2 - x) - (3 - y))",T(7.0),T(9.0),T(((2.0 - 7.0) - (3.0 - 9.0)))),
  1450. test_xy<T>("((2 * x) * (3 * y))",T(7.0),T(9.0),T(((2.0 * 7.0) * (3.0 * 9.0)))),
  1451. test_xy<T>("((x + 2) + (y + 3))",T(7.0),T(9.0),T(((7.0 + 2.0) + (9.0 + 3.0)))),
  1452. test_xy<T>("((x + 2) - (y + 3))",T(7.0),T(9.0),T(((7.0 + 2.0) - (9.0 + 3.0)))),
  1453. test_xy<T>("((x - 2) - (y - 3))",T(7.0),T(9.0),T(((7.0 - 2.0) - (9.0 - 3.0)))),
  1454. test_xy<T>("((2 * x) * (3 * y))",T(7.0),T(9.0),T(((2.0 * 7.0) * (3.0 * 9.0)))),
  1455. test_xy<T>("((2 + x) + (y + 3))",T(7.0),T(9.0),T(((2.0 + 7.0) + (9.0 + 3.0)))),
  1456. test_xy<T>("((2 + x) - (y + 3))",T(7.0),T(9.0),T(((2.0 + 7.0) - (9.0 + 3.0)))),
  1457. test_xy<T>("((2 - x) - (y - 3))",T(7.0),T(9.0),T(((2.0 - 7.0) - (9.0 - 3.0)))),
  1458. test_xy<T>("((2 * x) * (3 * y))",T(7.0),T(9.0),T(((2.0 * 7.0) * (3.0 * 9.0)))),
  1459. test_xy<T>("((x + 2) + (3 + y))",T(7.0),T(9.0),T(((7.0 + 2.0) + (3.0 + 9.0)))),
  1460. test_xy<T>("((x + 2) - (3 + y))",T(7.0),T(9.0),T(((7.0 + 2.0) - (3.0 + 9.0)))),
  1461. test_xy<T>("((x - 2) - (3 - y))",T(7.0),T(9.0),T(((7.0 - 2.0) - (3.0 - 9.0)))),
  1462. test_xy<T>("((2 * x) * (3 * y))",T(7.0),T(9.0),T(((2.0 * 7.0) * (3.0 * 9.0)))),
  1463. test_xy<T>("((2 * x) / (3 * y))",T(7.0),T(9.0),T(((2.0 * 7.0) / (3.0 * 9.0)))),
  1464. test_xy<T>("((2 / x) * (3 / y))",T(7.0),T(9.0),T(((2.0 / 7.0) * (3.0 / 9.0)))),
  1465. test_xy<T>("((2 * x) / (3 / y))",T(7.0),T(9.0),T(((2.0 * 7.0) / (3.0 / 9.0)))),
  1466. test_xy<T>("((2 / x) / (3 * y))",T(7.0),T(9.0),T(((2.0 / 7.0) / (3.0 * 9.0)))),
  1467. test_xy<T>("((x * 2) / (y * 3))",T(7.0),T(9.0),T(((7.0 * 2.0) / (9.0 * 3.0)))),
  1468. test_xy<T>("((x / 2) * (y / 3))",T(7.0),T(9.0),T(((7.0 / 2.0) * (9.0 / 3.0)))),
  1469. test_xy<T>("((x * 2) / (y / 3))",T(7.0),T(9.0),T(((7.0 * 2.0) / (9.0 / 3.0)))),
  1470. test_xy<T>("((x / 2) / (y * 3))",T(7.0),T(9.0),T(((7.0 / 2.0) / (9.0 * 3.0)))),
  1471. test_xy<T>("((2 * x) / (y * 3))",T(7.0),T(9.0),T(((2.0 * 7.0) / (9.0 * 3.0)))),
  1472. test_xy<T>("((2 / x) * (y / 3))",T(7.0),T(9.0),T(((2.0 / 7.0) * (9.0 / 3.0)))),
  1473. test_xy<T>("((2 * x) / (y / 3))",T(7.0),T(9.0),T(((2.0 * 7.0) / (9.0 / 3.0)))),
  1474. test_xy<T>("((2 / x) / (y * 3))",T(7.0),T(9.0),T(((2.0 / 7.0) / (9.0 * 3.0)))),
  1475. test_xy<T>("((x * 2) / (3 * y))",T(7.0),T(9.0),T(((7.0 * 2.0) / (3.0 * 9.0)))),
  1476. test_xy<T>("((x / 2) * (3 / y))",T(7.0),T(9.0),T(((7.0 / 2.0) * (3.0 / 9.0)))),
  1477. test_xy<T>("((x * 2) / (3 / y))",T(7.0),T(9.0),T(((7.0 * 2.0) / (3.0 / 9.0)))),
  1478. test_xy<T>("((x / 2) / (3 * y))",T(7.0),T(9.0),T(((7.0 / 2.0) / (3.0 * 9.0)))),
  1479. test_xy<T>("([(min(x,8) + y) + 3] - 4)",T(7.0),T(9.0),T((((std::min(7.0,8.0) + 9.0) + 3.0) - 4.0))),
  1480. test_xy<T>("([(min(x,8) + y) + 3] + 4)",T(7.0),T(9.0),T((((std::min(7.0,8.0) + 9.0) + 3.0) + 4.0))),
  1481. test_xy<T>("([(min(x,8) + y) + 3] * 4)",T(7.0),T(9.0),T((((std::min(7.0,8.0) + 9.0) + 3.0) * 4.0))),
  1482. test_xy<T>("([(min(x,8) + y) + 3] / 4)",T(7.0),T(9.0),T((((std::min(7.0,8.0) + 9.0) + 3.0) / 4.0))),
  1483. test_xy<T>("([(min(x,8) + y) - 3] - 4)",T(7.0),T(9.0),T((((std::min(7.0,8.0) + 9.0) - 3.0) - 4.0))),
  1484. test_xy<T>("([(min(x,8) + y) - 3] + 4)",T(7.0),T(9.0),T((((std::min(7.0,8.0) + 9.0) - 3.0) + 4.0))),
  1485. test_xy<T>("([(min(x,8) + y) - 3] * 4)",T(7.0),T(9.0),T((((std::min(7.0,8.0) + 9.0) - 3.0) * 4.0))),
  1486. test_xy<T>("([(min(x,8) + y) - 3] / 4)",T(7.0),T(9.0),T((((std::min(7.0,8.0) + 9.0) - 3.0) / 4.0))),
  1487. test_xy<T>("([(min(x,8) + y) * 3] - 4)",T(7.0),T(9.0),T((((std::min(7.0,8.0) + 9.0) * 3.0) - 4.0))),
  1488. test_xy<T>("([(min(x,8) + y) * 3] + 4)",T(7.0),T(9.0),T((((std::min(7.0,8.0) + 9.0) * 3.0) + 4.0))),
  1489. test_xy<T>("([(min(x,8) + y) * 3] * 4)",T(7.0),T(9.0),T((((std::min(7.0,8.0) + 9.0) * 3.0) * 4.0))),
  1490. test_xy<T>("([(min(x,8) + y) * 3] / 4)",T(7.0),T(9.0),T((((std::min(7.0,8.0) + 9.0) * 3.0) / 4.0))),
  1491. test_xy<T>("([(min(x,8) + y) / 3] - 4)",T(7.0),T(9.0),T((((std::min(7.0,8.0) + 9.0) / 3.0) - 4.0))),
  1492. test_xy<T>("([(min(x,8) + y) / 3] + 4)",T(7.0),T(9.0),T((((std::min(7.0,8.0) + 9.0) / 3.0) + 4.0))),
  1493. test_xy<T>("([(min(x,8) + y) / 3] * 4)",T(7.0),T(9.0),T((((std::min(7.0,8.0) + 9.0) / 3.0) * 4.0))),
  1494. test_xy<T>("([(min(x,8) + y) / 3] / 4)",T(7.0),T(9.0),T((((std::min(7.0,8.0) + 9.0) / 3.0) / 4.0))),
  1495. test_xy<T>("(4 - [3 + (min(x,8) + y)])",T(7.0),T(9.0),T((4.0 - (3.0 + (std::min(7.0,8.0) + 9.0))))),
  1496. test_xy<T>("(4 + [3 + (min(x,8) + y)])",T(7.0),T(9.0),T((4.0 + (3.0 + (std::min(7.0,8.0) + 9.0))))),
  1497. test_xy<T>("(4 * [3 + (min(x,8) + y)])",T(7.0),T(9.0),T((4.0 * (3.0 + (std::min(7.0,8.0) + 9.0))))),
  1498. test_xy<T>("(4 / [3 + (min(x,8) + y)])",T(7.0),T(9.0),T((4.0 / (3.0 + (std::min(7.0,8.0) + 9.0))))),
  1499. test_xy<T>("(4 - [3 - (min(x,8) + y)])",T(7.0),T(9.0),T((4.0 - (3.0 - (std::min(7.0,8.0) + 9.0))))),
  1500. test_xy<T>("(4 + [3 - (min(x,8) + y)])",T(7.0),T(9.0),T((4.0 + (3.0 - (std::min(7.0,8.0) + 9.0))))),
  1501. test_xy<T>("(4 * [3 - (min(x,8) + y)])",T(7.0),T(9.0),T((4.0 * (3.0 - (std::min(7.0,8.0) + 9.0))))),
  1502. test_xy<T>("(4 / [3 - (min(x,8) + y)])",T(7.0),T(9.0),T((4.0 / (3.0 - (std::min(7.0,8.0) + 9.0))))),
  1503. test_xy<T>("(4 - [3 * (min(x,8) + y)])",T(7.0),T(9.0),T((4.0 - (3.0 * (std::min(7.0,8.0) + 9.0))))),
  1504. test_xy<T>("(4 + [3 * (min(x,8) + y)])",T(7.0),T(9.0),T((4.0 + (3.0 * (std::min(7.0,8.0) + 9.0))))),
  1505. test_xy<T>("(4 * [3 * (min(x,8) + y)])",T(7.0),T(9.0),T((4.0 * (3.0 * (std::min(7.0,8.0) + 9.0))))),
  1506. test_xy<T>("(4 / [3 * (min(x,8) + y)])",T(7.0),T(9.0),T((4.0 / (3.0 * (std::min(7.0,8.0) + 9.0))))),
  1507. test_xy<T>("(4 - [3 / (min(x,8) + y)])",T(7.0),T(9.0),T((4.0 - (3.0 / (std::min(7.0,8.0) + 9.0))))),
  1508. test_xy<T>("(4 + [3 / (min(x,8) + y)])",T(7.0),T(9.0),T((4.0 + (3.0 / (std::min(7.0,8.0) + 9.0))))),
  1509. test_xy<T>("(4 * [3 / (min(x,8) + y)])",T(7.0),T(9.0),T((4.0 * (3.0 / (std::min(7.0,8.0) + 9.0))))),
  1510. test_xy<T>("(4 / [3 / (min(x,8) + y)])",T(7.0),T(9.0),T((4.0 / (3.0 / (std::min(7.0,8.0) + 9.0))))),
  1511. test_xy<T>("((2 * x) + (2 * y))",T(7.0),T(9.0),T(((2.0 * 7.0) + (2.0 * 9.0)))),
  1512. test_xy<T>("((2 * x) - (2 * y))",T(7.0),T(9.0),T(((2.0 * 7.0) - (2.0 * 9.0)))),
  1513. test_xy<T>("((2 * x) + (y * 2))",T(7.0),T(9.0),T(((2.0 * 7.0) + (9.0 * 2.0)))),
  1514. test_xy<T>("((x * 2) - (y * 2))",T(7.0),T(9.0),T(((7.0 * 2.0) - (9.0 * 2.0)))),
  1515. test_xy<T>("0 * (abs (x) + acos (y) + asin (x) + atan (y))",T(1.0),T(1.0),T(0.0)),
  1516. test_xy<T>("0 * (ceil (x) + cos (y) + cosh (x) + exp (y))",T(1.0),T(1.0),T(0.0)),
  1517. test_xy<T>("0 * (floor(x) + log (y) + log10(x) + round(y))",T(1.0),T(1.0),T(0.0)),
  1518. test_xy<T>("0 * (sin (x) + sinh (y) + sqrt (x) + tan (y))",T(1.0),T(1.0),T(0.0)),
  1519. test_xy<T>("0 * (sec (x) + csc (y) + tanh (x) + cot (y))",T(1.0),T(1.0),T(0.0)),
  1520. test_xy<T>("0 * (erf (x) + erfc (y) + sgn (y) + frac (y))",T(1.0),T(1.0),T(0.0)),
  1521. test_xy<T>("0 * (log1p(x) + expm1(y) + acosh(x) + asinh(y))",T(1.0),T(1.0),T(0.0)),
  1522. test_xy<T>("0 * (deg2grad(x) + grad2deg(y) + rad2deg(x) + deg2rad(y))",T(1.0),T(1.0),T(0.0)),
  1523. test_xy<T>("switch { case (x <= y) : (y - x); default: 1.12345; }",T(1.0),T(2.0),T(1.0)),
  1524. test_xy<T>("switch { case (x > y) : 0; case (x <= y) : (y - x); default: 1.12345; }",T(1.0),T(2.0),T(1.0)),
  1525. test_xy<T>("switch { case (x <= y) : switch { case (x <= y) : (y - x); default: 1.12345; }; default: 1.12345; }",T(1.0),T(2.0),T(1.0)),
  1526. test_xy<T>("switch { case [x <= y] : [y - x]; default: 1.12345; }",T(1.0),T(2.0),T(1.0)),
  1527. test_xy<T>("switch { case [x > y] : 0; case [x <= y] : [y - x]; default: 1.12345; }",T(1.0),T(2.0),T(1.0)),
  1528. test_xy<T>("switch { case [x <= y] : switch { case [x <= y] : {y - x}; default: 1.12345; }; default: 1.12345; }",T(1.0),T(2.0),T(1.0)),
  1529. test_xy<T>("switch { case {x <= y} : x; default: 1.12345; }",T(1.0),T(2.0),T(1.0)),
  1530. test_xy<T>("switch { case {x > y} : 0; case {x <= y} : {y - x}; default: 1.12345; }",T(1.0),T(2.0),T(1.0)),
  1531. test_xy<T>("switch { case {x <= y} : switch { case {x <= y} : x; default: 1.12345; }; default: 1.12345; }",T(1.0),T(2.0),T(1.0)),
  1532. test_xy<T>("switch { case [(x <= y)] : {y - x}; default: 1.12345; }",T(1.0),T(2.0),T(1.0)),
  1533. test_xy<T>("switch { case ([x > y]) : [0]; case ([x <= y]) : [y - x]; default: 1.12345; }",T(1.0),T(2.0),T(1.0)),
  1534. test_xy<T>("switch { case {(x <= y)} : switch { case ({x <= y}) : x; default: 1.12345; }; default: 1.12345; }",T(1.0),T(2.0),T(1.0)),
  1535. test_xy<T>("[*]{ case x < y : x + y; case y < x : y - x; }",T(2.0),T(3.0),T(5.0)),
  1536. test_xy<T>("[*]{ case x > y : x + y; case y > x : y - x; }",T(2.0),T(3.0),T(1.0)),
  1537. test_xy<T>("[*]{ case x > y : x - y; case y < x : y + x; }",T(2.0),T(3.0),T(0.0)),
  1538. test_xy<T>("0 ? x : y" ,T(1.0),T(2.0),T( 2.0)),
  1539. test_xy<T>("1 ? x : y" ,T(1.0),T(2.0),T( 1.0)),
  1540. test_xy<T>("x ? x : y" ,T(1.0),T(2.0),T( 1.0)),
  1541. test_xy<T>("x ? x : y" ,T(0.0),T(2.0),T( 2.0)),
  1542. test_xy<T>("(x + y < 4) ? 1 : 2" ,T(1.0),T(2.0),T( 1.0)),
  1543. test_xy<T>("(x + y > 4) ? 1 : 2" ,T(1.0),T(2.0),T( 2.0)),
  1544. test_xy<T>("x < y ? x + y : x - y" ,T(1.0),T(2.0),T( 3.0)),
  1545. test_xy<T>("x > y ? x + y : x - y" ,T(1.0),T(2.0),T(-1.0)),
  1546. test_xy<T>("(x + x < y ? 7 : 9) == 7" ,T(1.0),T(3.0),T( 1.0)),
  1547. test_xy<T>("(x + x < y + y ? 7 : 9) == 7" ,T(1.0),T(3.0),T( 1.0)),
  1548. test_xy<T>("(x > y + y ? 7 : 9) == 9" ,T(1.0),T(3.0),T( 1.0)),
  1549. test_xy<T>("(x + x > y ? 7 : 9) == 9" ,T(1.0),T(3.0),T( 1.0)),
  1550. test_xy<T>("(x + x > y + 3 ? 7 : 9) == 9" ,T(1.0),T(3.0),T( 1.0)),
  1551. test_xy<T>("(x < (y + y) ? 7 : 9) == 7" ,T(1.0),T(3.0),T( 1.0)),
  1552. test_xy<T>("((x + x) < y ? 7 : 9) == 7" ,T(1.0),T(3.0),T( 1.0)),
  1553. test_xy<T>("((x + x) < (y + y) ? 7 : 9) == 7",T(1.0),T(3.0),T( 1.0)),
  1554. test_xy<T>("(x += 2 ) == 3 " ,T(1),T(3),T(1)),
  1555. test_xy<T>("(x += 2y) == 7 " ,T(1),T(3),T(1)),
  1556. test_xy<T>("(x -= 2 ) == -1 " ,T(1),T(3),T(1)),
  1557. test_xy<T>("(x -= 2y) == -5 " ,T(1),T(3),T(1)),
  1558. test_xy<T>("(x *= 2 ) == 2 " ,T(1),T(3),T(1)),
  1559. test_xy<T>("(x *= 2y) == 6 " ,T(1),T(3),T(1)),
  1560. test_xy<T>("(x /= 2 ) == (1/2)" ,T(1),T(3),T(1)),
  1561. test_xy<T>("(x /= 2y) == (1/6)" ,T(1),T(3),T(1)),
  1562. test_xy<T>("for(var i := 0; (i < 10);) { i += 1; }; x;" ,T(1),T(20),T( 1)),
  1563. test_xy<T>("for(var i := 0; (i < 10) and (i != y); i+=2) { x += i; }; x;" ,T(1),T(20),T(21)),
  1564. test_xy<T>("for(var i := 0; (i < 10) and (i != y);) { x += i; i+=2; }; x;",T(1),T(20),T(21)),
  1565. test_xy<T>("for(var i := 0; (i < y); i += 1) { if (i <= (y / 2)) x += i; else break; }; x;" ,T(0),T(10),T(15)),
  1566. test_xy<T>("for(var i := 0; (i < y); i += 1) { if (i <= (y / 2)) continue; else x += i; }; x;" ,T(0),T(10),T(30)),
  1567. test_xy<T>("var a := 2; (0 * a) == 0",T(0),T(0),T(1)),
  1568. test_xy<T>("var a := 2; (0 / a) == 0",T(0),T(0),T(1)),
  1569. test_xy<T>("var a := 2; (a * 0) == 0",T(0),T(0),T(1)),
  1570. test_xy<T>("var a := 2; (a / 1) == a",T(0),T(0),T(1)),
  1571. test_xy<T>("var a := 2; (0 + a) == a",T(0),T(0),T(1)),
  1572. test_xy<T>("var a := 2; (a + 0) == a",T(0),T(0),T(1)),
  1573. test_xy<T>("var a := 2; (1 * a) == a",T(0),T(0),T(1)),
  1574. test_xy<T>("var a.b := 3; (2 * a.b ) == 6",T(0),T(0),T(1)),
  1575. test_xy<T>("var aa.bb := 3; (2 * aa.bb ) == 6",T(0),T(0),T(1)),
  1576. test_xy<T>("var aaa.bbb := 3; (2 * aAa.BbB) == 6",T(0),T(0),T(1)),
  1577. test_xy<T>("var a1.b2 := 3; (2 * a1.b2 ) == 6",T(0),T(0),T(1))
  1578. };
  1579. static const std::size_t test_list_size = sizeof(test_list) / sizeof(test_xy<T>);
  1580. const std::size_t rounds = 60;
  1581. for (std::size_t r = 0; r < rounds; ++r)
  1582. {
  1583. bool loop_result = true;
  1584. for (std::size_t i = 0; i < test_list_size; ++i)
  1585. {
  1586. test_xy<T>& test = const_cast<test_xy<T>&>(test_list[i]);
  1587. T x = test.x;
  1588. T y = test.y;
  1589. exprtk::symbol_table<T> symbol_table;
  1590. symbol_table.add_variable("x",x);
  1591. symbol_table.add_variable("y",y);
  1592. exprtk::expression<T> expression;
  1593. expression.register_symbol_table(symbol_table);
  1594. {
  1595. exprtk::parser<T> parser;
  1596. if (!parser.compile(test.expr,expression))
  1597. {
  1598. printf("run_test01() - Error: %s Expression: %s\n",
  1599. parser.error().c_str(),
  1600. test.expr.c_str());
  1601. loop_result = false;
  1602. continue;
  1603. }
  1604. }
  1605. T result = expression.value();
  1606. if (not_equal(result,test.result))
  1607. {
  1608. printf("run_test01() - Computation Error: Expression: [%s]\tExpected: %19.15f\tResult: %19.15f\n",
  1609. test.expr.c_str(),
  1610. (double)test.result,
  1611. (double)result);
  1612. loop_result = false;
  1613. }
  1614. }
  1615. if (!loop_result)
  1616. {
  1617. return false;
  1618. }
  1619. }
  1620. }
  1621. {
  1622. static const test_xyzw<T> test_list[] =
  1623. {
  1624. test_xyzw<T>("((x / y) / z )",T(7.0),T(9.0),T(3.0),T(0.0),T(((7.0 / 9.0) / 3.0 ))),
  1625. test_xyzw<T>("((x / y) / 2 )",T(7.0),T(9.0),T(3.0),T(0.0),T(((7.0 / 9.0) / 2.0 ))),
  1626. test_xyzw<T>("((x / 2) / y )",T(7.0),T(9.0),T(3.0),T(0.0),T(((7.0 / 2.0) / 9.0 ))),
  1627. test_xyzw<T>("((2 / x) / y )",T(7.0),T(9.0),T(3.0),T(0.0),T(((2.0 / 7.0) / 9.0 ))),
  1628. test_xyzw<T>("( x / (y / z))",T(7.0),T(9.0),T(3.0),T(0.0),T(( 7.0 / (9.0 / 3.0)))),
  1629. test_xyzw<T>("( x / (y / 2))",T(7.0),T(9.0),T(3.0),T(0.0),T(( 7.0 / (9.0 / 2.0)))),
  1630. test_xyzw<T>("( x / (2 / y))",T(7.0),T(9.0),T(3.0),T(0.0),T(( 7.0 / (2.0 / 9.0)))),
  1631. test_xyzw<T>("( 2 / (x / y))",T(7.0),T(9.0),T(3.0),T(0.0),T(( 2.0 / (7.0 / 9.0)))),
  1632. test_xyzw<T>("([(min(x,y) + z) + 3] - 4)",T(5.0),T(7.0),T(9.0),T(0.0),T((((std::min(5.0,7.0) + 9.0) + 3.0) - 4.0))),
  1633. test_xyzw<T>("([(min(x,y) + z) + 3] + 4)",T(5.0),T(7.0),T(9.0),T(0.0),T((((std::min(5.0,7.0) + 9.0) + 3.0) + 4.0))),
  1634. test_xyzw<T>("([(min(x,y) + z) + 3] * 4)",T(5.0),T(7.0),T(9.0),T(0.0),T((((std::min(5.0,7.0) + 9.0) + 3.0) * 4.0))),
  1635. test_xyzw<T>("([(min(x,y) + z) + 3] / 4)",T(5.0),T(7.0),T(9.0),T(0.0),T((((std::min(5.0,7.0) + 9.0) + 3.0) / 4.0))),
  1636. test_xyzw<T>("([(min(x,y) + z) - 3] - 4)",T(5.0),T(7.0),T(9.0),T(0.0),T((((std::min(5.0,7.0) + 9.0) - 3.0) - 4.0))),
  1637. test_xyzw<T>("([(min(x,y) + z) - 3] + 4)",T(5.0),T(7.0),T(9.0),T(0.0),T((((std::min(5.0,7.0) + 9.0) - 3.0) + 4.0))),
  1638. test_xyzw<T>("([(min(x,y) + z) - 3] * 4)",T(5.0),T(7.0),T(9.0),T(0.0),T((((std::min(5.0,7.0) + 9.0) - 3.0) * 4.0))),
  1639. test_xyzw<T>("([(min(x,y) + z) - 3] / 4)",T(5.0),T(7.0),T(9.0),T(0.0),T((((std::min(5.0,7.0) + 9.0) - 3.0) / 4.0))),
  1640. test_xyzw<T>("([(min(x,y) + z) * 3] - 4)",T(5.0),T(7.0),T(9.0),T(0.0),T((((std::min(5.0,7.0) + 9.0) * 3.0) - 4.0))),
  1641. test_xyzw<T>("([(min(x,y) + z) * 3] + 4)",T(5.0),T(7.0),T(9.0),T(0.0),T((((std::min(5.0,7.0) + 9.0) * 3.0) + 4.0))),
  1642. test_xyzw<T>("([(min(x,y) + z) * 3] * 4)",T(5.0),T(7.0),T(9.0),T(0.0),T((((std::min(5.0,7.0) + 9.0) * 3.0) * 4.0))),
  1643. test_xyzw<T>("([(min(x,y) + z) * 3] / 4)",T(5.0),T(7.0),T(9.0),T(0.0),T((((std::min(5.0,7.0) + 9.0) * 3.0) / 4.0))),
  1644. test_xyzw<T>("([(min(x,y) + z) / 3] - 4)",T(5.0),T(7.0),T(9.0),T(0.0),T((((std::min(5.0,7.0) + 9.0) / 3.0) - 4.0))),
  1645. test_xyzw<T>("([(min(x,y) + z) / 3] + 4)",T(5.0),T(7.0),T(9.0),T(0.0),T((((std::min(5.0,7.0) + 9.0) / 3.0) + 4.0))),
  1646. test_xyzw<T>("([(min(x,y) + z) / 3] * 4)",T(5.0),T(7.0),T(9.0),T(0.0),T((((std::min(5.0,7.0) + 9.0) / 3.0) * 4.0))),
  1647. test_xyzw<T>("([(min(x,y) + z) / 3] / 4)",T(5.0),T(7.0),T(9.0),T(0.0),T((((std::min(5.0,7.0) + 9.0) / 3.0) / 4.0))),
  1648. test_xyzw<T>("(4 - [3 + (min(x,y) + z)])",T(5.0),T(7.0),T(9.0),T(0.0),T((4.0 - (3.0 + (std::min(5.0,7.0) + 9.0))))),
  1649. test_xyzw<T>("(4 + [3 + (min(x,y) + z)])",T(5.0),T(7.0),T(9.0),T(0.0),T((4.0 + (3.0 + (std::min(5.0,7.0) + 9.0))))),
  1650. test_xyzw<T>("(4 * [3 + (min(x,y) + z)])",T(5.0),T(7.0),T(9.0),T(0.0),T((4.0 * (3.0 + (std::min(5.0,7.0) + 9.0))))),
  1651. test_xyzw<T>("(4 / [3 + (min(x,y) + z)])",T(5.0),T(7.0),T(9.0),T(0.0),T((4.0 / (3.0 + (std::min(5.0,7.0) + 9.0))))),
  1652. test_xyzw<T>("(4 - [3 - (min(x,y) + z)])",T(5.0),T(7.0),T(9.0),T(0.0),T((4.0 - (3.0 - (std::min(5.0,7.0) + 9.0))))),
  1653. test_xyzw<T>("(4 + [3 - (min(x,y) + z)])",T(5.0),T(7.0),T(9.0),T(0.0),T((4.0 + (3.0 - (std::min(5.0,7.0) + 9.0))))),
  1654. test_xyzw<T>("(4 * [3 - (min(x,y) + z)])",T(5.0),T(7.0),T(9.0),T(0.0),T((4.0 * (3.0 - (std::min(5.0,7.0) + 9.0))))),
  1655. test_xyzw<T>("(4 / [3 - (min(x,y) + z)])",T(5.0),T(7.0),T(9.0),T(0.0),T((4.0 / (3.0 - (std::min(5.0,7.0) + 9.0))))),
  1656. test_xyzw<T>("(4 - [3 * (min(x,y) + z)])",T(5.0),T(7.0),T(9.0),T(0.0),T((4.0 - (3.0 * (std::min(5.0,7.0) + 9.0))))),
  1657. test_xyzw<T>("(4 + [3 * (min(x,y) + z)])",T(5.0),T(7.0),T(9.0),T(0.0),T((4.0 + (3.0 * (std::min(5.0,7.0) + 9.0))))),
  1658. test_xyzw<T>("(4 * [3 * (min(x,y) + z)])",T(5.0),T(7.0),T(9.0),T(0.0),T((4.0 * (3.0 * (std::min(5.0,7.0) + 9.0))))),
  1659. test_xyzw<T>("(4 / [3 * (min(x,y) + z)])",T(5.0),T(7.0),T(9.0),T(0.0),T((4.0 / (3.0 * (std::min(5.0,7.0) + 9.0))))),
  1660. test_xyzw<T>("(4 - [3 / (min(x,y) + z)])",T(5.0),T(7.0),T(9.0),T(0.0),T((4.0 - (3.0 / (std::min(5.0,7.0) + 9.0))))),
  1661. test_xyzw<T>("(4 + [3 / (min(x,y) + z)])",T(5.0),T(7.0),T(9.0),T(0.0),T((4.0 + (3.0 / (std::min(5.0,7.0) + 9.0))))),
  1662. test_xyzw<T>("(4 * [3 / (min(x,y) + z)])",T(5.0),T(7.0),T(9.0),T(0.0),T((4.0 * (3.0 / (std::min(5.0,7.0) + 9.0))))),
  1663. test_xyzw<T>("(4 / [3 / (min(x,y) + z)])",T(5.0),T(7.0),T(9.0),T(0.0),T((4.0 / (3.0 / (std::min(5.0,7.0) + 9.0))))),
  1664. test_xyzw<T>("if (x < y) { z+2; z;} == z" ,T(1.0),T(2.0),T(3.0),T(4.0),T(1.0)),
  1665. test_xyzw<T>("if (x > y) { z+2; z;} == null" ,T(1.0),T(2.0),T(3.0),T(4.0),T(1.0)),
  1666. test_xyzw<T>("if (x < y) { z+2; z;} else w; == z" ,T(1.0),T(2.0),T(3.0),T(4.0),T(1.0)),
  1667. test_xyzw<T>("if (x > y) { z+2; z;} else 1 + w; == (w + 1)" ,T(1.0),T(2.0),T(3.0),T(4.0),T(1.0)),
  1668. test_xyzw<T>("if (x < y) { z+2; z;} else {1+2; w;} == z" ,T(1.0),T(2.0),T(3.0),T(4.0),T(1.0)),
  1669. test_xyzw<T>("if (x > y) { z+2; z;} else {1+2; w;} == w" ,T(1.0),T(2.0),T(3.0),T(4.0),T(1.0)),
  1670. test_xyzw<T>("if (x < y) { z+2; z;} else if (x < y) w; == z" ,T(1.0),T(2.0),T(3.0),T(4.0),T(1.0)),
  1671. test_xyzw<T>("if (x > y) { z+2; z;} else if (x < y) 1 + w; == w + 1" ,T(1.0),T(2.0),T(3.0),T(4.0),T(1.0)),
  1672. test_xyzw<T>("if (x > y) { z+2; z;} else if (x > y) w; == null" ,T(1.0),T(2.0),T(3.0),T(4.0),T(1.0)),
  1673. test_xyzw<T>("if (x < y) { z+2; z;} else if (x < y) {w+2; w;} == z" ,T(1.0),T(2.0),T(3.0),T(4.0),T(1.0)),
  1674. test_xyzw<T>("if (x > y) { z+2; z;} else if (x < y) {w+2; w;} == w" ,T(1.0),T(2.0),T(3.0),T(4.0),T(1.0)),
  1675. test_xyzw<T>("if (x > y) { z+2; z;} else if (x > y) {w+2; w;} == null",T(1.0),T(2.0),T(3.0),T(4.0),T(1.0))
  1676. };
  1677. static const std::size_t test_list_size = sizeof(test_list) / sizeof(test_xyzw<T>);
  1678. const std::size_t rounds = 60;
  1679. for (std::size_t r = 0; r < rounds; ++r)
  1680. {
  1681. bool loop_result = true;
  1682. for (std::size_t i = 0; i < test_list_size; ++i)
  1683. {
  1684. test_xyzw<T>& test = const_cast<test_xyzw<T>&>(test_list[i]);
  1685. exprtk::symbol_table<T> symbol_table;
  1686. symbol_table.add_variable("x",test.x);
  1687. symbol_table.add_variable("y",test.y);
  1688. symbol_table.add_variable("z",test.z);
  1689. symbol_table.add_variable("w",test.w);
  1690. exprtk::expression<T> expression;
  1691. expression.register_symbol_table(symbol_table);
  1692. {
  1693. exprtk::parser<T> parser;
  1694. if (!parser.compile(test.expr,expression))
  1695. {
  1696. printf("run_test01() - Error: %s Expression: %s\n",
  1697. parser.error().c_str(),
  1698. test.expr.c_str());
  1699. loop_result = false;
  1700. continue;
  1701. }
  1702. }
  1703. T result = expression.value();
  1704. if (not_equal(result,test.result))
  1705. {
  1706. printf("run_test01() - Computation Error: Expression: [%s]\tExpected: %19.15f\tResult: %19.15f\n",
  1707. test.expr.c_str(),
  1708. (double)test.result,
  1709. (double)result);
  1710. loop_result = false;
  1711. }
  1712. }
  1713. if (!loop_result)
  1714. {
  1715. return false;
  1716. }
  1717. }
  1718. }
  1719. {
  1720. const std::string expr_list[] =
  1721. {
  1722. "((v[1] + x) == (x + v[1]))",
  1723. "((v[0] += x) == x)",
  1724. "((v[0] += x + y) == (x + y))",
  1725. "((v[0] -= x) == -x)",
  1726. "((v[0] -= (x + y)) == -(x + y))",
  1727. "((v[1] + v[2]) == (v[3 - 1] + v[2 * 1/2]))",
  1728. "(v[v[1]] == v[1])",
  1729. "(v[1] += v[1]) == v[1 + 1]",
  1730. "((v[i[1]] + x) == (x + v[i[1]]))",
  1731. "((v[i[0]] += x) == x)",
  1732. "((v[i[0]] += x + y) == (x + y))",
  1733. "((v[i[0]] -= x) == -x)",
  1734. "((v[i[0]] -= (x + y)) == -(x + y))",
  1735. "((v[i[1]] + v[2]) == (v[i[3] - i[1]] + v[i[2] * 1/2]))",
  1736. "(v[v[i[1]]] == v[i[1]])",
  1737. "(v[i[1]] += v[i[1]]) == v[i[1] + 1]"
  1738. };
  1739. const std::size_t expr_list_size = sizeof(expr_list) / sizeof(std::string);
  1740. const std::size_t rounds = 60;
  1741. for (std::size_t r = 0; r < rounds; ++r)
  1742. {
  1743. bool loop_result = true;
  1744. for (std::size_t i = 0; i < expr_list_size; ++i)
  1745. {
  1746. T v[] = { T(0.0), T(1.1), T(2.2), T(3.3), T(4.4), T(5.5) };
  1747. T index[] = { T(0) , T(1) , T(2) , T(3) , T(4) , T(5) };
  1748. T x = T(6.6);
  1749. T y = T(7.7);
  1750. T z = T(8.8);
  1751. exprtk::symbol_table<T> symbol_table;
  1752. symbol_table.add_variable("x",x);
  1753. symbol_table.add_variable("y",y);
  1754. symbol_table.add_variable("z",z);
  1755. symbol_table.add_vector ("v",v);
  1756. symbol_table.add_vector ("i",index);
  1757. exprtk::expression<T> expression;
  1758. expression.register_symbol_table(symbol_table);
  1759. {
  1760. exprtk::parser<T> parser;
  1761. if (!parser.compile(expr_list[i],expression))
  1762. {
  1763. printf("run_test01() - Error: %s Expression: %s\n",
  1764. parser.error().c_str(),
  1765. expr_list[i].c_str());
  1766. loop_result = false;
  1767. continue;
  1768. }
  1769. }
  1770. T result = expression.value();
  1771. if (not_equal(result,T(1)))
  1772. {
  1773. printf("run_test01() - Computation Error: Expression: [%s]\tExpected: %19.15f\tResult: %19.15f\n",
  1774. expr_list[i].c_str(),
  1775. (double)1.0,
  1776. (double)result);
  1777. loop_result = false;
  1778. }
  1779. }
  1780. if (!loop_result)
  1781. {
  1782. return false;
  1783. }
  1784. }
  1785. for (std::size_t r = 0; r < rounds; ++r)
  1786. {
  1787. bool loop_result = true;
  1788. for (std::size_t i = 0; i < expr_list_size; ++i)
  1789. {
  1790. T v_[] = { T(0.0), T(1.1), T(2.2), T(3.3), T(4.4), T(5.5) };
  1791. T index_[] = { T(0) , T(1) , T(2) , T(3) , T(4) , T(5) };
  1792. T x = T(6.6);
  1793. T y = T(7.7);
  1794. T z = T(8.8);
  1795. exprtk::vector_view<T> v = exprtk::make_vector_view(v_ ,6);
  1796. exprtk::vector_view<T> index = exprtk::make_vector_view(index_,6);
  1797. exprtk::symbol_table<T> symbol_table;
  1798. symbol_table.add_variable("x",x);
  1799. symbol_table.add_variable("y",y);
  1800. symbol_table.add_variable("z",z);
  1801. symbol_table.add_vector ("v",v);
  1802. symbol_table.add_vector ("i",index);
  1803. exprtk::expression<T> expression;
  1804. expression.register_symbol_table(symbol_table);
  1805. {
  1806. exprtk::parser<T> parser;
  1807. if (!parser.compile(expr_list[i],expression))
  1808. {
  1809. printf("run_test01() - Error: %s Expression: %s\n",
  1810. parser.error().c_str(),
  1811. expr_list[i].c_str());
  1812. loop_result = false;
  1813. continue;
  1814. }
  1815. }
  1816. T result = expression.value();
  1817. if (not_equal(result,T(1)))
  1818. {
  1819. printf("run_test01() - Computation Error: Expression: [%s]\tExpected: %19.15f\tResult: %19.15f\n",
  1820. expr_list[i].c_str(),
  1821. (double)1.0,
  1822. (double)result);
  1823. loop_result = false;
  1824. }
  1825. }
  1826. if (!loop_result)
  1827. {
  1828. return false;
  1829. }
  1830. }
  1831. }
  1832. return true;
  1833. }
  1834. template <typename T>
  1835. struct test_ab
  1836. {
  1837. test_ab(const std::string& e, const std::string& v0, const std::string& v1, const T& r)
  1838. : expr(e),
  1839. a(v0),
  1840. b(v1),
  1841. c("ccc"),
  1842. result(r)
  1843. {}
  1844. std::string expr;
  1845. std::string a;
  1846. std::string b;
  1847. std::string c;
  1848. T result;
  1849. };
  1850. template <typename T>
  1851. inline bool run_test02()
  1852. {
  1853. static const test_ab<T> test_list[] =
  1854. {
  1855. test_ab<T>("'aaa' == 'aaa'" ,"","",T(1.0)),
  1856. test_ab<T>("'aaa' < 'bbb'" ,"","",T(1.0)),
  1857. test_ab<T>("'aaa' <= 'bbb'" ,"","",T(1.0)),
  1858. test_ab<T>("'bbb' > 'aaa'" ,"","",T(1.0)),
  1859. test_ab<T>("'bbb' >= 'aaa'" ,"","",T(1.0)),
  1860. test_ab<T>("'aaa' != 'aaa'" ,"","",T(0.0)),
  1861. test_ab<T>("'aaa' != 'bbb'" ,"","",T(1.0)),
  1862. test_ab<T>("'aaa' + '123' == 'aaa123'" ,"","",T(1.0)),
  1863. test_ab<T>("'aaa123' == 'aaa' + '123'" ,"","",T(1.0)),
  1864. test_ab<T>("('aaa' + '123') == 'aaa123'" ,"","",T(1.0)),
  1865. test_ab<T>("'aaa123' == ('aaa' + '123')" ,"","",T(1.0)),
  1866. test_ab<T>("'aaa' in 'aaa123'" ,"","",T(1.0)),
  1867. test_ab<T>("'123' in 'aaa123'" ,"","",T(1.0)),
  1868. test_ab<T>("'a123b' like '*123*'" ,"","",T(1.0)),
  1869. test_ab<T>("'a123b' like '*123?'" ,"","",T(1.0)),
  1870. test_ab<T>("'1XYZ2' ilike '*xyz*'" ,"","",T(1.0)),
  1871. test_ab<T>("'1XYZ2' ilike '*xyz?'" ,"","",T(1.0)),
  1872. test_ab<T>("inrange('aaa','bbb','ccc')" ,"","",T(1.0)),
  1873. test_ab<T>("a == b" ,"aaa","aaa",T(1.0)),
  1874. test_ab<T>("a != b" ,"aaa","bbb",T(1.0)),
  1875. test_ab<T>("a < b" ,"aaa","bbb",T(1.0)),
  1876. test_ab<T>("a <= b" ,"aaa","bbb",T(1.0)),
  1877. test_ab<T>("b > a" ,"aaa","bbb",T(1.0)),
  1878. test_ab<T>("b >= a" ,"aaa","bbb",T(1.0)),
  1879. test_ab<T>("a in b" ,"aaa","aaa123",T(1.0)),
  1880. test_ab<T>("a in b" ,"123","aaa123",T(1.0)),
  1881. test_ab<T>("a == 'aaa'" ,"aaa","aaa",T(1.0)),
  1882. test_ab<T>("'aaa' == a" ,"aaa","aaa",T(1.0)),
  1883. test_ab<T>("a != 'bbb'" ,"aaa","bbb",T(1.0)),
  1884. test_ab<T>("'bbb' != a" ,"aaa","bbb",T(1.0)),
  1885. test_ab<T>("a < 'bbb'" ,"aaa","bbb",T(1.0)),
  1886. test_ab<T>("a <= 'bbb'" ,"aaa","bbb",T(1.0)),
  1887. test_ab<T>("'bbb' > a" ,"aaa","bbb",T(1.0)),
  1888. test_ab<T>("'bbb' >= a" ,"aaa","bbb",T(1.0)),
  1889. test_ab<T>("a in 'aaa123'" ,"aaa","aaa123",T(1.0)),
  1890. test_ab<T>("a in 'aaa123'" ,"123","aaa123",T(1.0)),
  1891. test_ab<T>("'aaa' in b" ,"aaa","aaa123",T(1.0)),
  1892. test_ab<T>("'123' in b" ,"aaa","aaa123",T(1.0)),
  1893. test_ab<T>("(a < b) or (a == b)" ,"aaa","bbb",T(1.0)),
  1894. test_ab<T>("(a == b) or (a < b)" ,"aaa","bbb",T(1.0)),
  1895. test_ab<T>("(b > a) or (b == a)" ,"aaa","bbb",T(1.0)),
  1896. test_ab<T>("(b == a) or (b > a)" ,"aaa","bbb",T(1.0)),
  1897. test_ab<T>("(a < b) and (b > a)" ,"aaa","bbb",T(1.0)),
  1898. test_ab<T>("a like '*123*'" ,"a123b","",T(1.0)),
  1899. test_ab<T>("a like '*123?'" ,"a123b","",T(1.0)),
  1900. test_ab<T>("'a123b' like b" ,"a123b","*123*",T(1.0)),
  1901. test_ab<T>("'a123b' like b" ,"a123b","*123?",T(1.0)),
  1902. test_ab<T>("a ilike '*xyz*'" ,"1XYZ2","",T(1.0)),
  1903. test_ab<T>("a ilike '*xyz?'" ,"1XYZ2","",T(1.0)),
  1904. test_ab<T>("'1XYZ2' ilike b" ,"","*xyz*",T(1.0)),
  1905. test_ab<T>("'1XYZ2' ilike b" ,"","*xyz?",T(1.0)),
  1906. test_ab<T>("inrange(a,'bbb',c)" ,"aaa","bbb",T(1.0)),
  1907. test_ab<T>("inrange('aaa',b,'ccc')" ,"aaa","bbb",T(1.0)),
  1908. test_ab<T>("inrange(a,b,c)" ,"aaa","bbb",T(1.0)),
  1909. test_ab<T>("inrange(a,b,'ccc')" ,"aaa","bbb",T(1.0)),
  1910. test_ab<T>("inrange('aaa',b,c)" ,"aaa","bbb",T(1.0)),
  1911. test_ab<T>("inrange('aaa',b,c)" ,"aaa","bbb",T(1.0)),
  1912. test_ab<T>("(a < b ? a : b) == a" ,"aaa","bbb",T(1.0)),
  1913. test_ab<T>("(a > b ? a : b) == b" ,"aaa","bbb",T(1.0)),
  1914. test_ab<T>("(a == (a + '1') ? a : b) == b" ,"aaa","bbb",T(1.0)),
  1915. test_ab<T>("((a + '2') != a ? a : b) == a" ,"aaa","bbb",T(1.0)),
  1916. test_ab<T>("(a < b ? a + '1' : b) == 'aaa1'","aaa","bbb",T(1.0)),
  1917. test_ab<T>("(a > b ? a : b + '2') == 'bbb2'","aaa","bbb",T(1.0)),
  1918. test_ab<T>("b == (a == (a + '1') ? a : b)" ,"aaa","bbb",T(1.0)),
  1919. test_ab<T>("a == (a != (a + '2') ? a : b)" ,"aaa","bbb",T(1.0)),
  1920. test_ab<T>("'aaa1' == (a < b ? a + '1' : b)","aaa","bbb",T(1.0)),
  1921. test_ab<T>("'bbb2' == (a > b ? a : b + '2')","aaa","bbb",T(1.0)),
  1922. test_ab<T>("(a < b ? a[1:2] : b) == '23'" ,"1234","67890",T(1.0)),
  1923. test_ab<T>("(a > b ? a : b[0:3]) == '6789'" ,"1234","67890",T(1.0)),
  1924. test_ab<T>("~{var x := 'xxx'; var y := 'yyy';~{(x < y ? x : y) == x }}","","",T(1.0)),
  1925. test_ab<T>("~{var x := 'xxx'; var y := 'yyy';~{(x > y ? x : y) == y }}","","",T(1.0)),
  1926. test_ab<T>("~{var x := 'xxx'; var y := 'yyy';~{(x == (x + '1') ? x : y) == y }}","","",T(1.0)),
  1927. test_ab<T>("~{var x := 'xxx'; var y := 'yyy';~{((x + '2') != x ? x : y) == x }}","","",T(1.0)),
  1928. test_ab<T>("~{var x := 'xxx'; var y := 'yyy';~{(x < y ? x + '1' : y) == 'xxx1'}}","","",T(1.0)),
  1929. test_ab<T>("~{var x := 'xxx'; var y := 'yyy';~{(x > y ? x : y + '2') == 'yyy2'}}","","",T(1.0)),
  1930. test_ab<T>("~{var x := 'xxx'; var y := 'yyy';~{y == (x == (x + '1') ? x : y) }}","","",T(1.0)),
  1931. test_ab<T>("~{var x := 'xxx'; var y := 'yyy';~{x == (x != (x + '2') ? x : y) }}","","",T(1.0)),
  1932. test_ab<T>("~{var x := 'xxx'; var y := 'yyy';~{'xxx1' == (x < y ? x + '1' : y)}}","","",T(1.0)),
  1933. test_ab<T>("~{var x := 'xxx'; var y := 'yyy';~{'yyy2' == (x > y ? x : y + '2')}}","","",T(1.0)),
  1934. test_ab<T>("'01234567890123456789'[0:9] == '0123456789' ","","",T(1.0)),
  1935. test_ab<T>("'01234567890123456789'[0:9] == '0123456789'[:] ","","",T(1.0)),
  1936. test_ab<T>("'01234567890123456789'[0:9] == '0123456789'[0:]","","",T(1.0)),
  1937. test_ab<T>("'01234567890123456789'[0:9] == '0123456789'[:9]","","",T(1.0)),
  1938. test_ab<T>("'01234567890123456789'[:9] == '0123456789'[:9]","","",T(1.0)),
  1939. test_ab<T>("'01234567890123456789'[10:] == '0123456789'[:] ","","",T(1.0)),
  1940. test_ab<T>("'01234567890123456789'[0:9] != '123456789' ","","",T(1.0)),
  1941. test_ab<T>("'01234567890123456789'[0:9] != '123456789'[:] ","","",T(1.0)),
  1942. test_ab<T>("'01234567890123456789'[0:9] != '123456789'[0:] ","","",T(1.0)),
  1943. test_ab<T>("'01234567890123456789'[0:9] != '123456789'[:8] ","","",T(1.0)),
  1944. test_ab<T>("'01234567890123456789'[:9] != '123456789'[:8] ","","",T(1.0)),
  1945. test_ab<T>("'01234567890123456789'[10:] != '123456789'[:] ","","",T(1.0)),
  1946. test_ab<T>("'01234567890123456789'[2*6:10+6] == '23456' ","","",T(1.0)),
  1947. test_ab<T>("'0123456789' == '01234567890123456789'[0:9]","","",T(1.0)),
  1948. test_ab<T>("'0123456789'[:] == '01234567890123456789'[0:9]","","",T(1.0)),
  1949. test_ab<T>("'0123456789'[0:] == '01234567890123456789'[0:9]","","",T(1.0)),
  1950. test_ab<T>("'0123456789'[:9] == '01234567890123456789'[0:9]","","",T(1.0)),
  1951. test_ab<T>("'0123456789'[:9] == '01234567890123456789'[:9] ","","",T(1.0)),
  1952. test_ab<T>("'0123456789'[:] == '01234567890123456789'[10:]","","",T(1.0)),
  1953. test_ab<T>("'0123456789'[3:3] == '3'[:] ","","",T(1.0)),
  1954. test_ab<T>("'0123456789'[3:3] == '3'[0:0] ","","",T(1.0)),
  1955. test_ab<T>("'123456789' != '01234567890123456789'[0:9]","","",T(1.0)),
  1956. test_ab<T>("'123456789'[:] != '01234567890123456789'[0:9]","","",T(1.0)),
  1957. test_ab<T>("'123456789'[0:] != '01234567890123456789'[0:9]","","",T(1.0)),
  1958. test_ab<T>("'123456789'[:8] != '01234567890123456789'[0:9]","","",T(1.0)),
  1959. test_ab<T>("'123456789'[:8] != '01234567890123456789'[:9] ","","",T(1.0)),
  1960. test_ab<T>("'123456789'[:] != '01234567890123456789'[10:]","","",T(1.0)),
  1961. test_ab<T>("'23456' == '01234567890123456789'[2*6:10+6] ","","",T(1.0)),
  1962. test_ab<T>("'01234567890123456789'[r0: 6] == '23456' ","","",T(1.0)),
  1963. test_ab<T>("'01234567890123456789'[2: r1] == '23456' ","","",T(1.0)),
  1964. test_ab<T>("'01234567890123456789'[r0:3*2] == '23456' ","","",T(1.0)),
  1965. test_ab<T>("'01234567890123456789'[1+1:r1] == '23456' ","","",T(1.0)),
  1966. test_ab<T>("'01234567890123456789'[r0: ] == '234567890123456789' ","","",T(1.0)),
  1967. test_ab<T>("'01234567890123456789'[: r1] == '0123456' ","","",T(1.0)),
  1968. test_ab<T>("'01234567890123456789'[r0:r1] == '23456' ","","",T(1.0)),
  1969. test_ab<T>("'01234567890123456789'[r0:r1+2] == '2345678' ","","",T(1.0)),
  1970. test_ab<T>("'01234567890123456789'[r0+2:r1] == '456' ","","",T(1.0)),
  1971. test_ab<T>("'01234567890123456789'[r1-r0:] == '4567890123456789' ","","",T(1.0)),
  1972. test_ab<T>("'01234567890123456789'[:r1-r0] == '01234' ","","",T(1.0)),
  1973. test_ab<T>("'23456' == '01234567890123456789'[r0: 6] ","","",T(1.0)),
  1974. test_ab<T>("'23456' == '01234567890123456789'[2: r1] ","","",T(1.0)),
  1975. test_ab<T>("'23456' == '01234567890123456789'[r0:3*2] ","","",T(1.0)),
  1976. test_ab<T>("'23456' == '01234567890123456789'[1+1:r1] ","","",T(1.0)),
  1977. test_ab<T>("'234567890123456789' == '01234567890123456789'[r0: ] ","","",T(1.0)),
  1978. test_ab<T>("'0123456' == '01234567890123456789'[: r1] ","","",T(1.0)),
  1979. test_ab<T>("'23456' == '01234567890123456789'[r0:r1] ","","",T(1.0)),
  1980. test_ab<T>("'2345678' == '01234567890123456789'[r0:r1+2] ","","",T(1.0)),
  1981. test_ab<T>("'456' == '01234567890123456789'[r0+2:r1] ","","",T(1.0)),
  1982. test_ab<T>("'4567890123456789' == '01234567890123456789'[r1-r0:] ","","",T(1.0)),
  1983. test_ab<T>("'01234' == '01234567890123456789'[:r1-r0] ","","",T(1.0)),
  1984. test_ab<T>("a[r0: 6] == '23456' ","01234567890123456789","",T(1.0)),
  1985. test_ab<T>("a[2: r1] == '23456' ","01234567890123456789","",T(1.0)),
  1986. test_ab<T>("a[r0:3*2] == '23456' ","01234567890123456789","",T(1.0)),
  1987. test_ab<T>("a[1+1:r1] == '23456' ","01234567890123456789","",T(1.0)),
  1988. test_ab<T>("a[r0: ] == '234567890123456789' ","01234567890123456789","",T(1.0)),
  1989. test_ab<T>("a[: r1] == '0123456' ","01234567890123456789","",T(1.0)),
  1990. test_ab<T>("a[r0:r1] == '23456' ","01234567890123456789","",T(1.0)),
  1991. test_ab<T>("a[r0:r1+2] == '2345678' ","01234567890123456789","",T(1.0)),
  1992. test_ab<T>("a[r0+2:r1] == '456' ","01234567890123456789","",T(1.0)),
  1993. test_ab<T>("a[r1-r0:] == '4567890123456789' ","01234567890123456789","",T(1.0)),
  1994. test_ab<T>("a[:r1-r0] == '01234' ","01234567890123456789","",T(1.0)),
  1995. test_ab<T>("'23456' == a[r0: 6] ","01234567890123456789","",T(1.0)),
  1996. test_ab<T>("'23456' == a[2: r1] ","01234567890123456789","",T(1.0)),
  1997. test_ab<T>("'23456' == a[r0:3*2] ","01234567890123456789","",T(1.0)),
  1998. test_ab<T>("'23456' == a[1+1:r1] ","01234567890123456789","",T(1.0)),
  1999. test_ab<T>("'234567890123456789' == a[r0: ] ","01234567890123456789","",T(1.0)),
  2000. test_ab<T>("'0123456' == a[: r1] ","01234567890123456789","",T(1.0)),
  2001. test_ab<T>("'23456' == a[r0:r1] ","01234567890123456789","",T(1.0)),
  2002. test_ab<T>("'2345678' == a[r0:r1+2] ","01234567890123456789","",T(1.0)),
  2003. test_ab<T>("'456' == a[r0+2:r1] ","01234567890123456789","",T(1.0)),
  2004. test_ab<T>("'4567890123456789' == a[r1-r0:] ","01234567890123456789","",T(1.0)),
  2005. test_ab<T>("'01234' == a[:r1-r0] ","01234567890123456789","",T(1.0)),
  2006. test_ab<T>("a[r0: 6] == b ","01234567890123456789","23456",T(1.0)),
  2007. test_ab<T>("a[2: r1] == b ","01234567890123456789","23456",T(1.0)),
  2008. test_ab<T>("a[r0:3*2] == b ","01234567890123456789","23456",T(1.0)),
  2009. test_ab<T>("a[1+1:r1] == b ","01234567890123456789","23456",T(1.0)),
  2010. test_ab<T>("a[r0: ] == b ","01234567890123456789","234567890123456789",T(1.0)),
  2011. test_ab<T>("a[: r1] == b ","01234567890123456789","0123456",T(1.0)),
  2012. test_ab<T>("a[r0:r1] == b ","01234567890123456789","23456",T(1.0)),
  2013. test_ab<T>("a[r0:r1+2] == b ","01234567890123456789","2345678",T(1.0)),
  2014. test_ab<T>("a[r0+2:r1] == b ","01234567890123456789","456",T(1.0)),
  2015. test_ab<T>("a[r1-r0:] == b ","01234567890123456789","4567890123456789",T(1.0)),
  2016. test_ab<T>("a[:r1-r0] == b ","01234567890123456789","01234",T(1.0)),
  2017. test_ab<T>("b == a[r0: 6] ","01234567890123456789","23456",T(1.0)),
  2018. test_ab<T>("b == a[2: r1] ","01234567890123456789","23456",T(1.0)),
  2019. test_ab<T>("b == a[r0:3*2] ","01234567890123456789","23456",T(1.0)),
  2020. test_ab<T>("b == a[1+1:r1] ","01234567890123456789","23456",T(1.0)),
  2021. test_ab<T>("b == a[r0: ] ","01234567890123456789","234567890123456789",T(1.0)),
  2022. test_ab<T>("b == a[: r1] ","01234567890123456789","0123456",T(1.0)),
  2023. test_ab<T>("b == a[r0:r1] ","01234567890123456789","23456",T(1.0)),
  2024. test_ab<T>("b == a[r0:r1+2] ","01234567890123456789","2345678",T(1.0)),
  2025. test_ab<T>("b == a[r0+2:r1] ","01234567890123456789","456",T(1.0)),
  2026. test_ab<T>("b == a[r1-r0:] ","01234567890123456789","4567890123456789",T(1.0)),
  2027. test_ab<T>("b == a[:r1-r0] ","01234567890123456789","01234",T(1.0)),
  2028. test_ab<T>("'01234567890123456789'[0:9] == a ","0123456789","",T(1.0)),
  2029. test_ab<T>("'01234567890123456789'[0:9] == a[:] ","0123456789","",T(1.0)),
  2030. test_ab<T>("'01234567890123456789'[0:9] == a[0:] ","0123456789","",T(1.0)),
  2031. test_ab<T>("'01234567890123456789'[0:9] == a[:9] ","0123456789","",T(1.0)),
  2032. test_ab<T>("'01234567890123456789'[:9] == a[:9] ","0123456789","",T(1.0)),
  2033. test_ab<T>("'01234567890123456789'[10:] == a[:] ","0123456789","",T(1.0)),
  2034. test_ab<T>("'01234567890123456789'[0:9] != a ","123456789" ,"",T(1.0)),
  2035. test_ab<T>("'01234567890123456789'[0:9] != a[:] ","123456789" ,"",T(1.0)),
  2036. test_ab<T>("'01234567890123456789'[0:9] != a[0:] ","123456789" ,"",T(1.0)),
  2037. test_ab<T>("'01234567890123456789'[0:9] != a[:8] ","123456789" ,"",T(1.0)),
  2038. test_ab<T>("'01234567890123456789'[:9] != a[:8] ","123456789" ,"",T(1.0)),
  2039. test_ab<T>("'01234567890123456789'[10:] != a[:] ","123456789" ,"",T(1.0)),
  2040. test_ab<T>("'01234567890123456789'[2*6:10+6] == a","23456" ,"",T(1.0)),
  2041. test_ab<T>("'23456' == a[:] ","23456" ,"",T(1.0)),
  2042. test_ab<T>("a == '01234567890123456789'[0:9] ","0123456789","",T(1.0)),
  2043. test_ab<T>("a[:] == '01234567890123456789'[0:9] ","0123456789","",T(1.0)),
  2044. test_ab<T>("a[0:] == '01234567890123456789'[0:9] ","0123456789","",T(1.0)),
  2045. test_ab<T>("a[:9] == '01234567890123456789'[0:9] ","0123456789","",T(1.0)),
  2046. test_ab<T>("a[:9] == '01234567890123456789'[:9] ","0123456789","",T(1.0)),
  2047. test_ab<T>("a[:] == '01234567890123456789'[10:] ","0123456789","",T(1.0)),
  2048. test_ab<T>("a != '01234567890123456789'[0:9] ","123456789" ,"",T(1.0)),
  2049. test_ab<T>("a[:] != '01234567890123456789'[0:9] ","123456789" ,"",T(1.0)),
  2050. test_ab<T>("a[0:] != '01234567890123456789'[0:9] ","123456789" ,"",T(1.0)),
  2051. test_ab<T>("a[:8] != '01234567890123456789'[0:9] ","123456789" ,"",T(1.0)),
  2052. test_ab<T>("a[:8] != '01234567890123456789'[:9] ","123456789" ,"",T(1.0)),
  2053. test_ab<T>("a[:] != '01234567890123456789'[10:] ","123456789" ,"",T(1.0)),
  2054. test_ab<T>("a == '01234567890123456789'[2*6:10+6]","23456" ,"",T(1.0)),
  2055. test_ab<T>("a[:] == '23456' ","23456" ,"",T(1.0)),
  2056. test_ab<T>("a[0:9] == b ","01234567890123456789","0123456789",T(1.0)),
  2057. test_ab<T>("a[0:9] == b[:] ","01234567890123456789","0123456789",T(1.0)),
  2058. test_ab<T>("a[0:9] == b[0:] ","01234567890123456789","0123456789",T(1.0)),
  2059. test_ab<T>("a[0:9] == b[:9] ","01234567890123456789","0123456789",T(1.0)),
  2060. test_ab<T>("a[:9] == b[:9] ","01234567890123456789","0123456789",T(1.0)),
  2061. test_ab<T>("a[10:] == b[:] ","01234567890123456789","0123456789",T(1.0)),
  2062. test_ab<T>("a[0:9] != b ","01234567890123456789","123456789" ,T(1.0)),
  2063. test_ab<T>("a[0:9] != b[:] ","01234567890123456789","123456789" ,T(1.0)),
  2064. test_ab<T>("a[0:9] != b[0:] ","01234567890123456789","123456789" ,T(1.0)),
  2065. test_ab<T>("a[0:9] != b[:8] ","01234567890123456789","123456789" ,T(1.0)),
  2066. test_ab<T>("a[:9] != b[:8] ","01234567890123456789","123456789" ,T(1.0)),
  2067. test_ab<T>("a[10:] != b[:] ","01234567890123456789","123456789" ,T(1.0)),
  2068. test_ab<T>("a[2*6:10+6] == b ","01234567890123456789","23456" ,T(1.0)),
  2069. test_ab<T>("b == a[0:9] ","01234567890123456789","0123456789",T(1.0)),
  2070. test_ab<T>("b[:] == a[0:9] ","01234567890123456789","0123456789",T(1.0)),
  2071. test_ab<T>("b[0:] == a[0:9] ","01234567890123456789","0123456789",T(1.0)),
  2072. test_ab<T>("b[:9] == a[0:9] ","01234567890123456789","0123456789",T(1.0)),
  2073. test_ab<T>("b[:9] == a[:9] ","01234567890123456789","0123456789",T(1.0)),
  2074. test_ab<T>("b[:] == a[10:] ","01234567890123456789","0123456789",T(1.0)),
  2075. test_ab<T>("b != a[0:9] ","01234567890123456789","123456789" ,T(1.0)),
  2076. test_ab<T>("b[:] != a[0:9] ","01234567890123456789","123456789" ,T(1.0)),
  2077. test_ab<T>("b[0:] != a[0:9] ","01234567890123456789","123456789" ,T(1.0)),
  2078. test_ab<T>("b[:8] != a[0:9] ","01234567890123456789","123456789" ,T(1.0)),
  2079. test_ab<T>("b[:8] != a[:9] ","01234567890123456789","123456789" ,T(1.0)),
  2080. test_ab<T>("b[:] != a[10:] ","01234567890123456789","123456789" ,T(1.0)),
  2081. test_ab<T>("b == a[2*6:10+6] ","01234567890123456789","23456" ,T(1.0)),
  2082. test_ab<T>("a[2:6] == b" ,"0123456789","23456" ,T(1.0)),
  2083. test_ab<T>("a == b[2:6]" ,"23456","0123456789" ,T(1.0)),
  2084. test_ab<T>("a[1+1:2*3] == b" ,"0123456789","23456" ,T(1.0)),
  2085. test_ab<T>("a == b[4/2:sqrt(36)]","23456","0123456789" ,T(1.0)),
  2086. test_ab<T>("a[0:6] == b" ,"0123456789","0123456",T(1.0)),
  2087. test_ab<T>("a[:6] == b" ,"0123456789","0123456",T(1.0)),
  2088. test_ab<T>("a[4/2-2:2+4] == b" ,"0123456789","0123456",T(1.0)),
  2089. test_ab<T>("a[:12/2] == b" ,"0123456789","0123456",T(1.0)),
  2090. test_ab<T>("a[0:] == b" ,"0123456","0123456" ,T(1.0)),
  2091. test_ab<T>("a[:] == b" ,"0123456","0123456" ,T(1.0)),
  2092. test_ab<T>("a == b[0:6]" ,"0123456","0123456789",T(1.0)),
  2093. test_ab<T>("a == b[:6]" ,"0123456","0123456789",T(1.0)),
  2094. test_ab<T>("a == b[4/2-2:2+4]" ,"0123456","0123456789",T(1.0)),
  2095. test_ab<T>("a == b[:12/2]" ,"0123456","0123456789",T(1.0)),
  2096. test_ab<T>("a == b[0:]" ,"0123456","0123456" ,T(1.0)),
  2097. test_ab<T>("a == b[:]" ,"0123456","0123456" ,T(1.0)),
  2098. test_ab<T>("a[:9] == b[0:9]" ,"0123456789","01234567890123456789",T(1.0)),
  2099. test_ab<T>("a[0:9] == b[0:9]" ,"0123456789","01234567890123456789",T(1.0)),
  2100. test_ab<T>("a[0:] == b[0:9]" ,"0123456789","01234567890123456789",T(1.0)),
  2101. test_ab<T>("a[:] == b[0:9]" ,"0123456789","01234567890123456789",T(1.0)),
  2102. test_ab<T>("a[:] == b[10:]" ,"0123456789","01234567890123456789",T(1.0)),
  2103. test_ab<T>("'!@#$%^&*([{}])-=' != ')]}{[(*&^%$#@!'","","",T(1.0)),
  2104. test_ab<T>("('!@#$%^&*([{}])-=') != (')]}{[(*&^%$#@!')","","",T(1.0)),
  2105. test_ab<T>("{[('a')]} == [{('a')}]","","",T(1.0)),
  2106. test_ab<T>("{[('!@#$%^&*([{}])-=')]} != [{(')]}{[(*&^%$#@!')}]","","",T(1.0)),
  2107. test_ab<T>("'!@#$%^&*([{}])-=' == '!@#$%^&*([{}])-='","","",T(1.0)),
  2108. test_ab<T>("('!@#$%^&*([{}])-=') == ('!@#$%^&*([{}])-=')","","",T(1.0)),
  2109. test_ab<T>("{[('!@#$%^&*([{}])-=')]} == [{('!@#$%^&*([{}])-=')}]","","",T(1.0)),
  2110. test_ab<T>("'1234\\\\abc\nxyz\r890\tqaz\\'567' == a","1234\\abc\nxyz\r890\tqaz'567","",T(1.0)),
  2111. test_ab<T>("a == '1234\\\\abc\nxyz\r890\tqaz\\'567'","1234\\abc\nxyz\r890\tqaz'567","",T(1.0)),
  2112. test_ab<T>("'123'[] == 3" ,"","" ,T(1.0)),
  2113. test_ab<T>("3 == '123'[]" ,"","" ,T(1.0)),
  2114. test_ab<T>("'123'[] + '1234'[] == 7" ,"","" ,T(1.0)),
  2115. test_ab<T>("abs('123'[] - '1234'[]) == 1" ,"","" ,T(1.0)),
  2116. test_ab<T>("'1234'[] == a[]" ,"1234","" ,T(1.0)),
  2117. test_ab<T>("'123'[] + a[] == 7" ,"1234","" ,T(1.0)),
  2118. test_ab<T>("abs(a[] - '12345'[]) == 1" ,"1234","" ,T(1.0)),
  2119. test_ab<T>("'1234'[] + '12345'[] == a[] + b[]" ,"1234","12345" ,T(1.0)),
  2120. test_ab<T>("abs('123'[] -'1234'[]) == abs(a[] - b[])" ,"1234","12345",T(1.0)),
  2121. test_ab<T>("(a + b) == 'abc123' ","abc","123" ,T(1.0)),
  2122. test_ab<T>("(a + '123') == 'abc123' ","abc","123" ,T(1.0)),
  2123. test_ab<T>("('abc' + b) == 'abc123' ","abc","123" ,T(1.0)),
  2124. test_ab<T>("(a + '1') == 'abc1' ","abc","123" ,T(1.0)),
  2125. test_ab<T>("('a' + b) == 'a123' ","abc","123" ,T(1.0)),
  2126. test_ab<T>("(a[2:7] + b) == 'cdefgh0123' ","abcdefghij","0123",T(1.0)),
  2127. test_ab<T>("(a + b[2:7]) == 'abc234567' ","abc","0123456789" ,T(1.0)),
  2128. test_ab<T>("(a[2:7] + '0123') == 'cdefgh0123' ","abcdefghij","0123",T(1.0)),
  2129. test_ab<T>("('abc' + b[2:7]) == 'abc234567' ","abc","0123456789" ,T(1.0)),
  2130. test_ab<T>("(a[2:2] + b[3:3]) == 'c3' ","abc","0123456789" ,T(1.0)),
  2131. test_ab<T>("(a[3:] + b) == 'defghij0123' ","abcdefghij","0123",T(1.0)),
  2132. test_ab<T>("('abc' + b[:7]) == 'abc01234567' ","abc","0123456789" ,T(1.0)),
  2133. test_ab<T>("a + '123' == 'abc'+ b ","abc" , "123" , T(1.0)),
  2134. test_ab<T>("a[0:2] + '123' == 'abc' + b[0:2] ","abcXYZ", "123XYZ", T(1.0)),
  2135. test_ab<T>("a[ :2] + '123' == 'abc' + b[ :2] ","abcXYZ", "123XYZ", T(1.0)),
  2136. test_ab<T>("a[3: ] + '123' == 'abc' + b[3: ]","XYZabc", "XYZ123", T(1.0)),
  2137. test_ab<T>("a[3:a[] - 1] + '123' == 'abc' + b[3:b[] - 1]","XYZabc", "XYZ123", T(1.0)),
  2138. test_ab<T>("(a[r0:r2] + b) == 'cdefgh0123' ","abcdefghij","0123",T(1.0)),
  2139. test_ab<T>("(a + b[r0:r2]) == 'abc234567' ","abc","0123456789" ,T(1.0)),
  2140. test_ab<T>("(a[r0:r2] + '0123') == 'cdefgh0123' ","abcdefghij","0123",T(1.0)),
  2141. test_ab<T>("('abc' + b[r0:r2]) == 'abc234567' ","abc","0123456789" ,T(1.0)),
  2142. test_ab<T>("(a[r0:r0] + b[r3:r3]) == 'c3' ","abc","0123456789" ,T(1.0)),
  2143. test_ab<T>("(a[r3:] + b) == 'defghij0123' ","abcdefghij","0123",T(1.0)),
  2144. test_ab<T>("('abc' + b[:r2]) == 'abc01234567' ","abc","0123456789" ,T(1.0)),
  2145. test_ab<T>("a[0:r0] + '123' == 'abc' + b[0:r0] ","abcXYZ", "123XYZ", T(1.0)),
  2146. test_ab<T>("a[ :r0] + '123' == 'abc' + b[ :r0] ","abcXYZ", "123XYZ", T(1.0)),
  2147. test_ab<T>("a[r3: ] + '123' == 'abc' + b[r3: ]","XYZabc", "XYZ123", T(1.0)),
  2148. test_ab<T>("a[r3:a[] - 1] + '123' == 'abc' + b[r3:b[] - 1]","XYZabc", "XYZ123", T(1.0)),
  2149. test_ab<T>("(a[r0:r0] + b[r3:r0+1]) == 'c3' ","abc","0123456789" ,T(1.0)),
  2150. test_ab<T>("(a[r0+1:] + b) == 'defghij0123' ","abcdefghij","0123",T(1.0)),
  2151. test_ab<T>("a[r0+1: ] + '123' == 'abc' + b[r0+1: ]","XYZabc", "XYZ123", T(1.0)),
  2152. test_ab<T>("a[r0+1:a[] - 1] + '123' == 'abc' + b[r0+1:b[] - 1]","XYZabc", "XYZ123", T(1.0)),
  2153. test_ab<T>("(a + b)[ :13] == 'abcdefghij0123' ", "abcdefghij", "0123456789" ,T(1.0)),
  2154. test_ab<T>("(a + b)[ 6: ] == 'ghij0123456789' ", "abcdefghij", "0123456789" ,T(1.0)),
  2155. test_ab<T>("(a + b)[ 2:3r1-1] == 'cdefghij01234567' ", "abcdefghij", "0123456789" ,T(1.0)),
  2156. test_ab<T>("(a[2:7] + b[2:7]) == 'cdefgh234567' ", "abcdefghij", "0123456789" ,T(1.0)),
  2157. test_ab<T>("(a[2:7] + b[2:7])[3:8] == 'fgh234' ", "abcdefghij", "0123456789" ,T(1.0)),
  2158. test_ab<T>("(a + b)[r0 - 2: r1 + r2] == 'abcdefghij0123' ", "abcdefghij", "0123456789" ,T(1.0)),
  2159. test_ab<T>("(a + b)[r0*r3:] == 'ghij0123456789' ", "abcdefghij", "0123456789" ,T(1.0)),
  2160. test_ab<T>("(a + b)[3r0: ] == 'ghij0123456789' ", "abcdefghij", "0123456789" ,T(1.0)),
  2161. test_ab<T>("(a + b)[2r3: ] == 'ghij0123456789' ", "abcdefghij", "0123456789" ,T(1.0)),
  2162. test_ab<T>("(a + b)[2:3r1 - 1] == 'cdefghij01234567' ", "abcdefghij", "0123456789" ,T(1.0)),
  2163. test_ab<T>("(a[r0:7] + b[r0:r2])== 'cdefgh234567' ", "abcdefghij", "0123456789" ,T(1.0)),
  2164. test_ab<T>("(a[r1 / r3:7] + b[r0:r2])[3:r2 + 1] == 'fgh234'", "abcdefghij", "0123456789" ,T(1.0)),
  2165. test_ab<T>("(a += b) == 'abc123' ", "abc","123" ,T(1.0)),
  2166. test_ab<T>("(a += '123') == 'abc123' ", "abc","123" ,T(1.0)),
  2167. test_ab<T>("(a += b[3:5]) == 'abc123' ", "abc","XXX123XXX" ,T(1.0)),
  2168. test_ab<T>("(a += 'XXX123XXX'[3:5]) == 'abc123' ", "abc","123" ,T(1.0)),
  2169. test_ab<T>("(a += b)[:] == 'abc123' ", "abc","123" ,T(1.0)),
  2170. test_ab<T>("(a += '123')[:] == 'abc123' ", "abc","123" ,T(1.0)),
  2171. test_ab<T>("(a += b[3:5])[:] == 'abc123' ", "abc","XXX123XXX" ,T(1.0)),
  2172. test_ab<T>("(a += 'XXX123XXX'[3:5])[:] == 'abc123' ", "abc","123" ,T(1.0)),
  2173. test_ab<T>("(a += b[r1/2:r1-1]) == 'abc123' ", "abc","XXX123XXX" ,T(1.0)),
  2174. test_ab<T>("(a += 'XXX123XXX'[r0+1:r1-1]) == 'abc123' ", "abc","123" ,T(1.0)),
  2175. test_ab<T>("(a += b)[] == 6 ", "abc","123" ,T(1.0)),
  2176. test_ab<T>("(a += '123')[] == 6 ", "abc","123" ,T(1.0)),
  2177. test_ab<T>("(a += b[3:5])[] == 6 ", "abc","XXX123XXX" ,T(1.0)),
  2178. test_ab<T>("(a += b[r0+1:r1-1])[] == 6 ", "abc","XXX123XXX" ,T(1.0)),
  2179. test_ab<T>("(a + b)[:][] == 6 ","abc","123" ,T(1.0)),
  2180. test_ab<T>("(a + b)[:][:][] == 6 ","abc","123" ,T(1.0)),
  2181. test_ab<T>("(a + b)[:][:][:][] == 6 ","abc","123" ,T(1.0)),
  2182. test_ab<T>("(a + b)[:][:][:][:][] == 6 ","abc","123" ,T(1.0)),
  2183. test_ab<T>("(a + b)[:][:][:][:][:][] == 6 ","abc","123" ,T(1.0)),
  2184. test_ab<T>("(a + b)[:][:][:][:][:][:][] == 6 ","abc","123" ,T(1.0)),
  2185. test_ab<T>("(a + b)[:][:][:][:][:][:][:][]== 6 ","abc","123" ,T(1.0)),
  2186. test_ab<T>("(a + b)[0:5] == 'abc123' ","abc","123" ,T(1.0)),
  2187. test_ab<T>("(a + b)[0:5][1:4] == 'bc12' ","abc","123" ,T(1.0)),
  2188. test_ab<T>("(a + b)[0:5][1:4][1:2] == 'c1' ","abc","123" ,T(1.0)),
  2189. test_ab<T>("(a + b)[0:5][1:4][1:2][0:0] == 'c' ","abc","123" ,T(1.0)),
  2190. test_ab<T>("(a + b)[0:5][] == 6 ","abc","123" ,T(1.0)),
  2191. test_ab<T>("(a + b)[0:5][1:4][] == 4 ","abc","123" ,T(1.0)),
  2192. test_ab<T>("(a + b)[0:5][1:4][1:2][] == 2 ","abc","123" ,T(1.0)),
  2193. test_ab<T>("(a + b)[0:5][1:4][1:2][0:0][] == 1 ","abc","123" ,T(1.0)),
  2194. test_ab<T>("(a[ : ] := b); (a == 'ABCDEFGHIJ');", "0123456789","ABCDEFGHIJ" ,T(1.0)),
  2195. test_ab<T>("(a[0: ] := b); (a == 'ABCDEFGHIJ');", "0123456789","ABCDEFGHIJ" ,T(1.0)),
  2196. test_ab<T>("(a[ :9] := b); (a == 'ABCDEFGHIJ');", "0123456789","ABCDEFGHIJ" ,T(1.0)),
  2197. test_ab<T>("(a[3:7] := b); (a == '012ABCDE89');", "0123456789","ABCDEFGHIJ" ,T(1.0)),
  2198. test_ab<T>("(a[2:8] := b); (a == '01ABCDEFG9');", "0123456789","ABCDEFGHIJ" ,T(1.0)),
  2199. test_ab<T>("(a[1:9] := b); (a == '0ABCDEFGHI');", "0123456789","ABCDEFGHIJ" ,T(1.0)),
  2200. test_ab<T>("(a[0:0] := b); (a == 'A123456789');", "0123456789","ABCDEFGHIJ" ,T(1.0)),
  2201. test_ab<T>("(a[1:1] := b); (a == '0A23456789');", "0123456789","ABCDEFGHIJ" ,T(1.0)),
  2202. test_ab<T>("(a[2:2] := b); (a == '01A3456789');", "0123456789","ABCDEFGHIJ" ,T(1.0)),
  2203. test_ab<T>("(a[3:3] := b); (a == '012A456789');", "0123456789","ABCDEFGHIJ" ,T(1.0)),
  2204. test_ab<T>("(a[4:4] := b); (a == '0123A56789');", "0123456789","ABCDEFGHIJ" ,T(1.0)),
  2205. test_ab<T>("(a[5:5] := b); (a == '01234A6789');", "0123456789","ABCDEFGHIJ" ,T(1.0)),
  2206. test_ab<T>("(a[6:6] := b); (a == '012345A789');", "0123456789","ABCDEFGHIJ" ,T(1.0)),
  2207. test_ab<T>("(a[7:7] := b); (a == '0123456A89');", "0123456789","ABCDEFGHIJ" ,T(1.0)),
  2208. test_ab<T>("(a[8:8] := b); (a == '01234567A9');", "0123456789","ABCDEFGHIJ" ,T(1.0)),
  2209. test_ab<T>("(a[9:9] := b); (a == '012345678A');", "0123456789","ABCDEFGHIJ" ,T(1.0)),
  2210. test_ab<T>("(a[0:1] := b); (a == 'AB23456789');", "0123456789","ABCDEFGHIJ" ,T(1.0)),
  2211. test_ab<T>("(a[1:2] := b); (a == '0AB3456789');", "0123456789","ABCDEFGHIJ" ,T(1.0)),
  2212. test_ab<T>("(a[2:3] := b); (a == '01AB456789');", "0123456789","ABCDEFGHIJ" ,T(1.0)),
  2213. test_ab<T>("(a[3:4] := b); (a == '012AB56789');", "0123456789","ABCDEFGHIJ" ,T(1.0)),
  2214. test_ab<T>("(a[4:5] := b); (a == '0123AB6789');", "0123456789","ABCDEFGHIJ" ,T(1.0)),
  2215. test_ab<T>("(a[5:6] := b); (a == '01234AB789');", "0123456789","ABCDEFGHIJ" ,T(1.0)),
  2216. test_ab<T>("(a[6:7] := b); (a == '012345AB89');", "0123456789","ABCDEFGHIJ" ,T(1.0)),
  2217. test_ab<T>("(a[7:8] := b); (a == '0123456AB9');", "0123456789","ABCDEFGHIJ" ,T(1.0)),
  2218. test_ab<T>("(a[8:9] := b); (a == '01234567AB');", "0123456789","ABCDEFGHIJ" ,T(1.0)),
  2219. test_ab<T>("(a[ : ] := b[3:b[] - 3]); (a == 'ABCDEFGHIJ');", "0123456789","xyzABCDEFGHIJxyz",T(1.0)),
  2220. test_ab<T>("(a[0: ] := b[3:b[] - 3]); (a == 'ABCDEFGHIJ');", "0123456789","xyzABCDEFGHIJxyz",T(1.0)),
  2221. test_ab<T>("(a[ :9] := b[3:b[] - 3]); (a == 'ABCDEFGHIJ');", "0123456789","xyzABCDEFGHIJxyz",T(1.0)),
  2222. test_ab<T>("(a[3:7] := b[3:b[] - 3]); (a == '012ABCDE89');", "0123456789","xyzABCDEFGHIJxyz",T(1.0)),
  2223. test_ab<T>("(a[2:8] := b[3:b[] - 3]); (a == '01ABCDEFG9');", "0123456789","xyzABCDEFGHIJxyz",T(1.0)),
  2224. test_ab<T>("(a[1:9] := b[3:b[] - 3]); (a == '0ABCDEFGHI');", "0123456789","xyzABCDEFGHIJxyz",T(1.0)),
  2225. test_ab<T>("(a[0:0] := b[3:b[] - 3]); (a == 'A123456789');", "0123456789","xyzABCDEFGHIJxyz",T(1.0)),
  2226. test_ab<T>("(a[1:1] := b[3:b[] - 3]); (a == '0A23456789');", "0123456789","xyzABCDEFGHIJxyz",T(1.0)),
  2227. test_ab<T>("(a[2:2] := b[3:b[] - 3]); (a == '01A3456789');", "0123456789","xyzABCDEFGHIJxyz",T(1.0)),
  2228. test_ab<T>("(a[3:3] := b[3:b[] - 3]); (a == '012A456789');", "0123456789","xyzABCDEFGHIJxyz",T(1.0)),
  2229. test_ab<T>("(a[4:4] := b[3:b[] - 3]); (a == '0123A56789');", "0123456789","xyzABCDEFGHIJxyz",T(1.0)),
  2230. test_ab<T>("(a[5:5] := b[3:b[] - 3]); (a == '01234A6789');", "0123456789","xyzABCDEFGHIJxyz",T(1.0)),
  2231. test_ab<T>("(a[6:6] := b[3:b[] - 3]); (a == '012345A789');", "0123456789","xyzABCDEFGHIJxyz",T(1.0)),
  2232. test_ab<T>("(a[7:7] := b[3:b[] - 3]); (a == '0123456A89');", "0123456789","xyzABCDEFGHIJxyz",T(1.0)),
  2233. test_ab<T>("(a[8:8] := b[3:b[] - 3]); (a == '01234567A9');", "0123456789","xyzABCDEFGHIJxyz",T(1.0)),
  2234. test_ab<T>("(a[9:9] := b[3:b[] - 3]); (a == '012345678A');", "0123456789","xyzABCDEFGHIJxyz",T(1.0)),
  2235. test_ab<T>("(a[0:1] := b[3:b[] - 3]); (a == 'AB23456789');", "0123456789","xyzABCDEFGHIJxyz",T(1.0)),
  2236. test_ab<T>("(a[1:2] := b[3:b[] - 3]); (a == '0AB3456789');", "0123456789","xyzABCDEFGHIJxyz",T(1.0)),
  2237. test_ab<T>("(a[2:3] := b[3:b[] - 3]); (a == '01AB456789');", "0123456789","xyzABCDEFGHIJxyz",T(1.0)),
  2238. test_ab<T>("(a[3:4] := b[3:b[] - 3]); (a == '012AB56789');", "0123456789","xyzABCDEFGHIJxyz",T(1.0)),
  2239. test_ab<T>("(a[4:5] := b[3:b[] - 3]); (a == '0123AB6789');", "0123456789","xyzABCDEFGHIJxyz",T(1.0)),
  2240. test_ab<T>("(a[5:6] := b[3:b[] - 3]); (a == '01234AB789');", "0123456789","xyzABCDEFGHIJxyz",T(1.0)),
  2241. test_ab<T>("(a[6:7] := b[3:b[] - 3]); (a == '012345AB89');", "0123456789","xyzABCDEFGHIJxyz",T(1.0)),
  2242. test_ab<T>("(a[7:8] := b[3:b[] - 3]); (a == '0123456AB9');", "0123456789","xyzABCDEFGHIJxyz",T(1.0)),
  2243. test_ab<T>("(a[8:9] := b[3:b[] - 3]); (a == '01234567AB');", "0123456789","xyzABCDEFGHIJxyz",T(1.0)),
  2244. test_ab<T>("(a[0:9] := b); (a == 'A123456789');", "0123456789","A" ,T(1.0)),
  2245. test_ab<T>("(a[0:9] := b); (a == 'AB23456789');", "0123456789","AB" ,T(1.0)),
  2246. test_ab<T>("(a[0:9] := b); (a == 'ABC3456789');", "0123456789","ABC" ,T(1.0)),
  2247. test_ab<T>("(a[0:9] := b); (a == 'ABCD456789');", "0123456789","ABCD" ,T(1.0)),
  2248. test_ab<T>("(a[0:9] := b); (a == 'ABCDE56789');", "0123456789","ABCDE" ,T(1.0)),
  2249. test_ab<T>("(a[0:9] := b); (a == 'ABCDEF6789');", "0123456789","ABCDEF" ,T(1.0)),
  2250. test_ab<T>("(a[0:9] := b); (a == 'ABCDEFG789');", "0123456789","ABCDEFG" ,T(1.0)),
  2251. test_ab<T>("(a[0:9] := b); (a == 'ABCDEFGH89');", "0123456789","ABCDEFGH" ,T(1.0)),
  2252. test_ab<T>("(a[0:9] := b); (a == 'ABCDEFGHI9');", "0123456789","ABCDEFGHI" ,T(1.0)),
  2253. test_ab<T>("(a[3:9] := b); (a == '012A456789');", "0123456789","A" ,T(1.0)),
  2254. test_ab<T>("(a[3:9] := b); (a == '012AB56789');", "0123456789","AB" ,T(1.0)),
  2255. test_ab<T>("(a[3:9] := b); (a == '012ABC6789');", "0123456789","ABC" ,T(1.0)),
  2256. test_ab<T>("(a[3:9] := b); (a == '012ABCD789');", "0123456789","ABCD" ,T(1.0)),
  2257. test_ab<T>("(a[3:9] := b); (a == '012ABCDE89');", "0123456789","ABCDE" ,T(1.0)),
  2258. test_ab<T>("(a[3:9] := b); (a == '012ABCDEF9');", "0123456789","ABCDEF" ,T(1.0)),
  2259. test_ab<T>("(a[r1 / r0:r2] := b[3:b[] - r3]); (a == '012ABCDE89');", "0123456789","xyzABCDEFGHIJxyz",T(1.0)),
  2260. test_ab<T>("(a[r0:r2 + 1] := b[r3:b[] - r3]); (a == '01ABCDEFG9');", "0123456789","xyzABCDEFGHIJxyz",T(1.0)),
  2261. test_ab<T>("'\\0x30\\0x31\\0x32\\0x33\\0x34\\0x35\\0x36\\0x37\\0x38\\0x39' == '0123456789'","","",T(1.0)),
  2262. test_ab<T>("'abc\\0x30\\0x31\\0x32\\0x33xyz' == 'abc0123xyz'" ,"","",T(1.0)),
  2263. test_ab<T>("'\\0x30\\n\\0x31\\n\\0x32\\n\\0x33' == '0\\n1\\n2\\n3'" ,"","",T(1.0)),
  2264. test_ab<T>("('\\0x30' + '') == '0'" ,"","",T(1.0)),
  2265. test_ab<T>("('\\0x30' + '\\0x31\\0x32') == '012'" ,"","",T(1.0)),
  2266. test_ab<T>("('\\0x30' + '\\0x31\\0x32' + '\\0x33\\0x34\\0x35') == '012345'" ,"","",T(1.0)),
  2267. test_ab<T>("'a\\'\\\\b' == a" ,"a'\\b","",T(1.0)),
  2268. test_ab<T>("'a\\\\\\'b' == a" ,"a\\'b","",T(1.0)),
  2269. test_ab<T>("'a\\'\\\\\\\\b' == a" ,"a'\\\\b","",T(1.0)),
  2270. test_ab<T>("'a\\0x30\\'\\0x31\\\\\\0x32b' == a" ,"a0'1\\2b","",T(1.0)),
  2271. test_ab<T>("var x := 3; x > 2 and 'abc' like '*bc'" ,"","",T(1.0)),
  2272. test_ab<T>("var x := 3; x > 2 and 'abc' ilike '*Bc'" ,"","",T(1.0)),
  2273. test_ab<T>("var x := 3; x > 2 and 'abc' in '123abc123'","","",T(1.0)),
  2274. test_ab<T>("var x := 3; var s := 'abc'; x > 2 and s like '*bc'" ,"","",T(1.0)),
  2275. test_ab<T>("var x := 3; var s := 'abc'; x > 2 and s ilike '*Bc'" ,"","",T(1.0)),
  2276. test_ab<T>("var x := 3; var s := 'abc'; x > 2 and s in '123abc123'","","",T(1.0)),
  2277. test_ab<T>("var x := 3; var s := 'abc'; var t := '*bc'; x > 2 and s like t" ,"","",T(1.0)),
  2278. test_ab<T>("var x := 3; var s := 'abc'; var t := '*Bc'; x > 2 and s ilike t" ,"","",T(1.0)),
  2279. test_ab<T>("var x := 3; var s := 'abc'; var t := '123abc123'; x > 2 and s in t","","",T(1.0)),
  2280. test_ab<T>("var x := 3; x > 2 and a like '*bc'" ,"abc","",T(1.0)),
  2281. test_ab<T>("var x := 3; x > 2 and a ilike '*Bc'" ,"abc","",T(1.0)),
  2282. test_ab<T>("var x := 3; x > 2 and a in '123abc123'","abc","",T(1.0)),
  2283. test_ab<T>("var x := 3; x > 2 and a like b ","abc","*bc",T(1.0)),
  2284. test_ab<T>("var x := 3; x > 2 and a ilike b","abc","*Bc",T(1.0)),
  2285. test_ab<T>("var x := 3; x > 2 and a in b ","abc","123abc123",T(1.0)),
  2286. test_ab<T>("a[] > 2 and a like '*bc'" ,"abc","",T(1.0)),
  2287. test_ab<T>("a[] > 2 and a ilike '*Bc'" ,"abc","",T(1.0)),
  2288. test_ab<T>("a[] > 2 and a in '123abc123'","abc","",T(1.0)),
  2289. test_ab<T>("a[] > 2 and a like b ","abc","*bc",T(1.0)),
  2290. test_ab<T>("a[] > 2 and a ilike b","abc","*Bc",T(1.0)),
  2291. test_ab<T>("a[] > 2 and a in b ","abc","123abc123",T(1.0)),
  2292. test_ab<T>("a[0:0] := b[ :]; a == '0XXXX'", "XXXXX","01234567890",T(1.0)),
  2293. test_ab<T>("a[0:1] := b[ :]; a == '01XXX'", "XXXXX","01234567890",T(1.0)),
  2294. test_ab<T>("a[0:2] := b[ :]; a == '012XX'", "XXXXX","01234567890",T(1.0)),
  2295. test_ab<T>("a[0:3] := b[ :]; a == '0123X'", "XXXXX","01234567890",T(1.0)),
  2296. test_ab<T>("a[0:4] := b[ :]; a == '01234'", "XXXXX","01234567890",T(1.0)),
  2297. test_ab<T>("a[0:0] := b[6:]; a == '6XXXX'", "XXXXX","01234567890",T(1.0)),
  2298. test_ab<T>("a[0:1] := b[6:]; a == '67XXX'", "XXXXX","01234567890",T(1.0)),
  2299. test_ab<T>("a[0:2] := b[6:]; a == '678XX'", "XXXXX","01234567890",T(1.0)),
  2300. test_ab<T>("a[0:3] := b[6:]; a == '6789X'", "XXXXX","01234567890",T(1.0)),
  2301. test_ab<T>("a[0:4] := b[6:]; a == '67890'", "XXXXX","01234567890",T(1.0)),
  2302. test_ab<T>("a[0:0] <=> b[ :]; (a == '0XXXX') and (b == 'X1234567890')", "XXXXX","01234567890",T(1.0)),
  2303. test_ab<T>("a[0:1] <=> b[ :]; (a == '01XXX') and (b == 'XX234567890')", "XXXXX","01234567890",T(1.0)),
  2304. test_ab<T>("a[0:2] <=> b[ :]; (a == '012XX') and (b == 'XXX34567890')", "XXXXX","01234567890",T(1.0)),
  2305. test_ab<T>("a[0:3] <=> b[ :]; (a == '0123X') and (b == 'XXXX4567890')", "XXXXX","01234567890",T(1.0)),
  2306. test_ab<T>("a[0:4] <=> b[ :]; (a == '01234') and (b == 'XXXXX567890')", "XXXXX","01234567890",T(1.0)),
  2307. test_ab<T>("a[0:0] <=> b[6:]; (a == '6XXXX') and (b == '012345X7890')", "XXXXX","01234567890",T(1.0)),
  2308. test_ab<T>("a[0:1] <=> b[6:]; (a == '67XXX') and (b == '012345XX890')", "XXXXX","01234567890",T(1.0)),
  2309. test_ab<T>("a[0:2] <=> b[6:]; (a == '678XX') and (b == '012345XXX90')", "XXXXX","01234567890",T(1.0)),
  2310. test_ab<T>("a[0:3] <=> b[6:]; (a == '6789X') and (b == '012345XXXX0')", "XXXXX","01234567890",T(1.0)),
  2311. test_ab<T>("a[0:4] <=> b[6:]; (a == '67890') and (b == '012345XXXXX')", "XXXXX","01234567890",T(1.0)),
  2312. test_ab<T>("var i := 0; a[0:i+0] := b[:]; a == '0XXXX'", "XXXXX","01234567890",T(1.0)),
  2313. test_ab<T>("var i := 0; a[0:i+1] := b[:]; a == '01XXX'", "XXXXX","01234567890",T(1.0)),
  2314. test_ab<T>("var i := 0; a[0:i+2] := b[:]; a == '012XX'", "XXXXX","01234567890",T(1.0)),
  2315. test_ab<T>("var i := 0; a[0:i+3] := b[:]; a == '0123X'", "XXXXX","01234567890",T(1.0)),
  2316. test_ab<T>("var i := 0; a[0:i+4] := b[:]; a == '01234'", "XXXXX","01234567890",T(1.0)),
  2317. test_ab<T>("var i := 0; a[0:i+0] <=> b[:]; (a == '0XXXX') and (b == 'X1234567890')", "XXXXX","01234567890",T(1.0)),
  2318. test_ab<T>("var i := 0; a[0:i+1] <=> b[:]; (a == '01XXX') and (b == 'XX234567890')", "XXXXX","01234567890",T(1.0)),
  2319. test_ab<T>("var i := 0; a[0:i+2] <=> b[:]; (a == '012XX') and (b == 'XXX34567890')", "XXXXX","01234567890",T(1.0)),
  2320. test_ab<T>("var i := 0; a[0:i+3] <=> b[:]; (a == '0123X') and (b == 'XXXX4567890')", "XXXXX","01234567890",T(1.0)),
  2321. test_ab<T>("var i := 0; a[0:i+4] <=> b[:]; (a == '01234') and (b == 'XXXXX567890')", "XXXXX","01234567890",T(1.0)),
  2322. test_ab<T>("var x := 'XXXXX'; var y := '01234567890'; x[0:0] := y[:]; x == '0XXXX'", "","",T(1.0)),
  2323. test_ab<T>("var x := 'XXXXX'; var y := '01234567890'; x[0:1] := y[:]; x == '01XXX'", "","",T(1.0)),
  2324. test_ab<T>("var x := 'XXXXX'; var y := '01234567890'; x[0:2] := y[:]; x == '012XX'", "","",T(1.0)),
  2325. test_ab<T>("var x := 'XXXXX'; var y := '01234567890'; x[0:3] := y[:]; x == '0123X'", "","",T(1.0)),
  2326. test_ab<T>("var x := 'XXXXX'; var y := '01234567890'; x[0:4] := y[:]; x == '01234'", "","",T(1.0)),
  2327. test_ab<T>("var x := 'XXXXX'; var y := '01234567890'; x[0:0] := y[6:]; x == '6XXXX'", "","",T(1.0)),
  2328. test_ab<T>("var x := 'XXXXX'; var y := '01234567890'; x[0:1] := y[6:]; x == '67XXX'", "","",T(1.0)),
  2329. test_ab<T>("var x := 'XXXXX'; var y := '01234567890'; x[0:2] := y[6:]; x == '678XX'", "","",T(1.0)),
  2330. test_ab<T>("var x := 'XXXXX'; var y := '01234567890'; x[0:3] := y[6:]; x == '6789X'", "","",T(1.0)),
  2331. test_ab<T>("var x := 'XXXXX'; var y := '01234567890'; x[0:4] := y[6:]; x == '67890'", "","",T(1.0)),
  2332. test_ab<T>("var x := 'XXXXX'; var y := '01234567890'; x[0:0] <=> y[:]; (x == '0XXXX') and (y == 'X1234567890')", "","",T(1.0)),
  2333. test_ab<T>("var x := 'XXXXX'; var y := '01234567890'; x[0:1] <=> y[:]; (x == '01XXX') and (y == 'XX234567890')", "","",T(1.0)),
  2334. test_ab<T>("var x := 'XXXXX'; var y := '01234567890'; x[0:2] <=> y[:]; (x == '012XX') and (y == 'XXX34567890')", "","",T(1.0)),
  2335. test_ab<T>("var x := 'XXXXX'; var y := '01234567890'; x[0:3] <=> y[:]; (x == '0123X') and (y == 'XXXX4567890')", "","",T(1.0)),
  2336. test_ab<T>("var x := 'XXXXX'; var y := '01234567890'; x[0:4] <=> y[:]; (x == '01234') and (y == 'XXXXX567890')", "","",T(1.0)),
  2337. test_ab<T>("var x := 'XXXXX'; var y := '01234567890'; x[0:0] <=> y[6:]; (x == '6XXXX') and (y == '012345X7890')", "","",T(1.0)),
  2338. test_ab<T>("var x := 'XXXXX'; var y := '01234567890'; x[0:1] <=> y[6:]; (x == '67XXX') and (y == '012345XX890')", "","",T(1.0)),
  2339. test_ab<T>("var x := 'XXXXX'; var y := '01234567890'; x[0:2] <=> y[6:]; (x == '678XX') and (y == '012345XXX90')", "","",T(1.0)),
  2340. test_ab<T>("var x := 'XXXXX'; var y := '01234567890'; x[0:3] <=> y[6:]; (x == '6789X') and (y == '012345XXXX0')", "","",T(1.0)),
  2341. test_ab<T>("var x := 'XXXXX'; var y := '01234567890'; x[0:4] <=> y[6:]; (x == '67890') and (y == '012345XXXXX')", "","",T(1.0)),
  2342. test_ab<T>("var x := 'XXXXX'; var y := '01234567890'; var i := 0; x[0:i+0] := y[:]; x == '0XXXX'", "","",T(1.0)),
  2343. test_ab<T>("var x := 'XXXXX'; var y := '01234567890'; var i := 0; x[0:i+1] := y[:]; x == '01XXX'", "","",T(1.0)),
  2344. test_ab<T>("var x := 'XXXXX'; var y := '01234567890'; var i := 0; x[0:i+2] := y[:]; x == '012XX'", "","",T(1.0)),
  2345. test_ab<T>("var x := 'XXXXX'; var y := '01234567890'; var i := 0; x[0:i+3] := y[:]; x == '0123X'", "","",T(1.0)),
  2346. test_ab<T>("var x := 'XXXXX'; var y := '01234567890'; var i := 0; x[0:i+4] := y[:]; x == '01234'", "","",T(1.0)),
  2347. test_ab<T>("var x := 'XXXXX'; var y := '01234567890'; var i := 0; x[0:i+0] <=> y[:]; (x == '0XXXX') and (y == 'X1234567890')", "","",T(1.0)),
  2348. test_ab<T>("var x := 'XXXXX'; var y := '01234567890'; var i := 0; x[0:i+1] <=> y[:]; (x == '01XXX') and (y == 'XX234567890')", "","",T(1.0)),
  2349. test_ab<T>("var x := 'XXXXX'; var y := '01234567890'; var i := 0; x[0:i+2] <=> y[:]; (x == '012XX') and (y == 'XXX34567890')", "","",T(1.0)),
  2350. test_ab<T>("var x := 'XXXXX'; var y := '01234567890'; var i := 0; x[0:i+3] <=> y[:]; (x == '0123X') and (y == 'XXXX4567890')", "","",T(1.0)),
  2351. test_ab<T>("var x := 'XXXXX'; var y := '01234567890'; var i := 0; x[0:i+4] <=> y[:]; (x == '01234') and (y == 'XXXXX567890')", "","",T(1.0)),
  2352. test_ab<T>("var v[4] := {1,2,3,4}; for (var i := 0; i < v[]; i += 1) { v[i] += 10; v[i] == 0 }; sum(v) == (1 + 2 + 3 + 4) + (v[] * 10)", "","",T(1.0)),
  2353. test_ab<T>("var v[4] := {1,2,3,4}; for (var i := 0; i < v[]; i += 1) { v[i] -= 10; v[i] == 0 }; sum(v) == (1 + 2 + 3 + 4) - (v[] * 10)", "","",T(1.0)),
  2354. test_ab<T>("var v[4] := {1,2,3,4}; for (var i := 0; i < v[]; i += 1) { v[i] *= 10; v[i] == 0 }; sum(v) == (1 + 2 + 3 + 4) * 10", "","",T(1.0)),
  2355. test_ab<T>("var v[4] := {1,2,3,4}; for (var i := 0; i < v[]; i += 1) { v[i] /= 10; v[i] == 0 }; sum(v) == (1 + 2 + 3 + 4) / 10", "","",T(1.0)),
  2356. test_ab<T>("a like b", "abcd", "abcd*", T(1.0)),
  2357. test_ab<T>("a like b", "abcd", "abcd" , T(1.0)),
  2358. test_ab<T>("a like b", "abcd", "abc*" , T(1.0)),
  2359. test_ab<T>("a like b", "abcd", "*bcd" , T(1.0)),
  2360. test_ab<T>("a like b", "abcd", "abc?" , T(1.0)),
  2361. test_ab<T>("a like b", "abcd", "?bcd" , T(1.0)),
  2362. test_ab<T>("a like b", "abcd", "ab?d" , T(1.0)),
  2363. test_ab<T>("a like b", "abcd", "ab*d" , T(1.0)),
  2364. test_ab<T>("a like b", "abcd", "a?cd" , T(1.0)),
  2365. test_ab<T>("a like b", "abcd", "a*cd" , T(1.0)),
  2366. test_ab<T>("a like b", "abcd", "a??d" , T(1.0)),
  2367. test_ab<T>("a like b", "abcd", "a*?d" , T(1.0)),
  2368. test_ab<T>("a like b", "abcd", "*bc*" , T(1.0)),
  2369. test_ab<T>("a like b", "abcd", "?bc?" , T(1.0)),
  2370. test_ab<T>("a like b", "abcd", "????" , T(1.0)),
  2371. test_ab<T>("a like b", "abcd", "a???" , T(1.0)),
  2372. test_ab<T>("a like b", "abcd", "ab??" , T(1.0)),
  2373. test_ab<T>("a like b", "abcd", "abc?" , T(1.0)),
  2374. test_ab<T>("a like b", "abcd", "???d" , T(1.0)),
  2375. test_ab<T>("a like b", "abcd", "??cd" , T(1.0)),
  2376. test_ab<T>("a like b", "abcd", "?bcd" , T(1.0)),
  2377. test_ab<T>("a like b", "abcd", "?b?d" , T(1.0)),
  2378. test_ab<T>("a like b", "abcd", "a?c?" , T(1.0)),
  2379. test_ab<T>("a like b", "abcd", "a??d" , T(1.0)),
  2380. test_ab<T>("a like b", "abcd", "?bc?" , T(1.0)),
  2381. test_ab<T>("a like b", "abcd", "ab**" , T(1.0)),
  2382. test_ab<T>("a like b", "abcd", "ab*?" , T(1.0)),
  2383. test_ab<T>("a like b", "abcd", "a***" , T(1.0)),
  2384. test_ab<T>("a like b", "abcd", "**cd" , T(1.0)),
  2385. test_ab<T>("a like b", "abcd", "*?cd" , T(1.0)),
  2386. test_ab<T>("a like b", "abcd", "***d" , T(1.0)),
  2387. test_ab<T>("a like b", "abcd", "*bc*" , T(1.0)),
  2388. test_ab<T>("a like b", "abcd", "*bc?" , T(1.0)),
  2389. test_ab<T>("a like b", "abcd", "*b??" , T(1.0)),
  2390. test_ab<T>("a like b", "abcd", "?bc*" , T(1.0)),
  2391. test_ab<T>("a like b", "abcd", "??c*" , T(1.0)),
  2392. test_ab<T>("a like b", "abcd", "*b?*" , T(1.0)),
  2393. test_ab<T>("a like b", "ab" , "a*" , T(1.0)),
  2394. test_ab<T>("a like b", "ab" , "a?" , T(1.0)),
  2395. test_ab<T>("a ilike b", "aBcD", "abcd*", T(1.0)),
  2396. test_ab<T>("a ilike b", "aBcD", "abcd" , T(1.0)),
  2397. test_ab<T>("a ilike b", "aBcD", "abc*" , T(1.0)),
  2398. test_ab<T>("a ilike b", "aBcD", "*bcd" , T(1.0)),
  2399. test_ab<T>("a ilike b", "aBcD", "abc?" , T(1.0)),
  2400. test_ab<T>("a ilike b", "aBcD", "?bcd" , T(1.0)),
  2401. test_ab<T>("a ilike b", "aBcD", "ab?d" , T(1.0)),
  2402. test_ab<T>("a ilike b", "aBcD", "ab*d" , T(1.0)),
  2403. test_ab<T>("a ilike b", "aBcD", "a?cd" , T(1.0)),
  2404. test_ab<T>("a ilike b", "aBcD", "a*cd" , T(1.0)),
  2405. test_ab<T>("a ilike b", "aBcD", "a??d" , T(1.0)),
  2406. test_ab<T>("a ilike b", "aBcD", "a*?d" , T(1.0)),
  2407. test_ab<T>("a ilike b", "aBcD", "*bc*" , T(1.0)),
  2408. test_ab<T>("a ilike b", "aBcD", "?bc?" , T(1.0)),
  2409. test_ab<T>("a ilike b", "aBcD", "????" , T(1.0)),
  2410. test_ab<T>("a ilike b", "aBcD", "a???" , T(1.0)),
  2411. test_ab<T>("a ilike b", "aBcD", "ab??" , T(1.0)),
  2412. test_ab<T>("a ilike b", "aBcD", "abc?" , T(1.0)),
  2413. test_ab<T>("a ilike b", "aBcD", "???d" , T(1.0)),
  2414. test_ab<T>("a ilike b", "aBcD", "??cd" , T(1.0)),
  2415. test_ab<T>("a ilike b", "aBcD", "?bcd" , T(1.0)),
  2416. test_ab<T>("a ilike b", "aBcD", "?b?d" , T(1.0)),
  2417. test_ab<T>("a ilike b", "aBcD", "a?c?" , T(1.0)),
  2418. test_ab<T>("a ilike b", "aBcD", "a??d" , T(1.0)),
  2419. test_ab<T>("a ilike b", "aBcD", "?bc?" , T(1.0)),
  2420. test_ab<T>("a ilike b", "aBcD", "ab**" , T(1.0)),
  2421. test_ab<T>("a ilike b", "aBcD", "ab*?" , T(1.0)),
  2422. test_ab<T>("a ilike b", "aBcD", "a***" , T(1.0)),
  2423. test_ab<T>("a ilike b", "aBcD", "**cd" , T(1.0)),
  2424. test_ab<T>("a ilike b", "aBcD", "*?cd" , T(1.0)),
  2425. test_ab<T>("a ilike b", "aBcD", "***d" , T(1.0)),
  2426. test_ab<T>("a ilike b", "aBcD", "*bc*" , T(1.0)),
  2427. test_ab<T>("a ilike b", "aBcD", "*bc?" , T(1.0)),
  2428. test_ab<T>("a ilike b", "aBcD", "*b??" , T(1.0)),
  2429. test_ab<T>("a ilike b", "aBcD", "?bc*" , T(1.0)),
  2430. test_ab<T>("a ilike b", "aBcD", "??c*" , T(1.0)),
  2431. test_ab<T>("a ilike b", "aBcD", "*b?*" , T(1.0)),
  2432. test_ab<T>("a ilike b", "aB" , "a*" , T(1.0)),
  2433. test_ab<T>("a ilike b", "aB" , "a?" , T(1.0))
  2434. };
  2435. static const std::size_t test_list_size = sizeof(test_list) / sizeof(test_ab<T>);
  2436. {
  2437. const std::size_t rounds = 50;
  2438. for (std::size_t r = 0; r < rounds; ++r)
  2439. {
  2440. bool result = true;
  2441. for (std::size_t i = 0; i < test_list_size; ++i)
  2442. {
  2443. test_ab<T>& test = const_cast<test_ab<T>&>(test_list[i]);
  2444. std::string str_a;
  2445. std::string str_b;
  2446. std::string str_c;
  2447. T r0 = T(2);
  2448. T r1 = T(6);
  2449. T r2 = T(7);
  2450. T r3 = T(3);
  2451. exprtk::symbol_table<T> symbol_table;
  2452. symbol_table.add_stringvar("a", str_a);
  2453. symbol_table.add_stringvar("b", str_b);
  2454. symbol_table.add_stringvar("c", str_c);
  2455. symbol_table.add_variable("r0", r0);
  2456. symbol_table.add_variable("r1", r1);
  2457. symbol_table.add_variable("r2", r2);
  2458. symbol_table.add_variable("r3", r3);
  2459. exprtk::expression<T> expression;
  2460. expression.register_symbol_table(symbol_table);
  2461. {
  2462. exprtk::parser<T> parser;
  2463. if (!parser.compile(test.expr, expression))
  2464. {
  2465. printf("run_test02() - Error: %s Expression: %s\n",
  2466. parser.error().c_str(),
  2467. test.expr.c_str());
  2468. result = false;
  2469. continue;
  2470. }
  2471. }
  2472. str_a = test.a;
  2473. str_b = test.b;
  2474. str_c = test.c;
  2475. T expr_result = expression.value();
  2476. if (not_equal(expr_result, test.result))
  2477. {
  2478. printf("run_test02() - Computation Error: Expression: [%s]\tExpected: %19.15f\tResult: %19.15f\t"
  2479. "a='%s'\tb='%s'\tc='%s'\n",
  2480. test.expr.c_str(),
  2481. (double)test.result,
  2482. (double)expr_result,
  2483. str_a.c_str(),
  2484. str_b.c_str(),
  2485. str_c.c_str());
  2486. result = false;
  2487. continue;
  2488. }
  2489. }
  2490. if (!result)
  2491. {
  2492. return false;
  2493. }
  2494. }
  2495. }
  2496. {
  2497. std::string s0;
  2498. std::string s1;
  2499. const std::string expression_str =
  2500. " s0 := 'abc'; "
  2501. " s0 := (s1 := '0123456789'[2:7]); "
  2502. " s1 := 'xyz'; "
  2503. " s0 < s1; ";
  2504. exprtk::symbol_table<T> symbol_table;
  2505. symbol_table.add_stringvar("s0" ,s0);
  2506. symbol_table.add_stringvar("s1" ,s1);
  2507. exprtk::expression<T> expression;
  2508. expression.register_symbol_table(symbol_table);
  2509. {
  2510. exprtk::parser<T> parser;
  2511. if (!parser.compile(expression_str,expression))
  2512. {
  2513. printf("run_test02() - [2] Error: %s Expression: %s\n",
  2514. parser.error().c_str(),
  2515. expression_str.c_str());
  2516. return false;
  2517. }
  2518. }
  2519. if (T(0) == expression.value())
  2520. {
  2521. printf("run_test02() - Evaluation Error [2]: Expression: [%s]\tExpected: True\n",
  2522. expression_str.c_str());
  2523. return false;
  2524. }
  2525. else if ("234567" != s0)
  2526. {
  2527. printf("run_test02() - Evaluation Error [2]: Expression: [%s]\tInvalid value for s0\n",
  2528. expression_str.c_str());
  2529. return false;
  2530. }
  2531. else if ("xyz" != s1)
  2532. {
  2533. printf("run_test02() - Evaluation Error [2]: Expression: [%s]\tInvalid value for s1\n",
  2534. expression_str.c_str());
  2535. return false;
  2536. }
  2537. }
  2538. return true;
  2539. }
  2540. template <typename T>
  2541. inline bool run_test03()
  2542. {
  2543. typedef exprtk::symbol_table<T> symbol_table_t;
  2544. typedef exprtk::expression<T> expression_t;
  2545. typedef exprtk::parser<T> parser_t;
  2546. std::string expression_string = "A+A0+aA+Aa0+b+B1+Bb+bB1+A+A0+AA+AA0+B+B1+BB+BB1+a+a0+aa+aa0+b+b1+bb+bb1+"
  2547. "c+C2+Cc+Cc2+D+D3+dD+dD3+C+C2+CC+CC2+D+D3+DD+DD3+c+c2+cc+cc2+d+d3+dd+dd3+"
  2548. "E+E4+eE+Ee4+f+F5+Ff+fF5+E+E4+EE+EE4+F+F5+FF+FF5+e+e4+ee+ee4+f+f5+ff+ff5+"
  2549. "g+G6+Gg+Gg6+H+H7+hH+hH7+G+G6+GG+GG6+H+H7+HH+HH7+g+g6+gg+gg6+h+h7+hh+hh7+"
  2550. "I+I8+iI+Ii8+j+J9+Jj+jJ9+I+I8+II+II8+J+J9+JJ+JJ9+i+i8+ii+ii8+j+j9+jj+jj9+"
  2551. "k+K0+Kk+Kk0+L+L1+lL+lL1+K+K0+KK+KK0+L+L1+LL+LL1+k+k0+kk+kk0+l+l1+ll+ll1+"
  2552. "M+M2+mM+Mm2+n+N3+Nn+nN3+M+M2+MM+MM2+N+N3+NN+NN3+m+m2+mm+mm2+n+n3+nn+nn3+"
  2553. "o+O4+Oo+Oo4+P+P5+pP+pP5+O+O4+OO+OO4+P+P5+PP+PP5+o+o4+oo+oo4+p+p5+pp+pp5+"
  2554. "Q+Q6+qQ+Qq6+r+R7+Rr+rR7+Q+Q6+QQ+QQ6+R+R7+RR+RR7+q+q6+qq+qq6+r+r7+rr+rr7+"
  2555. "s+S8+Ss+Ss8+T+T9+tT+tT9+S+S8+SS+SS8+T+T9+TT+TT9+s+s8+ss+ss8+t+t9+tt+tt9+"
  2556. "U+U0+uU+Uu0+v+V1+Vv+vV1+U+U0+UU+UU0+V+V1+VV+VV1+u+u0+uu+uu0+v+v1+vv+vv1+"
  2557. "w+W2+Ww+Ww2+X+X3+xX+xX3+W+W2+WW+WW2+X+X3+XX+XX3+w+w2+ww+ww2+x+x3+xx+xx3+"
  2558. "Y+Y4+yY+Yy4+z+Z5+Zz+zZ5+Y+Y4+YY+YY4+Z+Z5+ZZ+ZZ5+y+y4+yy+yy4+z+z5+zz+zz5 ";
  2559. static const std::string variable_list[] =
  2560. {
  2561. "A", "A0", "aA", "Aa0", "b", "B1", "Bb", "bB1",
  2562. "c", "C2", "Cc", "Cc2", "D", "D3", "dD", "dD3",
  2563. "E", "E4", "eE", "Ee4", "f", "F5", "Ff", "fF5",
  2564. "g", "G6", "Gg", "Gg6", "H", "H7", "hH", "hH7",
  2565. "I", "I8", "iI", "Ii8", "j", "J9", "Jj", "jJ9",
  2566. "k", "K0", "Kk", "Kk0", "L", "L1", "lL", "lL1",
  2567. "M", "M2", "mM", "Mm2", "n", "N3", "Nn", "nN3",
  2568. "o", "O4", "Oo", "Oo4", "P", "P5", "pP", "pP5",
  2569. "Q", "Q6", "qQ", "Qq6", "r", "R7", "Rr", "rR7",
  2570. "s", "S8", "Ss", "Ss8", "T", "T9", "tT", "tT9",
  2571. "U", "U0", "uU", "Uu0", "v", "V1", "Vv", "vV1",
  2572. "w", "W2", "Ww", "Ww2", "X", "X3", "xX", "xX3",
  2573. "Y", "Y4", "yY", "Yy4", "z", "Z5", "Zz", "zZ5"
  2574. };
  2575. static const std::size_t variable_list_size = sizeof(variable_list) / sizeof(std::string);
  2576. static const std::size_t rounds = 300;
  2577. for (std::size_t r = 0; r < rounds; ++r)
  2578. {
  2579. symbol_table_t symbol_table_0;
  2580. symbol_table_t symbol_table_1;
  2581. expression_t expression;
  2582. std::vector<T> v;
  2583. v.resize(variable_list_size);
  2584. for (std::size_t i = 0; i < variable_list_size; ++i)
  2585. {
  2586. v[i] = T(i);
  2587. if (i & 1)
  2588. symbol_table_0.add_variable(variable_list[i],v[i]);
  2589. else
  2590. symbol_table_1.add_variable(variable_list[i],v[i]);
  2591. }
  2592. std::size_t total_symbol_count = symbol_table_0.variable_count() +
  2593. symbol_table_1.variable_count();
  2594. if (variable_list_size != total_symbol_count)
  2595. {
  2596. printf("run_test03() - Error - Invalid number of variables in symbol_table! Expected: %d got: %d\n",
  2597. static_cast<unsigned int>(variable_list_size),
  2598. static_cast<unsigned int>(total_symbol_count));
  2599. return false;
  2600. }
  2601. symbol_table_0.add_constants();
  2602. expression.register_symbol_table(symbol_table_0);
  2603. expression.register_symbol_table(symbol_table_1);
  2604. {
  2605. exprtk::parser<T> parser;
  2606. if (!parser.compile(expression_string,expression))
  2607. {
  2608. printf("run_test03() - Error: %s Expression: %s\n",
  2609. parser.error().c_str(),
  2610. expression_string.c_str());
  2611. return false;
  2612. }
  2613. }
  2614. expression.value();
  2615. }
  2616. {
  2617. static const std::string invalid_expr[] =
  2618. {
  2619. "x y",
  2620. "x y z",
  2621. "x y z w",
  2622. "x 1",
  2623. "x 1 2",
  2624. "x 1 2 3",
  2625. "x 'abc'",
  2626. "x 1 'abc'",
  2627. "x 'abc' 1",
  2628. "1 2",
  2629. "1 2 3",
  2630. "1 2 3 4",
  2631. "'abc' 'xyz'",
  2632. "'abc' 1",
  2633. "1 'abc'",
  2634. "x sin(1)",
  2635. "s 'abc'",
  2636. "s x",
  2637. "s y",
  2638. "s 1",
  2639. "s 1 x",
  2640. "s 1 y",
  2641. "s x 1",
  2642. "s y 1",
  2643. "x s ",
  2644. "y s ",
  2645. "1 s ",
  2646. "1 s x",
  2647. "1 s y",
  2648. "x s 1",
  2649. "y s 1",
  2650. "v 'abc'",
  2651. "v x ",
  2652. "v y ",
  2653. "v s ",
  2654. "v 1 ",
  2655. "v 1 x",
  2656. "v 1 y",
  2657. "v 1 s",
  2658. "v x 1",
  2659. "v y 1",
  2660. "v s 1",
  2661. "x v ",
  2662. "y v ",
  2663. "1 v ",
  2664. "1 v x",
  2665. "1 v y",
  2666. "x v 1",
  2667. "y v 1",
  2668. "(x == 'a string' )",
  2669. "(x == 'a string'[1:2] )",
  2670. "(x == 'a string' + 'b string' )",
  2671. "(x == ('a string' + 'b string')[3:5])",
  2672. "('a string' == x )",
  2673. "('a string'[1:2] == x )",
  2674. "('a string' + 'b string' == x )",
  2675. "(('a string' + 'b string')[3:5] == x)",
  2676. "var a; var b; 3in(a)+sin(b) ",
  2677. "var a; var b; sin(a)+3in(b) ",
  2678. "var a; var b; sqrt(a)<3in(8) ",
  2679. "var a; var b; (1.99-3in((b-b))) ",
  2680. "var a; var b; ((3in(sin((b+b)))/1.06)-a) ",
  2681. "var a; var b; ((sin(3in((b+b)))/1.06)-a) ",
  2682. "var a; var b; (3in(x*(y+z))+cos(x*(y-z))) ",
  2683. "var a; var b; (cos(x*(y+z))+3in(x*(y-z))) ",
  2684. "1++++",
  2685. "1+-+-+",
  2686. "1===",
  2687. "1====",
  2688. "[*][*][*][*][*]",
  2689. "var v[1] := {}; var s0appe0 := false; repeat s0appe0 false for(){(){}}",
  2690. "var v[2] := {}; repeat var s0appe0 := false; s0appe0 false for(){(){}}",
  2691. "var v[3] := {}; repeat var s0appe0 := false; for(){(){}} s0appe0 false",
  2692. "var v[4] := {}; repeat var s0appe0 := false; s0appe0 for(){(){}} false",
  2693. "var v[5] := {}; repeat for(){(){}} var s0appe0 := false; s0appe0 false",
  2694. "var v{};v ;v 60;v 60;v o5"
  2695. };
  2696. const std::size_t invalid_expr_size = sizeof(invalid_expr) / sizeof(std::string);
  2697. {
  2698. for (std::size_t i = 0; i < invalid_expr_size; ++i)
  2699. {
  2700. symbol_table_t symbol_table;
  2701. expression_t expression;
  2702. parser_t parser;
  2703. T x = T(0);
  2704. std::string s;
  2705. std::vector<T> v(10, T(1.234));
  2706. symbol_table.add_variable ("x",x);
  2707. symbol_table.add_stringvar("s",s);
  2708. symbol_table.add_vector ("v",v);
  2709. if (parser.compile(invalid_expr[i],expression))
  2710. {
  2711. printf("run_test03() - Error: [1] Invalid expression compiled successfuly. Expression: %s\n",
  2712. invalid_expr[i].c_str());
  2713. return false;
  2714. }
  2715. }
  2716. }
  2717. {
  2718. T x = T(0);
  2719. std::string s;
  2720. std::vector<T> v(10, T(1.234));
  2721. symbol_table_t symbol_table;
  2722. parser_t parser;
  2723. symbol_table.add_variable ("x",x);
  2724. symbol_table.add_stringvar("s",s);
  2725. symbol_table.add_vector ("v",v);
  2726. for (std::size_t i = 0; i < invalid_expr_size; ++i)
  2727. {
  2728. exprtk::expression<T> expression;
  2729. if (parser.compile(invalid_expr[i],expression))
  2730. {
  2731. printf("run_test03() - Error: [2] Invalid expression compiled successfuly. Expression: %s\n",
  2732. invalid_expr[i].c_str());
  2733. return false;
  2734. }
  2735. }
  2736. }
  2737. {
  2738. const std::string base_expression =
  2739. "1+(2+2(3+3(4+4cos(((((a+((x*(e-tan((cos((((((b/(tan(((1.60*a)-0.34))-0.76))-x)+y)-3.27)+a))/pi))))^a))+y)*b)-e))+e)/z)+w)+"
  2740. "(((b+(a/((((tan((b*((((((a-(cos((cos(tan(((a+a)*3.33)))-b))/2.52))*x)/b)+3.07)^0.86)+b)))*3.95)/0.39)*y)+a)))*a)*z)";
  2741. const std::string mod =
  2742. "abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789^+-/*,;:<>=%?[]{}() #&'\"\\\t\r\n";
  2743. symbol_table_t symbol_table;
  2744. expression_t expression;
  2745. parser_t parser;
  2746. T a = T(1.1 );
  2747. T b = T(2.2 );
  2748. T c = T(3.3 );
  2749. T d = T(4.5 );
  2750. T e = T(4.5 );
  2751. T x = T(2.123456);
  2752. T y = T(3.123456);
  2753. T z = T(4.123456);
  2754. T w = T(5.123456);
  2755. symbol_table.add_variable("a", a);
  2756. symbol_table.add_variable("b", b);
  2757. symbol_table.add_variable("c", c);
  2758. symbol_table.add_variable("d", d);
  2759. symbol_table.add_variable("e", e);
  2760. symbol_table.add_variable("x", x);
  2761. symbol_table.add_variable("y", y);
  2762. symbol_table.add_variable("z", z);
  2763. symbol_table.add_variable("w", w);
  2764. expression.register_symbol_table(symbol_table);
  2765. T total = T(0);
  2766. for (std::size_t j = 0; j < base_expression.size(); ++j)
  2767. {
  2768. std::string expression_str = base_expression;
  2769. const char old_c = base_expression[j];
  2770. for (std::size_t i = 0; i < mod.size(); ++i)
  2771. {
  2772. expression_str[j] = mod[i];
  2773. if (parser.compile(expression_str, expression))
  2774. {
  2775. total += expression.value();
  2776. }
  2777. }
  2778. expression_str[j] = old_c;
  2779. }
  2780. if (total == T(12345.6789)) { printf(" "); }
  2781. }
  2782. }
  2783. return true;
  2784. }
  2785. template <typename T>
  2786. inline T clamp(const T& l, const T& v, const T& u)
  2787. {
  2788. return (v < l) ? l : ((v > u) ? u : v);
  2789. }
  2790. template <typename T>
  2791. inline bool run_test04()
  2792. {
  2793. std::string expression_string = "clamp(-1.0,sin(2 * pi * x) + cos(y / 2 * pi),+1.0)";
  2794. exprtk::symbol_table<T> symbol_table;
  2795. exprtk::expression<T> expression;
  2796. T x = T(-1000);
  2797. T y = T(-1000);
  2798. symbol_table.add_variable("x",x);
  2799. symbol_table.add_variable("y",y);
  2800. symbol_table.add_constants();
  2801. expression.register_symbol_table(symbol_table);
  2802. {
  2803. exprtk::parser<T> parser;
  2804. if (!parser.compile(expression_string,expression))
  2805. {
  2806. printf("run_test04() - Error: %s Expression: %s\n",
  2807. parser.error().c_str(),
  2808. expression_string.c_str());
  2809. return false;
  2810. }
  2811. }
  2812. const T pi = T(3.141592653589793238462643383279502);
  2813. const T increment = T(0.0001);
  2814. while ((x <= T(+1000)) && (y <= T(+1000)))
  2815. {
  2816. T result1 = expression.value();
  2817. T result2 = clamp<T>(-1.0,std::sin(2 * pi * x) + std::cos(y / 2 * pi),+1.0);
  2818. if (not_equal(result1,result2))
  2819. {
  2820. printf("run_test04() - Computation Error: Expression: [%s]\tExpected: %19.15f\tResult: %19.15f x:%19.15f\ty:%19.15f\n",
  2821. expression_string.c_str(),
  2822. (double)result1,
  2823. (double)result2,
  2824. (double)x,
  2825. (double)y);
  2826. return false;
  2827. }
  2828. x += increment;
  2829. y += increment;
  2830. }
  2831. return true;
  2832. }
  2833. template <typename T>
  2834. inline bool run_test05()
  2835. {
  2836. typedef exprtk::expression<T> expression_t;
  2837. std::string expression_string = "clamp(-1.0,sin(2 * pi * x_var123) + cos(y_var123 / 2 * pi),+1.0)";
  2838. exprtk::symbol_table<T> symbol_table;
  2839. std::deque<expression_t> expression_list;
  2840. T x = T(-1000);
  2841. T y = T(-1000);
  2842. symbol_table.add_variable("x_var123",x);
  2843. symbol_table.add_variable("y_var123",y);
  2844. symbol_table.add_constants();
  2845. const std::size_t expression_count = 10;
  2846. for (std::size_t i = 0; i < expression_count; ++i)
  2847. {
  2848. expression_t e;
  2849. e.register_symbol_table(symbol_table);
  2850. {
  2851. exprtk::parser<T> parser;
  2852. if (!parser.compile(expression_string,e))
  2853. {
  2854. printf("run_test05() - Error: %s Expression: %s\n",
  2855. parser.error().c_str(),
  2856. expression_string.c_str());
  2857. return false;
  2858. }
  2859. }
  2860. expression_list.push_back(e);
  2861. }
  2862. const T pi = T(3.141592653589793238462643383279502);
  2863. const T increment = T(0.001);
  2864. while ((x <= T(+1000)) && (y <= T(+1000)))
  2865. {
  2866. T real_result = clamp<T>(-1.0,std::sin(2 * pi * x) + std::cos(y / 2 * pi),+1.0);
  2867. for (std::size_t i = 0; i < expression_list.size(); ++i)
  2868. {
  2869. expression_t& expr = expression_list[i];
  2870. T result = expr.value();
  2871. if (not_equal(result,real_result))
  2872. {
  2873. printf("run_test05() - Computation Error: Expression: [%s]\tExpected: %19.15f\tResult: %19.15f x:%19.15f\ty:%19.15f\tIndex:%d\n",
  2874. expression_string.c_str(),
  2875. (double)real_result,
  2876. (double)result,
  2877. (double)x,
  2878. (double)y,
  2879. static_cast<unsigned int>(i));
  2880. return false;
  2881. }
  2882. }
  2883. x += increment;
  2884. y += increment;
  2885. }
  2886. return true;
  2887. }
  2888. template <typename T>
  2889. inline bool run_test06()
  2890. {
  2891. typedef exprtk::expression<T> expression_t;
  2892. std::string expression_string = "sqrt(1 - (x^2))";
  2893. T x = T(0);
  2894. exprtk::symbol_table<T> symbol_table;
  2895. symbol_table.add_variable("x",x);
  2896. expression_t expression;
  2897. expression.register_symbol_table(symbol_table);
  2898. {
  2899. exprtk::parser<T> parser;
  2900. if (!parser.compile(expression_string,expression))
  2901. {
  2902. printf("run_test06() - Error: %s Expression: %s\n",
  2903. parser.error().c_str(),
  2904. expression_string.c_str());
  2905. return false;
  2906. }
  2907. }
  2908. T total_area1 = exprtk::integrate(expression,x,T(-1),T(1));
  2909. T total_area2 = exprtk::integrate(expression,"x",T(-1),T(1));
  2910. const T pi = T(3.141592653589793238462643383279502);
  2911. if (not_equal(total_area1,total_area2,T(0.000001)))
  2912. {
  2913. printf("run_test06() - Integration Error: area1 != area2\n");
  2914. return false;
  2915. }
  2916. if (not_equal(total_area1,T(pi) / T(2),T(0.000001)))
  2917. {
  2918. printf("run_test06() - Integration Error: Expected: %19.15f\tResult: %19.15f\n",
  2919. (double)(pi / T(2)),
  2920. (double)total_area1);
  2921. return false;
  2922. }
  2923. return true;
  2924. }
  2925. template <typename T>
  2926. inline bool run_test07()
  2927. {
  2928. typedef exprtk::expression<T> expression_t;
  2929. std::string expression_string = "sin(2x + 1 / 3)";
  2930. T x = T(0);
  2931. exprtk::symbol_table<T> symbol_table;
  2932. symbol_table.add_variable("x",x);
  2933. expression_t expression;
  2934. expression.register_symbol_table(symbol_table);
  2935. {
  2936. exprtk::parser<T> parser;
  2937. if (!parser.compile(expression_string,expression))
  2938. {
  2939. printf("run_test07() - Error: %s Expression: %s\n",
  2940. parser.error().c_str(),
  2941. expression_string.c_str());
  2942. return false;
  2943. }
  2944. }
  2945. for (x = T(-200); x < T(200); x += T(0.0001))
  2946. {
  2947. {
  2948. T deriv1_real_result = T(2) * std::cos(T(2) * x + T(1.0 / 3.0));
  2949. T deriv1_result1 = exprtk::derivative(expression,x);
  2950. T deriv1_result2 = exprtk::derivative(expression,"x");
  2951. if (not_equal(deriv1_result1,deriv1_result2,T(0.00001)))
  2952. {
  2953. printf("run_test07() - 1st Derivative Error: result1 != result2\n");
  2954. return false;
  2955. }
  2956. if (not_equal(deriv1_result1,deriv1_real_result,T(0.00001)))
  2957. {
  2958. printf("run_test07() - 1st Derivative Error: x: %19.15f\tExpected: %19.15f\tResult: %19.15f\n",
  2959. (double)x,
  2960. (double)deriv1_real_result,
  2961. (double)deriv1_result1);
  2962. return false;
  2963. }
  2964. }
  2965. {
  2966. T deriv2_real_result = T(-4) * std::sin(T(2) * x + T(1.0 / 3.0));
  2967. T deriv2_result1 = exprtk::second_derivative(expression,x);
  2968. T deriv2_result2 = exprtk::second_derivative(expression,"x");
  2969. if (not_equal(deriv2_result1,deriv2_result2,T(0.0000001)))
  2970. {
  2971. printf("run_test07() - 2nd Derivative Error: result1 != result2\n");
  2972. return false;
  2973. }
  2974. if (not_equal(deriv2_result1,deriv2_real_result,T(0.01)))
  2975. {
  2976. printf("run_test07() - 2nd Derivative Error: x: %19.15f\tExpected: %19.15f\tResult: %19.15f\n",
  2977. (double)x,
  2978. (double)deriv2_real_result,
  2979. (double)deriv2_result1);
  2980. return false;
  2981. }
  2982. }
  2983. {
  2984. T deriv3_real_result = T(-8) * std::cos(T(2) * x + T(1.0 / 3.0));
  2985. T deriv3_result1 = exprtk::third_derivative(expression,x);
  2986. T deriv3_result2 = exprtk::third_derivative(expression,"x");
  2987. if (not_equal(deriv3_result1,deriv3_result2,T(0.0000001)))
  2988. {
  2989. printf("run_test07() - 3rd Derivative Error: result1 != result2\n");
  2990. return false;
  2991. }
  2992. if (not_equal(deriv3_result1,deriv3_real_result,T(0.01)))
  2993. {
  2994. printf("run_test07() - 3rd Derivative Error: x: %19.15f\tExpected: %19.15f\tResult: %19.15f\n",
  2995. (double)x,
  2996. (double)deriv3_real_result,
  2997. (double)deriv3_result1);
  2998. return false;
  2999. }
  3000. }
  3001. }
  3002. return true;
  3003. }
  3004. template <typename T>
  3005. inline bool run_test08()
  3006. {
  3007. static const std::string expr_str[] =
  3008. {
  3009. "x", "y", "z", "w", "u",
  3010. "x + y + z + w + u",
  3011. "x + y / z * w ^ u",
  3012. "x:=1.1", "y:=2.2", "z:=3.3", "w:=4.4", "u:=5.5",
  3013. "x:=x+1.1", "y:=y+2.2", "z:=z+3.3", "w:=w+4.4", "u:=u+5.5",
  3014. "x:=1.1+x", "y:=2.2+y", "z:=3.3+z", "w:=4.4+w", "u:=5.5+u",
  3015. "x:=(x <= 1.1)",
  3016. "y:=(2.2 >= y)",
  3017. "z:=(3.3 and z)",
  3018. "w:=(4.4 or w)",
  3019. "u:=(u xor 5.5)",
  3020. "min(x,y) + min(x,y,z) + min(x,y,z,w) + min(x,y,z,w,y)",
  3021. "max(x,y) + max(x,y,z) + max(x,y,z,w) + max(x,y,z,w,y)",
  3022. "avg(x,y)",
  3023. "avg(x,y,z)",
  3024. "avg(x,y,z,w)",
  3025. "avg(x,y,z,w,u)",
  3026. "(u := u := min(x:=1,y:=2,z:=3)) == 1",
  3027. "(2x+3y+4z+5w)==(2*x+3*y+4*z+5*w)",
  3028. "(3(x+y)/2+1)==(3*(x+y)/2+1)",
  3029. "((x+y)3+1/4)==((x+y)*3+1/4)",
  3030. "((x+y)z+1/2)==((x+y)*z+1/2)",
  3031. "(x+y^3/z) == (x+(y*y*y)/z)",
  3032. "(z-x^3+y^2*7) == (z-(x*x*x)+(y*y)*7)",
  3033. "(3min(x,y))==(3*min(x,y))",
  3034. "(sin(x)y)==(sin(x)*y)",
  3035. "(sin(x)cos(y)+1)==(sin(x)*cos(y)+1)",
  3036. "(sgn(sin(x))cos(sgn(y))+1)==(sgn(sin(x))*cos(sgn(y))+1)",
  3037. "equal($f00(x,y,z),(x+y)/z)",
  3038. "equal($f01(x,y,z),(x+y)*z)",
  3039. "equal($f02(x,y,z),(x+y)-z)",
  3040. "equal($f03(x,y,z),(x+y)+z)",
  3041. "equal($f04(x,y,z),(x-y)+z)",
  3042. "equal($f05(x,y,z),(x-y)/z)",
  3043. "equal($f06(x,y,z),(x-y)*z)",
  3044. "equal($f07(x,y,z),(x*y)+z)",
  3045. "equal($f08(x,y,z),(x*y)-z)",
  3046. "equal($f09(x,y,z),(x*y)/z)",
  3047. "equal($f10(x,y,z),(x*y)*z)",
  3048. "equal($f11(x,y,z),(x/y)+z)",
  3049. "equal($f12(x,y,z),(x/y)-z)",
  3050. "equal($f13(x,y,z),(x/y)/z)",
  3051. "equal($f14(x,y,z),(x/y)*z)",
  3052. "equal($f15(x,y,z),x/(y+z))",
  3053. "equal($f16(x,y,z),x/(y-z))",
  3054. "equal($f17(x,y,z),x/(y*z))",
  3055. "equal($f18(x,y,z),x/(y/z))",
  3056. "equal($f19(x,y,z),x*(y+z))",
  3057. "equal($f20(x,y,z),x*(y-z))",
  3058. "equal($f21(x,y,z),x*(y*z))",
  3059. "equal($f22(x,y,z),x*(y/z))",
  3060. "equal($f23(x,y,z),x-(y+z))",
  3061. "equal($f24(x,y,z),x-(y-z))",
  3062. "equal($f25(x,y,z),x-(y/z))",
  3063. "equal($f26(x,y,z),x-(y*z))",
  3064. "equal($f27(x,y,z),x+(y*z))",
  3065. "equal($f28(x,y,z),x+(y/z))",
  3066. "equal($f29(x,y,z),x+(y+z))",
  3067. "equal($f30(x,y,z),x+(y-z))",
  3068. "equal($f31(x,y,z),x*y^2+z)",
  3069. "equal($f32(x,y,z),x*y^3+z)",
  3070. "equal($f33(x,y,z),x*y^4+z)",
  3071. "equal($f34(x,y,z),x*y^5+z)",
  3072. "equal($f35(x,y,z),x*y^6+z)",
  3073. "equal($f36(x,y,z),x*y^7+z)",
  3074. "equal($f37(x,y,z),x*y^8+z)",
  3075. "equal($f38(x,y,z),x*y^9+z)",
  3076. "equal($f39(x,y,z),x*log(y)+z)",
  3077. "equal($f40(x,y,z),x*log(y)-z)",
  3078. "equal($f41(x,y,z),x*log10(y)+z)",
  3079. "equal($f42(x,y,z),x*log10(y)-z)",
  3080. "equal($f43(x,y,z),x*sin(y)+z)",
  3081. "equal($f44(x,y,z),x*sin(y)-z)",
  3082. "equal($f45(x,y,z),x*cos(y)+z)",
  3083. "equal($f46(x,y,z),x*cos(y)-z)",
  3084. "equal($f47(x,y,z),if(0!=x,y,z))",
  3085. "equal($f48(x,y,z,w),x+((y+z)/w))",
  3086. "equal($f49(x,y,z,w),x+((y+z)*w))",
  3087. "equal($f50(x,y,z,w),x+((y-z)/w))",
  3088. "equal($f51(x,y,z,w),x+((y-z)*w))",
  3089. "equal($f52(x,y,z,w),x+((y*z)/w))",
  3090. "equal($f53(x,y,z,w),x+((y*z)*w))",
  3091. "equal($f54(x,y,z,w),x+((y/z)+w))",
  3092. "equal($f55(x,y,z,w),x+((y/z)/w))",
  3093. "equal($f56(x,y,z,w),x+((y/z)*w))",
  3094. "equal($f57(x,y,z,w),x-((y+z)/w))",
  3095. "equal($f58(x,y,z,w),x-((y+z)*w))",
  3096. "equal($f59(x,y,z,w),x-((y-z)/w))",
  3097. "equal($f60(x,y,z,w),x-((y-z)*w))",
  3098. "equal($f61(x,y,z,w),x-((y*z)/w))",
  3099. "equal($f62(x,y,z,w),x-((y*z)*w))",
  3100. "equal($f63(x,y,z,w),x-((y/z)/w))",
  3101. "equal($f64(x,y,z,w),x-((y/z)*w))",
  3102. "equal($f65(x,y,z,w),((x+y)*z)-w)",
  3103. "equal($f66(x,y,z,w),((x-y)*z)-w)",
  3104. "equal($f67(x,y,z,w),((x*y)*z)-w)",
  3105. "equal($f68(x,y,z,w),((x/y)*z)-w)",
  3106. "equal($f69(x,y,z,w),((x+y)/z)-w)",
  3107. "equal($f70(x,y,z,w),((x-y)/z)-w)",
  3108. "equal($f71(x,y,z,w),((x*y)/z)-w)",
  3109. "equal($f72(x,y,z,w),((x/y)/z)-w)",
  3110. "equal($f73(x,y,z,w),(x*y)+(z*w))",
  3111. "equal($f74(x,y,z,w),(x*y)-(z*w))",
  3112. "equal($f75(x,y,z,w),(x*y)+(z/w))",
  3113. "equal($f76(x,y,z,w),(x*y)-(z/w))",
  3114. "equal($f77(x,y,z,w),(x/y)+(z/w))",
  3115. "equal($f78(x,y,z,w),(x/y)-(z/w))",
  3116. "equal($f79(x,y,z,w),(x/y)-(z*w))",
  3117. "equal($f80(x,y,z,w),x/(y+(z*w)))",
  3118. "equal($f81(x,y,z,w),x/(y-(z*w)))",
  3119. "equal($f82(x,y,z,w),x*(y+(z*w)))",
  3120. "equal($f83(x,y,z,w),x*(y-(z*w)))",
  3121. "equal($f84(x,y,z,w),x*y^2+z*w^2)",
  3122. "equal($f85(x,y,z,w),x*y^3+z*w^3)",
  3123. "equal($f86(x,y,z,w),x*y^4+z*w^4)",
  3124. "equal($f87(x,y,z,w),x*y^5+z*w^5)",
  3125. "equal($f88(x,y,z,w),x*y^6+z*w^6)",
  3126. "equal($f89(x,y,z,w),x*y^7+z*w^7)",
  3127. "equal($f90(x,y,z,w),x*y^8+z*w^8)",
  3128. "equal($f91(x,y,z,w),x*y^9+z*w^9)",
  3129. "equal($f92(x,y,z,w),if(x and y,z,w))",
  3130. "equal($f93(x,y,z,w),if(x or y,z,w))",
  3131. "equal($f94(x,y,z,w),if(x < y,z,w))",
  3132. "equal($f95(x,y,z,w),if(x <= y,z,w))",
  3133. "equal($f96(x,y,z,w),if(x > y,z,w))",
  3134. "equal($f97(x,y,z,w),if(x >= y,z,w))",
  3135. "equal($f98(x,y,z,w),if(equal(x,y),z,w))",
  3136. "equal($f92(x,y,z,w),x and y ? z : w)",
  3137. "equal($f93(x,y,z,w),x or y ? z : w)",
  3138. "equal($f94(x,y,z,w),x < y ? z : w)",
  3139. "equal($f95(x,y,z,w),x <= y ? z : w)",
  3140. "equal($f96(x,y,z,w),x > y ? z : w)",
  3141. "equal($f97(x,y,z,w),x >= y ? z : w)",
  3142. "equal($f98(x,y,z,w),equal(x,y) ? z : w)",
  3143. "equal($f99(x,y,z,w),x*sin(y)+z*cos(w))"
  3144. };
  3145. static const std::size_t expr_str_size = sizeof(expr_str) / sizeof(std::string);
  3146. static const std::size_t rounds = 25;
  3147. for (std::size_t i = 0; i < rounds; ++i)
  3148. {
  3149. for (std::size_t j = 0; j < expr_str_size; ++j)
  3150. {
  3151. typedef exprtk::expression<T> expression_t;
  3152. T x = T(1.12345);
  3153. T y = T(2.12345);
  3154. T z = T(3.12345);
  3155. T w = T(4.12345);
  3156. T u = T(5.12345);
  3157. exprtk::symbol_table<T> symbol_table;
  3158. symbol_table.add_variable("x",x);
  3159. symbol_table.add_variable("y",y);
  3160. symbol_table.add_variable("z",z);
  3161. symbol_table.add_variable("w",w);
  3162. symbol_table.add_variable("u",u);
  3163. expression_t expression;
  3164. expression.register_symbol_table(symbol_table);
  3165. {
  3166. exprtk::parser<T> parser;
  3167. if (!parser.compile(expr_str[j],expression))
  3168. {
  3169. printf("run_test08() - Error: %s Expression: %s\n",
  3170. parser.error().c_str(),
  3171. expr_str[j].c_str());
  3172. return false;
  3173. }
  3174. }
  3175. expression.value();
  3176. }
  3177. }
  3178. return true;
  3179. }
  3180. template <typename T>
  3181. struct myfunc : public exprtk::ifunction<T>
  3182. {
  3183. using exprtk::ifunction<T>::operator();
  3184. myfunc() : exprtk::ifunction<T>(2) {}
  3185. inline T operator()(const T& v1, const T& v2)
  3186. {
  3187. return T(1) + (v1 * v2) / T(3);
  3188. }
  3189. };
  3190. #define define_free_functions(N,Type) \
  3191. Type N##1(Type v0) { return v0; } \
  3192. Type N##2(Type v0, Type v1) { return v0 + v1; } \
  3193. Type N##3(Type v0, Type v1, Type v2) { return v0 + v1 + v2; } \
  3194. Type N##4(Type v0, Type v1, Type v2, Type v3) { return v0 + v1 + v2 + v3; } \
  3195. Type N##5(Type v0, Type v1, Type v2, Type v3, Type v4) { return v0 + v1 + v2 + v3 + v4; } \
  3196. Type N##6(Type v0, Type v1, Type v2, Type v3, Type v4, Type v5) { return v0 + v1 + v2 + v3 + v4 + v5; } \
  3197. define_free_functions(foo,numeric_type)
  3198. #undef define_free_functions
  3199. template <typename T>
  3200. inline bool run_test09()
  3201. {
  3202. {
  3203. static const std::size_t rounds = 1000;
  3204. for (std::size_t i = 0; i < rounds; ++i)
  3205. {
  3206. typedef exprtk::expression<T> expression_t;
  3207. std::string expression_string = "myfunc0(sin(x * pi),y / 2) + myfunc1(sin(x * pi),y / 2)+"
  3208. "myfunc2(sin(x * pi),y / 2) + myfunc3(sin(x * pi),y / 2)+"
  3209. "myfunc4(sin(x * pi),y / 2) + myfunc5(sin(x * pi),y / 2)+"
  3210. "myfunc6(sin(x * pi),y / 2) + myfunc7(sin(x * pi),y / 2)+"
  3211. "myfunc8(sin(x * pi),y / 2) + myfunc9(sin(x * pi),y / 2)+"
  3212. "myfunc0(sin(x * pi),y / 2) + myfunc1(sin(x * pi),y / 2)+"
  3213. "myfunc2(sin(x * pi),y / 2) + myfunc3(sin(x * pi),y / 2)+"
  3214. "myfunc4(sin(x * pi),y / 2) + myfunc5(sin(x * pi),y / 2)+"
  3215. "myfunc6(sin(x * pi),y / 2) + myfunc7(sin(x * pi),y / 2)+"
  3216. "myfunc8(sin(x * pi),y / 2) + myfunc9(sin(x * pi),y / 2)+"
  3217. "myfunc0(sin(x * pi),y / 2) + myfunc1(sin(x * pi),y / 2)+"
  3218. "myfunc2(sin(x * pi),y / 2) + myfunc3(sin(x * pi),y / 2)+"
  3219. "myfunc4(sin(x * pi),y / 2) + myfunc5(sin(x * pi),y / 2)+"
  3220. "myfunc6(sin(x * pi),y / 2) + myfunc7(sin(x * pi),y / 2)+"
  3221. "myfunc8(sin(x * pi),y / 2) + myfunc9(sin(x * pi),y / 2)+"
  3222. "myfunc0(sin(x * pi),y / 2) + myfunc1(sin(x * pi),y / 2)+"
  3223. "myfunc2(sin(x * pi),y / 2) + myfunc3(sin(x * pi),y / 2)+"
  3224. "myfunc4(sin(x * pi),y / 2) + myfunc5(sin(x * pi),y / 2)+"
  3225. "myfunc6(sin(x * pi),y / 2) + myfunc7(sin(x * pi),y / 2)+"
  3226. "myfunc8(sin(x * pi),y / 2) + myfunc9(sin(x * pi),y / 2)";
  3227. T x = T(1) + (i / T(10000));
  3228. T y = T(2) + (i / T(10000));
  3229. myfunc<T> mf;
  3230. exprtk::symbol_table<T> symbol_table;
  3231. symbol_table.add_variable("x",x);
  3232. symbol_table.add_variable("y",y);
  3233. symbol_table.add_function("myfunc0",mf);
  3234. symbol_table.add_function("myfunc1",mf);
  3235. symbol_table.add_function("myfunc2",mf);
  3236. symbol_table.add_function("myfunc3",mf);
  3237. symbol_table.add_function("myfunc4",mf);
  3238. symbol_table.add_function("myfunc5",mf);
  3239. symbol_table.add_function("myfunc6",mf);
  3240. symbol_table.add_function("myfunc7",mf);
  3241. symbol_table.add_function("myfunc8",mf);
  3242. symbol_table.add_function("myfunc9",mf);
  3243. symbol_table.add_constants();
  3244. expression_t expression;
  3245. expression.register_symbol_table(symbol_table);
  3246. {
  3247. exprtk::parser<T> parser;
  3248. if (!parser.compile(expression_string,expression))
  3249. {
  3250. printf("run_test09() - Error: %s Expression: %s\n",
  3251. parser.error().c_str(),
  3252. expression_string.c_str());
  3253. return false;
  3254. }
  3255. }
  3256. const T pi = T(3.141592653589793238462643383279502);
  3257. T result = expression.value();
  3258. T expected = T(4) *
  3259. (
  3260. mf(sin(x*pi),y / T(2)) +
  3261. mf(sin(x*pi),y / T(2)) +
  3262. mf(sin(x*pi),y / T(2)) +
  3263. mf(sin(x*pi),y / T(2)) +
  3264. mf(sin(x*pi),y / T(2)) +
  3265. mf(sin(x*pi),y / T(2)) +
  3266. mf(sin(x*pi),y / T(2)) +
  3267. mf(sin(x*pi),y / T(2)) +
  3268. mf(sin(x*pi),y / T(2)) +
  3269. mf(sin(x*pi),y / T(2))
  3270. );
  3271. if (not_equal(result,expected,T(0.0000001)))
  3272. {
  3273. printf("run_test09() - Error Expected: %19.15f\tResult: %19.15f\n",
  3274. (double)expected,
  3275. (double)result);
  3276. return false;
  3277. }
  3278. }
  3279. }
  3280. {
  3281. typedef exprtk::expression<T> expression_t;
  3282. typedef exprtk::symbol_table<T> symbol_table_t;
  3283. bool result = true;
  3284. const std::string expression_list[] =
  3285. {
  3286. "foo1(1) == 1",
  3287. "foo2(1,2) == (1 + 2)",
  3288. "foo3(1,2,3) == (1 + 2 + 3)",
  3289. "foo4(1,2,3,4) == (1 + 2 + 3 + 4)",
  3290. "foo5(1,2,3,4,5) == (1 + 2 + 3 + 4 + 5)",
  3291. "foo6(1,2,3,4,5,6) == (1 + 2 + 3 + 4 + 5 + 6)"
  3292. };
  3293. const std::size_t expression_list_size = sizeof(expression_list) / sizeof(std::string);
  3294. symbol_table_t symbol_table;
  3295. symbol_table.add_function("foo1",foo1);
  3296. symbol_table.add_function("foo2",foo2);
  3297. symbol_table.add_function("foo3",foo3);
  3298. symbol_table.add_function("foo4",foo4);
  3299. symbol_table.add_function("foo5",foo5);
  3300. symbol_table.add_function("foo6",foo6);
  3301. for (std::size_t i = 0; i < expression_list_size; ++i)
  3302. {
  3303. expression_t expression;
  3304. expression.register_symbol_table(symbol_table);
  3305. exprtk::parser<T> parser;
  3306. if (!parser.compile(expression_list[i],expression))
  3307. {
  3308. printf("run_test09() - Error: %s Expression: %s\n",
  3309. parser.error().c_str(),
  3310. expression_list[i].c_str());
  3311. result = false;
  3312. }
  3313. }
  3314. if (!result)
  3315. return false;
  3316. }
  3317. return true;
  3318. }
  3319. template <typename T>
  3320. inline bool run_test10()
  3321. {
  3322. typedef exprtk::expression<T> expression_t;
  3323. T x = T(1.1);
  3324. T y = T(2.2);
  3325. T xx = T(3.3);
  3326. T yy = T(4.4);
  3327. std::string i_s = "A String";
  3328. std::string j_s = "Another String";
  3329. std::string ii_s = "A String";
  3330. std::string jj_s = "Another String";
  3331. struct test
  3332. {
  3333. static inline bool variable(exprtk::symbol_table<T>& symbol_table, const std::string& variable_name, const T& value)
  3334. {
  3335. exprtk::details::variable_node<T>* var = symbol_table.get_variable(variable_name);
  3336. if (var)
  3337. return (!not_equal(var->ref(),value));
  3338. else
  3339. return false;
  3340. }
  3341. static inline bool string(exprtk::symbol_table<T>& symbol_table, const std::string& string_name, const std::string& str)
  3342. {
  3343. exprtk::details::stringvar_node<T>* str_node = symbol_table.get_stringvar(string_name);
  3344. if (str_node)
  3345. return (str_node->ref() == str);
  3346. else
  3347. return false;
  3348. }
  3349. };
  3350. {
  3351. static const std::size_t rounds = 10;
  3352. exprtk::symbol_table<T> symbol_table;
  3353. for (std::size_t r = 0; r < rounds; ++r)
  3354. {
  3355. symbol_table.add_variable("x", x);
  3356. symbol_table.add_variable("y", y);
  3357. symbol_table.add_variable("xx", xx);
  3358. symbol_table.add_variable("yy", yy);
  3359. if (!symbol_table.symbol_exists("x"))
  3360. {
  3361. printf("run_test10() - Symbol 'x' does not exist!\n");
  3362. return false;
  3363. }
  3364. else if (!symbol_table.symbol_exists("y"))
  3365. {
  3366. printf("run_test10() - Symbol 'y' does not exist!\n");
  3367. return false;
  3368. }
  3369. else if (!symbol_table.symbol_exists("xx"))
  3370. {
  3371. printf("run_test10() - Symbol 'xx' does not exist!\n");
  3372. return false;
  3373. }
  3374. else if (!symbol_table.symbol_exists("yy"))
  3375. {
  3376. printf("run_test10() - Symbol 'yy' does not exist!\n");
  3377. return false;
  3378. }
  3379. else if (!test::variable(symbol_table, "x", x))
  3380. {
  3381. printf("run_test10() - Symbol 'x' value failure!\n");
  3382. return false;
  3383. }
  3384. else if (!test::variable(symbol_table, "y", y))
  3385. {
  3386. printf("run_test10() - Symbol 'y' value failure!\n");
  3387. return false;
  3388. }
  3389. else if (!test::variable(symbol_table, "xx", xx))
  3390. {
  3391. printf("run_test10() - Symbol 'xx' value failure!\n");
  3392. return false;
  3393. }
  3394. else if (!test::variable(symbol_table, "yy", yy))
  3395. {
  3396. printf("run_test10() - Symbol 'yy' value failure!\n");
  3397. return false;
  3398. }
  3399. if (!symbol_table.remove_variable("x"))
  3400. {
  3401. printf("run_test10() - Failed to remove symbol 'x'!\n");
  3402. return false;
  3403. }
  3404. else if (!symbol_table.remove_variable("y"))
  3405. {
  3406. printf("run_test10() - Failed to remove symbol 'y'!\n");
  3407. return false;
  3408. }
  3409. else if (!symbol_table.remove_variable("xx"))
  3410. {
  3411. printf("run_test10() - Failed to remove symbol 'xx'!\n");
  3412. return false;
  3413. }
  3414. else if (!symbol_table.remove_variable("yy"))
  3415. {
  3416. printf("run_test10() - Failed to remove symbol 'yy'!\n");
  3417. return false;
  3418. }
  3419. }
  3420. for (std::size_t r = 0; r < rounds; ++r)
  3421. {
  3422. myfunc<T> mf;
  3423. symbol_table.add_function("f", mf);
  3424. symbol_table.add_function("f1", mf);
  3425. if (!symbol_table.symbol_exists("f"))
  3426. {
  3427. printf("run_test10() - function 'f' does not exist!\n");
  3428. return false;
  3429. }
  3430. else if (!symbol_table.symbol_exists("f1"))
  3431. {
  3432. printf("run_test10() - function 'f1' does not exist!\n");
  3433. return false;
  3434. }
  3435. if (!symbol_table.remove_function("f"))
  3436. {
  3437. printf("run_test10() - Failed to remove function 'f'!\n");
  3438. return false;
  3439. }
  3440. else if (!symbol_table.remove_function("f1"))
  3441. {
  3442. printf("run_test10() - Failed to remove function 'f1'!\n");
  3443. return false;
  3444. }
  3445. }
  3446. for (std::size_t r = 0; r < rounds; ++r)
  3447. {
  3448. symbol_table.add_stringvar("i", i_s);
  3449. symbol_table.add_stringvar("j", j_s);
  3450. symbol_table.add_stringvar("ii", ii_s);
  3451. symbol_table.add_stringvar("jj", jj_s);
  3452. if (!symbol_table.symbol_exists("i"))
  3453. {
  3454. printf("run_test10() - String 'i' does not exist!\n");
  3455. return false;
  3456. }
  3457. else if (!symbol_table.symbol_exists("j"))
  3458. {
  3459. printf("run_test10() - String 'j' does not exist!\n");
  3460. return false;
  3461. }
  3462. else if (!symbol_table.symbol_exists("ii"))
  3463. {
  3464. printf("run_test10() - String 'ii' does not exist!\n");
  3465. return false;
  3466. }
  3467. else if (!symbol_table.symbol_exists("jj"))
  3468. {
  3469. printf("run_test10() - String 'jj' does not exist!\n");
  3470. return false;
  3471. }
  3472. else if (!test::string(symbol_table, "i", i_s))
  3473. {
  3474. printf("run_test10() - String 'i' value failure!\n");
  3475. return false;
  3476. }
  3477. else if (!test::string(symbol_table, "j", j_s))
  3478. {
  3479. printf("run_test10() - String 'j' value failure!\n");
  3480. return false;
  3481. }
  3482. else if (!test::string(symbol_table, "ii", ii_s))
  3483. {
  3484. printf("run_test10() - String 'ii' value failure!\n");
  3485. return false;
  3486. }
  3487. else if (!test::string(symbol_table, "jj", jj_s))
  3488. {
  3489. printf("run_test10() - String 'jj' value failure!\n");
  3490. return false;
  3491. }
  3492. else if (!symbol_table.remove_stringvar("i"))
  3493. {
  3494. printf("run_test10() - Failed to remove String 'i'!\n");
  3495. return false;
  3496. }
  3497. else if (!symbol_table.remove_stringvar("j"))
  3498. {
  3499. printf("run_test10() - Failed to remove String 'j'!\n");
  3500. return false;
  3501. }
  3502. else if (!symbol_table.remove_stringvar("ii"))
  3503. {
  3504. printf("run_test10() - Failed to remove String 'ii'!\n");
  3505. return false;
  3506. }
  3507. else if (!symbol_table.remove_stringvar("jj"))
  3508. {
  3509. printf("run_test10() - Failed to remove String 'jj'!\n");
  3510. return false;
  3511. }
  3512. }
  3513. for (std::size_t r = 0; r < rounds; ++r)
  3514. {
  3515. symbol_table.add_variable("x", x);
  3516. symbol_table.add_variable("y", y);
  3517. symbol_table.add_variable("xx", xx);
  3518. symbol_table.add_variable("yy", yy);
  3519. std::vector<std::string> expected_var_list;
  3520. expected_var_list.push_back("x");
  3521. expected_var_list.push_back("y");
  3522. expected_var_list.push_back("xx");
  3523. expected_var_list.push_back("yy");
  3524. std::deque<std::pair<std::string, T> > variable_list;
  3525. symbol_table.get_variable_list(variable_list);
  3526. if (variable_list.size() != expected_var_list.size())
  3527. {
  3528. printf("run_test10() - Failed to get variable list (1)\n");
  3529. return false;
  3530. }
  3531. std::size_t found_count = 0;
  3532. for (std::size_t i = 0; i < variable_list.size(); ++i)
  3533. {
  3534. for (std::size_t j = 0; j < expected_var_list.size(); ++j)
  3535. {
  3536. if (variable_list[i].first == expected_var_list[j])
  3537. {
  3538. ++found_count;
  3539. break;
  3540. }
  3541. }
  3542. }
  3543. if (found_count != expected_var_list.size())
  3544. {
  3545. printf("run_test10() - Failed to get variable list (2)\n");
  3546. return false;
  3547. }
  3548. }
  3549. for (std::size_t r = 0; r < rounds; ++r)
  3550. {
  3551. symbol_table.add_variable("x", x);
  3552. symbol_table.add_variable("y", y);
  3553. symbol_table.add_variable("xx", xx);
  3554. symbol_table.add_variable("yy", yy);
  3555. std::vector<std::string> expected_var_list;
  3556. expected_var_list.push_back("x");
  3557. expected_var_list.push_back("y");
  3558. expected_var_list.push_back("xx");
  3559. expected_var_list.push_back("yy");
  3560. std::deque<std::string> variable_list;
  3561. symbol_table.get_variable_list(variable_list);
  3562. if (variable_list.size() != expected_var_list.size())
  3563. {
  3564. printf("run_test10() - Failed to get variable list (3)\n");
  3565. return false;
  3566. }
  3567. std::size_t found_count = 0;
  3568. for (std::size_t i = 0; i < variable_list.size(); ++i)
  3569. {
  3570. for (std::size_t j = 0; j < expected_var_list.size(); ++j)
  3571. {
  3572. if (variable_list[i] == expected_var_list[j])
  3573. {
  3574. ++found_count;
  3575. break;
  3576. }
  3577. }
  3578. }
  3579. if (found_count != expected_var_list.size())
  3580. {
  3581. printf("run_test10() - Failed to get variable list (4)\n");
  3582. return false;
  3583. }
  3584. }
  3585. for (std::size_t r = 0; r < rounds; ++r)
  3586. {
  3587. symbol_table.add_stringvar("i", i_s);
  3588. symbol_table.add_stringvar("j", j_s);
  3589. symbol_table.add_stringvar("ii", ii_s);
  3590. symbol_table.add_stringvar("jj", jj_s);
  3591. std::vector<std::string> expected_var_list;
  3592. expected_var_list.push_back("i");
  3593. expected_var_list.push_back("j");
  3594. expected_var_list.push_back("ii");
  3595. expected_var_list.push_back("jj");
  3596. std::deque<std::pair<std::string, std::string> > stringvar_list;
  3597. symbol_table.get_stringvar_list(stringvar_list);
  3598. if (stringvar_list.size() != expected_var_list.size())
  3599. {
  3600. printf("run_test10() - Failed to get stringvar list (1)\n");
  3601. return false;
  3602. }
  3603. std::size_t found_count = 0;
  3604. for (std::size_t i = 0; i < stringvar_list.size(); ++i)
  3605. {
  3606. for (std::size_t j = 0; j < expected_var_list.size(); ++j)
  3607. {
  3608. if (stringvar_list[i].first == expected_var_list[j])
  3609. {
  3610. ++found_count;
  3611. break;
  3612. }
  3613. }
  3614. }
  3615. if (found_count != expected_var_list.size())
  3616. {
  3617. printf("run_test10() - Failed to get stringvar list (2)\n");
  3618. return false;
  3619. }
  3620. }
  3621. for (std::size_t r = 0; r < rounds; ++r)
  3622. {
  3623. symbol_table.add_stringvar("i", i_s);
  3624. symbol_table.add_stringvar("j", j_s);
  3625. symbol_table.add_stringvar("ii", ii_s);
  3626. symbol_table.add_stringvar("jj", jj_s);
  3627. std::vector<std::string> expected_var_list;
  3628. expected_var_list.push_back("i");
  3629. expected_var_list.push_back("j");
  3630. expected_var_list.push_back("ii");
  3631. expected_var_list.push_back("jj");
  3632. std::deque<std::string> stringvar_list;
  3633. symbol_table.get_stringvar_list(stringvar_list);
  3634. if (stringvar_list.size() != expected_var_list.size())
  3635. {
  3636. printf("run_test10() - Failed to get stringvar list (3.0)\n");
  3637. return false;
  3638. }
  3639. if (symbol_table.stringvar_count() != expected_var_list.size())
  3640. {
  3641. printf("run_test10() - Failed to get stringvar list (3.1)\n");
  3642. return false;
  3643. }
  3644. std::size_t found_count = 0;
  3645. for (std::size_t i = 0; i < stringvar_list.size(); ++i)
  3646. {
  3647. for (std::size_t j = 0; j < expected_var_list.size(); ++j)
  3648. {
  3649. if (stringvar_list[i] == expected_var_list[j])
  3650. {
  3651. ++found_count;
  3652. break;
  3653. }
  3654. }
  3655. }
  3656. if (found_count != expected_var_list.size())
  3657. {
  3658. printf("run_test10() - Failed to get stringvar list (4)\n");
  3659. return false;
  3660. }
  3661. }
  3662. }
  3663. {
  3664. T x0 = T(0);
  3665. T y0 = T(0);
  3666. T z0 = T(0);
  3667. std::string expression_string = "(x0 + y0) / z0";
  3668. static const std::size_t rounds = 100;
  3669. for (std::size_t i = 0; i < rounds; ++i)
  3670. {
  3671. expression_t expression0;
  3672. x0 = T(i + 1.11);
  3673. y0 = T(i + 2.22);
  3674. z0 = T(i + 3.33);
  3675. exprtk::symbol_table<T> st0;
  3676. st0.add_variable("x0",x0);
  3677. st0.add_variable("y0",y0);
  3678. st0.add_variable("z0",z0);
  3679. expression0.register_symbol_table(st0);
  3680. {
  3681. exprtk::parser<T> parser;
  3682. if (!parser.compile(expression_string,expression0))
  3683. {
  3684. printf("run_test10() - Error: %s Expression: %s\n",
  3685. parser.error().c_str(),
  3686. expression_string.c_str());
  3687. return false;
  3688. }
  3689. }
  3690. {
  3691. expression_t expression1;
  3692. exprtk::symbol_table<T> st1 = st0;
  3693. expression1.register_symbol_table(st1);
  3694. {
  3695. exprtk::parser<T> parser;
  3696. if (!parser.compile(expression_string,expression1))
  3697. {
  3698. printf("run_test10() - Error: %s Expression: %s\n",
  3699. parser.error().c_str(),
  3700. expression_string.c_str());
  3701. return false;
  3702. }
  3703. }
  3704. st1.remove_variable("x0");
  3705. st1.remove_variable("y0");
  3706. st1.remove_variable("z0");
  3707. }
  3708. }
  3709. }
  3710. {
  3711. T a = T(1);
  3712. T b = T(2);
  3713. T c = T(3);
  3714. T d = T(4);
  3715. std::string e = "string";
  3716. exprtk::symbol_table<T> symbol_table;
  3717. symbol_table.add_variable ("a",a);
  3718. symbol_table.add_variable ("b",b);
  3719. symbol_table.add_variable ("c",c);
  3720. symbol_table.add_variable ("d",d);
  3721. symbol_table.add_stringvar("e",e);
  3722. expression_t expression;
  3723. expression.register_symbol_table(symbol_table);
  3724. std::string expression_string = "(E == '1234') and (sin(a) + C) / b";
  3725. typedef exprtk::parser<T> parser_t;
  3726. typedef typename parser_t::dependent_entity_collector::symbol_t symbol_t;
  3727. std::deque<symbol_t> symbol_list;
  3728. {
  3729. parser_t parser;
  3730. parser.dec().collect_variables() = true;
  3731. parser.dec().collect_functions() = true;
  3732. if (!parser.compile(expression_string,expression))
  3733. {
  3734. printf("run_test10() - Error: %s Expression: %s\n",
  3735. parser.error().c_str(),
  3736. expression_string.c_str());
  3737. return false;
  3738. }
  3739. parser.dec().symbols(symbol_list);
  3740. }
  3741. std::deque<symbol_t> expected_symbol_list;
  3742. expected_symbol_list.push_back(symbol_t("a" ,parser_t::e_st_variable));
  3743. expected_symbol_list.push_back(symbol_t("b" ,parser_t::e_st_variable));
  3744. expected_symbol_list.push_back(symbol_t("c" ,parser_t::e_st_variable));
  3745. expected_symbol_list.push_back(symbol_t("e" ,parser_t::e_st_string ));
  3746. expected_symbol_list.push_back(symbol_t("sin",parser_t::e_st_function));
  3747. bool result = (symbol_list.size() == expected_symbol_list.size()) &&
  3748. std::equal(symbol_list.begin(),
  3749. symbol_list.end(),
  3750. expected_symbol_list.begin());
  3751. if (!result)
  3752. {
  3753. printf("run_test10() - Failed variable list comparison.(5)\n");
  3754. return false;
  3755. }
  3756. }
  3757. {
  3758. T a = T(1);
  3759. T b = T(2);
  3760. T c = T(3);
  3761. T d = T(4);
  3762. std::string e = "string";
  3763. exprtk::symbol_table<T> symbol_table;
  3764. symbol_table.add_variable ("a",a);
  3765. symbol_table.add_variable ("b",b);
  3766. symbol_table.add_variable ("c",c);
  3767. symbol_table.add_variable ("d",d);
  3768. symbol_table.add_stringvar("e",e);
  3769. expression_t expression;
  3770. expression.register_symbol_table(symbol_table);
  3771. std::string expression_string = "a := b + c; "
  3772. "b := c + d; "
  3773. "c := d + 1; "
  3774. "e := e + 'abc'; ";
  3775. typedef exprtk::parser<T> parser_t;
  3776. typedef typename parser_t::dependent_entity_collector::symbol_t symbol_t;
  3777. std::deque<symbol_t> variable_list;
  3778. {
  3779. parser_t parser;
  3780. parser.dec().collect_assignments() = true;
  3781. if (!parser.compile(expression_string,expression))
  3782. {
  3783. printf("run_test10() - Error: %s Expression: %s\n",
  3784. parser.error().c_str(),
  3785. expression_string.c_str());
  3786. return false;
  3787. }
  3788. parser.dec().assignment_symbols(variable_list);
  3789. }
  3790. std::deque<symbol_t> expected_assignment_list;
  3791. expected_assignment_list.push_back(symbol_t("a",parser_t::e_st_variable));
  3792. expected_assignment_list.push_back(symbol_t("b",parser_t::e_st_variable));
  3793. expected_assignment_list.push_back(symbol_t("c",parser_t::e_st_variable));
  3794. expected_assignment_list.push_back(symbol_t("e",parser_t::e_st_string ));
  3795. bool result = (variable_list.size() == expected_assignment_list.size()) &&
  3796. std::equal(variable_list.begin(),
  3797. variable_list.end(),
  3798. expected_assignment_list.begin());
  3799. if (!result)
  3800. {
  3801. printf("run_test10() - Failed variable list comparison.(6)\n");
  3802. return false;
  3803. }
  3804. }
  3805. {
  3806. exprtk::symbol_table<T> symbol_table0;
  3807. exprtk::symbol_table<T> symbol_table1;
  3808. if (symbol_table0 == symbol_table1)
  3809. {
  3810. printf("run_test10() - Error symbol_table0 and symbol_table1 are equal\n");
  3811. return false;
  3812. }
  3813. symbol_table0 = symbol_table1;
  3814. symbol_table1 = symbol_table0;
  3815. if (!(symbol_table0 == symbol_table1))
  3816. {
  3817. printf("run_test10() - Error symbol_table0 and symbol_table1 are not equal\n");
  3818. return false;
  3819. }
  3820. }
  3821. {
  3822. T a = T(1);
  3823. T b = T(2);
  3824. T c = T(3);
  3825. T d = T(4);
  3826. std::string e = "a string";
  3827. exprtk::symbol_table<T> symbol_table0;
  3828. exprtk::symbol_table<T> symbol_table1;
  3829. expression_t expression;
  3830. for (std::size_t i = 0; i < 10000; ++i)
  3831. {
  3832. symbol_table0.clear();
  3833. symbol_table1.clear();
  3834. symbol_table0.add_variable ("a",a);
  3835. symbol_table0.add_variable ("b",b);
  3836. symbol_table0.add_variable ("c",c);
  3837. symbol_table0.add_variable ("d",d);
  3838. symbol_table0.add_stringvar("e",e);
  3839. symbol_table0.add_constants( );
  3840. symbol_table1.add_variable ("a",a);
  3841. symbol_table1.add_variable ("b",b);
  3842. symbol_table1.add_variable ("c",c);
  3843. symbol_table1.add_variable ("d",d);
  3844. symbol_table1.add_stringvar("e",e);
  3845. symbol_table1.add_constants( );
  3846. expression.register_symbol_table(symbol_table0);
  3847. expression.register_symbol_table(symbol_table1);
  3848. }
  3849. }
  3850. {
  3851. const std::string expression =
  3852. "for (var i := 0; i < min(x[],y[],z[]); i += 1)"
  3853. "{ z[i] := 3sin(x[i]) + 2log(y[i]); }";
  3854. std::vector<std::string> var_symbol_list;
  3855. std::vector<std::string> func_symbol_list;
  3856. if (!exprtk::collect_variables(expression, var_symbol_list))
  3857. {
  3858. printf("run_test10() - Failed to collect variables.\n");
  3859. return false;
  3860. }
  3861. if (!exprtk::collect_functions(expression, func_symbol_list))
  3862. {
  3863. printf("run_test10() - Failed to collect functions.\n");
  3864. return false;
  3865. }
  3866. std::sort(var_symbol_list .begin(), var_symbol_list .end());
  3867. std::sort(func_symbol_list.begin(), func_symbol_list.end());
  3868. std::vector<std::string> expected_var_symbol_list;
  3869. std::vector<std::string> expected_func_symbol_list;
  3870. expected_var_symbol_list.push_back("i");
  3871. expected_var_symbol_list.push_back("x");
  3872. expected_var_symbol_list.push_back("y");
  3873. expected_var_symbol_list.push_back("z");
  3874. expected_func_symbol_list.push_back("log");
  3875. expected_func_symbol_list.push_back("min");
  3876. expected_func_symbol_list.push_back("sin");
  3877. const bool var_result = (var_symbol_list.size() == expected_var_symbol_list.size()) &&
  3878. std::equal(var_symbol_list.begin(),
  3879. var_symbol_list.end(),
  3880. expected_var_symbol_list.begin());
  3881. if (!var_result)
  3882. {
  3883. printf("run_test10() - Failed collected variable comparison between recieved and expected variables\n");
  3884. return false;
  3885. }
  3886. const bool func_result = (func_symbol_list.size() == expected_func_symbol_list.size()) &&
  3887. std::equal(func_symbol_list.begin(),
  3888. func_symbol_list.end(),
  3889. expected_func_symbol_list.begin());
  3890. if (!func_result)
  3891. {
  3892. printf("run_test10() - Failed collected fuctions comparison between recieved and expected functions\n");
  3893. return false;
  3894. }
  3895. }
  3896. {
  3897. std::string expression_list[] =
  3898. {
  3899. "var x; 1",
  3900. "var x := 1; x",
  3901. "var x := 1; var y := 2; 1",
  3902. "var x := 1; var y := 2; x",
  3903. "var x:=6; var y:=4; x + -3 == 3",
  3904. "var x:=6; var y:=4; x - -3 == 9",
  3905. "var x:=6; var y:=4; x * -3 == -18",
  3906. "var x:=6; var y:=4; x / -3 == -2",
  3907. "var x:=6; var y:=4; -x + -3 == -9",
  3908. "var x:=6; var y:=4; -x - -3 == -3",
  3909. "var x:=6; var y:=4; -x * -3 == 18",
  3910. "var x:=6; var y:=4; -x / -3 == 2",
  3911. "var x:=6; var y:=4; -3 + -x == -9",
  3912. "var x:=6; var y:=4; -3 - -x == 3",
  3913. "var x:=6; var y:=4; -3 * -x == 18",
  3914. "var x:=6; var y:=4; -3 / -x == 0.5",
  3915. "var x:=6; var y:=4; 3 + -x == -3",
  3916. "var x:=6; var y:=4; 3 - -x == 9",
  3917. "var x:=6; var y:=4; 3 * -x == -18",
  3918. "var x:=6; var y:=4; 3 / -x == -0.5",
  3919. "var x := 3; var y := 6; x + -y == -3",
  3920. "var x := 3; var y := 6; x - -y == 9",
  3921. "var x := 3; var y := 6; -x + -y == -9",
  3922. "var x := 3; var y := 6; -x - -y == 3",
  3923. "var x := 3; var y := 6; -x * -y == 18",
  3924. "var x := 6; var y := 3; -x / -y == 2",
  3925. "var x := 3; var y := 6; -(-x * -y) == -18",
  3926. "var x := 6; var y := 3; -(-x / -y) == -2",
  3927. "var x:=1; 2+(3+abs(x)) == 6 ",
  3928. "var x:=1; (3+abs(x))+2 == 6 ",
  3929. "var x:=1; 2+(abs(x)+3) == 6 ",
  3930. "var x:=1; (abs(x)+3)+2 == 6 ",
  3931. "var x:=1; 2+(3-abs(x)) == 4 ",
  3932. "var x:=1; (3-abs(x))+2 == 4 ",
  3933. "var x:=1; 2+(abs(x)-3) == 0 ",
  3934. "var x:=1; (abs(x)-3)+2 == 0 ",
  3935. "var x:=1; 2-(3+abs(x)) == -2 ",
  3936. "var x:=1; (3+abs(x))-2 == 2 ",
  3937. "var x:=1; 2-(abs(x)+3) == -2 ",
  3938. "var x:=1; (abs(x)+3)-2 == 2 ",
  3939. "var x:=1; 2*(3*abs(x)) == 6 ",
  3940. "var x:=1; (3*abs(x))*2 == 6 ",
  3941. "var x:=1; 2*(abs(x)*3) == 6 ",
  3942. "var x:=1; (abs(x)*3)*2 == 6 ",
  3943. "var x:=1; 2*(3/abs(x)) == 6 ",
  3944. "var x:=1; (3/abs(x))*2 == 6 ",
  3945. "var x:=1; 2*(abs(x)/3) == (2/3)",
  3946. "var x:=1; (abs(x)/3)*2 == (2/3)",
  3947. "var x:=1; 2/(3*abs(x)) == (2/3)",
  3948. "var x:=1; (3*abs(x))/2 == (3/2)",
  3949. "var x:=1; 2/(abs(x)*3) == (2/3)",
  3950. "var x:=1; (abs(x)*3)/2 == (3/2)",
  3951. "var x:=1; 2/(3/abs(x)) == (2/3)",
  3952. "var x:=1; (3/abs(x))/2 == (3/2)",
  3953. "var x:=1; 2/(abs(x)/3) == 6 ",
  3954. "var x:=1; (abs(x)/3)/2 == (1/6)",
  3955. "var x:=3; var y:=6; -(-x)*-(-y) == 18",
  3956. "var x:=3; var y:=6; -(-x)*-(-(-y)) == -18",
  3957. "var x:=3; var y:=6; -(-(-x))*-(-y) == -18",
  3958. "var x:=3; var y:=6; -(-(-x))*-(-(-y)) == 18",
  3959. "var x:=3; var y:=6; -(-(x+y))*-(-(y+x)) == 81",
  3960. "var x:=3; var y:=6; -(-(-(x+y)))*-(-(y+x)) == -81",
  3961. "var x:=3; var y:=6; -(-(x+y))*-(-(-(y+x))) == -81",
  3962. "var x:=3; var y:=6; -(-(-(x+y)))*-(-(-(y+x))) == 81",
  3963. "var x:= 2; var y := 3; (-abs(x)+-abs(y)) == -5 ",
  3964. "var x:= 2; var y := 3; (-abs(x)--abs(y)) == 1 ",
  3965. "var x:= 2; var y := 3; (-abs(x)*-abs(y)) == 6 ",
  3966. "var x:= 2; var y := 3; (-abs(x)/-abs(y)) == (2/3) ",
  3967. "var x:= 2; var y := 3; (-abs(x)+abs(y)) == 1 ",
  3968. "var x:= 2; var y := 3; (-abs(x)-abs(y)) == -5 ",
  3969. "var x:= 2; var y := 3; (-abs(x)*abs(y)) == -6 ",
  3970. "var x:= 2; var y := 3; (-abs(x)/abs(y)) == -(2/3) ",
  3971. "var x:= 2; var y := 3; (abs(x)+-abs(y)) == -1 ",
  3972. "var x:= 2; var y := 3; (abs(x)--abs(y)) == 5 ",
  3973. "var x:= 2; var y := 3; (abs(x)*-abs(y)) == -6 ",
  3974. "var x:= 2; var y := 3; (abs(x)/-abs(y)) == -(2/3) ",
  3975. "var x:= 2; var y := 3; (-abs(x + 0)+-abs(y - 0)) == -5 ",
  3976. "var x:= 2; var y := 3; (-abs(x + 0)--abs(y - 0)) == 1 ",
  3977. "var x:= 2; var y := 3; (-abs(x + 0)*-abs(y - 0)) == 6 ",
  3978. "var x:= 2; var y := 3; (-abs(x + 0)/-abs(y - 0)) == (2/3) ",
  3979. "var x:= 2; var y := 3; (-abs(x + 0)+abs(y - 0)) == 1 ",
  3980. "var x:= 2; var y := 3; (-abs(x + 0)-abs(y - 0)) == -5 ",
  3981. "var x:= 2; var y := 3; (-abs(x + 0)*abs(y - 0)) == -6 ",
  3982. "var x:= 2; var y := 3; (-abs(x + 0)/abs(y - 0)) == -(2/3) ",
  3983. "var x:= 2; var y := 3; (abs(x + 0)+-abs(y - 0)) == -1 ",
  3984. "var x:= 2; var y := 3; (abs(x + 0)--abs(y - 0)) == 5 ",
  3985. "var x:= 2; var y := 3; (abs(x + 0)*-abs(y - 0)) == -6 ",
  3986. "var x:= 2; var y := 3; (abs(x + 0)/-abs(y - 0)) == -(2/3) ",
  3987. "var x := 1; var y := 2; swap(x,y); (x == 2) and (y == 1)",
  3988. "var x := 1; var y := 2; x <=> y ; (x == 2) and (y == 1)",
  3989. "var x := 'abc'; x == 'abc' ",
  3990. "var x := 'abc'; var y := '123'; x != y ",
  3991. "var x := 'abc'; var y := x + '123'; y == 'abc123' ",
  3992. "var x := 'abc'; var y := '123' + x; y == '123abc' ",
  3993. "~{var x := '123'; x[]} + ~{var x := '1234'; x[]} == 7",
  3994. "~{var x := '123'; x[]} + ~{~{var x := '1234'; x[]}} == 7",
  3995. "~{~{var x := '123'; x[]}} + ~{var x := '1234'; x[]} == 7",
  3996. "~{var x := '123'; x[]} + ~{var x := 4} == 7",
  3997. "~{var x := 3} + ~{var x := '1234'; x[]} == 7",
  3998. "~{var x := '123'; x[]} + ~{~{var x := 4}} == 7",
  3999. "~{~{var x := 3}} + ~{var x := '1234'; x[]} == 7",
  4000. "var v[2] := {1,2}; swap(v[0],v[1]); (v[0] == 2) and (v[1] == 1)",
  4001. "var v[2] := {1,2}; v[0] <=> v[1] ; (v[0] == 2) and (v[1] == 1)",
  4002. "var x := 1; var y := 2; ~(swap(x,y),(x == 2) and (y == 1))",
  4003. "var x := 1; var y := 2; ~(x <=> y , (x == 2) and (y == 1))",
  4004. "var v[2] := {1,2}; ~(swap(v[0],v[1]), (v[0] == 2) and (v[1] == 1))",
  4005. "var v[2] := {1,2}; ~(v[0] <=> v[1] , (v[0] == 2) and (v[1] == 1))",
  4006. "var v[2] := {1,2}; swap(v[zero],v[one]); (v[zero] == 2) and (v[one] == 1)",
  4007. "var v[2] := {1,2}; v[zero] <=> v[one] ; (v[zero] == 2) and (v[one] == 1)",
  4008. "var v[2] := {1,2}; ~(swap(v[zero],v[one]), (v[zero] == 2) and (v[one] == 1))",
  4009. "var v[2] := {1,2}; ~(v[zero] <=> v[one] , (v[zero] == 2) and (v[one] == 1))",
  4010. "var v[2] := {1,2}; swap(v[2 * zero],v[(2 * one) / (1 + 1)]); (v[2 * zero] == 2) and (v[(2 * one) / (1 + 1)] == 1)",
  4011. "var v[2] := {1,2}; v[2 * zero] <=> v[(2*one)/(1+1)] ; (v[2 * zero] == 2) and (v[(2 * one) / (1 + 1)] == 1)",
  4012. "var v[2] := {1,2}; ~(swap(v[2 * zero],v[(2 * one) / (1 + 1)]), (v[2 * zero] == 2) and (v[(2 * one) / (1 + 1)] == 1))",
  4013. "var v[2] := {1,2}; ~(v[2 * zero] <=> v[(2 * one) / (1 + 1)] , (v[2 * zero] == 2) and (v[(2 * one) / (1 + 1)] == 1))",
  4014. "var x := 1; var y := 2; var v[2] := {3,4}; swap(x,v[0]); swap(v[1],y); (x == 3) and (y == 4)",
  4015. "var x := 1; var y := 2; var v[2] := {3,4}; x <=> v[0]; v[1] <=> y; (x == 3) and (y == 4)",
  4016. "var x := 1; var y := 2; var v[2] := {3,4}; swap(x,v[zero]); swap(v[one],y); (x == 3) and (y == 4)",
  4017. "var x := 1; var y := 2; var v[2] := {3,4}; x <=> v[zero]; v[one] <=> y; (x == 3) and (y == 4)",
  4018. "var x := 1; var y := 2; var v[2] := {3,4}; swap(x,v[2 * zero]); swap(v[(2 * one) / (1 + 1)],y); (x == 3) and (y == 4)",
  4019. "var x := 1; var y := 2; var v[2] := {3,4}; x <=> v[zero / 3]; v[(2 * one)/(1 + 1)] <=> y; (x == 3) and (y == 4)",
  4020. "~{ var x := 1 } + ~{ var x := 2 } == 3",
  4021. "(~{ var x := 1 } + ~{ var x := 2 }) == (~{ var x := 2 } + ~{ var x := 1 })",
  4022. "(~{ var x := 1 } + ~{ var x := 2 } + ~{~{ var x := 1 } + ~{ var x := 2 }}) == 6",
  4023. "(~{ var x[1] := [1] } + ~{ var x[1] := [2] } + ~{~{ var x[1] := [1] } + ~{ var x[1] := [2] }}) == 6",
  4024. "(~{ var x := [1] } + ~{ var x[1] := [2] } + ~{~{ var x[1] := [1] } + ~{ var x[1] := [2] }}) == 6",
  4025. "(~{ var x[1] := [1] } + ~{ var x := [2] } + ~{~{ var x[1] := [1] } + ~{ var x[1] := [2] }}) == 6",
  4026. "(~{ var x[1] := [1] } + ~{ var x[1] := [2] } + ~{~{ var x := [1] } + ~{ var x[1] := [2] }}) == 6",
  4027. "(~{ var x[1] := [1] } + ~{ var x[1] := [2] } + ~{~{ var x[1] := [1] } + ~{ var x := [2] }}) == 6",
  4028. "(~{~{ var x[1] := [1] } + ~{ var x[1] := [2] }} + ~{ var x[1] := [1] } + ~{ var x[1] := [2] }) == 6",
  4029. "(~{~{ var x := [1] } + ~{ var x[1] := [2] }} + ~{ var x[1] := [1] } + ~{ var x[1] := [2] }) == 6",
  4030. "(~{~{ var x[1] := [1] } + ~{ var x := [2] }} + ~{ var x[1] := [1] } + ~{ var x[1] := [2] }) == 6",
  4031. "(~{~{ var x[1] := [1] } + ~{ var x[1] := [2] }} + ~{ var x := [1] } + ~{ var x[1] := [2] }) == 6",
  4032. "(~{~{ var x[1] := [1] } + ~{ var x[1] := [2] }} + ~{ var x[1] := [1] } + ~{ var x := [2] }) == 6",
  4033. "(~{~{ var x[1] := [1] }} + ~{ var x[1] := [1] } + ~{ var x[1] := [2] } + ~{{ var x[1] := [2] }}) == 6",
  4034. "(~{~{ var x := [1] }} + ~{ var x[1] := [1] } + ~{ var x[1] := [2] } + ~{{ var x[1] := [2] }}) == 6",
  4035. "(~{~{ var x[1] := [1] }} + ~{ var x := [1] } + ~{ var x[1] := [2] } + ~{{ var x[1] := [2] }}) == 6",
  4036. "(~{~{ var x[1] := [1] }} + ~{ var x[1] := [1] } + ~{ var x := [2] } + ~{{ var x[1] := [2] }}) == 6",
  4037. "(~{~{ var x[1] := [1] }} + ~{ var x[1] := [1] } + ~{ var x[1] := [2] } + ~{{ var x := [2] }}) == 6",
  4038. "(~{~{~{var x[1] := [1]}}} + ~{~{var x[1] := [2]}} + ~{var x[1] := [3]}) == 6",
  4039. "(~{var x[1] := [1]} + ~{~{var x[1] := [2]}} + ~{~{~{var x[1] := [3]}}}) == 6",
  4040. "(~{ var x[3] := [1] } + ~{ var x[6] := {6,5,4,3,2,1}}) == 7",
  4041. "(~{ var x[6] := {6,5,4,3,2,1} } + ~{ var x := 1 }) == 7",
  4042. "(~{ var x := 1 } + ~{ var x[6] := {6,5,4,3,2,1} }) == 7",
  4043. "var x[3] := {}; (x[0] == 0) and (x[1] == 0) and (x[2] == 0)",
  4044. "var x[3] := {1,2}; (x[0] == 1) and (x[1] == 2) and (x[2] == 0)",
  4045. "var x[3] := {1,2,3}; (x[0] == 1) and (x[1] == 2) and (x[2] == 3)",
  4046. "var x[3] := [1]; (x[0] == 1) and (x[1] == 1) and (x[2] == 1)",
  4047. "var v[3] := [1]; v += 1; (v[0] == v[1]) and (v[0] == v[2]) and (v[0] == 2)",
  4048. "var v[3] := [1]; v -= 1; (v[0] == v[1]) and (v[0] == v[2]) and (v[0] == 0)",
  4049. "var v[3] := [1]; v *= 2; (v[0] == v[1]) and (v[0] == v[2]) and (v[0] == 2)",
  4050. "var v[3] := [3]; v /= 3; (v[0] == v[1]) and (v[0] == v[2]) and (v[0] == 1)",
  4051. "var v[3] := {1,2, 3}; v += 1; (v[0] == 2) and (v[1] == 3) and (v[2] == 4)",
  4052. "var v[3] := {1,2, 3}; v -= 1; (v[0] == 0) and (v[1] == 1) and (v[2] == 2)",
  4053. "var v[3] := {1,2, 3}; v *= 2; (v[0] == 2) and (v[1] == 4) and (v[2] == 6)",
  4054. "var v[3] := {3,9,15}; v /= 3; (v[0] == 1) and (v[1] == 3) and (v[2] == 5)",
  4055. "var v0[3] := [1]; var v1[3] := [1]; v0 += v1; (v0[0] == v0[1]) and (v0[0] == v0[2]) and (v0[0] == 2)",
  4056. "var v0[3] := [1]; var v1[3] := [1]; v0 -= v1; (v0[0] == v0[1]) and (v0[0] == v0[2]) and (v0[0] == 0)",
  4057. "var v0[3] := [1]; var v1[3] := [2]; v0 *= v1; (v0[0] == v0[1]) and (v0[0] == v0[2]) and (v0[0] == 2)",
  4058. "var v0[3] := [3]; var v1[3] := [3]; v0 /= v1; (v0[0] == v0[1]) and (v0[0] == v0[2]) and (v0[0] == 1)",
  4059. "var v0[3] := {1,2, 3}; var v1[3] := {1,1,1}; v0 += v1; (v0[0] == 2) and (v0[1] == 3) and (v0[2] == 4)",
  4060. "var v0[3] := {1,2, 3}; var v1[3] := {1,1,1}; v0 -= v1; (v0[0] == 0) and (v0[1] == 1) and (v0[2] == 2)",
  4061. "var v0[3] := {1,2, 3}; var v1[3] := {2,2,2}; v0 *= v1; (v0[0] == 2) and (v0[1] == 4) and (v0[2] == 6)",
  4062. "var v0[3] := {3,9,15}; var v1[3] := {3,3,3}; v0 /= v1; (v0[0] == 1) and (v0[1] == 3) and (v0[2] == 5)",
  4063. "var x[3] := {}; var y[4] := {1,2,3,4}; x := y; (x[0] == y[0]) and (x[1] == y[1]) and (x[2] == y[2])",
  4064. "var x[3] := {}; var y[3] := {1,2,3}; x := y; (x[0] == y[0]) and (x[1] == y[1]) and (x[2] == y[2])",
  4065. "var x[3] := {}; var y[2] := {1,2}; x := y; (x[0] == y[0]) and (x[1] == y[1]) and (x[2] == 0)",
  4066. "var x[3] := {}; var y[1] := {1}; x := y; (x[0] == y[0]) and (x[1] == 0) and (x[2] == 0)",
  4067. "var x[3] := {}; var y[4] := {1,2,3,4}; x := (y+=1); (x[0] == y[0]) and (x[1] == y[1]) and (x[2] == y[2])",
  4068. "var x[3] := {}; var y[3] := {1,2,3}; x := (y+=1); (x[0] == y[0]) and (x[1] == y[1]) and (x[2] == y[2])",
  4069. "var x[3] := {}; var y[2] := {1,2}; x := (y+=1); (x[0] == y[0]) and (x[1] == y[1]) and (x[2] == 0)",
  4070. "var x[3] := {}; var y[1] := {1}; x := (y+=1); (x[0] == y[0]) and (x[1] == 0) and (x[2] == 0)",
  4071. "var x[3] := {}; var y[4] := {1,2,3,4}; x += (y+=1); (x[0] == y[0]) and (x[1] == y[1]) and (x[2] == y[2])",
  4072. "var x[3] := {}; var y[3] := {1,2,3}; x += (y+=1); (x[0] == y[0]) and (x[1] == y[1]) and (x[2] == y[2])",
  4073. "var x[3] := {}; var y[2] := {1,2}; x += (y+=1); (x[0] == y[0]) and (x[1] == y[1]) and (x[2] == 0)",
  4074. "var x[3] := {}; var y[1] := {1}; x += (y+=1); (x[0] == y[0]) and (x[1] == 0) and (x[2] == 0)",
  4075. "var x[3] := [9]; var y[4] := {1,2,3,4}; x <=> y; (x[0] == 1) and (x[1] == 2) and (x[2] == 3)",
  4076. "var x[3] := [9]; var y[3] := {1,2,3}; x <=> y; (x[0] == 1) and (x[1] == 2) and (x[2] == 3)",
  4077. "var x[3] := [9]; var y[2] := {1,2}; x <=> y; (x[0] == 1) and (x[1] == 2) and (x[2] == 9)",
  4078. "var x[3] := [9]; var y[1] := {1}; x <=> y; (x[0] == 1) and (x[1] == 9) and (x[2] == 9)",
  4079. "var x[3] := [9]; var y[4] := {1,2,3,4}; x <=> (y += 1); (x[0] == 2) and (x[1] == 3) and (x[2] == 4)",
  4080. "var x[3] := [9]; var y[3] := {1,2,3}; x <=> (y += 1); (x[0] == 2) and (x[1] == 3) and (x[2] == 4)",
  4081. "var x[3] := [9]; var y[2] := {1,2}; x <=> (y += 1); (x[0] == 2) and (x[1] == 3) and (x[2] == 9)",
  4082. "var x[3] := [9]; var y[1] := {1}; x <=> (y += 1); (x[0] == 2) and (x[1] == 9) and (x[2] == 9)",
  4083. "var x[3] := [8]; var y[4] := {1,2,3,4}; (x += 1) <=> y; (x[0] == 1) and (x[1] == 2) and (x[2] == 3)",
  4084. "var x[3] := [8]; var y[3] := {1,2,3}; (x += 1) <=> y; (x[0] == 1) and (x[1] == 2) and (x[2] == 3)",
  4085. "var x[3] := [8]; var y[2] := {1,2}; (x += 1) <=> y; (x[0] == 1) and (x[1] == 2) and (x[2] == 9)",
  4086. "var x[3] := [8]; var y[1] := {1}; (x += 1) <=> y; (x[0] == 1) and (x[1] == 9) and (x[2] == 9)",
  4087. "var x[3] := [8]; var y[4] := {1,2,3,4}; (x += 1) <=> (y += 1); (x[0] == 2) and (x[1] == 3) and (x[2] == 4)",
  4088. "var x[3] := [8]; var y[3] := {1,2,3}; (x += 1) <=> (y += 1); (x[0] == 2) and (x[1] == 3) and (x[2] == 4)",
  4089. "var x[3] := [8]; var y[2] := {1,2}; (x += 1) <=> (y += 1); (x[0] == 2) and (x[1] == 3) and (x[2] == 9)",
  4090. "var x[3] := [8]; var y[1] := {1}; (x += 1) <=> (y += 1); (x[0] == 2) and (x[1] == 9) and (x[2] == 9)",
  4091. "var x[3] := [0]; var y[4] := {1,2,3,4}; X < y",
  4092. "var x[3] := [0]; var y[3] := {1,2,3}; x < Y",
  4093. "var x[3] := [0]; var y[2] := {1,2}; X < y",
  4094. "var x[3] := [0]; var y[1] := {1}; x < Y",
  4095. "var x[3] := [0]; var y[4] := {1,2,3,4}; x <= y",
  4096. "var x[3] := [0]; var y[3] := {1,2,3}; x <= y",
  4097. "var x[3] := [0]; var y[2] := {1,2}; x <= y",
  4098. "var x[3] := [0]; var y[1] := {1}; x <= y",
  4099. "var x[3] := [5]; var y[4] := {1,2,3,4}; x > y",
  4100. "var x[3] := [5]; var y[3] := {1,2,3}; x > y",
  4101. "var x[3] := [5]; var y[2] := {1,2}; x > y",
  4102. "var x[3] := [5]; var y[1] := {1}; x > y",
  4103. "var x[3] := [5]; var y[4] := {1,2,3,4}; x >= y",
  4104. "var x[3] := [5]; var y[3] := {1,2,3}; x >= y",
  4105. "var x[3] := [5]; var y[2] := {1,2}; x >= y",
  4106. "var x[3] := [5]; var y[1] := {1}; x >= y",
  4107. "var x[3] := [1]; var y[4] := [1]; x == y",
  4108. "var x[3] := [1]; var y[3] := [1]; x == y",
  4109. "var x[3] := [1]; var y[2] := [1]; x == y",
  4110. "var x[3] := [1]; var y[1] := [1]; x == y",
  4111. "var x[3] := [1]; var y[4] := [2]; x != y",
  4112. "var x[3] := [1]; var y[3] := [2]; x != y",
  4113. "var x[3] := [1]; var y[2] := [2]; x != y",
  4114. "var x[3] := [1]; var y[1] := [2]; x != y",
  4115. "var x[3] := [0]; var y[4] := {5,6,7,8}; (x += 1) < y",
  4116. "var x[3] := [0]; var y[3] := {5,6,7}; (x += 1) < y",
  4117. "var x[3] := [0]; var y[2] := {5,6}; (x += 1) < y",
  4118. "var x[3] := [0]; var y[1] := {5}; (x += 1) < y",
  4119. "var x[3] := [0]; var y[4] := {1,2,3,4}; x < (y += 1)",
  4120. "var x[3] := [0]; var y[3] := {1,2,3}; x < (y += 1)",
  4121. "var x[3] := [0]; var y[2] := {1,2}; x < (y += 1)",
  4122. "var x[3] := [0]; var y[1] := {1}; x < (y += 1)",
  4123. "var x[3] := [0]; var y[4] := {5,6,7,8}; (x += 1) < (y += 1)",
  4124. "var x[3] := [0]; var y[3] := {5,6,7}; (x += 1) < (y += 1)",
  4125. "var x[3] := [0]; var y[2] := {5,6}; (x += 1) < (y += 1)",
  4126. "var x[3] := [0]; var y[1] := {5}; (x += 1) < (y += 1)",
  4127. "var x[3] := {1,2,3}; var y := 5; x < y ",
  4128. "var x[3] := {1,2,3}; var y := 3; x < y + 1 ",
  4129. "var x[3] := {1,2,3}; var y := 5; x <= y ",
  4130. "var x[3] := {1,2,3}; var y := 3; x <= y + 1",
  4131. "var x[3] := {1,1,1}; var y := 1; x == y ",
  4132. "var x[3] := {1,1,1}; var y := 2; x == y - 1",
  4133. "var x[3] := {1,2,3}; var y := 5; y > x ",
  4134. "var x[3] := {1,2,3}; var y := 3; y >= x ",
  4135. "var x[3] := {1,2,3}; var y := 5; y + 1 > x ",
  4136. "var x[3] := {1,1,1}; var y := 1; y == x ",
  4137. "var x[3] := {1,1,1}; var y := 2; y - 1 == x",
  4138. "var x[3] := {1,2,3}; var y := 5; equal(true,(x += 1) < y) ",
  4139. "var x[3] := {1,2,3}; var y := 3; equal(true,(x -= 1) < y + 1)",
  4140. "var x[3] := {1,2,3}; var y := 5; equal(true,(x -= 1) <= y) ",
  4141. "var x[3] := {2,2,2}; var y := 1; (x -= 1) == y ",
  4142. "var x[3] := {1,2,3}; var y := 5; y > (x += 1) ",
  4143. "var x[3] := {1,2,3}; var y := 5; y + 1 > (x += 1) ",
  4144. "var x[3] := {2,2,2}; var y := 1; y == (x -= 1) ",
  4145. "var x[3] := {2,2,2}; var y := 0; y + 1 == (x -= 1)",
  4146. "var x[3] := [1]; var y[4] := {1,2,3,4}; var z[3] := [1]; z := (x + y); z == (x + y)",
  4147. "var x[3] := [1]; var y[3] := {1,2,3}; var z[3] := [1]; z := (x - y); z == (x - y)",
  4148. "var x[3] := [1]; var y[2] := {1,2}; var z[3] := [1]; z := (x / y); z == (x / y)",
  4149. "var x[3] := [1]; var y[1] := {1}; var z[3] := [1]; z := (x * y); z == (x * y)",
  4150. "var x[3] := [1]; var y[4] := {1,2,3,4}; var z[3] := [1]; z := 2(x + y); z == (x + y)2",
  4151. "var x[3] := [1]; var y[3] := {1,2,3}; var z[3] := [1]; z := 2(x - y); z == (x - y)2",
  4152. "var x[3] := [1]; var y[2] := {1,2}; var z[3] := [1]; z := 2(x / y); z == (x / y)2",
  4153. "var x[3] := [1]; var y[1] := {1}; var z[3] := [1]; z := 2(x * y); z == (x * y)2",
  4154. "var x[3] := [1]; var y[4] := {1,2,3,4}; var z[3] := [1]; z := 2(x + y)/3; z == 2(x + y)/3",
  4155. "var x[3] := [1]; var y[3] := {1,2,3}; var z[3] := [1]; z := 2(x - y)/3; z == 2(x - y)/3",
  4156. "var x[3] := [1]; var y[2] := {1,2}; var z[3] := [1]; z := 2(x / y)/3; z == 2(x / y)/3",
  4157. "var x[3] := [1]; var y[1] := {1}; var z[3] := [1]; z := 2(x * y)/3; z == 2(x * y)/3",
  4158. "var x[6] := {1,2,3,4,5,6}; equal(sqrt(sum([x - avg(x)]^2) / x[]),1.7078251277)",
  4159. "var x[3] := {-1,-2,-3}; sum(abs(x) ) == 6",
  4160. "var x[3] := {0.1,0.2,0.3}; sum(trunc(x)) == 0",
  4161. "var x[10^6]:=[2];var y[10^6]:=[3]; var s:=0;equal(for(var i:=0; i<10;i+=1){s+= sum(5 *(2x-y/3)) + i;},150000045.0)",
  4162. "var x := 2; (~{ for (var i := 0; i < 10; i += 1) { for (var j := 0; j <= i; "
  4163. "j += 1) { var y := 3; if ((i + j + y + x) < 6) { y += x; continue; } else "
  4164. "break[i + j]; } } } + ~{ for (var i := 0; i < 10; i += 1) { for (var j := 0; "
  4165. "j <= i; j += 1) { var y := 3; if ((i + j + y + x) < 6) { y += x; continue; } "
  4166. " else break[i + j]; } } }) == 18 ",
  4167. "var x := 2; var v0[3] := {1,2,3}; ( ~{ for (var i := 0; i < 10; i += 1) { "
  4168. "for (var j := 0; j <= i; j += 1) { var y := 3; var v2[3] := {1,2,3}; if ( "
  4169. "(i + j + y + x + abs(v0[i % v0[]] - v2[j % v2[]])) < 6) { var v3[3] := "
  4170. "{1,2,3}; y += x / v3[j % v3[]]; continue; } else break[i + j]; } } } "
  4171. "+ ~{ for (var i := 0; i < 10; i += 1) { for (var j := 0; j <= i; j += 1) "
  4172. " { var y := 3; var v2[3] := {1,2,3}; if ((i + j + y + x + abs(v0[i % v0[]] - "
  4173. "v2[j % v2[]])) < 6) { var v3[3] := {1,2,3}; y += x / v3[j % v3[]]; "
  4174. "continue; } else break[i + j]; } } } ) == 18 ",
  4175. "12 == (if (1 > 2) { var x:= 2; } else { var x[3] := {7,2,3}; sum(x); })",
  4176. "12 == (if (1 < 2) { var x[3] := {7,2,3}; sum(x); } else { var x:= 2; })",
  4177. "12 == (if (1 > 2) { var x:= 2; } else { var x[3] := {7,2,3}; sum(x); })",
  4178. "12 == (if (1 < 2) { var x[3] := {7,2,3}; sum(x); } else { var x:= 2; })",
  4179. "21 == (for (var i := 0; i < 10; i += 1) { if (i > 2) { break [i * 7]; i += 1;"
  4180. "i += 2; i += 3; }; })",
  4181. "21 == (for (var i := 0; i < 10; i += 1) { if (i > 2) { break [i * 7]; return "
  4182. "[i * 8]; i += 1; i += 2; i += 3; }; })",
  4183. "2 == for (var i := 0; i < 10; i += 1) { if (i > 2) { continue; i += 1; i += 2;"
  4184. "i += 3; } else i; }",
  4185. "2 == for (var i := 0; i < 10; i += 1) { if (i > 2) { continue; return [i * 8];"
  4186. "i += 1; i += 2; i += 3; } else i; }",
  4187. "var x[10] := [-1]; var y[10] := [-1]; for (var i := 0; i < 10; i += 1) { x[i] := i; "
  4188. "y[i] := 2 * x[i]; }; (sum(x) == 45) and (sum(y) == (2 * sum(x)));"
  4189. "7 == (for (var i := 0; i < 10; i += 1) { ~{break[7]; continue; i += i} })",
  4190. "0 == (for (var i := 0; i < 10; i += 1) { ~{break[i]; continue; i += i} })",
  4191. "0 == (for (var i := 0; i < 10; i += 1) { ~{continue; break[7]; i += i} })",
  4192. "1 == (for (var i := 0; i < 10; i += 1) { ~{break[i += 1]; continue; i += i} })",
  4193. "var s := 'abc'; s == ~{'abc' } ",
  4194. "var s := 'abc'; s == ~{s } ",
  4195. "var s := 'abc'; s == ~{'ab' + 'c'} ",
  4196. "var s := 'abc'; ~{'abc' } == s ",
  4197. "var s := 'abc'; ~{s } == s ",
  4198. "var s := 'abc'; ~{'ab' + 'c'} == s ",
  4199. "var s := 'abc'; ~{1 + 2; 'abc' + s; s} == s ",
  4200. "var s := 'abc'; ~{1 + 2; var x := 'ab'; x + 'c'} == s ",
  4201. "var x[10^6] := null; var y[10^7] := null; 0 * (min(x) + min(y)) + x[] + y[] == 10^7 + 10^6"
  4202. };
  4203. const std::size_t expression_list_size = sizeof(expression_list) / sizeof(std::string);
  4204. static const std::size_t rounds = 20;
  4205. exprtk::symbol_table<T> symbol_table;
  4206. T zero = T(0);
  4207. T one = T(1);
  4208. symbol_table.add_variable("zero",zero);
  4209. symbol_table.add_variable("one" , one);
  4210. symbol_table.add_pi();
  4211. bool failed = false;
  4212. for (std::size_t r = 0; r < rounds; ++r)
  4213. {
  4214. for (std::size_t i = 0; i < expression_list_size; ++i)
  4215. {
  4216. expression_t expression;
  4217. expression.register_symbol_table(symbol_table);
  4218. {
  4219. exprtk::parser<T> parser;
  4220. if (!parser.compile(expression_list[i],expression))
  4221. {
  4222. printf("run_test10() - swaps[1] Error: %s Expression: %s\n",
  4223. parser.error().c_str(),
  4224. expression_list[i].c_str());
  4225. failed = true;
  4226. continue;
  4227. }
  4228. }
  4229. T result = expression.value();
  4230. if (T(1) != result)
  4231. {
  4232. printf("run_test10() - swaps[1] evaluation error Expression: %s\n",
  4233. expression_list[i].c_str());
  4234. failed = true;
  4235. }
  4236. }
  4237. if (failed)
  4238. {
  4239. return false;
  4240. }
  4241. }
  4242. // reuse parser
  4243. for (std::size_t r = 0; r < rounds; ++r)
  4244. {
  4245. exprtk::parser<T> parser;
  4246. for (std::size_t i = 0; i < expression_list_size; ++i)
  4247. {
  4248. expression_t expression;
  4249. expression.register_symbol_table(symbol_table);
  4250. if (!parser.compile(expression_list[i],expression))
  4251. {
  4252. printf("run_test10() - swaps[2] Error: %s Expression: %s\n",
  4253. parser.error().c_str(),
  4254. expression_list[i].c_str());
  4255. failed = true;
  4256. continue;
  4257. }
  4258. T result = expression.value();
  4259. if (T(1) != result)
  4260. {
  4261. printf("run_test10() - swaps[2] evaluation error Expression: %s\n",
  4262. expression_list[i].c_str());
  4263. failed = true;
  4264. }
  4265. }
  4266. if (failed)
  4267. {
  4268. return false;
  4269. }
  4270. }
  4271. }
  4272. return true;
  4273. }
  4274. template <typename T>
  4275. inline bool run_test11()
  4276. {
  4277. typedef exprtk::expression<T> expression_t;
  4278. std::string expression_string = "(x + y) / 3";
  4279. T x = T(1.0);
  4280. T y = T(2.0);
  4281. exprtk::symbol_table<T> symbol_table;
  4282. symbol_table.add_variable("x",x);
  4283. symbol_table.add_variable("y",y);
  4284. expression_t expression;
  4285. expression.register_symbol_table(symbol_table);
  4286. static const std::size_t rounds = 500;
  4287. for (std::size_t i = 0; i < rounds; ++i)
  4288. {
  4289. {
  4290. exprtk::parser<T> parser;
  4291. if (!parser.compile(expression_string,expression))
  4292. {
  4293. printf("run_test11() - Error: %s Expression: %s\n",
  4294. parser.error().c_str(),
  4295. expression_string.c_str());
  4296. return false;
  4297. }
  4298. }
  4299. if (not_equal(expression.value(),(x + y) / T(3),T(0.000001)))
  4300. {
  4301. printf("run_test11() - Error in evaluation!(1)\n");
  4302. return false;
  4303. }
  4304. expression.release();
  4305. if (false == (!expression))
  4306. {
  4307. printf("run_test11() - Error in evaluation!(2)\n");
  4308. return false;
  4309. }
  4310. {
  4311. exprtk::parser<T> parser;
  4312. if (!parser.compile(expression_string,expression))
  4313. {
  4314. printf("run_test11() - Error: %s Expression: %s\n",
  4315. parser.error().c_str(),
  4316. expression_string.c_str());
  4317. return false;
  4318. }
  4319. }
  4320. expression.value();
  4321. if (not_equal(expression.value(),(x + y) / T(3),T(0.000001)))
  4322. {
  4323. printf("run_test11() - Error in evaluation!(3)\n");
  4324. return false;
  4325. }
  4326. }
  4327. if (!exprtk::pgo_primer<T>())
  4328. {
  4329. printf("run_test11() - Failed PGO primer\n");
  4330. return false;
  4331. }
  4332. return true;
  4333. }
  4334. template <typename T>
  4335. inline bool run_test12()
  4336. {
  4337. typedef exprtk::expression<T> expression_t;
  4338. static const std::string expression_string[] =
  4339. {
  4340. "equal(poly01(x,2.2,1.1),(2.2x^1+1.1))",
  4341. "equal(poly02(x,3.3,2.2,1.1),(3.3x^2+2.2x^1+1.1))",
  4342. "equal(poly03(x,4.4,3.3,2.2,1.1),(4.4x^3+3.3x^2+2.2x^1+1.1))",
  4343. "equal(poly04(x,5.5,4.4,3.3,2.2,1.1),(5.5x^4+4.4x^3+3.3x^2+2.2x^1+1.1))",
  4344. "equal(poly05(x,6.6,5.5,4.4,3.3,2.2,1.1),(6.6x^5+5.5x^4+4.4x^3+3.3x^2+2.2x^1+1.1))",
  4345. "equal(poly06(x,7.7,6.6,5.5,4.4,3.3,2.2,1.1),(7.7x^6+6.6x^5+5.5x^4+4.4x^3+3.3x^2+2.2x^1+1.1))",
  4346. "equal(poly07(x,8.8,7.7,6.6,5.5,4.4,3.3,2.2,1.1),(8.8x^7+7.7x^6+6.6x^5+5.5x^4+4.4x^3+3.3x^2+2.2x^1+1.1))",
  4347. "equal(poly08(x,9.9,8.8,7.7,6.6,5.5,4.4,3.3,2.2,1.1),(9.9x^8+8.8x^7+7.7x^6+6.6x^5+5.5x^4+4.4x^3+3.3x^2+2.2x^1+1.1))",
  4348. "equal(poly09(x,1.1,9.9,8.8,7.7,6.6,5.5,4.4,3.3,2.2,1.1),(1.1x^9+9.9x^8+8.8x^7+7.7x^6+6.6x^5+5.5x^4+4.4x^3+3.3x^2+2.2x^1+1.1))",
  4349. "equal(poly10(x,2.2,1.1,9.9,8.8,7.7,6.6,5.5,4.4,3.3,2.2,1.1),(2.2x^10+1.1x^9+9.9x^8+8.8x^7+7.7x^6+6.6x^5+5.5x^4+4.4x^3+3.3x^2+2.2x^1+1.1))",
  4350. "equal(poly11(x,3.3,2.2,1.1,9.9,8.8,7.7,6.6,5.5,4.4,3.3,2.2,1.1),(3.3x^11+2.2x^10+1.1x^9+9.9x^8+8.8x^7+7.7x^6+6.6x^5+5.5x^4+4.4x^3+3.3x^2+2.2x^1+1.1))",
  4351. "equal(poly12(x,4.4,3.3,2.2,1.1,9.9,8.8,7.7,6.6,5.5,4.4,3.3,2.2,1.1),(4.4x^12+3.3x^11+2.2x^10+1.1x^9+9.9x^8+8.8x^7+7.7x^6+6.6x^5+5.5x^4+4.4x^3+3.3x^2+2.2x^1+1.1))",
  4352. "EquaL(Poly01(x,2.2,1.1),(2.2x^1+1.1))",
  4353. "eQuAl(pOly02(x,3.3,2.2,1.1),(3.3x^2+2.2x^1+1.1))",
  4354. "eqUal(poLy03(x,4.4,3.3,2.2,1.1),(4.4x^3+3.3x^2+2.2x^1+1.1))",
  4355. "eQuAl(polY04(x,5.5,4.4,3.3,2.2,1.1),(5.5x^4+4.4x^3+3.3x^2+2.2x^1+1.1))",
  4356. "EquAl(pOLy05(x,6.6,5.5,4.4,3.3,2.2,1.1),(6.6x^5+5.5x^4+4.4x^3+3.3x^2+2.2x^1+1.1))",
  4357. "EqUaL(pOly06(x,7.7,6.6,5.5,4.4,3.3,2.2,1.1),(7.7x^6+6.6x^5+5.5x^4+4.4x^3+3.3x^2+2.2x^1+1.1))",
  4358. "Equal(Poly07(x,8.8,7.7,6.6,5.5,4.4,3.3,2.2,1.1),(8.8x^7+7.7x^6+6.6x^5+5.5x^4+4.4x^3+3.3x^2+2.2x^1+1.1))",
  4359. "eQual(PoLy08(x,9.9,8.8,7.7,6.6,5.5,4.4,3.3,2.2,1.1),(9.9x^8+8.8x^7+7.7x^6+6.6x^5+5.5x^4+4.4x^3+3.3x^2+2.2x^1+1.1))",
  4360. "eqUal(pOlY09(x,1.1,9.9,8.8,7.7,6.6,5.5,4.4,3.3,2.2,1.1),(1.1x^9+9.9x^8+8.8x^7+7.7x^6+6.6x^5+5.5x^4+4.4x^3+3.3x^2+2.2x^1+1.1))",
  4361. "equAl(POLY10(x,2.2,1.1,9.9,8.8,7.7,6.6,5.5,4.4,3.3,2.2,1.1),(2.2x^10+1.1x^9+9.9x^8+8.8x^7+7.7x^6+6.6x^5+5.5x^4+4.4x^3+3.3x^2+2.2x^1+1.1))",
  4362. "equaL(PolY11(x,3.3,2.2,1.1,9.9,8.8,7.7,6.6,5.5,4.4,3.3,2.2,1.1),(3.3x^11+2.2x^10+1.1x^9+9.9x^8+8.8x^7+7.7x^6+6.6x^5+5.5x^4+4.4x^3+3.3x^2+2.2x^1+1.1))",
  4363. "EQUAL(pOLy12(x,4.4,3.3,2.2,1.1,9.9,8.8,7.7,6.6,5.5,4.4,3.3,2.2,1.1),(4.4x^12+3.3x^11+2.2x^10+1.1x^9+9.9x^8+8.8x^7+7.7x^6+6.6x^5+5.5x^4+4.4x^3+3.3x^2+2.2x^1+1.1))"
  4364. };
  4365. static const std::size_t expression_string_size = sizeof(expression_string) / sizeof(std::string);
  4366. T x = T(1.23456);
  4367. exprtk::polynomial<T, 1> poly01;
  4368. exprtk::polynomial<T, 2> poly02;
  4369. exprtk::polynomial<T, 3> poly03;
  4370. exprtk::polynomial<T, 4> poly04;
  4371. exprtk::polynomial<T, 5> poly05;
  4372. exprtk::polynomial<T, 6> poly06;
  4373. exprtk::polynomial<T, 7> poly07;
  4374. exprtk::polynomial<T, 8> poly08;
  4375. exprtk::polynomial<T, 9> poly09;
  4376. exprtk::polynomial<T,10> poly10;
  4377. exprtk::polynomial<T,11> poly11;
  4378. exprtk::polynomial<T,12> poly12;
  4379. exprtk::symbol_table<T> symbol_table;
  4380. symbol_table.add_variable("x",x);
  4381. symbol_table.add_function("poly01", poly01);
  4382. symbol_table.add_function("poly02", poly02);
  4383. symbol_table.add_function("poly03", poly03);
  4384. symbol_table.add_function("poly04", poly04);
  4385. symbol_table.add_function("poly05", poly05);
  4386. symbol_table.add_function("poly06", poly06);
  4387. symbol_table.add_function("poly07", poly07);
  4388. symbol_table.add_function("poly08", poly08);
  4389. symbol_table.add_function("poly09", poly09);
  4390. symbol_table.add_function("poly10", poly10);
  4391. symbol_table.add_function("poly11", poly11);
  4392. symbol_table.add_function("poly12", poly12);
  4393. expression_t expression;
  4394. expression.register_symbol_table(symbol_table);
  4395. static const std::size_t rounds = 500;
  4396. for (std::size_t i = 0; i < rounds; ++i)
  4397. {
  4398. for (std::size_t j = 0; j < expression_string_size; ++j)
  4399. {
  4400. const std::string& expr_str = expression_string[j];
  4401. {
  4402. exprtk::parser<T> parser;
  4403. if (!parser.compile(expr_str,expression))
  4404. {
  4405. printf("run_test12() - Error: %s Expression: %s\n",
  4406. parser.error().c_str(),
  4407. expr_str.c_str());
  4408. return false;
  4409. }
  4410. }
  4411. if (T(1) != expression.value())
  4412. {
  4413. printf("run_test12() - Error in evaluation! Expression: %s\n",expr_str.c_str());
  4414. return false;
  4415. }
  4416. }
  4417. }
  4418. return true;
  4419. }
  4420. template <typename T>
  4421. struct sine_deg : public exprtk::ifunction<T>
  4422. {
  4423. using exprtk::ifunction<T>::operator();
  4424. sine_deg() : exprtk::ifunction<T>(1) {}
  4425. inline T operator()(const T& v)
  4426. {
  4427. return std::sin((v * T(exprtk::details::numeric::constant::pi)) / T(180));
  4428. }
  4429. };
  4430. template <typename T>
  4431. struct cosine_deg : public exprtk::ifunction<T>
  4432. {
  4433. using exprtk::ifunction<T>::operator();
  4434. cosine_deg() : exprtk::ifunction<T>(1) {}
  4435. inline T operator()(const T& v)
  4436. {
  4437. return std::cos((v * T(exprtk::details::numeric::constant::pi)) / T(180));
  4438. }
  4439. };
  4440. template <typename T>
  4441. inline bool run_test13()
  4442. {
  4443. typedef exprtk::symbol_table<T> symbol_table_t;
  4444. typedef exprtk::expression<T> expression_t;
  4445. typedef exprtk::parser<T> parser_t;
  4446. static const std::string expression_string[] =
  4447. {
  4448. "equal(sin(30),0.5) ",
  4449. "equal(cos(60),0.5) ",
  4450. "equal(sin(60),sqrt(3)/2) ",
  4451. "equal(cos(30),sqrt(3)/2) ",
  4452. "equal(sin(x_deg),0.5) ",
  4453. "equal(cos(y_deg),0.5) ",
  4454. "equal(sin(y_deg),sqrt(3)/2) ",
  4455. "equal(cos(x_deg),sqrt(3)/2) ",
  4456. "equal(sin(30) + sin(30),1.0) ",
  4457. "equal(cos(60) + cos(60),1.0) ",
  4458. "equal(sin(60) + sin(60),sqrt(3)) ",
  4459. "equal(cos(30) + cos(30),sqrt(3)) ",
  4460. "equal(sin(x_deg) + sin(x_deg),1.0) ",
  4461. "equal(cos(y_deg) + cos(y_deg),1.0) ",
  4462. "equal(sin(y_deg) + sin(y_deg),sqrt(3))",
  4463. "equal(cos(x_deg) + cos(x_deg),sqrt(3))"
  4464. };
  4465. static const std::size_t expression_string_size = sizeof(expression_string) / sizeof(std::string);
  4466. {
  4467. T x_deg = T(30);
  4468. T y_deg = T(60);
  4469. sine_deg <T> sine;
  4470. cosine_deg<T> cosine;
  4471. symbol_table_t symbol_table_0;
  4472. symbol_table_t symbol_table_1;
  4473. symbol_table_0.add_variable("x_deg",x_deg);
  4474. symbol_table_1.add_variable("y_deg",y_deg);
  4475. symbol_table_0.add_function( "sine_deg", sine);
  4476. symbol_table_1.add_function("cosine_deg", cosine);
  4477. expression_t expression;
  4478. expression.register_symbol_table(symbol_table_0);
  4479. expression.register_symbol_table(symbol_table_1);
  4480. static const std::size_t rounds = 100;
  4481. for (std::size_t i = 0; i < rounds; ++i)
  4482. {
  4483. for (std::size_t j = 0; j < expression_string_size; ++j)
  4484. {
  4485. const std::string& expr_str = expression_string[j];
  4486. {
  4487. parser_t parser;
  4488. parser.replace_symbol("sin", "sine_deg");
  4489. parser.replace_symbol("cos", "cosine_deg");
  4490. if (!parser.compile(expr_str,expression))
  4491. {
  4492. printf("run_test13() - Error: %s Expression: %s [1]\n",
  4493. parser.error().c_str(),
  4494. expr_str.c_str());
  4495. return false;
  4496. }
  4497. }
  4498. if (T(1) != expression.value())
  4499. {
  4500. printf("run_test13() - Error in evaluation! Expression: %s [1]\n",expr_str.c_str());
  4501. return false;
  4502. }
  4503. }
  4504. }
  4505. }
  4506. {
  4507. T x_deg = T(30);
  4508. T y_deg = T(60);
  4509. sine_deg <T> sine;
  4510. cosine_deg<T> cosine;
  4511. symbol_table_t symbol_table_0;
  4512. symbol_table_t symbol_table_1;
  4513. symbol_table_0.add_variable("x_deg",x_deg);
  4514. symbol_table_1.add_variable("y_deg",y_deg);
  4515. symbol_table_0.add_reserved_function("sin", sine);
  4516. symbol_table_1.add_reserved_function("cos",cosine);
  4517. expression_t expression;
  4518. expression.register_symbol_table(symbol_table_0);
  4519. expression.register_symbol_table(symbol_table_1);
  4520. static const std::size_t rounds = 100;
  4521. for (std::size_t i = 0; i < rounds; ++i)
  4522. {
  4523. for (std::size_t j = 0; j < expression_string_size; ++j)
  4524. {
  4525. const std::string& expr_str = expression_string[j];
  4526. {
  4527. typedef typename parser_t::settings_store settings_t;
  4528. parser_t parser;
  4529. parser.settings()
  4530. .disable_base_function(settings_t::e_bf_sin)
  4531. .disable_base_function(settings_t::e_bf_cos);
  4532. if (!parser.compile(expr_str,expression))
  4533. {
  4534. printf("run_test13() - Error: %s Expression: %s [2]\n",
  4535. parser.error().c_str(),
  4536. expr_str.c_str());
  4537. return false;
  4538. }
  4539. }
  4540. if (T(1) != expression.value())
  4541. {
  4542. printf("run_test13() - Error in evaluation! Expression: %s [2]\n",expr_str.c_str());
  4543. return false;
  4544. }
  4545. }
  4546. }
  4547. }
  4548. return true;
  4549. }
  4550. template <typename Allocator,
  4551. template <typename,typename> class Sequence>
  4552. inline std::size_t load_expressions(const std::string& file_name,
  4553. Sequence<std::string,Allocator>& sequence)
  4554. {
  4555. std::ifstream stream(file_name.c_str());
  4556. if (!stream) return 0;
  4557. std::string buffer;
  4558. buffer.reserve(1024);
  4559. std::size_t line_count = 0;
  4560. while (std::getline(stream,(buffer)))
  4561. {
  4562. if (buffer.empty())
  4563. continue;
  4564. else if ('#' == buffer[0])
  4565. continue;
  4566. ++line_count;
  4567. sequence.push_back(buffer);
  4568. }
  4569. return line_count;
  4570. }
  4571. template <typename T>
  4572. inline bool run_test14()
  4573. {
  4574. typedef exprtk::expression<T> expression_t;
  4575. T x = T(0);
  4576. T y = T(0);
  4577. T z = T(0);
  4578. T w = T(0);
  4579. exprtk::polynomial<T, 1> poly01;
  4580. exprtk::polynomial<T, 2> poly02;
  4581. exprtk::polynomial<T, 3> poly03;
  4582. exprtk::polynomial<T, 4> poly04;
  4583. exprtk::polynomial<T, 5> poly05;
  4584. exprtk::polynomial<T, 6> poly06;
  4585. exprtk::polynomial<T, 7> poly07;
  4586. exprtk::polynomial<T, 8> poly08;
  4587. exprtk::polynomial<T, 9> poly09;
  4588. exprtk::polynomial<T,10> poly10;
  4589. exprtk::polynomial<T,11> poly11;
  4590. exprtk::polynomial<T,12> poly12;
  4591. exprtk::symbol_table<T> symbol_table;
  4592. symbol_table.add_constants();
  4593. symbol_table.add_variable("x",x);
  4594. symbol_table.add_variable("y",y);
  4595. symbol_table.add_variable("z",z);
  4596. symbol_table.add_variable("w",w);
  4597. symbol_table.add_function("poly01", poly01);
  4598. symbol_table.add_function("poly02", poly02);
  4599. symbol_table.add_function("poly03", poly03);
  4600. symbol_table.add_function("poly04", poly04);
  4601. symbol_table.add_function("poly05", poly05);
  4602. symbol_table.add_function("poly06", poly06);
  4603. symbol_table.add_function("poly07", poly07);
  4604. symbol_table.add_function("poly08", poly08);
  4605. symbol_table.add_function("poly09", poly09);
  4606. symbol_table.add_function("poly10", poly10);
  4607. symbol_table.add_function("poly11", poly11);
  4608. symbol_table.add_function("poly12", poly12);
  4609. expression_t expression;
  4610. expression.register_symbol_table(symbol_table);
  4611. exprtk::parser<T> parser;
  4612. std::deque<std::string> expr_str_list;
  4613. load_expressions("exprtk_functional_test.txt" ,expr_str_list);
  4614. load_expressions("exprtk_functional_ext_test.txt",expr_str_list);
  4615. if (expr_str_list.empty())
  4616. {
  4617. return true;
  4618. }
  4619. std::deque<exprtk::expression<T> > expression_list;
  4620. bool failure = false;
  4621. static const std::size_t rounds = 5;
  4622. for (std::size_t r = 0; r < rounds; ++r)
  4623. {
  4624. for (std::size_t i = 0; i < expr_str_list.size(); ++i)
  4625. {
  4626. exprtk::expression<T> current_expression;
  4627. current_expression.register_symbol_table(symbol_table);
  4628. if (!parser.compile(expr_str_list[i],current_expression))
  4629. {
  4630. printf("run_test14() - Error: %s Expression: %s\n",
  4631. parser.error().c_str(),
  4632. expr_str_list[i].c_str());
  4633. failure = true;
  4634. }
  4635. else
  4636. expression_list.push_back(current_expression);
  4637. }
  4638. if (failure)
  4639. break;
  4640. for (std::size_t i = 0; i < expression_list.size(); ++i)
  4641. {
  4642. T result = expression_list[i].value();
  4643. if (result != T(1))
  4644. {
  4645. failure = true;
  4646. printf("run_test14() - Error with evaluation of expression: %s\n",
  4647. expr_str_list[i].c_str());
  4648. }
  4649. }
  4650. expression_list.clear();
  4651. if (failure)
  4652. break;
  4653. }
  4654. return !failure;
  4655. }
  4656. template <typename T>
  4657. inline bool run_test15()
  4658. {
  4659. typedef exprtk::expression<T> expression_t;
  4660. T x = T(1.1);
  4661. T y = T(2.2);
  4662. T z = T(3.3);
  4663. exprtk::symbol_table<T> symbol_table;
  4664. symbol_table.add_constants();
  4665. symbol_table.add_variable("x",x);
  4666. symbol_table.add_variable("y",y);
  4667. symbol_table.add_variable("z",z);
  4668. static const std::string expr_str_list[] =
  4669. {
  4670. "2 - (x + y) / z//Comment 01 ",
  4671. "2 - (x + y) / z#Comment 02 ",
  4672. "2 - (x + y) / z //Comment 03 ",
  4673. "2 - (x + y) / z #Comment 04 ",
  4674. "2 - (x + y) / z//Comment 05 \n",
  4675. "2 - (x + y) / z#Comment 06 \n",
  4676. "2 - (x + y) / z //Comment 07\n",
  4677. "2 - (x + y) / z #Comment 08 \n",
  4678. "/* Comment 09*/2 - (x + y) / z",
  4679. "/* Comment 10*/2 - (x + y) / z\n",
  4680. "/* Comment 11*/2 - (x + y) / z/* Comment 12*/",
  4681. "/* Comment 13*/2 - (x + y) / z/* Comment 14*/\n",
  4682. "2 - /* Comment 15 */(x + y) / z",
  4683. "2 - /* Comment 16 */(x + y) /* Comment 17 *// z \n",
  4684. "2 - /* Comment 18 */(x + y) /* Comment 19 */ / z //Comment 20\n",
  4685. "2 - /* Comment 21 */(x + y) /* Comment 22 */ / z #Comment 23\n",
  4686. "2 - /* Comment 24 */(x + y) /* Comment 25 */ / z //Comment 26",
  4687. "2 - /* Comment 27 */(x + y) /* Comment 28 */ / z #Comment 29"
  4688. };
  4689. static const std::size_t expr_str_list_size = sizeof(expr_str_list) / sizeof(std::string);
  4690. std::deque<expression_t> expression_list;
  4691. for (std::size_t i = 0; i < expr_str_list_size; ++i)
  4692. {
  4693. expression_t expression;
  4694. expression.register_symbol_table(symbol_table);
  4695. exprtk::parser<T> parser;
  4696. if (!parser.compile(expr_str_list[i],expression))
  4697. {
  4698. printf("run_test15() - Error: %s Expression: %s\n",
  4699. parser.error().c_str(),
  4700. expr_str_list[i].c_str());
  4701. return false;
  4702. }
  4703. else
  4704. expression_list.push_back(expression);
  4705. }
  4706. expression_t base_expression;
  4707. const std::string base_expr_str = "2 - (x + y) / z";
  4708. {
  4709. base_expression.register_symbol_table(symbol_table);
  4710. exprtk::parser<T> parser;
  4711. if (!parser.compile(base_expr_str,base_expression))
  4712. {
  4713. printf("run_test15() - Error: %s Expression: %s\n",
  4714. parser.error().c_str(),
  4715. base_expr_str.c_str());
  4716. return false;
  4717. }
  4718. }
  4719. bool failure = false;
  4720. for (std::size_t i = 0; i < expression_list.size(); ++i)
  4721. {
  4722. T base_result = base_expression.value();
  4723. T result = expression_list[i].value();
  4724. if (not_equal(base_result,result))
  4725. {
  4726. printf("run_test15() - Error in evaluation! (1) Base: %20.10f\tResult: %20.10f\tExpression: %s\n",
  4727. (double)base_result,
  4728. (double)result,
  4729. expr_str_list[i].c_str());
  4730. failure = true;
  4731. }
  4732. }
  4733. return !failure;
  4734. }
  4735. template <typename T>
  4736. struct base_func : public exprtk::ifunction<T>
  4737. {
  4738. using exprtk::ifunction<T>::operator();
  4739. typedef const T& type;
  4740. base_func(const std::size_t& n) : exprtk::ifunction<T>(n) {}
  4741. inline T operator()(type v0, type v1, type v2, type v3, type v4) { return (v0 + v1 + v2 + v3 + v4); }
  4742. inline T operator()(type v0, type v1, type v2, type v3) { return (v0 + v1 + v2 + v3); }
  4743. inline T operator()(type v0, type v1, type v2) { return (v0 + v1 + v2); }
  4744. inline T operator()(type v0, type v1) { return (v0 + v1); }
  4745. inline T operator()(type v0) { return v0; }
  4746. inline T operator()() { return T(1.1234); }
  4747. };
  4748. template <typename T> struct test_func5 : public base_func<T> { test_func5() : base_func<T>(5){} };
  4749. template <typename T> struct test_func4 : public base_func<T> { test_func4() : base_func<T>(4){} };
  4750. template <typename T> struct test_func3 : public base_func<T> { test_func3() : base_func<T>(3){} };
  4751. template <typename T> struct test_func2 : public base_func<T> { test_func2() : base_func<T>(2){} };
  4752. template <typename T> struct test_func1 : public base_func<T> { test_func1() : base_func<T>(1){} };
  4753. template <typename T> struct test_func0 : public base_func<T> { test_func0() : base_func<T>(0){} };
  4754. template <typename T>
  4755. inline bool run_test16()
  4756. {
  4757. typedef exprtk::expression<T> expression_t;
  4758. T x = T(1.1);
  4759. T y = T(2.2);
  4760. T z = T(3.3);
  4761. T w = T(4.4);
  4762. T u = T(5.5);
  4763. test_func0<T> test_func00;
  4764. test_func1<T> test_func01;
  4765. test_func2<T> test_func02;
  4766. test_func3<T> test_func03;
  4767. test_func4<T> test_func04;
  4768. test_func5<T> test_func05;
  4769. exprtk::symbol_table<T> symbol_table;
  4770. symbol_table.add_constants();
  4771. symbol_table.add_variable("x",x);
  4772. symbol_table.add_variable("y",y);
  4773. symbol_table.add_variable("z",z);
  4774. symbol_table.add_variable("w",w);
  4775. symbol_table.add_variable("u",u);
  4776. symbol_table.add_function("test_func0",test_func00);
  4777. symbol_table.add_function("test_func1",test_func01);
  4778. symbol_table.add_function("test_func2",test_func02);
  4779. symbol_table.add_function("test_func3",test_func03);
  4780. symbol_table.add_function("test_func4",test_func04);
  4781. symbol_table.add_function("test_func5",test_func05);
  4782. static const std::string expr_str_list[] =
  4783. {
  4784. "test_func0 = test_func0()",
  4785. "test_func0 == test_func0()",
  4786. "equal(1.1 + test_func0,test_func0() + 1.1)",
  4787. "equal(test_func0 + 1.1,1.1 + test_func0())",
  4788. "equal((1.1 + test_func0),(test_func0() + 1.1))",
  4789. "equal((test_func0 + 1.1),(1.1 + test_func0()))",
  4790. "equal(test_func0,test_func0())",
  4791. "equal(test_func0,1.1234)",
  4792. "equal(test_func0(),1.1234)",
  4793. "equal(test_func0 + test_func0(),2 * 1.1234)",
  4794. "equal((test_func0 + test_func0()),2 * 1.1234)",
  4795. "equal((test_func0) + (test_func0()),2 * 1.1234)",
  4796. "equal(test_func1(x),(x))",
  4797. "equal(test_func2(x,y),(x + y))",
  4798. "equal(test_func3(x,y,z),(x + y + z))",
  4799. "equal(test_func4(x,y,z,w),(x + y + z + w))",
  4800. "equal(test_func5(x,y,z,w,u),(x + y + z + w + u))",
  4801. "equal(1.1 + test_func0,1.1234 + 1.1)",
  4802. "equal(1.1 + test_func0(),1.1234 + 1.1)",
  4803. "equal(1.1 + test_func1(x),(x + 1.1))",
  4804. "equal(1.1 + test_func2(x,y),(x + y + 1.1))",
  4805. "equal(1.1 + test_func3(x,y,z),(x + y + z + 1.1))",
  4806. "equal(1.1 + test_func4(x,y,z,w),(x + y + z + w + 1.1))",
  4807. "equal(1.1 + test_func5(x,y,z,w,u),(x + y + z + w + u + 1.1))",
  4808. "equal(test_func0 + 2.2,1.1234 + 2.2)",
  4809. "equal(test_func0() + 2.2,1.1234 + 2.2)",
  4810. "equal(test_func1(x) + 2.2,(x + 2.2))",
  4811. "equal(test_func2(x,y) + 2.2,(x + y + 2.2))",
  4812. "equal(test_func3(x,y,z) + 2.2,(x + y + z + 2.2))",
  4813. "equal(test_func4(x,y,z,w) + 2.2,(x + y + z + w + 2.2))",
  4814. "equal(test_func5(x,y,z,w,u) + 2.2,(x + y + z + w + u + 2.2))",
  4815. "equal({[test_func1(x)]},{[(x)]})",
  4816. "equal({[test_func2(x,y)]},{[(x + y)]})",
  4817. "equal({[test_func3(x,y,z)]},{[(x + y + z)]})",
  4818. "equal({[test_func4(x,y,z,w)]},{[(x + y + z + w)]})",
  4819. "equal({[test_func5(x,y,z,w,u)]},{[(x + y + z + w + u)]})",
  4820. "equal(test_func1(2.12),(2.12))",
  4821. "equal(test_func2(2.12,3.12),(2.12 + 3.12))",
  4822. "equal(test_func3(2.12,3.12,4.12),(2.12 + 3.12 + 4.12))",
  4823. "equal(test_func4(2.12,3.12,4.12,5.12),(2.12 + 3.12 + 4.12 + 5.12))",
  4824. "equal(test_func5(2.12,3.12,4.12,5.12,6.12),(2.12 + 3.12 + 4.12 + 5.12 + 6.12))",
  4825. "equal(1.1 + test_func1(2.12),(2.12 + 1.1))",
  4826. "equal(1.1 + test_func2(2.12,3.12),(2.12 + 3.12 + 1.1))",
  4827. "equal(1.1 + test_func3(2.12,3.12,4.12),(2.12 + 3.12 + 4.12 + 1.1))",
  4828. "equal(1.1 + test_func4(2.12,3.12,4.12,5.12),(2.12 + 3.12 + 4.12 + 5.12 + 1.1))",
  4829. "equal(1.1 + test_func5(2.12,3.12,4.12,5.12,6.12),(2.12 + 3.12 + 4.12 + 5.12 + 6.12 + 1.1))",
  4830. "equal(test_func1(2.12) + 2.2,(2.12 + 2.2))",
  4831. "equal(test_func2(2.12,3.12) + 2.2,(2.12 + 3.12 + 2.2))",
  4832. "equal(test_func3(2.12,3.12,4.12) + 2.2,(2.12 + 3.12 + 4.12 + 2.2))",
  4833. "equal(test_func4(2.12,3.12,4.12,5.12) + 2.2,(2.12 + 3.12 + 4.12 + 5.12 + 2.2))",
  4834. "equal(test_func5(2.12,3.12,4.12,5.12,6.12) + 2.2,(2.12 + 3.12 + 4.12 + 5.12 + 6.12 + 2.2))",
  4835. "equal({[test_func1(2.12)]},{[(2.12)]})",
  4836. "equal({[test_func2(2.12,3.12)]},{[(2.12 + 3.12)]})",
  4837. "equal({[test_func3(2.12,3.12,4.12)]},{[(2.12 + 3.12 + 4.12)]})",
  4838. "equal({[test_func4(2.12,3.12,4.12,5.12)]},{[(2.12 + 3.12 + 4.12 + 5.12)]})",
  4839. "equal({[test_func5(2.12,3.12,4.12,5.12,6.12)]},{[(2.12 + 3.12 + 4.12 + 5.12 + 6.12)]})",
  4840. "TeSt_FuNc0 = tEsT_fUnC0()",
  4841. "TEst_fuNC0 == tESt_fUNc0()",
  4842. "EquaL(tEsT_FuNC1(x),(x))",
  4843. "eQuAl(teSt_fUnc2(x,y),(x + y))",
  4844. "EqUaL(tEsT_fUNc3(x,y,z),(x + y + z))",
  4845. "EQUal(TEst_FunC4(x,y,z,w),(x + y + z + w))",
  4846. "eqUAL(tEsT_FuNc5(x,y,z,w,u),(x + y + z + w + u))"
  4847. };
  4848. static const std::size_t expr_str_list_size = sizeof(expr_str_list) / sizeof(std::string);
  4849. std::deque<expression_t> expression_list;
  4850. for (std::size_t i = 0; i < expr_str_list_size; ++i)
  4851. {
  4852. expression_t expression;
  4853. expression.register_symbol_table(symbol_table);
  4854. exprtk::parser<T> parser;
  4855. if (!parser.compile(expr_str_list[i],expression))
  4856. {
  4857. printf("run_test16() - Error: %s Expression: %s\n",
  4858. parser.error().c_str(),
  4859. expr_str_list[i].c_str());
  4860. return false;
  4861. }
  4862. else
  4863. expression_list.push_back(expression);
  4864. }
  4865. bool failure = false;
  4866. for (std::size_t i = 0; i < expression_list.size(); ++i)
  4867. {
  4868. if (T(1) != expression_list[i].value())
  4869. {
  4870. printf("run_test16() - Error in evaluation! (1) Expression: %s\n",
  4871. expr_str_list[i].c_str());
  4872. failure = true;
  4873. }
  4874. }
  4875. return !failure;
  4876. }
  4877. template <typename T>
  4878. inline bool run_test17()
  4879. {
  4880. typedef exprtk::expression<T> expression_t;
  4881. T x = T(1.1);
  4882. T y = T(2.2);
  4883. T z = T(3.3);
  4884. T w = T(4.4);
  4885. T u = T(5.5);
  4886. T v = T(6.6);
  4887. T t = T(7.7);
  4888. T one = T(1);
  4889. T zero = T(0);
  4890. exprtk::symbol_table<T> symbol_table;
  4891. symbol_table.add_constants();
  4892. symbol_table.add_variable("x",x);
  4893. symbol_table.add_variable("y",y);
  4894. symbol_table.add_variable("z",z);
  4895. symbol_table.add_variable("w",w);
  4896. symbol_table.add_variable("u",u);
  4897. symbol_table.add_variable("v",v);
  4898. symbol_table.add_variable("t",t);
  4899. symbol_table.add_variable("one",one);
  4900. symbol_table.add_variable("zero",zero);
  4901. static const std::string expr_str_list[] =
  4902. {
  4903. "equal(mand(one,one),1.0)",
  4904. "equal(mand(one,zero),0.0)",
  4905. "equal(mand(zero,one),0.0)",
  4906. "equal(mand(zero,zero),0.0)",
  4907. "equal(mand(one,one),1.0)",
  4908. "equal(mand(one,one,one),1.0)",
  4909. "equal(mand(one,one,one,one),1.0)",
  4910. "equal(mand(one,one,one,one,one),1.0)",
  4911. "equal(mand(one,one,zero),0.0)",
  4912. "equal(mand(one,one,one,zero),0.0)",
  4913. "equal(mand(one,one,one,one,zero),0.0)",
  4914. "equal(mand(one,one,one,one,one,zero),0.0)",
  4915. "equal(mor(one,one),1.0)",
  4916. "equal(mor(one,zero),1.0)",
  4917. "equal(mor(zero,one),1.0)",
  4918. "equal(mor(zero,zero),0.0)",
  4919. "equal(mor(one,one),1.0)",
  4920. "equal(mor(one,one,zero),1.0)",
  4921. "equal(mor(one,zero,one),1.0)",
  4922. "equal(mor(one,zero,one,zero),1.0)",
  4923. "equal(mor(zero,one),1.0)",
  4924. "equal(mor(zero,zero,one),1.0)",
  4925. "equal(mor(zero,zero,zero,zero,one),1.0)",
  4926. "equal(mor(zero,zero,zero,zero,zero,one),1.0)",
  4927. "equal(mor(zero,zero,zero,zero,zero,zero,zero,zero),0.0)",
  4928. "equal((one nand one),not(mand(one,one)))",
  4929. "equal((one nand zero),not(mand(one,zero)))",
  4930. "equal((zero nand one),not(mand(zero,one)))",
  4931. "equal((zero nand zero),not(mand(zero,zero)))",
  4932. "equal((one nor one),not(mor(one,one)))",
  4933. "equal((one nor zero),not(mor(one,zero)))",
  4934. "equal((zero nor one),not(mor(zero,one)))",
  4935. "equal((zero nor zero),not(mor(zero,zero)))",
  4936. "equal(sum(x,y,z,w,u,v,t),(x+y+z+w+u+v+t))",
  4937. "equal(sum(x+t,y+v,z+u,w+w,u+z,v+y,t+x),2*(x+y+z+w+u+v+t))",
  4938. "equal(mul(x,y,z,w,u,v,t),(x*y*z*w*u*v*t))",
  4939. "equal(mul(x*t,y*v,z*u,w*w,u*z,v*y,t*x),(x*y*z*w*u*v*t)^2)",
  4940. "equal(sum(x,1.0,y,2.0,z,3.0,w,4.0,u,5.0,v,6.0,t),(x+y+z+w+u+v+t+21.0))",
  4941. "equal(sum(x+1.0,y+2.0,z+3.0,w+4.0,u+5.0,v+6.0,t),(x+y+z+w+u+v+t+21.0))",
  4942. "equal(mul(x,1.0,y,2.0,z,3.0,w,4.0,u,5.0,v,6.0,t),(x*y*z*w*u*v*t*720.0))",
  4943. "equal(mul(x*1.0,y*2.0,z*3.0,w*4.0,u*5.0,v*6.0,t),(x*y*z*w*u*v*t*720.0))",
  4944. "equal(min(x,y,z,w,u,v,t,zero),zero)",
  4945. "equal(min(x+y,z+w,u+v,t,zero),zero)",
  4946. "equal(max(one,x,y,z,w,u,v,t),t)",
  4947. "equal(max(x+y,z+w,u+v,t,one),u+v)",
  4948. "equal(avg(x,y,z,w,u,v,t),(x+y+z+w+u+v+t)/7.0)",
  4949. "equal(avg(x+t,y+v,z+u,w+w,u+z,v+y,t+x),2/7*(x+y+z+w+u+v+t))"
  4950. };
  4951. static const std::size_t expr_str_list_size = sizeof(expr_str_list) / sizeof(std::string);
  4952. std::deque<expression_t> expression_list;
  4953. for (std::size_t i = 0; i < expr_str_list_size; ++i)
  4954. {
  4955. expression_t expression;
  4956. expression.register_symbol_table(symbol_table);
  4957. exprtk::parser<T> parser;
  4958. if (!parser.compile(expr_str_list[i],expression))
  4959. {
  4960. printf("run_test17() - Error: %s Expression: %s\n",
  4961. parser.error().c_str(),
  4962. expr_str_list[i].c_str());
  4963. return false;
  4964. }
  4965. else
  4966. expression_list.push_back(expression);
  4967. }
  4968. bool failure = false;
  4969. for (std::size_t i = 0; i < expression_list.size(); ++i)
  4970. {
  4971. if (T(1) != expression_list[i].value())
  4972. {
  4973. printf("run_test17() - Error in evaluation! (1) Expression: %s\n",
  4974. expr_str_list[i].c_str());
  4975. failure = true;
  4976. }
  4977. }
  4978. return !failure;
  4979. }
  4980. template <typename T>
  4981. struct va_func : public exprtk::ivararg_function<T>
  4982. {
  4983. va_func()
  4984. {
  4985. exprtk::enable_zero_parameters(*this);
  4986. exprtk::set_min_num_args(*this, 0);
  4987. exprtk::set_max_num_args(*this, 20);
  4988. }
  4989. inline T operator()(const std::vector<T>& arglist)
  4990. {
  4991. T result = T(0);
  4992. for (std::size_t i = 0; i < arglist.size(); ++i)
  4993. {
  4994. result += arglist[i];
  4995. }
  4996. return result;
  4997. }
  4998. };
  4999. template <typename T>
  5000. struct gen_func : public exprtk::igeneric_function<T>
  5001. {
  5002. typedef typename exprtk::igeneric_function<T>::generic_type generic_type;
  5003. typedef typename exprtk::igeneric_function<T>::parameter_list_t parameter_list_t;
  5004. typedef typename generic_type::scalar_view scalar_t;
  5005. typedef typename generic_type::vector_view vector_t;
  5006. typedef typename generic_type::string_view string_t;
  5007. using exprtk::igeneric_function<T>::operator();
  5008. gen_func()
  5009. : scalar_count(0),
  5010. vector_count(0),
  5011. string_count(0)
  5012. {}
  5013. inline T operator()(parameter_list_t params)
  5014. {
  5015. for (std::size_t i = 0; i < params.size(); ++i)
  5016. {
  5017. generic_type& gt = params[i];
  5018. switch (gt.type)
  5019. {
  5020. case generic_type::e_scalar : scalar_count++;
  5021. break;
  5022. case generic_type::e_vector : vector_count++;
  5023. break;
  5024. case generic_type::e_string : {
  5025. if (
  5026. ("CdEf" != exprtk::to_str(string_t(gt))) &&
  5027. ("abc123" != exprtk::to_str(string_t(gt)))
  5028. )
  5029. {
  5030. return std::numeric_limits<T>::quiet_NaN();
  5031. }
  5032. else
  5033. string_count++;
  5034. }
  5035. break;
  5036. default : return std::numeric_limits<T>::quiet_NaN();
  5037. }
  5038. }
  5039. return T(0);
  5040. }
  5041. std::size_t scalar_count;
  5042. std::size_t vector_count;
  5043. std::size_t string_count;
  5044. };
  5045. template <typename T>
  5046. struct gen_func2 : public exprtk::igeneric_function<T>
  5047. {
  5048. typedef typename exprtk::igeneric_function<T>::parameter_list_t parameter_list_t;
  5049. using exprtk::igeneric_function<T>::operator();
  5050. gen_func2()
  5051. {}
  5052. inline T operator()(parameter_list_t)
  5053. {
  5054. return T(0);
  5055. }
  5056. inline T operator()(const std::size_t&, parameter_list_t params)
  5057. {
  5058. return this->operator()(params);
  5059. }
  5060. };
  5061. template <typename T>
  5062. struct inc_func : public exprtk::igeneric_function<T>
  5063. {
  5064. typedef typename exprtk::igeneric_function<T>::generic_type generic_type;
  5065. typedef typename exprtk::igeneric_function<T>::parameter_list_t parameter_list_t;
  5066. typedef typename generic_type::scalar_view scalar_t;
  5067. typedef typename generic_type::vector_view vector_t;
  5068. typedef typename generic_type::string_view string_t;
  5069. using exprtk::igeneric_function<T>::operator();
  5070. inc_func()
  5071. {}
  5072. inline T operator()(parameter_list_t params)
  5073. {
  5074. for (std::size_t i = 0; i < params.size(); ++i)
  5075. {
  5076. generic_type& gt = params[i];
  5077. switch (gt.type)
  5078. {
  5079. case generic_type::e_scalar : {
  5080. scalar_t scalar(gt);
  5081. scalar() += T(1);
  5082. }
  5083. break;
  5084. case generic_type::e_vector : {
  5085. vector_t vector(gt);
  5086. for (std::size_t x = 0; x < vector.size(); ++x)
  5087. {
  5088. vector[x] += T(1);
  5089. }
  5090. }
  5091. break;
  5092. case generic_type::e_string : {
  5093. string_t string(gt);
  5094. for (std::size_t x = 0; x < string.size(); ++x)
  5095. {
  5096. string[x] += static_cast<typename string_t::value_t>(1);
  5097. }
  5098. }
  5099. break;
  5100. default : return std::numeric_limits<T>::quiet_NaN();
  5101. }
  5102. }
  5103. return T(0);
  5104. }
  5105. inline T operator()(const std::size_t&, parameter_list_t params)
  5106. {
  5107. return this->operator()(params);
  5108. }
  5109. };
  5110. template <typename T>
  5111. struct rem_space_and_uppercase : public exprtk::igeneric_function<T>
  5112. {
  5113. typedef typename exprtk::igeneric_function<T> igenfunc_t;
  5114. typedef typename igenfunc_t::generic_type generic_type;
  5115. typedef typename igenfunc_t::parameter_list_t parameter_list_t;
  5116. typedef typename generic_type::string_view string_t;
  5117. using exprtk::igeneric_function<T>::operator();
  5118. rem_space_and_uppercase()
  5119. : igenfunc_t("S",igenfunc_t::e_rtrn_string)
  5120. {}
  5121. inline T operator()(std::string& result, parameter_list_t params)
  5122. {
  5123. string_t string(params[0]);
  5124. result.reserve(string.size());
  5125. result.clear();
  5126. char c;
  5127. for (std::size_t i = 0; i < string.size(); ++i)
  5128. {
  5129. if (' ' != (c = string[i]))
  5130. result += static_cast<char>(std::toupper(c));
  5131. }
  5132. return T(0);
  5133. }
  5134. inline T operator()(const std::size_t& param_seq_index, std::string& result, parameter_list_t params)
  5135. {
  5136. if (1 == param_seq_index)
  5137. return this->operator()(result,params);
  5138. else
  5139. return T(0);
  5140. }
  5141. };
  5142. template <typename T>
  5143. struct vararg_func : public exprtk::igeneric_function<T>
  5144. {
  5145. typedef typename exprtk::igeneric_function<T>::parameter_list_t
  5146. parameter_list_t;
  5147. typedef typename exprtk::igeneric_function<T>::generic_type
  5148. generic_type;
  5149. typedef typename generic_type::scalar_view scalar_t;
  5150. typedef typename generic_type::vector_view vector_t;
  5151. using exprtk::igeneric_function<T>::operator();
  5152. vararg_func()
  5153. : exprtk::igeneric_function<T>("Z|T*|V")
  5154. {}
  5155. inline T operator()(const std::size_t& ps_index, parameter_list_t /*arglist*/)
  5156. {
  5157. switch (ps_index)
  5158. { // Overload resolution:
  5159. case 0 : return T(0); // Z - Zero arguments
  5160. case 1 : return T(1); // T* - One or more scalars
  5161. case 2 : return T(2); // V - One vector
  5162. default : return std::numeric_limits<T>::quiet_NaN();
  5163. }
  5164. }
  5165. };
  5166. template <typename T>
  5167. struct vecrebase_func : public exprtk::igeneric_function<T>
  5168. {
  5169. typedef typename exprtk::igeneric_function<T>::parameter_list_t
  5170. parameter_list_t;
  5171. typedef typename exprtk::igeneric_function<T>::generic_type
  5172. generic_type;
  5173. typedef typename generic_type::vector_view vector_t;
  5174. using exprtk::igeneric_function<T>::operator();
  5175. vecrebase_func()
  5176. : exprtk::igeneric_function<T>("V")
  5177. {}
  5178. inline T operator()(parameter_list_t params)
  5179. {
  5180. vector_t v(params[0]);
  5181. return std::accumulate(v.begin(), v.end(), T(0));
  5182. }
  5183. };
  5184. template <typename T>
  5185. struct overload_func : exprtk::igeneric_function<T>
  5186. {
  5187. typedef typename exprtk::igeneric_function<T> igfun_t;
  5188. typedef typename igfun_t::parameter_list_t parameter_list_t;
  5189. typedef typename igfun_t::generic_type generic_type;
  5190. typedef typename generic_type::vector_view vector_t;
  5191. using exprtk::igeneric_function<T>::operator();
  5192. overload_func(const std::string& param_seq_list)
  5193. : exprtk::igeneric_function<T>(param_seq_list, igfun_t::e_rtrn_overload),
  5194. current_ps_index(std::numeric_limits<std::size_t>::max())
  5195. {
  5196. clear();
  5197. }
  5198. void clear()
  5199. {
  5200. current_ps_index = std::numeric_limits<std::size_t>::max();
  5201. current_param_seq = "";
  5202. }
  5203. inline T operator()(const std::size_t& ps_index,
  5204. parameter_list_t parameters)
  5205. {
  5206. current_ps_index = ps_index;
  5207. determine_param_seq(parameters);
  5208. return T(1);
  5209. }
  5210. inline T operator()(const std::size_t& ps_index,
  5211. std::string& result,
  5212. parameter_list_t parameters)
  5213. {
  5214. current_ps_index = ps_index;
  5215. determine_param_seq(parameters);
  5216. result = "string result";
  5217. return T(1);
  5218. }
  5219. void determine_param_seq(parameter_list_t parameters)
  5220. {
  5221. current_param_seq = "";
  5222. for (std::size_t i = 0; i < parameters.size(); ++i)
  5223. {
  5224. generic_type& gt = parameters[i];
  5225. switch (gt.type)
  5226. {
  5227. case generic_type::e_scalar : current_param_seq += "T";
  5228. break;
  5229. case generic_type::e_vector : current_param_seq += "V";
  5230. break;
  5231. case generic_type::e_string : current_param_seq += "S";
  5232. break;
  5233. default : continue;
  5234. }
  5235. }
  5236. }
  5237. std::size_t current_ps_index;
  5238. std::string current_param_seq;
  5239. struct test_result_t
  5240. {
  5241. test_result_t(const std::size_t psi, const std::string& ps)
  5242. : ps_index(psi),
  5243. param_seq(ps)
  5244. {}
  5245. std::size_t ps_index;
  5246. std::string param_seq;
  5247. };
  5248. };
  5249. template <typename T>
  5250. inline bool run_test18()
  5251. {
  5252. {
  5253. typedef exprtk::expression<T> expression_t;
  5254. T x = T(1.1);
  5255. T y = T(2.2);
  5256. T z = T(3.3);
  5257. T w = T(4.4);
  5258. T u = T(5.5);
  5259. T v = T(6.6);
  5260. T t = T(7.7);
  5261. va_func<T> vaf;
  5262. exprtk::symbol_table<T> symbol_table;
  5263. symbol_table.add_constants();
  5264. symbol_table.add_variable("x",x);
  5265. symbol_table.add_variable("y",y);
  5266. symbol_table.add_variable("z",z);
  5267. symbol_table.add_variable("w",w);
  5268. symbol_table.add_variable("u",u);
  5269. symbol_table.add_variable("v",v);
  5270. symbol_table.add_variable("t",t);
  5271. symbol_table.add_function("va_func",vaf);
  5272. static const std::string expr_str_list[] =
  5273. {
  5274. "equal(va_func,(0))",
  5275. "equal(va_func(),(0))",
  5276. "equal(va_func(1,2,3,4,5,6,7,8,9),(1+2+3+4+5+6+7+8+9))",
  5277. "equal(va_func(1,x,3,y,5,z,7,w,9),(1+x+3+y+5+z+7+w+9))",
  5278. "equal(va_func(x,2,y,4,z,6,w,8,u),(x+2+y+4+z+6+w+8+u))",
  5279. "equal(va_func(x,y,z,w,u,v,t,1,2,3),(x+y+z+w+u+v+t+1+2+3))",
  5280. "equal(va_func(x,y,z,w,u,v,t),(x+y+z+w+u+v+t))",
  5281. "equal(va_func(x+t,y+v,z+u,w+w,u+z,v+y,t+x),2*(x+y+z+w+u+v+t))",
  5282. "equal(1+va_func(1,x,3,y,5,z,7,w,9),(1+x+3+y+5+z+7+w+9)+1)",
  5283. "equal(va_func(va_func(x,y,z,w,u,v,t),va_func(x,y,z,w,u,v,t)),2*(x+y+z+w+u+v+t))",
  5284. "equal(va_func(va_func(x),va_func(y),va_func(z)),va_func(x,y,z))",
  5285. "equal(va_func(va_func(va_func(va_func(va_func(va_func(va_func(va_func(x)))))))),x)",
  5286. "equal(va_func(va_func(va_func(va_func(va_func(va_func(va_func(va_func(123.456)))))))),123.456)",
  5287. "equal(va_func(va_func(va_func(va_func(va_func(va_func(va_func(va_func(x+1)))))))),x+1)",
  5288. "equal(va_func(va_func(va_func(va_func(va_func(va_func(va_func(va_func(x+y)))))))),x+y)"
  5289. };
  5290. static const std::size_t expr_str_list_size = sizeof(expr_str_list) / sizeof(std::string);
  5291. std::deque<expression_t> expression_list;
  5292. for (std::size_t i = 0; i < expr_str_list_size; ++i)
  5293. {
  5294. expression_t expression;
  5295. expression.register_symbol_table(symbol_table);
  5296. exprtk::parser<T> parser;
  5297. if (!parser.compile(expr_str_list[i],expression))
  5298. {
  5299. printf("run_test18() - VarArg Error: %s Expression: %s\n",
  5300. parser.error().c_str(),
  5301. expr_str_list[i].c_str());
  5302. return false;
  5303. }
  5304. else
  5305. expression_list.push_back(expression);
  5306. }
  5307. bool failure = false;
  5308. for (std::size_t i = 0; i < expression_list.size(); ++i)
  5309. {
  5310. if (T(1) != expression_list[i].value())
  5311. {
  5312. printf("run_test18() - Error in evaluation! (1) Expression: %s\n",
  5313. expr_str_list[i].c_str());
  5314. failure = true;
  5315. }
  5316. }
  5317. if (failure)
  5318. return false;
  5319. }
  5320. {
  5321. typedef exprtk::symbol_table<T> symbol_table_t;
  5322. typedef exprtk::expression<T> expression_t;
  5323. typedef exprtk::parser<T> parser_t;
  5324. T x = T(33);
  5325. T y = T(77);
  5326. T v0[] = { T(1), T(1), T(1), T(1) };
  5327. T v1[] = { T(1), T(2), T(3), T(4) };
  5328. std::vector<T> v2;
  5329. v2.push_back(T(5));
  5330. v2.push_back(T(6));
  5331. v2.push_back(T(7));
  5332. v2.push_back(T(8));
  5333. std::string s0 = "AbCdEfGhIj";
  5334. gen_func<T> f;
  5335. symbol_table_t symbol_table;
  5336. symbol_table.add_constants();
  5337. symbol_table.add_variable ("x" , x);
  5338. symbol_table.add_variable ("y" , y);
  5339. symbol_table.add_vector ("v0" ,v0);
  5340. symbol_table.add_vector ("v1" ,v1);
  5341. symbol_table.add_vector ("v2" ,v2);
  5342. symbol_table.add_stringvar("s0", s0);
  5343. symbol_table.add_function ("gen_func", f);
  5344. std::string expression_list[] =
  5345. {
  5346. "var z := 3; var w[3] := { 1/3, 1/5, 1/7 }; gen_func(v0,v1 + v2, v0[2], x, 2x + y, z, 2w / 3, 'abc123',s0[2:5]);",
  5347. "var z := 3; var w[3] := { 1/3, 1/5, 1/7 }; gen_func(v0,v1 + v2, v0[2], x, 2x + y, z, 2w / 3, 'abc123',s0[2:5]);",
  5348. "var z := 3; var w[3] := { 1/3, 1/5, 1/7 }; gen_func(v1 + v2, v0[2], x, 2x + y, z, 2w / 3, 'abc123',s0[2:5],v0);",
  5349. "var z := 3; var w[3] := { 1/3, 1/5, 1/7 }; gen_func(v0[2], x, 2x + y, z, 2w / 3, 'abc123',s0[2:5],v0, v1 + v2);",
  5350. "var z := 3; var w[3] := { 1/3, 1/5, 1/7 }; gen_func(x, 2x + y, z, 2w / 3, 'abc123',s0[2:5],v0, v1 + v2, v0[2]);",
  5351. "var z := 3; var w[3] := { 1/3, 1/5, 1/7 }; gen_func(2x + y, z, 2w / 3, 'abc123',s0[2:5],v0, v1 + v2, v0[2], x);",
  5352. "var z := 3; var w[3] := { 1/3, 1/5, 1/7 }; gen_func(z, 2w / 3, 'abc123',s0[2:5],v0, v1 + v2, v0[2], x, 2x + y);",
  5353. "var z := 3; var w[3] := { 1/3, 1/5, 1/7 }; gen_func(2w / 3, 'abc123',s0[2:5],v0, v1 + v2, v0[2], x, 2x + y, z);",
  5354. "var z := 3; var w[3] := { 1/3, 1/5, 1/7 }; gen_func('abc123', s0[2:5],v0, v1 + v2, v0[2], x, 2x + y, z,2w / 3);",
  5355. "var z := 3; var w[3] := { 1/3, 1/5, 1/7 }; gen_func(s0[2:5],v0, v1 + v2, v0[2], x, 2x + y, z,2w / 3, 'abc123');"
  5356. };
  5357. static const std::size_t expression_list_size = sizeof(expression_list) / sizeof(std::string);
  5358. bool failure = false;
  5359. for (std::size_t i = 0; i < expression_list_size; ++i)
  5360. {
  5361. expression_t expression;
  5362. expression.register_symbol_table(symbol_table);
  5363. parser_t parser;
  5364. if (!parser.compile(expression_list[i],expression))
  5365. {
  5366. printf("run_test18() - GenFunc Error: %s Expression: %s [2]\n",
  5367. parser.error().c_str(),
  5368. expression_list[i].c_str());
  5369. failure = true;
  5370. continue;
  5371. }
  5372. f.scalar_count = 0;
  5373. f.vector_count = 0;
  5374. f.string_count = 0;
  5375. expression.value();
  5376. if (
  5377. (4 != f.scalar_count) ||
  5378. (3 != f.vector_count) ||
  5379. (2 != f.string_count)
  5380. )
  5381. {
  5382. printf("run_test18() - Error in evaluation! (2) Expression: %s "
  5383. "sc_count = %d "
  5384. "vr_count = %d "
  5385. "st_count = %d\n",
  5386. expression_list[i].c_str(),
  5387. static_cast<int>(f.scalar_count),
  5388. static_cast<int>(f.vector_count),
  5389. static_cast<int>(f.string_count));
  5390. failure = true;
  5391. }
  5392. }
  5393. if (failure)
  5394. return false;
  5395. }
  5396. {
  5397. typedef exprtk::symbol_table<T> symbol_table_t;
  5398. typedef exprtk::expression<T> expression_t;
  5399. typedef exprtk::parser<T> parser_t;
  5400. T x = T(33);
  5401. T y = T(77);
  5402. T v0[] = { T(1), T(1), T(1), T(1) };
  5403. T v1[] = { T(1), T(2), T(3), T(4) };
  5404. T v2[] = { T(5), T(6), T(7), T(8) };
  5405. std::string s0 = "AbCdEfGhIj";
  5406. gen_func2<T> f;
  5407. symbol_table_t symbol_table;
  5408. symbol_table.add_constants();
  5409. symbol_table.add_variable ("x" , x);
  5410. symbol_table.add_variable ("y" , y);
  5411. symbol_table.add_vector ("v0" ,v0);
  5412. symbol_table.add_vector ("v1" ,v1);
  5413. symbol_table.add_vector ("v2" ,v2);
  5414. symbol_table.add_stringvar("s0", s0);
  5415. symbol_table.add_function ("foo", f);
  5416. std::string expression_list[] =
  5417. {
  5418. "var z := 3; var w[3] := { 1/3, 1/5, 1/7 }; foo(v0,v1 + v2, v0[2], x, 2x + y, z, 2w / 3, 'abc123',s0[2:5]);",
  5419. "var z := 3; var w[3] := { 1/3, 1/5, 1/7 }; foo(v1 + v2, v0[2], x, 2x + y, z, 2w / 3, 'abc123',s0[2:5],v0);",
  5420. "var z := 3; var w[3] := { 1/3, 1/5, 1/7 }; foo(v0[2], x, 2x + y, z, 2w / 3, 'abc123',s0[2:5],v0, v1 + v2);",
  5421. "var z := 3; var w[3] := { 1/3, 1/5, 1/7 }; foo(x, 2x + y, z, 2w / 3, 'abc123',s0[2:5],v0, v1 + v2, v0[2]);",
  5422. "var z := 3; var w[3] := { 1/3, 1/5, 1/7 }; foo(2x + y, z, 2w / 3, 'abc123',s0[2:5],v0, v1 + v2, v0[2], x);",
  5423. "var z := 3; var w[3] := { 1/3, 1/5, 1/7 }; foo(z, 2w / 3, 'abc123',s0[2:5],v0, v1 + v2, v0[2], x, 2x + y);",
  5424. "var z := 3; var w[3] := { 1/3, 1/5, 1/7 }; foo(2w / 3, 'abc123',s0[2:5],v0, v1 + v2, v0[2], x, 2x + y, z);",
  5425. "var z := 3; var w[3] := { 1/3, 1/5, 1/7 }; foo('abc123', s0[2:5],v0, v1 + v2, v0[2], x, 2x + y, z,2w / 3);",
  5426. "var z := 3; var w[3] := { 1/3, 1/5, 1/7 }; foo(s0[2:5],v0, v1 + v2, v0[2], x, 2x + y, z,2w / 3, 'abc123');",
  5427. "var z := 3; var w[3] := { 1/3, 1/5, 1/7 }; foo(s0[2:3]+s0[4:5],v0, v1 + v2, v0[2], x, 2x + y, z,2w / 3, 'abc123');",
  5428. "var z := 3; var w[3] := { 1/3, 1/5, 1/7 }; foo(v0,v1 + v2, v0[2], x, 2x + y, z, 2w / 3, 'abc123',s0[2:5]);",
  5429. "var z := 3; var w[3] := { 1/3, 1/5, 1/7 }; foo(v0,v1 + v2, v0[2], x, 2x + y, z, 2w / 3, 'abc123',s0[2:5]);",
  5430. "var z := 3; var w[3] := { 1/3, 1/5, 1/7 }; foo(v0,v1 + v2, v0[2], x, 2x + y, z, 2w / 3, 'abc123',s0[2:5]);",
  5431. "var z := 3; var w[3] := { 1/3, 1/5, 1/7 }; foo(v0,v1 + v2, v0[2], x, 2x + y, z, 2w / 3, 'abc123',s0[2:5]);",
  5432. "var z := 3; var w[3] := { 1/3, 1/5, 1/7 }; foo(x);",
  5433. "var z := 3; var w[3] := { 1/3, 1/5, 1/7 }; foo(x,x);",
  5434. "var z := 3; var w[3] := { 1/3, 1/5, 1/7 }; foo(x,x,x);",
  5435. "var z := 3; var w[3] := { 1/3, 1/5, 1/7 }; foo(x,x,x,x);",
  5436. "var z := 3; var w[3] := { 1/3, 1/5, 1/7 }; foo(s0);",
  5437. "var z := 3; var w[3] := { 1/3, 1/5, 1/7 }; foo(s0,s0);",
  5438. "var z := 3; var w[3] := { 1/3, 1/5, 1/7 }; foo(s0,s0,s0);",
  5439. "var z := 3; var w[3] := { 1/3, 1/5, 1/7 }; foo(s0,s0,s0,s0);",
  5440. "var z := 3; var w[3] := { 1/3, 1/5, 1/7 }; foo(v0);",
  5441. "var z := 3; var w[3] := { 1/3, 1/5, 1/7 }; foo(v0,v0);",
  5442. "var z := 3; var w[3] := { 1/3, 1/5, 1/7 }; foo(v0,v0,v0);",
  5443. "var z := 3; var w[3] := { 1/3, 1/5, 1/7 }; foo(v0,v0,v0,v0);",
  5444. "var z := 3; var w[3] := { 1/3, 1/5, 1/7 }; foo(x);",
  5445. "var z := 3; var w[3] := { 1/3, 1/5, 1/7 }; foo(x,x);",
  5446. "var z := 3; var w[3] := { 1/3, 1/5, 1/7 }; foo(x,x,x);",
  5447. "var z := 3; var w[3] := { 1/3, 1/5, 1/7 }; foo(x,x,x,x);",
  5448. "var z := 3; var w[3] := { 1/3, 1/5, 1/7 }; foo(s0);",
  5449. "var z := 3; var w[3] := { 1/3, 1/5, 1/7 }; foo(s0,s0);",
  5450. "var z := 3; var w[3] := { 1/3, 1/5, 1/7 }; foo(s0,s0,s0);",
  5451. "var z := 3; var w[3] := { 1/3, 1/5, 1/7 }; foo(s0,s0,s0,s0);",
  5452. "var z := 3; var w[3] := { 1/3, 1/5, 1/7 }; foo(v0);",
  5453. "var z := 3; var w[3] := { 1/3, 1/5, 1/7 }; foo(v0,v0);",
  5454. "var z := 3; var w[3] := { 1/3, 1/5, 1/7 }; foo(v0,v0,v0);",
  5455. "var z := 3; var w[3] := { 1/3, 1/5, 1/7 }; foo(v0,v0,v0,v0);",
  5456. "var z := 3; var w[3] := { 1/3, 1/5, 1/7 }; foo(v0,v1 + v2, v0[2], x, 2x + y, z, 2w / 3, 'abc123',s0[2:5]);",
  5457. "var z := 3; var w[3] := { 1/3, 1/5, 1/7 }; foo(v0,v1 + v2, v0[2], x, 2x + y, z, 2w / 3, 'abc123',s0[2:5]);",
  5458. "var z := 3; var w[3] := { 1/3, 1/5, 1/7 }; foo(v0,v1 + v2, v0[2], x, 2x + y, z, 2w / 3, 'abc123',s0[2:5]);",
  5459. "var z := 3; var w[3] := { 1/3, 1/5, 1/7 }; foo(v0,v1 + v2, v0[2], x, 2x + y, z, 2w / 3, 'abc123',s0[2:5]);"
  5460. };
  5461. static const std::size_t expression_list_size = sizeof(expression_list) / sizeof(std::string);
  5462. std::string parameter_type_list[] =
  5463. {
  5464. "VVTTTTVSS",
  5465. "VTTTTVSSV",
  5466. "TTTTVSSVV",
  5467. "TTTVSSVVT",
  5468. "TTVSSVVT*",
  5469. "TVSSVVT*" ,
  5470. "VSSVVT*" ,
  5471. "SSVVTTTTV",
  5472. "SVVTTTTVS",
  5473. "SVVTTTTVS",
  5474. "V*T*VS*" ,
  5475. "V*TTTTVSS",
  5476. "VVT*VSS" ,
  5477. "VVTTTTVS*",
  5478. "T*",
  5479. "T*",
  5480. "T*",
  5481. "T*",
  5482. "S*",
  5483. "S*",
  5484. "S*",
  5485. "S*",
  5486. "V*",
  5487. "V*",
  5488. "V*",
  5489. "V*",
  5490. "T",
  5491. "TT",
  5492. "TTT",
  5493. "TTTT",
  5494. "S",
  5495. "SS",
  5496. "SSS",
  5497. "SSSS",
  5498. "V",
  5499. "VV",
  5500. "VVV",
  5501. "VVVV",
  5502. "TTTTTTT|STSTSTS|V*T*VS*" ,
  5503. "TTTTTTT|STSTSTS|V*TTTTVSS",
  5504. "TTTTTTT|STSTSTS|VVT*VSS" ,
  5505. "TTTTTTT|STSTSTS|VVTTTTVS*",
  5506. };
  5507. bool failure = false;
  5508. for (std::size_t i = 0; i < expression_list_size; ++i)
  5509. {
  5510. expression_t expression;
  5511. expression.register_symbol_table(symbol_table);
  5512. parser_t parser;
  5513. f.parameter_sequence = parameter_type_list[i];
  5514. if (!parser.compile(expression_list[i],expression))
  5515. {
  5516. printf("run_test18() - GenFunc2 Error: %s Expression: %s Parameter Sequence: %s [3]\n",
  5517. parser.error().c_str(),
  5518. expression_list[i].c_str(),
  5519. parameter_type_list[i].c_str());
  5520. failure = true;
  5521. continue;
  5522. }
  5523. expression.value();
  5524. }
  5525. if (failure)
  5526. return false;
  5527. }
  5528. {
  5529. bool failure = false;
  5530. std::string expression_list[] =
  5531. {
  5532. "foo(v0,v1,v2,x,y,s0);",
  5533. "foo(v1,v2,x,y,s0,v0);",
  5534. "foo(v2,x,y,s0,v0,v1);",
  5535. "foo(x,y,s0,v0,v1,v2);",
  5536. "foo(y,s0,v0,v1,v2,x);",
  5537. "foo(s0,v0,v1,v2,x,y);"
  5538. };
  5539. static const std::size_t expression_list_size = sizeof(expression_list) / sizeof(std::string);
  5540. std::string parameter_type_list[] =
  5541. {
  5542. "VVVTTS",
  5543. "VVTTSV",
  5544. "VTTSVV",
  5545. "TTSVVV",
  5546. "TSVVVT",
  5547. "SVVVTT"
  5548. };
  5549. for (std::size_t i = 0; i < expression_list_size; ++i)
  5550. {
  5551. typedef exprtk::symbol_table<T> symbol_table_t;
  5552. typedef exprtk::expression<T> expression_t;
  5553. typedef exprtk::parser<T> parser_t;
  5554. T x = T(33);
  5555. T y = T(77);
  5556. T v0[] = { T(1), T(1), T(1), T(1) };
  5557. T v1[] = { T(1), T(2), T(3), T(4) };
  5558. T v2[] = { T(5), T(6), T(7), T(8) };
  5559. std::string s0 = "AbCdEfGhIj";
  5560. T x_inc = T(34);
  5561. T y_inc = T(78);
  5562. T v0_inc[] = { T(2), T(2), T(2), T(2) };
  5563. T v1_inc[] = { T(2), T(3), T(4), T(5) };
  5564. T v2_inc[] = { T(6), T(7), T(8), T(9) };
  5565. std::size_t sizeof_vec = sizeof(v0) / sizeof(T);
  5566. std::string s0_inc = "BcDeFgHiJk";
  5567. inc_func<T> f;
  5568. symbol_table_t symbol_table;
  5569. symbol_table.add_constants();
  5570. symbol_table.add_variable ("x" , x);
  5571. symbol_table.add_variable ("y" , y);
  5572. symbol_table.add_vector ("v0" ,v0);
  5573. symbol_table.add_vector ("v1" ,v1);
  5574. symbol_table.add_vector ("v2" ,v2);
  5575. symbol_table.add_stringvar("s0", s0);
  5576. symbol_table.add_function ("foo", f);
  5577. expression_t expression;
  5578. expression.register_symbol_table(symbol_table);
  5579. parser_t parser;
  5580. f.parameter_sequence = parameter_type_list[i];
  5581. if (!parser.compile(expression_list[i],expression))
  5582. {
  5583. printf("run_test18() - IncFunc Error: %s Expression: %s Parameter Sequence: %s [4]\n",
  5584. parser.error().c_str(),
  5585. expression_list[i].c_str(),
  5586. parameter_type_list[i].c_str());
  5587. failure = true;
  5588. continue;
  5589. }
  5590. expression.value();
  5591. if (x != x_inc)
  5592. {
  5593. printf("run_test18() - Error in evaluation! (3) Expression: %s Check: x\n",
  5594. expression_list[i].c_str());
  5595. failure = true;
  5596. }
  5597. if (y != y_inc)
  5598. {
  5599. printf("run_test18() - Error in evaluation! (3) Expression: %s Check: y\n",
  5600. expression_list[i].c_str());
  5601. failure = true;
  5602. }
  5603. if (s0 != s0_inc)
  5604. {
  5605. printf("run_test18() - Error in evaluation! (3) Expression: %s Check: y\n",
  5606. expression_list[i].c_str());
  5607. failure = true;
  5608. }
  5609. if (!std::equal(v0,v0 + sizeof_vec,v0_inc))
  5610. {
  5611. printf("run_test18() - Error in evaluation! (3) Expression: %s Check: v0\n",
  5612. expression_list[i].c_str());
  5613. failure = true;
  5614. }
  5615. if (!std::equal(v1,v1 + sizeof_vec,v1_inc))
  5616. {
  5617. printf("run_test18() - Error in evaluation! (3) Expression: %s Check: v1\n",
  5618. expression_list[i].c_str());
  5619. failure = true;
  5620. }
  5621. if (!std::equal(v2,v2 + sizeof_vec,v2_inc))
  5622. {
  5623. printf("run_test18() - Error in evaluation! (3) Expression: %s Check: v2\n",
  5624. expression_list[i].c_str());
  5625. failure = true;
  5626. }
  5627. }
  5628. if (failure)
  5629. return false;
  5630. }
  5631. {
  5632. bool failure = false;
  5633. rem_space_and_uppercase<T> rsauc;
  5634. std::string s0 = "XXXXXXXXXXXXXXX";
  5635. std::string s1 = "XXXXXXXXXXXXXXX";
  5636. std::string s2 = "XXXXXXXXXXXXXXX";
  5637. std::string s3 = "XXXXXXXXXXXXXXX";
  5638. std::string s4 = "XXXXXXXXXXXXXXX";
  5639. typedef exprtk::symbol_table<T> symbol_table_t;
  5640. typedef exprtk::expression<T> expression_t;
  5641. typedef exprtk::parser<T> parser_t;
  5642. symbol_table_t symbol_table;
  5643. symbol_table.add_constants();
  5644. symbol_table.add_stringvar("s0", s0);
  5645. symbol_table.add_stringvar("s1", s1);
  5646. symbol_table.add_stringvar("s2", s2);
  5647. symbol_table.add_stringvar("s3", s3);
  5648. symbol_table.add_stringvar("s4", s4);
  5649. symbol_table.add_function("remspc_uc",rsauc);
  5650. std::string program = " s0 := 'How now '; "
  5651. " s1 := 'brown cow?'; "
  5652. " s2 := remspc_uc(s0 + s1); "
  5653. " s3 := remspc_uc(s0) + s1; "
  5654. " s4 := s0 + remspc_uc(s1); "
  5655. " remspc_uc(s0 + s1) == remspc_uc(s0) + remspc_uc(s1);";
  5656. std::string parameter_type_list[] =
  5657. {
  5658. "VVVTTT|S",
  5659. "VVTTTV|S",
  5660. "VTTTVV|S",
  5661. "TTTVVV|S",
  5662. "TTVVVT|S",
  5663. "TVVVTT|S"
  5664. };
  5665. std::size_t parameter_type_list_size = sizeof(parameter_type_list) / sizeof(std::string);
  5666. for (std::size_t i = 0; i < parameter_type_list_size; ++i)
  5667. {
  5668. expression_t expression;
  5669. expression.register_symbol_table(symbol_table);
  5670. parser_t parser;
  5671. rsauc.parameter_sequence = parameter_type_list[i];
  5672. if (!parser.compile(program,expression))
  5673. {
  5674. printf("run_test18() - Error: %s\tExpression: %s\n",
  5675. parser.error().c_str(),
  5676. program.c_str());
  5677. return false;
  5678. }
  5679. T result = expression.value();
  5680. if (result != T(1))
  5681. {
  5682. printf("run_test18() - Error in evaluation! (4) Expression: %s Result <> 1\n",
  5683. program.c_str());
  5684. failure = true;
  5685. }
  5686. if (result != T(1))
  5687. {
  5688. printf("run_test18() - Error in evaluation! (4) Expression: %s Check: s0\n",
  5689. program.c_str());
  5690. failure = true;
  5691. }
  5692. if ("How now " != s0)
  5693. {
  5694. printf("run_test18() - Error in evaluation! (4) Expression: %s Check: s0\n",
  5695. program.c_str());
  5696. failure = true;
  5697. }
  5698. if ("brown cow?" != s1)
  5699. {
  5700. printf("run_test18() - Error in evaluation! (4) Expression: %s Check: s1\n",
  5701. program.c_str());
  5702. failure = true;
  5703. }
  5704. if ("HOWNOWBROWNCOW?" != s2)
  5705. {
  5706. printf("run_test18() - Error in evaluation! (4) Expression: %s Check: s2\n",
  5707. program.c_str());
  5708. failure = true;
  5709. }
  5710. if ("HOWNOWbrown cow?" != s3)
  5711. {
  5712. printf("run_test18() - Error in evaluation! (4) Expression: %s Check: s3\n",
  5713. program.c_str());
  5714. failure = true;
  5715. }
  5716. if ("How now BROWNCOW?" != s4)
  5717. {
  5718. printf("run_test18() - Error in evaluation! (4) Expression: %s Check: s4\n",
  5719. program.c_str());
  5720. failure = true;
  5721. }
  5722. }
  5723. if (failure)
  5724. return false;
  5725. }
  5726. {
  5727. bool failure = false;
  5728. typedef exprtk::symbol_table<T> symbol_table_t;
  5729. typedef exprtk::expression<T> expression_t;
  5730. typedef exprtk::parser<T> parser_t;
  5731. symbol_table_t symbol_table;
  5732. T v[4] = {T(5), T(6), T(7), T(8)};
  5733. symbol_table.add_vector("v",v);
  5734. vararg_func<T> vaf;
  5735. symbol_table.add_function("vararg_func",vaf);
  5736. expression_t expression;
  5737. expression.register_symbol_table(symbol_table);
  5738. parser_t parser;
  5739. std::string programs[] =
  5740. {
  5741. "equal(0,vararg_func())",
  5742. "equal(1,vararg_func() + 1)",
  5743. "equal(1,1 + vararg_func())",
  5744. "equal(1,vararg_func + 1)",
  5745. "equal(1,1 + vararg_func)",
  5746. "equal(0,vararg_func() + vararg_func)",
  5747. "equal(0,vararg_func + vararg_func())",
  5748. "equal(1,vararg_func + vararg_func(1))",
  5749. "equal(1,vararg_func + vararg_func(1,2))",
  5750. "equal(2,vararg_func + vararg_func(v))",
  5751. "equal(1,vararg_func() + vararg_func(1))",
  5752. "equal(1,vararg_func() + vararg_func(1,2))",
  5753. "equal(2,vararg_func() + vararg_func(v))",
  5754. "equal(2,vararg_func(v))",
  5755. "equal(1,vararg_func(1))",
  5756. "equal(1,vararg_func(1,2,3))",
  5757. "equal(1,vararg_func(5,6,7,8))",
  5758. "equal(5,vararg_func(v) + 3)",
  5759. "equal(5,vararg_func(1) + 4)",
  5760. "equal(6,vararg_func(1,2,3) + 5)",
  5761. "equal(7,vararg_func(5,6,7,8) + 6)"
  5762. };
  5763. static const std::size_t programs_size = sizeof(programs) / sizeof(std::string);
  5764. for (std::size_t i = 0; i < programs_size; ++i)
  5765. {
  5766. if (!parser.compile(programs[i],expression))
  5767. {
  5768. printf("run_test18() - Error: %s\tExpression: %s\n",
  5769. parser.error().c_str(),
  5770. programs[i].c_str());
  5771. failure = true;
  5772. }
  5773. else if (T(1) != expression.value())
  5774. {
  5775. printf("run_test18() - Error in evaluation! (5) Expression: %s\n",
  5776. programs[i].c_str());
  5777. failure = true;
  5778. }
  5779. }
  5780. if (failure)
  5781. return false;
  5782. }
  5783. {
  5784. bool failure = false;
  5785. typedef exprtk::symbol_table<T> symbol_table_t;
  5786. typedef exprtk::expression<T> expression_t;
  5787. typedef exprtk::parser<T> parser_t;
  5788. std::vector<T> v0;
  5789. std::vector<T> v1;
  5790. std::vector<T> v2;
  5791. std::vector<T> v3;
  5792. #define pb(v,N) \
  5793. v.push_back(T(N)); \
  5794. pb(v0,0) pb(v0,0) pb(v0,0) pb(v0,0) pb(v0,0) pb(v0, 0) pb(v0, 0)
  5795. pb(v1,0) pb(v1,2) pb(v1,4) pb(v1,6) pb(v1,8) pb(v1,10) pb(v1,12)
  5796. pb(v2,1) pb(v2,3) pb(v2,5) pb(v2,7) pb(v2,9) pb(v2,11) pb(v2,13)
  5797. pb(v3,0) pb(v3,1) pb(v3,2) pb(v3,3) pb(v3,4) pb(v3, 5) pb(v3, 6)
  5798. #undef pb
  5799. const std::string expr_string = "sum(v + 1)";
  5800. exprtk::vector_view<T> v = exprtk::make_vector_view(v0,v0.size());
  5801. symbol_table_t symbol_table;
  5802. symbol_table.add_vector("v",v);
  5803. expression_t expression;
  5804. expression.register_symbol_table(symbol_table);
  5805. parser_t parser;
  5806. if (!parser.compile(expr_string,expression))
  5807. {
  5808. printf("run_test18() - Error: %s\tExpression: %s\n",
  5809. parser.error().c_str(),
  5810. expr_string.c_str());
  5811. failure = true;
  5812. }
  5813. T sum = { T(0) };
  5814. sum = expression.value();
  5815. if (not_equal(sum,T(7)))
  5816. {
  5817. printf("run_test18() - Error in evaluation! (6) Expression: %s\n",
  5818. expr_string.c_str());
  5819. failure = true;
  5820. }
  5821. v.rebase(v1.data());
  5822. sum = expression.value();
  5823. if (not_equal(sum,T(49)))
  5824. {
  5825. printf("run_test18() - Error in evaluation! (7) Expression: %s\n",
  5826. expr_string.c_str());
  5827. failure = true;
  5828. }
  5829. v.rebase(v2.data());
  5830. sum = expression.value();
  5831. if (not_equal(sum,T(56)))
  5832. {
  5833. printf("run_test18() - Error in evaluation! (8) Expression: %s\n",
  5834. expr_string.c_str());
  5835. failure = true;
  5836. }
  5837. v.rebase(v3.data());
  5838. sum = expression.value();
  5839. if (not_equal(sum,T(28)))
  5840. {
  5841. printf("run_test18() - Error in evaluation! (9) Expression: %s\n",
  5842. expr_string.c_str());
  5843. failure = true;
  5844. }
  5845. if (failure)
  5846. return false;
  5847. }
  5848. {
  5849. bool failure = false;
  5850. typedef exprtk::symbol_table<T> symbol_table_t;
  5851. typedef exprtk::expression<T> expression_t;
  5852. typedef exprtk::parser<T> parser_t;
  5853. std::vector<T> v0;
  5854. std::vector<T> s;
  5855. #define pb(v,N) \
  5856. v.push_back(T(N)); \
  5857. pb(v0,0) pb(v0,1) pb(v0,2) pb(v0,3) pb(v0,4)
  5858. pb(v0,5) pb(v0,6) pb(v0,7) pb(v0,8) pb(v0,9)
  5859. pb(s, 3) pb(s, 6) pb(s, 9) pb(s,12)
  5860. pb(s,15) pb(s,18) pb(s,21)
  5861. #undef pb
  5862. const std::string expr_string = "v[0] + v[1] + v[2]";
  5863. exprtk::vector_view<T> v = exprtk::make_vector_view(v0,4);
  5864. symbol_table_t symbol_table;
  5865. symbol_table.add_vector("v",v);
  5866. expression_t expression;
  5867. expression.register_symbol_table(symbol_table);
  5868. parser_t parser;
  5869. if (!parser.compile(expr_string,expression))
  5870. {
  5871. printf("run_test18() - Error: %s\tExpression: %s\n",
  5872. parser.error().c_str(),
  5873. expr_string.c_str());
  5874. failure = true;
  5875. }
  5876. for (std::size_t i = 0; i < v0.size() - 4; ++i)
  5877. {
  5878. v.rebase(v0.data() + i);
  5879. T sum = expression.value();
  5880. if (not_equal(sum,s[i]))
  5881. {
  5882. printf("run_test18() - Error in evaluation! (7) Expression: %s Expected: %5.3f Computed: %5.3f\n",
  5883. expr_string.c_str(),
  5884. s[i],
  5885. sum);
  5886. failure = true;
  5887. }
  5888. }
  5889. if (failure)
  5890. return false;
  5891. }
  5892. {
  5893. bool failure = false;
  5894. typedef exprtk::symbol_table<T> symbol_table_t;
  5895. typedef exprtk::expression<T> expression_t;
  5896. typedef exprtk::parser<T> parser_t;
  5897. std::vector<T> v0;
  5898. std::vector<T> s;
  5899. #define pb(v,N) \
  5900. v.push_back(T(N)); \
  5901. pb(v0,0) pb(v0,1) pb(v0,2) pb(v0,3) pb(v0,4)
  5902. pb(v0,5) pb(v0,6) pb(v0,7) pb(v0,8) pb(v0,9)
  5903. pb(s, 3) pb(s, 6) pb(s, 9) pb(s,12)
  5904. pb(s,15) pb(s,18) pb(s,21)
  5905. #undef pb
  5906. const std::string expr_string = "var i := 0; var j := 1; var k := 2; v[i] + v[j] + v[k]";
  5907. exprtk::vector_view<T> v = exprtk::make_vector_view(v0,4);
  5908. symbol_table_t symbol_table;
  5909. symbol_table.add_vector("v",v);
  5910. expression_t expression;
  5911. expression.register_symbol_table(symbol_table);
  5912. parser_t parser;
  5913. if (!parser.compile(expr_string,expression))
  5914. {
  5915. printf("run_test18() - Error: %s\tExpression: %s\n",
  5916. parser.error().c_str(),
  5917. expr_string.c_str());
  5918. failure = true;
  5919. }
  5920. for (std::size_t i = 0; i < v0.size() - 4; ++i)
  5921. {
  5922. v.rebase(v0.data() + i);
  5923. T sum = expression.value();
  5924. if (not_equal(sum,s[i]))
  5925. {
  5926. printf("run_test18() - Error in evaluation! (8) Expression: %s Expected: %5.3f Computed: %5.3f\n",
  5927. expr_string.c_str(),
  5928. s[i],
  5929. sum);
  5930. failure = true;
  5931. }
  5932. }
  5933. if (failure)
  5934. return false;
  5935. }
  5936. {
  5937. bool failure = false;
  5938. typedef exprtk::symbol_table<T> symbol_table_t;
  5939. typedef exprtk::expression<T> expression_t;
  5940. typedef exprtk::parser<T> parser_t;
  5941. std::vector<T> v0;
  5942. std::vector<T> s;
  5943. #define pb(v,N) \
  5944. v.push_back(T(N)); \
  5945. pb(v0,0) pb(v0,1) pb(v0,2) pb(v0,3) pb(v0,4)
  5946. pb(v0,5) pb(v0,6) pb(v0,7) pb(v0,8) pb(v0,9)
  5947. pb(s, 3) pb(s, 6) pb(s, 9) pb(s,12)
  5948. pb(s,15) pb(s,18) pb(s,21)
  5949. #undef pb
  5950. const std::string expr_string = "var i := 0; v[i + 0] + v[i + 1] + v[i + 2]";
  5951. exprtk::vector_view<T> v = exprtk::make_vector_view(v0,4);
  5952. symbol_table_t symbol_table;
  5953. symbol_table.add_vector("v",v);
  5954. expression_t expression;
  5955. expression.register_symbol_table(symbol_table);
  5956. parser_t parser;
  5957. if (!parser.compile(expr_string,expression))
  5958. {
  5959. printf("run_test18() - Error: %s\tExpression: %s\n",
  5960. parser.error().c_str(),
  5961. expr_string.c_str());
  5962. failure = true;
  5963. }
  5964. for (std::size_t i = 0; i < v0.size() - 4; ++i)
  5965. {
  5966. v.rebase(v0.data() + i);
  5967. T sum = expression.value();
  5968. if (not_equal(sum,s[i]))
  5969. {
  5970. printf("run_test18() - Error in evaluation! (9) Expression: %s Expected: %5.3f Computed: %5.3f\n",
  5971. expr_string.c_str(),
  5972. s[i],
  5973. sum);
  5974. failure = true;
  5975. }
  5976. }
  5977. if (failure)
  5978. return false;
  5979. }
  5980. {
  5981. typedef exprtk::symbol_table<T> symbol_table_t;
  5982. typedef exprtk::expression<T> expression_t;
  5983. typedef exprtk::parser<T> parser_t;
  5984. T v0[] = { T(0), T(1), T(2), T(3), T(4) };
  5985. T v1[] = { T(5), T(6), T(7), T(8), T(9) };
  5986. const std::size_t v0_size = sizeof(v0) / sizeof (T);
  5987. const std::size_t v1_size = sizeof(v1) / sizeof (T);
  5988. exprtk::vector_view<T> v = exprtk::make_vector_view(v0, v0_size);
  5989. vecrebase_func<T> vec_sum;
  5990. symbol_table_t symbol_table;
  5991. symbol_table.add_vector("v",v);
  5992. symbol_table.add_function("vec_sum",vec_sum);
  5993. expression_t expression;
  5994. expression.register_symbol_table(symbol_table);
  5995. parser_t parser;
  5996. const std::string expr_string = "vec_sum(v)";
  5997. if (!parser.compile(expr_string,expression))
  5998. {
  5999. printf("run_test18() - Error: %s\tExpression: %s\n",
  6000. parser.error().c_str(),
  6001. expr_string.c_str());
  6002. return false;
  6003. }
  6004. const T expected_result0 = std::accumulate(v0, v0 + v0_size,T(0));
  6005. if (expression.value() != expected_result0)
  6006. {
  6007. printf("run_test18() - Error in evaluation! (10.1) Expression: %s Expected: %5.3f Computed: %5.3f\n",
  6008. expr_string.c_str(),
  6009. expected_result0,
  6010. expression.value());
  6011. return false;
  6012. }
  6013. v.rebase(v1);
  6014. const T expected_result1 = std::accumulate(v1, v1 + v1_size,T(0));
  6015. if (expression.value() != expected_result1)
  6016. {
  6017. printf("run_test18() - Error in evaluation! (10.2) Expression: %s Expected: %5.3f Computed: %5.3f\n",
  6018. expr_string.c_str(),
  6019. expected_result1,
  6020. expression.value());
  6021. return false;
  6022. }
  6023. }
  6024. {
  6025. bool failure = false;
  6026. typedef exprtk::symbol_table<T> symbol_table_t;
  6027. typedef exprtk::expression<T> expression_t;
  6028. typedef exprtk::parser<T> parser_t;
  6029. exprtk::rtl::vecops::package<T> vecops_pkg;
  6030. symbol_table_t symbol_table;
  6031. symbol_table.add_package(vecops_pkg);
  6032. std::string expr_str_list[] =
  6033. {
  6034. "var v[9] := {1,2,3,4,5,6,7,8,9}; all_true(v) == true" ,
  6035. "var v[6] := {-1,-2,-3,-4,-5,-6}; all_true(v) == true" ,
  6036. "var v[8] := {1,2,3,0,0,0,0,0}; all_true(v) == false",
  6037. "var v[8] := {-1,-2,-3,0,0,0,0,0}; all_true(v) == false",
  6038. "var v[9] := {0,0,0,0,0,0,0,0,0}; all_true(v + 1) == true",
  6039. "var v[9] := {0,0,0,0,0,0,0,0,0}; all_false(v) == true" ,
  6040. "var v[9] := {0,0,0,0,0,1,2,3,4}; all_false(v) == false" ,
  6041. "var v[8] := {0,0,0,0,0,-1,-2,-3}; all_false(v) == false" ,
  6042. "var v[9] := {1,1,1,1,1,1,1,1,1}; any_false(v - 1) == true",
  6043. "var v[9] := {0,0,0,0,0,0,0,0,1}; any_true(v) == true" ,
  6044. "var v[9] := {0,0,0,0,1,0,0,0,0}; any_true(v) == true" ,
  6045. "var v[9] := {0,0,0,0,0,0,0,0,0}; any_true(v) == false" ,
  6046. "var v[9] := {0,0,0,0,0,0,0,0,0}; any_true(v + 1) == true",
  6047. "var v[9] := {1,1,1,1,1,1,1,1,0}; any_false(v) == true" ,
  6048. "var v[9] := {1,1,1,1,0,1,1,1,1}; any_false(v) == true" ,
  6049. "var v[9] := {1,1,1,1,1,1,1,1,1}; any_false(v) == false" ,
  6050. "var v[9] := {1,1,1,1,1,1,1,1,1}; any_false(v - 1) == true",
  6051. "var v[9] := {0,0,0,0,0,0,0,0,0}; count(v) == 0" ,
  6052. "var v[9] := {0,0,0,0,0,0,0,0,1}; count(v) == 1" ,
  6053. "var v[9] := {0,0,0,0,0,0,0,2,1}; count(v) == 2" ,
  6054. "var v[9] := {0,0,0,0,0,0,3,2,1}; count(v) == 3" ,
  6055. "var v[9] := {0,0,0,0,0,0,0,0,0}; count(v + 1) == v[]",
  6056. "var v[9] := {1,1,1,1,1,1,1,1,1}; count(v - 1) == 0",
  6057. "var v[9] := {1,2,3,4,5,6,7,8,9}; var r[9] := [0]; copy(v,r); sum(v == r) == v[]",
  6058. "var v[9] := {1,2,3,4,5,6,7,8,9}; var r[9] := [0]; copy(v,0,8,r,0,8); sum(r) == 45",
  6059. "var v[9] := {1,2,3,4,5,6,7,8,9}; var r[9] := [0]; copy(v,1,7,r,1,7); sum(r) == 35",
  6060. "var v[9] := {1,2,3,4,5,6,7,8,9}; var r[5] := [0]; copy(v,0,4,r,0,4); sum(r) == 15",
  6061. "var v[5] := {1,2,3,4,5}; var r[5] := {4,5,1,2,3}; rol(v,3); sum(v == r) == v[]",
  6062. "var v[5] := {1,2,3,4,5}; var r[5] := {3,4,5,1,2}; ror(v,3); sum(v == r) == v[]",
  6063. "var v[5] := {1,2,3,4,5}; var r[5] := {3,4,5,1,2}; rol(v,2); sum(v == r) == v[]",
  6064. "var v[5] := {1,2,3,4,5}; var r[5] := {4,5,1,2,3}; ror(v,2); sum(v == r) == v[]",
  6065. "var v[5] := {1,2,3,4,5}; var r[5] := {1,3,4,2,5}; rol(v,1,1,3); sum(v == r) == v[]",
  6066. "var v[5] := {1,2,3,4,5}; var r[5] := {1,4,2,3,5}; ror(v,1,1,3); sum(v == r) == v[]",
  6067. "var v[5] := {1,2,3,4,5}; var r[5] := {3,4,5,0,0}; shftl(v,2); sum(v == r) == v[]",
  6068. "var v[5] := {1,2,3,4,5}; var r[5] := {5,0,0,0,0}; shftl(v,4); sum(v == r) == v[]",
  6069. "var v[5] := {1,2,3,4,5}; var r[5] := {0,0,0,0,0}; shftl(v,5); sum(v == r) == v[]",
  6070. "var v[5] := {1,2,3,4,5}; var r[5] := {0,0,1,2,3}; shftr(v,2); sum(v == r) == v[]",
  6071. "var v[5] := {1,2,3,4,5}; var r[5] := {0,0,0,0,1}; shftr(v,4); sum(v == r) == v[]",
  6072. "var v[5] := {1,2,3,4,5}; var r[5] := {0,0,0,0,0}; shftr(v,5); sum(v == r) == v[]",
  6073. "var v[5] := {1,2,3,4,5}; var r[5] := {1,3,4,0,5}; shftl(v,1,1,3); sum(v == r) == v[]",
  6074. "var v[5] := {1,2,3,4,5}; var r[5] := {1,0,2,3,5}; shftr(v,1,1,3); sum(v == r) == v[]",
  6075. "var v[5] := {1,3,5,2,4}; var r[5] := {1,2,3,4,5}; sort(v); sum(v == r) == v[]",
  6076. "var v[5] := {5,4,3,2,1}; var r[5] := {1,2,3,4,5}; sort(v); sum(v == r) == v[]",
  6077. "var v[5] := {1,4,2,3,5}; var r[5] := {1,2,3,4,5}; sort(v,1,3); sum(v == r) == v[]",
  6078. "var v[5] := {5,4,2,3,1}; var r[5] := {5,2,3,4,1}; sort(v,1,3); sum(v == r) == v[]",
  6079. "var v[5] := {3,1,2,4,5}; var r[5] := {1,2,3,4,5}; sort(v,0,2); sum(v == r) == v[]",
  6080. "var v[5] := {1,2,5,3,4}; var r[5] := {1,2,3,4,5}; sort(v,2,4); sum(v == r) == v[]",
  6081. "var v[5] := {1,3,5,2,4}; var r[5] := {1,2,3,4,5}; sort(v,'ascending'); sum(v == r) == v[]",
  6082. "var v[5] := {1,3,5,2,4}; var r[5] := {1,2,3,4,5}; sort(v,'aScEnDiNg'); sum(v == r) == v[]",
  6083. "var v[5] := {5,4,3,2,1}; var r[5] := {1,2,3,4,5}; sort(v,'ascending'); sum(v == r) == v[]",
  6084. "var v[5] := {1,4,2,3,5}; var r[5] := {1,2,3,4,5}; sort(v,'ascending',1,3); sum(v == r) == v[]",
  6085. "var v[5] := {3,1,2,4,5}; var r[5] := {1,2,3,4,5}; sort(v,'ascending',0,2); sum(v == r) == v[]",
  6086. "var v[5] := {1,2,5,3,4}; var r[5] := {1,2,3,4,5}; sort(v,'ascending',2,4); sum(v == r) == v[]",
  6087. "var v[5] := {1,3,5,2,4}; var r[5] := {5,4,3,2,1}; sort(v,'descending'); sum(v == r) == v[]",
  6088. "var v[5] := {1,3,5,2,4}; var r[5] := {5,4,3,2,1}; sort(v,'DeScEnDiNg'); sum(v == r) == v[]",
  6089. "var v[5] := {5,4,3,2,1}; var r[5] := {5,4,3,2,1}; sort(v,'descending'); sum(v == r) == v[]",
  6090. "var v[5] := {1,4,2,3,5}; var r[5] := {1,4,3,2,5}; sort(v,'descending',1,3); sum(v == r) == v[]",
  6091. "var v[5] := {3,1,2,4,5}; var r[5] := {3,2,1,4,5}; sort(v,'descending',0,2); sum(v == r) == v[]",
  6092. "var v[5] := {1,2,5,3,4}; var r[5] := {1,2,5,4,3}; sort(v,'descending',2,4); sum(v == r) == v[]",
  6093. "var v[9] := {7,8,9,1,2,3,4,5,6}; nth_element(v,trunc(v[] / 2)); v[v[] / 2] == 5",
  6094. "var v[9] := {7,8,9,1,2,3,4,5,6}; nth_element(v,trunc(v[] / 3)); v[v[] / 3] == 4",
  6095. "var v[9] := {7,8,9,1,2,3,4,5,6}; nth_element(v,trunc(v[] / 2)); sort(v,0,trunc(v[] / 2)); (v[v[] / 2] == 5) and (v[0] == 1)",
  6096. "var v[9] := {7,8,9,1,2,3,4,5,6}; nth_element(v,trunc(v[] / 3)); sort(v,0,trunc(v[] / 3)); (v[v[] / 3] == 4) and (v[0] == 1)",
  6097. "var v[5]; iota(v,2); var r[5] := {0,2,4,6,8}; sum(v == r) == v[]",
  6098. "var v[5]; iota(v,2,1); var r[5] := {1,3,5,7,9}; sum(v == r) == v[]",
  6099. "var v[5]; iota(v,1,1,3); var r[5] := {0,0,1,2,0}; sum(v == r) == v[]",
  6100. "var v[5]; iota(v,2,2,1,3);var r[5] := {0,2,4,6,0}; sum(v == r) == v[]",
  6101. "var v[5]; iota(v,2,1,1,3);var r[5] := {0,1,3,5,0}; sum(v == r) == v[]",
  6102. " var a := 2; var x[3] := {1,2,3}; var y[3] := {1,2,3}; var r[3] := [0]; r := a * x + y; axpy(a,x,y); sum(y == r) == y[]",
  6103. " var a := 2; var b := 3; var x[3] := {1,2,3}; var y[3] := {1,2,3}; var r[3] := [0]; r := a * x + b * y; axpby(a,x,b,y); sum(y == r) == y[]",
  6104. " var a := 2; var x[3] := {1,2,3}; var y[3] := {1,2,3}; var z[3] := [0]; var r[3] := [0]; r := a * x + y; axpyz(a,x,y,z); sum(z == r) == z[]",
  6105. " var a := 2; var b := 3; var x[3] := {1,2,3}; var y[3] := {1,2,3}; var z[3] := [0]; var r[3] := [0]; r := a * x + b * y; axpbyz(a,x,b,y,z); sum(z == r) == z[]",
  6106. " var a := 2; var b := 3; var x[3] := {1,2,3}; var z[3] := [0]; var r[3] := [0]; r := a * x + b; axpbz(a,x,b,z); sum(z == r) == z[]",
  6107. };
  6108. const std::size_t expr_str_list_size = sizeof(expr_str_list) / sizeof(std::string);
  6109. parser_t parser;
  6110. for (std::size_t i = 0; i < expr_str_list_size; ++i)
  6111. {
  6112. expression_t expression;
  6113. expression.register_symbol_table(symbol_table);
  6114. if (!parser.compile(expr_str_list[i], expression))
  6115. {
  6116. printf("run_test18() - Error: %s Expression: %s\n",
  6117. parser.error().c_str(),
  6118. expr_str_list[i].c_str());
  6119. failure = true;
  6120. continue;
  6121. }
  6122. T result = expression.value();
  6123. if (result != T(1))
  6124. {
  6125. printf("run_test18() - Error in evaluation! (11) Expression: %s\n",
  6126. expr_str_list[i].c_str());
  6127. failure = true;
  6128. }
  6129. }
  6130. if (failure)
  6131. return false;
  6132. }
  6133. {
  6134. typedef exprtk::expression<T> expression_t;
  6135. std::string a = "a";
  6136. std::string b = "b";
  6137. std::string c = "c";
  6138. std::string d = "d";
  6139. T x = T(1.1);
  6140. T y = T(2.2);
  6141. T z = T(3.3);
  6142. T w = T(4.4);
  6143. overload_func<T> ovrld_func
  6144. (
  6145. "T:T|T:TT|T:TTT|T:TTTT|"
  6146. "T:S|T:SS|T:SSS|T:SSSS|"
  6147. "T:ST|T:STS|T:STST|"
  6148. "T:TS|T:TST|T:TSTS|"
  6149. "T:TTSS|T:SSTT|T:STTS|T:TSST"
  6150. );
  6151. exprtk::symbol_table<T> symbol_table;
  6152. symbol_table.add_constants();
  6153. symbol_table.add_variable ("x",x);
  6154. symbol_table.add_variable ("y",y);
  6155. symbol_table.add_variable ("z",z);
  6156. symbol_table.add_variable ("w",w);
  6157. symbol_table.add_stringvar("a",a);
  6158. symbol_table.add_stringvar("b",b);
  6159. symbol_table.add_stringvar("c",c);
  6160. symbol_table.add_stringvar("d",d);
  6161. symbol_table.add_function("foo",ovrld_func);
  6162. typedef typename overload_func<T>::test_result_t test_result_t;
  6163. typedef std::pair<std::string, typename overload_func<T>::test_result_t> test_pack_t;
  6164. static const test_pack_t test_pack_list[] =
  6165. {
  6166. test_pack_t("foo(x)" , test_result_t( 0, "T" )),
  6167. test_pack_t("foo(x, y)" , test_result_t( 1, "TT" )),
  6168. test_pack_t("foo(x, y, z)" , test_result_t( 2, "TTT" )),
  6169. test_pack_t("foo(x, y, z, w)" , test_result_t( 3, "TTTT")),
  6170. test_pack_t("foo(x + y)" , test_result_t( 0, "T" )),
  6171. test_pack_t("foo(x + y, y + z)" , test_result_t( 1, "TT" )),
  6172. test_pack_t("foo(x + y, y + z, z + w)" , test_result_t( 2, "TTT" )),
  6173. test_pack_t("foo(x + y, y + z, z + w, w)" , test_result_t( 3, "TTTT")),
  6174. test_pack_t("foo(a)" , test_result_t( 4, "S" )),
  6175. test_pack_t("foo(a, b)" , test_result_t( 5, "SS" )),
  6176. test_pack_t("foo(a, b, c)" , test_result_t( 6, "SSS" )),
  6177. test_pack_t("foo(a, b, c, d)" , test_result_t( 7, "SSSS")),
  6178. test_pack_t("foo(a + b)" , test_result_t( 4, "S" )),
  6179. test_pack_t("foo(a + b, b + c)" , test_result_t( 5, "SS" )),
  6180. test_pack_t("foo(a + b, b + c, c + d)" , test_result_t( 6, "SSS" )),
  6181. test_pack_t("foo(a + b, b + c, c + d, d)" , test_result_t( 7, "SSSS")),
  6182. test_pack_t("foo(a, x)" , test_result_t( 8, "ST" )),
  6183. test_pack_t("foo(a, x, b)" , test_result_t( 9, "STS" )),
  6184. test_pack_t("foo(a, x, b, y)" , test_result_t(10, "STST")),
  6185. test_pack_t("foo(a + b, x + y)" , test_result_t( 8, "ST" )),
  6186. test_pack_t("foo(a + b, x + y, b + c)" , test_result_t( 9, "STS" )),
  6187. test_pack_t("foo(a + b, x + y, b + c, y + z)" , test_result_t(10, "STST")),
  6188. test_pack_t("foo(x, a)" , test_result_t(11, "TS" )),
  6189. test_pack_t("foo(x, a, y)" , test_result_t(12, "TST" )),
  6190. test_pack_t("foo(x, a, y, b)" , test_result_t(13, "TSTS")),
  6191. test_pack_t("foo(x + y, a + b)" , test_result_t(11, "TS" )),
  6192. test_pack_t("foo(x + y, a + b, y + z)" , test_result_t(12, "TST" )),
  6193. test_pack_t("foo(x + y, a + b, y + z, b + c)" , test_result_t(13, "TSTS")),
  6194. test_pack_t("foo(x, y, a, b)" , test_result_t(14, "TTSS")),
  6195. test_pack_t("foo(a, b, x, y)" , test_result_t(15, "SSTT")),
  6196. test_pack_t("foo(a, x, y, b)" , test_result_t(16, "STTS")),
  6197. test_pack_t("foo(x, a, b, y)" , test_result_t(17, "TSST")),
  6198. test_pack_t("foo(x + y, y + z, a + b, b + c)" , test_result_t(14, "TTSS")),
  6199. test_pack_t("foo(a + b, b + c, x + y, y + z)" , test_result_t(15, "SSTT")),
  6200. test_pack_t("foo(a + b, x + y, y + z, b + c)" , test_result_t(16, "STTS")),
  6201. test_pack_t("foo(x + y, a + b, b + c, y + z)" , test_result_t(17, "TSST"))
  6202. };
  6203. static const std::size_t test_pack_list_size = sizeof(test_pack_list) / sizeof(test_pack_t);
  6204. std::deque<expression_t> expression_list;
  6205. for (std::size_t i = 0; i < test_pack_list_size; ++i)
  6206. {
  6207. expression_t expression;
  6208. expression.register_symbol_table(symbol_table);
  6209. exprtk::parser<T> parser;
  6210. if (!parser.compile(test_pack_list[i].first, expression))
  6211. {
  6212. printf("run_test18() - (12) Overload VarArg Error: %s Expression: %s\n",
  6213. parser.error().c_str(),
  6214. test_pack_list[i].first.c_str());
  6215. return false;
  6216. }
  6217. else
  6218. expression_list.push_back(expression);
  6219. }
  6220. bool failure = false;
  6221. for (std::size_t i = 0; i < expression_list.size(); ++i)
  6222. {
  6223. ovrld_func.clear();
  6224. if (T(1) != expression_list[i].value())
  6225. {
  6226. printf("run_test18() - Error in evaluation! (12) Expression: %s\n",
  6227. test_pack_list[i].first.c_str());
  6228. failure = true;
  6229. }
  6230. if (ovrld_func.current_ps_index != test_pack_list[i].second.ps_index)
  6231. {
  6232. printf("run_test18() - Error with ps_index (12) Expression: %s Expected: %d Got: %d\n",
  6233. test_pack_list[i].first.c_str(),
  6234. static_cast<int>(test_pack_list[i].second.ps_index),
  6235. static_cast<int>(ovrld_func.current_ps_index));
  6236. failure = true;
  6237. }
  6238. if (ovrld_func.current_param_seq != test_pack_list[i].second.param_seq)
  6239. {
  6240. printf("run_test18() - Error with parameter seq (12) Expression: %s Expected: %s Got: %s\n",
  6241. test_pack_list[i].first.c_str(),
  6242. test_pack_list[i].second.param_seq.c_str(),
  6243. ovrld_func.current_param_seq.c_str());
  6244. failure = true;
  6245. }
  6246. ::fflush(stdout);
  6247. }
  6248. if (failure)
  6249. return false;
  6250. }
  6251. {
  6252. typedef exprtk::expression<T> expression_t;
  6253. std::string a = "a";
  6254. std::string b = "b";
  6255. std::string c = "c";
  6256. std::string d = "d";
  6257. std::string result = "";
  6258. T x = T(1.1);
  6259. T y = T(2.2);
  6260. T z = T(3.3);
  6261. T w = T(4.4);
  6262. overload_func<T> ovrld_func
  6263. (
  6264. "S:T|S:TT|S:TTT|S:TTTT|"
  6265. "S:S|S:SS|S:SSS|S:SSSS|"
  6266. "S:ST|S:STS|S:STST|"
  6267. "S:TS|S:TST|S:TSTS|"
  6268. "S:TTSS|S:SSTT|S:STTS|S:TSST"
  6269. );
  6270. exprtk::symbol_table<T> symbol_table;
  6271. symbol_table.add_constants();
  6272. symbol_table.add_variable ("x",x);
  6273. symbol_table.add_variable ("y",y);
  6274. symbol_table.add_variable ("z",z);
  6275. symbol_table.add_variable ("w",w);
  6276. symbol_table.add_stringvar("a",a);
  6277. symbol_table.add_stringvar("b",b);
  6278. symbol_table.add_stringvar("c",c);
  6279. symbol_table.add_stringvar("d",d);
  6280. symbol_table.add_stringvar("result",result);
  6281. symbol_table.add_function("foo",ovrld_func);
  6282. typedef typename overload_func<T>::test_result_t test_result_t;
  6283. typedef std::pair<std::string, typename overload_func<T>::test_result_t> test_pack_t;
  6284. static const test_pack_t test_pack_list[] =
  6285. {
  6286. test_pack_t("result := foo(x)" , test_result_t( 0, "T" )),
  6287. test_pack_t("result := foo(x, y)" , test_result_t( 1, "TT" )),
  6288. test_pack_t("result := foo(x, y, z)" , test_result_t( 2, "TTT" )),
  6289. test_pack_t("result := foo(x, y, z, w)" , test_result_t( 3, "TTTT")),
  6290. test_pack_t("result := foo(x + y)" , test_result_t( 0, "T" )),
  6291. test_pack_t("result := foo(x + y, y + z)" , test_result_t( 1, "TT" )),
  6292. test_pack_t("result := foo(x + y, y + z, z + w)" , test_result_t( 2, "TTT" )),
  6293. test_pack_t("result := foo(x + y, y + z, z + w, w)" , test_result_t( 3, "TTTT")),
  6294. test_pack_t("result := foo(a)" , test_result_t( 4, "S" )),
  6295. test_pack_t("result := foo(a, b)" , test_result_t( 5, "SS" )),
  6296. test_pack_t("result := foo(a, b, c)" , test_result_t( 6, "SSS" )),
  6297. test_pack_t("result := foo(a, b, c, d)" , test_result_t( 7, "SSSS")),
  6298. test_pack_t("result := foo(a + b)" , test_result_t( 4, "S" )),
  6299. test_pack_t("result := foo(a + b, b + c)" , test_result_t( 5, "SS" )),
  6300. test_pack_t("result := foo(a + b, b + c, c + d)" , test_result_t( 6, "SSS" )),
  6301. test_pack_t("result := foo(a + b, b + c, c + d, d)" , test_result_t( 7, "SSSS")),
  6302. test_pack_t("result := foo(a, x)" , test_result_t( 8, "ST" )),
  6303. test_pack_t("result := foo(a, x, b)" , test_result_t( 9, "STS" )),
  6304. test_pack_t("result := foo(a, x, b, y)" , test_result_t(10, "STST")),
  6305. test_pack_t("result := foo(a + b, x + y)" , test_result_t( 8, "ST" )),
  6306. test_pack_t("result := foo(a + b, x + y, b + c)" , test_result_t( 9, "STS" )),
  6307. test_pack_t("result := foo(a + b, x + y, b + c, y + z)" , test_result_t(10, "STST")),
  6308. test_pack_t("result := foo(x, a)" , test_result_t(11, "TS" )),
  6309. test_pack_t("result := foo(x, a, y)" , test_result_t(12, "TST" )),
  6310. test_pack_t("result := foo(x, a, y, b)" , test_result_t(13, "TSTS")),
  6311. test_pack_t("result := foo(x + y, a + b)" , test_result_t(11, "TS" )),
  6312. test_pack_t("result := foo(x + y, a + b, y + z)" , test_result_t(12, "TST" )),
  6313. test_pack_t("result := foo(x + y, a + b, y + z, b + c)" , test_result_t(13, "TSTS")),
  6314. test_pack_t("result := foo(x, y, a, b)" , test_result_t(14, "TTSS")),
  6315. test_pack_t("result := foo(a, b, x, y)" , test_result_t(15, "SSTT")),
  6316. test_pack_t("result := foo(a, x, y, b)" , test_result_t(16, "STTS")),
  6317. test_pack_t("result := foo(x, a, b, y)" , test_result_t(17, "TSST")),
  6318. test_pack_t("result := foo(x + y, y + z, a + b, b + c)" , test_result_t(14, "TTSS")),
  6319. test_pack_t("result := foo(a + b, b + c, x + y, y + z)" , test_result_t(15, "SSTT")),
  6320. test_pack_t("result := foo(a + b, x + y, y + z, b + c)" , test_result_t(16, "STTS")),
  6321. test_pack_t("result := foo(x + y, a + b, b + c, y + z)" , test_result_t(17, "TSST"))
  6322. };
  6323. static const std::size_t test_pack_list_size = sizeof(test_pack_list) / sizeof(test_pack_t);
  6324. std::deque<expression_t> expression_list;
  6325. for (std::size_t i = 0; i < test_pack_list_size; ++i)
  6326. {
  6327. expression_t expression;
  6328. expression.register_symbol_table(symbol_table);
  6329. exprtk::parser<T> parser;
  6330. if (!parser.compile(test_pack_list[i].first, expression))
  6331. {
  6332. printf("run_test18() - (13) Overload VarArg Error: %s Expression: %s\n",
  6333. parser.error().c_str(),
  6334. test_pack_list[i].first.c_str());
  6335. return false;
  6336. }
  6337. else
  6338. expression_list.push_back(expression);
  6339. }
  6340. bool failure = false;
  6341. for (std::size_t i = 0; i < expression_list.size(); ++i)
  6342. {
  6343. ovrld_func.clear();
  6344. result = "";
  6345. expression_list[i].value();
  6346. if (result != "string result")
  6347. {
  6348. printf("run_test18() - Error in evaluation! (13) Expression: %s\n",
  6349. test_pack_list[i].first.c_str());
  6350. failure = true;
  6351. }
  6352. if (ovrld_func.current_ps_index != test_pack_list[i].second.ps_index)
  6353. {
  6354. printf("run_test18() - Error with ps_index (13) Expression: %s Expected: %d Got: %d\n",
  6355. test_pack_list[i].first.c_str(),
  6356. static_cast<int>(test_pack_list[i].second.ps_index),
  6357. static_cast<int>(ovrld_func.current_ps_index));
  6358. failure = true;
  6359. }
  6360. if (ovrld_func.current_param_seq != test_pack_list[i].second.param_seq)
  6361. {
  6362. printf("run_test18() - Error with parameter seq (13) Expression: %s Expected: %s Got: %s\n",
  6363. test_pack_list[i].first.c_str(),
  6364. test_pack_list[i].second.param_seq.c_str(),
  6365. ovrld_func.current_param_seq.c_str());
  6366. failure = true;
  6367. }
  6368. }
  6369. if (failure)
  6370. return false;
  6371. }
  6372. return true;
  6373. }
  6374. template <typename T>
  6375. inline bool run_test19()
  6376. {
  6377. typedef exprtk::symbol_table<T> symbol_table_t;
  6378. typedef exprtk::expression<T> expression_t;
  6379. typedef exprtk::parser<T> parser_t;
  6380. typedef exprtk::function_compositor<T> compositor_t;
  6381. typedef typename compositor_t::function function_t;
  6382. {
  6383. T x = T(123.123);
  6384. compositor_t compositor;
  6385. // f(x) = x + 2
  6386. compositor.add(function_t("f","x + 2","x"));
  6387. // g(x) = x^2-3
  6388. compositor.add(function_t("g","x^2 - 3","x"));
  6389. // fof(x) = f(f(x))
  6390. compositor.add(function_t("fof","f(f(x))","x"));
  6391. // gog(x) = g(g(x))
  6392. compositor.add(function_t("gog","g(g(x))","x"));
  6393. // fog(x) = f(g(x))
  6394. compositor.add(function_t("fog","f(g(x))","x"));
  6395. // gof(x) = g(f(x))
  6396. compositor.add(function_t("gof","g(f(x))","x"));
  6397. // fogof(x) = f(g(f(x)))
  6398. compositor.add(function_t("fogof","f(g(f(x)))","x"));
  6399. // gofog(x) = g(f(g(x)))
  6400. compositor.add(function_t("gofog","g(f(g(x)))","x"));
  6401. symbol_table_t& symbol_table = compositor.symbol_table();
  6402. symbol_table.add_constants();
  6403. symbol_table.add_variable("x",x);
  6404. static const std::string expr_str_list[] =
  6405. {
  6406. "equal(f(x),(x + 2))",
  6407. "equal(g(x),(x^2 - 3))",
  6408. "equal(fof(x),(x + 4))",
  6409. "equal(gog(x),(x^4 - 6x^2 + 6))",
  6410. "equal(fog(x),(x^2 - 1))",
  6411. "equal(gof(x),(x^2 + 4x + 1))",
  6412. "equal(fogof(x),(x^2 + 4x + 3))",
  6413. "equal(gofog(x),(x^4 - 2x^2 - 2))"
  6414. };
  6415. static const std::size_t expr_str_list_size = sizeof(expr_str_list) / sizeof(std::string);
  6416. std::deque<expression_t> expression_list;
  6417. for (std::size_t i = 0; i < expr_str_list_size; ++i)
  6418. {
  6419. expression_t expression;
  6420. expression.register_symbol_table(symbol_table);
  6421. parser_t parser;
  6422. if (!parser.compile(expr_str_list[i],expression))
  6423. {
  6424. printf("run_test19() - Error: %s Expression: %s\n",
  6425. parser.error().c_str(),
  6426. expr_str_list[i].c_str());
  6427. return false;
  6428. }
  6429. else
  6430. expression_list.push_back(expression);
  6431. }
  6432. bool failure = false;
  6433. for (std::size_t i = 0; i < expression_list.size(); ++i)
  6434. {
  6435. if (T(1) != expression_list[i].value())
  6436. {
  6437. printf("run_test19() - Error in evaluation! (1) Expression: %s\n",
  6438. expr_str_list[i].c_str());
  6439. failure = true;
  6440. }
  6441. }
  6442. if (failure)
  6443. return false;
  6444. }
  6445. const std::size_t rounds = 100;
  6446. for (std::size_t r = 0; r < rounds; ++r)
  6447. {
  6448. T x = T(1);
  6449. T y = T(2);
  6450. T z = T(3);
  6451. T w = T(4);
  6452. T u = T(5);
  6453. T v = T(6);
  6454. compositor_t compositor;
  6455. // f0() = 6
  6456. compositor
  6457. .add(
  6458. function_t("f0")
  6459. .expression("3 * 2"));
  6460. // f1(x) = 5 * (f0 + x)
  6461. compositor
  6462. .add(
  6463. function_t("f1")
  6464. .var("x")
  6465. .expression("5 * (f0 + x)"));
  6466. // f2(x,y) = 7 * (f1(x) + f1(y))
  6467. compositor
  6468. .add(
  6469. function_t("f2")
  6470. .var("x").var("y")
  6471. .expression("7 * (f1(x) + f1(y))"));
  6472. // f3(x,y,z) = 9 * (f2(x,y) + f2(y,z) + f2(x,z))
  6473. compositor
  6474. .add(
  6475. function_t("f3")
  6476. .var("x").var("y").var("z")
  6477. .expression("9 * (f2(x,y) + f2(y,z) + f2(x,z))"));
  6478. // f4(x,y,z,w) = 11 * (f3(x,y,z) + f3(y,z,w) + f3(z,w,z))
  6479. compositor
  6480. .add(
  6481. function_t("f4")
  6482. .var("x").var("y").var("z").var("w")
  6483. .expression("11 * (f3(x,y,z) + f3(y,z,w) + f3(z,w,x))"));
  6484. // f5(x,y,z,w,u) = 13 * (f4(x,y,z,w) + f4(y,z,w,u) + f4(z,w,u,x) + f4(w,u,x,y))
  6485. compositor
  6486. .add(
  6487. function_t("f5")
  6488. .var("x").var("y").var("z").var("w").var("u")
  6489. .expression("13 * (f4(x,y,z,w) + f4(y,z,w,u) + f4(z,w,u,x) + f4(w,u,x,y))"));
  6490. // f6(x,y,z,w,u,v) = 17 * (f5(x,y,z,w,u) + f5(y,z,w,u,v) + f5(z,w,u,v,x) + f5(w,u,v,x,y))
  6491. compositor
  6492. .add(
  6493. function_t("f6")
  6494. .var("x").var("y").var("z")
  6495. .var("w").var("u").var("v")
  6496. .expression("17 * (f5(x,y,z,w,u) + f5(y,z,w,u,v) + f5(z,w,u,v,x) + f5(w,u,v,x,y))"));
  6497. symbol_table_t& symbol_table = compositor.symbol_table();
  6498. symbol_table.add_constants();
  6499. symbol_table.add_variable("x",x);
  6500. symbol_table.add_variable("y",y);
  6501. symbol_table.add_variable("z",z);
  6502. symbol_table.add_variable("w",w);
  6503. symbol_table.add_variable("u",u);
  6504. symbol_table.add_variable("v",v);
  6505. parser_t parser;
  6506. const std::string expr_str_list[] =
  6507. {
  6508. "f0()",
  6509. "f1(x)",
  6510. "f2(x,x)",
  6511. "f3(x,x,x)",
  6512. "f4(x,x,x,x)",
  6513. "f5(x,x,x,x,x)",
  6514. "f6(x,x,x,x,x,x)",
  6515. "f2(x,y)",
  6516. "f3(x,y,z)",
  6517. "f4(x,y,z,w)",
  6518. "f5(x,y,z,w,u)",
  6519. "f6(x,y,z,w,u,v)"
  6520. };
  6521. const std::size_t expr_str_list_size = sizeof(expr_str_list) / sizeof(std::string);
  6522. const T result_list[] =
  6523. {
  6524. T(6 ),
  6525. T(35 ),
  6526. T(490 ),
  6527. T(13230 ),
  6528. T(436590 ),
  6529. T(22702680 ),
  6530. T(1543782240),
  6531. T(525 ),
  6532. T(15120 ),
  6533. T(533610 ),
  6534. T(29459430 ),
  6535. T(2122700580)
  6536. };
  6537. bool failure = false;
  6538. for (std::size_t i = 0; i < expr_str_list_size; ++i)
  6539. {
  6540. expression_t expression;
  6541. expression.register_symbol_table(symbol_table);
  6542. if (!parser.compile(expr_str_list[i],expression))
  6543. {
  6544. printf("run_test19() - Error: %s Expression: %s\n",
  6545. parser.error().c_str(),
  6546. expr_str_list[i].c_str());
  6547. failure = true;
  6548. continue;
  6549. }
  6550. T result = expression.value();
  6551. if (result_list[i] != result)
  6552. {
  6553. printf("run_test19() - Error in evaluation! (2) Expression: %s Expected: %10.1f\tResult: %10.1f\n",
  6554. expr_str_list[i].c_str(),
  6555. result_list[i],
  6556. result);
  6557. failure = true;
  6558. continue;
  6559. }
  6560. }
  6561. if (failure)
  6562. return false;
  6563. }
  6564. {
  6565. T x = T(0);
  6566. compositor_t compositor;
  6567. compositor
  6568. .add(
  6569. function_t(
  6570. "is_prime_impl1",
  6571. "if (y == 1,true, "
  6572. " if (0 == (x % y),false, "
  6573. " is_prime_impl1(x,y - 1))) ",
  6574. "x","y"));
  6575. compositor
  6576. .add(
  6577. function_t(
  6578. "is_prime1",
  6579. "if (frac(x) != 0, false, "
  6580. " if (x <= 0, false, "
  6581. " is_prime_impl1(x,min(x - 1,trunc(sqrt(x)) + 1)))) ",
  6582. "x"));
  6583. compositor
  6584. .add(
  6585. function_t(
  6586. "is_prime_impl2",
  6587. "switch "
  6588. "{ "
  6589. " case y == 1 : true; "
  6590. " case (x % y) == 0 : false; "
  6591. " default : is_prime_impl2(x,y - 1);"
  6592. "} ",
  6593. "x","y"));
  6594. compositor
  6595. .add(
  6596. function_t(
  6597. "is_prime2",
  6598. "switch "
  6599. "{ "
  6600. " case x <= 0 : false; "
  6601. " case frac(x) != 0 : false; "
  6602. " default : is_prime_impl2(x,min(x - 1,trunc(sqrt(x)) + 1));"
  6603. "} ",
  6604. "x"));
  6605. compositor
  6606. .add(
  6607. function_t(
  6608. "is_prime_impl3",
  6609. "while (y > 0) "
  6610. "{ "
  6611. " switch "
  6612. " { "
  6613. " case y == 1 : ~(y := 0, true);"
  6614. " case (x % y) == 0 : ~(y := 0,false);"
  6615. " default : y := y - 1; "
  6616. " } "
  6617. "} ",
  6618. "x","y"));
  6619. compositor
  6620. .add(
  6621. function_t(
  6622. "is_prime3",
  6623. "switch "
  6624. "{ "
  6625. " case x <= 0 : false; "
  6626. " case frac(x) != 0 : false; "
  6627. " default : is_prime_impl3(x,min(x - 1,trunc(sqrt(x)) + 1));"
  6628. "} ",
  6629. "x"));
  6630. compositor
  6631. .add(
  6632. function_t(
  6633. "is_prime_impl4",
  6634. "switch "
  6635. "{ "
  6636. " case 1 == x : false; "
  6637. " case 2 == x : true; "
  6638. " case 3 == x : true; "
  6639. " case 5 == x : true; "
  6640. " case 7 == x : true; "
  6641. " case 0 == x % 2 : false; "
  6642. " default : "
  6643. " { "
  6644. " for (var i := 3; i < y; i += 2) "
  6645. " { "
  6646. " if ((x % i) == 0) "
  6647. " break[false]; "
  6648. " else "
  6649. " true; "
  6650. " } "
  6651. " }; "
  6652. "} ",
  6653. "x","y"));
  6654. compositor
  6655. .add(
  6656. function_t(
  6657. "is_prime4",
  6658. "switch "
  6659. "{ "
  6660. " case x <= 0 : false; "
  6661. " case frac(x) != 0 : false; "
  6662. " default : is_prime_impl4(x,min(x - 1,trunc(sqrt(x)) + 1));"
  6663. "} ",
  6664. "x"));
  6665. symbol_table_t& symbol_table = compositor.symbol_table();
  6666. symbol_table.add_constants();
  6667. symbol_table.add_variable("x",x);
  6668. const std::string expression_str[] = {
  6669. "is_prime1(x)",
  6670. "is_prime2(x)",
  6671. "is_prime3(x)",
  6672. "is_prime4(x)"
  6673. };
  6674. const std::size_t expression_count = sizeof(expression_str) / sizeof(std::string);
  6675. std::vector<expression_t> expression_list;
  6676. for (std::size_t i = 0; i < expression_count; ++i)
  6677. {
  6678. parser_t parser;
  6679. expression_t expression;
  6680. expression.register_symbol_table(symbol_table);
  6681. if (!parser.compile(expression_str[i],expression))
  6682. {
  6683. printf("run_test19() - Error: %s Expression%d: %s\n",
  6684. parser.error().c_str(),
  6685. static_cast<unsigned int>(i),
  6686. expression_str[i].c_str());
  6687. return false;
  6688. }
  6689. else
  6690. expression_list.push_back(expression);
  6691. }
  6692. bool failure = false;
  6693. const std::size_t prime_list[] =
  6694. {
  6695. 2, 3, 5, 7, 11, 13, 17, 19,
  6696. 877, 947, 1087, 1153, 1229, 1297, 1381, 1453,
  6697. 1523, 1597, 1663, 1741, 1823, 1901, 1993, 2063,
  6698. 2131, 2221, 2293, 2371, 2437, 2539, 2621, 2689,
  6699. 2749, 2833, 2909, 3001, 3083, 3187, 3259, 3343,
  6700. 3433, 3517, 3581, 3659, 3733, 3823, 3911, 4001,
  6701. 4073, 4153, 4241, 4327, 4421, 4507, 4591, 4663,
  6702. 4759, 4861, 4943, 5009, 5099, 5189, 5281, 5393,
  6703. 5449, 5527, 5641, 5701, 5801, 5861, 5953, 6067,
  6704. 6143, 6229, 6311, 6373, 6481, 6577, 6679, 6763,
  6705. 6841, 6947, 7001, 7109, 7211, 7307, 7417, 7507,
  6706. 104309, 104311, 104323, 104327, 104347, 104369, 104381, 104383,
  6707. 104393, 104399, 104417, 104459, 104471, 104473, 104479, 104491,
  6708. 104513, 104527, 104537, 104543, 104549, 104551, 104561, 104579,
  6709. 104593, 104597, 104623, 104639, 104651, 104659, 104677, 104681,
  6710. 104683, 104693, 104701, 104707, 104711, 104717, 104723, 104729,
  6711. 1000621, 1000639, 1000651, 1000667, 1000669, 1001023, 1001027, 1001041
  6712. };
  6713. const std::size_t prime_list_size = sizeof(prime_list) / sizeof(std::size_t);
  6714. for (std::size_t i = 0; (i < prime_list_size) && (!failure); ++i)
  6715. {
  6716. x = static_cast<T>(prime_list[i]);
  6717. std::vector<T> result(expression_count,T(0));
  6718. for (std::size_t j = 0; j < expression_list.size(); ++j)
  6719. {
  6720. result[j] = expression_list[j].value();
  6721. }
  6722. for (std::size_t j = 1; j < expression_list.size(); ++j)
  6723. {
  6724. if (result[j] != result[0])
  6725. {
  6726. failure = true;
  6727. break;
  6728. }
  6729. }
  6730. if (failure)
  6731. {
  6732. printf("run_test19() - Error in evaluation! (3) Results don't match! Prime: %d\n",
  6733. static_cast<unsigned int>(prime_list[i]));
  6734. for (std::size_t j = 0; j < expression_list.size(); ++j)
  6735. {
  6736. printf("Expression[%02d]: %s = %d\n",
  6737. static_cast<unsigned int>(j),
  6738. expression_str[j].c_str(),
  6739. static_cast<unsigned int>(result[j]));
  6740. }
  6741. }
  6742. else if (T(1) != expression_list[0].value())
  6743. {
  6744. printf("run_test19() - Error in evaluation! (4) Results don't match! Prime: %d\n",
  6745. static_cast<unsigned int>(prime_list[i]));
  6746. for (std::size_t j = 0; j < expression_list.size(); ++j)
  6747. {
  6748. printf("Expression[%02d]: %s = %d\n",
  6749. static_cast<unsigned int>(j),
  6750. expression_str[j].c_str(),
  6751. static_cast<unsigned int>(result[j]));
  6752. }
  6753. }
  6754. }
  6755. if (failure)
  6756. return false;
  6757. }
  6758. {
  6759. T x = T(0);
  6760. compositor_t compositor;
  6761. compositor
  6762. .add(
  6763. function_t(
  6764. "fibonacci1",
  6765. "if (x == 0,0, "
  6766. " if (x == 1,1, "
  6767. " fibonacci1(x - 1) + fibonacci1(x - 2)))",
  6768. "x"));
  6769. compositor
  6770. .add(
  6771. function_t(
  6772. "fibonacci2",
  6773. "switch "
  6774. "{ "
  6775. " case x == 0 : 0; "
  6776. " case x == 1 : 1; "
  6777. " default : fibonacci2(x - 1) + fibonacci2(x - 2);"
  6778. "} ",
  6779. "x"));
  6780. compositor
  6781. .add(
  6782. function_t(
  6783. "fibonacci_impl3",
  6784. "switch "
  6785. "{ "
  6786. " case x == 0 : 0; "
  6787. " case x == 1 : 1; "
  6788. " default : "
  6789. " while ((x := (x - 1)) > 0) "
  6790. " { "
  6791. " w := z; "
  6792. " z := z + y; "
  6793. " y := w; "
  6794. " z "
  6795. " }; "
  6796. "} ",
  6797. "x","y","z","w"));
  6798. compositor
  6799. .add(
  6800. function_t(
  6801. "fibonacci3",
  6802. "fibonacci_impl3(x,0,1,0)",
  6803. "x"));
  6804. compositor
  6805. .add(
  6806. function_t(
  6807. "fibonacci_impl4",
  6808. "switch "
  6809. "{ "
  6810. " case x == 0 : 0; "
  6811. " case x == 1 : 1; "
  6812. " default : "
  6813. " repeat "
  6814. " w := z; "
  6815. " z := z + y; "
  6816. " y := w; "
  6817. " x := x - 1; "
  6818. " z "
  6819. " until (x <= 1); "
  6820. "} ",
  6821. "x","y","z","w"));
  6822. compositor
  6823. .add(
  6824. function_t(
  6825. "fibonacci4",
  6826. "fibonacci_impl4(x,0,1,0)",
  6827. "x"));
  6828. compositor
  6829. .add(
  6830. function_t(
  6831. "fibonacci5",
  6832. "if ((x == 0) or (x == 1)) "
  6833. " x; "
  6834. "else "
  6835. " fibonacci5(x - 1) + fibonacci5(x - 2); ",
  6836. "x"));
  6837. symbol_table_t& symbol_table = compositor.symbol_table();
  6838. symbol_table.add_constants();
  6839. symbol_table.add_variable("x",x);
  6840. const std::string expression_str[] = {
  6841. "fibonacci1(x)",
  6842. "fibonacci2(x)",
  6843. "fibonacci3(x)",
  6844. "fibonacci4(x)",
  6845. "fibonacci5(x)"
  6846. };
  6847. const std::size_t expression_count = sizeof(expression_str) / sizeof(std::string);
  6848. std::vector<expression_t> expression_list;
  6849. for (std::size_t i = 0; i < expression_count; ++i)
  6850. {
  6851. parser_t parser;
  6852. expression_t expression;
  6853. expression.register_symbol_table(symbol_table);
  6854. if (!parser.compile(expression_str[i],expression))
  6855. {
  6856. printf("run_test19() - Error: %s Expression[%02d]: %s\n",
  6857. parser.error().c_str(),
  6858. static_cast<unsigned int>(i),
  6859. expression_str[i].c_str());
  6860. return false;
  6861. }
  6862. else
  6863. expression_list.push_back(expression);
  6864. }
  6865. bool failure = false;
  6866. const std::size_t fibonacci_list[] =
  6867. {
  6868. 0, 1, 1, 2,
  6869. 3, 5, 8, 13,
  6870. 21, 34, 55, 89,
  6871. 144, 233, 377, 610,
  6872. 987, 1597, 2584, 4181,
  6873. 6765, 10946, 17711, 28657,
  6874. 46368, 75025, 121393, 196418,
  6875. 317811, 514229, 832040, 1346269
  6876. };
  6877. const std::size_t fibonacci_list_size = sizeof(fibonacci_list) / sizeof(std::size_t);
  6878. for (std::size_t i = 0; (i < fibonacci_list_size) && (!failure); ++i)
  6879. {
  6880. x = static_cast<T>(i);
  6881. std::vector<T> result(expression_count,T(0));
  6882. for (std::size_t j = 0; j < expression_list.size(); ++j)
  6883. {
  6884. result[j] = expression_list[j].value();
  6885. }
  6886. for (std::size_t j = 1; j < expression_list.size(); ++j)
  6887. {
  6888. if (result[j] != result[0])
  6889. {
  6890. failure = true;
  6891. break;
  6892. }
  6893. }
  6894. if (failure)
  6895. {
  6896. printf("run_test19() - Error in evaluation! (5) Results don't match! fibonacci(%d) = %d\n",
  6897. static_cast<unsigned int>(i),
  6898. static_cast<unsigned int>(fibonacci_list[i]));
  6899. for (std::size_t j = 0; j < expression_list.size(); ++j)
  6900. {
  6901. printf("Expression[%02d]: %s = %d\n",
  6902. static_cast<unsigned int>(j),
  6903. expression_str[j].c_str(),
  6904. static_cast<unsigned int>(result[j]));
  6905. }
  6906. }
  6907. else if (fibonacci_list[i] != expression_list[0].value())
  6908. {
  6909. printf("run_test19() - Error in evaluation! (6) Results don't match! fibonacci(%d) = %d\n",
  6910. static_cast<unsigned int>(i),
  6911. static_cast<unsigned int>(fibonacci_list[i]));
  6912. for (std::size_t j = 0; j < expression_list.size(); ++j)
  6913. {
  6914. printf("Expression[%02d]: %s = %d\n",
  6915. static_cast<unsigned int>(j),
  6916. expression_str[j].c_str(),
  6917. static_cast<unsigned int>(result[j]));
  6918. }
  6919. }
  6920. }
  6921. if (failure)
  6922. return false;
  6923. }
  6924. {
  6925. T x = T(0);
  6926. symbol_table_t symbol_table;
  6927. symbol_table.add_constants();
  6928. symbol_table.add_variable("x",x);
  6929. compositor_t compositor(symbol_table);
  6930. compositor
  6931. .add(
  6932. function_t(
  6933. "newton_sqrt_impl",
  6934. "switch "
  6935. "{ "
  6936. " case x < 0 : -inf; "
  6937. " case x == 0 : 0; "
  6938. " case x == 1 : 1; "
  6939. " default: "
  6940. " ~{ "
  6941. " z := 100; "
  6942. " y := x / 2; "
  6943. " repeat "
  6944. " y := (1 / 2) * (y + (x / y)); "
  6945. " if (equal(y * y,x)) "
  6946. " break[y]; "
  6947. " until ((z -= 1) <= 0); "
  6948. " }; "
  6949. "} ",
  6950. "x","y","z"));
  6951. compositor
  6952. .add(
  6953. function_t(
  6954. "newton_sqrt",
  6955. "newton_sqrt_impl(x,0,0)","x"));
  6956. std::string expression_str = "newton_sqrt(x)";
  6957. expression_t expression;
  6958. expression.register_symbol_table(symbol_table);
  6959. parser_t parser;
  6960. if (!parser.compile(expression_str,expression))
  6961. {
  6962. printf("run_test19() - Error: %s Expression: %s\n",
  6963. parser.error().c_str(),
  6964. expression_str.c_str());
  6965. return false;
  6966. }
  6967. bool failure = false;
  6968. for (std::size_t i = 0; i < 100; ++i)
  6969. {
  6970. x = static_cast<T>(i);
  6971. T result = expression.value();
  6972. if (not_equal(result,std::sqrt(x),T(0.0000001)))
  6973. {
  6974. printf("run_test19() - Computation Error "
  6975. "Expression: [%s]\tExpected: %12.8f\tResult: %12.8f\n",
  6976. expression_str.c_str(),
  6977. (double)std::sqrt(x),
  6978. (double)result);
  6979. failure = true;
  6980. }
  6981. }
  6982. if (failure)
  6983. return false;
  6984. }
  6985. {
  6986. symbol_table_t symbol_table;
  6987. symbol_table.add_constants();
  6988. compositor_t compositor(symbol_table);
  6989. compositor
  6990. .add(
  6991. function_t(
  6992. "mandelbrot",
  6993. " var width := 118; "
  6994. " var height := 41; "
  6995. " var imag_max := +1; "
  6996. " var imag_min := -1; "
  6997. " var real_max := +1; "
  6998. " var real_min := -2.5; "
  6999. " var x_step := (real_max - real_min) / width; "
  7000. " var y_step := (imag_max - imag_min) / height; "
  7001. " for (var y := 0; y < height; y += 1) "
  7002. " { "
  7003. " var imag := imag_min + (y_step * y); "
  7004. " for (var x := 0; x < width; x += 1) "
  7005. " { "
  7006. " var real := real_min + x_step * x; "
  7007. " var z_real := real; "
  7008. " var z_imag := imag; "
  7009. " var plot_value; "
  7010. " for (var n := 0; n < 30; n += 1) "
  7011. " { "
  7012. " var a := z_real^2; "
  7013. " var b := z_imag^2; "
  7014. " plot_value := n; "
  7015. " if ((a + b) < 4) "
  7016. " { "
  7017. " z_imag := 2 * z_real * z_imag + imag; "
  7018. " z_real := a - b + real; "
  7019. " } "
  7020. " else "
  7021. " break; "
  7022. " }; "
  7023. " }; "
  7024. " } "));
  7025. std::string expression_str = "mandelbrot()";
  7026. expression_t expression;
  7027. expression.register_symbol_table(symbol_table);
  7028. parser_t parser;
  7029. if (!parser.compile(expression_str,expression))
  7030. {
  7031. printf("run_test19() - Error: %s Expression: %s\n",
  7032. parser.error().c_str(),
  7033. expression_str.c_str());
  7034. return false;
  7035. }
  7036. for (std::size_t i = 0; i < 100; ++i)
  7037. {
  7038. expression.value();
  7039. }
  7040. }
  7041. {
  7042. T x = T(0);
  7043. symbol_table_t symbol_table;
  7044. symbol_table.add_variable("x",x);
  7045. compositor_t compositor(symbol_table);
  7046. compositor
  7047. .add(
  7048. function_t(
  7049. "fooboo",
  7050. " var x := input; "
  7051. " if (x > 0) "
  7052. " fooboo(x - 1) + x; "
  7053. " else "
  7054. " 0; ",
  7055. "input"));
  7056. std::string expression_str = "fOoBoO(x)";
  7057. expression_t expression;
  7058. expression.register_symbol_table(symbol_table);
  7059. parser_t parser;
  7060. if (!parser.compile(expression_str,expression))
  7061. {
  7062. printf("run_test19() - Error: %s Expression: %s\n",
  7063. parser.error().c_str(),
  7064. expression_str.c_str());
  7065. return false;
  7066. }
  7067. T sum = T(0);
  7068. for (std::size_t i = 0; i < 100; ++i)
  7069. {
  7070. x = T(i);
  7071. sum += x;
  7072. T result = expression.value();
  7073. if (result != sum)
  7074. {
  7075. printf("run_test19() - FooBoo(%5.2f) Expected: %5.2f\tResult: %5.2f\n",
  7076. x,
  7077. sum,
  7078. result);
  7079. return false;
  7080. }
  7081. }
  7082. }
  7083. {
  7084. symbol_table_t symbol_table;
  7085. symbol_table.add_constants();
  7086. std::string expression_str =
  7087. " var sieve[10^7] := [false]; "
  7088. " var m := trunc(sqrt(sieve[])); "
  7089. " "
  7090. " sieve[0] := true; "
  7091. " sieve[1] := true; "
  7092. " "
  7093. " for (var i := 0; i <= m; i += 1) "
  7094. " { "
  7095. " if (false == sieve[i]) "
  7096. " { "
  7097. " for (var j := (i * i); j < sieve[]; j += i) "
  7098. " { "
  7099. " sieve[j] := true; "
  7100. " } "
  7101. " } "
  7102. " }; "
  7103. " "
  7104. " var prime_count := 0; "
  7105. " for (var i := 0; i < sieve[]; i += 1) "
  7106. " { "
  7107. " if (false == sieve[i]) "
  7108. " { "
  7109. " prime_count += 1; "
  7110. " }; "
  7111. " }; "
  7112. " "
  7113. " prime_count == 664579; ";
  7114. expression_t expression;
  7115. expression.register_symbol_table(symbol_table);
  7116. parser_t parser;
  7117. if (!parser.compile(expression_str,expression))
  7118. {
  7119. printf("run_test19() - Error: %s Expression: %s\n",
  7120. parser.error().c_str(),
  7121. expression_str.c_str());
  7122. return false;
  7123. }
  7124. if (T(1) != expression.value())
  7125. {
  7126. printf("run_test19() - Prime Sieve Computation Error");
  7127. return false;
  7128. }
  7129. }
  7130. {
  7131. symbol_table_t symbol_table;
  7132. symbol_table.add_constants();
  7133. std::string expression_str[] =
  7134. {
  7135. "var delta := 10^-7; var total := 0; for (var i := 0; i <= 3; i += delta) { total += "
  7136. "erf(i) }; abs((delta * total) - (3 * erf(3) + (1 / exp(9) - 1) / sqrt(pi))) < 0.000001",
  7137. "var delta := 10^-7; var total := 0; for (var i := 0; i <= 3; i += delta) { total += "
  7138. "erfc(i) }; abs((delta * total) - (3 * erfc(3) + ((1 - 1 / exp(9)) / sqrt(pi)))) < 0.000001"
  7139. };
  7140. expression_t e[2];
  7141. parser_t parser;
  7142. for (std::size_t i = 0; i < 2; ++i)
  7143. {
  7144. e[i].register_symbol_table(symbol_table);
  7145. if (!parser.compile(expression_str[i],e[i]))
  7146. {
  7147. printf("run_test19() - Error: %s Expression: %s\n",
  7148. parser.error().c_str(),
  7149. expression_str[i].c_str());
  7150. return false;
  7151. }
  7152. if (T(1) != e[i].value())
  7153. {
  7154. printf("run_test19() - erf/erfc computation error %d",
  7155. static_cast<unsigned int>(i));
  7156. return false;
  7157. }
  7158. }
  7159. }
  7160. return true;
  7161. }
  7162. template <typename T>
  7163. struct my_usr : public exprtk::parser<T>::unknown_symbol_resolver
  7164. {
  7165. typedef typename exprtk::parser<T>::unknown_symbol_resolver usr_t;
  7166. bool process(const std::string& unknown_symbol,
  7167. typename usr_t::usr_symbol_type& st,
  7168. T& default_value,
  7169. std::string& error_message)
  7170. {
  7171. if (unknown_symbol[0] == 'v')
  7172. {
  7173. st = usr_t::e_usr_variable_type;
  7174. default_value = next_value();
  7175. error_message.clear();
  7176. return true;
  7177. }
  7178. else if (unknown_symbol[0] == 'c')
  7179. {
  7180. st = usr_t::e_usr_constant_type;
  7181. default_value = next_value();
  7182. error_message.clear();
  7183. return true;
  7184. }
  7185. else
  7186. {
  7187. error_message = "Unknown symbol...";
  7188. return false;
  7189. }
  7190. }
  7191. T next_value(const bool reset = false)
  7192. {
  7193. static T value = 0;
  7194. if (reset)
  7195. return (value = 0);
  7196. else
  7197. return ++value;
  7198. }
  7199. };
  7200. template <typename T>
  7201. struct my_usr_ext : public exprtk::parser<T>::unknown_symbol_resolver
  7202. {
  7203. typedef exprtk::symbol_table<T> symbol_table_t;
  7204. typedef typename exprtk::parser<T>::unknown_symbol_resolver usr_t;
  7205. my_usr_ext()
  7206. : usr_t(usr_t::e_usrmode_extended)
  7207. {}
  7208. virtual bool process(const std::string& unknown_symbol,
  7209. symbol_table_t& symbol_table,
  7210. std::string& error_message)
  7211. {
  7212. bool result = false;
  7213. if (unknown_symbol[0] == 'v')
  7214. {
  7215. static T var_default_value = 1.0;
  7216. if ((result = symbol_table.create_variable(unknown_symbol, var_default_value++)) == false)
  7217. {
  7218. error_message = "Failed to create variable(" + unknown_symbol + ") in primary symbol table";
  7219. }
  7220. }
  7221. else if (unknown_symbol[0] == 'c')
  7222. {
  7223. static T cvar_default_value = 1.0;
  7224. if ((result = symbol_table.add_constant(unknown_symbol, cvar_default_value++)) == false)
  7225. {
  7226. error_message = "Failed to create const variable(" + unknown_symbol + ") in primary symbol table";
  7227. }
  7228. }
  7229. else if (0 == unknown_symbol.find("foo"))
  7230. {
  7231. //functions of form: fooXX
  7232. if (4 >= unknown_symbol.size())
  7233. {
  7234. switch(unknown_symbol[3])
  7235. {
  7236. case '1' : result = symbol_table.add_function(unknown_symbol,foo1);
  7237. break;
  7238. case '2' : result = symbol_table.add_function(unknown_symbol,foo2);
  7239. break;
  7240. case '3' : result = symbol_table.add_function(unknown_symbol,foo3);
  7241. break;
  7242. case '4' : result = symbol_table.add_function(unknown_symbol,foo4);
  7243. break;
  7244. case '5' : result = symbol_table.add_function(unknown_symbol,foo5);
  7245. break;
  7246. case '6' : result = symbol_table.add_function(unknown_symbol,foo6);
  7247. break;
  7248. }
  7249. }
  7250. if (!result)
  7251. {
  7252. error_message = "Failed to add function(" + unknown_symbol + ") in primary symbol table";
  7253. }
  7254. }
  7255. else
  7256. error_message = "Indeterminable symbol type.";
  7257. return result;
  7258. }
  7259. };
  7260. template <typename T>
  7261. inline bool run_test20()
  7262. {
  7263. typedef exprtk::expression<T> expression_t;
  7264. {
  7265. for (std::size_t i = 0; i < 100; ++i)
  7266. {
  7267. exprtk::symbol_table<T> symbol_table0; // primary symbol_table
  7268. exprtk::symbol_table<T> symbol_table1;
  7269. exprtk::symbol_table<T> symbol_table2;
  7270. exprtk::symbol_table<T> symbol_table3;
  7271. symbol_table0.add_constants();
  7272. expression_t expression;
  7273. expression.register_symbol_table(symbol_table0);
  7274. expression.register_symbol_table(symbol_table1);
  7275. expression.register_symbol_table(symbol_table2);
  7276. expression.register_symbol_table(symbol_table3);
  7277. exprtk::parser<T> parser;
  7278. my_usr<T> musr;
  7279. musr.next_value(true);
  7280. parser.enable_unknown_symbol_resolver(&musr);
  7281. std::string expr_str = "v01+c02+v03+c04+v05+c06+v07+c08+v09+c10+"
  7282. "v11+c12+v13+c14+v15+c16+v17+c18+v19+c20+"
  7283. "v21+c22+v23+c24+v25+c26+v27+c28+v29+c30 ";
  7284. if (!parser.compile(expr_str,expression))
  7285. {
  7286. printf("run_test20() - [1] Error: %s Expression: %s\n",
  7287. parser.error().c_str(),
  7288. expr_str.c_str());
  7289. return false;
  7290. }
  7291. T sum_1_30 = T((1 + 30) * 15);
  7292. T result = expression.value();
  7293. if (sum_1_30 != result)
  7294. {
  7295. printf("run_test20() - [1] Error in evaluation! (1) Expression: %s\n",
  7296. expr_str.c_str());
  7297. return false;
  7298. }
  7299. }
  7300. }
  7301. {
  7302. for (std::size_t i = 0; i < 100; ++i)
  7303. {
  7304. exprtk::symbol_table<T> symbol_table0; // primary symbol_table
  7305. exprtk::symbol_table<T> symbol_table1;
  7306. exprtk::symbol_table<T> symbol_table2;
  7307. exprtk::symbol_table<T> symbol_table3;
  7308. symbol_table0.add_constants();
  7309. expression_t expression;
  7310. expression.register_symbol_table(symbol_table0);
  7311. expression.register_symbol_table(symbol_table1);
  7312. expression.register_symbol_table(symbol_table2);
  7313. expression.register_symbol_table(symbol_table3);
  7314. exprtk::parser<T> parser;
  7315. my_usr_ext<T> musr;
  7316. parser.enable_unknown_symbol_resolver(&musr);
  7317. std::string expr_str = "foo6(foo1(v0),foo2(c1,foo4(v2,c3,v4,c5)),foo3"
  7318. "(v6,c7,foo5(v8,c9,v10,c11,v12)),c13,v14,c15) ";
  7319. if (!parser.compile(expr_str,expression))
  7320. {
  7321. printf("run_test20() - [2] Error: %s Expression: %s\n",
  7322. parser.error().c_str(),
  7323. expr_str.c_str());
  7324. return false;
  7325. }
  7326. }
  7327. }
  7328. {
  7329. T var;
  7330. std::string str;
  7331. std::vector<T> vec(10,0.0);
  7332. typedef exprtk::symbol_table<T> symbol_table_t;
  7333. bool result = true;
  7334. {
  7335. symbol_table_t symbol_table;
  7336. symbol_table.add_variable ("val",var);
  7337. symbol_table.add_stringvar("str",str);
  7338. symbol_table.add_vector ("vec",vec);
  7339. if (symbol_table.get_variable("val") == 0 || !symbol_table.symbol_exists("val"))
  7340. {
  7341. printf("run_test20() - [3] Failed to get 'val' from symbol_table\n");
  7342. result = false;
  7343. }
  7344. if (symbol_table.get_stringvar("str") == 0 || !symbol_table.symbol_exists("str"))
  7345. {
  7346. printf("run_test20() - [3] Failed to get 'str' from symbol_table\n");
  7347. result = false;
  7348. }
  7349. if (symbol_table.get_vector("vec") == 0 || !symbol_table.symbol_exists("vec"))
  7350. {
  7351. printf("run_test20() - [3] Failed to get 'vec' from symbol_table\n");
  7352. result = false;
  7353. }
  7354. }
  7355. if (!result)
  7356. return result;
  7357. {
  7358. symbol_table_t symbol_table;
  7359. symbol_table.add_variable("val",var);
  7360. if (symbol_table.get_variable("val") == 0 || !symbol_table.symbol_exists("val"))
  7361. {
  7362. printf("run_test20() - [4] Failed to get 'val' from symbol_table\n");
  7363. result = false;
  7364. }
  7365. if (symbol_table.get_stringvar("str") != 0 || symbol_table.symbol_exists("str"))
  7366. {
  7367. printf("run_test20() - [4] Failed to get 'str' from symbol_table\n");
  7368. result = false;
  7369. }
  7370. if (symbol_table.get_vector("vec") != 0 || symbol_table.symbol_exists("vec"))
  7371. {
  7372. printf("run_test20() - [4] Failed to get 'vec' from symbol_table\n");
  7373. result = false;
  7374. }
  7375. }
  7376. if (!result)
  7377. return result;
  7378. {
  7379. symbol_table_t symbol_table;
  7380. symbol_table.add_stringvar("str",str);
  7381. if (symbol_table.get_stringvar("str") == 0 || !symbol_table.symbol_exists("str"))
  7382. {
  7383. printf("run_test20() - [5] Failed to get 'str' from symbol_table\n");
  7384. result = false;
  7385. }
  7386. if (symbol_table.get_variable("val") != 0 || symbol_table.symbol_exists("val"))
  7387. {
  7388. printf("run_test20() - [5] Failed to get 'val' from symbol_table\n");
  7389. result = false;
  7390. }
  7391. if (symbol_table.get_vector("vec") != 0 || symbol_table.symbol_exists("vec"))
  7392. {
  7393. printf("run_test20() - [5] Failed to get 'vec' from symbol_table\n");
  7394. result = false;
  7395. }
  7396. }
  7397. if (!result)
  7398. return result;
  7399. {
  7400. symbol_table_t symbol_table;
  7401. symbol_table.add_vector("vec",vec);
  7402. if (symbol_table.get_vector("vec") == 0 || !symbol_table.symbol_exists("vec"))
  7403. {
  7404. printf("run_test20() - [6] Failed to get 'vec' from symbol_table\n");
  7405. result = false;
  7406. }
  7407. if (symbol_table.get_variable("val") != 0 || symbol_table.symbol_exists("val"))
  7408. {
  7409. printf("run_test20() - [6] Failed to get 'val' from symbol_table\n");
  7410. result = false;
  7411. }
  7412. if (symbol_table.get_stringvar("str") != 0 || symbol_table.symbol_exists("str"))
  7413. {
  7414. printf("run_test20() - [6] Failed to get 'str' from symbol_table\n");
  7415. result = false;
  7416. }
  7417. }
  7418. if (!result)
  7419. return result;
  7420. }
  7421. return true;
  7422. }
  7423. template <typename T>
  7424. inline std::string results_to_string(const exprtk::results_context<T>& results)
  7425. {
  7426. typedef exprtk::results_context<T> results_context_t;
  7427. typedef typename results_context_t::type_store_t type_t;
  7428. std::string res_str;
  7429. for (std::size_t i = 0; i < results.count(); ++i)
  7430. {
  7431. type_t t = results[i];
  7432. switch (t.type)
  7433. {
  7434. case type_t::e_scalar : res_str += 'T';
  7435. break;
  7436. case type_t::e_vector : res_str += 'V';
  7437. break;
  7438. case type_t::e_string : res_str += 'S';
  7439. break;
  7440. default : continue;
  7441. }
  7442. }
  7443. return res_str;
  7444. }
  7445. template <typename T>
  7446. inline bool result_equal(const exprtk::results_context<T>& results, const T& value)
  7447. {
  7448. typedef exprtk::results_context<T> results_context_t;
  7449. typedef typename results_context_t::type_store_t type_t;
  7450. typedef typename type_t::scalar_view scalar_t;
  7451. if (1 != results.count())
  7452. return false;
  7453. else if (type_t::e_scalar != results[0].type)
  7454. return false;
  7455. else
  7456. return (value == scalar_t(results[0])());
  7457. }
  7458. template <typename T>
  7459. inline bool run_test21()
  7460. {
  7461. typedef exprtk::symbol_table<T> symbol_table_t;
  7462. typedef exprtk::expression<T> expression_t;
  7463. typedef exprtk::parser<T> parser_t;
  7464. T x = T(1.1);
  7465. T y = T(2.2);
  7466. T z = T(3.3);
  7467. symbol_table_t symbol_table;
  7468. symbol_table.add_constants();
  7469. symbol_table.add_variable("x",x);
  7470. symbol_table.add_variable("y",y);
  7471. symbol_table.add_variable("z",z);
  7472. {
  7473. static const std::string expression_list[] =
  7474. {
  7475. "return[]; x;",
  7476. "return[x]; x;",
  7477. "return[x,y]; x;",
  7478. "return[x + y,y - x]; x;",
  7479. "return[x + y,y - x,'abc']; x;",
  7480. "if (x < y) return [1,'abc1']; else return [2,'abc2',x];" ,
  7481. "if (x > y) return [1,'abc1']; else return [2,'abc2',x];" ,
  7482. "if (x < y) { return [1,'abc1'];} else { return [2,'abc2',x];}",
  7483. "if (x > y) { return [1,'abc1'];} else { return [2,'abc2',x];}",
  7484. "for(var i := 0; i < 10; i += 1) { if (i == 5) return [1]; } ",
  7485. "for(var i := 0; i < 10; i += 1) { if (i == 5) return [1,'abc']; } ",
  7486. "for(var i := 0; i < 10; i += 1) { if (i == 5) return [1,'abc',x]; }",
  7487. "for(var i := 0; i < 10; i += 1) { if (i == 5) return [1,'abc',x,y]; }",
  7488. "for(var i := 0; i < 10; i += 1) { if (i == 5) return [1,'abc',x,y,z]; }",
  7489. "for(var i := 0; i < 10; i += 1) { if (i == 5) return [2,'abc2',x]; else x += 1; }",
  7490. "for(var i := 0; i < 10; i += 1) { if (i == 5) { return [1,'abc1'];} else x += 1; }"
  7491. };
  7492. static const std::string result_list[] =
  7493. {
  7494. "" ,
  7495. "T" ,
  7496. "TT" ,
  7497. "TT" ,
  7498. "TTS" ,
  7499. "TS" ,
  7500. "TST" ,
  7501. "TS" ,
  7502. "TST" ,
  7503. "T" ,
  7504. "TS" ,
  7505. "TST" ,
  7506. "TSTT" ,
  7507. "TSTTT",
  7508. "TST" ,
  7509. "TS"
  7510. };
  7511. static const std::size_t expression_list_size = sizeof(expression_list) / sizeof(std::string);
  7512. bool failure = false;
  7513. for (std::size_t i = 0; i < expression_list_size; ++i)
  7514. {
  7515. expression_t expression;
  7516. expression.register_symbol_table(symbol_table);
  7517. parser_t parser;
  7518. if (!parser.compile(expression_list[i],expression))
  7519. {
  7520. printf("run_test21() - Error: %s Expression: %s [1]\n",
  7521. parser.error().c_str(),
  7522. expression_list[i].c_str());
  7523. failure = true;
  7524. continue;
  7525. }
  7526. else if (!parser.dec().return_present())
  7527. {
  7528. printf("run_test21() - Expected a return statement Expression: %s [1]\n",
  7529. expression_list[i].c_str());
  7530. failure = true;
  7531. continue;
  7532. }
  7533. expression.value();
  7534. std::string pattern = results_to_string<T>(expression.results());
  7535. if (!expression.return_invoked())
  7536. {
  7537. printf("run_test21() - Invalid return invoke state [1] Expression: %s\n",
  7538. expression_list[i].c_str());
  7539. failure = true;
  7540. continue;
  7541. }
  7542. else if (result_list[i] != pattern)
  7543. {
  7544. printf("run_test21() - Invalid return results [1] Expected %s Got: %s Expression: %s\n",
  7545. result_list[i].c_str(),
  7546. pattern.c_str(),
  7547. expression_list[i].c_str());
  7548. failure = true;
  7549. continue;
  7550. }
  7551. }
  7552. if (failure)
  7553. return false;
  7554. }
  7555. {
  7556. static const std::string expression_list[] =
  7557. {
  7558. "x := 1; x + 1; x + 2; x + 3; x + 5; x + 7; return [x + 1]; ",
  7559. "x := 1; x + 1; x + 2; x + 3; x + 5; return [x + 1]; x := 7; ",
  7560. "x := 1; x + 1; x + 2; x + 3; return [x + 1]; x + 5; x := 7; ",
  7561. "x := 1; x + 1; x + 2; return [x + 1]; x + 3; x + 5; x := 7; ",
  7562. "x := 1; x + 1; return [x + 1]; x + 2; x + 3; x + 5; x := 7; ",
  7563. "x := 1; return [x + 1]; x + 1; x + 2; x + 3; x + 5; x := 7; ",
  7564. "return [x + 1]; x := 1; x + 1; x + 2; x + 3; x + 5; x := 7; ",
  7565. "~{x := 1; x + 1; x + 2; x + 3; x + 5; x + 7; return [x + 1]}",
  7566. "~{x := 1; x + 1; x + 2; x + 3; x + 5; return [x + 1]; x := 7}",
  7567. "~{x := 1; x + 1; x + 2; x + 3; return [x + 1]; x + 5; x := 7}",
  7568. "~{x := 1; x + 1; x + 2; return [x + 1]; x + 3; x + 5; x := 7}",
  7569. "~{x := 1; x + 1; return [x + 1]; x + 2; x + 3; x + 5; x := 7}",
  7570. "~{x := 1; return [x + 1]; x + 1; x + 2; x + 3; x + 5; x := 7}",
  7571. "~{return [x + 1]; x := 1; x + 1; x + 2; x + 3; x + 5; x := 7}"
  7572. };
  7573. static const std::string result_list[] =
  7574. {
  7575. "T", "T", "T", "T", "T", "T", "T",
  7576. "T", "T", "T", "T", "T", "T", "T",
  7577. };
  7578. static const std::size_t expression_list_size = sizeof(expression_list) / sizeof(std::string);
  7579. bool failure = false;
  7580. for (std::size_t i = 0; i < expression_list_size; ++i)
  7581. {
  7582. expression_t expression;
  7583. expression.register_symbol_table(symbol_table);
  7584. parser_t parser;
  7585. if (!parser.compile(expression_list[i],expression))
  7586. {
  7587. printf("run_test21() - Error: %s Expression: %s [2]\n",
  7588. parser.error().c_str(),
  7589. expression_list[i].c_str());
  7590. failure = true;
  7591. continue;
  7592. }
  7593. else if (!parser.dec().return_present())
  7594. {
  7595. printf("run_test21() - Expected a return statement Expression: %s [2]\n",
  7596. expression_list[i].c_str());
  7597. failure = true;
  7598. continue;
  7599. }
  7600. expression.value();
  7601. std::string pattern = results_to_string<T>(expression.results());
  7602. if (!expression.return_invoked())
  7603. {
  7604. printf("run_test21() - Invalid return invoke state [2] Expression: %s\n",
  7605. expression_list[i].c_str());
  7606. failure = true;
  7607. continue;
  7608. }
  7609. else if (result_list[i] != pattern)
  7610. {
  7611. printf("run_test21() - Invalid return results [2] Expected %s Got: %s Expression: %s\n",
  7612. result_list[i].c_str(),
  7613. pattern.c_str(),
  7614. expression_list[i].c_str());
  7615. failure = true;
  7616. continue;
  7617. }
  7618. else if (!result_equal(expression.results(), x + T(1)))
  7619. {
  7620. printf("run_test21() - Invalid return results [2] Expected %s Got: %s Expression: %s\n",
  7621. result_list[i].c_str(),
  7622. pattern.c_str(),
  7623. expression_list[i].c_str());
  7624. failure = true;
  7625. continue;
  7626. }
  7627. }
  7628. if (failure)
  7629. return false;
  7630. }
  7631. return true;
  7632. }
  7633. template <typename T>
  7634. struct type_name { static inline std::string value() { return "unknown"; } };
  7635. template <> struct type_name<float> { static inline std::string value() { return "float"; } };
  7636. template <> struct type_name<double> { static inline std::string value() { return "double"; } };
  7637. template <> struct type_name<long double> { static inline std::string value() { return "long double"; } };
  7638. int main()
  7639. {
  7640. #define perform_test(Type,Number) \
  7641. { \
  7642. exprtk::timer timer; \
  7643. timer.start(); \
  7644. if (!run_test##Number<Type>()) \
  7645. { \
  7646. printf("run_test"#Number" (%s) *** FAILED! ***\n", \
  7647. type_name<Type>::value().c_str()); \
  7648. result = EXIT_FAILURE; \
  7649. } \
  7650. else \
  7651. { \
  7652. timer.stop(); \
  7653. printf("run_test"#Number" (%s) - Result: SUCCESS Time: %8.4fsec\n", \
  7654. type_name<Type>::value().c_str(), \
  7655. timer.time()); \
  7656. } \
  7657. } \
  7658. int result = 0;
  7659. perform_test(numeric_type,00)
  7660. perform_test(numeric_type,01)
  7661. perform_test(numeric_type,02)
  7662. perform_test(numeric_type,03)
  7663. perform_test(numeric_type,04)
  7664. perform_test(numeric_type,05)
  7665. perform_test(numeric_type,06)
  7666. perform_test(numeric_type,07)
  7667. perform_test(numeric_type,08)
  7668. perform_test(numeric_type,09)
  7669. perform_test(numeric_type,10)
  7670. perform_test(numeric_type,11)
  7671. perform_test(numeric_type,12)
  7672. perform_test(numeric_type,13)
  7673. perform_test(numeric_type,14)
  7674. perform_test(numeric_type,15)
  7675. perform_test(numeric_type,16)
  7676. perform_test(numeric_type,17)
  7677. perform_test(numeric_type,18)
  7678. perform_test(numeric_type,19)
  7679. perform_test(numeric_type,20)
  7680. perform_test(numeric_type,21)
  7681. #undef perform_test
  7682. return result;
  7683. }