cisst-saw
 All Classes Namespaces Files Functions Variables Typedefs Enumerations Enumerator Friends Macros Groups Pages
vctDynamicNArrayOwner.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
7  Created on: 2006-06-27
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 _vctDynamicNArrayOwner_h
23 #define _vctDynamicNArrayOwner_h
24 
31 
35 template <class _elementType, vct::size_type _dimension>
37 {
38 public:
39  /* define most types from vctContainerTraits and vctNArrayTraits */
40  VCT_CONTAINER_TRAITS_TYPEDEFS(_elementType);
41  VCT_NARRAY_TRAITS_TYPEDEFS(_dimension);
42 
43  enum {DIMENSION = _dimension};
44 
47 
48  /* iterators are container specific */
53 
54 
56  SizesMember(0),
57  StridesMember(0),
58  Data(0)
59  {}
60 
61  vctDynamicNArrayOwner(const nsize_type & sizes)
62  : SizesMember(0)
63  , StridesMember(0)
64  , Data(0)
65  {
66  SetSize(sizes);
67  }
68 
70  {
71  Disown();
72  }
73 
76  dimension_type dimension(void) const
77  {
78  return DIMENSION;
79  }
80 
83  const nsize_type & sizes(void) const
84  {
85  return SizesMember;
86  }
87 
94  size_type size(dimension_type dimension) const
95  {
96  if (dimension < DIMENSION)
97  return SizesMember[dimension];
98  else
99  return 1;
100  }
101 
108  size_type size(void) const
109  {
110  if (DIMENSION == 0)
111  return 0;
112  else
113  return SizesMember.ProductOfElements();
114  }
115 
118  const nstride_type & strides(void) const
119  {
120  return StridesMember;
121  }
122 
126  stride_type stride(dimension_type dimension) const
127  {
128  if (dimension < DIMENSION)
129  return StridesMember[dimension];
130  else
131  return 1;
132  }
133 
136  pointer Pointer(void)
137  {
138  return Data;
139  }
140 
143  pointer Pointer(const nsize_type & indices)
144  {
146  indicesRef(reinterpret_cast<stride_type *>(const_cast<size_type *>(indices.Pointer())));
147  return (Data + StridesMember.DotProduct(indicesRef));
148  }
149 
152  const_pointer Pointer(void) const
153  {
154  return Data;
155  }
156 
159  const_pointer Pointer(const nsize_type & indices) const
160  {
162  indicesRef(reinterpret_cast<stride_type *>(const_cast<size_type *>(indices.Pointer())));
163  return (Data + StridesMember.DotProduct(indicesRef));
164  }
165 
167  {
168  return iterator(this, 0);
169  }
170 
171  iterator end(void)
172  {
173  return iterator(this, 0) + size();
174  }
175 
176  const_iterator begin(void) const
177  {
178  return const_iterator(this, 0);
179  }
180 
181  const_iterator end(void) const
182  {
183  return const_iterator(this, 0) + size();
184  }
185 
187  {
188  size_type endIndex = size() - 1;
189  return reverse_iterator(this, endIndex);
190  }
191 
193  {
194  return reverse_iterator(this, 0) + 1;
195  }
196 
198  {
199  size_type endIndex = size() - 1;
200  return const_reverse_iterator(this, endIndex);
201  }
202 
204  {
205  return const_reverse_iterator(this, 0) + 1;
206  }
207 
208  bool IsCompact(void) const {
209  return true;
210  }
211 
222  void SetSize(const nsize_type & sizes)
223  {
224  if (SizesMember.Equal(sizes)) return;
225  Disown();
226  const size_type totalSize = sizes.ProductOfElements();
227  Own(sizes, (totalSize == 0) ? 0 : new value_type[totalSize]);
228  }
229 
234  value_type * Release(void)
235  {
236  value_type* oldData = Data;
237  Data = 0;
238  SizesMember.SetAll(0);
239  UpdateStrides();
240  return oldData;
241  }
242 
250  value_type * Own(const nsize_type & sizes, value_type * data)
251  {
252  value_type* oldData = Data;
253  Data = data;
254  SizesMember.Assign(sizes);
255  UpdateStrides();
256  return oldData;
257  }
258 
262  void clear(void)
263  {
264  Disown();
265  }
266 
269  void Disown(void)
270  {
271  delete[] Data;
272  Data = 0;
273  SizesMember.SetAll(0);
274  UpdateStrides();
275  }
276 
277 protected:
278  nsize_type SizesMember;
279  nstride_type StridesMember;
280  value_type* Data;
281 
284  void UpdateStrides(void)
285  {
286  typename nsize_type::const_reverse_iterator sizesIter = SizesMember.rbegin();
287  typename nstride_type::reverse_iterator stridesIter = StridesMember.rbegin();
288  const typename nstride_type::const_reverse_iterator stridesEnd = StridesMember.rend();
289  size_type sizesIter_value;
290  stride_type previous_stride;
291 
292  if (stridesIter == stridesEnd)
293  return;
294 
295  *stridesIter = 1;
296  previous_stride = 1;
297  ++stridesIter;
298 
299  for (; stridesIter != stridesEnd;
300  ++stridesIter, ++sizesIter)
301  {
302  sizesIter_value = (*sizesIter == 0) ? 1 : *sizesIter;
303  *stridesIter = sizesIter_value * previous_stride;
304  previous_stride = *stridesIter;
305  }
306  }
307 
308 private:
309  // copy constructor private to prevent any call
310  vctDynamicNArrayOwner(const ThisType & CMN_UNUSED(other)) {};
311 
312 };
313 
314 
315 #endif // _vctDynamicNArrayOwner_h
316 
reverse_iterator rbegin(void)
Definition: vctDynamicNArrayOwner.h:186
void Disown(void)
Definition: vctDynamicNArrayOwner.h:269
nstride_type StridesMember
Definition: vctDynamicNArrayOwner.h:279
bool IsCompact(void) const
Definition: vctDynamicNArrayOwner.h:208
#define CMN_UNUSED(argument)
Definition: cmnPortability.h:479
const_iterator begin(void) const
Definition: vctDynamicNArrayOwner.h:176
iterator begin(void)
Definition: vctDynamicNArrayOwner.h:166
value_type * Own(const nsize_type &sizes, value_type *data)
Definition: vctDynamicNArrayOwner.h:250
Definition: vctDynamicNArrayOwner.h:36
pointer Pointer(const nsize_type &indices)
Definition: vctDynamicNArrayOwner.h:143
Forward declarations and #define for cisstVector.
const_pointer Pointer(void) const
Definition: vctDynamicNArrayOwner.h:152
An implementation of the ``abstract'' vctFixedSizeConstVectorBase.
Definition: vctFixedSizeConstVectorRef.h:50
size_t size_type
Definition: vctContainerTraits.h:35
vctVarStrideNArrayIterator< ThisType, false > reverse_iterator
Definition: vctDynamicNArrayOwner.h:51
~vctDynamicNArrayOwner()
Definition: vctDynamicNArrayOwner.h:69
vctVarStrideNArrayIterator< ThisType, true > iterator
Definition: vctDynamicNArrayOwner.h:49
vctDynamicNArrayOwner< _elementType, _dimension > ThisType
Definition: vctDynamicNArrayOwner.h:46
const_pointer Pointer(const nsize_type &indices) const
Definition: vctDynamicNArrayOwner.h:159
reverse_iterator rend(void)
Definition: vctDynamicNArrayOwner.h:192
Definition: vctDynamicNArrayOwner.h:43
value_type * Release(void)
Definition: vctDynamicNArrayOwner.h:234
stride_type stride(dimension_type dimension) const
Definition: vctDynamicNArrayOwner.h:126
size_type size(dimension_type dimension) const
Definition: vctDynamicNArrayOwner.h:94
Definition: vctForwardDeclarations.h:77
dimension_type dimension(void) const
Definition: vctDynamicNArrayOwner.h:76
value_type * Data
Definition: vctDynamicNArrayOwner.h:280
const nstride_type & strides(void) const
Definition: vctDynamicNArrayOwner.h:118
void clear(void)
Definition: vctDynamicNArrayOwner.h:262
pointer Pointer(void)
Definition: vctDynamicNArrayOwner.h:136
nsize_type SizesMember
Definition: vctDynamicNArrayOwner.h:278
void SetSize(const nsize_type &sizes)
Definition: vctDynamicNArrayOwner.h:222
const nsize_type & sizes(void) const
Definition: vctDynamicNArrayOwner.h:83
iterator end(void)
Definition: vctDynamicNArrayOwner.h:171
ptrdiff_t stride_type
Definition: vctContainerTraits.h:37
Definition: vctForwardDeclarations.h:74
VCT_NARRAY_TRAITS_TYPEDEFS(_dimension)
const_reverse_iterator rend(void) const
Definition: vctDynamicNArrayOwner.h:203
const_iterator end(void) const
Definition: vctDynamicNArrayOwner.h:181
size_type size(void) const
Definition: vctDynamicNArrayOwner.h:108
vctVarStrideNArrayConstIterator< ThisType, true > const_iterator
Definition: vctDynamicNArrayOwner.h:50
const_reverse_iterator rbegin(void) const
Definition: vctDynamicNArrayOwner.h:197
vctVarStrideNArrayConstIterator< ThisType, false > const_reverse_iterator
Definition: vctDynamicNArrayOwner.h:52
VCT_CONTAINER_TRAITS_TYPEDEFS(_elementType)
vctDynamicNArrayOwner()
Definition: vctDynamicNArrayOwner.h:55
vctDynamicNArrayOwner(const nsize_type &sizes)
Definition: vctDynamicNArrayOwner.h:61
void UpdateStrides(void)
Definition: vctDynamicNArrayOwner.h:284