Branch data Line data Source code
1 : : /***************************************************************************
2 : : qgsexpression_p.h
3 : :
4 : : ---------------------
5 : : begin : 9.12.2015
6 : : copyright : (C) 2015 by Matthias Kuhn
7 : : email : matthias@opengis.ch
8 : : ***************************************************************************
9 : : * *
10 : : * This program is free software; you can redistribute it and/or modify *
11 : : * it under the terms of the GNU General Public License as published by *
12 : : * the Free Software Foundation; either version 2 of the License, or *
13 : : * (at your option) any later version. *
14 : : * *
15 : : ***************************************************************************/
16 : :
17 : : #ifndef QGSEXPRESSIONPRIVATE_H
18 : : #define QGSEXPRESSIONPRIVATE_H
19 : :
20 : : #include <QString>
21 : : #include <memory>
22 : :
23 : : #include "qgsexpression.h"
24 : : #include "qgsdistancearea.h"
25 : : #include "qgsunittypes.h"
26 : : #include "qgsexpressionnode.h"
27 : :
28 : : ///@cond
29 : :
30 : : /**
31 : : * This class exists only for implicit sharing of QgsExpression
32 : : * and is not part of the public API.
33 : : * It should be considered an implementation detail.
34 : : */
35 : : class QgsExpressionPrivate
36 : : {
37 : : public:
38 : 78 : QgsExpressionPrivate()
39 : 78 : : ref( 1 )
40 : 78 : {}
41 : :
42 : 0 : QgsExpressionPrivate( const QgsExpressionPrivate &other )
43 : 0 : : ref( 1 )
44 : 0 : , mRootNode( other.mRootNode ? other.mRootNode->clone() : nullptr )
45 : 0 : , mParserErrorString( other.mParserErrorString )
46 : 0 : , mEvalErrorString( other.mEvalErrorString )
47 : 0 : , mParserErrors( other.mParserErrors )
48 : 0 : , mExp( other.mExp )
49 : 0 : , mDaEllipsoid( other.mDaEllipsoid )
50 : 0 : , mCalc( other.mCalc )
51 : 0 : , mDistanceUnit( other.mDistanceUnit )
52 : 0 : , mAreaUnit( other.mAreaUnit )
53 : : {
54 : 0 : if ( other.mDaCrs )
55 : 0 : mDaCrs = std::make_unique<QgsCoordinateReferenceSystem>( *other.mDaCrs.get() );
56 : 0 : if ( other.mDaTransformContext )
57 : 0 : mDaTransformContext = std::make_unique<QgsCoordinateTransformContext>( *other.mDaTransformContext.get() );
58 : 0 : }
59 : :
60 : 62 : ~QgsExpressionPrivate()
61 : : {
62 : 62 : delete mRootNode;
63 : 62 : }
64 : :
65 : : QAtomicInt ref;
66 : :
67 : 78 : QgsExpressionNode *mRootNode = nullptr;
68 : :
69 : : QString mParserErrorString;
70 : : QString mEvalErrorString;
71 : :
72 : : QList<QgsExpression::ParserError> mParserErrors;
73 : :
74 : : QString mExp;
75 : :
76 : : QString mDaEllipsoid;
77 : : std::unique_ptr<QgsCoordinateReferenceSystem> mDaCrs;
78 : : std::unique_ptr<QgsCoordinateTransformContext> mDaTransformContext;
79 : :
80 : : std::shared_ptr<QgsDistanceArea> mCalc;
81 : 78 : QgsUnitTypes::DistanceUnit mDistanceUnit = QgsUnitTypes::DistanceUnknownUnit;
82 : 78 : QgsUnitTypes::AreaUnit mAreaUnit = QgsUnitTypes::AreaUnknownUnit;
83 : :
84 : : //! Whether prepare() has been called before evaluate()
85 : 78 : bool mIsPrepared = false;
86 : :
87 : : QgsExpressionPrivate &operator= ( const QgsExpressionPrivate & ) = delete;
88 : : };
89 : :
90 : :
91 : 0 : struct HelpArg
92 : : {
93 : 0 : HelpArg( const QString &arg, const QString &desc, bool descOnly = false, bool syntaxOnly = false,
94 : : bool optional = false, const QString &defaultVal = QString() )
95 : 0 : : mArg( arg )
96 : 0 : , mDescription( desc )
97 : 0 : , mDescOnly( descOnly )
98 : 0 : , mSyntaxOnly( syntaxOnly )
99 : 0 : , mOptional( optional )
100 : 0 : , mDefaultVal( defaultVal )
101 : 0 : {}
102 : :
103 : : QString mArg;
104 : : QString mDescription;
105 : : bool mDescOnly;
106 : : bool mSyntaxOnly;
107 : : bool mOptional;
108 : : QString mDefaultVal;
109 : : };
110 : :
111 : 0 : struct HelpExample
112 : : {
113 : 0 : HelpExample( const QString &expression, const QString &returns, const QString ¬e = QString() )
114 : 0 : : mExpression( expression )
115 : 0 : , mReturns( returns )
116 : 0 : , mNote( note )
117 : 0 : {}
118 : :
119 : : QString mExpression;
120 : : QString mReturns;
121 : : QString mNote;
122 : : };
123 : :
124 : :
125 : 0 : struct HelpVariant
126 : : {
127 : 0 : HelpVariant( const QString &name, const QString &description,
128 : : const QList<HelpArg> &arguments = QList<HelpArg>(),
129 : : bool variableLenArguments = false,
130 : : const QList<HelpExample> &examples = QList<HelpExample>(),
131 : : const QString ¬es = QString(),
132 : : const QStringList &tags = QStringList() )
133 : 0 : : mName( name )
134 : 0 : , mDescription( description )
135 : 0 : , mArguments( arguments )
136 : 0 : , mVariableLenArguments( variableLenArguments )
137 : 0 : , mExamples( examples )
138 : 0 : , mNotes( notes )
139 : 0 : , mTags( tags )
140 : 0 : {}
141 : :
142 : : QString mName;
143 : : QString mDescription;
144 : : QList<HelpArg> mArguments;
145 : : bool mVariableLenArguments;
146 : : QList<HelpExample> mExamples;
147 : : QString mNotes;
148 : : QStringList mTags;
149 : : };
150 : :
151 : :
152 : 0 : struct Help
153 : : {
154 : : //! Constructor for expression help
155 : 0 : Help() = default;
156 : :
157 : 0 : Help( const QString &name, const QString &type, const QString &description, const QList<HelpVariant> &variants )
158 : 0 : : mName( name )
159 : 0 : , mType( type )
160 : 0 : , mDescription( description )
161 : 0 : , mVariants( variants )
162 : 0 : {}
163 : :
164 : : QString mName;
165 : : QString mType;
166 : : QString mDescription;
167 : : QList<HelpVariant> mVariants;
168 : : };
169 : :
170 : : typedef QHash<QString, Help> HelpTextHash;
171 : :
172 : : HelpTextHash &functionHelpTexts();
173 : :
174 : : ///@endcond
175 : :
176 : : #endif // QGSEXPRESSIONPRIVATE_H
|