blob: cfc511b84b8e344a9909644a8a05a9fab9639ef7 [file] [log] [blame]
#ifndef VTR_PAIR_UTIL_H
#define VTR_PAIR_UTIL_H
#include "vtr_range.h"
namespace vtr {
//Iterator which derefernces the 'first' element of a std::pair iterator
template<typename PairIter>
class pair_first_iter {
public:
using iterator_category = std::bidirectional_iterator_tag;
using value_type = typename PairIter::value_type::first_type;
using difference_type = void;
using pointer = value_type*;
using reference = value_type&;
pair_first_iter(PairIter init): iter_(init) {}
auto operator++() { iter_++; return *this; }
auto operator--() { iter_--; return *this; }
auto operator*() { return iter_->first; }
auto operator->() { return &iter_->first; }
friend bool operator== (const pair_first_iter lhs, const pair_first_iter rhs) { return lhs.iter_ == rhs.iter_; }
friend bool operator!= (const pair_first_iter lhs, const pair_first_iter rhs) { return !(lhs == rhs); }
private:
PairIter iter_;
};
//Iterator which derefernces the 'second' element of a std::pair iterator
template<typename PairIter>
class pair_second_iter {
public:
using iterator_category = std::bidirectional_iterator_tag;
using value_type = typename PairIter::value_type::second_type;
using difference_type = void;
using pointer = value_type*;
using reference = value_type&;
pair_second_iter(PairIter init): iter_(init) {}
auto operator++() { iter_++; return *this; }
auto operator--() { iter_--; return *this; }
auto operator*() { return iter_->second; }
auto operator->() { return &iter_->second; }
friend bool operator== (const pair_second_iter lhs, const pair_second_iter rhs) { return lhs.iter_ == rhs.iter_; }
friend bool operator!= (const pair_second_iter lhs, const pair_second_iter rhs) { return !(lhs == rhs); }
private:
PairIter iter_;
};
} //namespace
#endif