00001 
00002 
00003 
00004 
00005 
00006 
00007 
00008 
00009 
00010 
00011 
00012 
00013 
00014 
00015 
00016 
00017 
00018 
00019 
00020 
00021 
00022 
00023 
00024 
00025 
00026 
00027 
00029 #ifndef OW_WQL_OPERAND_HPP_INCLUDE_GUARD_
00030 #define OW_WQL_OPERAND_HPP_INCLUDE_GUARD_
00031 #include "OW_config.h"
00032 #include "OW_Types.hpp"
00033 #include "OW_String.hpp"
00034 #include "OW_Exception.hpp"
00035 
00036 namespace OW_NAMESPACE
00037 {
00038 
00039 OW_DECLARE_APIEXCEPTION(TypeMismatch, OW_WQLCOMMON_API)
00043 enum WQLIntegerValueTag 
00044 { 
00045    WQL_INTEGER_VALUE_TAG 
00046 };
00050 enum WQLDoubleValueTag 
00051 { 
00052    WQL_DOUBLE_VALUE_TAG 
00053 };
00057 enum WQLBoolValueTag 
00058 { 
00059    WQL_BOOLEAN_VALUE_TAG 
00060 };
00064 enum WQLStringValueTag 
00065 { 
00066    WQL_STRING_VALUE_TAG 
00067 };
00071 enum WQLPropertyNameTag 
00072 { 
00073    WQL_PROPERTY_NAME_TAG 
00074 };
00106 class OW_WQLCOMMON_API WQLOperand
00107 {
00108 public:
00112    enum Type
00113    {
00114       NULL_VALUE,
00115       INTEGER_VALUE,
00116       DOUBLE_VALUE,
00117       BOOLEAN_VALUE,
00118       STRING_VALUE,
00119       PROPERTY_NAME
00120    };
00123    WQLOperand()
00124       : _type(NULL_VALUE) 
00125    {
00126    }
00129    WQLOperand(Int64 x, WQLIntegerValueTag)
00130       : _integerValue(x)
00131       , _type(INTEGER_VALUE)
00132    {
00133    }
00136    WQLOperand(Real64 x, WQLDoubleValueTag)
00137       : _doubleValue(x)
00138       , _type(DOUBLE_VALUE)
00139    {
00140    }
00143    WQLOperand(bool x, WQLBoolValueTag)
00144       : _booleanValue(x)
00145       , _type(BOOLEAN_VALUE)
00146    {
00147    }
00150    WQLOperand(const String& x, WQLStringValueTag)
00151       : _string(x)
00152       , _type(STRING_VALUE)
00153    {
00154    }
00157    WQLOperand(const String& x, WQLPropertyNameTag)
00158       : _string(x)
00159       , _type(PROPERTY_NAME)
00160    {
00161    }
00164    Type getType() const { return _type; }
00167    void setIntegerValue(Int32 x)
00168    {
00169       _integerValue = x;
00170       _type = INTEGER_VALUE;
00171    }
00174    void setDoubleValue(Real64 x)
00175    {
00176       _doubleValue = x;
00177       _type = DOUBLE_VALUE;
00178    }
00181    void setBoolValue(bool x)
00182    {
00183       _booleanValue = x;
00184       _type = BOOLEAN_VALUE;
00185    }
00188    void setStringValue(const String& x)
00189    {
00190       _string = x;
00191       _type = STRING_VALUE;
00192    }
00195    void setPropertyName(const String& x)
00196    {
00197       _string = x;
00198       _type = PROPERTY_NAME;
00199    }
00202    Int64 getIntegerValue() const
00203    {
00204       if (_type != INTEGER_VALUE)
00205          OW_THROW(TypeMismatchException, "Type mismatch");
00206       return _integerValue;
00207    }
00211    Real64 getDoubleValue() const
00212    {
00213       if (_type != DOUBLE_VALUE)
00214          OW_THROW(TypeMismatchException, "Type mismatch");
00215       return _doubleValue;
00216    }
00220    bool getBooleanValue() const
00221    {
00222       if (_type != BOOLEAN_VALUE)
00223          OW_THROW(TypeMismatchException, "Type mismatch");
00224       return _booleanValue;
00225    }
00229    const String& getStringValue() const
00230    {
00231       if (_type != STRING_VALUE)
00232          OW_THROW(TypeMismatchException, "Type mismatch");
00233       return _string;
00234    }
00238    const String& getPropertyName() const
00239    {
00240       if (_type != PROPERTY_NAME)
00241          OW_THROW(TypeMismatchException, "Type mismatch");
00242       return _string;
00243    }
00246    String toString() const;
00247 private:
00248    union
00249    {
00250       Int64 _integerValue;
00251       Real64 _doubleValue;
00252       bool _booleanValue;
00253    };
00254    String _string;
00255    Type _type;
00256 };
00257 OW_WQLCOMMON_API bool operator==(const WQLOperand& x, const WQLOperand& y);
00258 
00259 } 
00260 
00261 #endif