#ifndef HUFF_H
#define HUFF_H

union HuffNode;

struct HuffData {
    unsigned value : 31;
    unsigned isLeaf : 1;
};

struct HuffLeaf {
    struct HuffData header;
    unsigned char key;
};

struct HuffBranch {
    struct HuffData header;
    union HuffNode* left;
    union HuffNode* right;
};

union HuffNode {
    struct HuffData header;
    struct HuffLeaf leaf;
    struct HuffBranch branch;
};

typedef union HuffNode HuffNode_t;

struct BitEncoding {
    unsigned long long nbits : 6;
    unsigned long long bitstring : 58;
};

unsigned char* HuffCompress(unsigned char* buffer, int srcSize, int* compressedSize_p, int bitDepth);
unsigned char* HuffDecompress(unsigned char* buffer, int srcSize, int* uncompressedSize_p);

#endif // HUFF_H
