cisst-saw
Loading...
Searching...
No Matches
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
14This software is provided "as is" under an open source license, with
15no warranty. The complete license can be found in license.txt and
16http://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
29
31
35template <class _elementType, vct::size_type _dimension>
37{
38public:
39 /* define most types from vctContainerTraits and vctNArrayTraits */
42
43 enum {DIMENSION = _dimension};
44
47
48 /* iterators are container specific */
53
54
60
61 vctDynamicNArrayOwner(const nsize_type & sizes)
62 : SizesMember(0)
63 , StridesMember(0)
64 , Data(0)
65 {
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
172 {
173 return iterator(this, 0) + size();
174 }
175
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
235 {
236 value_type* oldData = Data;
237 Data = 0;
238 SizesMember.SetAll(0);
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);
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);
275 }
276
277protected:
278 nsize_type SizesMember;
279 nstride_type StridesMember;
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
308private:
309 // copy constructor private to prevent any call
310 vctDynamicNArrayOwner(const ThisType & CMN_UNUSED(other)) {};
311
312};
313
314
315#endif // _vctDynamicNArrayOwner_h
316
const_pointer Pointer(const nsize_type &indices) const
Definition vctDynamicNArrayOwner.h:159
void UpdateStrides(void)
Definition vctDynamicNArrayOwner.h:284
dimension_type dimension(void) const
Definition vctDynamicNArrayOwner.h:76
size_type size(dimension_type dimension) const
Definition vctDynamicNArrayOwner.h:94
size_type size(void) const
Definition vctDynamicNArrayOwner.h:108
const_reverse_iterator rend(void) const
Definition vctDynamicNArrayOwner.h:203
~vctDynamicNArrayOwner()
Definition vctDynamicNArrayOwner.h:69
vctVarStrideNArrayConstIterator< ThisType, false > const_reverse_iterator
Definition vctDynamicNArrayOwner.h:52
vctVarStrideNArrayIterator< ThisType, true > iterator
Definition vctDynamicNArrayOwner.h:49
reverse_iterator rbegin(void)
Definition vctDynamicNArrayOwner.h:186
const nstride_type & strides(void) const
Definition vctDynamicNArrayOwner.h:118
const nsize_type & sizes(void) const
Definition vctDynamicNArrayOwner.h:83
iterator end(void)
Definition vctDynamicNArrayOwner.h:171
value_type * Own(const nsize_type &sizes, value_type *data)
Definition vctDynamicNArrayOwner.h:250
iterator begin(void)
Definition vctDynamicNArrayOwner.h:166
nstride_type StridesMember
Definition vctDynamicNArrayOwner.h:279
vctDynamicNArrayOwner(const nsize_type &sizes)
Definition vctDynamicNArrayOwner.h:61
stride_type stride(dimension_type dimension) const
Definition vctDynamicNArrayOwner.h:126
vctVarStrideNArrayConstIterator< ThisType, true > const_iterator
Definition vctDynamicNArrayOwner.h:50
value_type * Data
Definition vctDynamicNArrayOwner.h:280
const_reverse_iterator rbegin(void) const
Definition vctDynamicNArrayOwner.h:197
pointer Pointer(void)
Definition vctDynamicNArrayOwner.h:136
vctVarStrideNArrayIterator< ThisType, false > reverse_iterator
Definition vctDynamicNArrayOwner.h:51
pointer Pointer(const nsize_type &indices)
Definition vctDynamicNArrayOwner.h:143
const_iterator begin(void) const
Definition vctDynamicNArrayOwner.h:176
@ DIMENSION
Definition vctDynamicNArrayOwner.h:43
bool IsCompact(void) const
Definition vctDynamicNArrayOwner.h:208
vctDynamicNArrayOwner< _elementType, _dimension > ThisType
Definition vctDynamicNArrayOwner.h:46
vctDynamicNArrayOwner()
Definition vctDynamicNArrayOwner.h:55
void SetSize(const nsize_type &sizes)
Definition vctDynamicNArrayOwner.h:222
value_type * Release(void)
Definition vctDynamicNArrayOwner.h:234
const_pointer Pointer(void) const
Definition vctDynamicNArrayOwner.h:152
nsize_type SizesMember
Definition vctDynamicNArrayOwner.h:278
VCT_NARRAY_TRAITS_TYPEDEFS(_dimension)
void Disown(void)
Definition vctDynamicNArrayOwner.h:269
VCT_CONTAINER_TRAITS_TYPEDEFS(_elementType)
const_iterator end(void) const
Definition vctDynamicNArrayOwner.h:181
void clear(void)
Definition vctDynamicNArrayOwner.h:262
reverse_iterator rend(void)
Definition vctDynamicNArrayOwner.h:192
Definition vctForwardDeclarations.h:86
Definition vctVarStrideNArrayIterator.h:46
Definition vctVarStrideNArrayIterator.h:304
#define CMN_UNUSED(argument)
Definition cmnPortability.h:497
vctDynamicConstMatrixBase< _matrixOwnerType, _elementType > ThisType
Definition vctDynamicConstMatrixBase.h:86
Forward declarations and #define for cisstVector.