cisst-saw
 All Classes Namespaces Files Functions Variables Typedefs Enumerations Enumerator Friends Macros Groups Pages
vctDynamicNArrayRefOwner.h
Go to the documentation of this file.
1 /* -*- Mode: C++; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 4 -*- */
2 /* ex: set filetype=cpp softtabstop=4 shiftwidth=4 tabstop=4 cindent expandtab: */
3 
4 /*
5 
6  Author(s): Daniel Li, Ofri Sadowsky, Anton Deguet
7  Created on: 2006-07-06
8 
9  (C) Copyright 2006-2007 Johns Hopkins University (JHU), All Rights
10  Reserved.
11 
12 --- begin cisst license - do not edit ---
13 
14 This software is provided "as is" under an open source license, with
15 no warranty. The complete license can be found in license.txt and
16 http://www.cisst.org/cisst/license.txt.
17 
18 --- end cisst license ---
19 */
20 
21 #pragma once
22 #ifndef _vctDynamicNArrayRefOwner_h
23 #define _vctDynamicNArrayRefOwner_h
24 
31 
35 template<class _elementType, vct::size_type _dimension>
37 {
38 public:
39  /* define most types from vctContainerTraits and vctNArrayTraits */
40  enum {DIMENSION = _dimension};
41  VCT_CONTAINER_TRAITS_TYPEDEFS(_elementType);
43 
46 
47  /* iterators are container specific */
52 
53 
55  SizesMember(0),
56  StridesMember(0),
57  Data(0)
58  {}
59 
61  const nsize_type & sizes,
62  const nstride_type & strides)
63  {
64  SetRef(data, sizes, strides);
65  }
66 
67  void SetRef(pointer data,
68  const nsize_type & sizes,
69  const nstride_type & strides)
70  {
71  Data = data;
74  this->UpdateCachedData();
75  }
76 
79  dimension_type dimension(void) const
80  {
81  return DIMENSION;
82  }
83 
86  const nsize_type & sizes(void) const
87  {
88  return SizesMember;
89  }
90 
97  size_type size(dimension_type dimension) const
98  {
99  if (dimension < DIMENSION)
100  return SizesMember[dimension];
101  else
102  return 1;
103  }
104 
111  size_type size(void) const
112  {
113  if (SizesMember.size() == 0)
114  return 0;
115  else
116  return SizesMember.ProductOfElements();
117  }
118 
121  const nstride_type & strides(void) const
122  {
123  return StridesMember;
124  }
125 
129  difference_type stride(dimension_type dimension) const
130  {
131  if (dimension < DIMENSION)
132  return StridesMember[dimension];
133  else
134  return 1;
135  }
136 
139  pointer Pointer(void)
140  {
141  return Data;
142  }
143 
146  pointer Pointer(const nindex_type & indices)
147  {
149  indicesRef(reinterpret_cast<stride_type *>(const_cast<size_type *>(indices.Pointer())));
150  return (Data + StridesMember.DotProduct(indicesRef));
151  }
152 
155  const_pointer Pointer(void) const
156  {
157  return Data;
158  }
159 
162  const_pointer Pointer(const nsize_type & indices) const
163  {
165  indicesRef(reinterpret_cast<stride_type *>(const_cast<size_type *>(indices.Pointer())));
166  return Data + StridesMember.DotProduct(indicesRef);
167  }
168 
170  {
171  return iterator(this, 0);
172  }
173 
174  iterator end(void)
175  {
176  return iterator(this, 0) + size();
177  }
178 
179  const_iterator begin(void) const
180  {
181  return const_iterator(this, 0);
182  }
183 
184  const_iterator end(void) const
185  {
186  return const_iterator(this, 0) + size();
187  }
188 
190  {
191  size_type endIndex = size() - 1;
192  return reverse_iterator(this, endIndex);
193  }
194 
196  {
197  return reverse_iterator(this, 0) + 1;
198  }
199 
201  {
202  size_type endIndex = size() - 1;
203  return const_reverse_iterator(this, endIndex);
204  }
205 
207  {
208  return const_reverse_iterator(this, 0) + 1;
209  }
210 
211 
212  inline bool IsCompact(void) const
213  {
214  return IsCompactMember;
215  }
216 
217 
218 protected:
219  nsize_type SizesMember;
220  nstride_type StridesMember;
221  pointer Data;
223 
224  inline void UpdateCachedData(void) {
225  /* sort strides and sizes, using Gnome sort as found on
226  wikipedia and www.cs.vu.nl/~dick/gnomesort.html */
227  nsize_type sorted_sizes(SizesMember);
228  nstride_type sorted_strides(StridesMember);
229 
230  index_type i = 0;
231  bool swap;
232  while (i < this->dimension()) {
233  swap = true;
234  if (i == 0) {
235  swap = false;
236  } else {
237  if (sorted_strides[i - 1] == sorted_strides[i]) {
238  if (sorted_sizes[i - 1] >= sorted_sizes[i]) {
239  swap = false;
240  }
241  } else {
242  if (sorted_strides[i - 1] > sorted_strides[i]) {
243  swap = false;
244  }
245  }
246  }
247  if (swap) {
248  std::swap(sorted_strides[i - 1], sorted_strides[i]);
249  std::swap(sorted_sizes[i - 1], sorted_sizes[i]);
250  i--;
251  } else {
252  i++;
253  }
254  }
255 
256  /* check compactness for sorted strides and sizes */
257  typename nsize_type::const_reverse_iterator sizesIter = sorted_sizes.rbegin();
258  typename nstride_type::const_reverse_iterator stridesIter = sorted_strides.rbegin();
259  const typename nstride_type::const_reverse_iterator stridesEnd = sorted_strides.rend();
260  size_type sizesIter_value;
261  stride_type previous_stride;
262 
263  if (stridesIter != stridesEnd) {
264  if (*stridesIter != 1) {
265  IsCompactMember = false;
266  return;
267  } else {
268  previous_stride = 1;
269  ++stridesIter;
270  }
271  }
272 
273  for (;
274  stridesIter != stridesEnd;
275  ++stridesIter, ++sizesIter) {
276  sizesIter_value = (*sizesIter == 0) ? 1 : *sizesIter;
277  if (*stridesIter != static_cast<stride_type>(sizesIter_value) * previous_stride) {
278  IsCompactMember = false;
279  return;
280  } else {
281  previous_stride = *stridesIter;
282  }
283  }
284  IsCompactMember = true;
285  }
286 
287 private:
288  // copy constructor private to prevent any call
289  vctDynamicNArrayRefOwner(const ThisType & CMN_UNUSED(other)) {};
290 
291 };
292 
293 
294 #endif // _vctDynamicNArrayRefOwner_h
295 
size_t index_type
Definition: vctContainerTraits.h:36
VCT_NARRAY_TRAITS_TYPEDEFS(DIMENSION)
vctVarStrideNArrayConstIterator< ThisType, true > const_iterator
Definition: vctDynamicNArrayRefOwner.h:49
VCT_CONTAINER_TRAITS_TYPEDEFS(_elementType)
bool IsCompact(void) const
Definition: vctDynamicNArrayRefOwner.h:212
const_iterator begin(void) const
Definition: vctDynamicNArrayRefOwner.h:179
#define CMN_UNUSED(argument)
Definition: cmnPortability.h:479
const_reverse_iterator rbegin(void) const
Definition: vctDynamicNArrayRefOwner.h:200
const_reverse_iterator rend(void) const
Definition: vctDynamicNArrayRefOwner.h:206
difference_type stride(dimension_type dimension) const
Definition: vctDynamicNArrayRefOwner.h:129
nstride_type StridesMember
Definition: vctDynamicNArrayRefOwner.h:220
pointer Data
Definition: vctDynamicNArrayRefOwner.h:221
An implementation of the ``abstract'' vctFixedSizeConstVectorBase.
Definition: vctFixedSizeConstVectorRef.h:50
size_t size_type
Definition: vctContainerTraits.h:35
iterator begin(void)
Definition: vctDynamicNArrayRefOwner.h:169
Declaration of vctNArrayConstIterator and vctVarStrideNArrayIterator.
reverse_iterator rbegin(void)
Definition: vctDynamicNArrayRefOwner.h:189
bool IsCompactMember
Definition: vctDynamicNArrayRefOwner.h:222
const_pointer Pointer(const nsize_type &indices) const
Definition: vctDynamicNArrayRefOwner.h:162
void UpdateCachedData(void)
Definition: vctDynamicNArrayRefOwner.h:224
vctDynamicNArrayRefOwner(pointer data, const nsize_type &sizes, const nstride_type &strides)
Definition: vctDynamicNArrayRefOwner.h:60
iterator end(void)
Definition: vctDynamicNArrayRefOwner.h:174
const nstride_type & strides(void) const
Definition: vctDynamicNArrayRefOwner.h:121
Definition: vctDynamicNArrayRefOwner.h:36
dimension_type dimension(void) const
Definition: vctDynamicNArrayRefOwner.h:79
ptrdiff_t difference_type
Definition: vctContainerTraits.h:38
Definition: vctForwardDeclarations.h:77
const_pointer Pointer(void) const
Definition: vctDynamicNArrayRefOwner.h:155
vctVarStrideNArrayConstIterator< ThisType, false > const_reverse_iterator
Definition: vctDynamicNArrayRefOwner.h:51
pointer Pointer(void)
Definition: vctDynamicNArrayRefOwner.h:139
pointer Pointer(const nindex_type &indices)
Definition: vctDynamicNArrayRefOwner.h:146
const_iterator end(void) const
Definition: vctDynamicNArrayRefOwner.h:184
reverse_iterator rend(void)
Definition: vctDynamicNArrayRefOwner.h:195
ptrdiff_t stride_type
Definition: vctContainerTraits.h:37
Definition: vctForwardDeclarations.h:74
size_type size(void) const
Definition: vctDynamicNArrayRefOwner.h:111
nsize_type SizesMember
Definition: vctDynamicNArrayRefOwner.h:219
void SetRef(pointer data, const nsize_type &sizes, const nstride_type &strides)
Definition: vctDynamicNArrayRefOwner.h:67
const nsize_type & sizes(void) const
Definition: vctDynamicNArrayRefOwner.h:86
vctVarStrideNArrayIterator< ThisType, false > reverse_iterator
Definition: vctDynamicNArrayRefOwner.h:50
vctDynamicNArrayRefOwner< _elementType, DIMENSION > ThisType
Definition: vctDynamicNArrayRefOwner.h:45
vctVarStrideNArrayIterator< ThisType, true > iterator
Definition: vctDynamicNArrayRefOwner.h:48
size_type size(dimension_type dimension) const
Definition: vctDynamicNArrayRefOwner.h:97
Definition: vctDynamicNArrayRefOwner.h:40
vctDynamicNArrayRefOwner()
Definition: vctDynamicNArrayRefOwner.h:54