make_backend.hpp 3.4 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121
  1. //
  2. //
  3. // Copyright 2012 Christian Henning
  4. //
  5. // Distributed under the Boost Software License, Version 1.0
  6. // See accompanying file LICENSE_1_0.txt or copy at
  7. // http://www.boost.org/LICENSE_1_0.txt
  8. //
  9. #ifndef BOOST_GIL_IO_MAKE_BACKEND_HPP
  10. #define BOOST_GIL_IO_MAKE_BACKEND_HPP
  11. #include <boost/gil/detail/mp11.hpp>
  12. #include <boost/gil/io/get_reader.hpp>
  13. #include <type_traits>
  14. namespace boost { namespace gil {
  15. template <typename String, typename FormatTag>
  16. inline
  17. auto make_reader_backend(
  18. String const& file_name, image_read_settings<FormatTag> const& settings,
  19. typename std::enable_if
  20. <
  21. mp11::mp_and
  22. <
  23. detail::is_supported_path_spec<String>,
  24. is_format_tag<FormatTag>
  25. >::value
  26. >::type* /*dummy*/ = nullptr)
  27. -> typename get_reader_backend<String, FormatTag>::type
  28. {
  29. using device_t = typename get_read_device<String, FormatTag>::type;
  30. device_t device(
  31. detail::convert_to_native_string(file_name),
  32. typename detail::file_stream_device<FormatTag>::read_tag());
  33. return reader_backend<device_t, FormatTag>(device, settings);
  34. }
  35. template <typename FormatTag>
  36. inline
  37. auto make_reader_backend(
  38. std::wstring const& file_name, image_read_settings<FormatTag> const& settings)
  39. -> typename get_reader_backend<std::wstring, FormatTag>::type
  40. {
  41. char const* str = detail::convert_to_native_string(file_name);
  42. using device_t = typename get_read_device<std::wstring, FormatTag>::type;
  43. device_t device(str, typename detail::file_stream_device<FormatTag>::read_tag());
  44. delete[] str; // TODO: RAII
  45. return reader_backend<device_t, FormatTag>(device, settings);
  46. }
  47. template <typename FormatTag>
  48. inline
  49. auto make_reader_backend(
  50. detail::filesystem::path const& path,
  51. image_read_settings<FormatTag> const& settings)
  52. -> typename get_reader_backend<std::wstring, FormatTag>::type
  53. {
  54. return make_reader_backend(path.wstring(), settings);
  55. }
  56. template <typename Device, typename FormatTag>
  57. inline
  58. auto make_reader_backend(Device& io_dev, image_read_settings<FormatTag> const& settings,
  59. typename std::enable_if
  60. <
  61. mp11::mp_and
  62. <
  63. detail::is_adaptable_input_device<FormatTag, Device>,
  64. is_format_tag<FormatTag>
  65. >::value
  66. >::type* /*dummy*/ = nullptr)
  67. -> typename get_reader_backend<Device, FormatTag>::type
  68. {
  69. using device_t = typename get_read_device<Device, FormatTag>::type;
  70. device_t device(io_dev);
  71. return reader_backend<device_t, FormatTag>(device, settings);
  72. }
  73. template <typename String, typename FormatTag>
  74. inline
  75. auto make_reader_backend(String const& file_name, FormatTag const&,
  76. typename std::enable_if
  77. <
  78. mp11::mp_and
  79. <
  80. detail::is_supported_path_spec<String>,
  81. is_format_tag<FormatTag>
  82. >::value
  83. >::type* /*dummy*/ = nullptr)
  84. -> typename get_reader_backend<String, FormatTag>::type
  85. {
  86. return make_reader_backend(file_name, image_read_settings<FormatTag>());
  87. }
  88. template <typename Device, typename FormatTag>
  89. inline
  90. auto make_reader_backend(Device& io_dev, FormatTag const&,
  91. typename std::enable_if
  92. <
  93. mp11::mp_and
  94. <
  95. detail::is_adaptable_input_device<FormatTag, Device>,
  96. is_format_tag<FormatTag>
  97. >::value
  98. >::type* /*dummy*/ = nullptr)
  99. -> typename get_reader_backend<Device, FormatTag>::type
  100. {
  101. return make_reader_backend(io_dev, image_read_settings<FormatTag>());
  102. }
  103. }} // namespace boost::gil
  104. #endif