diff options
Diffstat (limited to '')
-rw-r--r-- | src/variable.cpp | 67 |
1 files changed, 67 insertions, 0 deletions
diff --git a/src/variable.cpp b/src/variable.cpp index 6c9529c..f638dc9 100644 --- a/src/variable.cpp +++ b/src/variable.cpp | |||
@@ -137,6 +137,13 @@ Variable::Variable( const VarList &lst ) | |||
137 | uVal.lVal = new VarList( lst ); | 137 | uVal.lVal = new VarList( lst ); |
138 | } | 138 | } |
139 | 139 | ||
140 | Variable::Variable( void *oVal ) : | ||
141 | eType( typeOpaque ) | ||
142 | { | ||
143 | memset( &uVal, 0, sizeof(uVal) ); | ||
144 | uVal.oVal = oVal; | ||
145 | } | ||
146 | |||
140 | Variable::~Variable() | 147 | Variable::~Variable() |
141 | { | 148 | { |
142 | if( eType == typeString || eType == typeRef ) | 149 | if( eType == typeString || eType == typeRef ) |
@@ -191,6 +198,12 @@ const VarList &Variable::getList() const | |||
191 | return *uVal.lVal; | 198 | return *uVal.lVal; |
192 | } | 199 | } |
193 | 200 | ||
201 | const void *Variable::getOpaque() const | ||
202 | { | ||
203 | if( eType != typeOpaque ) throw Bu::ExceptionBase("Wrong variable type."); | ||
204 | return uVal.oVal; | ||
205 | } | ||
206 | |||
194 | int Variable::toInt() const | 207 | int Variable::toInt() const |
195 | { | 208 | { |
196 | switch( eType ) | 209 | switch( eType ) |
@@ -302,6 +315,10 @@ Bu::String Variable::toString() const | |||
302 | 315 | ||
303 | case typeVersion: | 316 | case typeVersion: |
304 | break; | 317 | break; |
318 | |||
319 | case typeOpaque: | ||
320 | sRet = Bu::String("<opaque:%1>").arg( uVal.oVal ); | ||
321 | break; | ||
305 | } | 322 | } |
306 | 323 | ||
307 | return sRet; | 324 | return sRet; |
@@ -341,6 +358,9 @@ Variable Variable::toType( Type eNewType ) const | |||
341 | 358 | ||
342 | case typeRef: | 359 | case typeRef: |
343 | return Variable::mkRef( toString() ); | 360 | return Variable::mkRef( toString() ); |
361 | |||
362 | case typeOpaque: | ||
363 | throw Bu::ExceptionBase("Cannot convert opaque types."); | ||
344 | } | 364 | } |
345 | throw Bu::ExceptionBase("Unhandled case in Variable toType"); | 365 | throw Bu::ExceptionBase("Unhandled case in Variable toType"); |
346 | } | 366 | } |
@@ -402,6 +422,9 @@ void Variable::doNegate() | |||
402 | 422 | ||
403 | case typeRef: | 423 | case typeRef: |
404 | throw Bu::ExceptionBase("You cannot negate reference values."); | 424 | throw Bu::ExceptionBase("You cannot negate reference values."); |
425 | |||
426 | case typeOpaque: | ||
427 | throw Bu::ExceptionBase("You cannot negate opaque values."); | ||
405 | } | 428 | } |
406 | } | 429 | } |
407 | 430 | ||
@@ -463,6 +486,14 @@ const Variable &Variable::operator=( const Bu::String &rhs ) | |||
463 | return *this; | 486 | return *this; |
464 | } | 487 | } |
465 | 488 | ||
489 | const Variable &Variable::operator=( void *rhs ) | ||
490 | { | ||
491 | reset( typeOpaque ); | ||
492 | uVal.oVal = rhs; | ||
493 | |||
494 | return *this; | ||
495 | } | ||
496 | |||
466 | const Variable &Variable::operator+=( const Variable &rhs ) | 497 | const Variable &Variable::operator+=( const Variable &rhs ) |
467 | { | 498 | { |
468 | switch( eType ) | 499 | switch( eType ) |
@@ -575,6 +606,9 @@ bool Variable::operator==( const Variable &rhs ) const | |||
575 | 606 | ||
576 | case typeVersion: | 607 | case typeVersion: |
577 | return false; | 608 | return false; |
609 | |||
610 | case typeOpaque: | ||
611 | return uVal.oVal == rhs.uVal.oVal; | ||
578 | } | 612 | } |
579 | 613 | ||
580 | return false; | 614 | return false; |
@@ -613,6 +647,9 @@ bool Variable::operator<( const Variable &rhs ) const | |||
613 | 647 | ||
614 | case typeRef: | 648 | case typeRef: |
615 | throw Bu::ExceptionBase("You cannot < compare reference values."); | 649 | throw Bu::ExceptionBase("You cannot < compare reference values."); |
650 | |||
651 | case typeOpaque: | ||
652 | throw Bu::ExceptionBase("You cannot < compare opaque values."); | ||
616 | } | 653 | } |
617 | throw Bu::ExceptionBase("Unhandled case in Variable < compare"); | 654 | throw Bu::ExceptionBase("Unhandled case in Variable < compare"); |
618 | } | 655 | } |
@@ -645,6 +682,9 @@ bool Variable::operator>( const Variable &rhs ) const | |||
645 | 682 | ||
646 | case typeRef: | 683 | case typeRef: |
647 | throw Bu::ExceptionBase("You cannot > compare reference values."); | 684 | throw Bu::ExceptionBase("You cannot > compare reference values."); |
685 | |||
686 | case typeOpaque: | ||
687 | throw Bu::ExceptionBase("You cannot > compare opaque values."); | ||
648 | } | 688 | } |
649 | throw Bu::ExceptionBase("Unhandled case in Variable > compare"); | 689 | throw Bu::ExceptionBase("Unhandled case in Variable > compare"); |
650 | } | 690 | } |
@@ -677,6 +717,9 @@ bool Variable::operator<=( const Variable &rhs ) const | |||
677 | 717 | ||
678 | case typeRef: | 718 | case typeRef: |
679 | throw Bu::ExceptionBase("You cannot <= compare reference values."); | 719 | throw Bu::ExceptionBase("You cannot <= compare reference values."); |
720 | |||
721 | case typeOpaque: | ||
722 | throw Bu::ExceptionBase("You cannot <= compare opaque values."); | ||
680 | } | 723 | } |
681 | throw Bu::ExceptionBase("Unhandled case in Variable <= compare"); | 724 | throw Bu::ExceptionBase("Unhandled case in Variable <= compare"); |
682 | } | 725 | } |
@@ -709,6 +752,9 @@ bool Variable::operator>=( const Variable &rhs ) const | |||
709 | 752 | ||
710 | case typeRef: | 753 | case typeRef: |
711 | throw Bu::ExceptionBase("You cannot >= compare reference values."); | 754 | throw Bu::ExceptionBase("You cannot >= compare reference values."); |
755 | |||
756 | case typeOpaque: | ||
757 | throw Bu::ExceptionBase("You cannot >= compare opaque values."); | ||
712 | } | 758 | } |
713 | throw Bu::ExceptionBase("Unhandled case in Variable >= compare"); | 759 | throw Bu::ExceptionBase("Unhandled case in Variable >= compare"); |
714 | } | 760 | } |
@@ -741,6 +787,9 @@ Variable Variable::operator+( const Variable &rhs ) const | |||
741 | 787 | ||
742 | case typeRef: | 788 | case typeRef: |
743 | throw Bu::ExceptionBase("You cannot add reference values."); | 789 | throw Bu::ExceptionBase("You cannot add reference values."); |
790 | |||
791 | case typeOpaque: | ||
792 | throw Bu::ExceptionBase("You cannot add opaque values."); | ||
744 | } | 793 | } |
745 | throw Bu::ExceptionBase("Unhandled case in Variable add"); | 794 | throw Bu::ExceptionBase("Unhandled case in Variable add"); |
746 | } | 795 | } |
@@ -773,6 +822,9 @@ Variable Variable::operator-( const Variable &rhs ) const | |||
773 | 822 | ||
774 | case typeRef: | 823 | case typeRef: |
775 | throw Bu::ExceptionBase("You cannot subtract reference values."); | 824 | throw Bu::ExceptionBase("You cannot subtract reference values."); |
825 | |||
826 | case typeOpaque: | ||
827 | throw Bu::ExceptionBase("You cannot subtract opaque values."); | ||
776 | } | 828 | } |
777 | throw Bu::ExceptionBase("Unhandled case in Variable subtract"); | 829 | throw Bu::ExceptionBase("Unhandled case in Variable subtract"); |
778 | } | 830 | } |
@@ -805,6 +857,9 @@ Variable Variable::operator*( const Variable &rhs ) const | |||
805 | 857 | ||
806 | case typeRef: | 858 | case typeRef: |
807 | throw Bu::ExceptionBase("You cannot multiply reference values."); | 859 | throw Bu::ExceptionBase("You cannot multiply reference values."); |
860 | |||
861 | case typeOpaque: | ||
862 | throw Bu::ExceptionBase("You cannot multiply opaque values."); | ||
808 | } | 863 | } |
809 | throw Bu::ExceptionBase("Unhandled case in Variable multiply"); | 864 | throw Bu::ExceptionBase("Unhandled case in Variable multiply"); |
810 | } | 865 | } |
@@ -837,6 +892,9 @@ Variable Variable::operator/( const Variable &rhs ) const | |||
837 | 892 | ||
838 | case typeRef: | 893 | case typeRef: |
839 | throw Bu::ExceptionBase("You cannot divide reference values."); | 894 | throw Bu::ExceptionBase("You cannot divide reference values."); |
895 | |||
896 | case typeOpaque: | ||
897 | throw Bu::ExceptionBase("You cannot divide opaque values."); | ||
840 | } | 898 | } |
841 | throw Bu::ExceptionBase("Unhandled case in Variable divide"); | 899 | throw Bu::ExceptionBase("Unhandled case in Variable divide"); |
842 | } | 900 | } |
@@ -868,6 +926,7 @@ Bu::Formatter &operator<<( Bu::Formatter &f, const Variable::Type &t ) | |||
868 | case Variable::typeList: f << "list"; break; | 926 | case Variable::typeList: f << "list"; break; |
869 | case Variable::typeVersion: f << "version"; break; | 927 | case Variable::typeVersion: f << "version"; break; |
870 | case Variable::typeRef: f << "ref"; break; | 928 | case Variable::typeRef: f << "ref"; break; |
929 | case Variable::typeOpaque: f << "opaque"; break; | ||
871 | } | 930 | } |
872 | return f; | 931 | return f; |
873 | } | 932 | } |
@@ -885,6 +944,8 @@ Bu::Formatter &operator<<( Bu::Formatter &f, const Variable &v ) | |||
885 | case Variable::typeList: f << v.getList(); break; | 944 | case Variable::typeList: f << v.getList(); break; |
886 | case Variable::typeVersion:/*f << v.getVersion();*/ break; | 945 | case Variable::typeVersion:/*f << v.getVersion();*/ break; |
887 | case Variable::typeRef: f << v.getString(); break; | 946 | case Variable::typeRef: f << v.getString(); break; |
947 | case Variable::typeOpaque: f << "<opaque:" << v.getOpaque() << ">"; | ||
948 | break; | ||
888 | } | 949 | } |
889 | 950 | ||
890 | return f; | 951 | return f; |
@@ -924,6 +985,9 @@ Bu::ArchiveBase &operator<<( Bu::ArchiveBase &ar, const Variable &v ) | |||
924 | case Variable::typeRef: | 985 | case Variable::typeRef: |
925 | ar << *v.uVal.sVal; | 986 | ar << *v.uVal.sVal; |
926 | break; | 987 | break; |
988 | |||
989 | case Variable::typeOpaque: | ||
990 | break; | ||
927 | } | 991 | } |
928 | 992 | ||
929 | return ar; | 993 | return ar; |
@@ -966,6 +1030,9 @@ Bu::ArchiveBase &operator>>( Bu::ArchiveBase &ar, Variable &v ) | |||
966 | case Variable::typeRef: | 1030 | case Variable::typeRef: |
967 | ar >> *v.uVal.sVal; | 1031 | ar >> *v.uVal.sVal; |
968 | break; | 1032 | break; |
1033 | |||
1034 | case Variable::typeOpaque: | ||
1035 | break; | ||
969 | } | 1036 | } |
970 | 1037 | ||
971 | return ar; | 1038 | return ar; |