34 #include <type_traits> 40 #include "qgis_core.h" 49 int QgisEvent = QEvent::User + 1;
107 ARGB32_Premultiplied = 13
171 #define cast_to_fptr(f) f 193 , mPreviousState( object->blockSignals( true ) )
198 mObject->blockSignals( mPreviousState );
206 Object *mObject =
nullptr;
231 CORE_EXPORT uint
qHash(
const QVariant &variant );
242 QString str = QString::number( a,
'f',
precision );
243 if ( str.contains( QLatin1Char(
'.' ) ) )
246 int idx = str.length() - 1;
247 while ( str.at( idx ) ==
'0' && idx > 1 )
251 if ( idx < str.length() - 1 )
252 str.truncate( str.at( idx ) ==
'.' ? idx : idx + 1 );
260 const QString str( QString::number( a,
'f',
precision ) );
261 if ( str == QLatin1String(
"-0" ) )
263 return QLatin1String(
"0" );
278 inline bool qgsDoubleNear(
double a,
double b,
double epsilon = 4 * std::numeric_limits<double>::epsilon() )
280 const double diff = a - b;
281 return diff > -epsilon && diff <= epsilon;
290 inline bool qgsFloatNear(
float a,
float b,
float epsilon = 4 * FLT_EPSILON )
292 const float diff = a - b;
293 return diff > -epsilon && diff <= epsilon;
305 double ar = std::frexp( a, &aexp );
306 double br = std::frexp( b, &bexp );
308 return aexp == bexp &&
309 std::round( ar * std::pow( 10.0, significantDigits ) ) == std::round( br * std::pow( 10.0, significantDigits ) );
317 inline double qgsRound(
double number,
int places )
319 double m = ( number < 0.0 ) ? -1.0 : 1.0;
320 double scaleFactor = std::pow( 10.0, places );
321 return ( std::round( number * m * scaleFactor ) / scaleFactor ) * m;
350 template <
typename T>
struct QgsAddConst {
typedef const T Type; };
352 template <
typename T>
353 constexpr
typename QgsAddConst<T>::Type &as_const( T &t ) noexcept {
return t; }
355 template <
typename T>
356 void as_const(
const T && ) =
delete;
360 template<
class T>
struct _Unique_if
362 typedef std::unique_ptr<T> _Single_object;
365 template<
class T>
struct _Unique_if<T[]>
367 typedef std::unique_ptr<T[]> _Unknown_bound;
370 template<
class T,
size_t N>
struct _Unique_if<T[N]>
372 typedef void _Known_bound;
375 template<
class T,
class... Args>
376 typename _Unique_if<T>::_Single_object
377 make_unique( Args &&... args )
379 return std::unique_ptr<T>(
new T( std::forward<Args>( args )... ) );
383 typename _Unique_if<T>::_Unknown_bound
384 make_unique(
size_t n )
386 typedef typename std::remove_extent<T>::type U;
387 return std::unique_ptr<T>(
new U[n]() );
390 template<
class T,
class... Args>
391 typename _Unique_if<T>::_Known_bound
392 make_unique( Args &&... ) =
delete;
406 template<
typename... Args>
struct overload
408 template<
typename C,
typename R>
409 static constexpr
auto of( R( C::*pmf )( Args... ) ) -> decltype( pmf )
425 QMetaEnum metaEnum = QMetaEnum::fromType<T>();
426 Q_ASSERT( metaEnum.isValid() );
427 QMap<T, QString> enumMap;
428 for (
int idx = 0; idx < metaEnum.keyCount(); ++idx )
430 const char *enumKey = metaEnum.key( idx );
431 enumMap.insert( static_cast<T>( metaEnum.keyToValue( enumKey ) ), QString( enumKey ) );
487 CORE_EXPORT
bool qgsVariantEqual(
const QVariant &lhs,
const QVariant &rhs );
504 CORE_EXPORT QString
qgsVsiPrefix(
const QString &path );
532 extern CORE_EXPORT
const QString
GEOWKT;
536 extern CORE_EXPORT
const QString
GEOPROJ4;
552 extern CORE_EXPORT
const QString
GEO_NONE;
569 const int PREVIEW_JOB_DELAY_MS = 250;
572 const int MAXIMUM_LAYER_PREVIEW_TIME_MS = 250;
589 #if (__GNUC__ > 4 || (__GNUC__ == 4 && __GNUC_MINOR__ >= 6)) || defined(__clang__) 591 #define Q_NOWARN_DEPRECATED_PUSH \ 592 _Pragma("GCC diagnostic push") \ 593 _Pragma("GCC diagnostic ignored \"-Wdeprecated-declarations\""); 594 #define Q_NOWARN_DEPRECATED_POP \ 595 _Pragma("GCC diagnostic pop"); 596 #define Q_NOWARN_UNREACHABLE_PUSH 597 #define Q_NOWARN_UNREACHABLE_POP 599 #elif defined(_MSC_VER) 601 #define Q_NOWARN_DEPRECATED_PUSH \ 602 __pragma(warning(push)) \ 603 __pragma(warning(disable:4996)) 604 #define Q_NOWARN_DEPRECATED_POP \ 605 __pragma(warning(pop)) 606 #define Q_NOWARN_UNREACHABLE_PUSH \ 607 __pragma(warning(push)) \ 608 __pragma(warning(disable:4702)) 609 #define Q_NOWARN_UNREACHABLE_POP \ 610 __pragma(warning(pop)) 614 #define Q_NOWARN_DEPRECATED_PUSH 615 #define Q_NOWARN_DEPRECATED_POP 616 #define Q_NOWARN_UNREACHABLE_PUSH 617 #define Q_NOWARN_UNREACHABLE_POP 624 # define QGISEXTERN extern "C" __declspec( dllexport ) 627 # pragma warning(disable:4190) 630 # if defined(__GNUC__) || defined(__clang__) 631 # define QGISEXTERN extern "C" __attribute__ ((visibility ("default"))) 633 # define QGISEXTERN extern "C" 639 #if __cplusplus >= 201500 640 #define FALLTHROUGH [[fallthrough]]; 641 #elif defined(__clang__) 642 #define FALLTHROUGH [[clang::fallthrough]]; 643 #elif defined(__GNUC__) && __GNUC__ >= 7 644 #define FALLTHROUGH [[gnu::fallthrough]]; 650 #if __cplusplus >= 201703L 651 #define NODISCARD [[nodiscard]] 652 #elif defined(__clang__) 653 #define NODISCARD [[nodiscard]] 654 #elif defined(_MSC_VER) 655 #define NODISCARD // no support 656 #elif defined(__has_cpp_attribute) 657 #if __has_cpp_attribute(nodiscard) 658 #define NODISCARD [[nodiscard]] 659 #elif __has_cpp_attribute(gnu::warn_unused_result) 660 #define NODISCARD [[gnu::warn_unused_result]] 662 #define NODISCARD Q_REQUIRED_RESULT 665 #define NODISCARD Q_REQUIRED_RESULT 668 #if __cplusplus >= 201703L 669 #define MAYBE_UNUSED [[maybe_unused]] 670 #elif defined(__clang__) 671 #define MAYBE_UNUSED [[maybe_unused]] 672 #elif defined(_MSC_VER) 673 #define MAYBE_UNUSED // no support 674 #elif defined(__has_cpp_attribute) 675 #if __has_cpp_attribute(gnu::unused) 676 #define MAYBE_UNUSED [[gnu::unused]] CORE_EXPORT QString qgsVsiPrefix(const QString &path)
static const QString QGIS_VERSION
Version string.
static const char * QGIS_DEV_VERSION
The development version.
static const double UI_SCALE_FACTOR
UI scaling factor.
bool qgsFloatNear(float a, float b, float epsilon=4 *FLT_EPSILON)
Compare two floats (but allow some difference)
CORE_EXPORT bool qgsVariantEqual(const QVariant &lhs, const QVariant &rhs)
Compares two QVariant values and returns whether they are equal, NULL values are treated as equal...
bool qgsDoubleNear(double a, double b, double epsilon=4 *std::numeric_limits< double >::epsilon())
Compare two doubles (but allow some difference)
DataType
Raster data types.
UnitType
Type of unit of tolerance value from settings.
static const QColor DEFAULT_HIGHLIGHT_COLOR
Default highlight color.
void CORE_EXPORT * qgsCalloc(size_t nmemb, size_t size)
Allocates memory for an array of nmemb elements of size bytes each and returns a pointer to the alloc...
MessageLevel
Level for messages This will be used both for message log and message bar in application.
static const int QGIS_VERSION_INT
Version number used for comparing versions using the "Check QGIS Version" function.
QMap< QString, QString > QgsStringMap
The Qgis class provides global constants for use throughout the application.
CORE_EXPORT bool qgsVariantLessThan(const QVariant &lhs, const QVariant &rhs)
Compares two QVariant values and returns whether the first is less than the second.
static const double DEFAULT_Z_COORDINATE
Default Z coordinate value for 2.5d geometry This value have to be assigned to the Z coordinate for t...
CORE_EXPORT bool qMapLessThanKey< QVariantList >(const QVariantList &key1, const QVariantList &key2)
Compares two QVariantList values and returns whether the first is less than the second.
QgsSignalBlocker(Object *object)
Constructor for QgsSignalBlocker.
static const double DEFAULT_SNAP_TOLERANCE
Default snapping distance tolerance.
CORE_EXPORT const QString GEO_NONE
Constant that holds the string representation for "No ellips/No CRS".
const double DEFAULT_SEGMENT_EPSILON
Default snapping tolerance for segments.
QString qgsDoubleToString(double a, int precision=17)
Returns a string representation of a double.
const long GEOCRS_ID
Magic number for a geographic coord sys in QGIS srs.db tbl_srs.srs_id.
static const double DEFAULT_SEARCH_RADIUS_MM
Identify search radius in mm.
CORE_EXPORT double qgsPermissiveToDouble(QString string, bool &ok)
Converts a string to a double in a permissive way, e.g., allowing for incorrect numbers of digits bet...
CORE_EXPORT const QString GEOPROJ4
PROJ4 string that represents a geographic coord sys.
RAII signal blocking class.
static const QgsTolerance::UnitType DEFAULT_SNAP_UNITS
Default snapping distance units.
void CORE_EXPORT qgsFree(void *ptr)
Frees the memory space pointed to by ptr.
CORE_EXPORT qlonglong qgsPermissiveToLongLong(QString string, bool &ok)
Converts a string to an qlonglong in a permissive way, e.g., allowing for incorrect numbers of digits...
unsigned long long qgssize
Qgssize is used instead of size_t, because size_t is stdlib type, unknown by SIP, and it would be har...
const double DEFAULT_POINT_SIZE
Magic number that determines the default point size for point symbols.
static const float DEFAULT_MAPTOPIXEL_THRESHOLD
Default threshold between map coordinates and device coordinates for map2pixel simplification.
const int USER_CRS_START_ID
Magick number that determines whether a projection crsid is a system (srs.db) or user (~/...
const QMap< T, QString > qgsEnumMap()
Returns a map of all enum entries.
QgsSignalBlocker< Object > whileBlocking(Object *object)
Temporarily blocks signals from a QObject while calling a single method from the object.
const long GEOSRID
Magic number for a geographic coord sys in POSTGIS SRID.
static const QString QGIS_RELEASE_NAME
Release name.
double qgsRound(double number, int places)
Returns a double number, rounded (as close as possible) to the specified number of places...
bool qgsDoubleNearSig(double a, double b, int significantDigits=10)
Compare two doubles using specified number of significant digits.
const double DEFAULT_LINE_WIDTH
CORE_EXPORT const QString PROJECT_SCALES
CORE_EXPORT uint qHash(const QVariant &variant)
Hash for QVariant.
static const double DEFAULT_HIGHLIGHT_MIN_WIDTH_MM
Default highlight line/stroke minimum width in mm.
static const double DEFAULT_HIGHLIGHT_BUFFER_MM
Default highlight buffer in mm.
CORE_EXPORT int qgsPermissiveToInt(QString string, bool &ok)
Converts a string to an integer in a permissive way, e.g., allowing for incorrect numbers of digits b...
CORE_EXPORT bool qgsVariantGreaterThan(const QVariant &lhs, const QVariant &rhs)
Compares two QVariant values and returns whether the first is greater than the second.
void CORE_EXPORT * qgsMalloc(size_t size)
Allocates size bytes and returns a pointer to the allocated memory.
Object * operator->()
Returns pointer to blocked QObject.
const long GEO_EPSG_CRS_ID
Magic number for a geographic coord sys in EpsgCrsId ID format.
static const double SCALE_PRECISION
Fudge factor used to compare two scales.
CORE_EXPORT const QString GEO_EPSG_CRS_AUTHID
Geographic coord sys from EPSG authority.
CORE_EXPORT const QString GEOWKT
Wkt string that represents a geographic coord sys.