cisst-saw
Loading...
Searching...
No Matches
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
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 _vctDynamicNArrayRefOwner_h
23#define _vctDynamicNArrayRefOwner_h
24
29
31
35template<class _elementType, vct::size_type _dimension>
37{
38public:
39 /* define most types from vctContainerTraits and vctNArrayTraits */
40 enum {DIMENSION = _dimension};
43
46
47 /* iterators are container specific */
52
53
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
175 {
176 return iterator(this, 0) + size();
177 }
178
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
218protected:
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
287private:
288 // copy constructor private to prevent any call
290
291};
292
293
294#endif // _vctDynamicNArrayRefOwner_h
295
pointer Data
Definition vctDynamicNArrayRefOwner.h:221
pointer Pointer(void)
Definition vctDynamicNArrayRefOwner.h:139
const_pointer Pointer(const nsize_type &indices) const
Definition vctDynamicNArrayRefOwner.h:162
const_reverse_iterator rbegin(void) const
Definition vctDynamicNArrayRefOwner.h:200
@ DIMENSION
Definition vctDynamicNArrayRefOwner.h:40
bool IsCompact(void) const
Definition vctDynamicNArrayRefOwner.h:212
const_reverse_iterator rend(void) const
Definition vctDynamicNArrayRefOwner.h:206
nstride_type StridesMember
Definition vctDynamicNArrayRefOwner.h:220
const_pointer Pointer(void) const
Definition vctDynamicNArrayRefOwner.h:155
dimension_type dimension(void) const
Definition vctDynamicNArrayRefOwner.h:79
iterator begin(void)
Definition vctDynamicNArrayRefOwner.h:169
vctDynamicNArrayRefOwner(pointer data, const nsize_type &sizes, const nstride_type &strides)
Definition vctDynamicNArrayRefOwner.h:60
vctDynamicNArrayRefOwner()
Definition vctDynamicNArrayRefOwner.h:54
reverse_iterator rbegin(void)
Definition vctDynamicNArrayRefOwner.h:189
difference_type stride(dimension_type dimension) const
Definition vctDynamicNArrayRefOwner.h:129
vctVarStrideNArrayIterator< ThisType, true > iterator
Definition vctDynamicNArrayRefOwner.h:48
const_iterator begin(void) const
Definition vctDynamicNArrayRefOwner.h:179
iterator end(void)
Definition vctDynamicNArrayRefOwner.h:174
void UpdateCachedData(void)
Definition vctDynamicNArrayRefOwner.h:224
vctVarStrideNArrayIterator< ThisType, false > reverse_iterator
Definition vctDynamicNArrayRefOwner.h:50
pointer Pointer(const nindex_type &indices)
Definition vctDynamicNArrayRefOwner.h:146
const nsize_type & sizes(void) const
Definition vctDynamicNArrayRefOwner.h:86
reverse_iterator rend(void)
Definition vctDynamicNArrayRefOwner.h:195
bool IsCompactMember
Definition vctDynamicNArrayRefOwner.h:222
vctVarStrideNArrayConstIterator< ThisType, true > const_iterator
Definition vctDynamicNArrayRefOwner.h:49
vctDynamicNArrayRefOwner< _elementType, DIMENSION > ThisType
Definition vctDynamicNArrayRefOwner.h:45
VCT_NARRAY_TRAITS_TYPEDEFS(DIMENSION)
size_type size(void) const
Definition vctDynamicNArrayRefOwner.h:111
size_type size(dimension_type dimension) const
Definition vctDynamicNArrayRefOwner.h:97
vctVarStrideNArrayConstIterator< ThisType, false > const_reverse_iterator
Definition vctDynamicNArrayRefOwner.h:51
VCT_CONTAINER_TRAITS_TYPEDEFS(_elementType)
const nstride_type & strides(void) const
Definition vctDynamicNArrayRefOwner.h:121
void SetRef(pointer data, const nsize_type &sizes, const nstride_type &strides)
Definition vctDynamicNArrayRefOwner.h:67
const_iterator end(void) const
Definition vctDynamicNArrayRefOwner.h:184
nsize_type SizesMember
Definition vctDynamicNArrayRefOwner.h:219
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
Declaration of vctNArrayConstIterator and vctVarStrideNArrayIterator.