diff DEPENDENCIES/generic/include/boost/gil/planar_pixel_reference.hpp @ 16:2665513ce2d3

Add boost headers
author Chris Cannam
date Tue, 05 Aug 2014 11:11:38 +0100
parents
children
line wrap: on
line diff
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/DEPENDENCIES/generic/include/boost/gil/planar_pixel_reference.hpp	Tue Aug 05 11:11:38 2014 +0100
@@ -0,0 +1,198 @@
+/*
+    Copyright 2005-2007 Adobe Systems Incorporated
+   
+    Use, modification and distribution are subject to 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).
+
+    See http://stlab.adobe.com/gil for most recent version including documentation.
+*/
+
+/*************************************************************************************************/
+
+#ifndef GIL_PLANAR_REF_H
+#define GIL_PLANAR_REF_H
+
+////////////////////////////////////////////////////////////////////////////////////////
+/// \file               
+/// \brief planar pixel reference class
+/// \author Lubomir Bourdev and Hailin Jin \n
+///         Adobe Systems Incorporated
+/// \date   2005-2007 \n Last updated on September 28, 2006
+///
+////////////////////////////////////////////////////////////////////////////////////////
+
+#include <boost/mpl/range_c.hpp>
+#include "gil_config.hpp"
+#include "gil_concept.hpp"
+#include "color_base.hpp"
+#include "channel.hpp"
+#include "pixel.hpp"
+#include "planar_pixel_iterator.hpp"
+
+namespace boost { namespace gil {
+
+/// \defgroup ColorBaseModelPlanarRef planar_pixel_reference 
+/// \ingroup ColorBaseModel
+/// \brief A homogeneous color base whose element is a channel reference. Models HomogeneousColorBaseConcept, HomogeneousPixelConcept.
+/// This class is used as a reference proxy to a planar pixel.
+
+/// \defgroup PixelModelPlanarRef planar_pixel_reference 
+/// \ingroup PixelModel
+/// \brief A reference proxy to a planar pixel. Models HomogeneousColorBaseConcept, HomogeneousPixelConcept.
+
+
+/// \ingroup PixelModelPlanarRef ColorBaseModelPlanarRef PixelBasedModel
+/// \brief A reference proxy to a planar pixel. Models: HomogeneousColorBaseConcept, HomogeneousPixelConcept
+///
+/// A reference to a planar pixel is a proxy class containing references to each of the corresponding channels.
+/// 
+template <typename ChannelReference, typename ColorSpace>        // ChannelReference is a channel reference (const or mutable)
+struct planar_pixel_reference 
+   : public detail::homogeneous_color_base<ChannelReference,layout<ColorSpace>,mpl::size<ColorSpace>::value> {
+    typedef detail::homogeneous_color_base<ChannelReference,layout<ColorSpace>,mpl::size<ColorSpace>::value> parent_t;
+private:
+    // These three are only defined for homogeneous pixels
+    typedef typename channel_traits<ChannelReference>::value_type      channel_t;
+    typedef typename channel_traits<ChannelReference>::const_reference channel_const_reference;
+public:
+    BOOST_STATIC_CONSTANT(bool, is_mutable = channel_traits<ChannelReference>::is_mutable);
+    typedef pixel<channel_t,layout<ColorSpace> >                       value_type;
+    typedef planar_pixel_reference                                     reference;
+    typedef planar_pixel_reference<channel_const_reference,ColorSpace> const_reference;
+
+    planar_pixel_reference(ChannelReference v0, ChannelReference v1) : parent_t(v0,v1) {}
+    planar_pixel_reference(ChannelReference v0, ChannelReference v1, ChannelReference v2) : parent_t(v0,v1,v2) {}
+    planar_pixel_reference(ChannelReference v0, ChannelReference v1, ChannelReference v2, ChannelReference v3) : parent_t(v0,v1,v2,v3) {}
+    planar_pixel_reference(ChannelReference v0, ChannelReference v1, ChannelReference v2, ChannelReference v3, ChannelReference v4) : parent_t(v0,v1,v2,v3,v4) {}
+    planar_pixel_reference(ChannelReference v0, ChannelReference v1, ChannelReference v2, ChannelReference v3, ChannelReference v4, ChannelReference v5) : parent_t(v0,v1,v2,v3,v4,v5) {}
+
+    template <typename P>                         planar_pixel_reference(const P& p)        : parent_t(p) { check_compatible<P>();}
+
+    // PERFORMANCE_CHECK: Is this constructor necessary?
+    template <typename ChannelV, typename Mapping>           
+    planar_pixel_reference(pixel<ChannelV,layout<ColorSpace,Mapping> >& p)   : parent_t(p) { check_compatible<pixel<ChannelV,layout<ColorSpace,Mapping> > >();}
+
+    // Construct at offset from a given location
+    template <typename ChannelPtr> planar_pixel_reference(const planar_pixel_iterator<ChannelPtr,ColorSpace>& p, std::ptrdiff_t diff) : parent_t(p,diff) {}
+
+    const planar_pixel_reference&                             operator=(const planar_pixel_reference& p)  const { static_copy(p,*this); return *this; }
+    template <typename P> const planar_pixel_reference&       operator=(const P& p)           const { check_compatible<P>(); static_copy(p,*this); return *this; }
+
+// This overload is necessary for a compiler implementing Core Issue 574
+// to prevent generation of an implicit copy assignment operator (the reason
+// for generating implicit copy assignment operator is that according to
+// Core Issue 574, a cv-qualified assignment operator is not considered
+// "copy assignment operator").
+// EDG implemented Core Issue 574 starting with EDG Version 3.8. I'm not
+// sure why they did it for a template member function as well.
+#if BOOST_WORKAROUND(__HP_aCC, >= 61700) || BOOST_WORKAROUND(__INTEL_COMPILER, >= 1000)
+    const planar_pixel_reference& operator=(const planar_pixel_reference& p) { static_copy(p,*this); return *this; }
+    template <typename P> const planar_pixel_reference& operator=(const P& p) { check_compatible<P>(); static_copy(p,*this); return *this; }
+#endif
+
+    template <typename P> bool                    operator==(const P& p)    const { check_compatible<P>(); return static_equal(*this,p); }
+    template <typename P> bool                    operator!=(const P& p)    const { return !(*this==p); }
+
+    ChannelReference                              operator[](std::size_t i) const { return this->at_c_dynamic(i); }
+
+    const planar_pixel_reference*     operator->()              const { return this; }
+private:
+    template <typename Pixel> static void check_compatible() { gil_function_requires<PixelsCompatibleConcept<Pixel,planar_pixel_reference> >(); }
+};
+
+/////////////////////////////
+//  ColorBasedConcept
+/////////////////////////////
+
+template <typename ChannelReference, typename ColorSpace, int K>  
+struct kth_element_type<planar_pixel_reference<ChannelReference,ColorSpace>, K> {
+    typedef ChannelReference type;
+};
+
+template <typename ChannelReference, typename ColorSpace, int K>  
+struct kth_element_reference_type<planar_pixel_reference<ChannelReference,ColorSpace>, K> {
+    typedef ChannelReference type;
+};
+
+template <typename ChannelReference, typename ColorSpace, int K>  
+struct kth_element_const_reference_type<planar_pixel_reference<ChannelReference,ColorSpace>, K> 
+    : public add_reference<typename add_const<ChannelReference>::type> 
+{
+//    typedef typename channel_traits<ChannelReference>::const_reference type;
+};
+
+/////////////////////////////
+//  PixelConcept
+/////////////////////////////
+
+/// \brief Metafunction predicate that flags planar_pixel_reference as a model of PixelConcept. Required by PixelConcept
+/// \ingroup PixelModelPlanarRef
+template <typename ChannelReference, typename ColorSpace>  
+struct is_pixel< planar_pixel_reference<ChannelReference,ColorSpace> > : public mpl::true_{};
+
+/////////////////////////////
+//  HomogeneousPixelBasedConcept
+/////////////////////////////
+
+/// \brief Specifies the color space type of a planar pixel reference. Required by PixelBasedConcept
+/// \ingroup PixelModelPlanarRef
+template <typename ChannelReference, typename ColorSpace>  
+struct color_space_type<planar_pixel_reference<ChannelReference,ColorSpace> > {
+    typedef ColorSpace type;
+}; 
+
+/// \brief Specifies the color space type of a planar pixel reference. Required by PixelBasedConcept
+/// \ingroup PixelModelPlanarRef
+template <typename ChannelReference, typename ColorSpace>  
+struct channel_mapping_type<planar_pixel_reference<ChannelReference,ColorSpace> > {
+    typedef typename layout<ColorSpace>::channel_mapping_t type;
+}; 
+
+/// \brief Specifies that planar_pixel_reference represents a planar construct. Required by PixelBasedConcept
+/// \ingroup PixelModelPlanarRef
+template <typename ChannelReference, typename ColorSpace>  
+struct is_planar<planar_pixel_reference<ChannelReference,ColorSpace> > : mpl::true_ {};
+
+/// \brief Specifies the color space type of a planar pixel reference. Required by HomogeneousPixelBasedConcept
+/// \ingroup PixelModelPlanarRef
+template <typename ChannelReference, typename ColorSpace>  
+struct channel_type<planar_pixel_reference<ChannelReference,ColorSpace> > {
+    typedef typename channel_traits<ChannelReference>::value_type type;
+}; 
+
+} }  // namespace boost::gil
+
+namespace std {
+// We are forced to define swap inside std namespace because on some platforms (Visual Studio 8) STL calls swap qualified.
+// swap with 'left bias': 
+// - swap between proxy and anything
+// - swap between value type and proxy
+// - swap between proxy and proxy
+// Having three overloads allows us to swap between different (but compatible) models of PixelConcept
+
+/// \brief  swap for planar_pixel_reference
+/// \ingroup PixelModelPlanarRef
+template <typename CR, typename CS, typename R> inline
+void swap(const boost::gil::planar_pixel_reference<CR,CS> x, R& y) { 
+    boost::gil::swap_proxy<typename boost::gil::planar_pixel_reference<CR,CS>::value_type>(x,y); 
+}
+
+
+/// \brief  swap for planar_pixel_reference
+/// \ingroup PixelModelPlanarRef
+template <typename CR, typename CS> inline
+void swap(typename boost::gil::planar_pixel_reference<CR,CS>::value_type& x, const boost::gil::planar_pixel_reference<CR,CS> y) { 
+    boost::gil::swap_proxy<typename boost::gil::planar_pixel_reference<CR,CS>::value_type>(x,y); 
+}
+
+
+/// \brief  swap for planar_pixel_reference
+/// \ingroup PixelModelPlanarRef
+template <typename CR, typename CS> inline
+void swap(const boost::gil::planar_pixel_reference<CR,CS> x, const boost::gil::planar_pixel_reference<CR,CS> y) { 
+    boost::gil::swap_proxy<typename boost::gil::planar_pixel_reference<CR,CS>::value_type>(x,y); 
+}
+}   // namespace std
+
+#endif