@@ -51,47 +51,88 @@ Gnuplot gp;
51
51
std::string basedir = " unittest-output" ;
52
52
53
53
template <typename T, typename ArrayMode>
54
- void test_given_mode (std::ostream &log_fh, std::string header, const T &arg, ArrayMode) {
54
+ void test_given_mode (
55
+ std::ostream &log_fh, std::string header, const T &arg,
56
+ ArrayMode, boost::mpl::true_
57
+ ) {
55
58
std::string modename = ArrayMode::class_name ();
56
59
std::string fn_prefix = basedir+" /" +header+" -" +modename;
57
60
log_fh << " * " << modename << " -> "
58
61
<< gp.binaryFile (arg, fn_prefix+" .bin" , " record" , ArrayMode ()) << std::endl;
59
62
gp.file (arg, fn_prefix+" .txt" , ArrayMode ());
60
63
}
61
64
62
- template <typename T>
65
+ template <typename T, typename ArrayMode>
66
+ void test_given_mode (
67
+ std::ostream &log_fh, std::string header, const T &arg,
68
+ ArrayMode, boost::mpl::false_
69
+ ) {
70
+ std::string modename = ArrayMode::class_name ();
71
+ std::string fn_prefix = basedir+" /" +header+" -" +modename;
72
+ log_fh << " * " << modename << " (skipped binary) " << std::endl;
73
+ gp.file (arg, fn_prefix+" .txt" , ArrayMode ());
74
+ }
75
+
76
+ template <typename T, typename DoBinary>
63
77
typename boost::enable_if_c<(ArrayTraits<T>::depth == 1 )>::type
64
78
runtest_inner (std::ostream &log_fh, std::string header, const T &arg) {
65
- test_given_mode (log_fh, header, arg, Mode1D ());
79
+ test_given_mode<T> (log_fh, header, arg, Mode1D (), DoBinary ());
66
80
}
67
81
68
- template <typename T>
82
+ template <typename T, typename DoBinary >
69
83
typename boost::enable_if_c<(ArrayTraits<T>::depth == 2 )>::type
70
84
runtest_inner (std::ostream &log_fh, std::string header, const T &arg) {
71
- test_given_mode (log_fh, header, arg, Mode2D ());
72
- test_given_mode (log_fh, header, arg, Mode1DUnwrap ());
85
+ test_given_mode<T> (log_fh, header, arg, Mode2D (), DoBinary ());
86
+ test_given_mode<T> (log_fh, header, arg, Mode1DUnwrap (), DoBinary ());
73
87
}
74
88
75
- template <typename T>
89
+ template <typename T, typename DoBinary >
76
90
typename boost::enable_if_c<(ArrayTraits<T>::depth >= 3 )>::type
77
91
runtest_inner (std::ostream &log_fh, std::string header, const T &arg) {
78
- test_given_mode (log_fh, header, arg, Mode2D ());
79
- test_given_mode (log_fh, header, arg, Mode2DUnwrap ());
92
+ test_given_mode<T> (log_fh, header, arg, Mode2D (), DoBinary ());
93
+ test_given_mode<T> (log_fh, header, arg, Mode2DUnwrap (), DoBinary ());
80
94
}
81
95
82
- template <typename T>
83
- void runtest (std::string header, const T &arg) {
96
+ template <typename T, typename DoBinary >
97
+ void runtest_maybe_dobin (std::string header, const T &arg) {
84
98
std::ofstream log_fh ((basedir+" /" +header+" -log.txt" ).c_str ());
85
99
log_fh << " --- " << header << " -------------------------------------" << std::endl;
86
100
log_fh << " depth=" << ArrayTraits<T>::depth << std::endl;
87
101
log_fh << " ModeAutoDecoder=" << ModeAutoDecoder<T>::mode::class_name () << std::endl;
88
- runtest_inner (log_fh, header, arg);
102
+ runtest_inner<T, DoBinary>(log_fh, header, arg);
103
+ }
104
+
105
+ template <typename T>
106
+ void runtest (std::string header, const T &arg) {
107
+ runtest_maybe_dobin<T, boost::mpl::true_>(header, arg);
108
+ }
109
+
110
+ template <typename T>
111
+ void runtest_nobin (std::string header, const T &arg) {
112
+ runtest_maybe_dobin<T, boost::mpl::false_>(header, arg);
113
+ }
114
+
115
+ template <typename T, typename DoBinary>
116
+ void basic_datatype_test_integral (std::string name) {
117
+ std::vector<T> v;
118
+ for (int i=0 ; i<4 ; i++) {
119
+ v.push_back (i);
120
+ }
121
+ runtest_maybe_dobin<std::vector<T>, DoBinary>(name, v);
122
+ }
123
+
124
+ template <typename T, typename DoBinary>
125
+ void basic_datatype_test_float (std::string name) {
126
+ std::vector<T> v;
127
+ for (int i=0 ; i<4 ; i++) {
128
+ v.push_back (i + T (0.1234 ));
129
+ }
130
+ v.push_back (std::numeric_limits<T>::quiet_NaN ());
131
+ runtest_maybe_dobin<std::vector<T>, DoBinary>(name, v);
89
132
}
90
133
91
134
int main () {
92
135
const int NX=3 , NY=4 , NZ=2 ;
93
- // FIXME - why doesn't it compile with std::vector<char>?
94
- std::vector<int8_t > vc; // should print as integers
95
136
std::vector<double > vd;
96
137
std::vector<int > vi;
97
138
std::vector<float > vf;
@@ -109,7 +150,6 @@ int main() {
109
150
110
151
for (int x=0 ; x<NX; x++) {
111
152
vd.push_back (x+7.5 );
112
- vc.push_back (x+7 );
113
153
vi.push_back (x+7 );
114
154
vf.push_back (x+7 .2F );
115
155
v_bt.push_back (boost::make_tuple (x+0.123 , 100 +x, 200 +x));
@@ -137,8 +177,23 @@ int main() {
137
177
}
138
178
}
139
179
180
+ basic_datatype_test_integral<boost:: int8_t , boost::mpl::true_>(" vi8" );
181
+ basic_datatype_test_integral<boost:: uint8_t , boost::mpl::true_>(" vu8" );
182
+ basic_datatype_test_integral<boost:: int16_t , boost::mpl::true_>(" vi16" );
183
+ basic_datatype_test_integral<boost::uint16_t , boost::mpl::true_>(" vu16" );
184
+ basic_datatype_test_integral<boost:: int32_t , boost::mpl::true_>(" vi32" );
185
+ basic_datatype_test_integral<boost::uint32_t , boost::mpl::true_>(" vu32" );
186
+
187
+ // these should all print as integers
188
+ basic_datatype_test_integral<char , boost::mpl::false_>(" vpc" );
189
+ basic_datatype_test_integral<signed char , boost::mpl::false_>(" vsc" );
190
+ basic_datatype_test_integral<unsigned char , boost::mpl::false_>(" vuc" );
191
+
192
+ basic_datatype_test_float<float , boost::mpl::true_>(" vf" );
193
+ basic_datatype_test_float<double , boost::mpl::true_>(" vd" );
194
+ basic_datatype_test_float<long double , boost::mpl::false_>(" vld" );
195
+
140
196
runtest (" vd,vi,bi" , std::make_pair (vd, std::make_pair (vi, bi)));
141
- runtest (" vc" , vc);
142
197
runtest (" vvd" , vvd);
143
198
runtest (" vvd,vvi" , std::make_pair (vvd, vvi));
144
199
runtest (" ai" , ai);
0 commit comments