77class stream
88{
99public:
10- stream () {};
11- virtual ~stream () {};
10+ stream () {};
11+ virtual ~stream () {};
1212
13- virtual unsigned write (const unsigned char *buffer, unsigned size) = 0;
14- virtual unsigned write_newline () = 0;
13+ virtual unsigned write (const unsigned char *buffer, unsigned size) = 0;
14+ virtual unsigned write_newline () = 0;
1515};
1616
1717class file_stream : public stream
1818{
19- IOHANDLE file;
20- bool auto_io_close;
19+ IOHANDLE file;
20+ bool auto_io_close;
21+
2122public:
22- file_stream (IOHANDLE handle, bool auto_close)
23- {
24- file = handle;
25- auto_io_close = auto_close;
26- }
27-
28- virtual ~file_stream ()
29- {
30- io_close (file);
31- }
32-
33- virtual unsigned write (const unsigned char *buffer, unsigned size)
34- {
35- return io_write (file, buffer, size);
36- }
37-
38- virtual unsigned write_newline ()
39- {
40- return io_write_newline (file);
41- }
23+ file_stream (IOHANDLE handle, bool auto_close)
24+ {
25+ file = handle;
26+ auto_io_close = auto_close;
27+ }
28+
29+ virtual ~file_stream ()
30+ {
31+ io_close (file);
32+ }
33+
34+ virtual unsigned write (const unsigned char *buffer, unsigned size)
35+ {
36+ return io_write (file, buffer, size);
37+ }
38+
39+ virtual unsigned write_newline ()
40+ {
41+ return io_write_newline (file);
42+ }
4243};
4344
4445class inplace_memory_stream : public stream
4546{
46- unsigned char *start;
47- unsigned char *end;
47+ unsigned char *start;
48+ unsigned char *end;
49+
4850public:
49- inplace_memory_stream (unsigned char *memory, unsigned size)
50- {
51- start = memory;
52- end = start + size;
53- }
54-
55- virtual unsigned write (const unsigned char *buffer, unsigned size)
56- {
57- if (start + size > end)
58- return 0 ;
59- mem_copy (start, buffer, size);
60- return size;
61- }
62-
63- virtual unsigned write_newline ()
64- {
65- if (start >= end)
66- return 0 ;
67- *start = ' \n ' ;
68- start++;
69- return 1 ;
70- }
51+ inplace_memory_stream (unsigned char *memory, unsigned size)
52+ {
53+ start = memory;
54+ end = start + size;
55+ }
56+
57+ virtual unsigned write (const unsigned char *buffer, unsigned size)
58+ {
59+ if (start + size > end)
60+ return 0 ;
61+ mem_copy (start, buffer, size);
62+ return size;
63+ }
64+
65+ virtual unsigned write_newline ()
66+ {
67+ if (start >= end)
68+ return 0 ;
69+ *start = ' \n ' ;
70+ start++;
71+ return 1 ;
72+ }
7173};
7274
7375template <class T >
7476class memory_stream : public stream
7577{
76- static_assert (sizeof (T) == 1 , " the size of buffer element should be 1 byte" );
77- array<T> *mem_buffer;
78+ static_assert (sizeof (T) == 1 , " the size of buffer element should be 1 byte" );
79+ array<T> *mem_buffer;
80+
7881public:
79- memory_stream (array<T> *buffer)
80- {
81- mem_buffer = buffer;
82- buffer->clear ();
83- }
84-
85- virtual unsigned write (const unsigned char *buffer, unsigned size)
86- {
87- unsigned start = mem_buffer->size ();
88- mem_buffer->set_size (start + size);
89- inplace_memory_stream stream ((unsigned char *) mem_buffer->base_ptr () + start, size);
90- return stream.write (buffer, size);
91- }
92-
93- virtual unsigned write_newline ()
94- {
95- return write ((const unsigned char *)(" \n " ), 1 );
96- }
97- };
82+ memory_stream (array<T> *buffer)
83+ {
84+ mem_buffer = buffer;
85+ buffer->clear ();
86+ }
9887
88+ virtual unsigned write (const unsigned char *buffer, unsigned size)
89+ {
90+ unsigned start = mem_buffer->size ();
91+ mem_buffer->set_size (start + size);
92+ inplace_memory_stream stream ((unsigned char *) mem_buffer->base_ptr () + start, size);
93+ return stream.write (buffer, size);
94+ }
95+
96+ virtual unsigned write_newline ()
97+ {
98+ return write ((const unsigned char *) (" \n " ), 1 );
99+ }
100+ };
99101
100- #endif // BASE_TL_STREAM_H
102+ #endif // BASE_TL_STREAM_H
0 commit comments