diff options
Diffstat (limited to 'binparse/parse.hpp')
| -rw-r--r-- | binparse/parse.hpp | 75 |
1 files changed, 75 insertions, 0 deletions
diff --git a/binparse/parse.hpp b/binparse/parse.hpp new file mode 100644 index 0000000..8015ba3 --- /dev/null +++ b/binparse/parse.hpp @@ -0,0 +1,75 @@ +#pragma once + +#include "types.hpp" + +#include "index_list.hpp" + +#include <boost/fusion/support/is_sequence.hpp> +#include <boost/fusion/sequence/intrinsic/at_c.hpp> +#include <boost/fusion/adapted/struct/detail/extension.hpp> + +#include <stdexcept> +#include <array> +#include <vector> + +namespace binparse { + +struct UnexpectedEOS : public std::runtime_error { + UnexpectedEOS(); + + UnexpectedEOS(std::string location); +}; + +template<typename T, typename std::enable_if<!boost::fusion::traits::is_sequence<T>::value>::type* = nullptr> +T parse(std::istream& is, std::string name); + +template<> +uint8_t parse<uint8_t>(std::istream& is, std::string name); + +template<> +uint16_t parse<uint16_t>(std::istream& is, std::string name); + +template<> +uint32_t parse<uint32_t>(std::istream& is, std::string name); + +template<> +Magic16 parse<Magic16>(std::istream& is, std::string name); + +template<> +Value16 parse<Value16>(std::istream& is, std::string name); + +template<> +Offset16 parse<Offset16>(std::istream& is, std::string name); + +template<> +Value32 parse<Value32>(std::istream& is, std::string name); + +template<> +Offset32 parse<Offset32>(std::istream& is, std::string name); + +template<> +std::array<uint8_t, 8> parse<std::array<uint8_t, 8>>(std::istream& is, std::string name); + +template<> +std::array<uint8_t, 22> parse<std::array<uint8_t, 22>>(std::istream& is, std::string name); + +template <typename T, typename std::enable_if<boost::fusion::traits::is_sequence<T>::value>::type* = nullptr> +T parse(std::istream& is); + +template <typename T, int... Indices> +T parse_impl(std::istream& is, indices<Indices...>) { + + return {parse<typename std::decay<typename boost::fusion::result_of::at_c<T, Indices>::type>::type>(is, boost::fusion::extension::struct_member_name<T, Indices>::call())...}; + +} + +template <typename T, typename std::enable_if<boost::fusion::traits::is_sequence<T>::value>::type*> +T parse(std::istream& is) { + typedef typename build_indices<boost::fusion::result_of::size<T>::value>::type indices; + + return parse_impl<T>(is, indices{}); +} + +void dump_bytes(std::istream& is, std::vector<uint8_t>& buffer, std::string name); + +}
\ No newline at end of file |
