summaryrefslogtreecommitdiffstats
path: root/src/boost/libs/multi_array/test/slice.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'src/boost/libs/multi_array/test/slice.cpp')
-rw-r--r--src/boost/libs/multi_array/test/slice.cpp146
1 files changed, 146 insertions, 0 deletions
diff --git a/src/boost/libs/multi_array/test/slice.cpp b/src/boost/libs/multi_array/test/slice.cpp
new file mode 100644
index 00000000..ba5bcccf
--- /dev/null
+++ b/src/boost/libs/multi_array/test/slice.cpp
@@ -0,0 +1,146 @@
+// Copyright 2002 The Trustees of Indiana University.
+
+// Use, modification and distribution is subject to the Boost Software
+// License, Version 1.0. (See accompanying file LICENSE_1_0.txt or copy at
+// http://www.boost.org/LICENSE_1_0.txt)
+
+// Boost.MultiArray Library
+// Authors: Ronald Garcia
+// Jeremy Siek
+// Andrew Lumsdaine
+// See http://www.boost.org/libs/multi_array for documentation.
+
+//
+// slice.cpp - testing out slicing on a matrices
+//
+
+#include "generative_tests.hpp"
+#include <boost/array.hpp>
+#include <boost/mpl/if.hpp>
+#include <boost/type_traits/is_same.hpp>
+
+template <typename Array>
+struct view_traits_mutable {
+public:
+#if 0 // RG - MSVC can't handle templates nested in templates. Use traits
+ typedef typename Array::template array_view<3>::type array_view3;
+ typedef typename Array::template array_view<2>::type array_view2;
+#endif
+ typedef typename boost::array_view_gen<Array,3>::type array_view3;
+ typedef typename boost::array_view_gen<Array,2>::type array_view2;
+};
+
+template <typename Array>
+struct view_traits_const {
+#if 0 // RG - MSVC can't handle templates nested in templates. Use traits
+ typedef typename Array::template const_array_view<3>::type array_view3;
+ typedef typename Array::template const_array_view<2>::type array_view2;
+#endif
+ typedef typename boost::const_array_view_gen<Array,3>::type array_view3;
+ typedef typename boost::const_array_view_gen<Array,2>::type array_view2;
+};
+
+
+// Meta-program selects the proper view_traits implementation.
+template <typename Array, typename ConstTag>
+struct view_traits_generator :
+ boost::mpl::if_< boost::is_same<ConstTag,const_array_tag>,
+ view_traits_const<Array>,
+ view_traits_mutable<Array> >
+{};
+
+
+template <typename Array, typename ViewTraits>
+void test_views(Array& A, const ViewTraits&) {
+ typedef typename Array::index index;
+ typedef typename Array::index_range range;
+ typename Array::index_gen indices;
+
+ const index idx0 = A.index_bases()[0];
+ const index idx1 = A.index_bases()[1];
+ const index idx2 = A.index_bases()[2];
+
+ // Standard View
+ {
+ typename ViewTraits::array_view3 B = A[
+ indices[range(idx0+0,idx0+2)]
+ [range(idx1+1,idx1+3)]
+ [range(idx2+0,idx2+4,2)]
+ ];
+
+ for (index i = 0; i != 2; ++i)
+ for (index j = 0; j != 2; ++j)
+ for (index k = 0; k != 2; ++k) {
+ BOOST_TEST(B[i][j][k] == A[idx0+i][idx1+j+1][idx2+k*2]);
+ boost::array<index,3> elmts;
+ elmts[0]=i; elmts[1]=j; elmts[2]=k;
+ BOOST_TEST(B(elmts) == A[idx0+i][idx1+j+1][idx2+k*2]);
+ }
+ }
+ // Degenerate dimensions
+ {
+ typename ViewTraits::array_view2 B =
+ A[indices[range(idx0+0,idx0+2)][idx1+1][range(idx2+0,idx2+4,2)]];
+
+ for (index i = 0; i != 2; ++i)
+ for (index j = 0; j != 2; ++j) {
+ BOOST_TEST(B[i][j] == A[idx0+i][idx1+1][idx2+j*2]);
+ boost::array<index,2> elmts;
+ elmts[0]=i; elmts[1]=j;
+ BOOST_TEST(B(elmts) == A[idx0+i][idx1+1][idx2+j*2]);
+ }
+ }
+
+ // Flip the third dimension
+ {
+ typename ViewTraits::array_view3 B = A[
+ indices[range(idx0+0,idx0+2)]
+ [range(idx1+0,idx1+2)]
+ [range(idx2+2,idx2+0,-1)]
+ ];
+
+ // typename ViewTraits::array_view3 B =
+ // A[indices[range(idx0+0,idx0+2)][idx1+1][range(idx2+0,idx2+4,2)]];
+
+ for (index i = 0; i != 2; ++i)
+ for (index j = 0; j != 2; ++j)
+ for (index k = 0; k != 2; ++k) {
+ BOOST_TEST(B[i][j][k] == A[idx0+i][idx1+j][idx2+2-k]);
+ boost::array<index,3> elmts;
+ elmts[0]=i; elmts[1]=j; elmts[2]=k;
+ BOOST_TEST(B(elmts) == A[idx0+i][idx1+j][idx2+2-k]);
+ }
+ }
+
+ ++tests_run;
+}
+
+
+template <typename Array>
+void access(Array& A, const mutable_array_tag&) {
+ assign(A);
+
+ typedef typename view_traits_generator<Array,mutable_array_tag>::type
+ m_view_traits;
+
+ typedef typename view_traits_generator<Array,const_array_tag>::type
+ c_view_traits;
+
+ test_views(A,m_view_traits());
+ test_views(A,c_view_traits());
+
+ const Array& CA = A;
+ test_views(CA,c_view_traits());
+}
+
+template <typename Array>
+void access(Array& A, const const_array_tag&) {
+ typedef typename view_traits_generator<Array,const_array_tag>::type
+ c_view_traits;
+ test_views(A,c_view_traits());
+}
+
+
+int main() {
+ return run_generative_tests();
+}