Last change
on this file since 498 was
483,
checked in by hendrikvanantwerpen, 11 years ago
|
Added Dojo 1.9.3 release.
|
File size:
1.5 KB
|
Line | |
---|
1 | define([ |
---|
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.