sl@0: // (C) Copyright Jonathan Turkanis 2003.
sl@0: // Distributed under the Boost Software License, Version 1.0. (See accompanying
sl@0: // file LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt.)
sl@0: 
sl@0: // See http://www.boost.org/libs/iostreams for documentation.
sl@0: 
sl@0: #ifndef BOOST_IOSTREAMS_CONCEPTS_HPP_INCLUDED
sl@0: #define BOOST_IOSTREAMS_CONCEPTS_HPP_INCLUDED
sl@0: 
sl@0: #if defined(_MSC_VER) && (_MSC_VER >= 1020)
sl@0: # pragma once
sl@0: #endif
sl@0: 
sl@0: #include <boost/config.hpp>  // BOOST_MSVC
sl@0: #include <boost/detail/workaround.hpp>
sl@0: #include <boost/iostreams/categories.hpp>
sl@0: #include <boost/iostreams/detail/default_arg.hpp>
sl@0: #include <boost/iostreams/detail/ios.hpp>  // openmode.
sl@0: #include <boost/iostreams/positioning.hpp>
sl@0: #include <boost/static_assert.hpp>
sl@0: #include <boost/type_traits/is_convertible.hpp>
sl@0: 
sl@0: namespace boost { namespace iostreams {
sl@0: 
sl@0: //--------------Definitions of helper templates for device concepts-----------//
sl@0: 
sl@0: template<typename Mode, typename Ch = BOOST_IOSTREAMS_DEFAULT_ARG(char)>
sl@0: struct device {
sl@0:     typedef Ch char_type;
sl@0:     struct category
sl@0:         : Mode,
sl@0:           device_tag,
sl@0:           closable_tag,
sl@0:           localizable_tag
sl@0:         { };
sl@0: 
sl@0:     void close()
sl@0:     {
sl@0:         using namespace detail;
sl@0:         BOOST_STATIC_ASSERT((!is_convertible<Mode, two_sequence>::value));
sl@0:     }
sl@0: 
sl@0:     void close(BOOST_IOS::openmode)
sl@0:     {
sl@0:         using namespace detail;
sl@0:         BOOST_STATIC_ASSERT((is_convertible<Mode, two_sequence>::value));
sl@0:     }
sl@0: 
sl@0:     template<typename Locale>
sl@0:     void imbue(const Locale&) { }
sl@0: };
sl@0: 
sl@0: template<typename Mode, typename Ch = BOOST_IOSTREAMS_DEFAULT_ARG(wchar_t)>
sl@0: struct wdevice : device<Mode, Ch> { };
sl@0: 
sl@0: typedef device<input>    source;
sl@0: typedef wdevice<input>   wsource;
sl@0: typedef device<output>   sink;
sl@0: typedef wdevice<output>  wsink;
sl@0: 
sl@0: //--------------Definitions of helper templates for simple filter concepts----//
sl@0: 
sl@0: template<typename Mode, typename Ch = BOOST_IOSTREAMS_DEFAULT_ARG(char)>
sl@0: struct filter {
sl@0:     typedef Ch char_type;
sl@0:     struct category
sl@0:         : Mode,
sl@0:           filter_tag,
sl@0:           closable_tag,
sl@0:           localizable_tag
sl@0:         { };
sl@0: 
sl@0:     template<typename Device>
sl@0:     void close(Device&)
sl@0:     {
sl@0:         using namespace detail;
sl@0:         BOOST_STATIC_ASSERT((!is_convertible<Mode, two_sequence>::value));
sl@0:         BOOST_STATIC_ASSERT((!is_convertible<Mode, dual_use>::value));
sl@0:     }
sl@0: 
sl@0:     template<typename Device>
sl@0:     void close(Device&, BOOST_IOS::openmode)
sl@0:     {
sl@0:         using namespace detail;
sl@0:         BOOST_STATIC_ASSERT(
sl@0:             (is_convertible<Mode, two_sequence>::value) ||
sl@0:             (is_convertible<Mode, dual_use>::value)
sl@0:         );
sl@0:     }
sl@0: 
sl@0:     template<typename Locale>
sl@0:     void imbue(const Locale&) { }
sl@0: };
sl@0: 
sl@0: template<typename Mode, typename Ch = BOOST_IOSTREAMS_DEFAULT_ARG(wchar_t)>
sl@0: struct wfilter : filter<Mode, Ch> { };
sl@0: 
sl@0: typedef filter<input>      input_filter;
sl@0: typedef wfilter<input>     input_wfilter;
sl@0: typedef filter<output>     output_filter;
sl@0: typedef wfilter<output>    output_wfilter;
sl@0: typedef filter<seekable>   seekable_filter;
sl@0: typedef wfilter<seekable>  seekable_wfilter;
sl@0: typedef filter<dual_use>   dual_use_filter;
sl@0: typedef wfilter<dual_use>  dual_use_wfilter;
sl@0:         
sl@0: //------Definitions of helper templates for multi-character filter cncepts----//
sl@0: 
sl@0: template<typename Mode, typename Ch = char>
sl@0: struct multichar_filter : filter<Mode, Ch> {
sl@0:     struct category : filter<Mode, Ch>::category, multichar_tag { };
sl@0: };
sl@0: 
sl@0: template<typename Mode, typename Ch = wchar_t>
sl@0: struct multichar_wfilter : multichar_filter<Mode, Ch> { };
sl@0: 
sl@0: typedef multichar_filter<input>     multichar_input_filter;
sl@0: typedef multichar_filter<input>     multichar_input_wfilter;
sl@0: typedef multichar_filter<output>    multichar_output_filter;
sl@0: typedef multichar_filter<output>    multichar_output_wfilter;
sl@0: typedef multichar_filter<dual_use>  multichar_dual_use_filter;
sl@0: typedef multichar_filter<dual_use>  multichar_dual_use_wfilter;
sl@0: 
sl@0: //----------------------------------------------------------------------------//
sl@0: 
sl@0: } } // End namespaces iostreams, boost.
sl@0: 
sl@0: #endif // #ifndef BOOST_IOSTREAMS_CONCEPTS_HPP_INCLUDED