aList.append( "<=" );
aList.append( ">=" );
aList.append( "<>" );
+ aList.append( "!=" ); // same as "<>" - for C++ addicts
addOperations( aList );
ListOfTypes aTypes;
{
if( isBin )
if( op=="<" || op==">" || op=="=" ||
- op=="<=" || op==">=" || op=="<>" )
+ op=="<=" || op==">=" || op=="<>" || op=="!=" )
return 1;
else if( op=="+" || op=="-" )
return 2;
set( v1, _v1<=_v2 );
else if( op==">=" )
set( v1, _v1>=_v2 );
- else if( op=="<>" )
+ else if( op=="<>" || op=="!=" )
set( v1, _v1!=_v2 );
}
else if( ( v1.type()==QVariant::Int || v1.type()==QVariant::Double ) &&
set( v1, _v1<=_v2 );
else if( op==">=" )
set( v1, _v1>=_v2 );
- else if( op=="<>" )
+ else if( op=="<>" || op=="!=" )
set( v1, _v1!=_v2 );
}
else
ListOfTypes aTypes;
aTypes.append( QVariant::Bool );
+ aTypes.append( QVariant::Int );
+ aTypes.append( QVariant::UInt );
addTypes( aTypes );
}
{
bool ok = true;
if( str.lower()=="true" )
- v = true;
+ v = QtxValue( true, 0 );
else if( str.lower()=="false" )
- v = false;
+ v = QtxValue( false, 0 );
else
ok = QtxStdOperations::createValue( str, v );
return 0;
}
+bool boolean_value( const QtxValue& v )
+{
+ if( v.type()==QVariant::Bool )
+ return v.toBool();
+ else if( v.type()==QVariant::Int )
+ return v.toInt()!=0;
+ else if( v.type()==QVariant::UInt )
+ return v.toUInt()!=0;
+ else
+ return false;
+}
+
//================================================================
// Function :
// Purpose :
QtxValue& v1, QtxValue& v2 ) const
{
QtxParser::Error err = QtxParser::OK;
+ bool val1 = boolean_value( v1 ),
+ val2 = boolean_value( v2 );
if( v1.isValid() && v2.isValid() )
{
if( op=="and" || op=="&&" )
- set( v1, v1.toBool() && v2.toBool() );
+ set( v1, val1 && val2 );
else if( op=="or" || op=="||" )
- set( v1, v1.toBool() || v2.toBool() );
+ set( v1, val1 || val2 );
else if( op=="xor" )
- set( v1, ( !v1.toBool() && v2.toBool() ) || ( v1.toBool() && !v2.toBool() ) );
+ set( v1, ( !val1 && val2 ) || ( val1 && !val2 ) );
else if( op=="imp" )
- set( v1, !v1.toBool() || v2.toBool() );
+ set( v1, !val1 || val2 );
else if( op=="=" )
- set( v1, v1.toBool()==v2.toBool() );
+ set( v1, val1==val2 );
}
else
if( op=="not" || op=="!" )
- v2 = !v2.toBool();
+ set( v2, !val2 );
return err;
}
aList.append( "<=" );
aList.append( ">=" );
aList.append( "<>" );
+ aList.append( "!=" ); // same as "<>" - for C++ addicts
aList.append( "length" );
aList.append( "lower" );
aList.append( "upper" );
if( op=="+" )
return 2;
else if( op=="=" || op=="<" || op==">" ||
- op=="<=" || op==">=" || op=="<>" )
+ op=="<=" || op==">=" || op=="<>" || op=="!=" )
return 1;
else
return 0;
set( v1, _v1<_v2 );
else if( op==">" )
set( v1, _v1>_v2 );
- else if( op=="<>" )
+ else if( op=="<>" || op=="!=" )
set( v1, _v1!=_v2 );
else if( op=="<=" )
set( v1, _v1<_v2 || _v1==_v2 );
aList.append( "}" );
aList.append( "=" );
aList.append( "<>" );
+ aList.append( "!=" ); // same as "<>" - for C++ addicts
aList.append( "+" );
aList.append( "-" );
aList.append( "*" );
int QtxSets::prior( const QString& op, bool isBin ) const
{
if( isBin )
- if( op=="=" || op=="<>" )
+ if( op=="=" || op=="<>" || op=="!=" )
return 1;
else if( op=="+" || op=="-" || op=="*" )
return 2;
v1 = aNewList;
}
- else if( op=="=" || op=="<>" || op=="+" || op=="-" || op=="*" )
+ else if( op=="=" || op=="<>" || op=="!=" || op=="+" || op=="-" || op=="*" )
{
ValueSet aNewList;
add( aNewList, v1.toList() );
- if( op=="=" || op=="<>" || op=="-" )
+ if( op=="=" || op=="<>" || op=="!=" || op=="-" )
{
remove( aNewList, v2.toList() );
if( op=="=" )
- set( v1, aNewList.isEmpty() );
- else if( op=="<>" )
- set( v1, !aNewList.isEmpty() );
+ set( v1, aNewList.isEmpty() && v1.toList().count()==v2.toList().count() );
+ else if( op=="<>" || op=="!=" )
+ set( v1, !aNewList.isEmpty() || v1.toList().count()!=v2.toList().count() );
else
v1 = aNewList;
}
set( v1, res );
}
else
- v1 = v2.toList().contains( v1 );
+ {
+ const QValueList< QVariant >& list = v2.toList();
+ v1 = ( bool )( list.find( v1 )!=list.end() );
+ }
}
return err;