29 #include "mdal_data_model.hpp"
30 #include "mdal_memory_data_model.hpp"
31 #include "mdal_datetime.hpp"
34 #define MDAL_UNUSED(x) (void)x;
35 #define MDAL_NAN std::numeric_limits<double>::quiet_NaN()
38 #define M_PI 3.14159265358979323846264338327
44 std::string getEnvVar(
const std::string &varname,
const std::string &defaultVal = std::string() );
47 bool isNativeLittleEndian();
50 inline bool equals(
double val1,
double val2,
double eps = std::numeric_limits<double>::epsilon() )
52 return fabs( val1 - val2 ) < eps;
56 double safeValue(
double val,
double nodata,
double eps = std::numeric_limits<double>::epsilon() );
59 bool openInputFile( std::ifstream &inputFileStream,
const std::string &fileName, std::ifstream::openmode mode = std::ifstream::binary );
61 std::ifstream openInputFile(
const std::string &fileName, std::ios_base::openmode mode = std::ifstream::in );
64 std::ofstream openOutputFile(
const std::string &fileName, std::ios_base::openmode mode = std::ios_base::in );
67 bool fileExists(
const std::string &filename );
68 std::string baseName(
const std::string &filename,
bool keepExtension =
false );
69 std::string fileExtension(
const std::string &path );
70 std::string dirName(
const std::string &filename );
71 std::string pathJoin(
const std::string &path1,
const std::string &path2 );
72 std::string readFileToString(
const std::string &filename );
75 enum ContainsBehaviour
81 bool startsWith(
const std::string &str,
const std::string &substr, ContainsBehaviour behaviour = CaseSensitive );
82 bool endsWith(
const std::string &str,
const std::string &substr, ContainsBehaviour behaviour = CaseSensitive );
83 bool contains(
const std::string &str,
const std::string &substr, ContainsBehaviour behaviour = CaseSensitive );
84 bool contains(
const std::vector<std::string> &list,
const std::string &str );
85 std::string replace(
const std::string &str,
const std::string &substr,
const std::string &replacestr, ContainsBehaviour behaviour = CaseSensitive );
86 std::string removeFrom(
const std::string &str,
const std::string &substr );
89 std::string leftJustified(
const std::string &str,
size_t width,
char fill =
' ' );
91 std::string toLower(
const std::string &std );
94 bool getHeaderLine( std::ifstream &stream, std::string &line );
97 size_t toSizeT(
const std::string &str );
98 size_t toSizeT(
const char &str );
99 size_t toSizeT(
const double value );
100 int toInt(
const std::string &str );
101 int toInt(
const size_t value );
102 double toDouble(
const std::string &str );
103 double toDouble(
const size_t value );
104 bool toBool(
const std::string &str );
109 std::string coordinateToString(
double coordinate,
int precision = 2 );
113 std::string doubleToString(
double value,
int precision = 6 );
119 std::vector<std::string> split(
const std::string &str,
const char delimiter );
122 std::vector<std::string> split(
const std::string &str,
const std::string &delimiter );
124 std::string join(
const std::vector<std::string> parts,
const std::string &delimiter );
128 const std::string &s,
129 const std::string &delimiters =
" \f\n\r\t\v" );
133 const std::string &s,
134 const std::string &delimiters =
" \f\n\r\t\v" );
138 const std::string &s,
139 const std::string &delimiters =
" \f\n\r\t\v" );
142 BBox computeExtent(
const Vertices &vertices );
146 double parseTimeUnits(
const std::string &units );
148 std::string getCurrentTimeStamp();
151 void combineStatistics( Statistics &main,
const Statistics &other );
154 Statistics calculateStatistics( std::shared_ptr<DatasetGroup> grp );
155 Statistics calculateStatistics( DatasetGroup *grp );
158 Statistics calculateStatistics( std::shared_ptr<Dataset> dataset );
162 void addBedElevationDatasetGroup(
MDAL::Mesh *mesh,
const Vertices &vertices );
164 void addFaceScalarDatasetGroup(
MDAL::Mesh *mesh,
const std::vector<double> &values,
const std::string &name );
166 void addVertexScalarDatasetGroup(
MDAL::Mesh *mesh,
const std::vector<double> &values,
const std::string &name );
168 void addEdgeScalarDatasetGroup(
MDAL::Mesh *mesh,
const std::vector<double> &values,
const std::string &name );
172 bool readValue( T &value, std::ifstream &in,
bool changeEndianness =
false )
174 char *
const p =
reinterpret_cast<char *
>( &value );
176 if ( !in.read( p,
sizeof( T ) ) )
179 if ( changeEndianness )
180 std::reverse( p, p +
sizeof( T ) );
187 void writeValue( T &value, std::ofstream &out,
bool changeEndianness =
false )
190 char *
const p =
reinterpret_cast<char *
>( &v );
192 if ( changeEndianness )
193 std::reverse( p, p +
sizeof( T ) );
195 out.write( p,
sizeof( T ) );
199 std::string prependZero(
const std::string &str,
size_t length );
201 RelativeTimestamp::Unit parseDurationTimeUnit(
const std::string &timeUnit );
205 RelativeTimestamp::Unit parseCFTimeUnit( std::string timeInformation );
209 MDAL::DateTime parseCFReferenceTime(
const std::string &timeInformation,
const std::string &calendarString );
216 void parseDriverAndMeshFromUri(
const std::string &uri, std::string &driver, std::string &meshFile, std::string &meshName );
221 void parseDriverFromUri(
const std::string &uri, std::string &driver );
226 void parseMeshFileFromUri(
const std::string &uri, std::string &meshFile );
238 std::string buildMeshUri(
const std::string &meshFile,
const std::string &meshName,
const std::string &driver );
243 std::string buildAndMergeMeshUris(
const std::string &meshfile,
const std::vector<std::string> &meshNames,
const std::string &driver =
"" );
247 Error( MDAL_Status status, std::string message, std::string driverName =
"" );
248 void setDriver( std::string d );
259 Library( std::string libraryFile );
274 template<
typename T,
typename ... Ts>
275 std::function<T( Ts ... args )>
getSymbol(
const std::string &symbolName )
278 return std::function<T( Ts ... args )>();
280 FARPROC proc = GetProcAddress( d->mLibrary, symbolName.c_str() );
283 return std::function<T( Ts ... args )>();
285 std::function<T( Ts ... args )> symbol =
reinterpret_cast<T( * )( Ts ... args )
>( proc );
287 std::function<T( Ts ... args )> symbol =
288 reinterpret_cast<T( * )( Ts ... args )
>( dlsym( d->mLibrary, symbolName.c_str() ) );
290 #if (defined(__APPLE__) && defined(__MACH__))
295 if ( symbol ==
nullptr )
297 char withUnder[256] = {};
298 snprintf( withUnder,
sizeof( withUnder ),
"_%s", symbolName.c_str() );
299 std::function<T( Ts ... args )> symbol =
reinterpret_cast<T( * )( Ts ... args )
>( dlsym( d->mLibrary, withUnder ) );
311 HINSTANCE mLibrary =
nullptr;
313 void *mLibrary =
nullptr;
315 mutable int mRef = 0;
316 std::string mLibraryFile;
Definition: mdal_datetime.hpp:48
Class to handle dynamic library. The loaded library is implicity shared when copying this object.
Definition: mdal_utils.hpp:256
bool isValid()
Returns whether the library is valid after loading the file if needed.
Definition: mdal_utils.cpp:1062
static std::vector< std::string > libraryFilesInDir(const std::string &dirPath)
Returns a list of library file in the folder dirPath.
Definition: mdal_utils.cpp:1070
std::function< T(Ts ... args)> getSymbol(const std::string &symbolName)
Returns a function from a symbol name.
Definition: mdal_utils.hpp:275
Library(std::string libraryFile)
Creater a instance from a library file.
Definition: mdal_utils.cpp:1029
Definition: mdal_data_model.hpp:238
Definition: mdal_utils.hpp:246