1 // (C) Copyright 2008 CodeRage, LLC (turkanis at coderage dot com)
2 // (C) Copyright 2003-2007 Jonathan Turkanis
3 // Distributed under the Boost Software License, Version 1.0. (See accompanying
4 // file LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt.)
6 // See http://www.boost.org/libs/iostreams for documentation.
8 #ifndef BOOST_IOSTREAMS_CONCEPTS_HPP_INCLUDED
9 #define BOOST_IOSTREAMS_CONCEPTS_HPP_INCLUDED
11 #if defined(_MSC_VER) && (_MSC_VER >= 1020)
15 #include <boost/config.hpp> // BOOST_MSVC
16 #include <boost/detail/workaround.hpp>
17 #include <boost/iostreams/categories.hpp>
18 #include <boost/iostreams/detail/default_arg.hpp>
19 #include <boost/iostreams/detail/ios.hpp> // openmode.
20 #include <boost/iostreams/positioning.hpp>
21 #include <boost/static_assert.hpp>
22 #include <boost/type_traits/is_convertible.hpp>
24 namespace boost
{ namespace iostreams
{
26 //--------------Definitions of helper templates for device concepts-----------//
28 template<typename Mode
, typename Ch
= BOOST_IOSTREAMS_DEFAULT_ARG(char)>
40 using namespace detail
;
41 BOOST_STATIC_ASSERT((!is_convertible
<Mode
, two_sequence
>::value
));
44 void close(BOOST_IOS::openmode
)
46 using namespace detail
;
47 BOOST_STATIC_ASSERT((is_convertible
<Mode
, two_sequence
>::value
));
50 template<typename Locale
>
51 void imbue(const Locale
&) { }
54 template<typename Mode
, typename Ch
= BOOST_IOSTREAMS_DEFAULT_ARG(wchar_t)>
55 struct wdevice
: device
<Mode
, Ch
> { };
57 typedef device
<input
> source
;
58 typedef wdevice
<input
> wsource
;
59 typedef device
<output
> sink
;
60 typedef wdevice
<output
> wsink
;
62 //--------------Definitions of helper templates for simple filter concepts----//
64 template<typename Mode
, typename Ch
= BOOST_IOSTREAMS_DEFAULT_ARG(char)>
74 template<typename Device
>
77 using namespace detail
;
78 BOOST_STATIC_ASSERT((!is_convertible
<Mode
, two_sequence
>::value
));
79 BOOST_STATIC_ASSERT((!is_convertible
<Mode
, dual_use
>::value
));
82 template<typename Device
>
83 void close(Device
&, BOOST_IOS::openmode
)
85 using namespace detail
;
87 (is_convertible
<Mode
, two_sequence
>::value
) ||
88 (is_convertible
<Mode
, dual_use
>::value
)
92 template<typename Locale
>
93 void imbue(const Locale
&) { }
96 template<typename Mode
, typename Ch
= BOOST_IOSTREAMS_DEFAULT_ARG(wchar_t)>
97 struct wfilter
: filter
<Mode
, Ch
> { };
99 typedef filter
<input
> input_filter
;
100 typedef wfilter
<input
> input_wfilter
;
101 typedef filter
<output
> output_filter
;
102 typedef wfilter
<output
> output_wfilter
;
103 typedef filter
<seekable
> seekable_filter
;
104 typedef wfilter
<seekable
> seekable_wfilter
;
105 typedef filter
<dual_use
> dual_use_filter
;
106 typedef wfilter
<dual_use
> dual_use_wfilter
;
108 //------Definitions of helper templates for multi-character filter cncepts----//
110 template<typename Mode
, typename Ch
= char>
111 struct multichar_filter
: filter
<Mode
, Ch
> {
112 struct category
: filter
<Mode
, Ch
>::category
, multichar_tag
{ };
115 template<typename Mode
, typename Ch
= wchar_t>
116 struct multichar_wfilter
: multichar_filter
<Mode
, Ch
> { };
118 typedef multichar_filter
<input
> multichar_input_filter
;
119 typedef multichar_wfilter
<input
> multichar_input_wfilter
;
120 typedef multichar_filter
<output
> multichar_output_filter
;
121 typedef multichar_wfilter
<output
> multichar_output_wfilter
;
122 typedef multichar_filter
<dual_use
> multichar_dual_use_filter
;
123 typedef multichar_wfilter
<dual_use
> multichar_dual_use_wfilter
;
125 //----------------------------------------------------------------------------//
127 } } // End namespaces iostreams, boost.
129 #endif // #ifndef BOOST_IOSTREAMS_CONCEPTS_HPP_INCLUDED