@@ -30,78 +30,60 @@ extern QgsExpression::Node* parseExpression( const QString& str, QString& parser
30
30
// /////////////////////////////////////////////
31
31
// three-value logic
32
32
33
- class TVL
33
+ enum TVL
34
34
{
35
- public:
36
- enum Value
37
- {
38
- False,
39
- True,
40
- Unknown
41
- };
42
-
43
- static TVL::Value AND[3 ][3 ];
44
- static TVL::Value OR[3 ][3 ];
45
- static TVL::Value NOT[3 ];
46
-
47
- TVL () : val( Unknown ) {}
48
- TVL ( bool v ) : val( v ? True : False ) {}
49
- TVL ( Value v ) : val( v ) {}
50
-
51
- TVL operator !() { return NOT[val]; }
52
- TVL operator &( const TVL& other ) { return AND[val][other.val ]; }
53
- TVL operator |( const TVL& other ) { return OR[val][other.val ]; }
54
-
55
- // conversion for result
56
- QVariant toVariant ()
57
- {
58
- if ( val == Unknown )
59
- return QVariant ();
60
- else
61
- return ( val == True ? 1 : 0 );
62
- }
63
-
64
- Value val;
35
+ False,
36
+ True,
37
+ Unknown
65
38
};
66
39
67
- // false true unknown
68
- TVL::Value TVL::AND[3 ][3 ] = { { TVL::False, TVL::False, TVL::False }, // false
69
- { TVL::False, TVL::True, TVL::Unknown }, // true
70
- { TVL::False, TVL::Unknown, TVL::Unknown }
71
- };// unknown
40
+ static TVL AND[3 ][3 ] = {
41
+ // false true unknown
42
+ { False, False, False }, // false
43
+ { False, True, Unknown }, // true
44
+ { False, Unknown, Unknown } // unknown
45
+ };
72
46
73
- TVL::Value TVL::OR[3 ][3 ] = { { TVL::False, TVL::True, TVL::Unknown }, // false
74
- { TVL::True, TVL::True, TVL::True }, // true
75
- { TVL::Unknown, TVL::True, TVL::Unknown }
76
- };// unknown
47
+ static TVL OR[3 ][3 ] = {
48
+ { False, True, Unknown }, // false
49
+ { True, True, True }, // true
50
+ { Unknown, True, Unknown } // unknown
51
+ };
77
52
78
- TVL::Value TVL:: NOT[3 ] = { TVL:: True, TVL:: False, TVL:: Unknown };
53
+ static TVL NOT[3 ] = { True, False, Unknown };
79
54
80
- Q_DECLARE_METATYPE ( TVL )
55
+ QVariant tvl2variant ( TVL v )
56
+ {
57
+ switch ( v )
58
+ {
59
+ case False: return 0 ;
60
+ case True: return 1 ;
61
+ case Unknown: return QVariant ();
62
+ }
63
+ }
81
64
82
- #define TVL_True QVariant::fromValue (TVL( true ) )
83
- #define TVL_False QVariant::fromValue (TVL( false ) )
84
- #define TVL_Unknown QVariant::fromValue (TVL() )
65
+ #define TVL_True QVariant ( 1 )
66
+ #define TVL_False QVariant ( 0 )
67
+ #define TVL_Unknown QVariant ( )
85
68
86
69
// /////////////////////////////////////////////
87
70
// QVariant checks and conversions
88
71
89
72
inline bool isIntSafe( const QVariant& v )
90
73
{
91
- if ( v.type () == QVariant::Int || v. canConvert <TVL>() ) return true ;
74
+ if ( v.type () == QVariant::Int ) return true ;
92
75
if ( v.type () == QVariant::Double ) return false ;
93
76
if ( v.type () == QVariant::String ) { bool ok; v.toString ().toInt ( &ok ); return ok; }
94
77
return false ;
95
78
}
96
79
inline bool isDoubleSafe ( const QVariant& v )
97
80
{
98
- if ( v.type () == QVariant::Double || v.type () == QVariant::Int || v. canConvert <TVL>() ) return true ;
81
+ if ( v.type () == QVariant::Double || v.type () == QVariant::Int ) return true ;
99
82
if ( v.type () == QVariant::String ) { bool ok; v.toString ().toDouble ( &ok ); return ok; }
100
83
return false ;
101
84
}
102
85
103
- inline bool isNull ( const QVariant& v ) { return v.type () == QVariant::Invalid || ( v.canConvert <TVL>() && v.value <TVL>().val == TVL::Unknown ); }
104
- inline bool isTVL ( const QVariant & v ) { return v.canConvert <TVL>(); }
86
+ inline bool isNull ( const QVariant& v ) { return v.type () == QVariant::Invalid; }
105
87
106
88
// /////////////////////////////////////////////
107
89
// evaluation error macros
@@ -131,24 +113,11 @@ const char* QgsExpression::UnaryOperatorText[] =
131
113
// implicit conversion to string
132
114
static QString getStringValue ( const QVariant& value, QgsExpression* )
133
115
{
134
- if ( value.canConvert <TVL>() )
135
- {
136
- TVL::Value tvl = value.value <TVL>().val ;
137
- Q_ASSERT ( tvl != TVL::Unknown ); // null should be handled before calling this function
138
- return ( tvl == TVL::True ? " 1" : " 0" );
139
- }
140
116
return value.toString ();
141
117
}
142
118
143
119
static double getDoubleValue ( const QVariant& value, QgsExpression* parent )
144
120
{
145
- if ( value.canConvert <TVL>() )
146
- {
147
- TVL::Value tvl = value.value <TVL>().val ;
148
- Q_ASSERT ( tvl != TVL::Unknown ); // null should be handled before calling this function
149
- return ( tvl == TVL::True ? 1 : 0 );
150
- }
151
-
152
121
bool ok;
153
122
double x = value.toDouble ( &ok );
154
123
if ( !ok )
@@ -161,13 +130,6 @@ static double getDoubleValue( const QVariant& value, QgsExpression* parent )
161
130
162
131
static int getIntValue ( const QVariant& value, QgsExpression* parent )
163
132
{
164
- if ( value.canConvert <TVL>() )
165
- {
166
- TVL::Value tvl = value.value <TVL>().val ;
167
- Q_ASSERT ( tvl != TVL::Unknown ); // null should be handled before calling this function
168
- return ( tvl == TVL::True ? 1 : 0 );
169
- }
170
-
171
133
bool ok;
172
134
int x = value.toInt ( &ok );
173
135
if ( !ok )
@@ -182,21 +144,21 @@ static int getIntValue( const QVariant& value, QgsExpression* parent )
182
144
// this handles also NULL values
183
145
static TVL getTVLValue ( const QVariant& value, QgsExpression* parent )
184
146
{
185
- if ( isTVL ( value ) )
186
- return value.value <TVL>();
187
-
188
147
// we need to convert to TVL
189
148
if ( value.type () == QVariant::Invalid )
190
- return TVL ();
149
+ return Unknown;
150
+
151
+ if ( value.type () == QVariant::Int )
152
+ return value.toInt () != 0 ? True : False;
191
153
192
154
bool ok;
193
155
double x = value.toDouble ( &ok );
194
156
if ( !ok )
195
157
{
196
158
parent->setEvalErrorString ( QString ( " Cannot convert '%1' to boolean" ).arg ( value.toString () ) );
197
- return TVL () ;
159
+ return Unknown ;
198
160
}
199
- return x != 0 ? TVL ( true ) : TVL ( false ) ;
161
+ return x != 0 ? True : False ;
200
162
}
201
163
202
164
// ////
@@ -509,13 +471,7 @@ QVariant QgsExpression::evaluate( QgsFeature* f )
509
471
return QVariant ();
510
472
}
511
473
512
- QVariant res = mRootNode ->eval ( this , f );
513
- if ( res.canConvert <TVL>() )
514
- {
515
- // convert 3-value logic to int (0/1) or null
516
- return res.value <TVL>().toVariant ();
517
- }
518
- return res;
474
+ return mRootNode ->eval ( this , f );
519
475
}
520
476
521
477
QVariant QgsExpression::evaluate ( QgsFeature* f, const QgsFieldMap& fields )
@@ -564,7 +520,7 @@ QVariant QgsExpression::NodeUnaryOperator::eval( QgsExpression* parent, QgsFeatu
564
520
{
565
521
TVL tvl = getTVLValue ( val, parent );
566
522
ENSURE_NO_EVAL_ERROR;
567
- return QVariant::fromValue ( ! tvl );
523
+ return tvl2variant ( NOT[ tvl] );
568
524
}
569
525
570
526
case uoMinus:
@@ -641,14 +597,14 @@ QVariant QgsExpression::NodeBinaryOperator::eval( QgsExpression* parent, QgsFeat
641
597
{
642
598
TVL tvlL = getTVLValue ( vL, parent ), tvlR = getTVLValue ( vR, parent );
643
599
ENSURE_NO_EVAL_ERROR;
644
- return QVariant::fromValue ( tvlL & tvlR );
600
+ return tvl2variant ( AND[ tvlL][ tvlR] );
645
601
}
646
602
647
603
case boOr:
648
604
{
649
605
TVL tvlL = getTVLValue ( vL, parent ), tvlR = getTVLValue ( vR, parent );
650
606
ENSURE_NO_EVAL_ERROR;
651
- return QVariant::fromValue ( tvlL | tvlR );
607
+ return tvl2variant ( OR[ tvlL][ tvlR] );
652
608
}
653
609
654
610
case boEQ:
0 commit comments