1 #ifndef TREE_SITTER_POINT_H_
2 #define TREE_SITTER_POINT_H_
3 
4 #include "tree_sitter/api.h"
5 
6 #define POINT_ZERO ((TSPoint) {0, 0})
7 #define POINT_MAX ((TSPoint) {UINT32_MAX, UINT32_MAX})
8 
point__new(unsigned row,unsigned column)9 static inline TSPoint point__new(unsigned row, unsigned column) {
10   TSPoint result = {row, column};
11   return result;
12 }
13 
point_add(TSPoint a,TSPoint b)14 static inline TSPoint point_add(TSPoint a, TSPoint b) {
15   if (b.row > 0)
16     return point__new(a.row + b.row, b.column);
17   else
18     return point__new(a.row, a.column + b.column);
19 }
20 
point_sub(TSPoint a,TSPoint b)21 static inline TSPoint point_sub(TSPoint a, TSPoint b) {
22   if (a.row > b.row)
23     return point__new(a.row - b.row, a.column);
24   else
25     return point__new(0, a.column - b.column);
26 }
27 
point_lte(TSPoint a,TSPoint b)28 static inline bool point_lte(TSPoint a, TSPoint b) {
29   return (a.row < b.row) || (a.row == b.row && a.column <= b.column);
30 }
31 
point_lt(TSPoint a,TSPoint b)32 static inline bool point_lt(TSPoint a, TSPoint b) {
33   return (a.row < b.row) || (a.row == b.row && a.column < b.column);
34 }
35 
point_eq(TSPoint a,TSPoint b)36 static inline bool point_eq(TSPoint a, TSPoint b) {
37   return a.row == b.row && a.column == b.column;
38 }
39 
point_min(TSPoint a,TSPoint b)40 static inline TSPoint point_min(TSPoint a, TSPoint b) {
41   if (a.row < b.row || (a.row == b.row && a.column < b.column))
42     return a;
43   else
44     return b;
45 }
46 
point_max(TSPoint a,TSPoint b)47 static inline TSPoint point_max(TSPoint a, TSPoint b) {
48   if (a.row > b.row || (a.row == b.row && a.column > b.column))
49     return a;
50   else
51     return b;
52 }
53 
54 #endif
55