1/*
2 * csv_multiarray_copy.hpp
3 *
4 * Created on: Jun 20, 2015
5 * Author: i-bird
6 */
7
8#ifndef CSV_MULTIARRAY_COPY_HPP_
9#define CSV_MULTIARRAY_COPY_HPP_
10
11
12
13/*! \brief This class is an helper to produce csv headers from multi-array
14 *
15 * Usage:
16 *
17 * \code{.cpp}
18 *
19 * float src[3];
20 *
21 * std::stringstream str;
22 * csv_col_str<float[3]> cp(std::string("test"),str);
23 *
24 * std::cout << str.str() << "\n";
25 *
26 * \endcode
27 *
28 * Will produce ",test[0],test[1],test[2]"
29 *
30 */
31template<typename T>
32struct csv_col_str
33{
34 inline csv_col_str(std::string prp, std::stringstream & str)
35 {
36 str << "," << prp;
37 }
38};
39
40//! Partial specialization for N=1 1D-Array
41template<typename T,size_t N1>
42struct csv_col_str<T[N1]>
43{
44 inline csv_col_str(std::string prp, std::stringstream & str)
45 {
46 for (size_t i = 0 ; i < N1 ; i++)
47 str << "," << prp << "_" << "[" << i << "]";
48 }
49};
50
51//! Partial specialization for N=2 2D-Array
52template<typename T,size_t N1,size_t N2>
53struct csv_col_str<T[N1][N2]>
54{
55 inline csv_col_str(std::string prp, std::stringstream & str)
56 {
57 for (size_t i1 = 0 ; i1 < N1 ; i1++)
58 {
59 for (size_t i2 = 0 ; i2 < N2 ; i2++)
60 {
61 str << "," << prp << "_" << "[" << i1 << "]" << "[" << i2 << "]";
62 }
63 }
64 }
65};
66
67//! Partial specialization for N=3
68template<typename T,size_t N1,size_t N2,size_t N3>
69struct csv_col_str<T[N1][N2][N3]>
70{
71 inline csv_col_str(std::string prp, std::stringstream & str)
72 {
73 for (size_t i1 = 0 ; i1 < N1 ; i1++)
74 {
75 for (size_t i2 = 0 ; i2 < N2 ; i2++)
76 {
77 for (size_t i3 = 0 ; i3 < N3 ; i3++)
78 {
79 str << "," << prp << "_" << "[" << i1 << "]" << "[" << i2 << "]" << "[" << i3 << "]";
80 }
81 }
82 }
83 }
84};
85
86//! Partial specialization for N=4
87template<typename T,size_t N1,size_t N2,size_t N3,size_t N4>
88struct csv_col_str<T[N1][N2][N3][N4]>
89{
90 inline csv_col_str(std::string prp, std::stringstream & str)
91 {
92 for (size_t i1 = 0 ; i1 < N1 ; i1++)
93 {
94 for (size_t i2 = 0 ; i2 < N2 ; i2++)
95 {
96 for (size_t i3 = 0 ; i3 < N3 ; i3++)
97 {
98 for (size_t i4 = 0 ; i4 < N4 ; i4++)
99 {
100 str << "," << prp << "_" << "[" << i1 << "]" << "[" << i2 << "]" << "[" << i3 << "]" << "[" << i4 << "]";
101 }
102 }
103 }
104 }
105 }
106};
107
108
109/*! \brief This class is an helper to produce csv data from multi-array
110 *
111 * Usage:
112 *
113 * \code{.cpp}
114 *
115 * float src[3] = {1.0,2.0,3.0};
116 *
117 * std::stringstream str;
118 * csv_value_str<float[3]> cp(src,str);
119 *
120 * std::cout << str.str() << "\n";
121 *
122 * \endcode
123 *
124 * Will produce ",1.0,2.0,3.0"
125 *
126 */
127template<typename T, bool is_writable>
128struct csv_value_str
129{
130 inline csv_value_str(T & v, std::stringstream & str)
131 {
132 str << "," << v;
133 }
134};
135
136//! Partial specialization for N=1 1D-Array
137template<typename T,size_t N1, bool is_writable>
138struct csv_value_str<T[N1], is_writable>
139{
140 template<typename ArrObject>
141 inline csv_value_str(const ArrObject v, std::stringstream & str)
142 {
143 for (size_t i = 0 ; i < N1 ; i++)
144 str << "," << v[i];
145 }
146};
147
148//! Partial specialization for N=2 2D-Array
149template<typename T,size_t N1,size_t N2, bool is_writable>
150struct csv_value_str<T[N1][N2], is_writable>
151{
152 template<typename ArrObject>
153 inline csv_value_str(const ArrObject v, std::stringstream & str)
154 {
155 for (size_t i1 = 0 ; i1 < N1 ; i1++)
156 {
157 for (size_t i2 = 0 ; i2 < N2 ; i2++)
158 {
159 str << "," << v[i1][i2];
160 }
161 }
162 }
163};
164
165//! Partial specialization for N=3
166template<typename T,size_t N1,size_t N2,size_t N3, bool is_writable>
167struct csv_value_str<T[N1][N2][N3], is_writable>
168{
169 template<typename ArrObject>
170 inline csv_value_str(const ArrObject v, std::stringstream & str)
171 {
172 for (size_t i1 = 0 ; i1 < N1 ; i1++)
173 {
174 for (size_t i2 = 0 ; i2 < N2 ; i2++)
175 {
176 for (size_t i3 = 0 ; i3 < N3 ; i3++)
177 {
178 str << "," << v[i1][i2][i3];
179 }
180 }
181 }
182 }
183};
184
185//! Partial specialization for N=4
186template<typename T,size_t N1,size_t N2,size_t N3,size_t N4, bool is_writable>
187struct csv_value_str<T[N1][N2][N3][N4],is_writable>
188{
189 template<typename ArrObject>
190 inline csv_value_str(const ArrObject v, std::stringstream & str)
191 {
192 for (size_t i1 = 0 ; i1 < N1 ; i1++)
193 {
194 for (size_t i2 = 0 ; i2 < N2 ; i2++)
195 {
196 for (size_t i3 = 0 ; i3 < N3 ; i3++)
197 {
198 for (size_t i4 = 0 ; i4 < N4 ; i4++)
199 {
200 str << "," << v[i1][i2][i3][i4];
201 }
202 }
203 }
204 }
205 }
206};
207
208//! Partial specialization for unknown property
209template<typename T>
210struct csv_value_str<T,false>
211{
212 inline csv_value_str(const T v, std::stringstream & str)
213 {
214 str << "," << 0.0;
215 }
216};
217
218#endif /* CSV_MULTIARRAY_COPY_HPP_ */
219