dynamic_io.hpp

Go to the documentation of this file.
00001 /*
00002     Copyright 2005-2007 Adobe Systems Incorporated
00003    
00004     Use, modification and distribution are subject to the Boost Software License,
00005     Version 1.0. (See accompanying file LICENSE_1_0.txt or copy at
00006     http://www.boost.org/LICENSE_1_0.txt).
00007 
00008     See http://opensource.adobe.com/gil for most recent version including documentation.
00009 */
00010 /*************************************************************************************************/
00011 
00012 #ifndef GIL_DYNAMIC_IO_H
00013 #define GIL_DYNAMIC_IO_H
00014 
00017 //
00021 
00022 #include <boost/mpl/at.hpp>
00023 #include <boost/mpl/size.hpp>
00024 #include "../../gil_config.hpp"
00025 #include "io_error.hpp"
00026 #include "../dynamic_image/any_image.hpp"
00027 
00028 namespace boost { namespace gil {
00029 
00030 namespace detail {
00031 
00032 template <long N>
00033 struct construct_matched_t {
00034     template <typename Images,typename Pred>
00035     static bool apply(any_image<Images>& im,Pred pred) {
00036         if (pred.template apply<typename mpl::at_c<Images,N-1>::type>()) {
00037             typename mpl::at_c<Images,N-1>::type x;
00038             im.move_in(x);
00039             return true;
00040         } else return construct_matched_t<N-1>::apply(im,pred);
00041     }
00042 };
00043 template <>
00044 struct construct_matched_t<0> {
00045     template <typename Images,typename Pred>
00046     static bool apply(any_image<Images>&,Pred) {return false;}
00047 };
00048 
00049 // A function object that can be passed to apply_operation.
00050 // Given a predicate IsSupported taking a view type and returning an MPL boolean,
00051 // calls the apply method of OpClass with the view if the given view IsSupported, or throws an exception otherwise
00052 template <typename IsSupported, typename OpClass>
00053 class dynamic_io_fnobj {
00054     OpClass* _op;
00055 
00056     template <typename View>
00057     void apply(const View& view,mpl::true_ ) {_op->apply(view);}
00058     template <typename View>
00059     void apply(const View& view,mpl::false_) {io_error("dynamic_io: unsupported view type for the given file format");}
00060 public:
00061     dynamic_io_fnobj(OpClass* op) : _op(op) {}
00062 
00063     typedef void result_type;
00064 
00065     template <typename View>
00066     void operator()(const View& view) {apply(view,typename IsSupported::template apply<View>::type());}
00067 };
00068 
00069 } // namespace detail
00070 
00073 template <typename Images,typename Pred>
00074 inline bool construct_matched(any_image<Images>& im,Pred pred) {
00075     return detail::construct_matched_t<mpl::size<Images>::value>::apply(im,pred);
00076 }
00077 
00078 } }  // namespace boost::gil
00079 
00080 #endif

Generated on Sat May 2 13:50:13 2009 for Generic Image Library by  doxygen 1.5.6