planar_ptr.hpp

Go to the documentation of this file.
00001 /*
00002     Copyright 2005-2006 Adobe Systems Incorporated
00003     Distributed under the MIT License (see accompanying file LICENSE_1_0_0.txt
00004     or a copy at http://opensource.adobe.com/licenses.html)
00005 */
00006 
00007 /*************************************************************************************************/
00008 
00009 #ifndef GIL_PLANAR_PTR_H
00010 #define GIL_PLANAR_PTR_H
00011 
00020 
00021 #include <cassert>
00022 #include <iterator>
00023 #include "gil_config.hpp"
00024 
00025 ADOBE_GIL_NAMESPACE_BEGIN
00026 
00027 
00037 
00040 template <typename IC, typename C> struct planar_ptr {};
00041 //forward declaration
00042 namespace detail {template <typename T, typename C> struct color_base;}
00045 template <typename IC, typename C>
00046 struct planar_ptr_base : public boost::iterator_facade<planar_ptr<IC,C>,
00047                                                        pixel<typename std::iterator_traits<IC>::value_type,C>,
00048                                                        boost::random_access_traversal_tag,
00049                                                        planar_ref<typename std::iterator_traits<IC>::reference,C> >,
00050                          public detail::color_base<IC,C> {
00051     typedef boost::iterator_facade<planar_ptr<IC,C>,
00052                                    pixel<typename std::iterator_traits<IC>::value_type,C>,
00053                                    boost::random_access_traversal_tag,
00054                                    planar_ref<typename std::iterator_traits<IC>::reference,C> > parent_t;
00055     typedef std::random_access_iterator_tag                  iterator_category;    // TODO: Fix that!
00056     typedef detail::color_base<IC,C>                      color_base_parent_t;
00057     typedef pixel<typename std::iterator_traits<IC>::value_type,C> pixel_t;
00058     typedef typename parent_t::reference                  reference;
00059     typedef typename parent_t::difference_type            difference_type;
00060     typedef C                                             color_space_t;
00061     typedef typename std::iterator_traits<IC>::value_type channel_t;
00062     static const int                                      num_channels=color_space_t::num_channels;
00063 
00064     planar_ptr_base() {}
00065 
00066     planar_ptr_base(const IC& v0, const IC& v1)                                           : color_base_parent_t(v0,v1) {}
00067     planar_ptr_base(const IC& v0, const IC& v1, const IC& v2)                             : color_base_parent_t(v0,v1,v2) {}
00068     planar_ptr_base(const IC& v0, const IC& v1, const IC& v2, const IC& v3)               : color_base_parent_t(v0,v1,v2,v3) {}
00069     planar_ptr_base(const IC& v0, const IC& v1, const IC& v2, const IC& v3, const IC& v4) : color_base_parent_t(v0,v1,v2,v3,v4) {}
00070 
00071     template <typename IC1,typename C1> planar_ptr_base(const planar_ptr_base<IC1,C1>& ptr) : color_base_parent_t(ptr) {}
00072 
00075     reference operator[](difference_type d)       const { return byte_advanced_ref(*this,d*sizeof(channel_t));}
00076 
00077     IC&       channel_ptr(std::size_t i)                { return detail::nth_channel_accessor<C>()(*this,i); }
00078     const IC& channel_ptr(std::size_t i)          const { return detail::nth_channel_accessor<C>()(*this,i); }
00079 
00080     template <int N> IC&       channel()                { return detail::channel_accessor<C,N>()(*this);}
00081     template <int N> IC const& channel()          const { return detail::channel_accessor<C,N>()(*this);}
00082     template <int N> IC&       semantic_channel()       { return detail::channel_accessor<typename C::base,N>()(*this);}
00083     template <int N> IC const& semantic_channel() const { return detail::channel_accessor<typename C::base,N>()(*this);}
00084 
00085     reference operator->()                        const { return **this; }
00086     // TODO: Remove?
00087     bool operator< (const planar_ptr_base& ptr)   const { return channel<0>()< ptr.channel<0>(); }
00088     bool operator!=(const planar_ptr_base& ptr)   const { return channel<0>()!=ptr.channel<0>(); }
00089 private:
00090     friend class boost::iterator_core_access;
00091 
00092     void increment()            { transform_channels(*this,*this,adobe::inc<IC>()); }
00093     void decrement()            { transform_channels(*this,*this,adobe::dec<IC>()); }
00094     void advance(ptrdiff_t d)   { transform_channels(*this,*this,std::bind2nd(adobe::plus_asymmetric<IC,ptrdiff_t>(),d)); }
00095 
00096     ptrdiff_t distance_to(const planar_ptr_base& it) const { return it.channel<0>()-channel<0>(); }
00097     bool equal(const planar_ptr_base& it) const { return channel<0>()==it.channel<0>(); }
00098 };
00099 
00100 
00101 ADOBE_GIL_NAMESPACE_END
00102 
00103 #endif

Copyright © 2006 Adobe Systems Incorporated.

Use of this website signifies your agreement to the Terms of Use and Online Privacy Policy.

Search powered by Google