Boost GIL


make_dynamic_image_reader.hpp
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_DYNAMIC_IMAGE_READER_HPP
9 #define BOOST_GIL_IO_MAKE_DYNAMIC_IMAGE_READER_HPP
10 
11 #include <boost/gil/io/get_reader.hpp>
12 
13 #include <boost/mpl/and.hpp>
14 
15 #include <type_traits>
16 
17 namespace boost { namespace gil {
18 
19 template <typename String, typename FormatTag>
20 inline
21 auto make_dynamic_image_reader(
22  String const& file_name, image_read_settings<FormatTag> const& settings,
23  typename std::enable_if
24  <
25  mpl::and_
26  <
27  detail::is_supported_path_spec<String>,
28  is_format_tag<FormatTag>
29  >::value
30  >::type* /*dummy*/ = nullptr)
31  -> typename get_dynamic_image_reader<String, FormatTag>::type
32 {
33  using device_t = typename get_read_device<String, FormatTag>::type;
34  device_t device(
35  detail::convert_to_native_string(file_name),
36  typename detail::file_stream_device<FormatTag>::read_tag());
37 
38  return typename get_dynamic_image_reader<String, FormatTag>::type(device, settings);
39 }
40 
41 template <typename FormatTag>
42 inline
43 auto make_dynamic_image_reader(
44  std::wstring const& file_name, image_read_settings<FormatTag> const& settings)
45  -> typename get_dynamic_image_reader<std::wstring, FormatTag>::type
46 {
47  char const* str = detail::convert_to_native_string(file_name);
48 
49  using device_t = typename get_read_device<std::wstring, FormatTag>::type;
50  device_t device(str, typename detail::file_stream_device<FormatTag>::read_tag());
51 
52  delete[] str; // TODO: RAII
53 
54  return
55  typename get_dynamic_image_reader<std::wstring, FormatTag>::type(device, settings);
56 }
57 
58 #ifdef BOOST_GIL_IO_ADD_FS_PATH_SUPPORT
59 template <typename FormatTag>
60 inline
61 auto make_dynamic_image_reader(
62  filesystem::path const& path, image_read_settings<FormatTag> const& settings)
63  -> typename get_dynamic_image_reader<std::wstring, FormatTag>::type
64 {
65  return make_dynamic_image_reader(path.wstring(), settings);
66 }
67 #endif // BOOST_GIL_IO_ADD_FS_PATH_SUPPORT
68 
69 template <typename Device, typename FormatTag>
70 inline
71 auto make_dynamic_image_reader(
72  Device& file, image_read_settings<FormatTag> const& settings,
73  typename std::enable_if
74  <
75  mpl::and_
76  <
77  detail::is_adaptable_input_device<FormatTag, Device>,
78  is_format_tag<FormatTag>
79  >::value
80  >::type* /*dummy*/ = nullptr)
81  -> typename get_dynamic_image_reader<Device, FormatTag>::type
82 {
83  typename get_read_device<Device, FormatTag>::type device(file);
84  return typename get_dynamic_image_reader<Device, FormatTag>::type(device, settings);
85 }
86 
87 // without image_read_settings
88 
89 template <typename String, typename FormatTag>
90 inline
91 auto make_dynamic_image_reader(String const& file_name, FormatTag const&,
92  typename std::enable_if
93  <
94  mpl::and_
95  <
96  detail::is_supported_path_spec<String>,
97  is_format_tag<FormatTag>
98  >::value
99  >::type* /*dummy*/ = nullptr)
100  -> typename get_dynamic_image_reader<String, FormatTag>::type
101 {
102  return make_dynamic_image_reader(file_name, image_read_settings<FormatTag>());
103 }
104 
105 template <typename FormatTag>
106 inline
107 auto make_dynamic_image_reader(std::wstring const& file_name, FormatTag const&)
108  -> typename get_dynamic_image_reader<std::wstring, FormatTag>::type
109 {
110  return make_dynamic_image_reader(file_name, image_read_settings<FormatTag>());
111 }
112 
113 #ifdef BOOST_GIL_IO_ADD_FS_PATH_SUPPORT
114 template <typename FormatTag>
115 inline
116 auto make_dynamic_image_reader(filesystem::path const& path, FormatTag const&)
117  -> typename get_dynamic_image_reader<std::wstring, FormatTag>::type
118 {
119  return make_dynamic_image_reader(path.wstring(), image_read_settings<FormatTag>());
120 }
121 #endif // BOOST_GIL_IO_ADD_FS_PATH_SUPPORT
122 
123 template <typename Device, typename FormatTag>
124 inline
125 auto make_dynamic_image_reader(Device& file, FormatTag const&,
126  typename std::enable_if
127  <
128  mpl::and_
129  <
130  detail::is_adaptable_input_device<FormatTag, Device>,
131  is_format_tag<FormatTag>
132  >::value
133  >::type* /*dummy*/ = nullptr)
134  -> typename get_dynamic_image_reader<Device, FormatTag>::type
135 {
136  return make_dynamic_image_reader(file, image_read_settings<FormatTag>());
137 }
138 
139 }} // namespace boost::gil
140 
141 #endif
Definition: algorithm.hpp:30