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