void DocumentStructureEnumerator::_enumerateFixedLenArrs( const DocumentStructureEnumeratorConfig& config, const ScalarGenerator* scalarGenerator, BSONArray arr, std::vector<BSONArray>* arrs) { if (!config.length) { // Base case: no more room for any other elements. arrs->push_back(arr); return; } // Otherwise, go through our choices, similar to the approach to documents. // DocumentStructureEnumeratorConfig nextElementConfig(config); nextElementConfig.length--; // Scalar. BSONArrayBuilder scalarArr = _getArrayBuilderFromArr(arr); scalarGenerator->generateScalar().addToBsonArray(&scalarArr); _enumerateFixedLenArrs(nextElementConfig, scalarGenerator, scalarArr.arr(), arrs); if (config.depth <= 0) { return; } DocumentStructureEnumeratorConfig nextLayerConfig(config); nextLayerConfig.depth--; nextLayerConfig.length += arr.nFields(); // Subarray. std::vector<BSONArray> subArrs = _enumerateArrs(nextLayerConfig, scalarGenerator); for (auto subArr : subArrs) { BSONArrayBuilder arrayArr = _getArrayBuilderFromArr(arr); arrayArr.append(subArr); _enumerateFixedLenArrs(nextElementConfig, scalarGenerator, arrayArr.arr(), arrs); } // Document. if (!config.skipSubDocs) { BSONObj blankDoc; std::vector<BSONObj> subDocs; _enumerateDocs(nextLayerConfig, scalarGenerator, blankDoc, &subDocs); for (auto subDoc : subDocs) { BSONArrayBuilder docArr = _getArrayBuilderFromArr(arr); docArr.append(subDoc); _enumerateFixedLenArrs(nextElementConfig, scalarGenerator, docArr.arr(), arrs); } } return; }