UNIVERS  15.3
UNIVERS base processing software API
 All Classes Namespaces Files Functions Variables Typedefs Enumerations Enumerator Friends Macros
cust_other.H
1 /* cust_other.H */
2 /* $Id: cust_other.H,v 1.8 2008/08/14 10:30:06 vlad Exp $ */
3 #ifdef __CubeStorage_H
4 
5 
6 /***********************************************************************
7  * Setup new dimensions.
8  */
9 template<class T>
10 void
11 CubeStorage<T>::new_size (int dim_n, int* dims, item_order_t itor)
12 {
13  delete[] pDim;
14  delete[] pStorage;
15 
16  nDim = dim_n;
17  eItemOrder = itor;
18 
19  if(dim_n <= 0)
20  Throw(ERROR__NON_POSITIVE_NUMBER);
21  if(NULL == dims)
22  Throw(ERROR__NULL);
23 
24  pDim = new int[nDim];
25  /*iCur = new int[nDim];*/
26  int dim_i;
27  int mem_size = 1;
28  for(dim_i = 0; dim_i < nDim; ++dim_i)
29  {
30  /*iCur[dim_i] = 0;*/
31  pDim[dim_i] = dims[dim_i];
32  if(dims[dim_i] <= 0)
33  Throw(ERROR__NON_POSITIVE_NUMBER);
34  mem_size *= dims[dim_i];
35  }
36 
37  try{
38  pStorage = new T[mem_size];
39  }catch(...){
40  pStorage = NULL;
41  if(mem_size != 0)
42  Throw(ERROR__ALLOC);
43  }
44 }
45 
46 
47 /***********************************************************************
48  * Compute linear index in cube array.
49  */
50 template<class T>
51 int
52 CubeStorage<T>::lin_index (int i0, ...) const
53 {
54  int dim_i;
55  int *iCur = (int*) alloca(nDim);
56 
57  /* Translate int i0, ... to iCur[nDim] */
58  iCur[0] = i0;
59  va_list val;
60  va_start(val, i0);
61  for(dim_i = 1; dim_i < nDim; ++dim_i)
62  iCur[dim_i] = va_arg(val, int);
63  va_end(val);
64 
65  return lin_index(iCur);
66 }
67 
68 
69 /***********************************************************************
70  * Compute linear index in cube array. Item order aware.
71  */
72 template<class T>
73 int
74 CubeStorage<T>::lin_index (int* i) const
75 {
76  int dim_i, li = 0;
77 
78  switch(eItemOrder)
79  {
80  case AlaC:
81  for(dim_i = 0; dim_i < nDim; ++dim_i)
82  if(i[dim_i] < 0 || i[dim_i] >= pDim[dim_i])
83  Throw(ERROR__DA_OUT_OF_RANGE);
84  else if(nDim - 1 == dim_i)
85  li += i[dim_i];
86  else
87  {
88  li += i[dim_i];
89  li *= pDim[dim_i + 1];
90  }
91  break;
92  case AlaFortran:
93  for(dim_i = nDim - 1; dim_i >= 0; --dim_i)
94  if(i[dim_i] < 0 || i[dim_i] >= pDim[dim_i])
95  Throw(ERROR__DA_OUT_OF_RANGE);
96  else if(0 == dim_i)
97  li += i[dim_i];
98  else
99  {
100  li += i[dim_i];
101  li *= pDim[dim_i - 1];
102  }
103  break;
104  }
105  return li;
106 }
107 
108 
109 /***********************************************************************
110  * Compute total number of items in given cube.
111  */
112 template<class T>
113 int
114 CubeStorage<T>::items_number (int dim_n, int* dims) const
115 {
116  int dim_i;
117  int mem_size = 1;
118 
119  if(0 == dim_n)
120  return 0;
121 
122  for(dim_i = 0; dim_i < dim_n; ++dim_i)
123  mem_size *= dims[dim_i];
124 
125  return mem_size;
126 }
127 
128 
133 template<class T>
134 void
136 {
137  memset(pStorage, 0, sizeof(T) * items_number(nDim, pDim));
138 }
139 
140 
145 template<class T>
146 void
148 {
149  int i, n = items_number(nDim, pDim);
150  for(i = 0; i < n; ++i)
151  pStorage[i] = v;
152 }
153 
154 
155 #endif /* cust_other.H */
Definition: CubeStorage.H:48
void clean()
void fill(T v)