Imported Upstream version 1.72.0
[platform/upstream/boost.git] / boost / gil / io / dynamic_io_new.hpp
index 7c66ae7..8a49815 100644 (file)
 
 #include <boost/gil/extension/dynamic_image/dynamic_image_all.hpp>
 
+#include <boost/gil/detail/mp11.hpp>
 #include <boost/gil/io/error.hpp>
 
-#include <boost/mpl/at.hpp>
-#include <boost/mpl/size.hpp>
+#include <type_traits>
 
 namespace boost { namespace gil {
 
 namespace detail {
 
 template <long N>
-struct construct_matched_t {
+struct construct_matched_t
+{
     template <typename Images,typename Pred>
-    static bool apply(any_image<Images>& im,Pred pred) {
-        if (pred.template apply<typename mpl::at_c<Images,N-1>::type>()) {
-            typename mpl::at_c<Images,N-1>::type x;
-            im = std::move(x);
+    static bool apply(any_image<Images>& img, Pred pred)
+    {
+        if (pred.template apply<mp11::mp_at_c<Images, N-1>>())
+        {
+            using image_t = mp11::mp_at_c<Images, N-1>;
+            image_t x;
+            img = std::move(x);
             return true;
-        } else return construct_matched_t<N-1>::apply(im,pred);
+        }
+        else
+            return construct_matched_t<N-1>::apply(img, pred);
     }
 };
 template <>
-struct construct_matched_t<0> {
+struct construct_matched_t<0>
+{
     template <typename Images,typename Pred>
-    static bool apply(any_image<Images>&,Pred) {return false;}
+    static bool apply(any_image<Images>&,Pred) { return false; }
 };
 
 // A function object that can be passed to apply_operation.
-// Given a predicate IsSupported taking a view type and returning an MPL boolean,
+// 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 <typename IsSupported, typename OpClass>
-class dynamic_io_fnobj {
+class dynamic_io_fnobj
+{
+private:
     OpClass* _op;
 
     template <typename View>
-    void apply(const View& view,mpl::true_ ) {_op->apply(view);}
+    void apply(View const& view, std::true_type) { _op->apply(view); }
 
-    template <typename View, typename Info >
-    void apply( const View& view
-              , const Info& info
-              , const mpl::true_
-              )
-    {
-        _op->apply( view, info );
-    }
+    template <typename View, typename Info>
+    void apply(View const& view, Info const & info, const std::true_type) { _op->apply(view, info); }
 
     template <typename View>
-    void apply(const View& /* view */ ,mpl::false_) {io_error("dynamic_io: unsupported view type for the given file format");}
+    void apply(View const& /* view */, std::false_type)
+    {
+        io_error("dynamic_io: unsupported view type for the given file format");
+    }
 
     template <typename View, typename Info >
-    void apply( const View& /* view */
-              , const Info& /* info */
-              , const mpl::false_
-              )
+    void apply(View const& /* view */, Info const& /* info */, const std::false_type)
     {
-        io_error( "dynamic_io: unsupported view type for the given file format" );
+        io_error("dynamic_io: unsupported view type for the given file format");
     }
 
 public:
@@ -73,17 +76,16 @@ public:
     using result_type = void;
 
     template <typename View>
-    void operator()(const View& view) {apply(view,typename IsSupported::template apply<View>::type());}
+    void operator()(View const& view)
+    {
+        apply(view, typename IsSupported::template apply<View>::type());
+    }
 
     template< typename View, typename Info >
-    void operator()(const View& view, const Info& info )
+    void operator()(View const& view, Info const& info)
     {
-        apply( view
-             , info
-             , typename IsSupported::template apply< View >::type()
-             );
+        apply(view, info, typename IsSupported::template apply<View>::type());
     }
-
 };
 
 } // namespace detail
@@ -91,8 +93,10 @@ public:
 /// \brief Within the any_image, constructs an image with the given dimensions
 ///        and a type that satisfies the given predicate
 template <typename Images,typename Pred>
-inline bool construct_matched(any_image<Images>& im,Pred pred) {
-    return detail::construct_matched_t<mpl::size<Images>::value>::apply(im,pred);
+inline bool construct_matched(any_image<Images>& img, Pred pred)
+{
+    constexpr auto size = mp11::mp_size<Images>::value;
+    return detail::construct_matched_t<size>::apply(img, pred);
 }
 
 } }  // namespace boost::gil