1 /***************************************************************************
2                          qgscoordinatetransformcontext_p.h
3                          -------------------------------
4     begin                : November 2017
5     copyright            : (C) 2017 by Nyall Dawson
6     email                : nyall dot dawson at gmail dot com
7  ***************************************************************************/
8 
9 /***************************************************************************
10  *                                                                         *
11  *   This program is free software; you can redistribute it and/or modify  *
12  *   it under the terms of the GNU General Public License as published by  *
13  *   the Free Software Foundation; either version 2 of the License, or     *
14  *   (at your option) any later version.                                   *
15  *                                                                         *
16  ***************************************************************************/
17 
18 #ifndef QGSCOORDINATETRANSFORMCONTEXT_PRIVATE_H
19 #define QGSCOORDINATETRANSFORMCONTEXT_PRIVATE_H
20 
21 /// @cond PRIVATE
22 
23 //
24 //  W A R N I N G
25 //  -------------
26 //
27 // This file is not part of the QGIS API.  It exists purely as an
28 // implementation detail.  This header file may change from version to
29 // version without notice, or even be removed.
30 //
31 
32 /***************************************************************************
33  * This class is considered CRITICAL and any change MUST be accompanied with
34  * full unit tests in testqgsfeature.cpp.
35  * See details in QEP #17
36  ****************************************************************************/
37 
38 #define SIP_NO_FILE
39 
40 #include "qgscoordinatereferencesystem.h"
41 #include "qgsdatumtransform.h"
42 
43 class QgsCoordinateTransformContextPrivate : public QSharedData
44 {
45 
46   public:
47 
48     QgsCoordinateTransformContextPrivate() = default;
49 
QgsCoordinateTransformContextPrivate(const QgsCoordinateTransformContextPrivate & other)50     QgsCoordinateTransformContextPrivate( const QgsCoordinateTransformContextPrivate &other )
51       : QSharedData( other )
52     {
53       other.mLock.lockForRead();
54       mSourceDestDatumTransforms = other.mSourceDestDatumTransforms;
55       other.mLock.unlock();
56     }
57 
58     /**
59      * Mapping for coordinate operation Proj string to use for source/destination CRS pairs.
60      */
61     class OperationDetails
62     {
63       public:
64         QString operation;
65         bool allowFallback = true;
66 
67         // TODO c++20 - replace with = default
68         bool operator==( const OperationDetails &other ) const
69         {
70           return operation == other.operation && allowFallback == other.allowFallback;
71         }
72     };
73     QMap< QPair< QgsCoordinateReferenceSystem, QgsCoordinateReferenceSystem >, OperationDetails > mSourceDestDatumTransforms;
74 
75     //! Mutex for making QgsCoordinateTransformContextPrivate thread safe
76     mutable QReadWriteLock mLock{};
77 
78   private:
79     QgsCoordinateTransformContextPrivate &operator= ( const QgsCoordinateTransformContextPrivate & ) = delete;
80 };
81 
82 
83 /// @endcond
84 
85 
86 #endif // QGSCOORDINATETRANSFORMCONTEXT_PRIVATE_H
87 
88 
89 
90 
91