Warning: session_start(): open(/var/lib/php/sessions/sess_dua0brelgl7cdv1j2s71efeh15, O_RDWR) failed: No space left on device (28) in /var/www/tb-usercake/models/config.php on line 51
Warning: session_start(): Failed to read session data: files (path: /var/lib/php/sessions) in /var/www/tb-usercake/models/config.php on line 51
sclass HuffmanTree is BitIO {
gettable Node root;
Leaf[] characterMap;
/*
algebraic Node {
constructor Branch {
settable Node zero;
settable Node one;
}
constructor Leaf {
settable byte literal;
}
}
*/
abstract class Node is BitIO {
settable Branch parent;
abstract void fillCharacterMap();
void buildSymbol(BitBuffer head, Node child) {
parent?.buildSymbol(head, this);
}
}
class Branch > Node {
gettable Node zero;
gettable Node one;
meta-for zero also as one {
selfType zero(Node zero) {
this.zero = zero;
zero.parent = this;
}
}
public void readWrite(BitHead head) {
head.exchangeBit(1);
head.exchange(zero, -> zero(readNode(head)));
head.exchange(one, -> one(readNode(head)));
}
void fillCharacterMap {
zero?.fillCharacterMap();
one?.fillCharacterMap();
}
void buildSymbol(BitBuffer head, Node child) {
head.add(child == one);
super.buildSymbol(head, child);
}
}
class Leaf > Node {
settable byte literal;
*() {}
*(int literal) { literal((byte) literal); }
byte get() { ret literal; }
public void readWrite(BitHead head) {
head.exchangeBit(0);
head.exchangeByte(literal, l1 literal);
}
void fillCharacterMap {
characterMap[ubyteToInt(literal)] = this;
}
}
void makeRootIfEmpty {
root ifNull = new Leaf(0);
}
Node readNode(BitHead head) {
Node node = head.peekBit() ? new Branch : new Leaf;
node.readWrite(head);
ret node;
}
public void readWrite(BitHead head) {
makeRootIfEmpty();
root.readWrite(head);
}
toString {
makeRootIfEmpty();
new LS out;
new StringBuilder symbol;
embedded void toString_collect(Node node) {
if (node cast Leaf) {
symbol.append("0");
out.add(symbol + ": " + /*ubyteToHex*/quote(codePoint(node!)));
removeLast(symbol);
} else {
cast node to Branch;
symbol.append("1");
toString_collect(node.zero());
toString_collect(node.one());
removeLast(symbol);
}
}
toString_collect(root);
ret lines(out);
}
selfType root(Node root) {
this.root = root;
makeCharacterMap();
this;
}
void makeCharacterMap {
characterMap = new Node[256];
root.fillCharacterMap();
}
void writeCharacter aka writeSymbol(int sym, BitHead head) {
sym &= 0xFF;
Leaf node = characterMap[sym];
if (node == null)
fail("Symbol cannot be encoded: " + sym);
new BitBuffer buffer;
node.buildSymbol(buffer, null);
for (int i = l(buffer)-1; i >= 0; i--)
head.writeBit(buffer.get(i));
}
}