1 //
2 // Copyright 2012 Christian Henning
3 //
4 // Distributed under the Boost Software License, Version 1.0
5 // See accompanying file LICENSE_1_0.txt or copy at
6 // http://www.boost.org/LICENSE_1_0.txt
7 //
8 #ifndef BOOST_GIL_IO_MAKE_READER_HPP
9 #define BOOST_GIL_IO_MAKE_READER_HPP
10
11 #include <boost/gil/detail/mp11.hpp>
12 #include <boost/gil/io/get_reader.hpp>
13
14 #include <type_traits>
15
16 namespace boost { namespace gil {
17
18 template <typename String, typename FormatTag, typename ConversionPolicy>
19 inline
make_reader(String const & file_name,image_read_settings<FormatTag> const & settings,ConversionPolicy const &,typename std::enable_if<mp11::mp_and<detail::is_supported_path_spec<String>,is_format_tag<FormatTag>>::value>::type * =nullptr)20 auto make_reader(
21 String const&file_name,
22 image_read_settings<FormatTag> const& settings,
23 ConversionPolicy const&,
24 typename std::enable_if
25 <
26 mp11::mp_and
27 <
28 detail::is_supported_path_spec<String>,
29 is_format_tag<FormatTag>
30 >::value
31 >::type* /*dummy*/ = nullptr)
32 -> typename get_reader<String, FormatTag, ConversionPolicy>::type
33 {
34 typename get_read_device<String, FormatTag>::type device(
35 detail::convert_to_native_string(file_name),
36 typename detail::file_stream_device<FormatTag>::read_tag());
37
38 return
39 typename get_reader<String, FormatTag, ConversionPolicy>::type(device, settings);
40 }
41
42 template< typename FormatTag
43 , typename ConversionPolicy
44 >
45 inline
46 typename get_reader< std::wstring
47 , FormatTag
48 , ConversionPolicy
49 >::type
make_reader(const std::wstring & file_name,const image_read_settings<FormatTag> & settings,const ConversionPolicy &)50 make_reader( const std::wstring& file_name
51 , const image_read_settings< FormatTag >& settings
52 , const ConversionPolicy&
53 )
54 {
55 const char* str = detail::convert_to_native_string( file_name );
56
57 typename get_read_device< std::wstring
58 , FormatTag
59 >::type device( str
60 , typename detail::file_stream_device< FormatTag >::read_tag()
61 );
62
63 delete[] str; // TODO: RAII
64
65 return typename get_reader< std::wstring
66 , FormatTag
67 , ConversionPolicy
68 >::type( device
69 , settings
70 );
71 }
72
73 #ifdef BOOST_GIL_IO_ADD_FS_PATH_SUPPORT
74 template< typename FormatTag
75 , typename ConversionPolicy
76 >
77 inline
78 typename get_reader< std::wstring
79 , FormatTag
80 , ConversionPolicy
81 >::type
make_reader(const filesystem::path & path,const image_read_settings<FormatTag> & settings,const ConversionPolicy & cc)82 make_reader( const filesystem::path& path
83 , const image_read_settings< FormatTag >& settings
84 , const ConversionPolicy& cc
85 )
86 {
87 return make_reader( path.wstring()
88 , settings
89 , cc
90 );
91 }
92 #endif // BOOST_GIL_IO_ADD_FS_PATH_SUPPORT
93
94 template <typename Device, typename FormatTag, typename ConversionPolicy>
95 inline
make_reader(Device & file,image_read_settings<FormatTag> const & settings,ConversionPolicy const &,typename std::enable_if<mp11::mp_and<detail::is_adaptable_input_device<FormatTag,Device>,is_format_tag<FormatTag>>::value>::type * =nullptr)96 auto make_reader(
97 Device& file,
98 image_read_settings<FormatTag> const& settings,
99 ConversionPolicy const&,
100 typename std::enable_if
101 <
102 mp11::mp_and
103 <
104 detail::is_adaptable_input_device<FormatTag, Device>,
105 is_format_tag<FormatTag>
106 >::value
107 >::type* /*dummy*/ = nullptr)
108 -> typename get_reader<Device, FormatTag, ConversionPolicy>::type
109 {
110 typename get_read_device<Device, FormatTag>::type device(file);
111
112 return
113 typename get_reader<Device, FormatTag, ConversionPolicy>::type(device, settings);
114 }
115
116 // no image_read_settings
117
118 template <typename String, typename FormatTag, typename ConversionPolicy>
119 inline
make_reader(String const & file_name,FormatTag const &,ConversionPolicy const & cc,typename std::enable_if<mp11::mp_and<detail::is_supported_path_spec<String>,is_format_tag<FormatTag>>::value>::type * =nullptr)120 auto make_reader(
121 String const&file_name,
122 FormatTag const&,
123 ConversionPolicy const& cc,
124 typename std::enable_if
125 <
126 mp11::mp_and
127 <
128 detail::is_supported_path_spec<String>,
129 is_format_tag<FormatTag>
130 >::value
131 >::type* /*dummy*/ = nullptr)
132 -> typename get_reader<String, FormatTag, ConversionPolicy>::type
133 {
134 return make_reader(file_name, image_read_settings<FormatTag>(), cc);
135 }
136
137 template< typename FormatTag
138 , typename ConversionPolicy
139 >
140 inline
141 typename get_reader< std::wstring
142 , FormatTag
143 , ConversionPolicy
144 >::type
make_reader(const std::wstring & file_name,const FormatTag &,const ConversionPolicy & cc)145 make_reader( const std::wstring& file_name
146 , const FormatTag&
147 , const ConversionPolicy& cc
148 )
149 {
150 return make_reader( file_name
151 , image_read_settings< FormatTag >()
152 , cc
153 );
154 }
155
156 #ifdef BOOST_GIL_IO_ADD_FS_PATH_SUPPORT
157 template< typename FormatTag
158 , typename ConversionPolicy
159 >
160 inline
161 typename get_reader< std::wstring
162 , FormatTag
163 , ConversionPolicy
164 >::type
make_reader(const filesystem::path & path,const FormatTag &,const ConversionPolicy & cc)165 make_reader( const filesystem::path& path
166 , const FormatTag&
167 , const ConversionPolicy& cc
168 )
169 {
170 return make_reader( path.wstring()
171 , image_read_settings< FormatTag >()
172 , cc
173 );
174 }
175 #endif // BOOST_GIL_IO_ADD_FS_PATH_SUPPORT
176
177 template <typename Device, typename FormatTag, typename ConversionPolicy>
178 inline
make_reader(Device & file,FormatTag const &,ConversionPolicy const & cc,typename std::enable_if<mp11::mp_and<detail::is_adaptable_input_device<FormatTag,Device>,is_format_tag<FormatTag>>::value>::type * =nullptr)179 auto make_reader(
180 Device& file,
181 FormatTag const&,
182 ConversionPolicy const& cc,
183 typename std::enable_if
184 <
185 mp11::mp_and
186 <
187 detail::is_adaptable_input_device<FormatTag, Device>,
188 is_format_tag<FormatTag>
189 >::value
190 >::type* /*dummy*/ = nullptr)
191 -> typename get_reader<Device, FormatTag, ConversionPolicy>::type
192 {
193 return make_reader(file, image_read_settings<FormatTag>(), cc);
194 }
195
196 }} // namespace boost::gil
197
198 #endif
199