private static void SwapStates(CPpmd_State *t1, CPpmd_State *t2) { CPpmd_State tmp = *t1; *t1 = *t2; *t2 = tmp; }
private static void Rescale(CPpmd7 p) { uint i, adder, sumFreq, escFreq; CPpmd_State *stats = STATS(p, p.MinContext); CPpmd_State *s = p.FoundState; { CPpmd_State tmp = *s; for (; s != stats; s--) { s[0] = s[-1]; } *s = tmp; } escFreq = (uint)p.MinContext->SummFreq - s->Freq; s->Freq += 4; adder = (p.OrderFall != 0) ? 1u : 0u; s->Freq = (byte)((s->Freq + adder) >> 1); sumFreq = s->Freq; i = (uint)p.MinContext->NumStats - 1; do { escFreq -= (++s)->Freq; s->Freq = (byte)((s->Freq + adder) >> 1); sumFreq += s->Freq; if (s[0].Freq > s[-1].Freq) { CPpmd_State *s1 = s; CPpmd_State tmp = *s1; do { s1[0] = s1[-1]; }while (--s1 != stats && tmp.Freq > s1[-1].Freq); *s1 = tmp; } }while (--i != 0); if (s->Freq == 0) { uint numStats = p.MinContext->NumStats; uint n0, n1; do { i++; } while ((--s)->Freq == 0); escFreq += i; p.MinContext->NumStats = (ushort)(p.MinContext->NumStats - i); if (p.MinContext->NumStats == 1) { CPpmd_State tmp = *stats; do { tmp.Freq = (byte)(tmp.Freq - (tmp.Freq >> 1)); escFreq >>= 1; }while (escFreq > 1); InsertNode(p, stats, U2I(p, ((numStats + 1) >> 1))); *(p.FoundState = ONE_STATE(p.MinContext)) = tmp; return; } n0 = (numStats + 1) >> 1; n1 = ((uint)p.MinContext->NumStats + 1) >> 1; if (n0 != n1) { p.MinContext->Stats = STATS_REF(p, ShrinkUnits(p, stats, n0, n1)); } } p.MinContext->SummFreq = (ushort)(sumFreq + escFreq - (escFreq >> 1)); p.FoundState = STATS(p, p.MinContext); }