2019-01-10 15:22:39 -08:00
|
|
|
#ifndef TREE_SITTER_LENGTH_H_
|
|
|
|
|
#define TREE_SITTER_LENGTH_H_
|
2014-09-26 16:15:07 -07:00
|
|
|
|
2016-10-05 14:02:49 -07:00
|
|
|
#include <stdlib.h>
|
2014-09-26 16:15:07 -07:00
|
|
|
#include <stdbool.h>
|
2019-01-04 17:33:34 -08:00
|
|
|
#include "./point.h"
|
2019-01-10 15:22:39 -08:00
|
|
|
#include "tree_sitter/api.h"
|
2014-09-26 16:15:07 -07:00
|
|
|
|
2016-10-05 14:02:49 -07:00
|
|
|
typedef struct {
|
2016-11-14 12:15:24 -08:00
|
|
|
uint32_t bytes;
|
2016-10-16 21:10:25 -07:00
|
|
|
TSPoint extent;
|
2016-11-09 20:59:05 -08:00
|
|
|
} Length;
|
2014-09-26 16:15:07 -07:00
|
|
|
|
2017-12-20 16:26:38 -08:00
|
|
|
static const Length LENGTH_UNDEFINED = {0, {0, 1}};
|
2018-11-07 12:56:44 -08:00
|
|
|
static const Length LENGTH_MAX = {UINT32_MAX, {UINT32_MAX, UINT32_MAX}};
|
2015-12-04 20:20:29 -08:00
|
|
|
|
2017-12-20 16:26:38 -08:00
|
|
|
static inline bool length_is_undefined(Length length) {
|
|
|
|
|
return length.bytes == 0 && length.extent.column != 0;
|
2015-12-04 20:20:29 -08:00
|
|
|
}
|
|
|
|
|
|
2016-11-09 20:59:05 -08:00
|
|
|
static inline Length length_min(Length len1, Length len2) {
|
2017-01-24 12:48:47 -08:00
|
|
|
return (len1.bytes < len2.bytes) ? len1 : len2;
|
2016-09-03 23:40:57 -07:00
|
|
|
}
|
|
|
|
|
|
2016-11-09 20:59:05 -08:00
|
|
|
static inline Length length_add(Length len1, Length len2) {
|
|
|
|
|
Length result;
|
2016-09-13 13:08:52 -07:00
|
|
|
result.bytes = len1.bytes + len2.bytes;
|
2016-11-09 20:59:05 -08:00
|
|
|
result.extent = point_add(len1.extent, len2.extent);
|
2014-09-26 16:31:30 -07:00
|
|
|
return result;
|
2014-09-26 16:15:07 -07:00
|
|
|
}
|
|
|
|
|
|
2016-11-09 20:59:05 -08:00
|
|
|
static inline Length length_sub(Length len1, Length len2) {
|
|
|
|
|
Length result;
|
2016-09-13 13:08:52 -07:00
|
|
|
result.bytes = len1.bytes - len2.bytes;
|
2016-11-09 20:59:05 -08:00
|
|
|
result.extent = point_sub(len1.extent, len2.extent);
|
2014-09-26 16:31:30 -07:00
|
|
|
return result;
|
2014-09-26 16:15:07 -07:00
|
|
|
}
|
|
|
|
|
|
2019-03-21 16:06:06 -07:00
|
|
|
static inline Length length_zero(void) {
|
2017-12-20 16:26:38 -08:00
|
|
|
Length result = {0, {0, 0}};
|
2017-08-08 10:47:59 -07:00
|
|
|
return result;
|
2015-11-12 15:32:53 -05:00
|
|
|
}
|
|
|
|
|
|
2022-08-25 10:20:40 -07:00
|
|
|
static inline Length length_saturating_sub(Length len1, Length len2) {
|
|
|
|
|
if (len1.bytes > len2.bytes) {
|
|
|
|
|
return length_sub(len1, len2);
|
|
|
|
|
} else {
|
|
|
|
|
return length_zero();
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
|
2014-09-26 16:15:07 -07:00
|
|
|
#endif
|