23#define CONCAT_1(a, b) a##b
24#define CONCAT(a, b) CONCAT_1 (a, b)
29#define CONCAT3(a, b, c) CONCAT (a, CONCAT (b, c))
32#if !(defined(UINT_T) && defined(UINT_C) && defined(UINT_FMT_S) && \
33 defined(DECORATE_NAME))
34#ifdef __INTELLISENSE__
35#define UINT_T uint32_t
36#define UINT_C UINT32_C
37#define UINT_FMT_S PRIu32
38#define DECORATE_NAME(Name) Name##_u32
40#error All of UINT_T, UINT_C, UINT_FMT_S, UINT_FMT_ARG, and DECORATE_NAME must be defined before #including this file
44#define BITS (sizeof (UINT_T) * CHAR_BIT)
46#define ZERO UINT_C (0)
50#define UINT_FMT_ARG(X) X
55#define UINT_LESSTHAN(A, B) ((A) < (B))
59#define MC_UINT_MAX ~(UINT_C (0))
64#define UINT_ADD(A, B) ((A) + (B))
67#define UINT_SUB(A, B) ((A) - (B))
81#define UINT_LSHIFT DECORATE_NAME (_mc_default_lshift)
85#define UINT_BITOR(A, B) ((A) | (B))
91 if (UINT_LESSTHAN (lhs, rhs)) {
93 }
else if (UINT_LESSTHAN (rhs, lhs)) {
100#define UINT_COMPARE DECORATE_NAME (_mc_compare)
119 BSON_ASSERT_PARAM (status);
121 if (UINT_COMPARE (rangeMin, rangeMax) > 0) {
122 CLIENT_ERR (
"Range min (%" UINT_FMT_S
123 ") must be less than or equal to range max (%" UINT_FMT_S
124 ") for range search",
125 UINT_FMT_ARG (rangeMin),
126 UINT_FMT_ARG (rangeMax));
129 if (UINT_COMPARE (rangeMax, max) > 0) {
130 CLIENT_ERR (
"Range max (%" UINT_FMT_S
131 ") must be less than or equal to max (%" UINT_FMT_S
132 ") for range search",
133 UINT_FMT_ARG (rangeMax),
139 CLIENT_ERR (
"Sparsity must be > 0");
144 mcg->_rangeMin = rangeMin;
145 mcg->_rangeMax = rangeMax;
146 mcg->_maxlen = (size_t) BITS -
DECORATE_NAME (mc_count_leading_zeros) (max);
147 mcg->_sparsity = sparsity;
163 const UINT_T ones = MC_UINT_MAX;
165 BSON_ASSERT (maskedBits <= (
size_t) BITS);
166 BSON_ASSERT (maskedBits >= 0);
168 if (maskedBits == 0) {
172 const size_t shift = ((size_t) BITS - maskedBits);
173 const UINT_T mask = UINT_LSHIFT (ones, -(
int) shift);
174 return UINT_BITOR (value, mask);
181 BSON_ASSERT_PARAM (mcg);
182 size_t level = mcg->_maxlen - maskedBits;
183 return 0 == maskedBits || 0 == (level % mcg->_sparsity);
188 DECORATE_NAME (MinCoverGenerator) * mcg, UINT_T start,
size_t maskedBits)
190 BSON_ASSERT_PARAM (mcg);
191 BSON_ASSERT (maskedBits <= mcg->_maxlen);
192 BSON_ASSERT (maskedBits <= (
size_t) BITS);
193 BSON_ASSERT (maskedBits >= 0);
195 if (maskedBits == mcg->_maxlen) {
196 return bson_strdup (
"root");
199 UINT_T shifted = UINT_LSHIFT (start, -(
int) maskedBits);
200 mc_bitstring valueBin =
DECORATE_NAME (mc_convert_to_bitstring) (shifted);
202 bson_strndup (valueBin.str + ((
size_t) BITS - mcg->_maxlen + maskedBits),
203 mcg->_maxlen + maskedBits);
214 BSON_ASSERT_PARAM (mcg);
215 BSON_ASSERT_PARAM (c);
216 const UINT_T blockEnd =
DECORATE_NAME (applyMask) (blockStart, maskedBits);
218 if (UINT_COMPARE (blockEnd, mcg->_rangeMin) < 0 ||
219 UINT_COMPARE (blockStart, mcg->_rangeMax) > 0) {
223 if (UINT_COMPARE (blockStart, mcg->_rangeMin) >= 0 &&
224 UINT_COMPARE (blockEnd, mcg->_rangeMax) <= 0 &&
225 DECORATE_NAME (MinCoverGenerator_isLevelStored) (mcg, maskedBits)) {
227 mcg, blockStart, maskedBits);
228 _mc_array_append_val (c, edge);
232 BSON_ASSERT (maskedBits > 0);
234 const size_t newBits = maskedBits - 1u;
235 DECORATE_NAME (MinCoverGenerator_minCoverRec) (mcg, c, blockStart, newBits);
239 UINT_BITOR (blockStart, UINT_LSHIFT (UINT_C (1), (
int) newBits)),
243static inline mc_mincover_t *
247 BSON_ASSERT_PARAM (mcg);
248 mc_mincover_t *mc = mc_mincover_new ();
250 (mcg, &mc->mincover, ZERO, mcg->_maxlen);
260 bool includeLowerBound,
263 bool includeUpperBound,
267 BSON_ASSERT_PARAM (lowerBound);
268 BSON_ASSERT_PARAM (upperBound);
270 if (!includeLowerBound) {
271 if (UINT_COMPARE (*lowerBound, max) >= 0) {
272 CLIENT_ERR (
"Lower bound (%" UINT_FMT_S
273 ") must be less than the range maximum (%" UINT_FMT_S
274 ") if lower bound is excluded from range.",
275 UINT_FMT_ARG (*lowerBound),
279 *lowerBound = UINT_ADD (*lowerBound, UINT_C (1));
281 if (!includeUpperBound) {
282 if (UINT_COMPARE (*upperBound, min) <= 0) {
283 CLIENT_ERR (
"Upper bound (%" UINT_FMT_S
284 ") must be greater than the range minimum (%" UINT_FMT_S
285 ") if upper bound is excluded from range.",
286 UINT_FMT_ARG (*upperBound),
290 *upperBound = UINT_SUB (*upperBound, UINT_C (1));
struct _mongocrypt_status_t mongocrypt_status_t
Definition: mongocrypt.h:148
Definition: mc-range-mincover-generator.template.h:104