// // binary_output.hpp // // Created by Joshua Moerman on 05/22/11. // Copyright 2011 Vadovas. All rights reserved. // #ifndef BINARY_OUTPUT_HPP #define BINARY_OUTPUT_HPP #include // static_asserts are not too good... // Normal template struct binary { T thing; binary(T const t):thing(t) {} binary(binary const& c):thing(c.thing) {} }; template binary make_binary(T const t) { return binary(t); } template std::ostream& operator<<(std::ostream& out, binary const& rhs) { static_assert(std::is_pod::value, "Please specialise this function if your type is not POD"); static_assert(!std::is_pointer::value, "Writing pointer"); out.write(reinterpret_cast(&(rhs.thing)), sizeof(rhs.thing)); return out; } // Array // NOTE: it uses references... template struct binary_arr { T const(& thing)[N]; binary_arr(const T(& t)[N]):thing(t) {} binary_arr(binary_arr const& c):thing(c.thing) {} }; template binary_arr make_binary(const T(& t)[N]) { static_assert(N>=0, "lijp"); return binary_arr(t); } template std::ostream& operator<<(std::ostream& out, binary_arr const& rhs) { static_assert(std::is_pod::value, "Please specialise this function if your type is not POD"); static_assert(!std::is_pointer::value, "Writing pointer"); out.write(reinterpret_cast(&(rhs.thing)), sizeof(rhs.thing)); return out; } #endif // BINARY_OUTPUT_HPP