@@ -359,40 +359,13 @@ function field_offset_and_type(
359359 )
360360 elseif S <: Geometry.AdjointAxisVector
361361 return field_offset_and_type (name_pair, T, fieldtype (S, 1 ), key_error)
362- else
363- child_name, remaining_field_chain =
364- if name_pair[1 ] != @name () &&
365- extract_first (name_pair[1 ]) in fieldnames (S)
366- @inline (
367- extract_first (name_pair[1 ]),
368- (drop_first (name_pair[1 ]), name_pair[2 ]),
369- )
370- elseif name_pair[2 ] != @name () &&
371- extract_first (name_pair[2 ]) in fieldnames (S)
372- @inline (
373- extract_first (name_pair[2 ]),
374- (name_pair[1 ], drop_first (name_pair[2 ])),
375- )
376- elseif ! any (isequal (@name ()), name_pair) # implicit tensor structure
377- (remaining_offset, end_type, apply_zero) =
378- field_offset_and_type (
379- (drop_first (name_pair[1 ]), drop_first (name_pair[2 ])),
380- T,
381- S,
382- key_error,
383- )
384- return (
385- remaining_offset,
386- end_type,
387- extract_first (name_pair[1 ]) == extract_first (name_pair[2 ]) ?
388- apply_zero : true ,
389- )
390- else
391- throw (key_error)
392- end
393- child_type = fieldtype (S, child_name)
362+ elseif name_pair[1 ] != @name () &&
363+ extract_first (name_pair[1 ]) in fieldnames (S)
364+
365+ remaining_field_chain = (drop_first (name_pair[1 ]), name_pair[2 ])
366+ child_type = fieldtype (S, extract_first (name_pair[1 ]))
394367 field_index = unrolled_filter (
395- i -> fieldname (S, i) == child_name ,
368+ i -> fieldname (S, i) == extract_first (name_pair[ 1 ]) ,
396369 1 : fieldcount (S),
397370 )[1 ]
398371 (remaining_offset, end_type, apply_zero) = field_offset_and_type (
@@ -406,7 +379,41 @@ function field_offset_and_type(
406379 end_type,
407380 apply_zero,
408381 )
382+ elseif name_pair[2 ] != @name () &&
383+ extract_first (name_pair[2 ]) in fieldnames (S)
409384
385+ remaining_field_chain = name_pair[1 ], drop_first (name_pair[2 ])
386+ child_type = fieldtype (S, extract_first (name_pair[2 ]))
387+ field_index = unrolled_filter (
388+ i -> fieldname (S, i) == extract_first (name_pair[2 ]),
389+ 1 : fieldcount (S),
390+ )[1 ]
391+ (remaining_offset, end_type, apply_zero) = field_offset_and_type (
392+ remaining_field_chain,
393+ T,
394+ child_type,
395+ key_error,
396+ )
397+ return (
398+ DataLayouts. fieldtypeoffset (T, S, field_index) + remaining_offset,
399+ end_type,
400+ apply_zero,
401+ )
402+ elseif ! any (isequal (@name ()), name_pair) # implicit tensor structure
403+ (remaining_offset, end_type, apply_zero) = field_offset_and_type (
404+ (drop_first (name_pair[1 ]), drop_first (name_pair[2 ])),
405+ T,
406+ S,
407+ key_error,
408+ )
409+ return (
410+ remaining_offset,
411+ end_type,
412+ extract_first (name_pair[1 ]) == extract_first (name_pair[2 ]) ?
413+ apply_zero : true ,
414+ )
415+ else
416+ throw (key_error)
410417 end
411418end
412419if hasfield (Method, :recursion_relation )
0 commit comments