#pragma once #include "types.hpp" #include "index_list.hpp" #include #include #include #include #include #include #include #include namespace binparse { template constexpr bool bit(unsigned char bit, T const& t) { return t & T(std::pow(2, bit)); } struct UnexpectedEOS : public std::runtime_error { UnexpectedEOS(); UnexpectedEOS(std::string location); }; template::value>::type* = nullptr> T parse(std::istream& is, std::string name); template<> uint8_t parse(std::istream& is, std::string name); template<> uint16_t parse(std::istream& is, std::string name); template<> uint32_t parse(std::istream& is, std::string name); template<> Magic16 parse(std::istream& is, std::string name); template<> Value16 parse(std::istream& is, std::string name); template<> Offset16 parse(std::istream& is, std::string name); template<> Value32 parse(std::istream& is, std::string name); template<> Offset32 parse(std::istream& is, std::string name); template<> PString8 parse(std::istream& is, std::string name); template<> std::array parse>(std::istream& is, std::string name); template<> std::array parse>(std::istream& is, std::string name); template ::value>::type* = nullptr> T parse(std::istream& is); template T parse_impl(std::istream& is, indices) { return {parse::type>::type>(is, boost::fusion::extension::struct_member_name::call())...}; } template ::value>::type*> T parse(std::istream& is) { typedef typename build_indices::value>::type indices; return parse_impl(is, indices{}); } void dump_bytes(std::istream& is, std::vector& buffer, std::string name); }