#pragma once #include "friendly_fusion.hpp" #include #include #include #include #include #include //Workaround for argument dependent lookup namespace std { struct Outputter { template static typename std::enable_if::value, std::ostream&>::type output(std::ostream& os, I const& it, E const& end) { if(std::is_same::type>::type, bool>::value) { os << std::boolalpha; } os << friendly_fusion::deref(it); if(!std::is_same::type, E>::value) { os << ", "; } return Outputter::output(os, friendly_fusion::advance_c<1>(it), end); } template static typename std::enable_if::value, std::ostream&>::type output(std::ostream& os, I const&, E const&) { return os; } }; template std::ostream& operator<<(std::ostream& os, std::map map) { os << "{" << std::endl; for (auto&& x : map) { os << "\t{" << x.first << ", " << "{" << x.second << "}}" << std::endl; } os << "}" << std::endl; return os; } template std::ostream& operator<<(std::ostream& os, std::vector vec) { os << "{" << std::endl; for (auto&& x : vec) { os << "\t" << x << std::endl; } os << "}" << std::endl; return os; } template typename std::enable_if::value, std::ostream&>::type operator<<(std::ostream& os, T x) { return std::Outputter::output(os, friendly_fusion::begin(x), friendly_fusion::end(x)); } }