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)),
243 static 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));
Definition: mc-range-mincover-generator.template.h:104
struct _mongocrypt_status_t mongocrypt_status_t
Definition: mongocrypt.h:148