+template <class A>
+struct iterator_pair : public std::pair<A, A> {
+ explicit iterator_pair(const A & first, const A & second) : std::pair<A, A>(first, second) {}
+};
+
+template <class A>
+const struct iterator_pair<A> make_iterator_pair(const A & first, const A & second) {
+ return iterator_pair<A>(first, second);
+}
+
+template <class A, class B>
+std::ostream & operator<<(std::ostream &o, const std::pair<A,B> &d) {
+ o << "<" << d.first << "," << d.second << ">";
+ return o;
+}
+
+template <class A>
+std::ostream & operator<<(std::ostream &o, const iterator_pair<A> &d) {
+ o << "[";
+ for (auto i=d.first; i!=d.second; i++) {
+ o << *i;
+ auto j(i);
+ if (++j != d.second)
+ o << ", ";
+ }
+ o << "]";
+ return o;
+}
+