#pragma once #include #include #include "graph.hpp" std::ostream &operator<<(std::ostream &s, const Edge &e) { s << '{' << e.u << ',' << e.v << '}'; return s; } // Mathematica style export std::ostream &operator<<(std::ostream &s, const Graph &g) { if (g.edgeCount() == 0) { s << '{' << '}'; return s; } s << '{' << g.getEdge(0).u << '<' << '-' << '>' << g.getEdge(0).v; for (unsigned int i = 1; i < g.edgeCount(); ++i) { const Edge &e = g.getEdge(i); s << ',' << e.u << '<' << '-' << '>' << e.v; } s << '}'; return s; } template std::ostream& operator<<(std::ostream& s, const std::vector& v) { if (v.empty()) { s << '{' << '}'; return s; } auto iter = v.begin(); s << '{' << *iter++; for (; iter != v.end(); ++iter) { s << ',' << *iter; } s << '}'; return s; } // Mathematica style export for 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> 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; }