#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
