예제 #1
0
        private static void SwapStates(CPpmd_State *t1, CPpmd_State *t2)
        {
            CPpmd_State tmp = *t1;

            *t1 = *t2;
            *t2 = tmp;
        }
예제 #2
0
        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);
        }