diff --git a/src/mongo/bson/bsontypes.h b/src/mongo/bson/bsontypes.h index 50588789dc..8936d44c6d 100644 --- a/src/mongo/bson/bsontypes.h +++ b/src/mongo/bson/bsontypes.h @@ -212,49 +212,36 @@ bool isValidBinDataType(int type); * Note: if the order changes, indexes have to be re-built or than can be corruption */ inline int canonicalizeBSONType(BSONType type) { - switch (type) { - case MinKey: - case MaxKey: - return type; - case EOO: - case Undefined: - return 0; - case jstNULL: - return 5; - case NumberDecimal: - case NumberDouble: - case NumberInt: - case NumberLong: - return 10; - case mongo::String: - case Symbol: - return 15; - case Object: - return 20; - case mongo::Array: - return 25; - case BinData: - return 30; - case jstOID: - return 35; - case mongo::Bool: - return 40; - case mongo::Date: - return 45; - case bsonTimestamp: - return 47; - case RegEx: - return 50; - case DBRef: - return 55; - case Code: - return 60; - case CodeWScope: - return 65; - default: - verify(0); - return -1; - } + constexpr static auto mapper = [] { + auto out = std::array(); // Value-init everything to 0 by default. + out[uint8_t(MinKey)] = MinKey; + out[uint8_t(MaxKey)] = MaxKey; + out[uint8_t(EOO)] = // + out[uint8_t(Undefined)] = // + 0; + out[uint8_t(jstNULL)] = 5; + out[uint8_t(NumberDecimal)] = // + out[uint8_t(NumberDouble)] = // + out[uint8_t(NumberInt)] = // + out[uint8_t(NumberLong)] = // + 10; + out[uint8_t(mongo::String)] = // + out[uint8_t(Symbol)] = // + 15; + out[uint8_t(Object)] = 20; + out[uint8_t(mongo::Array)] = 25; + out[uint8_t(BinData)] = 30; + out[uint8_t(jstOID)] = 35; + out[uint8_t(mongo::Bool)] = 40; + out[uint8_t(mongo::Date)] = 45; + out[uint8_t(bsonTimestamp)] = 47; + out[uint8_t(RegEx)] = 50; + out[uint8_t(DBRef)] = 55; + out[uint8_t(Code)] = 60; + out[uint8_t(CodeWScope)] = 65; + return out; + }(); + return mapper[uint8_t(type)]; } template