summaryrefslogtreecommitdiff
path: root/binparse/parse.hpp
diff options
context:
space:
mode:
Diffstat (limited to 'binparse/parse.hpp')
-rw-r--r--binparse/parse.hpp75
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