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