iLab Neuromorphic Robotics Toolkit  0.1
 All Classes Namespaces Files Functions Variables Typedefs Enumerations Enumerator Friends Macros Groups Pages
GenericImageImpl.H
Go to the documentation of this file.
1 /*! @file
2  @author Laurent Itti
3  @copyright GNU Public License (GPL v3)
4  @section License
5  @verbatim
6  // ////////////////////////////////////////////////////////////////////////
7  // The iLab Neuromorphic Robotics Toolkit (NRT) //
8  // Copyright 2010-2012 by the University of Southern California (USC) //
9  // and the iLab at USC. //
10  // //
11  // iLab - University of Southern California //
12  // Hedco Neurociences Building, Room HNB-10 //
13  // Los Angeles, Ca 90089-2520 - USA //
14  // //
15  // See http://ilab.usc.edu for information about this project. //
16  // ////////////////////////////////////////////////////////////////////////
17  // This file is part of The iLab Neuromorphic Robotics Toolkit. //
18  // //
19  // The iLab Neuromorphic Robotics Toolkit is free software: you can //
20  // redistribute it and/or modify it under the terms of the GNU General //
21  // Public License as published by the Free Software Foundation, either //
22  // version 3 of the License, or (at your option) any later version. //
23  // //
24  // The iLab Neuromorphic Robotics Toolkit is distributed in the hope //
25  // that it will be useful, but WITHOUT ANY WARRANTY; without even the //
26  // implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR //
27  // PURPOSE. See the GNU General Public License for more details. //
28  // //
29  // You should have received a copy of the GNU General Public License //
30  // along with The iLab Neuromorphic Robotics Toolkit. If not, see //
31  // <http://www.gnu.org/licenses/>. //
32  // ////////////////////////////////////////////////////////////////////////
33  @endverbatim */
34 
35 
36 #ifndef INCLUDE_NRT_CORE_IMAGE_DETAILS_GENERICIMAGEIMPL_H
37 #define INCLUDE_NRT_CORE_IMAGE_DETAILS_GENERICIMAGEIMPL_H
38 
40 
41 // ######################################################################
42 template <class PixType> inline
44 { }
45 
46 // ######################################################################
47 template <class PixType> inline
49 { itsImage = img; return *this; }
50 
51 // ######################################################################
52 template <class PixType> inline
55 { return boost::get<Image<PixType> >(itsImage); }
56 
57 // ######################################################################
58 template <class PixType> inline
59 nrt::Image<PixType> const &
61 { return boost::get<Image<PixType> >(itsImage); }
62 
63 // ######################################################################
64 namespace nrt { namespace detail { namespace genericimage
65 {
66  template <class PixType>
67  struct convert_visitor : public boost::static_visitor<nrt::Image<PixType> >
68  {
69  template <typename Img> inline
70  nrt::Image<PixType> operator()(Img const & im) const
71  { return nrt::Image<PixType>(im); }
72  };
73 } } }
74 
75 template <class PixType> inline
77 { return boost::apply_visitor(nrt::detail::genericimage::convert_visitor<PixType>(), itsImage); }
78 
79 // ######################################################################
80 namespace nrt { namespace detail { namespace genericimage
81 {
82  template <class Ima>
83  struct isa_visitor : public boost::static_visitor<bool>
84  {
85  template <typename Img> inline
86  bool operator()(Img const & im) const
87  { return std::is_same<Ima, Img>::value; }
88  };
89 } } }
90 
91 template <class Ima> inline
93 { return boost::apply_visitor(nrt::detail::genericimage::isa_visitor<Ima>(), itsImage); }
94 
95 // ######################################################################
96 namespace nrt { namespace detail { namespace genericimage
97 {
98  template <class PixType>
99  struct pixtype_visitor : public boost::static_visitor<bool>
100  {
101  template <typename Pix> inline
102  bool operator()(nrt::Image<Pix> const & im) const
103  { return std::is_same<PixType, Pix>::value; }
104  };
105 } } }
106 
107 template <class PixType> inline
109 { return boost::apply_visitor(nrt::detail::genericimage::pixtype_visitor<PixType>(), itsImage); }
110 
111 // ######################################################################
112 template <class Visitor> inline
113 typename Visitor::result_type nrt::GenericImage::apply_visitor(Visitor & v) const
114 { return boost::apply_visitor(v, itsImage); }
115 
116 // ######################################################################
117 template <class Visitor> inline
118 typename Visitor::result_type nrt::GenericImage::apply_visitor(Visitor const & v) const
119 { return boost::apply_visitor(v, itsImage); }
120 
121 // ######################################################################
122 template <class Visitor> inline
124 {
125  static_assert(std::is_same<typename Visitor::result_type, void>::value,
126  "GenericImage::apply_inplace_visitor() requires the visitor to return void");
127  boost::apply_visitor(v, itsImage);
128 }
129 
130 // ######################################################################
131 template <class Visitor> inline
133 {
134  static_assert(std::is_same<typename Visitor::result_type, void>::value,
135  "GenericImage::apply_inplace_visitor() requires the visitor to return void");
136  boost::apply_visitor(v, itsImage);
137 }
138 
139 // ######################################################################
140 template <class BinaryVisitor> inline
141 typename BinaryVisitor::result_type
142 nrt::GenericImage::apply_visitor(BinaryVisitor & v, nrt::GenericImage const & gim2) const
143 { return boost::apply_visitor(v, itsImage, gim2.itsImage); }
144 
145 // ######################################################################
146 template <class BinaryVisitor> inline
147 typename BinaryVisitor::result_type
148 nrt::GenericImage::apply_visitor(BinaryVisitor const & v, nrt::GenericImage const & gim2) const
149 { return boost::apply_visitor(v, itsImage, gim2.itsImage); }
150 
151 #endif // INCLUDE_NRT_CORE_IMAGE_DETAILS_GENERICIMAGEIMPL_H