aboutsummaryrefslogtreecommitdiff
path: root/src/tree_sitter/bits.h
blob: ce7a71556704bf51f66c604afb76f489babb17b5 (plain) (blame)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
#ifndef TREE_SITTER_BITS_H_
#define TREE_SITTER_BITS_H_

#include <stdint.h>

static inline uint32_t bitmask_for_index(uint16_t id) {
  return (1u << (31 - id));
}

#if defined _WIN32 && !defined __GNUC__

#include <intrin.h>

static inline uint32_t count_leading_zeros(uint32_t x) {
  if (x == 0) return 32;
  uint32_t result;
  _BitScanReverse(&result, x);
  return 31 - result;
}

#else

static inline uint32_t count_leading_zeros(uint32_t x) {
  if (x == 0) return 32;
  return __builtin_clz(x);
}

#endif
#endif  // TREE_SITTER_BITS_H_