Planet
navi homePPSaboutscreenshotsdownloaddevelopmentforum

source: downloads/boost_1_33_1/libs/multi_array/test/index_bases.cpp @ 12

Last change on this file since 12 was 12, checked in by landauf, 17 years ago

added boost

File size: 4.1 KB
Line 
1// Copyright 2002 The Trustees of Indiana University.
2
3// Use, modification and distribution is subject to the Boost Software
4// License, Version 1.0. (See accompanying file LICENSE_1_0.txt or copy at
5// http://www.boost.org/LICENSE_1_0.txt)
6
7//  Boost.MultiArray Library
8//  Authors: Ronald Garcia
9//           Jeremy Siek
10//           Andrew Lumsdaine
11//  See http://www.boost.org/libs/multi_array for documentation.
12
13//
14// index_bases - test of the index_base modifying facilities.
15//
16
17#include "boost/multi_array.hpp"
18
19#include "boost/test/minimal.hpp"
20
21#include "boost/array.hpp"
22#include <vector>
23#include <iostream>
24int
25test_main(int,char*[])
26{
27  typedef boost::multi_array<double, 3> array;
28  typedef boost::multi_array_ref<double, 3> array_ref;
29  typedef boost::const_multi_array_ref<double, 3> const_array_ref;
30  typedef array::array_view<3>::type array_view;
31
32  typedef array::size_type size_type;
33  typedef array::extent_range range;
34  typedef array::index_range irange;
35
36  array::extent_gen extents;
37  array::index_gen indices;
38
39  // Construct with nonzero bases
40  {
41
42    array A(extents[range(1,4)][range(2,5)][range(3,6)]);
43    array B(extents[3][3][3]);
44
45    double ptr[27];
46    array_ref
47      C(ptr,extents[range(1,4)][range(2,5)][range(3,6)]);
48
49    const_array_ref
50      D(ptr,extents[range(1,4)][range(2,5)][range(3,6)]);
51
52    array_view E = A[indices[irange()][irange()][irange()]];
53
54    std::vector<double> vals;
55    for (int i = 0; i < 27; ++i)
56      vals.push_back(i);
57
58    A.assign(vals.begin(),vals.end());
59    B.assign(vals.begin(),vals.end());
60    C.assign(vals.begin(),vals.end());
61
62    boost::array<int,3> bases = { { 1, 2, 3 } };
63    for (size_type a = 0; a < A.shape()[0]; ++a)
64      for (size_type b = 0; b < A.shape()[1]; ++b)
65        for (size_type c = 0; c < A[b].size(); ++c) {
66          BOOST_CHECK(A[a+bases[0]][b+bases[1]][c+bases[2]] == B[a][b][c]);
67          BOOST_CHECK(C[a+bases[0]][b+bases[1]][c+bases[2]] == B[a][b][c]);
68          BOOST_CHECK(D[a+bases[0]][b+bases[1]][c+bases[2]] == B[a][b][c]);
69          // Test that E does not inherit A's index_base
70          BOOST_CHECK(E[a][b][c] == B[a][b][c]);
71        }
72  }
73
74  // Reindex
75  {
76    typedef array::size_type size_type;
77    array A(extents[3][3][3]), B(extents[3][3][3]);
78
79    double ptr[27];
80    array_ref C(ptr,extents[3][3][3]);
81    const_array_ref D(ptr,extents[3][3][3]);
82
83    array_view E = B[indices[irange()][irange()][irange()]];
84
85    std::vector<double> vals;
86    for (int i = 0; i < 27; ++i)
87      vals.push_back(i);
88
89    A.assign(vals.begin(),vals.end());
90    B.assign(vals.begin(),vals.end());
91    C.assign(vals.begin(),vals.end());
92
93    boost::array<int,3> bases = { { 1, 2, 3 } };
94
95    A.reindex(bases);
96    C.reindex(bases);
97    D.reindex(bases);
98    E.reindex(bases);
99
100    for (size_type a = 0; a < A.shape()[0]; ++a)
101      for (size_type b = 0; b < A.shape()[1]; ++b)
102        for (size_type c = 0; c < A.shape()[2]; ++c) {
103          BOOST_CHECK(A[a+bases[0]][b+bases[1]][c+bases[2]] == B[a][b][c]);
104          BOOST_CHECK(C[a+bases[0]][b+bases[1]][c+bases[2]] == B[a][b][c]);
105          BOOST_CHECK(D[a+bases[0]][b+bases[1]][c+bases[2]] == B[a][b][c]);
106          BOOST_CHECK(E[a+bases[0]][b+bases[1]][c+bases[2]] == B[a][b][c]);
107        }
108  }
109
110  // Set Index Base
111  {
112    typedef array::size_type size_type;
113    array A(extents[3][3][3]), B(extents[3][3][3]);
114
115    double ptr[27];
116    array_ref C(ptr,extents[3][3][3]);
117    const_array_ref D(ptr,extents[3][3][3]);
118
119    array_view E = B[indices[irange()][irange()][irange()]];
120
121    std::vector<double> vals;
122    for (int i = 0; i < 27; ++i)
123      vals.push_back(i);
124
125    A.assign(vals.begin(),vals.end());
126    B.assign(vals.begin(),vals.end());
127    C.assign(vals.begin(),vals.end());
128
129    A.reindex(1);
130    C.reindex(1);
131    D.reindex(1);
132    E.reindex(1);
133
134    for (size_type a = 0; a < A.shape()[0]; ++a)
135      for (size_type b = 0; b < A.shape()[1]; ++b)
136        for (size_type c = 0; c < A.shape()[2]; ++c) {
137          BOOST_CHECK(A[a+1][b+1][c+1] == B[a][b][c]);
138          BOOST_CHECK(C[a+1][b+1][c+1] == B[a][b][c]);
139          BOOST_CHECK(D[a+1][b+1][c+1] == B[a][b][c]);
140          BOOST_CHECK(E[a+1][b+1][c+1] == B[a][b][c]);
141        }
142  }
143
144  return boost::exit_success;
145}
Note: See TracBrowser for help on using the repository browser.