JayBeams  0.1
Another project to have fun coding.
ut_cast_multi_array.cpp
Go to the documentation of this file.
2 #include <jb/fftw/cast.hpp>
3 
4 #include <boost/test/unit_test.hpp>
5 
6 /**
7  * Helper functions to test fftw_cast for boost::multi_array<>
8  */
9 namespace {
10 
11 /// Test cast functions for a given array type
12 template <typename array_type, typename expected>
13 void check_cast_array_3d() {
14  BOOST_TEST_MESSAGE("Testing for " << __FUNCTION__);
15  std::size_t const F = 2;
16  std::size_t const S = 128;
17  std::size_t const N = 1 << 15;
18 
19  array_type v(boost::extents[F][S][N]);
20  auto p = jb::fftw::fftw_cast(v);
21  bool actual = std::is_same<decltype(p), expected>::value;
22  BOOST_CHECK_EQUAL(actual, true);
23 }
24 
25 } // anonymous namespace
26 
28 using boost::multi_array;
29 
30 /**
31  * @test Verify that fftw_cast functions work for boost::multi_array<float>
32  */
33 BOOST_AUTO_TEST_CASE(fftw_cast_array_3d_float) {
34  check_cast_array_3d<multi_array<float, 3>, float*>();
35  check_cast_array_3d<multi_array<float, 3> const, float const*>();
36 
37  check_cast_array_3d<aligned_multi_array<float, 3>, float*>();
38  check_cast_array_3d<aligned_multi_array<float, 3> const, float const*>();
39 }
40 
41 /**
42  * @test Verify that fftw_cast functions work for boost::multi_array<double>
43  */
44 BOOST_AUTO_TEST_CASE(fftw_cast_array_3d_double) {
45  check_cast_array_3d<boost::multi_array<double, 3>, double*>();
46  check_cast_array_3d<boost::multi_array<double, 3> const, double const*>();
47 
48  check_cast_array_3d<jb::fftw::aligned_multi_array<double, 3>, double*>();
49  check_cast_array_3d<
50  jb::fftw::aligned_multi_array<double, 3> const, double const*>();
51 }
52 
53 /**
54  * @test Verify that fftw_cast functions work for
55  * boost::multi_array<long double>
56  */
57 BOOST_AUTO_TEST_CASE(fftw_cast_array_3d_long_double) {
58  check_cast_array_3d<boost::multi_array<long double, 3>, long double*>();
59  check_cast_array_3d<
60  boost::multi_array<long double, 3> const, long double const*>();
61 
62  check_cast_array_3d<
64  check_cast_array_3d<
65  jb::fftw::aligned_multi_array<long double, 3> const,
66  long double const*>();
67 }
68 
69 /**
70  * @test Verify that fftw_cast functions work for
71  * boost::multi_array<std::complex<float>>
72  */
73 BOOST_AUTO_TEST_CASE(fftw_cast_array_3d_complex_float) {
74  check_cast_array_3d<
75  boost::multi_array<std::complex<float>, 3>, fftwf_complex*>();
76  check_cast_array_3d<
77  boost::multi_array<std::complex<float>, 3> const, fftwf_complex const*>();
78 
79  check_cast_array_3d<
81  check_cast_array_3d<
82  jb::fftw::aligned_multi_array<std::complex<float>, 3> const,
83  fftwf_complex const*>();
84 }
85 
86 /**
87  * @test Verify that fftw_cast functions work for
88  * boost::multi_array<std::complex<double>>
89  */
90 BOOST_AUTO_TEST_CASE(fftw_cast_array_3d_complex_double) {
91  check_cast_array_3d<
92  boost::multi_array<std::complex<double>, 3>, fftw_complex*>();
93  check_cast_array_3d<
94  boost::multi_array<std::complex<double>, 3> const, fftw_complex const*>();
95 
96  check_cast_array_3d<
98  check_cast_array_3d<
99  jb::fftw::aligned_multi_array<std::complex<double>, 3> const,
100  fftw_complex const*>();
101 }
102 
103 /**
104  * @test Verify that fftw_cast functions work for
105  * boost::multi_array<std::complex<long double>>
106  */
107 BOOST_AUTO_TEST_CASE(fftw_cast_array_3d_complex_long_double) {
108  check_cast_array_3d<
109  boost::multi_array<std::complex<long double>, 3>, fftwl_complex*>();
110  check_cast_array_3d<
111  boost::multi_array<std::complex<long double>, 3> const,
112  fftwl_complex const*>();
113 
114  check_cast_array_3d<
116  fftwl_complex*>();
117  check_cast_array_3d<
118  jb::fftw::aligned_multi_array<std::complex<long double>, 3> const,
119  fftwl_complex const*>();
120 }
auto fftw_cast(vector &in) -> decltype(fftw_cast_array(&in[0]))
Definition: cast.hpp:33
BOOST_AUTO_TEST_CASE(fftw_cast_array_3d_float)
boost::multi_array< value_type, num_dims, jb::fftw::allocator< value_type > > aligned_multi_array
Alias boost::multi_array with properly allocated storage for FFTW3.