Chris@16: // (C) Copyright 2008 CodeRage, LLC (turkanis at coderage dot com) Chris@16: // (C) Copyright 2003-2007 Jonathan Turkanis Chris@16: // Distributed under the Boost Software License, Version 1.0. (See accompanying Chris@16: // file LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt.) Chris@16: Chris@16: // See http://www.boost.org/libs/iostreams for documentation. Chris@16: Chris@16: // Contains category and mode tags for classifying filters, devices and Chris@16: // standard stream and stream buffers types. Chris@16: Chris@16: #ifndef BOOST_IOSTREAMS_CATEGORIES_HPP_INCLUDED Chris@16: #define BOOST_IOSTREAMS_CATEGORIES_HPP_INCLUDED Chris@16: Chris@16: #if defined(_MSC_VER) && (_MSC_VER >= 1020) Chris@16: # pragma once Chris@16: #endif Chris@16: Chris@16: namespace boost { namespace iostreams { Chris@16: Chris@16: //------------------Tags for dispatch according to i/o mode-------------------// Chris@16: Chris@16: struct any_tag { }; Chris@16: namespace detail { struct two_sequence : virtual any_tag { }; } Chris@16: namespace detail { struct random_access : virtual any_tag { }; } Chris@16: namespace detail { struct one_head : virtual any_tag { }; } Chris@16: namespace detail { struct two_head : virtual any_tag { }; } Chris@16: struct input : virtual any_tag { }; Chris@16: struct output : virtual any_tag { }; Chris@16: struct bidirectional : virtual input, virtual output, detail::two_sequence { }; Chris@16: struct dual_use : virtual input, virtual output { }; // Pseudo-mode. Chris@16: struct input_seekable : virtual input, virtual detail::random_access { }; Chris@16: struct output_seekable : virtual output, virtual detail::random_access { }; Chris@16: struct seekable Chris@16: : virtual input_seekable, Chris@16: virtual output_seekable, Chris@16: detail::one_head Chris@16: { }; Chris@16: struct dual_seekable Chris@16: : virtual input_seekable, Chris@16: virtual output_seekable, Chris@16: detail::two_head Chris@16: { }; Chris@16: struct bidirectional_seekable Chris@16: : input_seekable, output_seekable, Chris@16: bidirectional, detail::two_head Chris@16: { }; Chris@16: Chris@16: //------------------Tags for use as i/o categories----------------------------// Chris@16: Chris@16: struct device_tag : virtual any_tag { }; Chris@16: struct filter_tag : virtual any_tag { }; Chris@16: Chris@16: // Chris@16: // Tags for optional behavior. Chris@16: // Chris@16: Chris@16: struct peekable_tag : virtual any_tag { }; // Devices. Chris@16: struct closable_tag : virtual any_tag { }; Chris@16: struct flushable_tag : virtual any_tag { }; Chris@16: struct localizable_tag : virtual any_tag { }; Chris@16: struct optimally_buffered_tag : virtual any_tag { }; Chris@16: struct direct_tag : virtual any_tag { }; // Devices. Chris@16: struct multichar_tag : virtual any_tag { }; // Filters. Chris@16: Chris@16: struct source_tag : device_tag, input { }; Chris@16: struct sink_tag : device_tag, output { }; Chris@16: struct bidirectional_device_tag : device_tag, bidirectional { }; Chris@16: struct seekable_device_tag : virtual device_tag, seekable { }; Chris@16: Chris@16: struct input_filter_tag : filter_tag, input { }; Chris@16: struct output_filter_tag : filter_tag, output { }; Chris@16: struct bidirectional_filter_tag : filter_tag, bidirectional { }; Chris@16: struct seekable_filter_tag : filter_tag, seekable { }; Chris@16: struct dual_use_filter_tag : filter_tag, dual_use { }; Chris@16: Chris@16: struct multichar_input_filter_tag Chris@16: : multichar_tag, Chris@16: input_filter_tag Chris@16: { }; Chris@16: struct multichar_output_filter_tag Chris@16: : multichar_tag, Chris@16: output_filter_tag Chris@16: { }; Chris@16: struct multichar_bidirectional_filter_tag Chris@16: : multichar_tag, Chris@16: bidirectional_filter_tag Chris@16: { }; Chris@16: struct multichar_seekable_filter_tag Chris@16: : multichar_tag, Chris@16: seekable_filter_tag Chris@16: { }; Chris@16: struct multichar_dual_use_filter_tag Chris@16: : multichar_tag, Chris@16: dual_use_filter_tag Chris@16: { }; Chris@16: Chris@16: // Chris@16: // Tags for standard streams and streambufs. Chris@16: // Chris@16: Chris@16: struct std_io_tag : virtual localizable_tag { }; Chris@16: struct istream_tag Chris@16: : virtual device_tag, Chris@16: virtual peekable_tag, Chris@16: virtual std_io_tag Chris@16: { }; Chris@16: struct ostream_tag Chris@16: : virtual device_tag, Chris@16: virtual std_io_tag Chris@16: { }; Chris@16: struct iostream_tag Chris@16: : istream_tag, Chris@16: ostream_tag Chris@16: { }; Chris@16: struct streambuf_tag Chris@16: : device_tag, Chris@16: peekable_tag, Chris@16: std_io_tag Chris@16: { }; Chris@16: struct ifstream_tag Chris@16: : input_seekable, Chris@16: closable_tag, Chris@16: istream_tag Chris@16: { }; Chris@16: struct ofstream_tag Chris@16: : output_seekable, Chris@16: closable_tag, Chris@16: ostream_tag Chris@16: { }; Chris@16: struct fstream_tag Chris@16: : seekable, Chris@16: closable_tag, Chris@16: iostream_tag Chris@16: { }; Chris@16: struct filebuf_tag Chris@16: : seekable, Chris@16: closable_tag, Chris@16: streambuf_tag Chris@16: { }; Chris@16: struct istringstream_tag Chris@16: : input_seekable, Chris@16: istream_tag Chris@16: { }; Chris@16: struct ostringstream_tag Chris@16: : output_seekable, Chris@16: ostream_tag Chris@16: { }; Chris@16: struct stringstream_tag Chris@16: : dual_seekable, Chris@16: iostream_tag Chris@16: { }; Chris@16: struct stringbuf_tag Chris@16: : dual_seekable, Chris@16: streambuf_tag Chris@16: { }; Chris@16: struct generic_istream_tag Chris@16: : input_seekable, Chris@16: istream_tag Chris@16: { }; Chris@16: struct generic_ostream_tag Chris@16: : output_seekable, Chris@16: ostream_tag Chris@16: { }; Chris@16: struct generic_iostream_tag Chris@16: : seekable, Chris@16: iostream_tag Chris@16: { }; Chris@16: struct generic_streambuf_tag Chris@16: : seekable, Chris@16: streambuf_tag Chris@16: { }; Chris@16: Chris@16: } } // End namespaces iostreams, boost. Chris@16: Chris@16: #endif // #ifndef BOOST_IOSTREAMS_CATEGORIES_HPP_INCLUDED