]>
Commit | Line | Data |
---|---|---|
7c673cae FG |
1 | // (C) Copyright 2008 CodeRage, LLC (turkanis at coderage dot com) |
2 | // (C) Copyright 2003-2007 Jonathan Turkanis | |
3 | // Distributed under the Boost Software License, Version 1.0. (See accompanying | |
4 | // file LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt.) | |
5 | ||
6 | // See http://www.boost.org/libs/iostreams for documentation. | |
7 | ||
8 | // Contains category and mode tags for classifying filters, devices and | |
9 | // standard stream and stream buffers types. | |
10 | ||
11 | #ifndef BOOST_IOSTREAMS_CATEGORIES_HPP_INCLUDED | |
12 | #define BOOST_IOSTREAMS_CATEGORIES_HPP_INCLUDED | |
13 | ||
14 | #if defined(_MSC_VER) | |
15 | # pragma once | |
16 | #endif | |
17 | ||
18 | namespace boost { namespace iostreams { | |
19 | ||
20 | //------------------Tags for dispatch according to i/o mode-------------------// | |
21 | ||
22 | struct any_tag { }; | |
23 | namespace detail { struct two_sequence : virtual any_tag { }; } | |
24 | namespace detail { struct random_access : virtual any_tag { }; } | |
25 | namespace detail { struct one_head : virtual any_tag { }; } | |
26 | namespace detail { struct two_head : virtual any_tag { }; } | |
27 | struct input : virtual any_tag { }; | |
28 | struct output : virtual any_tag { }; | |
29 | struct bidirectional : virtual input, virtual output, detail::two_sequence { }; | |
30 | struct dual_use : virtual input, virtual output { }; // Pseudo-mode. | |
31 | struct input_seekable : virtual input, virtual detail::random_access { }; | |
32 | struct output_seekable : virtual output, virtual detail::random_access { }; | |
33 | struct seekable | |
34 | : virtual input_seekable, | |
35 | virtual output_seekable, | |
36 | detail::one_head | |
37 | { }; | |
38 | struct dual_seekable | |
39 | : virtual input_seekable, | |
40 | virtual output_seekable, | |
41 | detail::two_head | |
42 | { }; | |
43 | struct bidirectional_seekable | |
44 | : input_seekable, output_seekable, | |
45 | bidirectional, detail::two_head | |
46 | { }; | |
47 | ||
48 | //------------------Tags for use as i/o categories----------------------------// | |
49 | ||
50 | struct device_tag : virtual any_tag { }; | |
51 | struct filter_tag : virtual any_tag { }; | |
52 | ||
53 | // | |
54 | // Tags for optional behavior. | |
55 | // | |
56 | ||
57 | struct peekable_tag : virtual any_tag { }; // Devices. | |
58 | struct closable_tag : virtual any_tag { }; | |
59 | struct flushable_tag : virtual any_tag { }; | |
60 | struct localizable_tag : virtual any_tag { }; | |
61 | struct optimally_buffered_tag : virtual any_tag { }; | |
62 | struct direct_tag : virtual any_tag { }; // Devices. | |
63 | struct multichar_tag : virtual any_tag { }; // Filters. | |
64 | ||
65 | struct source_tag : device_tag, input { }; | |
66 | struct sink_tag : device_tag, output { }; | |
67 | struct bidirectional_device_tag : device_tag, bidirectional { }; | |
68 | struct seekable_device_tag : virtual device_tag, seekable { }; | |
69 | ||
70 | struct input_filter_tag : filter_tag, input { }; | |
71 | struct output_filter_tag : filter_tag, output { }; | |
72 | struct bidirectional_filter_tag : filter_tag, bidirectional { }; | |
73 | struct seekable_filter_tag : filter_tag, seekable { }; | |
74 | struct dual_use_filter_tag : filter_tag, dual_use { }; | |
75 | ||
76 | struct multichar_input_filter_tag | |
77 | : multichar_tag, | |
78 | input_filter_tag | |
79 | { }; | |
80 | struct multichar_output_filter_tag | |
81 | : multichar_tag, | |
82 | output_filter_tag | |
83 | { }; | |
84 | struct multichar_bidirectional_filter_tag | |
85 | : multichar_tag, | |
86 | bidirectional_filter_tag | |
87 | { }; | |
88 | struct multichar_seekable_filter_tag | |
89 | : multichar_tag, | |
90 | seekable_filter_tag | |
91 | { }; | |
92 | struct multichar_dual_use_filter_tag | |
93 | : multichar_tag, | |
94 | dual_use_filter_tag | |
95 | { }; | |
96 | ||
97 | // | |
98 | // Tags for standard streams and streambufs. | |
99 | // | |
100 | ||
101 | struct std_io_tag : virtual localizable_tag { }; | |
102 | struct istream_tag | |
103 | : virtual device_tag, | |
104 | virtual peekable_tag, | |
105 | virtual std_io_tag | |
106 | { }; | |
107 | struct ostream_tag | |
108 | : virtual device_tag, | |
109 | virtual std_io_tag | |
110 | { }; | |
111 | struct iostream_tag | |
112 | : istream_tag, | |
113 | ostream_tag | |
114 | { }; | |
115 | struct streambuf_tag | |
116 | : device_tag, | |
117 | peekable_tag, | |
118 | std_io_tag | |
119 | { }; | |
120 | struct ifstream_tag | |
121 | : input_seekable, | |
122 | closable_tag, | |
123 | istream_tag | |
124 | { }; | |
125 | struct ofstream_tag | |
126 | : output_seekable, | |
127 | closable_tag, | |
128 | ostream_tag | |
129 | { }; | |
130 | struct fstream_tag | |
131 | : seekable, | |
132 | closable_tag, | |
133 | iostream_tag | |
134 | { }; | |
135 | struct filebuf_tag | |
136 | : seekable, | |
137 | closable_tag, | |
138 | streambuf_tag | |
139 | { }; | |
140 | struct istringstream_tag | |
141 | : input_seekable, | |
142 | istream_tag | |
143 | { }; | |
144 | struct ostringstream_tag | |
145 | : output_seekable, | |
146 | ostream_tag | |
147 | { }; | |
148 | struct stringstream_tag | |
149 | : dual_seekable, | |
150 | iostream_tag | |
151 | { }; | |
152 | struct stringbuf_tag | |
153 | : dual_seekable, | |
154 | streambuf_tag | |
155 | { }; | |
156 | struct generic_istream_tag | |
157 | : input_seekable, | |
158 | istream_tag | |
159 | { }; | |
160 | struct generic_ostream_tag | |
161 | : output_seekable, | |
162 | ostream_tag | |
163 | { }; | |
164 | struct generic_iostream_tag | |
165 | : seekable, | |
166 | iostream_tag | |
167 | { }; | |
168 | struct generic_streambuf_tag | |
169 | : seekable, | |
170 | streambuf_tag | |
171 | { }; | |
172 | ||
173 | } } // End namespaces iostreams, boost. | |
174 | ||
175 | #endif // #ifndef BOOST_IOSTREAMS_CATEGORIES_HPP_INCLUDED |