SLIP  1.4
 All Classes Namespaces Files Functions Variables Typedefs Enumerations Enumerator Friends Macros Groups Pages
copy_ext.hpp
Go to the documentation of this file.
1 /*
2  * Copyright(c):
3  * Signal Image and Communications (SIC) Department
4  * http://www.sic.sp2mi.univ-poitiers.fr/
5  * - University of Poitiers, France http://www.univ-poitiers.fr
6  * - XLIM Institute UMR CNRS 7252 http://www.xlim.fr/
7  *
8  * and
9  *
10  * D2 Fluid, Thermic and Combustion
11  * - University of Poitiers, France http://www.univ-poitiers.fr
12  * - PPRIME Institute - UPR CNRS 3346 http://www.pprime.fr
13  * - ISAE-ENSMA http://www.ensma.fr
14  *
15  * Contributor(s):
16  * The SLIP team,
17  * Benoit Tremblais <tremblais_AT_sic.univ-poitiers.fr>,
18  * Laurent David <laurent.david_AT_lea.univ-poitiers.fr>,
19  * Ludovic Chatellier <ludovic.chatellier_AT_univ-poitiers.fr>,
20  * Lionel Thomas <lionel.thomas_AT_univ-poitiers.fr>,
21  * Denis Arrivault <arrivault_AT_sic.univ-poitiers.fr>,
22  * Julien Dombre <julien.dombre_AT_univ-poitiers.fr>.
23  *
24  * Description:
25  * The Simple Library of Image Processing (SLIP) is a new image processing
26  * library. It is written in the C++ language following as much as possible
27  * the ISO/ANSI C++ standard. It is consequently compatible with any system
28  * satisfying the ANSI C++ complience. It works on different Unix , Linux ,
29  * Mircrosoft Windows and Mac OS X plateforms. SLIP is a research library that
30  * was created by the Signal, Image and Communications (SIC) departement of
31  * the XLIM, UMR 7252 CNRS Institute in collaboration with the Fluids, Thermic
32  * and Combustion departement of the P', UPR 3346 CNRS Institute of the
33  * University of Poitiers.
34  *
35  * The SLIP Library source code has been registered to the APP (French Agency
36  * for the Protection of Programs) by the University of Poitiers and CNRS,
37  * under registration number IDDN.FR.001.300034.000.S.P.2010.000.21000.
38 
39  * http://www.sic.sp2mi.univ-poitiers.fr/slip/
40  *
41  * This software is governed by the CeCILL-C license under French law and
42  * abiding by the rules of distribution of free software. You can use,
43  * modify and/ or redistribute the software under the terms of the CeCILL-C
44  * license as circulated by CEA, CNRS and INRIA at the following URL
45  * http://www.cecill.info.
46  * As a counterpart to the access to the source code and rights to copy,
47  * modify and redistribute granted by the license, users are provided only
48  * with a limited warranty and the software's author, the holder of the
49  * economic rights, and the successive licensors have only limited
50  * liability.
51  *
52  * In this respect, the user's attention is drawn to the risks associated
53  * with loading, using, modifying and/or developing or reproducing the
54  * software by the user in light of its specific status of free software,
55  * that may mean that it is complicated to manipulate, and that also
56  * therefore means that it is reserved for developers and experienced
57  * professionals having in-depth computer knowledge. Users are therefore
58  * encouraged to load and test the software's suitability as regards their
59  * requirements in conditions enabling the security of their systems and/or
60  * data to be ensured and, more generally, to use and operate it in the
61  * same conditions as regards security.
62  *
63  * The fact that you are presently reading this means that you have had
64  * knowledge of the CeCILL-C license and that you accept its terms.
65  */
66 
74 #ifndef SLIP_COPY_EXT_HPP
75 #define SLIP_COPY_EXT_HPP
76 
77 
78 #include <iterator>
79 #include <cassert>
80 #include <algorithm>
81 #include "iterator3d_plane.hpp"
82 #include "iterator3d_box.hpp"
83 #include "iterator3d_range.hpp"
84 #include "iterator2d_box.hpp"
85 #include "iterator2d_range.hpp"
86 #include "iterator_types.hpp"
87 
88 
89 
90 namespace slip
91 {
92 
93  template<typename>
94  struct __copy
95  {
96  template <typename _II, typename _OI>
97  static
98  void copy(_II first, _II last, _OI output_first)
99  {
100  std::copy(first,last,output_first);
101  }
102  };
103 
104 template<>
105 struct __copy<std::random_access_iterator_tag>
106 {
107  template <typename _II, typename _OI>
108  static
109  void copy(_II first, _II last, _OI output_first)
110  {
111  std::copy(first,last,output_first);
112  }
113 
114 };
115 
116 template<>
117 struct __copy<std::random_access_iterator2d_tag>
118 {
119  template <typename _II, typename _OI>
120  static
121  void copy(_II first, _II last, _OI output_first)
122  {
123  const size_t rows = static_cast<size_t>((last-first)[0]);
124  for(size_t i = 0; i < rows; ++i)
125  {
126  std::copy(first.row_begin(i),
127  last.row_end(i),
128  output_first.row_begin(i));
129  }
130  }
131 
132 };
133 
134 template<>
135 struct __copy<std::random_access_iterator3d_tag>
136 {
137  template <typename _II, typename _OI>
138  static
139  void copy(_II first, _II last, _OI output_first)
140  {
141  const size_t slices = static_cast<size_t>((last-first)[0]);
142  const size_t rows = static_cast<size_t>((last-first)[1]);
143 
144  for(size_t k = 0; k < slices; ++k)
145  {
146  for(size_t i = 0; i < rows; ++i)
147  {
148  std::copy(first.row_begin(k,i),
149  last.row_end(k,i),
150  output_first.row_begin(k,i));
151  }
152  }
153  }
154 
155 };
156 
176  template <typename _II, typename _OI>
177  void copy(_II first, _II last, _OI output_first)
178  {
179  typedef typename std::iterator_traits<_II>::iterator_category _Category
180 ;
181  __copy<_Category>::copy(first,last,output_first);
182 
183  }
184 
185 
186 
187 }//::slip
188 #endif //SLIP_COPY_EXT
Provides a class to tag SLIP iterators.
Provides a class to manipulate iterator2d within a slip::Box2d. It is used to iterate throw 2d contai...
Provides a class to manipulate iterator3d within a slip::Range. It is used to iterate throw 3d contai...
void copy(_II first, _II last, _OI output_first)
Copy algorithm optimized for slip iterators.
Definition: copy_ext.hpp:177
Provides a class to manipulate iterator2d within a slip::Box3d. It is used to iterate throw 3d contai...
Provides a class to iterate 3d containers throw a planes.
Provides a class to manipulate iterator2d within a slip::Range. It is used to iterate throw 2d contai...