CThreadSlm::TState CThreadSlm::history_state_of(TState st) { if (st.getLevel() >= m_N) { TLeaf* pl = ((TLeaf *)m_Levels[m_N]) + st.getIdx(); return TState(pl->bol(), pl->bon()); } else { TNode* pn = ((TNode *)m_Levels[st.getLevel()]) + st.getIdx(); if (pn->ch() == (pn+1)->ch()) return TState(pn->bol(), pn->bon()); else return st; } }
CThreadSlm::TState& CThreadSlm::historify(TState& st) { if (st.getLevel() >= m_N) { TLeaf* pl = ((TLeaf *)m_Levels[m_N]) + st.getIdx(); st.setLevel(pl->bol()); st.setIdx(pl->bon()); } else { TNode* pn = ((TNode *)m_Levels[st.getLevel()]) + st.getIdx(); if (pn->ch() == (pn+1)->ch()) { st.setLevel(pn->bol()); st.setIdx(pn->bon()); } } return st; }