Mercurial > hg
comparison mercurial/cext/revlog.c @ 40705:4ec6a24029d2
sparse-revlog: add a `index_segment_span` function in C
We are about to implement a native version of `slicechunktodensity`. For
clarity, we introduce the helper functions first. This new function provides
an efficient way to retrieve some of the information needed by
`slicechunktodensity`.
author | Boris Feld <boris.feld@octobus.net> |
---|---|
date | Fri, 09 Nov 2018 18:43:16 +0100 |
parents | 7da3729d4b45 |
children | 0650be877a37 |
comparison
equal
deleted
inserted
replaced
40704:7da3729d4b45 | 40705:4ec6a24029d2 |
---|---|
1046 return result; | 1046 return result; |
1047 | 1047 |
1048 bail: | 1048 bail: |
1049 Py_DECREF(chain); | 1049 Py_DECREF(chain); |
1050 return NULL; | 1050 return NULL; |
1051 } | |
1052 | |
1053 static inline int64_t | |
1054 index_segment_span(indexObject *self, Py_ssize_t start_rev, Py_ssize_t end_rev) | |
1055 { | |
1056 int64_t start_offset; | |
1057 int64_t end_offset; | |
1058 int end_size; | |
1059 start_offset = index_get_start(self, start_rev); | |
1060 if (start_offset < 0) { | |
1061 return -1; | |
1062 } | |
1063 end_offset = index_get_start(self, end_rev); | |
1064 if (end_offset < 0) { | |
1065 return -1; | |
1066 } | |
1067 end_size = index_get_length(self, end_rev); | |
1068 if (end_size < 0) { | |
1069 return -1; | |
1070 } | |
1071 if (end_offset < start_offset) { | |
1072 PyErr_Format(PyExc_ValueError, | |
1073 "corrupted revlog index: inconsistent offset " | |
1074 "between revisions (%zd) and (%zd)", | |
1075 start_rev, end_rev); | |
1076 return -1; | |
1077 } | |
1078 return (end_offset - start_offset) + (int64_t)end_size; | |
1051 } | 1079 } |
1052 | 1080 |
1053 static inline int nt_level(const char *node, Py_ssize_t level) | 1081 static inline int nt_level(const char *node, Py_ssize_t level) |
1054 { | 1082 { |
1055 int v = node[level >> 1]; | 1083 int v = node[level >> 1]; |