Save bitmaps as PNG
[lsnes.git] / include / library / binarystream.hpp
blobd1464a47ce97d04b9c2ca6f358b52e65a1af3fee
1 #ifndef _library__binarystream__hpp__included__
2 #define _library__binarystream__hpp__included__
4 #include <iostream>
5 #include <sstream>
6 #include <cstdint>
7 #include <string>
8 #include <vector>
9 #include <functional>
10 #include <stdexcept>
12 struct binary_output_stream
14 public:
15 binary_output_stream();
16 binary_output_stream(std::ostream& s);
17 void byte(uint8_t byte);
18 void number(uint64_t number);
19 size_t numberbytes(uint64_t number);
20 void number32(uint32_t number);
21 void string(const std::string& string);
22 void string_implicit(const std::string& string);
23 void blob_implicit(const std::vector<char>& blob);
24 void raw(const void* buf, size_t bufsize);
25 void extension(uint32_t tag, std::function<void(binary_output_stream&)> fn, bool even_empty = false);
26 void extension(uint32_t tag, std::function<void(binary_output_stream&)> fn, bool even_empty,
27 size_t size_precognition);
28 void write_extension_tag(uint32_t tag, uint64_t size);
29 std::string get();
30 private:
31 std::ostream& strm;
32 std::ostringstream buf;
35 struct binary_input_stream
37 public:
38 struct binary_tag_handler
40 uint32_t tag;
41 std::function<void(binary_input_stream& s)> fn;
43 binary_input_stream(std::istream& s);
44 binary_input_stream(binary_input_stream& s, uint64_t len);
45 uint8_t byte();
46 uint64_t number();
47 uint32_t number32();
48 std::string string();
49 std::string string_implicit();
50 void blob_implicit(std::vector<char>& blob);
51 void raw(void* buf, size_t bufsize);
52 void extension(std::function<void(uint32_t tag, binary_input_stream& s)> fn);
53 void extension(std::initializer_list<binary_tag_handler> funcs,
54 std::function<void(uint32_t tag, binary_input_stream& s)> default_hdlr);
55 uint64_t get_left()
57 if(!parent)
58 throw std::logic_error("binary_input_stream::get_left() can only be used in substreams");
59 return left;
61 private:
62 bool read(char* buf, size_t size, bool allow_none = false);
63 void flush();
64 binary_input_stream* parent;
65 std::istream& strm;
66 uint64_t left;
69 void binary_null_default(uint32_t tag, binary_input_stream& s);
71 #endif