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 | */ |
31 | template<typename T> |
32 | struct 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 |
41 | template<typename T,size_t N1> |
42 | struct 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 |
52 | template<typename T,size_t N1,size_t N2> |
53 | struct 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 |
68 | template<typename T,size_t N1,size_t N2,size_t N3> |
69 | struct 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 |
87 | template<typename T,size_t N1,size_t N2,size_t N3,size_t N4> |
88 | struct 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 | */ |
127 | template<typename T, bool is_writable> |
128 | struct 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 |
137 | template<typename T,size_t N1, bool is_writable> |
138 | struct 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 |
149 | template<typename T,size_t N1,size_t N2, bool is_writable> |
150 | struct 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 |
166 | template<typename T,size_t N1,size_t N2,size_t N3, bool is_writable> |
167 | struct 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 |
186 | template<typename T,size_t N1,size_t N2,size_t N3,size_t N4, bool is_writable> |
187 | struct 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 |
209 | template<typename T> |
210 | struct 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 | |