Back to home page

EIC code displayed by LXR

 
 

    


File indexing completed on 2025-01-18 09:38:52

0001 // (C) Copyright 2008 CodeRage, LLC (turkanis at coderage dot com)
0002 // (C) Copyright 2003-2007 Jonathan Turkanis
0003 // Distributed under the Boost Software License, Version 1.0. (See accompanying
0004 // file LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt.)
0005 
0006 // See http://www.boost.org/libs/iostreams for documentation.
0007 
0008 // Contains category and mode tags for classifying filters, devices and 
0009 // standard stream and stream buffers types.
0010 
0011 #ifndef BOOST_IOSTREAMS_CATEGORIES_HPP_INCLUDED
0012 #define BOOST_IOSTREAMS_CATEGORIES_HPP_INCLUDED 
0013 
0014 #if defined(_MSC_VER)
0015 # pragma once
0016 #endif
0017 
0018 namespace boost { namespace iostreams {
0019 
0020 //------------------Tags for dispatch according to i/o mode-------------------//
0021 
0022 struct any_tag { };
0023 namespace detail { struct two_sequence : virtual any_tag { }; }
0024 namespace detail { struct random_access : virtual any_tag { }; }
0025 namespace detail { struct one_head : virtual any_tag { }; }
0026 namespace detail { struct two_head : virtual any_tag { }; }
0027 struct input : virtual any_tag { };
0028 struct output : virtual any_tag { };
0029 struct bidirectional : virtual input, virtual output, detail::two_sequence { };
0030 struct dual_use : virtual input, virtual output { }; // Pseudo-mode.
0031 struct input_seekable : virtual input, virtual detail::random_access { };
0032 struct output_seekable : virtual output, virtual detail::random_access { };
0033 struct seekable
0034     : virtual input_seekable, 
0035       virtual output_seekable,
0036       detail::one_head
0037     { };
0038 struct dual_seekable
0039     : virtual input_seekable,
0040       virtual output_seekable,
0041       detail::two_head
0042     { };  
0043 struct bidirectional_seekable
0044     : input_seekable, output_seekable,
0045       bidirectional, detail::two_head
0046     { };
0047 
0048 //------------------Tags for use as i/o categories----------------------------//
0049 
0050 struct device_tag : virtual any_tag { };
0051 struct filter_tag : virtual any_tag { };
0052 
0053     // 
0054     // Tags for optional behavior.
0055     //
0056 
0057 struct peekable_tag : virtual any_tag { };        // Devices.
0058 struct closable_tag : virtual any_tag { };
0059 struct flushable_tag : virtual any_tag { };
0060 struct localizable_tag : virtual any_tag { };
0061 struct optimally_buffered_tag : virtual any_tag { };
0062 struct direct_tag : virtual any_tag { };          // Devices.
0063 struct multichar_tag : virtual any_tag { };       // Filters.
0064 
0065 struct source_tag : device_tag, input { };
0066 struct sink_tag : device_tag, output { };
0067 struct bidirectional_device_tag : device_tag, bidirectional { };
0068 struct seekable_device_tag : virtual device_tag, seekable { };
0069 
0070 struct input_filter_tag : filter_tag, input { };
0071 struct output_filter_tag : filter_tag, output { };
0072 struct bidirectional_filter_tag : filter_tag, bidirectional { };
0073 struct seekable_filter_tag : filter_tag, seekable { };
0074 struct dual_use_filter_tag : filter_tag, dual_use { };
0075 
0076 struct multichar_input_filter_tag
0077     : multichar_tag,
0078       input_filter_tag
0079     { };
0080 struct multichar_output_filter_tag
0081     : multichar_tag,
0082       output_filter_tag
0083     { };
0084 struct multichar_bidirectional_filter_tag
0085     : multichar_tag,
0086       bidirectional_filter_tag
0087     { };
0088 struct multichar_seekable_filter_tag
0089     : multichar_tag,
0090       seekable_filter_tag
0091     { };
0092 struct multichar_dual_use_filter_tag 
0093     : multichar_tag, 
0094       dual_use_filter_tag
0095     { };
0096 
0097     //
0098     // Tags for standard streams and streambufs.
0099     //
0100 
0101 struct std_io_tag : virtual localizable_tag { };
0102 struct istream_tag
0103     : virtual device_tag,
0104       virtual peekable_tag,
0105       virtual std_io_tag
0106     { };
0107 struct ostream_tag
0108     : virtual device_tag,
0109       virtual std_io_tag
0110     { };
0111 struct iostream_tag
0112     : istream_tag,
0113       ostream_tag
0114     { };
0115 struct streambuf_tag
0116     : device_tag,
0117       peekable_tag,
0118       std_io_tag
0119     { };
0120 struct ifstream_tag
0121     : input_seekable,
0122       closable_tag,
0123       istream_tag
0124     { };
0125 struct ofstream_tag
0126     : output_seekable,
0127       closable_tag,
0128       ostream_tag
0129     { };
0130 struct fstream_tag
0131     : seekable,
0132       closable_tag,
0133       iostream_tag
0134     { };
0135 struct filebuf_tag
0136     : seekable,
0137       closable_tag,
0138       streambuf_tag
0139     { };
0140 struct istringstream_tag
0141     : input_seekable,
0142       istream_tag
0143     { };
0144 struct ostringstream_tag
0145     : output_seekable,
0146       ostream_tag
0147     { };
0148 struct stringstream_tag
0149     : dual_seekable,
0150       iostream_tag
0151     { };
0152 struct stringbuf_tag
0153     : dual_seekable,
0154       streambuf_tag
0155     { };
0156 struct generic_istream_tag 
0157     : input_seekable,
0158       istream_tag
0159     { };
0160 struct generic_ostream_tag 
0161     : output_seekable,
0162       ostream_tag
0163     { };
0164 struct generic_iostream_tag 
0165     : seekable,
0166       iostream_tag
0167     { };
0168 struct generic_streambuf_tag 
0169     : seekable,
0170       streambuf_tag
0171     { };
0172 
0173 } } // End namespaces iostreams, boost.
0174 
0175 #endif // #ifndef BOOST_IOSTREAMS_CATEGORIES_HPP_INCLUDED