static void qd_iterator_free_hash_segments(qd_iterator_t *iter) { qd_hash_segment_t *seg = DEQ_HEAD(iter->hash_segments); while (seg) { DEQ_REMOVE_HEAD(iter->hash_segments); free_qd_hash_segment_t(seg); seg = DEQ_HEAD(iter->hash_segments); } }
bool qd_iterator_next_segment(qd_iterator_t *iter, uint32_t *hash) { qd_hash_segment_t *hash_segment = DEQ_TAIL(iter->hash_segments); if (!hash_segment) return false; *hash = hash_segment->hash; qd_iterator_trim_view(iter, hash_segment->segment_length); DEQ_REMOVE_TAIL(iter->hash_segments); free_qd_hash_segment_t(hash_segment); return true; }
bool qd_iterator_hash_and_reset(qd_field_iterator_t *iter, uint32_t *hash) { qd_hash_segment_t *hash_segment = DEQ_TAIL(iter->hash_segments); if (!hash_segment) return false; *hash = hash_segment->hash; // Get the length of the hashed segment and set it on the iterator so that the iterator can only advance till that length // Check for a non empty iter->prefix and reduce the segment length by 1 if (iter->view_prefix) { if (iter->prefix == 'M') iter->view_start_pointer.length = hash_segment->segment_length - 2; else iter->view_start_pointer.length = hash_segment->segment_length - 1; } // Remove the tail from the hash segments since we have already compared it. DEQ_REMOVE_TAIL(iter->hash_segments); free_qd_hash_segment_t(hash_segment); return true; }