1 #include "QtxStdOperations.h"
6 //================================================================
9 //================================================================
10 QtxStdOperations::QtxStdOperations()
14 //================================================================
17 //================================================================
18 QtxStdOperations::~QtxStdOperations()
22 //================================================================
25 //================================================================
26 void QtxStdOperations::bracketsList( QStringList& list, bool open ) const
34 //================================================================
37 //================================================================
38 void QtxStdOperations::opersList( QStringList& list ) const
43 //================================================================
46 //================================================================
47 void QtxStdOperations::addOperations( const QStringList& list )
49 QStringList::const_iterator anIt = list.begin(),
51 for( ; anIt!=aLast; anIt++ )
52 if( myOpers.contains( *anIt )==0 )
53 myOpers.append( *anIt );
56 //================================================================
59 //================================================================
60 void QtxStdOperations::addTypes( const ListOfTypes& list )
62 ListOfTypes::const_iterator anIt = list.begin(),
64 for( ; anIt!=aLast; anIt++ )
65 if( myTypes.contains( *anIt )==0 )
66 myTypes.append( *anIt );
69 //================================================================
72 //================================================================
73 QtxParser::Error QtxStdOperations::isValid( const QString& op,
74 const QVariant::Type t1,
75 const QVariant::Type t2 ) const
77 if( ( t1==QVariant::Invalid || myTypes.contains( t1 ) ) &&
78 ( t2==QVariant::Invalid || myTypes.contains( t2 ) ) &&
79 ( t1!=QVariant::Invalid || t2!=QVariant::Invalid ) )
80 if( prior( op, t1!=QVariant::Invalid && t2!=QVariant::Invalid ) > 0 )
83 return QtxParser::InvalidOperation;
85 return QtxParser::OperandsNotMatch;
95 //================================================================
98 //================================================================
99 QtxArithmetics::QtxArithmetics()
110 aList.append( "<=" );
111 aList.append( ">=" );
112 aList.append( "<>" );
113 aList.append( "!=" ); // same as "<>" - for C++ addicts
114 addOperations( aList );
117 aTypes.append( QVariant::Int );
118 aTypes.append( QVariant::UInt );
119 aTypes.append( QVariant::Double );
123 //================================================================
126 //================================================================
127 QtxArithmetics::~QtxArithmetics()
131 //================================================================
134 //================================================================
135 bool QtxArithmetics::createValue( const QString& str, QtxValue& v ) const
138 v = str.toInt( &ok );
142 v = str.toDouble( &ok );
144 ok = QtxStdOperations::createValue( str, v );
149 //================================================================
152 //================================================================
153 int QtxArithmetics::prior( const QString& op, bool isBin ) const
156 if( op=="<" || op==">" || op=="=" ||
157 op=="<=" || op==">=" || op=="<>" || op=="!=" )
159 else if( op=="+" || op=="-" )
161 else if( op=="*" || op=="/" )
165 else if( op=="+" || op=="-" )
171 void set( QVariant& v1, bool v2 )
173 v1 = QVariant( v2, 0 );
176 //================================================================
179 //================================================================
180 QtxParser::Error QtxArithmetics::calculate( const QString& op,
181 QtxValue& v1, QtxValue& v2 ) const
183 QtxParser::Error err = QtxParser::OK;
185 if( v1.isValid() && v2.isValid() )
187 if( ( v1.type()==QVariant::Int || v1.type()==QVariant::UInt ) &&
188 ( v2.type()==QVariant::Int || v2.type()==QVariant::UInt ) )
190 int _v1 = v1.toInt(),
204 v1 = double( _v1 ) / double( _v2 );
206 err = QtxParser::InvalidResult;
217 else if( op=="<>" || op=="!=" )
220 else if( ( v1.type()==QVariant::Int || v1.type()==QVariant::Double ) &&
221 ( v2.type()==QVariant::Int || v2.type()==QVariant::Double ) )
223 double _v1 = v1.toDouble(),
236 err = QtxParser::InvalidResult;
247 else if( op=="<>" || op=="!=" )
253 if( v2.type()==QVariant::Int )
255 else if( v2.type()==QVariant::Double )
271 //================================================================
274 //================================================================
279 aList.append( "and" );
280 aList.append( "&&" );
281 aList.append( "or" );
282 aList.append( "||" );
283 aList.append( "xor" );
284 aList.append( "not" );
286 aList.append( "imp" );
288 addOperations( aList );
291 aTypes.append( QVariant::Bool );
295 //================================================================
298 //================================================================
299 QtxLogic::~QtxLogic()
303 //================================================================
306 //================================================================
307 bool QtxLogic::createValue( const QString& str, QtxValue& v ) const
310 if( str.lower()=="true" )
312 else if( str.lower()=="false" )
315 ok = QtxStdOperations::createValue( str, v );
320 //================================================================
323 //================================================================
324 int QtxLogic::prior( const QString& op, bool isBin ) const
327 if( op=="and" || op=="or" || op=="xor" ||
328 op=="&&" || op=="||" ||
335 else if( op=="not" || op=="!" )
341 //================================================================
344 //================================================================
345 QtxParser::Error QtxLogic::calculate( const QString& op,
346 QtxValue& v1, QtxValue& v2 ) const
348 QtxParser::Error err = QtxParser::OK;
349 if( v1.isValid() && v2.isValid() )
351 if( op=="and" || op=="&&" )
352 set( v1, v1.toBool() && v2.toBool() );
353 else if( op=="or" || op=="||" )
354 set( v1, v1.toBool() || v2.toBool() );
356 set( v1, ( !v1.toBool() && v2.toBool() ) || ( v1.toBool() && !v2.toBool() ) );
358 set( v1, !v1.toBool() || v2.toBool() );
360 set( v1, v1.toBool()==v2.toBool() );
363 if( op=="not" || op=="!" )
364 set( v2, !v2.toBool() );
374 //================================================================
377 //================================================================
378 QtxFunctions::QtxFunctions()
382 aList.append( "sqrt" );
383 aList.append( "abs" );
384 aList.append( "sin" );
385 aList.append( "cos" );
386 aList.append( "rad2grad" );
387 aList.append( "grad2rad" );
388 addOperations( aList );
391 aTypes.append( QVariant::Int );
392 aTypes.append( QVariant::Double );
396 //================================================================
399 //================================================================
400 QtxFunctions::~QtxFunctions()
404 //================================================================
407 //================================================================
408 bool QtxFunctions::createValue( const QString& str, QtxValue& v ) const
411 v = str.toInt( &ok );
415 v = str.toDouble( &ok );
417 ok = QtxStdOperations::createValue( str, v );
422 //================================================================
425 //================================================================
426 int QtxFunctions::prior( const QString& op, bool isBin ) const
430 else if( op=="sqrt" || op=="abs" || op=="sin" || op=="cos" ||
431 op=="rad2grad" || op=="grad2rad" )
437 //================================================================
440 //================================================================
441 QtxParser::Error QtxFunctions::calculate( const QString& op,
442 QtxValue& v1, QtxValue& v2 ) const
444 QtxParser::Error err = QtxParser::OK;
445 double val = v2.toDouble();
450 err = QtxParser::InvalidResult;
452 if( v2.type()==QVariant::Int )
453 v2 = abs( v2.toInt() );
455 v2 = fabs( v2.toDouble() );
460 else if( op=="grad2rad" )
461 v2 = val * 3.14159256 / 180.0;
462 else if( op=="rad2grad" )
463 v2 = val * 180.0 / 3.14159256;
475 //================================================================
478 //================================================================
479 QtxStrings::QtxStrings()
487 aList.append( "<=" );
488 aList.append( ">=" );
489 aList.append( "<>" );
490 aList.append( "!=" ); // same as "<>" - for C++ addicts
491 aList.append( "length" );
492 aList.append( "lower" );
493 aList.append( "upper" );
494 addOperations( aList );
497 aTypes.append( QVariant::Int );
498 aTypes.append( QVariant::Double );
499 aTypes.append( QVariant::String );
500 aTypes.append( QVariant::CString );
505 //================================================================
508 //================================================================
509 QtxStrings::~QtxStrings()
513 //================================================================
516 //================================================================
517 bool QtxStrings::createValue( const QString& str, QtxValue& v ) const
520 fin = str[ ( int )( str.length()-1 ) ];
521 if( st=="'" && fin=="'" )
523 v = str.mid( 1, str.length()-2 );
527 return QtxStdOperations::createValue( str, v );
530 //================================================================
533 //================================================================
534 int QtxStrings::prior( const QString& op, bool isBin ) const
539 else if( op=="=" || op=="<" || op==">" ||
540 op=="<=" || op==">=" || op=="<>" || op=="!=" )
545 if( op=="length" || op=="lower" || op=="upper" )
551 //================================================================
554 //================================================================
555 QtxParser::Error QtxStrings::calculate( const QString& op,
556 QtxValue& v1, QtxValue& v2 ) const
558 QtxParser::Error err = QtxParser::OK;
559 if( v1.isValid() && v2.isValid() )
561 QString _v1 = v1.toString(),
571 else if( op=="<>" || op=="!=" )
574 set( v1, _v1<_v2 || _v1==_v2 );
576 set( v1, _v1>_v2 || _v1==_v2 );
578 else if( !v1.isValid() && v2.isValid() )
580 QString val = v2.toString();
582 v2 = ( int )val.length();
583 else if( op=="lower" )
585 else if( op=="upper" )
597 //================================================================
600 //================================================================
607 aList.append( "<>" );
608 aList.append( "!=" ); // same as "<>" - for C++ addicts
612 aList.append( "in" );
613 aList.append( "count" );
614 addOperations( aList );
617 aTypes.append( QVariant::List );
621 //================================================================
624 //================================================================
629 //================================================================
632 //================================================================
633 void QtxSets::bracketsList( QStringList& list, bool open ) const
639 QtxStdOperations::bracketsList( list, open );
642 //================================================================
645 //================================================================
646 bool QtxSets::createValue( const QString& str, QtxValue& val ) const
648 return QtxStdOperations::createValue( str, val );
651 //================================================================
654 //================================================================
655 int QtxSets::prior( const QString& op, bool isBin ) const
658 if( op=="=" || op=="<>" || op=="!=" )
660 else if( op=="+" || op=="-" || op=="*" )
668 if( op=="{" || op=="}" )
670 else if( op=="count" )
676 //================================================================
679 //================================================================
680 QtxParser::Error QtxSets::isValid( const QString& op,
681 const QVariant::Type t1,
682 const QVariant::Type t2 ) const
685 return QtxParser::OK;
687 if( t1!=QVariant::Invalid && t2==QVariant::List )
688 return QtxParser::OK;
690 return QtxParser::OperandsNotMatch;
692 return QtxStdOperations::isValid( op, t1, t2 );
695 //================================================================
698 //================================================================
699 void QtxSets::add( ValueSet& set, const QtxValue& v )
701 if( v.isValid() && set.contains( v )==0 )
705 //================================================================
708 //================================================================
709 void QtxSets::add( ValueSet& s1, const ValueSet& s2 )
711 ValueSet::const_iterator anIt = s2.begin(),
713 for( ; anIt!=aLast; anIt++ )
717 //================================================================
720 //================================================================
721 void QtxSets::remove( ValueSet& set, const QtxValue& v )
726 //================================================================
729 //================================================================
730 void QtxSets::remove( ValueSet& s1, const ValueSet& s2 )
732 ValueSet::const_iterator anIt = s2.begin(),
734 for( ; anIt!=aLast; anIt++ )
738 //================================================================
741 //================================================================
742 QtxParser::Error QtxSets::calculate( const QString& op, QtxValue& v1, QtxValue& v2 ) const
744 QtxParser::Error err = QtxParser::OK;
750 add( aNewList, v1.toList() );
754 else if( op=="=" || op=="<>" || op=="!=" || op=="+" || op=="-" || op=="*" )
757 add( aNewList, v1.toList() );
759 if( op=="=" || op=="<>" || op=="!=" || op=="-" )
761 remove( aNewList, v2.toList() );
764 set( v1, aNewList.isEmpty() );
765 else if( op=="<>" || op=="!=" )
766 set( v1, !aNewList.isEmpty() );
772 add( aNewList, v2.toList() );
778 add( toDelete, aNewList );
779 remove( toDelete, v2.toList() );
780 remove( aNewList, toDelete );
784 else if( op=="count" )
785 v2 = ( int )v2.toList().count();
788 if( v1.type()==QVariant::List )
791 ValueSet::const_iterator anIt = v1.toList().begin(),
792 aLast = v1.toList().end();
793 for( ; anIt!=aLast && res; anIt++ )
794 res = v2.toList().contains( *anIt )>0;
799 v1 = v2.toList().contains( v1 );