diff --git a/cpp/exports.hpp b/cpp/exports.hpp index 58a682ccb6d467bfddd064669fd7f762dbffb095..5ffee273d0ffcfd4d78c849830e69d484b1e361f 100644 --- a/cpp/exports.hpp +++ b/cpp/exports.hpp @@ -1,7 +1,8 @@ #pragma once +#include "graph.hpp" +#include #include #include -#include "graph.hpp" std::ostream &operator<<(std::ostream &s, const Edge &e) { s << '{' << e.u << ',' << e.v << '}'; @@ -23,36 +24,37 @@ std::ostream &operator<<(std::ostream &s, const Graph &g) { return s; } -template -std::ostream& operator<<(std::ostream& s, const std::vector& v) { - if (v.empty()) { +template +std::ostream& output_array(std::ostream& s, FwdIterator begin, + FwdIterator end) { + if (begin == end) { s << '{' << '}'; return s; } - auto iter = v.begin(); - s << '{' << *iter++; - for (; iter != v.end(); ++iter) { - s << ',' << *iter; + s << '{' << *begin++; + for (; begin != end; ++begin) { + s << ',' << *begin; } s << '}'; return s; } -// Mathematica style export for arrays +template +std::ostream& operator<<(std::ostream& s, const std::vector& v) { + return output_array(s, std::begin(v), std::end(v)); +} + +// Mathematica style export for normal arrays // SFINAE to disable char arrays since it will mess up // things of the form s << "some string"; template < typename T, std::size_t N, - typename = typename std::enable_if::value, T>::type> + typename = typename std::enable_if::value>::type> std::ostream& operator<<(std::ostream& s, const T (&v)[N]) { - if (N == 0) { - s << '{' << '}'; - return s; - } - s << '{' << v[0]; - for (size_t i = 1; i < N; ++i) - s << ',' << v[i]; - s << '}'; - return s; + return output_array(s, std::begin(v), std::end(v)); } +template +std::ostream& operator<<(std::ostream& s, const std::array& v) { + return output_array(s, std::begin(v), std::end(v)); +}