Add return type for transition()

This commit is contained in:
Josh Holtrop 2023-06-03 20:38:42 -04:00
parent b78827746a
commit 6b0fb4cb12

View File

@ -411,8 +411,8 @@ class <%= @classname %>
bool lex_continue = false; bool lex_continue = false;
if (!decoded.is_eof()) if (!decoded.is_eof())
{ {
uint dest = transition(current_state, decoded.code_point); auto transition_result = transition(current_state, decoded.code_point);
if (dest != cast(uint)-1) if (transition_result.found())
{ {
lex_continue = true; lex_continue = true;
attempt_match_info.length += decoded.code_point_length; attempt_match_info.length += decoded.code_point_length;
@ -425,7 +425,7 @@ class <%= @classname %>
{ {
attempt_match_info.delta_col++; attempt_match_info.delta_col++;
} }
current_state = dest; current_state = transition_result.destination();
if (states[current_state].accepts()) if (states[current_state].accepts())
{ {
attempt_match_info.accepting_state = &states[current_state]; attempt_match_info.accepting_state = &states[current_state];
@ -446,7 +446,39 @@ class <%= @classname %>
} }
} }
private uint transition(uint current_state, uint code_point) /**
* Result type for transition().
*
* Alternatives:
* - found(destination)
* - not_found
*/
struct TransitionResult
{
private uint m_destination;
static TransitionResult found(uint destination)
{
return TransitionResult(destination);
}
static TransitionResult not_found()
{
return TransitionResult(cast(uint)-1);
}
bool found()
{
return m_destination != cast(uint)-1;
}
@property uint destination()
{
return m_destination;
}
}
private TransitionResult transition(uint current_state, uint code_point)
{ {
uint transition_table_index = states[current_state].transition_table_index; uint transition_table_index = states[current_state].transition_table_index;
for (uint i = 0u; i < states[current_state].n_transitions; i++) for (uint i = 0u; i < states[current_state].n_transitions; i++)
@ -454,10 +486,11 @@ class <%= @classname %>
if ((transitions[transition_table_index + i].first <= code_point) && if ((transitions[transition_table_index + i].first <= code_point) &&
(code_point <= transitions[transition_table_index + i].last)) (code_point <= transitions[transition_table_index + i].last))
{ {
return transitions[transition_table_index + i].destination; uint destination = transitions[transition_table_index + i].destination;
return TransitionResult.found(destination);
} }
} }
return cast(uint)-1; return TransitionResult.not_found();
} }
} }