18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
|
#import "macros.h"
#import "OFInvalidFormatException.h"
OF_ASSUME_NONNULL_BEGIN
struct of_huffman_tree {
struct of_huffman_tree *_Nullable leaves[2];
uint16_t value;
};
static OF_INLINE bool
of_huffman_tree_walk(id _Nullable stream,
bool (*bitReader)(id _Nullable, uint16_t *_Nonnull, uint8_t),
struct of_huffman_tree *_Nonnull *_Nonnull tree, uint16_t *_Nonnull value)
{
struct of_huffman_tree *iter = *tree;
uint16_t bits;
while (iter->value == 0xFFFF) {
if OF_UNLIKELY (!bitReader(stream, &bits, 1)) {
*tree = iter;
return false;
}
|
|
|
|
>
|
|
|
|
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
|
#import "macros.h"
#import "OFInvalidFormatException.h"
OF_ASSUME_NONNULL_BEGIN
typedef struct OFHuffmanTree {
struct OFHuffmanTree *_Nullable leaves[2];
uint16_t value;
} OFHuffmanTree;
/* Inlined for performance. */
static OF_INLINE bool
OFHuffmanTreeWalk(id _Nullable stream,
bool (*bitReader)(id _Nullable, uint16_t *_Nonnull, uint8_t),
OFHuffmanTree *_Nonnull *_Nonnull tree, uint16_t *_Nonnull value)
{
struct OFHuffmanTree *iter = *tree;
uint16_t bits;
while (iter->value == 0xFFFF) {
if OF_UNLIKELY (!bitReader(stream, &bits, 1)) {
*tree = iter;
return false;
}
|
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
|
*value = iter->value;
return true;
}
#ifdef __cplusplus
extern "C" {
#endif
extern struct of_huffman_tree *_Nonnull of_huffman_tree_construct(
uint8_t lengths[_Nonnull], uint16_t count);
extern struct of_huffman_tree *_Nonnull of_huffman_tree_construct_single(
uint16_t value);
extern void of_huffman_tree_release(struct of_huffman_tree *_Nonnull tree);
#ifdef __cplusplus
}
#endif
OF_ASSUME_NONNULL_END
|
<
|
<
|
>
|
|
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
|
*value = iter->value;
return true;
}
#ifdef __cplusplus
extern "C" {
#endif
extern OFHuffmanTree *_Nonnull OFHuffmanTreeNew(uint8_t lengths[_Nonnull],
uint16_t count);
extern OFHuffmanTree *_Nonnull OFHuffmanTreeNewSingle(uint16_t value);
extern void OFHuffmanTreeFree(OFHuffmanTree *_Nonnull tree);
#ifdef __cplusplus
}
#endif
OF_ASSUME_NONNULL_END
|