#pragma once #include "types.hpp" #include "index_list.hpp" #include #include #include #include #include namespace binparse { std::string to_string(Magic16 magic); //overload inside this namespace to output unsigned char as value not as characters. std::ostream& operator<<(std::ostream& os, uint8_t); std::ostream& operator<<(std::ostream& os, Value8 v); std::ostream& operator<<(std::ostream& os, Offset8 o); std::ostream& operator<<(std::ostream& os, Magic16 m); std::ostream& operator<<(std::ostream& os, Value16 v); std::ostream& operator<<(std::ostream& os, Offset16 o); std::ostream& operator<<(std::ostream& os, Value32 v); std::ostream& operator<<(std::ostream& os, Offset32 o); std::ostream& operator<<(std::ostream& os, std::array a); std::ostream& operator<<(std::ostream& os, std::array a); std::ostream& operator<<(std::ostream& os, std::vector vec); template ::value>::type* = nullptr> std::ostream& operator<<(std::ostream&, T const&); template std::ostream& output_impl(std::ostream& os, T const&, indices<>) { return os; } template std::ostream& output_impl(std::ostream& os, T const& t, indices) { os << boost::fusion::extension::struct_member_name::call() << ": " << boost::fusion::at_c(t) << std::endl; return output_impl(os, t, indices{}); } template ::value>::type*> std::ostream& operator<<(std::ostream& os, T const& t) { typedef typename build_indices::value>::type indices; return output_impl(os, t, indices{}); } }