• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
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_GET_READER_HPP
9 #define BOOST_GIL_IO_GET_READER_HPP
10 
11 #include <boost/gil/io/get_read_device.hpp>
12 #include <boost/gil/detail/mp11.hpp>
13 
14 #include <type_traits>
15 
16 namespace boost { namespace gil {
17 
18 /// \brief Helper metafunction to generate image reader type.
19 template
20 <
21     typename T,
22     typename FormatTag,
23     typename ConversionPolicy,
24     class Enable = void
25 >
26 struct get_reader {};
27 
28 template <typename String, typename FormatTag, typename ConversionPolicy>
29 struct get_reader
30 <
31     String,
32     FormatTag,
33     ConversionPolicy,
34     typename std::enable_if
35     <
36         mp11::mp_and
37         <
38             detail::is_supported_path_spec<String>,
39             is_format_tag<FormatTag>
40         >::value
41     >::type
42 >
43 {
44     using device_t = typename get_read_device<String, FormatTag>::type;
45     using type = reader<device_t, FormatTag, ConversionPolicy>;
46 };
47 
48 template <typename Device, typename FormatTag, typename ConversionPolicy>
49 struct get_reader
50 <
51     Device,
52     FormatTag,
53     ConversionPolicy,
54     typename std::enable_if
55     <
56         mp11::mp_and
57         <
58             detail::is_adaptable_input_device<FormatTag, Device>,
59             is_format_tag<FormatTag>
60         >::value
61     >::type
62 >
63 {
64     using device_t = typename get_read_device<Device, FormatTag>::type;
65     using type = reader<device_t, FormatTag, ConversionPolicy>;
66 };
67 
68 /// \brief Helper metafunction to generate dynamic image reader type.
69 template <typename T, typename FormatTag, class Enable = void>
70 struct get_dynamic_image_reader
71 {
72 };
73 
74 template <typename String, typename FormatTag>
75 struct get_dynamic_image_reader
76 <
77     String,
78     FormatTag,
79     typename std::enable_if
80     <
81         mp11::mp_and
82         <
83             detail::is_supported_path_spec<String>,
84             is_format_tag<FormatTag>
85         >::value
86     >::type
87 >
88 {
89     using device_t = typename get_read_device<String, FormatTag>::type;
90     using type = dynamic_image_reader<device_t, FormatTag>;
91 };
92 
93 template <typename Device, typename FormatTag>
94 struct get_dynamic_image_reader
95 <
96     Device,
97     FormatTag,
98     typename std::enable_if
99     <
100         mp11::mp_and
101         <
102             detail::is_adaptable_input_device<FormatTag, Device>,
103             is_format_tag<FormatTag>
104         >::value
105     >::type
106 >
107 {
108     using device_t = typename get_read_device<Device, FormatTag>::type;
109     using type = dynamic_image_reader<device_t, FormatTag>;
110 };
111 
112 /// \brief Helper metafunction to generate image backend type.
113 template <typename T, typename FormatTag, class Enable = void>
114 struct get_reader_backend
115 {
116 };
117 
118 template <typename String, typename FormatTag>
119 struct get_reader_backend
120 <
121     String,
122     FormatTag,
123     typename std::enable_if
124     <
125         mp11::mp_and
126         <
127             detail::is_supported_path_spec<String>,
128             is_format_tag<FormatTag>
129         >::value
130     >::type
131 >
132 {
133     using device_t = typename get_read_device<String, FormatTag>::type;
134     using type = reader_backend<device_t, FormatTag>;
135 };
136 
137 template <typename Device, typename FormatTag>
138 struct get_reader_backend
139 <
140     Device,
141     FormatTag,
142     typename std::enable_if
143     <
144         mp11::mp_and
145         <
146             detail::is_adaptable_input_device<FormatTag, Device>,
147             is_format_tag<FormatTag>
148         >::value
149     >::type
150 >
151 {
152     using device_t = typename get_read_device<Device, FormatTag>::type;
153     using type = reader_backend<device_t, FormatTag>;
154 };
155 
156 /// \brief Helper metafunction to generate image scanline_reader type.
157 template <typename T, typename FormatTag>
158 struct get_scanline_reader
159 {
160     using device_t = typename get_read_device<T, FormatTag>::type;
161     using type = scanline_reader<device_t, FormatTag>;
162 };
163 
164 } // namespace gil
165 } // namespace boost
166 
167 #endif
168