// Этот код не используется, но почти работоспособен. Нужно для быстрой проверки принадлежности пакета диапазонам провайдера /* void insert_prefix_bitwise_tree(tree_leaf* root, string subnet, int cidr_mask) { uint32_t netmask_as_int = convert_ip_as_string_to_uint(subnet); //std::cout<(netmask_as_int)<= 32 - cidr_mask; i--) { uint32_t result_bit = netmask_as_int & (1 << i); bool bit = result_bit == 0 ? false : true; //cout<<"Insert: "<right != NULL) { // ок, элемент уже есть, просто переключаем указатель temp_root = temp_root->right; } else { // элемента нету, его нужно создать tree_leaf* new_leaf = new tree_leaf; new_leaf->right = new_leaf->left = NULL; new_leaf->bit = bit; temp_root->right = new_leaf; temp_root = new_leaf; } } else { // проверим левое поддерево if (temp_root->left != NULL) { // ок, элемент уже есть, просто переключаем указатель на левый temp_root = temp_root->left; } else { // элемента нету, его нужно создать tree_leaf* new_leaf = new tree_leaf; new_leaf->right = new_leaf->left = NULL; new_leaf->bit = bit; temp_root->left = new_leaf; temp_root = new_leaf; } } } // #include // std::cout<(netmask_as_int)<left == NULL && temp_root->right == NULL) ) { return false; } // convert to host byte order ip = ntohl(ip); int bits_matched = 0; for (int i= 31; i >= 0; i--) { uint32_t result_bit = ip & (1 << i); bool bit = result_bit == 0 ? false : true; // Текущий узел - терминальный if ( (temp_root->left == NULL && temp_root->right == NULL)) { if (bits_matched > 0) { // если более дочерних элементов нету (узел терминальный!) и совпадение хотя бы с одним битом - мы нашли маску return true; } else { // обход кончился и мы ничего не нашли return false; } } if (bit) { // смотрим правое поддерево if (temp_root->right != NULL) { // идем далее temp_root = temp_root->right; bits_matched++; } else { // справа ничего нету, но может быть слева if (temp_root->left != NULL) { return false; } else { // рассмотрено выше } } } else { if (temp_root->left != NULL) { // идем влево temp_root = temp_root->left; bits_matched++; } else { // слева ничего нету, но может быть спарва if (temp_root->right != NULL) { return false; } else { // рассмотрено выше } } } } // это повтор аналогичной проверки в начале цикла, но это требуется, так как мы можем пройти цикл и не налететь на вариант, что мы достигли терминала - оба потомка стали нулл if ( (temp_root->left == NULL && temp_root->right == NULL)) { if (bits_matched > 0) { // если более дочерних элементов нету (узел терминальный!) и совпадение хотя бы с одним битом - мы нашли маску //std::cout<<"Bits matched: "<