package Ġorg . lf lang . generator . cpp Ċ Ċ import Ġorg . eclipse . emf . ecore . resource . Resource Ċ import Ġorg . lf lang .* Ċ import Ġorg . lf lang . lf .* Ċ import Ġjava . time . LocalDateTime Ċ import Ġjava . time . format . DateTime Formatter Ċ Ċ / ******** ***** Ċ Ġ* ĠCopyright Ġ( c ) Ġ 2 0 1 9 - 2 0 2 1 , ĠT U ĠD res den . ĊĊ Ġ* ĠRedistribution Ġand Ġuse Ġin Ġsource Ġand Ġbinary Ġforms , Ġwith Ġor Ġwithout Ġmodification , Ċ Ġ* Ġare Ġpermitted Ġprovided Ġthat Ġthe Ġfollowing Ġconditions Ġare Ġmet : ĊĊ Ġ* Ġ 1 . ĠRedistributions Ġof Ġsource Ġcode Ġmust Ġretain Ġthe Ġabove Ġcopyright Ġnotice , Ċ Ġ* ĠĠĠ Ġthis Ġlist Ġof Ġconditions Ġand Ġthe Ġfollowing Ġdisclaimer . ĊĊ Ġ* Ġ 2 . ĠRedistributions Ġin Ġbinary Ġform Ġmust Ġreproduce Ġthe Ġabove Ġcopyright Ġnotice , Ċ Ġ* ĠĠĠ Ġthis Ġlist Ġof Ġconditions Ġand Ġthe Ġfollowing Ġdisclaimer Ġin Ġthe Ġdocumentation Ċ Ġ* ĠĠĠ Ġand / or Ġother Ġmaterials Ġprovided Ġwith Ġthe Ġdistribution . ĊĊ Ġ* ĠTHIS ĠSOFTWARE ĠIS ĠPROVIDED ĠBY ĠTHE ĠCOPYRIGHT ĠHOLDERS ĠAND ĠCONTRIBUTORS Ġ" AS ĠIS " ĠAND ĠANY Ċ Ġ* ĠEXPRESS ĠOR ĠIMPLIED ĠWARRANTIES , ĠINCLUDING , ĠBUT ĠNOT ĠLIMITED ĠTO , ĠTHE ĠIMPLIED ĠWARRANTIES ĠOF Ċ Ġ* ĠMERCHANTABILITY ĠAND ĠFITNESS ĠFOR ĠA ĠPARTICULAR ĠPURPOSE ĠARE ĠDISCLAIMED . ĠIN ĠNO ĠEVENT ĠSHALL Ċ Ġ* ĠTHE ĠCOPYRIGHT ĠHOLDER ĠOR ĠCONTRIBUTORS ĠBE ĠLIABLE ĠFOR ĠANY ĠDIRECT , ĠINDIRECT , ĠINCIDENTAL , Ċ Ġ* ĠSPECIAL , ĠEXEMPLARY , ĠOR ĠCONSEQUENTIAL ĠDAMAGES Ġ( INCLUDING , ĠBUT ĠNOT ĠLIMITED ĠTO , Ċ Ġ* ĠPROCUREMENT ĠOF ĠSUBSTITUTE ĠGOODS ĠOR ĠSERVICES ; ĠLOSS ĠOF ĠUSE , ĠDATA , ĠOR ĠPROFITS ; ĠOR ĠBUSINESS Ċ Ġ* ĠINTERRUPTION ) ĠHOWEVER ĠCAUSED ĠAND ĠON ĠANY ĠTHEORY ĠOF ĠLIABILITY , ĠWHETHER ĠIN ĠCONTRACT , Ċ Ġ* ĠSTRICT ĠLIABILITY , ĠOR ĠTORT Ġ( INCLUDING ĠNEGLIGENCE ĠOR ĠOTHERWISE ) ĠARISING ĠIN ĠANY ĠWAY ĠOUT ĠOF Ċ Ġ* ĠTHE ĠUSE ĠOF ĠTHIS ĠSOFTWARE , ĠEVEN ĠIF ĠADVISED ĠOF ĠTHE ĠPOSSIBILITY ĠOF ĠSUCH ĠDAMAGE . Ċ Ġ********* ******/ Ċ Ċ /* Ġ***************************************************************** ************************ ** Ċ Ġ* Ċ Ġ* ĠThe Ġfollowing Ġdefinition Ġprovide Ġextension Ġthat Ġare Ġlikely Ġuseful Ġacross Ġtargets Ċ Ġ* Ċ Ġ* ĠTODO ĠMove Ġthese Ġdefinitions Ġto Ġa Ġcommon Ġplace Ġand Ġcheck Ġif Ġthey Ġare Ġalready Ġimplemented Ġelsewhere Ċ Ġ*/ Ċ Ċ /** ĠGet Ġthe Ġ" name " Ġa Ġreaction Ġis Ġrepresented Ġwith Ġin Ġtarget Ġcode .*/ Ċ val ĠRe action . name ĊĠĠĠ Ġget (): ĠString Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġr Ġ= Ġthis . e Container () Ġas ĠRe actor ĊĠĠĠĠĠĠĠ Ġreturn Ġ" r " Ġ+ Ġr . reactions . lastIndexOf ( this ) ĊĠĠĠ Ġ} Ċ Ċ /* Ġ***************************************************************** ************************ ***** Ċ Ġ* ĠC ++ Ġspecific Ġextensions Ġshared Ġacross Ġclasses Ċ Ġ*/ Ċ // ĠTODO : ĠMost Ġof Ġthe Ġextensions Ġdefined Ġhere Ġshould Ġbe Ġmoved Ġto Ġcompanion Ġobjects Ġof Ġtheir Ċ // Ġ Ġcorresponding Ġgenerator Ġclasses . ĠSee Ġfor Ġinstance Ġthe ĠCpp Parameter Generator Ċ Ċ /** ĠGet Ġa ĠC ++ Ġrepresentation Ġof Ġa ĠL F Ġunit . Ġ*/ Ċ val ĠTime Value . cpp Unit ĊĠĠĠ Ġget () Ġ= Ġwhen Ġ( this . unit ) Ġ{ ĊĠĠĠĠĠĠĠ ĠTimeUnit . N SEC ĠĠĠ Ġ-> Ġ" ns " ĊĠĠĠĠĠĠĠ ĠTimeUnit . N SE CS ĠĠ Ġ-> Ġ" ns " ĊĠĠĠĠĠĠĠ ĠTimeUnit . USE C ĠĠĠ Ġ-> Ġ" us " ĊĠĠĠĠĠĠĠ ĠTimeUnit . USE CS ĠĠ Ġ-> Ġ" us " ĊĠĠĠĠĠĠĠ ĠTimeUnit . M SEC ĠĠĠ Ġ-> Ġ" ms " ĊĠĠĠĠĠĠĠ ĠTimeUnit . M SE CS ĠĠ Ġ-> Ġ" ms " ĊĠĠĠĠĠĠĠ ĠTimeUnit . SEC ĠĠĠĠ Ġ-> Ġ" s " ĊĠĠĠĠĠĠĠ ĠTimeUnit . SE CS ĠĠĠ Ġ-> Ġ" s " ĊĠĠĠĠĠĠĠ ĠTimeUnit . SECOND Ġ Ġ-> Ġ" s " ĊĠĠĠĠĠĠĠ ĠTimeUnit . SECONDS Ġ-> Ġ" s " ĊĠĠĠĠĠĠĠ ĠTimeUnit . MIN ĠĠĠĠ Ġ-> Ġ" min " ĊĠĠĠĠĠĠĠ ĠTimeUnit . MIN S ĠĠĠ Ġ-> Ġ" min " ĊĠĠĠĠĠĠĠ ĠTimeUnit . MINUTE Ġ Ġ-> Ġ" min " ĊĠĠĠĠĠĠĠ ĠTimeUnit . MIN UTES Ġ-> Ġ" min " ĊĠĠĠĠĠĠĠ ĠTimeUnit . HOUR ĠĠĠ Ġ-> Ġ" h " ĊĠĠĠĠĠĠĠ ĠTimeUnit . HOUR S ĠĠ Ġ-> Ġ" h " ĊĠĠĠĠĠĠĠ ĠTimeUnit . DAY ĠĠĠĠ Ġ-> Ġ" d " ĊĠĠĠĠĠĠĠ ĠTimeUnit . DAYS ĠĠĠ Ġ-> Ġ" d " ĊĠĠĠĠĠĠĠ ĠTimeUnit . WEEK ĠĠĠ Ġ-> Ġ" d * 7 " ĊĠĠĠĠĠĠĠ ĠTimeUnit . W EE KS ĠĠ Ġ-> Ġ" d * 7 " ĊĠĠĠĠĠĠĠ ĠTimeUnit . NONE ĠĠĠ Ġ-> Ġ"" ĊĠĠĠĠĠĠĠ Ġelse ĠĠĠĠĠĠĠĠĠĠĠĠ Ġ-> Ġ"" ĊĠĠĠ Ġ} Ċ Ċ /** ĠConvert Ġa ĠL F Ġtime Ġvalue Ġto Ġa Ġrepresentation Ġin ĠC ++ Ġcode Ġ*/ Ċ fun ĠTime Value . to Code () Ġ= Ġif Ġ( this . time Ġ== Ġ 0 L ) Ġ" reactor :: Duration :: zero ()" Ġelse Ġ"${ this . time }${ this . cpp Unit }" Ċ Ċ /** ĠConvert Ġa ĠTime Ġto Ġa Ġrepresentation Ġin ĠC ++ Ġcode Ċ Ġ* Ċ Ġ* ĠFIXME Ġthis Ġis Ġredundant Ġto ĠGenerator Base . getTarget Time Ċ Ġ*/ Ċ fun ĠTime . to Code () Ġ= ĠTime Value ( this . interval . to Long (), Ġthis . unit ). to Code () Ċ Ċ /** ĠConvert Ġa Ġvalue Ġto Ġa Ġtime Ġrepresentation Ġin ĠC ++ Ġcode * Ċ Ġ* Ċ Ġ* ĠIf Ġthe Ġvalue Ġevaluates Ġto Ġ 0 , Ġit Ġis Ġinterpreted Ġas Ġa Ġtime . Ċ Ġ* Ċ Ġ* Ġ@ param Ġouter Context ĠA Ġflag Ġindicating Ġwhether Ġto Ġgenerate Ġcode Ġfor Ġthe Ġscope Ġof Ġthe Ġouter Ġreactor Ġclass . Ċ Ġ* ĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠThis Ġshould Ġbe Ġset Ġto Ġfalse Ġif Ġcalled Ġfrom Ġcode Ġgenerators Ġfor Ġthe Ġinner Ġclass . Ċ Ġ*/ Ċ fun ĠValue . to Time ( outer Context : ĠBoolean Ġ= Ġfalse ): ĠString Ġ= Ġwhen Ġ{ ĊĠĠĠ Ġthis . time Ġ!= Ġnull Ġ-> Ġthis . time . to Code () ĊĠĠĠ Ġthis . is Zero ĠĠĠĠĠĠ Ġ-> ĠTime Value ( 0 , ĠTimeUnit . NONE ). to Code () ĊĠĠĠ Ġouter Context Ġ&& Ġthis . parameter Ġ!= Ġnull Ġ-> Ġ"__ lf _ inner .${ parameter . name }" ĊĠĠĠ Ġelse ĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ-> Ġthis . to Text () Ċ } Ċ Ċ /** Ċ Ġ* ĠGet Ġtext ual Ġrepresentation Ġof Ġa Ġvalue Ġin ĠC ++ Ġcode Ċ Ġ* Ċ Ġ* ĠIf Ġthe Ġvalue Ġevaluates Ġto Ġ 0 , Ġit Ġis Ġinterpreted Ġas Ġa Ġnormal Ġvalue . Ċ Ġ* ĠFIXME Ġthis Ġis Ġredundant Ġto ĠGenerator Base . getTarget Value Ċ Ġ*/ Ċ fun ĠValue . to Code (): ĠString Ġ= Ġthis . time ?. to Code () Ġ?: Ġthis . to Text () Ċ Ċ /** ĠGet Ġthe Ġtext ual Ġrepresentation Ġof Ġa Ġwidth Ġin ĠC ++ Ġcode Ġ*/ Ċ fun ĠWidth Spec . to Code (): ĠString Ġ= Ġ Ġterms . join ToString (" Ġ+ Ġ") Ġ{ ĊĠĠĠ Ġwhen Ġ{ ĊĠĠĠĠĠĠĠ Ġit . parameter Ġ!= Ġnull Ġ-> Ġit . parameter . name ĊĠĠĠĠĠĠĠ Ġit . port Ġ!= Ġnull ĠĠĠĠĠ Ġ-> Ġwith ( it . port ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( container ?. is Bank Ġ== Ġtrue ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ(( variable Ġas ĠPort ). is Multi port ) Ġ" (${ container . name }. size () Ġ* Ġ${ container . name }[ 0 ]-> ${ variable . name }. size ()) " ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġelse Ġ"${ container . name }. size ()" ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} Ġelse Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ(( variable Ġas ĠPort ). is Multi port ) Ġ"${ name }. size ()" ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġelse Ġ" 1 " ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġelse ĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ-> Ġit . width . toString () ĊĠĠĠ Ġ} Ċ } Ċ Ċ /** ĠTrue Ġif Ġthe Ġp reamble Ġis Ġpublic Ġ*/ Ċ val ĠP reamble . is Public : ĠBoolean Ġget () Ġ= Ġthis . visibility Ġ== ĠVisibility . PUBLIC Ċ Ċ /** ĠTrue Ġif Ġthe Ġp reamble Ġis Ġprivate Ġ*/ Ċ val ĠP reamble . is Private : ĠBoolean Ġget () Ġ= Ġthis . visibility Ġ== ĠVisibility . PRIVATE Ċ Ċ /** ĠThe Ġtemplate Ġline Ġpreceding Ġthe Ġclass Ġdeclaration Ġand Ġany Ġmember Ġdefinitions Ġfor Ġa Ġ` reactor Ġ*/ Ċ val ĠRe actor . template Line ĊĠĠĠ Ġget () Ġ= ĊĠĠĠĠĠĠĠ Ġif Ġ( is Generic ) Ġ""" template < ${ type Parms . join ToString (", Ġ") Ġ{ Ġ" class Ġ${ it . to Text () }" Ġ}}> """ ĊĠĠĠĠĠĠĠ Ġelse Ġ"" Ċ Ċ /** ĠGet Ġtemp lated Ġname Ġof Ġa Ġreactor Ġclass Ġ*/ Ċ val ĠRe actor . template Name : ĠString Ġget () Ġ= Ġif Ġ( is Generic ) Ġ"$ name < ${ type Parms . join ToString (", Ġ") Ġ{ Ġit . to Text () Ġ}} >" Ġelse Ġname Ċ Ċ /** ĠGet Ġa ĠC ++ Ġcode Ġrepresentation Ġof Ġthe Ġgiven Ġvariable Ġ*/ Ċ val ĠVar Ref . name : ĠString ĊĠĠĠ Ġget () Ġ= Ġif Ġ( this . container Ġ== Ġnull ) Ġthis . variable . name ĊĠĠĠ Ġelse Ġ"${ this . container . name }-> ${ this . variable . name }" Ċ Ċ /** ĠGet Ġa ĠC ++ Ġcode Ġrepresentation Ġof Ġthe Ġgiven Ġtrigger Ġ*/ Ċ val ĠTrigger Ref . name : ĠString ĊĠĠĠ Ġget () Ġ= Ġwhen Ġ{ ĊĠĠĠĠĠĠĠ Ġthis Ġis ĠVar Ref Ġ Ġ-> Ġthis . name ĊĠĠĠĠĠĠĠ Ġthis . is Shutdown Ġ-> ĠL f Package . L iterals . TRIGGER _ REF __ SHUT DOWN . name ĊĠĠĠĠĠĠĠ Ġthis . is Startup Ġ Ġ-> ĠL f Package . L iterals . TRIGGER _ REF __ START UP . name ĊĠĠĠĠĠĠĠ Ġelse ĠĠĠĠĠĠĠĠĠĠĠ Ġ-> Ġthrow ĠAssertionError () ĊĠĠĠ Ġ} Ċ Ċ /** ĠReturn Ġa Ġcomment Ġto Ġbe Ġinserted Ġat Ġthe Ġtop Ġof Ġgenerated Ġfiles . Ġ*/ Ċ fun Ġfile Comment ( r : ĠResource ) Ġ= Ġ""" ĊĠĠĠ Ġ/* ĊĠĠĠĠ Ġ* ĠThis Ġfile Ġwas Ġautogenerated Ġby Ġthe ĠL ing ua ĠFr an ca ĠCompiler ĊĠĠĠĠ Ġ* ĊĠĠĠĠ Ġ* ĠSource : Ġ${ r . uri } ĊĠĠĠĠ Ġ* ĠDate : Ġ${ LocalDateTime . now (). format ( DateTime Formatter . of Pattern (" yyyy - MM - dd ĠHH : mm : ss ")) } ĊĠĠĠĠ Ġ*/ ĊĠĠĠ Ġ""" . trim Indent () Ċ Ċ /* Ġ***************************************************************** ******************************** Ċ Ġ* ĠFIXME ĠThe Ġfollowing Ġextensions Ġfor Ġhandling Ġtypes Ġare Ġactually Ġdefined Ġin Ġ` Generator Base ` Ġand Ġshould Ġbe Ġoverridden Ġby Ġthe Ċ Ġ* Ġ Ġderived ĠCpp Generator ĠClass . ĠHowever , Ġthis Ġcauses Ġa Ġweird Ġdesign Ġbecause Ġwe Ġwould Ġneed Ġto Ġpass Ġaround Ġa Ġreference Ċ Ġ* Ġ Ġto ĠCpp Generator Ġto Ġderive Ġtarget Ġtypes Ġfrom ĠAST Ġnodes ... ĠMore over , Ġit Ġwould Ġnot Ġbe Ġpossible Ġto Ġuse Ġthe Ġconvenient Ġextension Ċ Ġ* Ġ Ġmechanism . ĠThe Ġcode Ġbelow Ġis Ġa Ġworkaround , Ġbut Ġa Ġmore Ġgeneral Ġsolution Ġshould Ġbe Ġfound . Ċ Ġ*/ Ċ Ċ val ĠState Var . target Type Ġget (): String Ġ= Ġthis . in ferred Type . target Type Ċ val ĠPort . target Type Ġget (): String Ġ= Ġthis . in ferred Type . target Type Ċ val ĠAction . target Type : ĠString ĊĠĠĠ Ġget () Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġinferred Ġ= Ġthis . in ferred Type ĊĠĠĠĠĠĠĠ Ġreturn Ġif Ġ( in ferred . is Undefined ) Ġ" void " Ġelse Ġinferred . target Type ĊĠĠĠ Ġ} Ċ Ċ private Ġfun Ġfixed Size ListType ( base Type : ĠString , Ġsize : ĠInt ) Ġ= Ġ" std :: array <$ base Type , Ġ$ size >" Ċ private Ġfun Ġvariable Size ListType ( base Type : ĠString ) Ġ= Ġ" std :: vector <$ base Type >" Ċ Ċ val ĠIn ferred Type . target Type : ĠString ĊĠĠĠ Ġget () Ġ= Ġwhen Ġ{ ĊĠĠĠĠĠĠĠ Ġthis . is Undefined ĠĠĠĠĠĠĠ Ġ-> Ġ" /* Ġundefined Ġtype Ġ*/ " ĊĠĠĠĠĠĠĠ Ġthis . is Time ĠĠĠĠĠĠĠĠĠĠĠĠ Ġ-> Ġwhen Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġthis . is Fixed Size List ĠĠĠ Ġ-> Ġfixed Size ListType (" reactor :: Duration ", Ġthis . list Size ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġthis . is Variable Size List Ġ-> Ġvariable Size ListType (" reactor :: Duration ") ĊĠĠĠĠĠĠĠĠĠĠĠ Ġelse ĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ-> Ġ" reactor :: Duration " ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġthis . is Fixed Size List ĠĠĠ Ġ-> Ġfixed Size ListType ( this . base Type (), Ġthis . list Size ) ĊĠĠĠĠĠĠĠ Ġthis . is Variable Size List Ġ-> Ġvariable Size ListType ( this . base Type ()) ĊĠĠĠĠĠĠĠ Ġelse ĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ-> Ġthis . to Text () ĊĠĠĠ Ġ} Ċ