@@ -102,7 +102,7 @@ impl Gate {
102102
103103#[ inline( always) ]
104104pub fn part1_inner ( s : & [ u8 ] ) -> u64 {
105- let mut gates_map = [ 0u16 ; 26 * 26 * 26 ] ;
105+ let mut gates_map = heapless :: FnvIndexMap :: < u16 , u16 , 512 > :: new ( ) ;
106106
107107 let mut gates = heapless:: Vec :: < Gate , 512 > :: from_slice (
108108 & [ Gate {
@@ -134,19 +134,19 @@ pub fn part1_inner(s: &[u8]) -> u64 {
134134 + ( s. get_unchecked ( i + len + 13 ) - b'a' ) as u16 * 26
135135 + ( s. get_unchecked ( i + len + 14 ) - b'a' ) as u16 ;
136136
137- let real_this = * gates_map. get_unchecked ( this as usize ) ;
138- if real_this == 0 {
139- let i = gates . len ( ) as u16 ;
140- gates. push_unchecked ( Gate {
141- inp_1 : false ,
142- out_1 : 0 ,
143- out_2 : 0 ,
144- state : State :: Empty ,
145- } ) ;
146- * gates_map . get_unchecked_mut ( this as usize ) = i ;
147- i
148- } else {
149- real_this
137+ match gates_map. entry ( this) {
138+ heapless :: Entry :: Occupied ( occupied_entry ) => * occupied_entry . get ( ) ,
139+ heapless :: Entry :: Vacant ( vacant_entry ) => {
140+ let i = gates. len ( ) as u16 ;
141+ gates . push_unchecked ( Gate {
142+ inp_1 : false ,
143+ out_1 : 0 ,
144+ out_2 : 0 ,
145+ state : State :: Empty ,
146+ } ) ;
147+ vacant_entry . insert ( i ) . unwrap_unchecked ( ) ;
148+ i
149+ }
150150 }
151151 } ;
152152
@@ -182,33 +182,33 @@ pub fn part1_inner(s: &[u8]) -> u64 {
182182 let from2 = ( s. get_unchecked ( i + len + 5 ) - b'a' ) as u16 * 26 * 26
183183 + ( s. get_unchecked ( i + len + 6 ) - b'a' ) as u16 * 26
184184 + ( s. get_unchecked ( i + len + 7 ) - b'a' ) as u16 ;
185- let real_from1 = * gates_map. get_unchecked ( from1 as usize ) ;
186- let from1 = if real_from1 == 0 {
187- let i = gates . len ( ) as u16 ;
188- gates. push_unchecked ( Gate {
189- inp_1 : false ,
190- out_1 : 0 ,
191- out_2 : 0 ,
192- state : State :: Empty ,
193- } ) ;
194- * gates_map . get_unchecked_mut ( from1 as usize ) = i ;
195- i
196- } else {
197- real_from1
185+ let from1 = match gates_map. entry ( from1) {
186+ heapless :: Entry :: Occupied ( occupied_entry ) => * occupied_entry . get ( ) ,
187+ heapless :: Entry :: Vacant ( vacant_entry ) => {
188+ let i = gates. len ( ) as u16 ;
189+ gates . push_unchecked ( Gate {
190+ inp_1 : false ,
191+ out_1 : 0 ,
192+ out_2 : 0 ,
193+ state : State :: Empty ,
194+ } ) ;
195+ vacant_entry . insert ( i ) . unwrap_unchecked ( ) ;
196+ i
197+ }
198198 } ;
199- let real_from2 = * gates_map. get_unchecked ( from2 as usize ) ;
200- let from2 = if real_from2 == 0 {
201- let i = gates . len ( ) as u16 ;
202- gates. push_unchecked ( Gate {
203- inp_1 : false ,
204- out_1 : 0 ,
205- out_2 : 0 ,
206- state : State :: Empty ,
207- } ) ;
208- * gates_map . get_unchecked_mut ( from2 as usize ) = i ;
209- i
210- } else {
211- real_from2
199+ let from2 = match gates_map. entry ( from2) {
200+ heapless :: Entry :: Occupied ( occupied_entry ) => * occupied_entry . get ( ) ,
201+ heapless :: Entry :: Vacant ( vacant_entry ) => {
202+ let i = gates. len ( ) as u16 ;
203+ gates . push_unchecked ( Gate {
204+ inp_1 : false ,
205+ out_1 : 0 ,
206+ out_2 : 0 ,
207+ state : State :: Empty ,
208+ } ) ;
209+ vacant_entry . insert ( i ) . unwrap_unchecked ( ) ;
210+ i
211+ }
212212 } ;
213213
214214 gates. get_unchecked_mut ( from1 as usize ) . add_out ( this) ;
0 commit comments