template <class t> struct set_iterator { long long slot_number; data_file<t>* dp; set_iterator() {} set_iterator(data_file<t>* df_set, long long n) { slot_number = n; dp = df_set; } set_iterator(const set_iterator<t>& i) : slot_number(i.slot_number), dp(i.dp) {} t operator*() const { return dp->get(slot_number); } set_iterator<t>& operator++() { slot_number = next_slot(*(dp->_node_file), slot_number); return *this; } set_iterator<t> operator++(int) { set_iterator<t> save = *this; ++* this; return save; } set_iterator<t>& operator--() { slot_number = previous_slot(*(dp->_node_file), slot_number); return *this; } set_iterator<t> operator--(int) { set_iterator<t> save = *this; --* this; return save; } bool operator==(const set_iterator<t>& y) const { return slot_number == y.slot_number; } bool operator!=(const set_iterator<t>& y) const { return slot_number != y.slot_number; } bool is_header() const { return slot_number == 0; } };