/* Ċ Ġ* ĠCopyright Ġ 2 0 1 0 - 2 0 2 1 ĠJetBrains Ġs . r . o . Ġand ĠKotlin ĠProgramming ĠLanguage Ġcontributors . Ċ Ġ* ĠUse Ġof Ġthis Ġsource Ġcode Ġis Ġgoverned Ġby Ġthe ĠApache Ġ 2 . 0 Ġlicense Ġthat Ġcan Ġbe Ġfound Ġin Ġthe Ġlicense / LICENSE . txt Ġfile . Ċ Ġ*/ Ċ Ċ package Ġorg . jetbrains . kotlin . common izer . core Ċ Ċ import Ġorg . jetbrains . kotlin . common izer . cir . C ir ClassType Ċ import Ġorg . jetbrains . kotlin . common izer . cir . C ir EntityId Ċ Ċ private Ġtype alias ĠBit Width Ġ= ĠInt Ċ Ċ private Ġclass ĠSubst it utable Numbers ( private Ġval Ġnumbers : ĠMap < C ir EntityId , ĠBit Width >) Ġ{ ĊĠĠĠ Ġoperator Ġfun Ġcontains ( id : ĠC ir EntityId ) Ġ= Ġid Ġin Ġnumbers ĊĠĠĠ Ġfun Ġchoose ( first : ĠC ir ClassType , Ġsecond : ĠC ir ClassType ): ĠC ir ClassType ? Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġfirst Bit Width Ġ= Ġnumbers [ first . classifier Id ] Ġ?: Ġreturn Ġnull ĊĠĠĠĠĠĠĠ Ġval Ġsecond Bit Width Ġ= Ġnumbers [ second . classifier Id ] Ġ?: Ġreturn Ġnull ĊĠĠĠĠĠĠĠ Ġreturn Ġif Ġ( second Bit Width Ġ< Ġfirst Bit Width ) Ġsecond Ġelse Ġfirst ĊĠĠĠ Ġ} Ċ } Ċ Ċ private Ġval Ġsigned Inte gers Ġ= ĠSubst it utable Numbers ( ĊĠĠĠ Ġmap Of ( ĊĠĠĠĠĠĠĠ ĠC ir EntityId . create (" kotlin / Byte ") Ġto Ġ 8 , ĊĠĠĠĠĠĠĠ ĠC ir EntityId . create (" kotlin / Short ") Ġto Ġ 1 6 , ĊĠĠĠĠĠĠĠ ĠC ir EntityId . create (" kotlin / Int ") Ġto Ġ 3 2 , ĊĠĠĠĠĠĠĠ ĠC ir EntityId . create (" kotlin / Long ") Ġto Ġ 6 4 ĊĠĠĠ Ġ) Ċ ) Ċ Ċ private Ġval Ġunsigned Inte gers Ġ= ĠSubst it utable Numbers ( ĊĠĠĠ Ġmap Of ( ĊĠĠĠĠĠĠĠ ĠC ir EntityId . create (" kotlin / U Byte ") Ġto Ġ 8 , ĊĠĠĠĠĠĠĠ ĠC ir EntityId . create (" kotlin / U Short ") Ġto Ġ 1 6 , ĊĠĠĠĠĠĠĠ ĠC ir EntityId . create (" kotlin / UInt ") Ġto Ġ 3 2 , ĊĠĠĠĠĠĠĠ ĠC ir EntityId . create (" kotlin / UL ong ") Ġto Ġ 6 4 ĊĠĠĠ Ġ) Ċ ) Ċ Ċ private Ġval Ġfloating Points Ġ= ĠSubst it utable Numbers ( ĊĠĠĠ Ġmap Of ( ĊĠĠĠĠĠĠĠ ĠC ir EntityId . create (" kotlin / Float ") Ġto Ġ 3 2 , ĊĠĠĠĠĠĠĠ ĠC ir EntityId . create (" kotlin / Double ") Ġto Ġ 6 4 , ĊĠĠĠ Ġ) Ċ ) Ċ Ċ private Ġval Ġsigned Var Inte gers Ġ= ĠSubst it utable Numbers ( ĊĠĠĠ Ġmap Of ( ĊĠĠĠĠĠĠĠ ĠC ir EntityId . create (" kotlin x / c interop / Byte Var Of ") Ġto Ġ 8 , ĊĠĠĠĠĠĠĠ ĠC ir EntityId . create (" kotlin x / c interop / Short Var Of ") Ġto Ġ 1 6 , ĊĠĠĠĠĠĠĠ ĠC ir EntityId . create (" kotlin x / c interop / Int Var Of ") Ġto Ġ 3 2 , ĊĠĠĠĠĠĠĠ ĠC ir EntityId . create (" kotlin x / c interop / Long Var Of ") Ġto Ġ 6 4 , ĊĠĠĠ Ġ) Ċ ) Ċ Ċ private Ġval Ġunsigned Var Inte gers Ġ= ĠSubst it utable Numbers ( ĊĠĠĠ Ġmap Of ( ĊĠĠĠĠĠĠĠ ĠC ir EntityId . create (" kotlin x / c interop / U Byte Var Of ") Ġto Ġ 8 , ĊĠĠĠĠĠĠĠ ĠC ir EntityId . create (" kotlin x / c interop / U Short Var Of ") Ġto Ġ 1 6 , ĊĠĠĠĠĠĠĠ ĠC ir EntityId . create (" kotlin x / c interop / UInt Var Of ") Ġto Ġ 3 2 , ĊĠĠĠĠĠĠĠ ĠC ir EntityId . create (" kotlin x / c interop / UL ong Var Of ") Ġto Ġ 6 4 , ĊĠĠĠ Ġ) Ċ ) Ċ Ċ private Ġval Ġfloating Point Vars Ġ= ĠSubst it utable Numbers ( ĊĠĠĠ Ġmap Of ( ĊĠĠĠĠĠĠĠ ĠC ir EntityId . create (" kotlin x / c interop / Float Var Of ") Ġto Ġ 3 2 , ĊĠĠĠĠĠĠĠ ĠC ir EntityId . create (" kotlin x / c interop / Double Var Of ") Ġto Ġ 6 4 , ĊĠĠĠ Ġ) Ċ ) Ċ Ċ internal Ġobject ĠOptim istic Numbers Type Common izer Ġ: ĠAssoci ative Common izer < C ir ClassType > Ġ{ ĊĠĠĠ Ġoverride Ġfun Ġcommon ize ( first : ĠC ir ClassType , Ġsecond : ĠC ir ClassType ): ĠC ir ClassType ? Ġ{ ĊĠĠĠĠĠĠĠ Ġreturn Ġsigned Inte gers . choose ( first , Ġsecond ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ?: Ġunsigned Inte gers . choose ( first , Ġsecond ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ?: Ġfloating Points . choose ( first , Ġsecond ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ?: Ġsigned Var Inte gers . choose ( first , Ġsecond ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ?: Ġunsigned Var Inte gers . choose ( first , Ġsecond ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ?: Ġfloating Point Vars . choose ( first , Ġsecond ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġfun Ġis Optim istic ally Subst it utable ( class Id : ĠC ir EntityId ): ĠBoolean Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġfirst Package Segment Ġ= Ġclass Id . packageName . segments . first OrNull () ĊĠĠĠĠĠĠĠ Ġif Ġ( first Package Segment Ġ!= Ġ" kotlin x " Ġ&& Ġfirst Package Segment Ġ!= Ġ" kotlin ") Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġreturn Ġfalse ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġreturn Ġclass Id Ġin Ġsigned Inte gers ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ|| Ġclass Id Ġin Ġunsigned Inte gers ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ|| Ġclass Id Ġin Ġfloating Points ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ|| Ġclass Id Ġin Ġsigned Var Inte gers ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ|| Ġclass Id Ġin Ġunsigned Var Inte gers ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ|| Ġclass Id Ġin Ġfloating Point Vars ĊĠĠĠ Ġ} Ċ }