sl@0: // Copyright 2002 The Trustees of Indiana University. sl@0: sl@0: // Use, modification and distribution is subject to the Boost Software sl@0: // License, Version 1.0. (See accompanying file LICENSE_1_0.txt or copy at sl@0: // http://www.boost.org/LICENSE_1_0.txt) sl@0: sl@0: // Boost.MultiArray Library sl@0: // Authors: Ronald Garcia sl@0: // Jeremy Siek sl@0: // Andrew Lumsdaine sl@0: // See http://www.boost.org/libs/multi_array for documentation. sl@0: sl@0: // sl@0: // slice.cpp - testing out slicing on a matrices sl@0: // sl@0: /* sl@0: * © Portions copyright (c) 2006-2007 Nokia Corporation. All rights reserved. sl@0: */ sl@0: sl@0: #include "generative_tests.hpp" sl@0: #include "boost/array.hpp" sl@0: #include "boost/mpl/if.hpp" sl@0: #include "boost/type_traits/is_same.hpp" sl@0: sl@0: template sl@0: struct view_traits_mutable { sl@0: public: sl@0: #if 0 // RG - MSVC can't handle templates nested in templates. Use traits sl@0: typedef typename Array::template array_view<3>::type array_view3; sl@0: typedef typename Array::template array_view<2>::type array_view2; sl@0: #endif sl@0: typedef typename boost::array_view_gen::type array_view3; sl@0: typedef typename boost::array_view_gen::type array_view2; sl@0: }; sl@0: sl@0: template sl@0: struct view_traits_const { sl@0: #if 0 // RG - MSVC can't handle templates nested in templates. Use traits sl@0: typedef typename Array::template const_array_view<3>::type array_view3; sl@0: typedef typename Array::template const_array_view<2>::type array_view2; sl@0: #endif sl@0: typedef typename boost::const_array_view_gen::type array_view3; sl@0: typedef typename boost::const_array_view_gen::type array_view2; sl@0: }; sl@0: sl@0: sl@0: // Meta-program selects the proper view_traits implementation. sl@0: template sl@0: struct view_traits_generator : sl@0: boost::mpl::if_< boost::is_same, sl@0: view_traits_const, sl@0: view_traits_mutable > sl@0: {}; sl@0: sl@0: sl@0: template sl@0: void test_views(Array& A, const ViewTraits&) { sl@0: typedef typename Array::index index; sl@0: typedef typename Array::index_range range; sl@0: typename Array::index_gen indices; sl@0: sl@0: const index idx0 = A.index_bases()[0]; sl@0: const index idx1 = A.index_bases()[1]; sl@0: const index idx2 = A.index_bases()[2]; sl@0: sl@0: // Standard View sl@0: { sl@0: typename ViewTraits::array_view3 B = A[ sl@0: indices[range(idx0+0,idx0+2)] sl@0: [range(idx1+1,idx1+3)] sl@0: [range(idx2+0,idx2+4,2)] sl@0: ]; sl@0: sl@0: for (index i = 0; i != 2; ++i) sl@0: for (index j = 0; j != 2; ++j) sl@0: for (index k = 0; k != 2; ++k) { sl@0: BOOST_CHECK(B[i][j][k] == A[idx0+i][idx1+j+1][idx2+k*2]); sl@0: boost::array elmts; sl@0: elmts[0]=i; elmts[1]=j; elmts[2]=k; sl@0: BOOST_CHECK(B(elmts) == A[idx0+i][idx1+j+1][idx2+k*2]); sl@0: } sl@0: } sl@0: // Degenerate dimensions sl@0: { sl@0: typename ViewTraits::array_view2 B = sl@0: A[indices[range(idx0+0,idx0+2)][idx1+1][range(idx2+0,idx2+4,2)]]; sl@0: sl@0: for (index i = 0; i != 2; ++i) sl@0: for (index j = 0; j != 2; ++j) { sl@0: BOOST_CHECK(B[i][j] == A[idx0+i][idx1+1][idx2+j*2]); sl@0: boost::array elmts; sl@0: elmts[0]=i; elmts[1]=j; sl@0: BOOST_CHECK(B(elmts) == A[idx0+i][idx1+1][idx2+j*2]); sl@0: } sl@0: } sl@0: ++tests_run; sl@0: } sl@0: sl@0: sl@0: template sl@0: void access(Array& A, const mutable_array_tag&) { sl@0: assign(A); sl@0: sl@0: typedef typename view_traits_generator::type sl@0: m_view_traits; sl@0: sl@0: typedef typename view_traits_generator::type sl@0: c_view_traits; sl@0: sl@0: test_views(A,m_view_traits()); sl@0: test_views(A,c_view_traits()); sl@0: sl@0: const Array& CA = A; sl@0: test_views(CA,c_view_traits()); sl@0: } sl@0: sl@0: template sl@0: void access(Array& A, const const_array_tag&) { sl@0: typedef typename view_traits_generator::type sl@0: c_view_traits; sl@0: test_views(A,c_view_traits()); sl@0: } sl@0: sl@0: sl@0: int test_main(int,char*[]) { sl@0: #ifdef __SYMBIAN32__ sl@0: if(boost::minimal_test::errors_counter() != 0) sl@0: assert_failed = true; sl@0: testResultXml("slice"); sl@0: close_log_file(); sl@0: #endif sl@0: return run_generative_tests(); sl@0: }