SameBoy/HexFiend/HFGlyphTrie.h

50 lines
1.6 KiB
C
Raw Normal View History

/* HFGlyphTrie is used to represent a trie of glyphs that allows multiple concurrent readers, along with one writer. */
#import <ApplicationServices/ApplicationServices.h>
/* BranchFactor is in bits */
#define kHFGlyphTrieBranchFactor 4
#define kHFGlyphTrieBranchCount (1 << kHFGlyphTrieBranchFactor)
typedef uint16_t HFGlyphFontIndex;
#define kHFGlyphFontIndexInvalid ((HFGlyphFontIndex)(-1))
#define kHFGlyphInvalid kCGFontIndexInvalid
struct HFGlyph_t {
HFGlyphFontIndex fontIndex;
CGGlyph glyph;
};
static inline BOOL HFGlyphEqualsGlyph(struct HFGlyph_t a, struct HFGlyph_t b) __attribute__((unused));
static inline BOOL HFGlyphEqualsGlyph(struct HFGlyph_t a, struct HFGlyph_t b) {
return a.glyph == b.glyph && a.fontIndex == b.fontIndex;
}
struct HFGlyphTrieBranch_t {
__strong void *children[kHFGlyphTrieBranchCount];
};
struct HFGlyphTrieLeaf_t {
struct HFGlyph_t glyphs[kHFGlyphTrieBranchCount];
};
struct HFGlyphTrie_t {
uint8_t branchingDepth;
struct HFGlyphTrieBranch_t root;
};
/* Initializes a trie witha given key size */
__private_extern__ void HFGlyphTrieInitialize(struct HFGlyphTrie_t *trie, uint8_t keySize);
/* Inserts a glyph into the trie */
__private_extern__ void HFGlyphTrieInsert(struct HFGlyphTrie_t *trie, NSUInteger key, struct HFGlyph_t value);
/* Attempts to fetch a glyph. If the glyph is not present, returns an HFGlyph_t set to all bits 0. */
__private_extern__ struct HFGlyph_t HFGlyphTrieGet(const struct HFGlyphTrie_t *trie, NSUInteger key);
/* Frees all storage associated with a glyph tree. This is not necessary to call under GC. */
__private_extern__ void HFGlyphTreeFree(struct HFGlyphTrie_t * trie);