// // Copyright 2005-2007 Adobe Systems Incorporated // // Distributed under the Boost Software License, Version 1.0 // See accompanying file LICENSE_1_0.txt or copy at // http://www.boost.org/LICENSE_1_0.txt // #ifndef BOOST_GIL_IO_DETAIL_DYNAMIC_HPP #define BOOST_GIL_IO_DETAIL_DYNAMIC_HPP #include #include #include #include namespace boost { namespace gil { namespace detail { template struct construct_matched_t { template static bool apply(any_image& img, Pred pred) { if (pred.template apply, N-1>>()) { using image_t = mp11::mp_at_c, N-1>; image_t x; img = std::move(x); return true; } else return construct_matched_t::apply(img, pred); } }; template <> struct construct_matched_t<0> { template static bool apply(any_image&, Pred) { return false; } }; // A function object that can be passed to variant2::visit. // Given a predicate IsSupported taking a view type and returning an boolean integral coonstant, // calls the apply method of OpClass with the view if the given view IsSupported, or throws an exception otherwise template class dynamic_io_fnobj { private: OpClass* _op; template void apply(View const& view, std::true_type) { _op->apply(view); } template void apply(View const& view, Info const & info, const std::true_type) { _op->apply(view, info); } template void apply(View const& /* view */, std::false_type) { io_error("dynamic_io: unsupported view type for the given file format"); } template void apply(View const& /* view */, Info const& /* info */, const std::false_type) { io_error("dynamic_io: unsupported view type for the given file format"); } public: dynamic_io_fnobj(OpClass* op) : _op(op) {} using result_type = void; template void operator()(View const& view) { apply(view, typename IsSupported::template apply::type()); } template void operator()(View const& view, Info const& info) { apply(view, info, typename IsSupported::template apply::type()); } }; /// \brief Within the any_image, constructs an image with the given dimensions /// and a type that satisfies the given predicate template inline bool construct_matched(any_image& img, Pred pred) { constexpr auto size = mp11::mp_size>::value; return construct_matched_t::apply(img, pred); } } } } // namespace boost::gil::detail #endif