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
00028 #ifndef _terimber_varvalue_hpp_
00029 #define _terimber_varvalue_hpp_
00030
00031 #include "base/numeric.h"
00032
00033 BEGIN_TERIMBER_NAMESPACE
00034 #pragma pack(4)
00035
00036 inline
00037 bool
00038 operator_less(vt_types type, const var_value& x, const var_value& y)
00039 {
00040 if (!x._not_null)
00041 return y._not_null;
00042 else if (!y._not_null)
00043 return false;
00044
00045 switch (type)
00046 {
00047 case vt_unknown:
00048 case vt_enum:
00049 assert(false);
00050 case vt_empty:
00051 case vt_null:
00052 return false;
00053 case vt_bool:
00054 return x._value.boolVal < y._value.boolVal;
00055 case vt_sb1:
00056 return x._value.cVal < y._value.cVal;
00057 case vt_ub1:
00058 return x._value.bVal < y._value.bVal;
00059 case vt_sb2:
00060 return x._value.iVal < y._value.iVal;
00061 case vt_ub2:
00062 return x._value.uiVal < y._value.uiVal;
00063 case vt_sb4:
00064 return x._value.lVal < y._value.lVal;
00065 case vt_ub4:
00066 return x._value.ulVal < y._value.ulVal;
00067 case vt_float:
00068 return x._value.fltVal < y._value.fltVal;
00069 #ifdef OS_64BIT
00070 case vt_double:
00071 return x._value.dblVal < y._value.dblVal;
00072 case vt_sb8:
00073 return x._value.intVal < y._value.intVal;
00074 case vt_ub8:
00075 return x._value.uintVal < y._value.uintVal;
00076 case vt_date:
00077 return x._value.intVal < y._value.intVal;
00078 #else
00079 case vt_double:
00080 return *x._value.dblVal < *y._value.dblVal;
00081 case vt_sb8:
00082 return *x._value.intVal < *y._value.intVal;
00083 case vt_ub8:
00084 return *x._value.uintVal < *y._value.uintVal;
00085 case vt_date:
00086 return *x._value.intVal < *y._value.intVal;
00087 #endif
00088 case vt_string:
00089 return str_template::strcmp(x._value.strVal, y._value.strVal, os_minus_one) < 0;
00090 case vt_wstring:
00091 return str_template::strcmp(x._value.wstrVal, y._value.wstrVal, os_minus_one) < 0;
00092 case vt_decimal:
00093 case vt_numeric:
00094
00095
00096
00097 return numeric::compare_orcl(x._value.bufVal, y._value.bufVal) < 0;
00098 case vt_binary:
00099 if (*(size_t*)x._value.bufVal < *(size_t*)y._value.bufVal)
00100 return true;
00101 else if (*(size_t*)y._value.bufVal < *(size_t*)x._value.bufVal)
00102 return false;
00103 else
00104 return memcmp(x._value.bufVal, y._value.bufVal, *(size_t*)x._value.bufVal) < 0;
00105 case vt_guid:
00106 return memcmp(x._value.bufVal, y._value.guidVal, sizeof(guid_t)) < 0;
00107 }
00108
00109 return true;
00110 }
00111
00112
00113 #pragma pack()
00114 END_TERIMBER_NAMESPACE
00115
00116 #endif // _terimber_varvalue_hpp_