FiberVISH 0.2
Fish - The Fiber Bundle API for the Vish Visualization Shell
MemArray.hpp
1
2#ifndef __FIBER_MEMARRAY_HPP
3#define __FIBER_MEMARRAY_HPP
4
5#ifndef DONT_USE_PRAGMA_ONCE
6#pragma once
7#endif
8
9#include "ReferencingMemArray.hpp"
10#include <fiber/vector/MultiCopy.hpp>
11
12namespace Fiber
13{
14 using std::type_info;
15
16 using MemCore::RefPtr;
18 using MemCore::Chunk;
19
20
21template <Dims_t N>
22 class MemArrayGetSlice;
23
24template <Dims_t N, class T>
25class MemArray;
26
32template <Dims_t N, class T>
33class MemArray : public ReferencingMemArray<N, T>
34{
36
37static bool TypeIsRegistered;
38
39protected:
40
41
42public:
43
44 ~MemArray()
45 {
46#ifdef VERBOSE_MEMARRAY
47 printf("MemArray::~MemArray(): releasing %ld bytes\n", long(memsize()) );
48 this->MemChunk::speak("MemArray::~MemArray() chunk");
49#endif
50 }
51
52 typedef typename MetaInfo<T>::element_t element_t;
53
57
59 typedef T value_type;
60
65
71
72 enum
73 {
75 Dims = N
76 };
77
78static bool reg()
79 {
80 if (TypeIsRegistered)
81 MemBase::RegisteredTypes++;
82
83 return TypeIsRegistered;
84 }
85
86 MemArray( const Iterator<T>&data, const MultiIndex<N>&Sz,
87 const RefPtr<MemCore::ChunkBase>&MemStorage,
88 const MemBase::Creator_t&C )
89 : MemBase(FiberType<T>::getFiberType()->getFiberTypeIndex() , C)
90 , ReferencingMemArray<N,T>(data, Sz, MemStorage, C)
91 {}
92
93public:
96
98 using MultiArray_t::ptr;
99
100 typedef MemCore::NullPtr NullPtr;
101
102 typedef typename MultiArray_t::component_t component_t;
103 typedef typename MultiArray_t::ValueBase_t ValueBase_t;
104
105 typedef typename MultiArray_t::MultiArrayBase_t MultiArrayBase_t;
106 typedef typename MultiArray_t::MultiArrayComponent_t MultiArrayComponent_t;
107
110
112 MemArray(const MultiIndex<N>&M, const MemBase::Creator_t&C = nullptr )
113 : MemBase(FiberType<T>::getFiberType()->getFiberTypeIndex() , C)
114 , ReferencingMemArray<N, T>( new Chunk<T>( M.size() ), M, C)
115 {
116 reg();
117 }
118
123 : MemBase(FiberType<T>::getFiberType()->getFiberTypeIndex() , C)
124 , ReferencingMemArray<N, T>( Data, M, C)
125 {
126 reg();
127 }
128
133 : MemBase(FiberType<T>::getFiberType()->getFiberTypeIndex() , C)
134 , ReferencingMemArray<N, T>( Data, Sz, C)
135 {
136 reg();
137 }
138
140 : MemBase(FiberType<T>::getFiberType()->getFiberTypeIndex() , C)
141 , ReferencingMemArray<N,T>(Storage, M, C)
142 {
143 reg();
144 }
145
146/*
147 RefPtr<MemArrayOfBaseValues_t> createSharedBaseArray() const
148 {
149 return new MemArrayOfBaseValues_t( this->StoragePtr(), Size() );
150 }
151
152 RefPtr<MemBase> createBaseArray() const
153 {
154 return createSharedBaseArray();
155 }
156*/
157
158 friend class MemArrayGetSlice<N>;
159 friend class MemArrayGetSlice<N+1>;
160
161/*
162 void DeferredConstructor()
163 {
164 MemCore::SaveRegistry<MemArray>::addInterfaces(this) override;
165// addInterface( new StorageInterpolator( this ) );
166 }
167*/
168
169public:
170
171 RefPtr<MemBase> getSlice(index_t i, const MemBase::Creator_t&C) const override;
172
174 MultiIndex<N> Size() const override
175 {
176 return MultiArray_t::Size();
177 }
178
185 {
186 return this->self();
187 }
188
193 {
194 return new MemArray( NewSize, C );
195 }
196
203 {
204 if (!Data) return MemCore::NullPtr();
205 if (Data->size() != Size().size() )
206 return MemCore::NullPtr();
207
208 return new MemArray(Data, Size(), C);
209 }
210
217 {
218 if (!Data) return MemCore::NullPtr();
219 if (Data->elements() != Size().size() )
220 return MemCore::NullPtr();
221
222 return new MemArray(Data, Size(), C );
223 }
224
235
236 RefPtr<MemBase> copy(const MemBase::Creator_t&C = nullptr) const override
237 {
238 if (!this->myStorage)
239 return nullptr;
240
241 return new MemArray(this->myStorage->copy(), Size(), C );
242 }
243
244
246 {
248 MultiArray_t&Dest = *Result;
249
250 CopySubset(CopySize, Dest, MultiIndex<N>(0), *this, Offset, ::Fiber::PlainCopyConvert() );
251
252 return Result;
253 }
254
255 RefPtr<MemBase> getComponentArray(int member, const MemBase::Creator_t&C) override
256 {
257 if (member >= MetaInfo<T>::MULTIPLICITY)
258 return MemCore::NullPtr();
259
260 Iterator<T> &me = *this;
262
263 return new ComponentArray_t( component_ptr, MultiArray_t::Size(), this->myStorage, C );
264 }
265
266/*
267 RefPtr<MemBase> computeNthDerivative(int N)
268 {
269 DeriveArray<Interpol, Dims>::computeNthDerivative(result, this, N);
270 }
271*/
272};
273
274
275template <class T>
276inline RefPtr<TypedArray<T>> newMemArray(const DynamicSize&DS,
277 const MemBase::Creator_t&C = nullptr )
278{
279 switch(DS.getRank())
280 {
281 default: return nullptr;
282
283 case 1: return new MemArray<1, T>( DS.getSize<1>(), C );
284
285 case 2: return new MemArray<2, T>( DS.getSize<2>(), C );
286
287 case 3: return new MemArray<3, T>( DS.getSize<3>(), C );
288
289 case 4: return new MemArray<4, T>( DS.getSize<4>(), C );
290 }
291}
292
293
294
295template <class T>
296inline RefPtr<MemBase> MemArrayAllocator<T>::create(const DynamicSize&DS) const
297{
298 return newMemArray<T>(DS);
299/*
300 switch(DS.getRank())
301 {
302 default: return MemCore::NullPtr();
303
304 case 1: return new MemArray<1, T>( DS.getSize<1>() );
305
306 case 2: return new MemArray<2, T>( DS.getSize<2>() );
307
308 case 3: return new MemArray<3, T>( DS.getSize<3>() );
309
310 case 4: return new MemArray<4, T>( DS.getSize<4>() );
311 }
312*/
313}
314
315template <Dims_t N, class T>
316bool MemArray<N,T>::TypeIsRegistered = MemArrayAllocator<T>::isRegistered();
317
318
319
320
321
322
323template <Dims_t N>
325{
326public:
327 template <class T>
328static RefPtr<MemArray<N-1, T> > getSlice(const MemArray<N,T>&M, index_t i, const MemBase::Creator_t&C)
329 {
330 return new MemArray<N-1,T>(M.StoragePtr(), M[i], C );
331 }
332};
333
334
335template <>
337{
338public:
339 template <class T>
340static MemCore::NullPtr getSlice(const MemArray<1,T>&, index_t i, const MemBase::Creator_t&C)
341 {
342 return MemCore::NullPtr();
343 }
344};
345
346
347template <Dims_t N, class T>
349{
350 return MemArrayGetSlice<N>::getSlice(*this, i, C);
351}
352
356template <class T>
359{
360 if (!DataChunk)
361 return ::MemCore::NullPtr();
362
363 return new MemArray<1, T>( DataChunk, MIndex(DataChunk->elements() ), C);
364}
365
369template <class T>
371{
372 if (!DataChunk)
373 return ::MemCore::NullPtr();
374
375 return new MemArray<1, T>( DataChunk, MIndex(DataChunk->size() ), C);
376}
377
378
379} /* namespace Fiber */
380
381
382#endif /* __FIBER_MEMARRAY_HPP */
valarray< size_t > size() const
An iterator with an optional DataCreator, which is just a class to intercept creation of data along a...
Definition CreativeIterator.hpp:34
Description of types, which is meta-information like what is the number of elements of some array-lik...
Definition FiberType.hpp:61
Iterator< component_t > getComponent(int n) const
Get an iterator that operates on the nth component.
Definition vector/Iterator.hpp:1307
Definition MemArray.hpp:325
Class for N-dimensional MultiArrays with MemCore memory management.
Definition MemArray.hpp:34
RefPtr< MemArray > createMemArray(const MemCore::MemVector< T > &Data, const MemBase::Creator_t &C) const
Create a memory array of the same dimensions as the current array, but with data as provided by the M...
Definition MemArray.hpp:202
RefPtr< MemBase > copy(const MemBase::Creator_t &C=nullptr) const override
Create a copy of the current array, duplicating all data and allocating new memory for it.
Definition MemArray.hpp:236
@ Dims
The dimensionality of this array.
Definition MemArray.hpp:75
MemArray(const MemCore::MemVector< T > &Data, const MultiIndex< N > &M, const MemBase::Creator_t &C=nullptr)
Construct from size and a MemVector, for convenience, hoping that the memory sizes fit.
Definition MemArray.hpp:122
MultiIndex< N > Size() const override
Return the number of dimensions.
Definition MemArray.hpp:174
MemArray< N, value_base_type > MemArrayOfBaseValues_t
A memory array consisting of types of the base classes for the value type T.
Definition MemArray.hpp:70
META::BaseClass< T >::result value_base_type
The base class of the given type T.
Definition MemArray.hpp:64
MemArray(const RefPtr< MemCore::ChunkBase > &Data, const MultiIndex< N > &Sz, const MemBase::Creator_t &C=NullPtr())
Construct from memory chunk and multidimensional index, hoping that the memory sizes fit.
Definition MemArray.hpp:132
MemArray(const MultiIndex< N > &M, const MemBase::Creator_t &C=nullptr)
Construct from size, allocate new memory during construction.
Definition MemArray.hpp:112
MultiArray< N, T > MultiArray_t
Export multiarray type.
Definition MemArray.hpp:95
RefPtr< MemBase > getSlice(index_t i, const MemBase::Creator_t &C) const override
For a multidimensional array retrieve the nth slice.
Definition MemArray.hpp:348
RefPtr< MemBase > newMemArraynD(const MultiIndex< N > &NewSize, const MemBase::Creator_t &C) const override
Create a new memory array of the same type, initialized with default data values.
Definition MemArray.hpp:192
RefPtr< MemBase > makeMemArray(const MemBase::Creator_t &) const override
Make a memory array, in this case it's already one, so it's a do-nothing operation.
Definition MemArray.hpp:184
RefPtr< MemBase > createEquallySizedMemArray(const RefPtr< MemCore::ChunkBase > &Storage, const MemBase::Creator_t &C) const override
Create a memory array of the same dimensions as the current array, but with data as provided by the S...
Definition MemArray.hpp:231
RefPtr< MemBase > createSubMemArray(const MultiIndex< N > &Offset, const MultiIndex< N > &CopySize, const MemBase::Creator_t &C) const override
Create a new MemArray from a subset of the current array's data.
Definition MemArray.hpp:245
T value_type
Export the type that is operated on here.
Definition MemArray.hpp:59
MemArray< N, element_t > ComponentArray_t
The type of an array that refers to just a component, if the value type is a structure.
Definition MemArray.hpp:56
RefPtr< MemArray > createMemArray(const RefPtr< MemCore::ChunkBase > &Data, const MemBase::Creator_t &C) const
Create a memory array of the same dimensions as the current array, but with data as provided by the S...
Definition MemArray.hpp:216
Base class for multidimensional arrays with MemCore memory management.
Definition MemBase.hpp:70
Definition MultiArray.hpp:371
A memory array that may share its data storage with something else.
Definition ReferencingMemArray.hpp:104
MemCore::memsize_t memsize() const override
Note: memsize does not return the number of elements here, but the actual memory that is occupied.
Definition ReferencingMemArray.hpp:211
void CopySubset(const MultiIndex< N > &HowMany, MultiArray< N, Dest > &DestArray, const MultiIndex< N > &DestOffset, const MultiArray< N, Source > &SrcArray, const MultiIndex< N > &SrcOffset, const Converter &C)
Copy a subset of data from the source array to the destination array.
Definition MultiCopy.hpp:114
Given a fragmented field of curvilinear coordinates, (3D array of coordinates), build a uniform Grid ...
Definition FAQ.dox:2
RefPtr< MemArray< 1, T > > makeMemArray1D(const RefPtr< MemCore::TypedChunk< T > > &DataChunk, const MemBase::Creator_t &C=MemCore::NullPtr())
Create one-dimensional MemArray from provided data chunk.
Definition MemArray.hpp:357
IndexTypeConfig< sizeof(void *)>::index_t index_t
Define the index type as according to the size of a pointer, i.e.
Definition Index.hpp:22
std::nullptr_t NullPtr
Definition MultiCopy.hpp:25