diff options
Diffstat (limited to 'src/nvim/marktree.h')
-rw-r--r-- | src/nvim/marktree.h | 64 |
1 files changed, 41 insertions, 23 deletions
diff --git a/src/nvim/marktree.h b/src/nvim/marktree.h index 6d014b5742..c692cd8863 100644 --- a/src/nvim/marktree.h +++ b/src/nvim/marktree.h @@ -7,6 +7,7 @@ #include "klib/kvec.h" #include "nvim/assert.h" +#include "nvim/decoration_defs.h" #include "nvim/garray.h" #include "nvim/map.h" #include "nvim/pos.h" @@ -47,6 +48,8 @@ typedef struct { } MarkTreeIter; #define marktree_itr_valid(itr) ((itr)->x != NULL) +// accces raw key: flags in MT_FLAG_EXTERNAL_MASK and decor_data are safe to modify. +#define mt_itr_rawkey(itr) ((itr)->x->key[(itr)->i]) // Internal storage // @@ -56,10 +59,8 @@ typedef struct { MTPos pos; uint32_t ns; uint32_t id; - int32_t hl_id; uint16_t flags; - uint16_t priority; - Decoration *decor_full; + DecorInlineData decor_data; // "ext" tag in flags } MTKey; typedef struct { @@ -68,28 +69,40 @@ typedef struct { bool end_right_gravity; } MTPair; -#define MT_INVALID_KEY (MTKey) { { -1, -1 }, 0, 0, 0, 0, 0, NULL } +#define MT_INVALID_KEY (MTKey) { { -1, -1 }, 0, 0, 0, { .hl = DECOR_HIGHLIGHT_INLINE_INIT } } #define MT_FLAG_REAL (((uint16_t)1) << 0) #define MT_FLAG_END (((uint16_t)1) << 1) #define MT_FLAG_PAIRED (((uint16_t)1) << 2) // orphaned: the other side of this paired mark was deleted. this mark must be deleted very soon! #define MT_FLAG_ORPHANED (((uint16_t)1) << 3) -#define MT_FLAG_HL_EOL (((uint16_t)1) << 4) -#define MT_FLAG_NO_UNDO (((uint16_t)1) << 5) -#define MT_FLAG_INVALIDATE (((uint16_t)1) << 6) -#define MT_FLAG_INVALID (((uint16_t)1) << 7) - -#define DECOR_LEVELS 4 -#define MT_FLAG_DECOR_OFFSET 8 -#define MT_FLAG_DECOR_MASK (((uint16_t)(DECOR_LEVELS - 1)) << MT_FLAG_DECOR_OFFSET) +#define MT_FLAG_NO_UNDO (((uint16_t)1) << 4) +#define MT_FLAG_INVALIDATE (((uint16_t)1) << 5) +#define MT_FLAG_INVALID (((uint16_t)1) << 6) +// discriminant for union +#define MT_FLAG_DECOR_EXT (((uint16_t)1) << 7) + +// TODO(bfredl): flags for decorations. These cover the cases where we quickly needs +// to skip over irrelevant marks internally. When we refactor this more, also make all info +// for ExtmarkType included here +#define MT_FLAG_DECOR_HL (((uint16_t)1) << 8) +#define MT_FLAG_DECOR_SIGNTEXT (((uint16_t)1) << 9) +// TODO(bfredl): for now this means specifically number_hl, line_hl, cursorline_hl +// needs to clean up the name. +#define MT_FLAG_DECOR_SIGNHL (((uint16_t)1) << 10) +#define MT_FLAG_DECOR_VIRT_LINES (((uint16_t)1) << 11) +#define MT_FLAG_DECOR_VIRT_TEXT_INLINE (((uint16_t)1) << 12) // These _must_ be last to preserve ordering of marks #define MT_FLAG_RIGHT_GRAVITY (((uint16_t)1) << 14) #define MT_FLAG_LAST (((uint16_t)1) << 15) -#define MT_FLAG_EXTERNAL_MASK (MT_FLAG_DECOR_MASK | MT_FLAG_RIGHT_GRAVITY | MT_FLAG_HL_EOL \ - | MT_FLAG_NO_UNDO | MT_FLAG_INVALIDATE | MT_FLAG_INVALID) +#define MT_FLAG_DECOR_MASK (MT_FLAG_DECOR_EXT| MT_FLAG_DECOR_HL | MT_FLAG_DECOR_SIGNTEXT \ + | MT_FLAG_DECOR_SIGNHL | MT_FLAG_DECOR_VIRT_LINES \ + | MT_FLAG_DECOR_VIRT_TEXT_INLINE) + +#define MT_FLAG_EXTERNAL_MASK (MT_FLAG_DECOR_MASK | MT_FLAG_NO_UNDO \ + | MT_FLAG_INVALIDATE | MT_FLAG_INVALID) // this is defined so that start and end of the same range have adjacent ids #define MARKTREE_END_FLAG ((uint64_t)1) @@ -143,20 +156,22 @@ static inline bool mt_invalid(MTKey key) return key.flags & MT_FLAG_INVALID; } -static inline uint8_t marktree_decor_level(MTKey key) +static inline bool mt_decor_any(MTKey key) +{ + return key.flags & MT_FLAG_DECOR_MASK; +} + +static inline bool mt_decor_sign(MTKey key) { - return (uint8_t)((key.flags&MT_FLAG_DECOR_MASK) >> MT_FLAG_DECOR_OFFSET); + return key.flags & (MT_FLAG_DECOR_SIGNTEXT | MT_FLAG_DECOR_SIGNHL); } -static inline uint16_t mt_flags(bool right_gravity, bool hl_eol, bool no_undo, bool invalidate, - uint8_t decor_level) +static inline uint16_t mt_flags(bool right_gravity, bool no_undo, bool invalidate, bool decor_ext) { - assert(decor_level < DECOR_LEVELS); return (uint16_t)((right_gravity ? MT_FLAG_RIGHT_GRAVITY : 0) - | (hl_eol ? MT_FLAG_HL_EOL : 0) | (no_undo ? MT_FLAG_NO_UNDO : 0) | (invalidate ? MT_FLAG_INVALIDATE : 0) - | (decor_level << MT_FLAG_DECOR_OFFSET)); + | (decor_ext ? MT_FLAG_DECOR_EXT : 0)); } static inline MTPair mtpair_from(MTKey start, MTKey end) @@ -164,6 +179,11 @@ static inline MTPair mtpair_from(MTKey start, MTKey end) return (MTPair){ .start = start, .end_pos = end.pos, .end_right_gravity = mt_right(end) }; } +static inline DecorInline mt_decor(MTKey key) +{ + return (DecorInline){ .ext = key.flags & MT_FLAG_DECOR_EXT, .data = key.decor_data }; +} + typedef kvec_withinit_t(uint64_t, 4) Intersection; struct mtnode_s { @@ -186,8 +206,6 @@ static inline uint64_t mt_dbg_id(uint64_t id) typedef struct { MTNode *root; size_t n_keys, n_nodes; - // TODO(bfredl): the pointer to node could be part of the larger - // Map(uint64_t, ExtmarkItem) essentially; PMap(uint64_t) id2node[1]; } MarkTree; |