FiberVISH 0.2
Fish - The Fiber Bundle API for the Vish Visualization Shell
CreativeArrayBase.hpp
1#ifndef __FIBER_CREATIVEARRAYBASE_HPP
2#define __FIBER_CREATIVEARRAYBASE_HPP
3
4#include "FieldAPI.h"
5#include <memcore/RefPtr.hpp>
6#include <memcore/Interface.hpp>
7#include <memcore/Persistencer.hpp>
8#include <memcore/Cacheable.hpp>
9#include <memcore/Cache.hpp>
10#include <memcore/Creator.hpp>
11#include <memcore/Chunk.hpp>
12
13#include <typeinfo>
14#include "FiberType.hpp"
15#include "MemBase.hpp"
16#include "BinderBase.hpp"
17#include "Ownable.hpp"
18#include <memcore/Attributes.hpp>
19
20namespace Fiber
21{
22
32{
33public:
34 mutable MemCore::Ageable LastSavedAttributes;
35
37
38 void attributesHaveBeenSaved() const
39 {
40 LastSavedAttributes.touch();
41 }
42
43 bool attributesNeedSaving() const
44 {
45 return AttributeModificationAge.isYoungerThan( LastSavedAttributes );
46 }
47};
48
49
55{
57 newestFragmentCreator = MemCore::Ageable::InfinitelyOld(),
58 newestFragmentAttributes = MemCore::Ageable::InfinitelyOld(),
59 newestFragmentRange = MemCore::Ageable::InfinitelyOld(),
60 newestLastSavedCreator = MemCore::Ageable::InfinitelyOld();
61};
62
63
73 , public Ownable<CreativeArrayBase, CreativeArrayBaseContainerBase>
74 , public SaveableAttributes
75{
76protected:
77
80
81 FiberTypeIndex myFiberTypeIndex;
82 MemCore::WeakPtr<FiberTypeBase> myFiberTypeBase;
83
84public:
90
91 mutable AgeRelativeToBinder LastSavedTimes;
92
93 enum class CreationFailure
94 {
95 None,
96 OutOfMemory,
97 CannotOpen,
98 CannotRead,
99 CannotSave,
100 Timeout,
101 Unknown
102 }
103 Error = CreationFailure::None;
104
105static bool retryCreation(CreativeArrayBase&);
106
108 CreativeArrayBase(const MemCore::WCachePtr&theCache);
109
110 Ageable&touch() throw();
111
112 const Ageable&touchAttributes() const;
113 const Ageable&updateAttributeAge(const Ageable&A) const;
114
115 void extremeUnction();
116
122 bool needsSaving() const
123 {
124 return isYoungerThan(LastSaved);
125 }
126
133 void hasBeenSaved() const
134 {
135 LastSaved.update( *this );
136 attributesHaveBeenSaved();
137 }
138
143 void addDataMetaInfo(const MemCore::RefPtr<MemBase>&D);
144
145 const FiberTypeIndex&getFiberTypeIndex() const
146 {
147 return myFiberTypeIndex;
148 }
149
155 auto value_type_size() const
156 {
157 return getFiberTypeIndex().value_type_size();
158 }
159
160
161 RefPtr<FiberTypeBase> getFiberType() const;
162
163 void setFiberType(const RefPtr<FiberTypeBase>&FTB);
164
165 template <class ...T>
166 bool isType() const
167 {
168 if (RefPtr<FiberTypeBase> ftb = getFiberType() )
169 return ftb->isType<T...>();
170
171 return false;
172 }
173
174 void addMetaInfo(const DynamicSize&theSize,
175 const RefPtr<FiberTypeBase>&theDataType);
176
177 void addMetaInfo(int nDimensions,
178 const RefPtr<FiberTypeBase>&theDataType);
179
180
194 RefPtr<BinderBase>
195 getBinder() const;
196
197
212 void save(const MemCore::RefPtr<MemBase>&D) const;
213
214#if 0
215 template <class RefType>
216 Creature::ReasonForReleasal release_ptr_with_possible_saving(RefPtr<RefType>&Data, bool needsSaving) const
217 {
218 if (!Data)
219 return successfully_released;
220
221 {
222 VerboseSection(100, ' ');
223
224 {
226 if (needsSaving)
227 {
228// Verbose(110) << " CreativeArrayBase is saving data for " << D;
229 save(D);
230 }
231
232 /*
233 One strong reference for the stored data type
234 another strong reference for the local copy here.
235 */
236 if (Data.strong_refs()>2)
237 {
238 Verbose(110) << " CreativeArrayBase was unable to release data object " << D;
239 return temporarily_unreleasable;
240 }
241
242 Verbose(110) << " CreativeArrayBase is releasing data object " << D;
243 Data = nullptr;
244 }
245 Verbose(110) << " --> CreativeArrayBase has RELEASED data object " << Data;
246 }
247
248 return successfully_released;
249 }
250#endif
251};
252
253inline RefPtr<MemBase> getMemBase(const MemCore::WeakPtr<CreativeArrayBase>&MemDataCreator)
254{
255 if (MemDataCreator)
256 return MemDataCreator->create();
257
258 return nullptr;
259}
260
261inline RefPtr<MemCore::ChunkBase> getChunk(const MemCore::WeakPtr<CreativeArrayBase>&MemDataCreator)
262{
263 if (MemDataCreator)
264 return getChunk(MemDataCreator->create() );
265
266 return nullptr;
267}
268
269inline RefPtr<MemBase> operator-(const MemCore::WeakPtr<CreativeArrayBase>&MemDataCreator)
270{
271 return getMemBase( MemDataCreator );
272}
273
274inline RefPtr<MemCore::ChunkBase> operator+(const MemCore::WeakPtr<CreativeArrayBase>&MemDataCreator)
275{
276 return -(-MemDataCreator);
277}
278
279
284template <Dims_t N>
286{
287 if (!CAB) return;
288
289 CAB->addInterface( new SizeInterface( FragmentSize ) );
290}
291
296template <Dims_t N>
301
307{
308 if (!CAB)
309 return 0;
310
312 if (SI)
313 return SI->getRank();
314
315 return 0;
316}
317
322extern FIELD_API RefPtr<SizeInterface> getSize(const CreativeArrayBase&CAB);
324
330{
331 if (!CAB) return nullptr;
332 return getSize(*CAB);
333}
334
335inline RefPtr<SizeInterface> makeSize(const RefPtr<CreativeArrayBase>&CAB)
336{
337 if (!CAB) return nullptr;
338 return makeSize(*CAB);
339}
340
347{
348 if (RefPtr<SizeInterface> S = getSize( CAB ) )
349 return S->getNumberOfElements();
350
351 return 0;
352}
353
360{
361 if (RefPtr<SizeInterface> S = getSize( CAB ) )
362 return S->getNumberOfElements();
363
364 return 0;
365}
366
367
372template <Dims_t N>
374{
375 if (!CAB)
376 return false;
377
379 if (SI)
380 return SI->get(MI);
381
382 return false;
383}
384
389extern FIELD_API MemCore::memsize_t getMemoryUsage(const CreativeArrayBase&CAB);
390
391
392} // namespace Fiber
393
394
395#endif /* __FIBER_CREATIVEARRAYBASE_HPP */
Base class for multidimensional arrays that employ deferred storage, i.e.
Definition CreativeArrayBase.hpp:75
auto value_type_size() const
How many bytes this object occupies in memory.
Definition CreativeArrayBase.hpp:155
void hasBeenSaved() const
Indicate that this dataset has been saved and does not need to be saved again.
Definition CreativeArrayBase.hpp:133
Ageable LastSaved
The age when the data contained here had been saved last. (), CreatorConstructionContext.
Definition CreativeArrayBase.hpp:89
An iterator with an optional DataCreator, which is just a class to intercept creation of data along a...
Definition CreativeIterator.hpp:34
Domain-specific class of objects that can be owned.
Definition Ownable.hpp:81
Attributes with an age that allows to keep track when the attributes had been saved last.
Definition CreativeArrayBase.hpp:32
An interface telling size and dimensionality of a dataset, a refcounted version of DynamicSize.
Definition field/DynamicSize.hpp:500
Ageable & touch() noexcept
age_t update(age_t age) noexcept
static constexpr const Ageable & InfinitelyOld() noexcept
void addInterface(const RefPtr< InterfaceBase > &I) const
MemSizeConfig< sizeof(void *)>::memsize_t memsize_t
void setSizeInterface(const RefPtr< CreativeArrayBase > &CAB, const MultiIndex< N > &FragmentSize)
Set the size interface to a CreativeArrayBase.
Definition CreativeArrayBase.hpp:285
void setSizeInterface(CreativeArrayBase &CAB, const MultiIndex< N > &FragmentSize)
Set the size interface to a CreativeArrayBase.
Definition CreativeArrayBase.hpp:297
bool getDimensions(MultiIndex< N > &MI, const RefPtr< CreativeArrayBase > &CAB)
Get the dimensions of CreativeArrayBase, if the rank is already known.
Definition CreativeArrayBase.hpp:373
index_t getNumberOfElements(CreativeArrayBase &CAB)
Get the number of elements of a CreativeArrayBase if a SizeInterface is available.
Definition CreativeArrayBase.hpp:359
int getRank(const RefPtr< CreativeArrayBase > &CAB)
Get the rank of a CreativeArrayBase.
Definition CreativeArrayBase.hpp:306
RefPtr< SizeInterface > getSize(const RefPtr< CreativeArrayBase > &CAB)
Get the size interface of a CreativeArrayBase.
Definition CreativeArrayBase.hpp:329
index_t getNumberOfElements(const RefPtr< CreativeArrayBase > &CAB)
Get the number of elements of a CreativeArrayBase if a SizeInterface is available.
Definition CreativeArrayBase.hpp:346
point operator-(const point &P, const vector &v)
Given a fragmented field of curvilinear coordinates, (3D array of coordinates), build a uniform Grid ...
Definition FAQ.dox:2
VAcceptInfoList_t operator+(VAcceptInfoList_t &&l, VAcceptInfoList_t &&r)
This class will be "injected" into the owning class, which means the Field class will be derived from...
Definition CreativeArrayBase.hpp:55
Definition FiberTypeIndex.hpp:12