+ move gfsmArcList back to a native type, ditching GSList - sorting, splicing, etc. is then tricky, but maybe we can use temporaries for this - would save us sizeof(void*) per arc: all the space lost by adding source state! + (style): clearer API/internals demarcation + allow (arbitrary?) automaton indices - esp. (source_state,lower), (source_state,upper) - load & save with automaton - either: (1) maintain indices over destructive operations, or - generic hooks for destructive gfsmAutomaton API? (2) maintain a "dirty" marker to note when index need update, or (3) maintain a "smart list" of changed data and update on demand + get rid of "GArray fsm->states": it's just wasting space (30 of 64 bits are unused: track these at compile time with -Wpadded) - replace with (gfsmBitVector)s state_is_valid, state_is_final and a dedicated arc-list array (we can still call that "states" for backwards compatibility, esp. the fsm->states->len idiom) * tagh from 148MB to 129MB: -13% + allow gfsmArcList to be an array - better: allow *all* arcs for an automaton to be a single array + [DONE] source state tracking in gfsmArc - obsoletes gfsmReverseArcIndex - adds sizeof(gfsmStateId) bytes per arc (tagh from 148MB to 184MB: +24%) + Basic types - configure option for gfsmLabelId to fit a pointer * tricky to handle without a union or other explicit label API * without source tracking: tagh from 148MB to 184MB: +24% * with source tracking : tagh from 184MB to 220MB: +20% - configure option for 64-bit gfsmStateId (also 64-bit gfsmLabelId?) * breaks binary compatibility: add header flag? + store alphabet with fsm - tricky with user alphabets: loadable modules? + loadable modules for user-defined alphabets & semirings - libgmodule ? - look at Micha's tomata2 code for ideas