gil_concept.hppGo 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 00013 #ifndef GIL_CONCEPT_H 00014 #define GIL_CONCEPT_H 00015 00024 00025 #include <functional> 00026 #include "gil_config.hpp" 00027 #include <boost/type_traits.hpp> 00028 #include <boost/utility/enable_if.hpp> 00029 #include <boost/concept_check.hpp> 00030 #include <boost/iterator/iterator_concepts.hpp> 00031 #include <boost/mpl/and.hpp> 00032 #include <boost/mpl/size.hpp> 00033 00034 namespace boost { namespace gil { 00035 template <typename T> struct channel_traits; 00036 template <typename P> struct is_pixel; 00037 template <typename dstT, typename srcT> 00038 typename channel_traits<dstT>::value_type channel_convert(srcT val); 00039 template <typename T> class point2; 00040 template <std::size_t K, typename T> const T& axis_value(const point2<T>& p); 00041 template <std::size_t K, typename T> T& axis_value( point2<T>& p); 00042 template <typename ColorBase, int K> struct kth_element_type; 00043 template <typename ColorBase, int K> struct kth_element_reference_type; 00044 template <typename ColorBase, int K> struct kth_element_const_reference_type; 00045 template <typename ColorBase, int K> struct kth_semantic_element_reference_type; 00046 template <typename ColorBase, int K> struct kth_semantic_element_const_reference_type; 00047 template <typename ColorBase> struct size; 00048 template <typename ColorBase> struct element_type; 00049 template <typename T> struct channel_type; 00050 template <typename T> struct color_space_type; 00051 template <typename T> struct channel_mapping_type; 00052 template <typename T> struct is_planar; 00053 template <typename T> struct num_channels; 00054 00055 template <typename It> struct const_iterator_type; 00056 template <typename It> struct iterator_is_mutable; 00057 template <typename It> struct is_iterator_adaptor; 00058 template <typename It, typename NewBaseIt> struct iterator_adaptor_rebind; 00059 template <typename It> struct iterator_adaptor_get_base; 00060 00061 00062 // forward-declare at_c 00063 namespace detail { template <typename Element, typename Layout, int K> struct homogeneous_color_base; } 00064 template <int K, typename E, typename L, int N> 00065 typename add_reference<E>::type at_c( detail::homogeneous_color_base<E,L,N>& p); 00066 00067 template <int K, typename E, typename L, int N> 00068 typename add_reference<typename add_const<E>::type>::type at_c(const detail::homogeneous_color_base<E,L,N>& p); 00069 00070 #if !defined(_MSC_VER) || _MSC_VER > 1310 00071 template <typename P, typename C, typename L> struct packed_pixel; 00072 template <int K, typename P, typename C, typename L> 00073 typename kth_element_reference_type<packed_pixel<P,C,L>, K>::type 00074 at_c(packed_pixel<P,C,L>& p); 00075 00076 template <int K, typename P, typename C, typename L> 00077 typename kth_element_const_reference_type<packed_pixel<P,C,L>,K>::type 00078 at_c(const packed_pixel<P,C,L>& p); 00079 00080 template <typename B, typename C, typename L, bool M> struct bit_aligned_pixel_reference; 00081 00082 template <int K, typename B, typename C, typename L, bool M> inline 00083 typename kth_element_reference_type<bit_aligned_pixel_reference<B,C,L,M>, K>::type 00084 at_c(const bit_aligned_pixel_reference<B,C,L,M>& p); 00085 #endif 00086 00087 // Forward-declare semantic_at_c 00088 template <int K, typename ColorBase> 00089 typename disable_if<is_const<ColorBase>,typename kth_semantic_element_reference_type<ColorBase,K>::type>::type semantic_at_c(ColorBase& p); 00090 template <int K, typename ColorBase> 00091 typename kth_semantic_element_const_reference_type<ColorBase,K>::type semantic_at_c(const ColorBase& p); 00092 00093 template <typename T> struct dynamic_x_step_type; 00094 template <typename T> struct dynamic_y_step_type; 00095 template <typename T> struct transposed_type; 00096 00097 namespace detail { 00098 template <typename T> 00099 void initialize_it(T& x) {} 00100 } // namespace detail 00101 00102 template <typename T> 00103 struct remove_const_and_reference : public remove_const<typename remove_reference<T>::type> {}; 00104 00105 #ifdef BOOST_GIL_USE_CONCEPT_CHECK 00106 #define GIL_CLASS_REQUIRE(type_var, ns, concept) BOOST_CLASS_REQUIRE(type_var, ns, concept); 00107 template <typename C> void gil_function_requires() { function_requires<C>(); } 00108 #else 00109 #define GIL_CLASS_REQUIRE(T,NS,C) 00110 template <typename C> void gil_function_requires() {} 00111 #endif 00112 00114 00121 template <typename T> 00122 struct DefaultConstructible { 00123 void constraints() { 00124 function_requires<boost::DefaultConstructibleConcept<T> >(); 00125 } 00126 }; 00127 00129 00136 template <typename T> 00137 struct CopyConstructible { 00138 void constraints() { 00139 function_requires<boost::CopyConstructibleConcept<T> >(); 00140 } 00141 }; 00142 00144 00152 template <typename T> 00153 struct Assignable { 00154 void constraints() { 00155 function_requires<boost::AssignableConcept<T> >(); 00156 } 00157 }; 00159 00167 template <typename T> 00168 struct EqualityComparable { 00169 void constraints() { 00170 function_requires<boost::EqualityComparableConcept<T> >(); 00171 } 00172 }; 00173 00175 00181 template <typename T, typename U> 00182 struct SameType { 00183 void constraints() { 00184 BOOST_STATIC_ASSERT((boost::is_same<T,U>::value_core)); 00185 } 00186 }; 00187 00189 00196 template <typename T> 00197 struct Swappable { 00198 void constraints() { 00199 using std::swap; 00200 swap(x,y); 00201 } 00202 T x,y; 00203 }; 00204 00206 00213 template <typename T> 00214 struct Regular { 00215 void constraints() { 00216 gil_function_requires< boost::DefaultConstructibleConcept<T> >(); 00217 gil_function_requires< boost::CopyConstructibleConcept<T> >(); 00218 gil_function_requires< boost::EqualityComparableConcept<T> >(); // ==, != 00219 gil_function_requires< boost::AssignableConcept<T> >(); 00220 gil_function_requires< Swappable<T> >(); 00221 } 00222 }; 00223 00225 00232 template <typename T> 00233 struct Metafunction { 00234 void constraints() { 00235 typedef typename T::type type; 00236 } 00237 }; 00239 // 00240 // POINT CONCEPTS 00241 // 00243 00246 00261 template <typename P> 00262 struct PointNDConcept { 00263 void constraints() { 00264 gil_function_requires< Regular<P> >(); 00265 00266 typedef typename P::value_type value_type; 00267 static const std::size_t N=P::num_dimensions; ignore_unused_variable_warning(N); 00268 typedef typename P::template axis<0>::coord_t FT; 00269 typedef typename P::template axis<N-1>::coord_t LT; 00270 FT ft=gil::axis_value<0>(point); 00271 axis_value<0>(point)=ft; 00272 LT lt=axis_value<N-1>(point); 00273 axis_value<N-1>(point)=lt; 00274 00275 value_type v=point[0]; ignore_unused_variable_warning(v); 00276 point[0]=point[0]; 00277 } 00278 P point; 00279 }; 00280 00283 00299 template <typename P> 00300 struct Point2DConcept { 00301 void constraints() { 00302 gil_function_requires< PointNDConcept<P> >(); 00303 BOOST_STATIC_ASSERT(P::num_dimensions == 2); 00304 point.x=point.y; 00305 point[0]=point[1]; 00306 } 00307 P point; 00308 }; 00309 00311 // 00312 // ITERATOR MUTABILITY CONCEPTS 00313 // 00314 // Taken from boost's concept_check.hpp. Isolating mutability to result in faster compile time 00315 // 00317 00318 namespace detail { 00319 template <class TT> // Preconditions: TT Models boost_concepts::ForwardTraversalConcept 00320 struct ForwardIteratorIsMutableConcept { 00321 void constraints() { 00322 *i++ = *i; // require postincrement and assignment 00323 } 00324 TT i; 00325 }; 00326 00327 template <class TT> // Preconditions: TT Models boost::BidirectionalIteratorConcept 00328 struct BidirectionalIteratorIsMutableConcept { 00329 void constraints() { 00330 gil_function_requires< ForwardIteratorIsMutableConcept<TT> >(); 00331 *i-- = *i; // require postdecrement and assignment 00332 } 00333 TT i; 00334 }; 00335 00336 template <class TT> // Preconditions: TT Models boost_concepts::RandomAccessTraversalConcept 00337 struct RandomAccessIteratorIsMutableConcept { 00338 void constraints() { 00339 gil_function_requires< BidirectionalIteratorIsMutableConcept<TT> >(); 00340 typename std::iterator_traits<TT>::difference_type n=0; ignore_unused_variable_warning(n); 00341 i[n] = *i; // require element access and assignment 00342 } 00343 TT i; 00344 }; 00345 } // namespace detail 00346 00348 // 00349 // COLOR SPACE CONCEPTS 00350 // 00352 00355 00362 template <typename Cs> 00363 struct ColorSpaceConcept { 00364 void constraints() { 00365 // An MPL Random Access Sequence, whose elements are color tags 00366 } 00367 }; 00368 00369 template <typename ColorSpace1, typename ColorSpace2> // Models ColorSpaceConcept 00370 struct color_spaces_are_compatible : public is_same<ColorSpace1,ColorSpace2> {}; 00371 00374 00381 template <typename Cs1, typename Cs2> 00382 struct ColorSpacesCompatibleConcept { 00383 void constraints() { 00384 BOOST_STATIC_ASSERT((color_spaces_are_compatible<Cs1,Cs2>::value)); 00385 } 00386 }; 00387 00390 00397 template <typename CM> 00398 struct ChannelMappingConcept { 00399 void constraints() { 00400 // An MPL Random Access Sequence, whose elements model MPLIntegralConstant representing a permutation 00401 } 00402 }; 00403 00404 00405 00411 00414 00436 template <typename T> 00437 struct ChannelConcept { 00438 void constraints() { 00439 gil_function_requires< boost::EqualityComparableConcept<T> >(); 00440 00441 typedef typename channel_traits<T>::value_type v; 00442 typedef typename channel_traits<T>::reference r; 00443 typedef typename channel_traits<T>::pointer p; 00444 typedef typename channel_traits<T>::const_reference cr; 00445 typedef typename channel_traits<T>::const_pointer cp; 00446 00447 channel_traits<T>::min_value(); 00448 channel_traits<T>::max_value(); 00449 } 00450 00451 T c; 00452 }; 00453 00454 namespace detail { 00455 // Preconditions: T models ChannelConcept 00456 template <typename T> 00457 struct ChannelIsMutableConcept { 00458 void constraints() { 00459 c=c; 00460 using std::swap; 00461 swap(c,c); 00462 } 00463 T c; 00464 }; 00465 } 00466 00469 00474 template <typename T> 00475 struct MutableChannelConcept { 00476 void constraints() { 00477 gil_function_requires<ChannelConcept<T> >(); 00478 gil_function_requires<detail::ChannelIsMutableConcept<T> >(); 00479 } 00480 }; 00481 00484 00489 template <typename T> 00490 struct ChannelValueConcept { 00491 void constraints() { 00492 gil_function_requires<ChannelConcept<T> >(); 00493 gil_function_requires<Regular<T> >(); 00494 } 00495 }; 00496 00497 00502 00509 template <typename T1, typename T2> // Models GIL Pixel 00510 struct channels_are_compatible 00511 : public is_same<typename channel_traits<T1>::value_type, typename channel_traits<T2>::value_type> {}; 00512 00515 00522 template <typename T1, typename T2> 00523 struct ChannelsCompatibleConcept { 00524 void constraints() { 00525 BOOST_STATIC_ASSERT((channels_are_compatible<T1,T2>::value)); 00526 } 00527 }; 00528 00533 00540 template <typename SrcChannel, typename DstChannel> 00541 struct ChannelConvertibleConcept { 00542 void constraints() { 00543 gil_function_requires<ChannelConcept<SrcChannel> >(); 00544 gil_function_requires<MutableChannelConcept<DstChannel> >(); 00545 dst=channel_convert<DstChannel,SrcChannel>(src); ignore_unused_variable_warning(dst); 00546 } 00547 SrcChannel src; 00548 DstChannel dst; 00549 }; 00550 00551 00552 00553 00554 00560 00563 00603 template <typename ColorBase> 00604 struct ColorBaseConcept { 00605 void constraints() { 00606 gil_function_requires< CopyConstructible<ColorBase> >(); 00607 gil_function_requires< EqualityComparable<ColorBase> >(); 00608 00609 typedef typename ColorBase::layout_t::color_space_t color_space_t; 00610 gil_function_requires<ColorSpaceConcept<color_space_t> >(); 00611 00612 typedef typename ColorBase::layout_t::channel_mapping_t channel_mapping_t; 00613 // TODO: channel_mapping_t must be an MPL RandomAccessSequence 00614 00615 static const std::size_t num_elements = size<ColorBase>::value; 00616 00617 typedef typename kth_element_type<ColorBase,num_elements-1>::type TN; 00618 typedef typename kth_element_const_reference_type<ColorBase,num_elements-1>::type CR; 00619 00620 #if !defined(_MSC_VER) || _MSC_VER > 1310 00621 CR cr=at_c<num_elements-1>(cb); ignore_unused_variable_warning(cr); 00622 #endif 00623 00624 // functions that work for every pixel (no need to require them) 00625 semantic_at_c<0>(cb); 00626 semantic_at_c<num_elements-1>(cb); 00627 // also static_max(cb), static_min(cb), static_fill(cb,value), and all variations of static_for_each(), static_generate(), static_transform() 00628 } 00629 00630 ColorBase cb; 00631 }; 00632 00635 00648 template <typename ColorBase> 00649 struct MutableColorBaseConcept { 00650 void constraints() { 00651 gil_function_requires< ColorBaseConcept<ColorBase> >(); 00652 gil_function_requires< Assignable<ColorBase> >(); 00653 gil_function_requires< Swappable<ColorBase> >(); 00654 00655 typedef typename kth_element_reference_type<ColorBase, 0>::type CR; 00656 00657 #if !defined(_MSC_VER) || _MSC_VER > 1310 00658 CR r=at_c<0>(cb); 00659 at_c<0>(cb)=r; 00660 #endif 00661 } 00662 00663 ColorBase cb; 00664 }; 00665 00668 00674 template <typename ColorBase> 00675 struct ColorBaseValueConcept { 00676 void constraints() { 00677 gil_function_requires< MutableColorBaseConcept<ColorBase> >(); 00678 gil_function_requires< Regular<ColorBase> >(); 00679 } 00680 }; 00681 00684 00694 template <typename ColorBase> 00695 struct HomogeneousColorBaseConcept { 00696 void constraints() { 00697 gil_function_requires< ColorBaseConcept<ColorBase> >(); 00698 00699 static const std::size_t num_elements = size<ColorBase>::value; 00700 00701 typedef typename kth_element_type<ColorBase,0>::type T0; 00702 typedef typename kth_element_type<ColorBase,num_elements-1>::type TN; 00703 00704 BOOST_STATIC_ASSERT((is_same<T0,TN>::value)); // better than nothing 00705 typedef typename kth_element_const_reference_type<ColorBase,0>::type CRef0; 00706 CRef0 e0=dynamic_at_c(cb,0); 00707 } 00708 ColorBase cb; 00709 }; 00710 00713 00722 template <typename ColorBase> 00723 struct MutableHomogeneousColorBaseConcept { 00724 void constraints() { 00725 gil_function_requires< ColorBaseConcept<ColorBase> >(); 00726 gil_function_requires< HomogeneousColorBaseConcept<ColorBase> >(); 00727 typedef typename kth_element_reference_type<ColorBase, 0>::type R0; 00728 R0 x=dynamic_at_c(cb,0); 00729 dynamic_at_c(cb,0) = dynamic_at_c(cb,0); 00730 } 00731 ColorBase cb; 00732 }; 00733 00736 00744 template <typename ColorBase> 00745 struct HomogeneousColorBaseValueConcept { 00746 void constraints() { 00747 gil_function_requires< MutableHomogeneousColorBaseConcept<ColorBase> >(); 00748 gil_function_requires< Regular<ColorBase> >(); 00749 } 00750 }; 00751 00752 00755 00766 template <typename ColorBase1, typename ColorBase2> 00767 struct ColorBasesCompatibleConcept { 00768 void constraints() { 00769 BOOST_STATIC_ASSERT((is_same<typename ColorBase1::layout_t::color_space_t, 00770 typename ColorBase2::layout_t::color_space_t>::value)); 00771 // typedef typename kth_semantic_element_type<ColorBase1,0>::type e1; 00772 // typedef typename kth_semantic_element_type<ColorBase2,0>::type e2; 00773 // "e1 is convertible to e2" 00774 } 00775 }; 00776 00777 00778 00779 00780 00781 00782 00783 00784 00785 00786 00787 00788 00789 00790 00791 00792 00793 00794 00795 00796 00797 00803 00806 00821 template <typename P> 00822 struct PixelBasedConcept { 00823 void constraints() { 00824 typedef typename color_space_type<P>::type color_space_t; 00825 gil_function_requires<ColorSpaceConcept<color_space_t> >(); 00826 typedef typename channel_mapping_type<P>::type channel_mapping_t; 00827 gil_function_requires<ChannelMappingConcept<channel_mapping_t> >(); 00828 00829 static const bool planar = is_planar<P>::type::value; ignore_unused_variable_warning(planar); 00830 00831 00832 // This is not part of the concept, but should still work 00833 static const std::size_t nc = num_channels<P>::value; 00834 ignore_unused_variable_warning(nc); 00835 } 00836 }; 00837 00840 00849 template <typename P> 00850 struct HomogeneousPixelBasedConcept { 00851 void constraints() { 00852 gil_function_requires<PixelBasedConcept<P> >(); 00853 typedef typename channel_type<P>::type channel_t; 00854 gil_function_requires<ChannelConcept<channel_t> >(); 00855 } 00856 }; 00857 00858 00861 00883 template <typename P> 00884 struct PixelConcept { 00885 void constraints() { 00886 gil_function_requires<ColorBaseConcept<P> >(); 00887 gil_function_requires<PixelBasedConcept<P> >(); 00888 00889 BOOST_STATIC_ASSERT((is_pixel<P>::value)); 00890 static const bool is_mutable = P::is_mutable; ignore_unused_variable_warning(is_mutable); 00891 00892 typedef typename P::value_type value_type; 00893 // gil_function_requires<PixelValueConcept<value_type> >(); 00894 00895 typedef typename P::reference reference; 00896 gil_function_requires<PixelConcept<typename remove_const_and_reference<reference>::type> >(); 00897 00898 typedef typename P::const_reference const_reference; 00899 gil_function_requires<PixelConcept<typename remove_const_and_reference<const_reference>::type> >(); 00900 } 00901 }; 00902 00903 00906 00913 template <typename P> 00914 struct MutablePixelConcept { 00915 void constraints() { 00916 gil_function_requires<PixelConcept<P> >(); 00917 BOOST_STATIC_ASSERT(P::is_mutable); 00918 } 00919 }; 00922 00929 template <typename P> 00930 struct HomogeneousPixelConcept { 00931 void constraints() { 00932 gil_function_requires<PixelConcept<P> >(); 00933 gil_function_requires<HomogeneousColorBaseConcept<P> >(); 00934 gil_function_requires<HomogeneousPixelBasedConcept<P> >(); 00935 p[0]; 00936 } 00937 P p; 00938 }; 00939 00942 00949 template <typename P> 00950 struct MutableHomogeneousPixelConcept { 00951 void constraints() { 00952 gil_function_requires<HomogeneousPixelConcept<P> >(); 00953 gil_function_requires<MutableHomogeneousColorBaseConcept<P> >(); 00954 p[0]=p[0]; 00955 } 00956 P p; 00957 }; 00958 00961 00968 template <typename P> 00969 struct PixelValueConcept { 00970 void constraints() { 00971 gil_function_requires<PixelConcept<P> >(); 00972 gil_function_requires<Regular<P> >(); 00973 } 00974 }; 00975 00978 00985 template <typename P> 00986 struct HomogeneousPixelValueConcept { 00987 void constraints() { 00988 gil_function_requires<HomogeneousPixelConcept<P> >(); 00989 gil_function_requires<Regular<P> >(); 00990 BOOST_STATIC_ASSERT((is_same<P, typename P::value_type>::value)); 00991 } 00992 }; 00993 00994 namespace detail { 00995 template <typename P1, typename P2, int K> 00996 struct channels_are_pairwise_compatible : public 00997 mpl::and_<channels_are_pairwise_compatible<P1,P2,K-1>, 00998 channels_are_compatible<typename kth_semantic_element_reference_type<P1,K>::type, 00999 typename kth_semantic_element_reference_type<P2,K>::type> > {}; 01000 01001 template <typename P1, typename P2> 01002 struct channels_are_pairwise_compatible<P1,P2,-1> : public mpl::true_ {}; 01003 } 01004 01009 template <typename P1, typename P2> // Models GIL Pixel 01010 struct pixels_are_compatible 01011 : public mpl::and_<typename color_spaces_are_compatible<typename color_space_type<P1>::type, 01012 typename color_space_type<P2>::type>::type, 01013 detail::channels_are_pairwise_compatible<P1,P2,num_channels<P1>::value-1> > {}; 01014 01018 01026 template <typename P1, typename P2> // precondition: P1 and P2 model PixelConcept 01027 struct PixelsCompatibleConcept { 01028 void constraints() { 01029 BOOST_STATIC_ASSERT((pixels_are_compatible<P1,P2>::value)); 01030 } 01031 }; 01032 01037 01045 template <typename SrcP, typename DstP> 01046 struct PixelConvertibleConcept { 01047 void constraints() { 01048 gil_function_requires<PixelConcept<SrcP> >(); 01049 gil_function_requires<MutablePixelConcept<DstP> >(); 01050 color_convert(src,dst); 01051 } 01052 SrcP src; 01053 DstP dst; 01054 }; 01055 01061 01063 01067 01082 template <typename D> 01083 struct PixelDereferenceAdaptorConcept { 01084 void constraints() { 01085 gil_function_requires< boost::UnaryFunctionConcept<D, 01086 typename remove_const_and_reference<typename D::result_type>::type, 01087 typename D::argument_type> >(); 01088 gil_function_requires< boost::DefaultConstructibleConcept<D> >(); 01089 gil_function_requires< boost::CopyConstructibleConcept<D> >(); 01090 gil_function_requires< boost::AssignableConcept<D> >(); 01091 01092 gil_function_requires<PixelConcept<typename remove_const_and_reference<typename D::result_type>::type> >(); 01093 01094 typedef typename D::const_t const_t; 01095 gil_function_requires<PixelDereferenceAdaptorConcept<const_t> >(); 01096 typedef typename D::value_type value_type; 01097 gil_function_requires<PixelValueConcept<value_type> >(); 01098 typedef typename D::reference reference; // == PixelConcept (if you remove const and reference) 01099 typedef typename D::const_reference const_reference; // == PixelConcept (if you remove const and reference) 01100 01101 const bool is_mutable=D::is_mutable; ignore_unused_variable_warning(is_mutable); 01102 } 01103 D d; 01104 }; 01105 01106 template <typename P> 01107 struct PixelDereferenceAdaptorArchetype : public std::unary_function<P, P> { 01108 typedef PixelDereferenceAdaptorArchetype const_t; 01109 typedef typename remove_reference<P>::type value_type; 01110 typedef typename add_reference<P>::type reference; 01111 typedef reference const_reference; 01112 static const bool is_mutable=false; 01113 P operator()(P x) const { throw; } 01114 }; 01115 01121 01124 01132 template <typename T> 01133 struct HasDynamicXStepTypeConcept { 01134 void constraints() { 01135 typedef typename dynamic_x_step_type<T>::type type; 01136 } 01137 }; 01138 01141 01149 template <typename T> 01150 struct HasDynamicYStepTypeConcept { 01151 void constraints() { 01152 typedef typename dynamic_y_step_type<T>::type type; 01153 } 01154 }; 01155 01156 01159 01167 template <typename T> 01168 struct HasTransposedTypeConcept { 01169 void constraints() { 01170 typedef typename transposed_type<T>::type type; 01171 } 01172 }; 01173 01177 01180 01196 template <typename Iterator> 01197 struct PixelIteratorConcept { 01198 void constraints() { 01199 gil_function_requires<boost_concepts::RandomAccessTraversalConcept<Iterator> >(); 01200 gil_function_requires<PixelBasedConcept<Iterator> >(); 01201 01202 typedef typename std::iterator_traits<Iterator>::value_type value_type; 01203 gil_function_requires<PixelValueConcept<value_type> >(); 01204 01205 typedef typename const_iterator_type<Iterator>::type const_t; 01206 static const bool is_mut = iterator_is_mutable<Iterator>::type::value; ignore_unused_variable_warning(is_mut); 01207 01208 const_t const_it(it); ignore_unused_variable_warning(const_it); // immutable iterator must be constructible from (possibly mutable) iterator 01209 01210 check_base(typename is_iterator_adaptor<Iterator>::type()); 01211 } 01212 void check_base(mpl::false_) {} 01213 void check_base(mpl::true_) { 01214 typedef typename iterator_adaptor_get_base<Iterator>::type base_t; 01215 gil_function_requires<PixelIteratorConcept<base_t> >(); 01216 } 01217 01218 Iterator it; 01219 }; 01220 01221 namespace detail { 01222 template <typename Iterator> // Preconditions: Iterator Models PixelIteratorConcept 01223 struct PixelIteratorIsMutableConcept { 01224 void constraints() { 01225 gil_function_requires<detail::RandomAccessIteratorIsMutableConcept<Iterator> >(); 01226 typedef typename remove_reference<typename std::iterator_traits<Iterator>::reference>::type ref; 01227 typedef typename element_type<ref>::type channel_t; 01228 gil_function_requires<detail::ChannelIsMutableConcept<channel_t> >(); 01229 } 01230 }; 01231 } 01232 01235 01241 template <typename Iterator> 01242 struct MutablePixelIteratorConcept { 01243 void constraints() { 01244 gil_function_requires<PixelIteratorConcept<Iterator> >(); 01245 gil_function_requires<detail::PixelIteratorIsMutableConcept<Iterator> >(); 01246 } 01247 }; 01248 01249 namespace detail { 01250 // Iterators that can be used as the base of memory_based_step_iterator require some additional functions 01251 template <typename Iterator> // Preconditions: Iterator Models boost_concepts::RandomAccessTraversalConcept 01252 struct RandomAccessIteratorIsMemoryBasedConcept { 01253 void constraints() { 01254 std::ptrdiff_t bs=memunit_step(it); ignore_unused_variable_warning(bs); 01255 it=memunit_advanced(it,3); 01256 std::ptrdiff_t bd=memunit_distance(it,it); ignore_unused_variable_warning(bd); 01257 memunit_advance(it,3); 01258 // for performace you may also provide a customized implementation of memunit_advanced_ref 01259 } 01260 Iterator it; 01261 }; 01262 } 01263 01267 01270 01282 template <typename Iterator> 01283 struct MemoryBasedIteratorConcept { 01284 void constraints() { 01285 gil_function_requires<boost_concepts::RandomAccessTraversalConcept<Iterator> >(); 01286 gil_function_requires<detail::RandomAccessIteratorIsMemoryBasedConcept<Iterator> >(); 01287 } 01288 }; 01289 01294 01301 template <typename Iterator> 01302 struct StepIteratorConcept { 01303 void constraints() { 01304 gil_function_requires<boost_concepts::ForwardTraversalConcept<Iterator> >(); 01305 it.set_step(0); 01306 } 01307 Iterator it; 01308 }; 01309 01310 01314 01319 template <typename Iterator> 01320 struct MutableStepIteratorConcept { 01321 void constraints() { 01322 gil_function_requires<StepIteratorConcept<Iterator> >(); 01323 gil_function_requires<detail::ForwardIteratorIsMutableConcept<Iterator> >(); 01324 } 01325 }; 01326 01330 01333 01358 template <typename Iterator> 01359 struct IteratorAdaptorConcept { 01360 void constraints() { 01361 gil_function_requires<boost_concepts::ForwardTraversalConcept<Iterator> >(); 01362 01363 typedef typename iterator_adaptor_get_base<Iterator>::type base_t; 01364 gil_function_requires<boost_concepts::ForwardTraversalConcept<base_t> >(); 01365 01366 BOOST_STATIC_ASSERT(is_iterator_adaptor<Iterator>::value); 01367 typedef typename iterator_adaptor_rebind<Iterator, void*>::type rebind_t; 01368 01369 base_t base=it.base(); ignore_unused_variable_warning(base); 01370 } 01371 Iterator it; 01372 }; 01373 01376 01381 template <typename Iterator> 01382 struct MutableIteratorAdaptorConcept { 01383 void constraints() { 01384 gil_function_requires<IteratorAdaptorConcept<Iterator> >(); 01385 gil_function_requires<detail::ForwardIteratorIsMutableConcept<Iterator> >(); 01386 } 01387 }; 01388 01394 01398 01402 01406 01409 01455 template <typename Loc> 01456 struct RandomAccessNDLocatorConcept { 01457 void constraints() { 01458 gil_function_requires< Regular<Loc> >(); 01459 01460 typedef typename Loc::value_type value_type; 01461 typedef typename Loc::reference reference; // result of dereferencing 01462 typedef typename Loc::difference_type difference_type; // result of operator-(pixel_locator, pixel_locator) 01463 typedef typename Loc::cached_location_t cached_location_t; // type used to store relative location (to allow for more efficient repeated access) 01464 typedef typename Loc::const_t const_t; // same as this type, but over const values 01465 typedef typename Loc::point_t point_t; // same as difference_type 01466 static const std::size_t N=Loc::num_dimensions; ignore_unused_variable_warning(N); 01467 01468 typedef typename Loc::template axis<0>::iterator first_it_type; 01469 typedef typename Loc::template axis<N-1>::iterator last_it_type; 01470 gil_function_requires<boost_concepts::RandomAccessTraversalConcept<first_it_type> >(); 01471 gil_function_requires<boost_concepts::RandomAccessTraversalConcept<last_it_type> >(); 01472 01473 // point_t must be an N-dimensional point, each dimension of which must have the same type as difference_type of the corresponding iterator 01474 gil_function_requires<PointNDConcept<point_t> >(); 01475 BOOST_STATIC_ASSERT(point_t::num_dimensions==N); 01476 BOOST_STATIC_ASSERT((is_same<typename std::iterator_traits<first_it_type>::difference_type, typename point_t::template axis<0>::coord_t>::value)); 01477 BOOST_STATIC_ASSERT((is_same<typename std::iterator_traits<last_it_type>::difference_type, typename point_t::template axis<N-1>::coord_t>::value)); 01478 01479 difference_type d; 01480 loc+=d; 01481 loc-=d; 01482 loc=loc+d; 01483 loc=loc-d; 01484 reference r1=loc[d]; ignore_unused_variable_warning(r1); 01485 reference r2=*loc; ignore_unused_variable_warning(r2); 01486 cached_location_t cl=loc.cache_location(d); ignore_unused_variable_warning(cl); 01487 reference r3=loc[d]; ignore_unused_variable_warning(r3); 01488 01489 first_it_type fi=loc.template axis_iterator<0>(); 01490 fi=loc.template axis_iterator<0>(d); 01491 last_it_type li=loc.template axis_iterator<N-1>(); 01492 li=loc.template axis_iterator<N-1>(d); 01493 01494 typedef PixelDereferenceAdaptorArchetype<typename Loc::value_type> deref_t; 01495 typedef typename Loc::template add_deref<deref_t>::type dtype; 01496 //gil_function_requires<RandomAccessNDLocatorConcept<dtype> >(); // infinite recursion 01497 } 01498 Loc loc; 01499 }; 01500 01503 01541 template <typename Loc> 01542 struct RandomAccess2DLocatorConcept { 01543 void constraints() { 01544 gil_function_requires<RandomAccessNDLocatorConcept<Loc> >(); 01545 BOOST_STATIC_ASSERT(Loc::num_dimensions==2); 01546 01547 typedef typename dynamic_x_step_type<Loc>::type dynamic_x_step_t; 01548 typedef typename dynamic_y_step_type<Loc>::type dynamic_y_step_t; 01549 typedef typename transposed_type<Loc>::type transposed_t; 01550 01551 typedef typename Loc::cached_location_t cached_location_t; 01552 gil_function_requires<Point2DConcept<typename Loc::point_t> >(); 01553 01554 typedef typename Loc::x_iterator x_iterator; 01555 typedef typename Loc::y_iterator y_iterator; 01556 typedef typename Loc::x_coord_t x_coord_t; 01557 typedef typename Loc::y_coord_t y_coord_t; 01558 01559 x_coord_t xd=0; ignore_unused_variable_warning(xd); 01560 y_coord_t yd=0; ignore_unused_variable_warning(yd); 01561 01562 typename Loc::difference_type d; 01563 typename Loc::reference r=loc(xd,yd); ignore_unused_variable_warning(r); 01564 01565 dynamic_x_step_t loc2(dynamic_x_step_t(), yd); 01566 dynamic_x_step_t loc3(dynamic_x_step_t(), xd, yd); 01567 01568 typedef typename dynamic_y_step_type<typename dynamic_x_step_type<transposed_t>::type>::type dynamic_xy_step_transposed_t; 01569 dynamic_xy_step_transposed_t loc4(loc, xd,yd,true); 01570 01571 bool is_contiguous=loc.is_1d_traversable(xd); ignore_unused_variable_warning(is_contiguous); 01572 loc.y_distance_to(loc, xd); 01573 01574 loc=loc.xy_at(d); 01575 loc=loc.xy_at(xd,yd); 01576 01577 x_iterator xit=loc.x_at(d); 01578 xit=loc.x_at(xd,yd); 01579 xit=loc.x(); 01580 01581 y_iterator yit=loc.y_at(d); 01582 yit=loc.y_at(xd,yd); 01583 yit=loc.y(); 01584 01585 cached_location_t cl=loc.cache_location(xd,yd); ignore_unused_variable_warning(cl); 01586 } 01587 Loc loc; 01588 }; 01589 01592 01604 template <typename Loc> 01605 struct PixelLocatorConcept { 01606 void constraints() { 01607 gil_function_requires< RandomAccess2DLocatorConcept<Loc> >(); 01608 gil_function_requires< PixelIteratorConcept<typename Loc::x_iterator> >(); 01609 gil_function_requires< PixelIteratorConcept<typename Loc::y_iterator> >(); 01610 typedef typename Loc::coord_t coord_t; 01611 BOOST_STATIC_ASSERT((is_same<typename Loc::x_coord_t, typename Loc::y_coord_t>::value)); 01612 } 01613 Loc loc; 01614 }; 01615 01616 namespace detail { 01617 template <typename Loc> // preconditions: Loc Models RandomAccessNDLocatorConcept 01618 struct RandomAccessNDLocatorIsMutableConcept { 01619 void constraints() { 01620 gil_function_requires<detail::RandomAccessIteratorIsMutableConcept<typename Loc::template axis<0>::iterator> >(); 01621 gil_function_requires<detail::RandomAccessIteratorIsMutableConcept<typename Loc::template axis<Loc::num_dimensions-1>::iterator> >(); 01622 01623 typename Loc::difference_type d; initialize_it(d); 01624 typename Loc::value_type v;initialize_it(v); 01625 typename Loc::cached_location_t cl=loc.cache_location(d); 01626 *loc=v; 01627 loc[d]=v; 01628 loc[cl]=v; 01629 } 01630 Loc loc; 01631 }; 01632 01633 template <typename Loc> // preconditions: Loc Models RandomAccess2DLocatorConcept 01634 struct RandomAccess2DLocatorIsMutableConcept { 01635 void constraints() { 01636 gil_function_requires<detail::RandomAccessNDLocatorIsMutableConcept<Loc> >(); 01637 typename Loc::x_coord_t xd=0; ignore_unused_variable_warning(xd); 01638 typename Loc::y_coord_t yd=0; ignore_unused_variable_warning(yd); 01639 typename Loc::value_type v; initialize_it(v); 01640 loc(xd,yd)=v; 01641 } 01642 Loc loc; 01643 }; 01644 } 01645 01648 01655 template <typename Loc> 01656 struct MutableRandomAccessNDLocatorConcept { 01657 void constraints() { 01658 gil_function_requires<RandomAccessNDLocatorConcept<Loc> >(); 01659 gil_function_requires<detail::RandomAccessNDLocatorIsMutableConcept<Loc> >(); 01660 } 01661 }; 01662 01665 01670 template <typename Loc> 01671 struct MutableRandomAccess2DLocatorConcept { 01672 void constraints() { 01673 gil_function_requires< RandomAccess2DLocatorConcept<Loc> >(); 01674 gil_function_requires<detail::RandomAccess2DLocatorIsMutableConcept<Loc> >(); 01675 } 01676 }; 01677 01680 01685 template <typename Loc> 01686 struct MutablePixelLocatorConcept { 01687 void constraints() { 01688 gil_function_requires<PixelLocatorConcept<Loc> >(); 01689 gil_function_requires<detail::RandomAccess2DLocatorIsMutableConcept<Loc> >(); 01690 } 01691 }; 01692 01698 01702 01706 01710 01713 01762 template <typename View> 01763 struct RandomAccessNDImageViewConcept { 01764 void constraints() { 01765 gil_function_requires< Regular<View> >(); 01766 01767 typedef typename View::value_type value_type; 01768 typedef typename View::reference reference; // result of dereferencing 01769 typedef typename View::difference_type difference_type; // result of operator-(1d_iterator,1d_iterator) 01770 typedef typename View::const_t const_t; // same as this type, but over const values 01771 typedef typename View::point_t point_t; // N-dimensional point 01772 typedef typename View::locator locator; // N-dimensional locator 01773 typedef typename View::iterator iterator; 01774 typedef typename View::reverse_iterator reverse_iterator; 01775 typedef typename View::size_type size_type; 01776 static const std::size_t N=View::num_dimensions; 01777 01778 gil_function_requires<RandomAccessNDLocatorConcept<locator> >(); 01779 gil_function_requires<boost_concepts::RandomAccessTraversalConcept<iterator> >(); 01780 gil_function_requires<boost_concepts::RandomAccessTraversalConcept<reverse_iterator> >(); 01781 01782 typedef typename View::template axis<0>::iterator first_it_type; 01783 typedef typename View::template axis<N-1>::iterator last_it_type; 01784 gil_function_requires<boost_concepts::RandomAccessTraversalConcept<first_it_type> >(); 01785 gil_function_requires<boost_concepts::RandomAccessTraversalConcept<last_it_type> >(); 01786 01787 // BOOST_STATIC_ASSERT((typename std::iterator_traits<first_it_type>::difference_type, typename point_t::template axis<0>::coord_t>::value)); 01788 // BOOST_STATIC_ASSERT((typename std::iterator_traits< last_it_type>::difference_type, typename point_t::template axis<N-1>::coord_t>::value)); 01789 01790 // point_t must be an N-dimensional point, each dimension of which must have the same type as difference_type of the corresponding iterator 01791 gil_function_requires<PointNDConcept<point_t> >(); 01792 BOOST_STATIC_ASSERT(point_t::num_dimensions==N); 01793 BOOST_STATIC_ASSERT((is_same<typename std::iterator_traits<first_it_type>::difference_type, typename point_t::template axis<0>::coord_t>::value)); 01794 BOOST_STATIC_ASSERT((is_same<typename std::iterator_traits<last_it_type>::difference_type, typename point_t::template axis<N-1>::coord_t>::value)); 01795 01796 point_t p; 01797 locator lc; 01798 iterator it; 01799 reverse_iterator rit; 01800 difference_type d; detail::initialize_it(d); ignore_unused_variable_warning(d); 01801 01802 View(p,lc); // view must be constructible from a locator and a point 01803 01804 p=view.dimensions(); 01805 lc=view.pixels(); 01806 size_type sz=view.size(); ignore_unused_variable_warning(sz); 01807 bool is_contiguous=view.is_1d_traversable(); ignore_unused_variable_warning(is_contiguous); 01808 01809 it=view.begin(); 01810 it=view.end(); 01811 rit=view.rbegin(); 01812 rit=view.rend(); 01813 01814 reference r1=view[d]; ignore_unused_variable_warning(r1); // 1D access 01815 reference r2=view(p); ignore_unused_variable_warning(r2); // 2D access 01816 01817 // get 1-D iterator of any dimension at a given pixel location 01818 first_it_type fi=view.template axis_iterator<0>(p); ignore_unused_variable_warning(fi); 01819 last_it_type li=view.template axis_iterator<N-1>(p); ignore_unused_variable_warning(li); 01820 01821 typedef PixelDereferenceAdaptorArchetype<typename View::value_type> deref_t; 01822 typedef typename View::template add_deref<deref_t>::type dtype; 01823 } 01824 View view; 01825 }; 01826 01829 01866 template <typename View> 01867 struct RandomAccess2DImageViewConcept { 01868 void constraints() { 01869 gil_function_requires<RandomAccessNDImageViewConcept<View> >(); 01870 BOOST_STATIC_ASSERT(View::num_dimensions==2); 01871 01872 // TODO: This executes the requirements for RandomAccessNDLocatorConcept again. Fix it to improve compile time 01873 gil_function_requires<RandomAccess2DLocatorConcept<typename View::locator> >(); 01874 01875 typedef typename dynamic_x_step_type<View>::type dynamic_x_step_t; 01876 typedef typename dynamic_y_step_type<View>::type dynamic_y_step_t; 01877 typedef typename transposed_type<View>::type transposed_t; 01878 01879 typedef typename View::x_iterator x_iterator; 01880 typedef typename View::y_iterator y_iterator; 01881 typedef typename View::x_coord_t x_coord_t; 01882 typedef typename View::y_coord_t y_coord_t; 01883 typedef typename View::xy_locator xy_locator; 01884 01885 x_coord_t xd=0; ignore_unused_variable_warning(xd); 01886 y_coord_t yd=0; ignore_unused_variable_warning(yd); 01887 x_iterator xit; 01888 y_iterator yit; 01889 typename View::point_t d; 01890 01891 View(xd,yd,xy_locator()); // constructible with width, height, 2d_locator 01892 01893 xy_locator lc=view.xy_at(xd,yd); 01894 lc=view.xy_at(d); 01895 01896 typename View::reference r=view(xd,yd); ignore_unused_variable_warning(r); 01897 xd=view.width(); 01898 yd=view.height(); 01899 01900 xit=view.x_at(d); 01901 xit=view.x_at(xd,yd); 01902 xit=view.row_begin(xd); 01903 xit=view.row_end(xd); 01904 01905 yit=view.y_at(d); 01906 yit=view.y_at(xd,yd); 01907 yit=view.col_begin(xd); 01908 yit=view.col_end(xd); 01909 } 01910 View view; 01911 }; 01912 01913 01916 01930 template <typename View> 01931 struct ImageViewConcept { 01932 void constraints() { 01933 gil_function_requires<RandomAccess2DImageViewConcept<View> >(); 01934 01935 // TODO: This executes the requirements for RandomAccess2DLocatorConcept again. Fix it to improve compile time 01936 gil_function_requires<PixelLocatorConcept<typename View::xy_locator> >(); 01937 01938 BOOST_STATIC_ASSERT((is_same<typename View::x_coord_t, typename View::y_coord_t>::value)); 01939 01940 typedef typename View::coord_t coord_t; // 1D difference type (same for all dimensions) 01941 std::size_t num_chan = view.num_channels(); ignore_unused_variable_warning(num_chan); 01942 } 01943 View view; 01944 }; 01945 01946 01947 namespace detail { 01948 template <typename View> // Preconditions: View Models RandomAccessNDImageViewConcept 01949 struct RandomAccessNDImageViewIsMutableConcept { 01950 void constraints() { 01951 gil_function_requires<detail::RandomAccessNDLocatorIsMutableConcept<typename View::locator> >(); 01952 01953 gil_function_requires<detail::RandomAccessIteratorIsMutableConcept<typename View::iterator> >(); 01954 gil_function_requires<detail::RandomAccessIteratorIsMutableConcept<typename View::reverse_iterator> >(); 01955 gil_function_requires<detail::RandomAccessIteratorIsMutableConcept<typename View::template axis<0>::iterator> >(); 01956 gil_function_requires<detail::RandomAccessIteratorIsMutableConcept<typename View::template axis<View::num_dimensions-1>::iterator> >(); 01957 01958 typename View::difference_type diff; initialize_it(diff); ignore_unused_variable_warning(diff); 01959 typename View::point_t pt; 01960 typename View::value_type v; initialize_it(v); 01961 01962 view[diff]=v; 01963 view(pt)=v; 01964 } 01965 View view; 01966 }; 01967 01968 template <typename View> // preconditions: View Models RandomAccessNDImageViewConcept 01969 struct RandomAccess2DImageViewIsMutableConcept { 01970 void constraints() { 01971 gil_function_requires<detail::RandomAccessNDImageViewIsMutableConcept<View> >(); 01972 typename View::x_coord_t xd=0; ignore_unused_variable_warning(xd); 01973 typename View::y_coord_t yd=0; ignore_unused_variable_warning(yd); 01974 typename View::value_type v; initialize_it(v); 01975 view(xd,yd)=v; 01976 } 01977 View view; 01978 }; 01979 01980 template <typename View> // preconditions: View Models ImageViewConcept 01981 struct PixelImageViewIsMutableConcept { 01982 void constraints() { 01983 gil_function_requires<detail::RandomAccess2DImageViewIsMutableConcept<View> >(); 01984 } 01985 }; 01986 } 01987 01990 01997 template <typename View> 01998 struct MutableRandomAccessNDImageViewConcept { 01999 void constraints() { 02000 gil_function_requires<RandomAccessNDImageViewConcept<View> >(); 02001 gil_function_requires<detail::RandomAccessNDImageViewIsMutableConcept<View> >(); 02002 } 02003 }; 02004 02007 02012 template <typename View> 02013 struct MutableRandomAccess2DImageViewConcept { 02014 void constraints() { 02015 gil_function_requires<RandomAccess2DImageViewConcept<View> >(); 02016 gil_function_requires<detail::RandomAccess2DImageViewIsMutableConcept<View> >(); 02017 } 02018 }; 02019 02022 02027 template <typename View> 02028 struct MutableImageViewConcept { 02029 void constraints() { 02030 gil_function_requires<ImageViewConcept<View> >(); 02031 gil_function_requires<detail::PixelImageViewIsMutableConcept<View> >(); 02032 } 02033 }; 02034 02038 template <typename V1, typename V2> // Model ImageViewConcept 02039 struct views_are_compatible : public pixels_are_compatible<typename V1::value_type, typename V2::value_type> {}; 02040 02043 02050 template <typename V1, typename V2> 02051 struct ViewsCompatibleConcept { 02052 void constraints() { 02053 BOOST_STATIC_ASSERT((views_are_compatible<V1,V2>::value)); 02054 } 02055 }; 02056 02057 02063 02064 02067 02088 template <typename Img> 02089 struct RandomAccessNDImageConcept { 02090 void constraints() { 02091 gil_function_requires<Regular<Img> >(); 02092 02093 typedef typename Img::view_t view_t; 02094 gil_function_requires<MutableRandomAccessNDImageViewConcept<view_t> >(); 02095 02096 typedef typename Img::const_view_t const_view_t; 02097 typedef typename Img::value_type pixel_t; 02098 02099 typedef typename Img::point_t point_t; 02100 gil_function_requires<PointNDConcept<point_t> >(); 02101 02102 const_view_t cv = const_view(img); ignore_unused_variable_warning(cv); 02103 view_t v = view(img); ignore_unused_variable_warning(v); 02104 02105 pixel_t fill_value; 02106 point_t pt=img.dimensions(); 02107 Img im1(pt); 02108 Img im2(pt,1); 02109 Img im3(pt,fill_value,1); 02110 img.recreate(pt); 02111 img.recreate(pt,1); 02112 img.recreate(pt,fill_value,1); 02113 } 02114 Img img; 02115 }; 02116 02117 02120 02137 template <typename Img> 02138 struct RandomAccess2DImageConcept { 02139 void constraints() { 02140 gil_function_requires<RandomAccessNDImageConcept<Img> >(); 02141 typedef typename Img::x_coord_t x_coord_t; 02142 typedef typename Img::y_coord_t y_coord_t; 02143 typedef typename Img::value_type value_t; 02144 02145 gil_function_requires<MutableRandomAccess2DImageViewConcept<typename Img::view_t> >(); 02146 02147 x_coord_t w=img.width(); 02148 y_coord_t h=img.height(); 02149 value_t fill_value; 02150 Img im1(w,h); 02151 Img im2(w,h,1); 02152 Img im3(w,h,fill_value,1); 02153 img.recreate(w,h); 02154 img.recreate(w,h,1); 02155 img.recreate(w,h,fill_value,1); 02156 } 02157 Img img; 02158 }; 02159 02162 02170 template <typename Img> 02171 struct ImageConcept { 02172 void constraints() { 02173 gil_function_requires<RandomAccess2DImageConcept<Img> >(); 02174 gil_function_requires<MutableImageViewConcept<typename Img::view_t> >(); 02175 typedef typename Img::coord_t coord_t; 02176 BOOST_STATIC_ASSERT(num_channels<Img>::value == mpl::size<typename color_space_type<Img>::type>::value); 02177 02178 BOOST_STATIC_ASSERT((is_same<coord_t, typename Img::x_coord_t>::value)); 02179 BOOST_STATIC_ASSERT((is_same<coord_t, typename Img::y_coord_t>::value)); 02180 } 02181 Img img; 02182 }; 02183 02184 02185 } } // namespace boost::gil 02186 02187 #endif Generated on Sat May 2 13:50:13 2009 for Generic Image Library by 1.5.6 |