Example #1
0
Fragment Fragment::concatenate(Fragment e1, Fragment e2)
{
    //!  +----+   +----+
    //! >| e1 |-->| e2 |-->
    //!  +----+   +----+

    e1.patch(e2.start());
    return Fragment(e1.start(), e2.dangling());
}
Example #2
0
Fragment Fragment::loopone(Fragment e1)
{
    //!     +-----+
    //!     v     |
    //!  +----+   | 
    //! >| e1 |-->O-->
    //!  +----+

    State* state = new State;
    state->what = State::Split;
    state->out[0] = e1.start();
    e1.patch(state);
    return Fragment(e1.start(), { &state->out[1] });
}
Example #3
0
Fragment Fragment::alternate(Fragment e1, Fragment e2)
{
    //!      +----+
    //!  +-->| e1 |-->
    //!  |   +----+
    //! >O
    //!  |   +----+
    //!  +-->| e2 |-->
    //!      +----+

    State* state = new State;
    state->what = State::Split;
    state->out[0] = e1.start();
    state->out[1] = e2.start();
    return Fragment(state, e1.dangling(), e2.dangling());
}
Example #4
0
Fragment Fragment::optional(Fragment e1)
{
    //!      +----+
    //!  +-->| e1 |-->
    //!  |   +----+
    //! >O----------->

    State* state = new State;
    state->what = State::Split;
    state->out[0] = e1.start();
    return Fragment(state, e1.dangling(), { &state->out[1] });
}
Example #5
0
Fragment Fragment::loop(Fragment e1)
{
    //!      +----+
    //!  +-->| e1 |--+
    //!  |   +----+  |
    //! >O<----------+
    //!  |
    //!  +------------>

    State* state = new State;
    state->what = State::Split;
    state->out[0] = e1.start();
    e1.patch(state);
    return Fragment(state, { &state->out[1] });
}