MDAL
mdal_dynamic_driver.hpp
1 /*
2  MDAL - Mesh Data Abstraction Library (MIT License)
3  Copyright (C) 2020 Vincent Cloarec (vcloarec at gmail dot com)
4 */
5 
6 
7 #ifndef MDAL_DYNAMIC_DRIVER_H
8 #define MDAL_DYNAMIC_DRIVER_H
9 
10 #include "mdal_driver.hpp"
11 #include "mdal_utils.hpp"
12 #include "mdal.h"
13 
14 #include <functional>
15 #include <set>
16 
17 namespace MDAL
18 {
19  class DriverDynamic: public Driver
20  {
21 
22  public:
23  ~DriverDynamic() = default;
24 
25  Driver *create() override;
26  bool canReadMesh( const std::string &uri ) override;
27  std::unique_ptr<Mesh> load( const std::string &uri, const std::string &meshName ) override;
28 
30  static Driver *create( const std::string &libFile );
31 
32  private:
33 
34  DriverDynamic( const std::string &name,
35  const std::string &longName,
36  const std::string &filters,
37  int capabilityFlags,
38  int maxVertexPerFace,
39  const Library &lib );
40 
41  bool loadSymbols();
42  Library mLibrary;
43  int mCapabilityFlags = 0;
44  int mMaxVertexPerFace = std::numeric_limits<int>::max();
45 
46  std::set<int> mMeshIds;
47 
48  //************************************
49  std::function<bool ( const char * )> mCanReadMeshFunction;
50  std::function<int ( const char *, const char * )> mOpenMeshFunction;
51  };
52 
53  class MeshDynamicDriver;
54 
56  {
57  public:
58  MeshVertexIteratorDynamicDriver( const Library &library, int meshId );
59 
60  size_t next( size_t vertexCount, double *coordinates ) override;
61  private:
62  Library mLibrary;
63  int mMeshId;
64  int mPosition = 0;
65 
66  //************************************
67  std::function<int ( int, int, int, double * )> mVerticesFunction;
68  };
69 
71  {
72  public:
73  MeshFaceIteratorDynamicDriver( const Library &library, int meshId );
74 
75  size_t next( size_t faceOffsetsBufferLen,
76  int *faceOffsetsBuffer,
77  size_t vertexIndicesBufferLen,
78  int *vertexIndicesBuffer ) override;
79  private:
80  Library mLibrary;
81  int mMeshId;
82  int mPosition = 0;
83 
84  //************************************
85  std::function<int ( int, int, int, int *, int, int * )> mFacesFunction;
86  };
87 
89  {
90  public:
91  MeshEdgeIteratorDynamicDriver( const Library &library, int meshId );
92 
93  size_t next( size_t edgeCount,
94  int *startVertexIndices,
95  int *endVertexIndices );
96  private:
97  Library mLibrary;
98  int mMeshId;
99  int mPosition = 0;
100 
101  //************************************
102  std::function<int ( int, int, int, int *, int * )> mEdgesFunction;
103  };
104 
105 
107  {
108  public:
109  DatasetDynamicDriver( int meshId,
110  int groupIndex,
111  int datasetIndex,
112  const Library &library );
113  virtual ~DatasetDynamicDriver();
114 
115  virtual bool loadSymbol();
116 
118  void unloadData();
119 
120  protected:
121  int mMeshId = -1;
122  int mGroupIndex = -1;
123  int mDatasetIndex = -1;
124  Library mLibrary;
125 
126  //************************************
127  std::function<int ( int, int, int, int, int, double * )> mDataFunction;
128  std::function<void( int, int, int )> mUnloadFunction;
129  };
130 
132  {
133  public:
134  DatasetDynamicDriver2D( DatasetGroup *parentGroup,
135  int meshId,
136  int groupIndex,
137  int datasetIndex,
138  const Library &library );
139  ~DatasetDynamicDriver2D() override;
140 
141  bool loadSymbol() override;
142 
143  size_t scalarData( size_t indexStart, size_t count, double *buffer ) override;
144  size_t vectorData( size_t indexStart, size_t count, double *buffer ) override;
145  size_t activeData( size_t indexStart, size_t count, int *buffer ) override;
146 
147  private:
148 
149  std::function<int ( int, int, int, int, int, int * )> mActiveFlagsFunction;
150  };
151 
153  {
154  public:
155  DatasetDynamicDriver3D( DatasetGroup *parentGroup,
156  int meshId,
157  int groupIndex,
158  int datasetIndex,
159  size_t volumes,
160  size_t maxVerticalLevelCount,
161  const Library &library );
162  ~DatasetDynamicDriver3D() override;
163  bool loadSymbol() override;
164 
165  size_t verticalLevelCountData( size_t indexStart, size_t count, int *buffer ) override;
166  size_t verticalLevelData( size_t indexStart, size_t count, double *buffer ) override;
167  size_t faceToVolumeData( size_t indexStart, size_t count, int *buffer ) override;
168  size_t scalarVolumesData( size_t indexStart, size_t count, double *buffer ) override;
169  size_t vectorVolumesData( size_t indexStart, size_t count, double *buffer ) override;
170 
171  private:
172 
173  std::function<int ( int, int, int, int, int, int * )> mVerticalLevelCountDataFunction;
174  std::function<int ( int, int, int, int, int, double * )> mVerticalLevelDataFunction;
175  std::function<int ( int, int, int, int, int, int * )> mFaceToVolumeDataFunction;
176 
177  };
178 
179  class MeshDynamicDriver: public Mesh
180  {
181  public:
182  MeshDynamicDriver( const std::string &driverName,
183  size_t faceVerticesMaximumCount,
184  const std::string &uri,
185  const Library &library,
186  int meshId );
188 
189  std::unique_ptr<MeshVertexIterator> readVertices() override;
190  std::unique_ptr<MeshEdgeIterator> readEdges() override;
191  std::unique_ptr<MeshFaceIterator> readFaces() override;
192  size_t verticesCount() const override;
193  size_t edgesCount() const override;
194  size_t facesCount() const override;
195  BBox extent() const override;
196 
198  void setProjection();
199 
200  bool populateDatasetGroups();
201 
203  bool loadSymbol();
204 
205  private:
206  Library mLibrary;
207  int mId = -1;
208 
209  //************************************
210  std::function<int ( int )> mMeshVertexCountFunction;
211  std::function<int ( int )> mMeshFaceCountFunction;
212  std::function<int ( int )> mMeshEdgeCountFunction;
213  std::function<void ( int, double *, double *, double *, double * )> mMeshExtentFunction;
214  std::function<const char *( int )> mMeshProjectionFunction;
215  std::function<int ( int )> mMeshDatasetGroupsCountFunction;
216 
217  std::function<const char *( int, int )> mDatasetgroupNameFunction;
218  std::function<const char *( int, int )> mDatasetGroupReferencetimeFunction;
219  std::function<int ( int, int )> mDatasetGroupMetadataCountFunction;
220  std::function<const char *( int, int, int )> mDatasetGroupMetadataKeyFunction;
221  std::function<const char *( int, int, int )> mDatasetGroupMetadataValueFunction;
222  std::function < bool ( int, int, bool *, int *, int * )> mDatasetDescriptionFunction;
223  std::function < double( int, int, int, bool * )> mDatasetTimeFunction;
224  std::function<bool ( int, int, int )> mDatasetSupportActiveFlagFunction;
225  std::function<int ( int, int, int )> mDataset3DMaximumVerticalLevelCount;
226  std::function<int ( int, int, int )> mDataset3DVolumeCount;
227 
228  std::function<void ( int )> mCloseMeshFunction;
229  };
230 }
231 
232 
233 #endif // MDAL_DYNAMIC_DRIVER_H
Definition: mdal_data_model.hpp:97
Definition: mdal_data_model.hpp:113
Definition: mdal_dynamic_driver.hpp:132
size_t activeData(size_t indexStart, size_t count, int *buffer) override
For drivers that supports it, see supportsActiveFlag()
Definition: mdal_dynamic_driver.cpp:516
size_t vectorData(size_t indexStart, size_t count, double *buffer) override
For DataOnVertices or DataOnFaces.
Definition: mdal_dynamic_driver.cpp:508
size_t scalarData(size_t indexStart, size_t count, double *buffer) override
For DataOnVertices or DataOnFaces.
Definition: mdal_dynamic_driver.cpp:500
Definition: mdal_dynamic_driver.hpp:153
size_t scalarVolumesData(size_t indexStart, size_t count, double *buffer) override
For DataOnVolumes.
Definition: mdal_dynamic_driver.cpp:483
size_t vectorVolumesData(size_t indexStart, size_t count, double *buffer) override
For DataOnVolumes.
Definition: mdal_dynamic_driver.cpp:491
size_t faceToVolumeData(size_t indexStart, size_t count, int *buffer) override
For DataOnVolumes.
Definition: mdal_dynamic_driver.cpp:475
size_t verticalLevelData(size_t indexStart, size_t count, double *buffer) override
For DataOnVolumes.
Definition: mdal_dynamic_driver.cpp:467
size_t verticalLevelCountData(size_t indexStart, size_t count, int *buffer) override
For DataOnVolumes.
Definition: mdal_dynamic_driver.cpp:459
Definition: mdal_dynamic_driver.hpp:107
void unloadData()
Removes stored data in memory (for drivers that support lazy loading)
Definition: mdal_dynamic_driver.cpp:580
Definition: mdal_data_model.hpp:137
Definition: mdal_dynamic_driver.hpp:20
Definition: mdal_driver.hpp:28
Class to handle dynamic library. The loaded library is implicity shared when copying this object.
Definition: mdal_utils.hpp:256
Definition: mdal_dynamic_driver.hpp:180
void setProjection()
Set the projection from the source.
Definition: mdal_dynamic_driver.cpp:178
bool loadSymbol()
Returns whether all the symbols have been loaded.
Definition: mdal_dynamic_driver.cpp:298
Definition: mdal_dynamic_driver.hpp:89
Definition: mdal_data_model.hpp:217
Definition: mdal_dynamic_driver.hpp:71
Definition: mdal_data_model.hpp:227
Definition: mdal_dynamic_driver.hpp:56
Definition: mdal_data_model.hpp:209
Definition: mdal_data_model.hpp:238
Definition: mdal_data_model.hpp:24