source: Dev/trunk/src/client/dojox/encoding/compression/splay.js @ 527

Last change on this file since 527 was 483, checked in by hendrikvanantwerpen, 11 years ago

Added Dojo 1.9.3 release.

File size: 1.5 KB
Line 
1define([
2        "dojo/_base/lang",      // dojo.extend
3        "../bits"
4], function(lang, bits) {
5        var compression = lang.getObject("dojox.encoding.compression", true);
6
7        compression.Splay = function(n){
8                this.up = new Array(2 * n + 1);
9                this.left = new Array(n);
10                this.right = new Array(n);
11                this.reset();
12        };
13
14        lang.extend(compression.Splay, {
15                reset: function(){
16                        for(var i = 1; i < this.up.length; this.up[i] = Math.floor((i - 1) / 2), ++i);
17                        for(var i = 0; i < this.left.length; this.left[i] = 2 * i + 1, this.right[i] = 2 * i + 2, ++i);
18                },
19                splay: function(i){
20                        var a = i + this.left.length;
21                        do{
22                                var c = this.up[a];
23                                if(c){  // root
24                                        // rotated pair
25                                        var d = this.up[c];
26                                        // swap descendants
27                                        var b = this.left[d];
28                                        if(c == b){
29                                                b = this.right[d];
30                                                this.right[d] = a;
31                                        } else {
32                                                this.left[d] = a;
33                                        }
34                                        this[a == this.left[c] ? "left" : "right"][c] = b;
35                                        this.up[a] = d;
36                                        this.up[b] = c;
37                                        a = d;
38                                }else{
39                                        a = c;
40                                }
41                        }while(a);      // root
42                },
43                encode: function(value, stream){
44                        var s = [], a = value + this.left.length;
45                        do{
46                                s.push(this.right[this.up[a]] == a);
47                                a = this.up[a];
48                        }while(a);      // root
49                        this.splay(value);
50                        var l = s.length;
51                        while(s.length){ stream.putBits(s.pop() ? 1 : 0, 1); }
52                        return  l;
53                },
54                decode: function(stream){
55                        var a = 0;      // root;
56                        do{
57                                a = this[stream.getBits(1) ? "right" : "left"][a];
58                        }while(a < this.left.length);
59                        a -= this.left.length;
60                        this.splay(a);
61                        return  a;
62                }
63        });
64
65
66        return compression.Splay;
67});
Note: See TracBrowser for help on using the repository browser.