pair<vector<BSONObj>, vector<BSONObj>> IndexAccessMethod::setDifference(const BSONObjSet& left, const BSONObjSet& right) { // Two iterators to traverse the two sets in sorted order. auto leftIt = left.begin(); auto rightIt = right.begin(); vector<BSONObj> onlyLeft; vector<BSONObj> onlyRight; while (leftIt != left.end() && rightIt != right.end()) { const int cmp = leftIt->woCompare(*rightIt); if (cmp == 0) { // 'leftIt' and 'rightIt' compare equal using woCompare(), but may not be identical, // which should result in an index change. if (!leftIt->binaryEqual(*rightIt)) { onlyLeft.push_back(*leftIt); onlyRight.push_back(*rightIt); } ++leftIt; ++rightIt; continue; } else if (cmp > 0) { onlyRight.push_back(*rightIt); ++rightIt; } else { onlyLeft.push_back(*leftIt); ++leftIt; } } // Add the rest of 'left' to 'onlyLeft', and the rest of 'right' to 'onlyRight', if any. onlyLeft.insert(onlyLeft.end(), leftIt, left.end()); onlyRight.insert(onlyRight.end(), rightIt, right.end()); return {std::move(onlyLeft), std::move(onlyRight)}; }
Xauth * XauGetAuthByAddr ( #if NeedWidePrototypes unsigned int family, unsigned int address_length, #else unsigned short family, unsigned short address_length, #endif _Xconst char* address, #if NeedWidePrototypes unsigned int number_length, #else unsigned short number_length, #endif _Xconst char* number, #if NeedWidePrototypes unsigned int name_length, #else unsigned short name_length, #endif _Xconst char* name) { FILE *auth_file; char *auth_name; Xauth *entry; auth_name = XauFileName (); if (!auth_name) return NULL; if (access (auth_name, R_OK) != 0) /* checks REAL id */ return NULL; auth_file = fopen (auth_name, "rb"); if (!auth_file) return NULL; for (;;) { entry = XauReadAuth (auth_file); if (!entry) break; /* * Match when: * either family or entry->family are FamilyWild or * family and entry->family are the same and * address and entry->address are the same * and * either number or entry->number are empty or * number and entry->number are the same * and * either name or entry->name are empty or * name and entry->name are the same */ if ((family == FamilyWild || entry->family == FamilyWild || (entry->family == family && address_length == entry->address_length && binaryEqual (entry->address, address, address_length))) && (number_length == 0 || entry->number_length == 0 || (number_length == entry->number_length && binaryEqual (entry->number, number, number_length))) && (name_length == 0 || entry->name_length == 0 || (entry->name_length == name_length && binaryEqual (entry->name, name, name_length)))) break; XauDisposeAuth (entry); } (void) fclose (auth_file); return entry; }
Xauth * XauGetBestAuthByAddr ( #if NeedWidePrototypes unsigned int family, unsigned int address_length, #else unsigned short family, unsigned short address_length, #endif _Xconst char* address, #if NeedWidePrototypes unsigned int number_length, #else unsigned short number_length, #endif _Xconst char* number, int types_length, char** types, _Xconst int* type_lengths) { FILE *auth_file; char *auth_name; Xauth *entry; Xauth *best; int best_type; int type; #ifdef hpux char *fully_qual_address; unsigned short fully_qual_address_length; #endif auth_name = XauFileName (); if (!auth_name) return NULL; if (access (auth_name, R_OK) != 0) /* checks REAL id */ return NULL; auth_file = fopen (auth_name, "rb"); if (!auth_file) return NULL; #ifdef hpux if (family == FamilyLocal) { #ifdef XTHREADS_NEEDS_BYNAMEPARAMS _Xgethostbynameparams hparams; #endif struct hostent *hostp; /* make sure we try fully-qualified hostname */ if ((hostp = _XGethostbyname(address,hparams)) != NULL) { fully_qual_address = hostp->h_name; fully_qual_address_length = strlen(fully_qual_address); } else { fully_qual_address = NULL; fully_qual_address_length = 0; } } #endif /* hpux */ best = NULL; best_type = types_length; for (;;) { entry = XauReadAuth (auth_file); if (!entry) break; /* * Match when: * either family or entry->family are FamilyWild or * family and entry->family are the same and * address and entry->address are the same * and * either number or entry->number are empty or * number and entry->number are the same * and * either name or entry->name are empty or * name and entry->name are the same */ if ((family == FamilyWild || entry->family == FamilyWild || (entry->family == family && ((address_length == entry->address_length && binaryEqual (entry->address, address, (int)address_length)) #ifdef hpux || (family == FamilyLocal && fully_qual_address_length == entry->address_length && binaryEqual (entry->address, fully_qual_address, (int) fully_qual_address_length)) #endif ))) && (number_length == 0 || entry->number_length == 0 || (number_length == entry->number_length && binaryEqual (entry->number, number, (int)number_length)))) { if (best_type == 0) { best = entry; break; } for (type = 0; type < best_type; type++) if (type_lengths[type] == entry->name_length && !(strncmp (types[type], entry->name, entry->name_length))) { break; } if (type < best_type) { if (best) XauDisposeAuth (best); best = entry; best_type = type; if (type == 0) break; continue; } } XauDisposeAuth (entry); } (void) fclose (auth_file); return best; }
Xauth * XauGetBestAuthByAddr ( #if NeedWidePrototypes unsigned int family, unsigned int address_length, #else unsigned short family, unsigned short address_length, #endif _Xconst char* address, #if NeedWidePrototypes unsigned int number_length, #else unsigned short number_length, #endif _Xconst char* number, int types_length, char** types, _Xconst int* type_lengths) { FILE *auth_file; char *auth_name; Xauth *entry; Xauth *best; int best_type; int type; auth_name = XauFileName (); if (!auth_name) return 0; if (access (auth_name, R_OK) != 0) /* checks REAL id */ return 0; auth_file = fopen (auth_name, "rb"); if (!auth_file) return 0; best = 0; best_type = types_length; for (;;) { entry = XauReadAuth (auth_file); if (!entry) break; /* * Match when: * either family or entry->family are FamilyWild or * family and entry->family are the same and * address and entry->address are the same * and * either number or entry->number are empty or * number and entry->number are the same * and * either name or entry->name are empty or * name and entry->name are the same */ if ((family == FamilyWild || entry->family == FamilyWild || (entry->family == family && ((address_length == entry->address_length && binaryEqual (entry->address, address, (int)address_length)) ))) && (number_length == 0 || entry->number_length == 0 || (number_length == entry->number_length && binaryEqual (entry->number, number, (int)number_length)))) { if (best_type == 0) { best = entry; break; } for (type = 0; type < best_type; type++) if (type_lengths[type] == entry->name_length && !(strncmp (types[type], entry->name, entry->name_length))) { break; } if (type < best_type) { if (best) XauDisposeAuth (best); best = entry; best_type = type; if (type == 0) break; continue; } } XauDisposeAuth (entry); } (void) fclose (auth_file); return best; }