FiberVISH 0.2
Fish - The Fiber Bundle API for the Vish Visualization Shell
RangeBase.hpp
1#ifndef FIBEROPERATIONS_RANGEBASE_HPP
2#define FIBEROPERATIONS_RANGEBASE_HPP 20241206
3
4#include <field/MemBase.hpp>
5#include <grid/Representation.hpp>
6#include <memcore/typemap.hpp>
7#include <memcore/Profiler.hpp>
8
9#include "fiberopDllApi.h"
10
11#ifndef RangeVerbose
12#define RangeVerbose(X) AppVerbose("Range",X)
13#endif
14
15namespace Fiber
16{
17
18#if (__cplusplus == 201703L)
19#define RangeAttributeName "Range"
20#define RangeFragmentsAttributeName "RangeFragments"
21#else
22static constinit auto RangeAttributeName = "Range";
23 [[maybe_unused]] static constinit auto RangeFragmentsAttributeName = "RangeFragments";
24#endif
25
26
27
28
32struct fiberop_API DataRangeBase : public Interface<DataRangeBase>, public MemCore::Ageable
33{
35 {
36 ~NoDataRange() noexcept;
37 const char* what() const noexcept override;
38 };
39
42
45
48
50 virtual ~DataRangeBase() = 0;
51
53 virtual void expandRange(const RefPtr<DataRangeBase>&DRB) = 0;
54
71
72 virtual std::string str() const = 0;
73
74
75 virtual RefPtr<DataRangeBase> getIndexedRange(const RefPtr<MemBase>&ArrayBase, const std::vector<uint32_t>&index_array) const = 0;
76 virtual RefPtr<DataRangeBase> getIndexedRange(const RefPtr<MemBase>&ArrayBase, const std::vector<size_t>&index_array) const = 0;
77
78
79static void clear(CreativeArrayBase&CAB)
80 {
82 CAB.removeAttribute( RangeAttributeName );
83 }
84
85static void clear(Field&F);
86
87static RefPtr<MemCore::ChunkBase> get_range_attribute(const Field&F)
88 {
89 return F.getAttribute( RangeAttributeName );
90 }
91
92static RefPtr<DataRangeBase> get_cached_rangebase_if_older_than_field(const Field&F)
93 {
94 if (RefPtr<DataRangeBase> DR = interface_cast<DataRangeBase>(F) )
95 {
96 if ( !DR->isOlderThan( F ) )
97 return DR;
98 }
99 return nullptr;
100 }
101
102
103static bool need_to_recompute(const Field&F);
104
105
106static void setRangeCompleteness(Field&F, unsigned nFragments, unsigned FragmentsNotUsedForRangeComputation);
107static bool isRangeComplete(Field&F);
108
109 typedef RefPtr<DataRangeBase> compute_range_and_set_attribute_func(CreativeArrayBase&CAB, const RefPtr<MemBase>&ArrayBase);
110 typedef RefPtr<DataRangeBase> get_range_if_older_than_creator_data_func(CreativeArrayBase&CAB);
111
112
113static void computeRangeOnAvailableFragments(Field&F,
114 compute_range_and_set_attribute_func*typed_compute_function,
115 get_range_if_older_than_creator_data_func*range_determinator,
116 bool RequestToLoadMore = false);
117
118};
119
120
141extern fiberop_API RefPtr<DataRangeBase>
142 getFragmentRange(CreativeArrayBase&CAB, bool AsynchRequest=false, bool theAvoidDataLoading = false, const RefPtr<MemBase>&PossibleData = nullptr);
143
144
160inline RefPtr<DataRangeBase>
162{
163 if (RefPtr<CreativeArrayBase> CAB = F.getCreator(f))
165
166 return nullptr;
167}
168
169
171
172
173
174extern fiberop_API RefPtr<DataRangeBase>
175 getFieldRange_internal(Field&F, std::string&ErrorMessage, bool AsynchRequest=false, bool theAvoidDataLoading = false)
176 ;
177
178
185inline RefPtr<DataRangeBase>
186 getFieldRange(Field&F, std::string&ErrorMessage, bool AsynchRequest=false, bool theAvoidDataLoading = false)
187 PERFORMANCE_WARNING_2(" data may be needed to be loaded from disc during this function call. Use getQuickFieldRange() to avoid this warning and data loading.")
188 ;
189
190inline RefPtr<DataRangeBase>
191 getFieldRange(Field&F, std::string&ErrorMessage, bool AsynchRequest, bool theAvoidDataLoading)
192{
194}
195
196
201inline RefPtr<DataRangeBase>
202getQuickFieldRange(Field&F, std::string&ErrorMessage, bool AsynchRequest=false)
203{
204 return getFieldRange_internal(F, ErrorMessage, AsynchRequest, true);
205}
206
213inline RefPtr<DataRangeBase> getFieldRange(Field& F, bool AsynchRequest = false, bool theAvoidDataLoading = false)
214 PERFORMANCE_WARNING_1();
215
221
222inline RefPtr<DataRangeBase> getFieldRange(const RefPtr<Field>& F, bool AsynchRequest = false, bool theAvoidDataLoading = false)
223{
224 if (!F) return nullptr;
225
226std::string ErrorMessage;
227 return getFieldRange(*F, ErrorMessage, AsynchRequest, theAvoidDataLoading);
228}
229
230
231
232
233} // namespace Fiber
234
235namespace std
236{
237fiberop_API string to_string(const Fiber::DataRangeBase& a);
238}
239
240#endif // FIBEROPERATIONS_RANGEBASE_HPP
basic_string< char > string
Base class for multidimensional arrays that employ deferred storage, i.e.
Definition CreativeArrayBase.hpp:75
An iterator with an optional DataCreator, which is just a class to intercept creation of data along a...
Definition CreativeIterator.hpp:34
A Field is a collection of CreativeArrayBase reference pointers which are accessed via FragmentID obj...
Definition Field.hpp:245
Given a fragmented field of curvilinear coordinates, (3D array of coordinates), build a uniform Grid ...
Definition FAQ.dox:2
RefPtr< DataRangeBase > getFieldRange(Field &F, std::string &ErrorMessage, bool AsynchRequest=false, bool theAvoidDataLoading=false)
Determine and eventually compute the numerical range of a field.
Definition RangeBase.hpp:191
RefPtr< DataRangeBase > getQuickFieldRange(Field &F, std::string &ErrorMessage, bool AsynchRequest=false)
Determine and eventually compute the numerical range of a field without loading data,...
Definition RangeBase.hpp:202
RefPtr< DataRangeBase > getFieldRange_internal(Field &F, string &ErrorMessage, bool AsynchRequest, bool theAvoidDataLoading)
TODO: Go via a type registry.
Definition Range.cpp:54
RefPtr< DataRangeBase > getFragmentRange(CreativeArrayBase &CAB, bool AsynchRequest, bool theAvoidDataLoading, const RefPtr< MemBase > &PossibleData)
TODO: Go via a type registry.
Definition Range.cpp:18
enable_if_callable_t< T, Args... > call(T &&obj, Args &&... args)
std::string to_string(const span< char > &s)
StrongPtr< Object, ObjectBase > RefPtr
STL namespace.
Definition RangeBase.hpp:35
Base class for ranges that can be attached to Creators.
Definition RangeBase.hpp:33
virtual void expandRange(const RefPtr< DataRangeBase > &DRB)=0
Append a given range, if possible. Child class might do type conversions.
virtual RefPtr< DataRangeBase > getFloatRange() const =0
Virtual function to retrieve a general floating-point version of a range which may be any kind of int...