2019-06-13 15:42:39 -05:00
|
|
|
#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 {
|
2020-01-03 17:14:42 -06:00
|
|
|
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&;
|
2019-06-13 15:42:39 -05:00
|
|
|
|
2020-01-03 17:14:42 -06:00
|
|
|
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; }
|
2019-06-13 15:42:39 -05:00
|
|
|
|
2020-01-03 17:14:42 -06:00
|
|
|
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); }
|
2019-06-13 15:42:39 -05:00
|
|
|
|
2020-01-03 17:14:42 -06:00
|
|
|
private:
|
|
|
|
PairIter iter_;
|
2019-06-13 15:42:39 -05:00
|
|
|
};
|
|
|
|
|
|
|
|
//Iterator which derefernces the 'second' element of a std::pair iterator
|
|
|
|
template<typename PairIter>
|
|
|
|
class pair_second_iter {
|
2020-01-03 17:14:42 -06:00
|
|
|
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&;
|
2019-06-13 15:42:39 -05:00
|
|
|
|
2020-01-03 17:14:42 -06:00
|
|
|
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; }
|
2019-06-13 15:42:39 -05:00
|
|
|
|
2020-01-03 17:14:42 -06:00
|
|
|
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); }
|
2019-06-13 15:42:39 -05:00
|
|
|
|
2020-01-03 17:14:42 -06:00
|
|
|
private:
|
|
|
|
PairIter iter_;
|
2019-06-13 15:42:39 -05:00
|
|
|
};
|
|
|
|
|
2020-01-03 17:14:42 -06:00
|
|
|
} // namespace vtr
|
2019-06-13 15:42:39 -05:00
|
|
|
#endif
|