Value Scan(dword stdtype, const String& text, const Value& def = Null, bool *hastime = NULL); inline const String& Nvl(const String& a, const String& b) { return IsNull(a) ? b : a; } inline int Nvl(int a, int b) { return IsNull(a) ? b : a; } inline int64 Nvl(int64 a, int64 b) { return IsNull(a) ? b : a; } inline double Nvl(double a, double b) { return IsNull(a) ? b : a; } inline float Nvl(float a, float b) { return IsNull(a) ? b : a; } inline Date Nvl(Date a, Date b) { return IsNull(a) ? b : a; } inline Time Nvl(Time a, Time b) { return IsNull(a) ? b : a; } inline int Nvl(int a) { return Nvl(a, 0); } inline int64 Nvl(int64 a) { return Nvl(a, (int64)0); } inline double Nvl(double a) { return Nvl(a, 0.0); } inline float Nvl(float a) { return Nvl(a, 0.0f); } template inline T Nvl(T a, T b, T c) { return Nvl(Nvl(a, b), c); } template inline T Nvl(T a, T b, T c, T d) { return Nvl(Nvl(a, b), c, d); } template inline T Nvl(T a, T b, T c, T d, T e) { return Nvl(Nvl(a, b), c, d, e); } int StdValueCompare(const Value& a, const Value& b, const LanguageInfo& f); int StdValueCompare(const Value& a, const Value& b, int language); int StdValueCompare(const Value& a, const Value& b); int StdValueCompareDesc(const Value& a, const Value& b, const LanguageInfo& f); int StdValueCompareDesc(const Value& a, const Value& b, int language); int StdValueCompareDesc(const Value& a, const Value& b); struct ValueOrder { virtual bool operator()(const Value& a, const Value& b) const = 0; virtual ~ValueOrder() {} }; struct StdValueOrder : ValueOrder { int language; virtual bool operator()(const Value& a, const Value& b) const { return StdValueCompare(a, b, language) < 0; } StdValueOrder(int l = -1) : language(l) {} }; struct FnValueOrder : ValueOrder { int (*fn)(const Value& a, const Value& b); virtual bool operator()(const Value& a, const Value& b) const { return (*fn)(a, b) < 0; } FnValueOrder(int (*fn)(const Value& a, const Value& b)) : fn(fn) {} }; struct ValuePairOrder { virtual bool operator()(const Value& keya, const Value& valuea, const Value& keyb, const Value& valueb) const = 0; virtual ~ValuePairOrder() {} }; struct StdValuePairOrder : ValuePairOrder { int language; virtual bool operator()(const Value& keya, const Value& valuea, const Value& keyb, const Value& valueb) const; StdValuePairOrder(int l = -1); }; struct FnValuePairOrder : ValuePairOrder { int (*fn)(const Value& k1, const Value& v1, const Value& k2, const Value& v2); virtual bool operator()(const Value& keya, const Value& valuea, const Value& keyb, const Value& valueb) const; FnValuePairOrder(int (*fn)(const Value& k1, const Value& v1, const Value& k2, const Value& v2)) : fn(fn) {} }; int CompareStrings(const Value& a, const Value& b, const LanguageInfo& f); // used by StdCompareValue class Id : Moveable { String id; public: const String& ToString() const { return id; } hash_t GetHashValue() const { return UPP::GetHashValue(id); } bool IsNull() const { return UPP::IsNull(id); } operator const String&() const { return ToString(); } const String& operator~() const { return ToString(); } bool operator==(const Id& b) const { return id == b.id; } bool operator==(const String& b) const { return id == b; } bool operator==(const char *b) const { return id == b; } bool operator!=(const Id& b) const { return id != b.id; } operator bool() const { return id.GetCount(); } Id() {} Id(const String& s) { id = s; } Id(const char *s) { id = s; } }; struct RefManager { virtual int GetType() = 0; virtual Value GetValue(const void *) { return Null; } virtual bool IsNull(const void *) { return false; } virtual void SetValue(void *, const Value& v) { NEVER(); } virtual void SetNull(void *) { NEVER(); } virtual ~RefManager() {} }; template struct StdRef : public RefManager { virtual void SetValue(void *p, const Value& v) { *(T *) p = (T)v; } virtual Value GetValue(const void *p) { return *(const T *) p; } virtual int GetType() { return GetValueTypeNo(); } virtual bool IsNull(const void *p) { return UPP::IsNull(*(T *) p); } virtual void SetNull(void *p) { UPP::SetNull(*(T *)p); } virtual ~StdRef() {} }; class Ref : Moveable { protected: RefManager *m; void *ptr; struct ValueRef; public: dword GetType() const { return m ? m->GetType() : VOID_V; } bool IsNull() const { return m ? m->IsNull(ptr) : true; } void *GetVoidPtr() const { return ptr; } RefManager *GetManager() const { return m; } template bool Is() const { return GetType() == GetValueTypeNo(); } // VALUE_V!!! template T& Get() const { ASSERT(GetValueTypeNo() == GetType()); return *(T *)GetVoidPtr(); } void SetNull() { if(m) m->SetNull(ptr); } Value GetValue() const { return m ? m->GetValue(ptr) : Value(); } void SetValue(const Value& v) { ASSERT(m); m->SetValue(ptr, v); } operator Value() const { return GetValue(); } Value operator~() const { return GetValue(); } Ref& operator=(const Value& v) { SetValue(v); return *this; } Ref(String& s); Ref(WString& s); Ref(int& i); Ref(int64& i); Ref(double& d); Ref(float& f); Ref(bool& b); Ref(Date& d); Ref(Time& t); Ref(Value& v); Ref(void *_ptr, RefManager *_m) { ptr = _ptr, m = _m; } Ref(const ValueTypeRef& r); Ref() { ptr = m = NULL; } }; template T& GetRef(Ref r, T *x = NULL) { ASSERT(GetValueTypeNo() == r.GetType()); return *(T *) r.GetVoidPtr(); } inline String& RefString(Ref f) { return GetRef(f); } inline WString& RefWString(Ref f) { return GetRef(f); } inline int& RefInt(Ref f) { return GetRef(f); } inline int64& RefInt64(Ref f) { return GetRef(f); } inline double& RefDouble(Ref f) { return GetRef(f); } inline float& RefFloat(Ref f) { return GetRef(f); } inline bool& RefBool(Ref f) { return GetRef(f); } inline Date& RefDate(Ref f) { return GetRef(f); } inline Time& RefTime(Ref f) { return GetRef