mirror of
https://github.com/ultimatepp/ultimatepp.git
synced 2026-05-15 14:16:07 -06:00
CtrlLib: ArrayCtrl sort improved, Core: GetLanguageInfo() optimized
git-svn-id: svn://ultimatepp.org/upp/trunk@13419 f0d560ea-af0d-0410-9eb7-867de7ffcac7
This commit is contained in:
parent
717de82a88
commit
1ad81ad982
11 changed files with 74 additions and 163 deletions
|
|
@ -299,3 +299,5 @@ private:
|
|||
public:
|
||||
void SetFormat(const char *fmt) { format = fmt; }
|
||||
};
|
||||
|
||||
Convert& LNGConvert();
|
||||
|
|
|
|||
|
|
@ -299,6 +299,8 @@ class JsonIO;
|
|||
|
||||
#include "Other.h"
|
||||
|
||||
#include "Lang.h"
|
||||
|
||||
#include "Value.h"
|
||||
#include "ValueUtil.h"
|
||||
|
||||
|
|
@ -332,7 +334,6 @@ class JsonIO;
|
|||
#include "Xmlize.h"
|
||||
|
||||
#include "Gtypes.h"
|
||||
#include "Lang.h"
|
||||
#include "i18n.h"
|
||||
#include "Topic.h"
|
||||
|
||||
|
|
|
|||
|
|
@ -156,6 +156,10 @@ void SetLanguage(int lang) {
|
|||
SetCurrentLanguage(lang);
|
||||
}
|
||||
|
||||
INITBLOCK {
|
||||
SetLanguage(LNG_('E', 'N', 'U', 'S'));
|
||||
}
|
||||
|
||||
void SetLanguage(const char *s)
|
||||
{
|
||||
SetLanguage(LNGFromText(s));
|
||||
|
|
|
|||
|
|
@ -8,8 +8,6 @@
|
|||
int LNGFromText(const char *s);
|
||||
String LNGAsText(int d);
|
||||
|
||||
Convert& LNGConvert();
|
||||
|
||||
byte GetLNGCharset(int d);
|
||||
int SetLNGCharset(int lng, byte chrset);
|
||||
|
||||
|
|
@ -111,3 +109,5 @@ struct LangTextRecord {
|
|||
|
||||
void AddLangModule(const char *file, const char *modulename, int masterlang, const LangModuleRecord *module);
|
||||
void AddLanguage(const char *modulename, int lang, const LangTextRecord *langtext);
|
||||
|
||||
void SyncLngInfo__();
|
||||
|
|
|
|||
|
|
@ -468,6 +468,8 @@ ArrayMap<int, LanguageInfo>& LangMap()
|
|||
|
||||
StaticMutex sLanguageInfoMutex;
|
||||
|
||||
static std::atomic<const LanguageInfo *> sCurrentLangInfo;
|
||||
|
||||
const LanguageInfo& GetLanguageInfo(int lang)
|
||||
{
|
||||
Mutex::Lock __(sLanguageInfoMutex);
|
||||
|
|
@ -483,9 +485,16 @@ const LanguageInfo& GetLanguageInfo(int lang)
|
|||
return f;
|
||||
}
|
||||
|
||||
void SyncLngInfo__()
|
||||
{
|
||||
sCurrentLangInfo = &GetLanguageInfo(GetCurrentLanguage());
|
||||
}
|
||||
|
||||
const LanguageInfo& GetLanguageInfo()
|
||||
{
|
||||
return GetLanguageInfo(GetCurrentLanguage());
|
||||
if(!sCurrentLangInfo)
|
||||
SyncLngInfo__();
|
||||
return *sCurrentLangInfo;
|
||||
}
|
||||
|
||||
void SetLanguageInfo(int lang, const LanguageInfo& lf)
|
||||
|
|
|
|||
109
uppsrc/Core/Mt.h
109
uppsrc/Core/Mt.h
|
|
@ -1,9 +1,3 @@
|
|||
#ifndef _DEBUG
|
||||
inline void AssertST() {}
|
||||
#endif
|
||||
|
||||
#ifdef _MULTITHREADED
|
||||
|
||||
#ifdef DEPRECATED
|
||||
#define thread__ thread_local
|
||||
#endif
|
||||
|
|
@ -114,8 +108,11 @@ private:
|
|||
|
||||
#ifdef _DEBUG
|
||||
inline void AssertST() { ASSERT(Thread::IsST()); }
|
||||
#else
|
||||
inline void AssertST() {}
|
||||
#endif
|
||||
|
||||
|
||||
class Semaphore : NoCopy {
|
||||
#ifdef PLATFORM_WIN32
|
||||
HANDLE handle;
|
||||
|
|
@ -410,106 +407,6 @@ struct H_l_ : Mutex::Lock {
|
|||
|
||||
#define INTERLOCKED_(cs) \
|
||||
for(UPP::H_l_ i_ss_lock__(cs); i_ss_lock__.b; i_ss_lock__.b = false)
|
||||
|
||||
#else
|
||||
|
||||
inline bool IsMainThread() { return true; }
|
||||
|
||||
#define thread__
|
||||
|
||||
#define PROFILEMT(mutex)
|
||||
#define PROFILEMT_(mutex, id)
|
||||
|
||||
class Mutex : NoCopy {
|
||||
public:
|
||||
bool TryEnter() { return true; }
|
||||
void Enter() {}
|
||||
void Leave() {}
|
||||
|
||||
class Lock;
|
||||
};
|
||||
|
||||
typedef Mutex StaticMutex;
|
||||
|
||||
class Mutex::Lock : NoCopy {
|
||||
public:
|
||||
Lock(Mutex&) {}
|
||||
~Lock() {}
|
||||
};
|
||||
|
||||
class RWMutex : NoCopy {
|
||||
public:
|
||||
void EnterWrite() {}
|
||||
void LeaveWrite() {}
|
||||
|
||||
void EnterRead() {}
|
||||
void LeaveRead() {}
|
||||
|
||||
class ReadLock;
|
||||
class WriteLock;
|
||||
};
|
||||
|
||||
class RWMutex::ReadLock : NoCopy {
|
||||
public:
|
||||
ReadLock(RWMutex&) {}
|
||||
~ReadLock() {}
|
||||
};
|
||||
|
||||
class RWMutex::WriteLock : NoCopy {
|
||||
public:
|
||||
WriteLock(RWMutex&) {}
|
||||
~WriteLock() {}
|
||||
};
|
||||
|
||||
typedef RWMutex StaticRWMutex;
|
||||
|
||||
class LazyUpdate {
|
||||
mutable bool dirty;
|
||||
|
||||
public:
|
||||
void Invalidate() { dirty = true; }
|
||||
bool BeginUpdate() const { return dirty; }
|
||||
void EndUpdate() const { dirty = false; }
|
||||
|
||||
LazyUpdate() { dirty = true; }
|
||||
};
|
||||
|
||||
struct SpinLock {
|
||||
bool TryEnter() { return true; }
|
||||
void Leave() {}
|
||||
void Enter() {}
|
||||
|
||||
class Lock;
|
||||
|
||||
SpinLock() {}
|
||||
};
|
||||
|
||||
class SpinLock::Lock : NoCopy {
|
||||
public:
|
||||
Lock(SpinLock& s) {}
|
||||
~Lock() {}
|
||||
};
|
||||
|
||||
#ifdef _DEBUG
|
||||
inline void AssertST() {}
|
||||
#endif
|
||||
|
||||
#define INTERLOCKED
|
||||
#define INTERLOCKED_(x) { x.Enter(); }
|
||||
|
||||
#define ONCELOCK \
|
||||
for(static bool o_b_; !o_b_; o_b_ = true)
|
||||
|
||||
#define ONCELOCK_(o_b_) \
|
||||
for(; !o_b_; o_b_ = true) \
|
||||
|
||||
#define ONCELOCK_PTR(ptr, init) \
|
||||
if(!ptr) ptr = init;
|
||||
|
||||
inline void ReadMemoryBarrier() {}
|
||||
inline void WriteMemoryBarrier() {}
|
||||
|
||||
#endif
|
||||
|
||||
#ifdef DEPRECATED
|
||||
typedef Mutex CriticalSection;
|
||||
|
|
|
|||
|
|
@ -596,55 +596,6 @@ Value ValueMap::GetAndClear(const Value& key)
|
|||
|
||||
// ----------------------------------
|
||||
|
||||
int StdValueCompare(const Value& a, const Value& b, int language)
|
||||
{
|
||||
LTIMING("StdValueCompare");
|
||||
|
||||
bool na = IsNull(a), nb = IsNull(b);
|
||||
if(na || nb)
|
||||
return !na ? 1 : !nb ? -1 : 0;
|
||||
dword ta = a.GetType(), tb = b.GetType();
|
||||
if((ta == INT_V || ta == BOOL_V) && (tb == INT_V || tb == BOOL_V))
|
||||
return cmp<int>(a, b);
|
||||
if((ta == BOOL_V || ta == INT_V || ta == INT64_V || ta == DOUBLE_V)
|
||||
&& (tb == BOOL_V || tb == INT_V || tb == INT64_V || tb == DOUBLE_V))
|
||||
return cmp<double>(a, b);
|
||||
if(ta == DATE_V && tb == DATE_V)
|
||||
return cmp<Date>(a, b);
|
||||
if((ta == DATE_V || ta == TIME_V) && (tb == DATE_V || tb == TIME_V))
|
||||
return cmp<Time>(a, b);
|
||||
if((ta == STRING_V || ta == WSTRING_V) && (tb == STRING_V || tb == WSTRING_V))
|
||||
return GetLanguageInfo(language).Compare(WString(a), WString(b));
|
||||
return a.Compare(b);
|
||||
}
|
||||
|
||||
int StdValueCompare(const Value& a, const Value& b)
|
||||
{
|
||||
return StdValueCompare(a, b, GetCurrentLanguage());
|
||||
}
|
||||
|
||||
int StdValueCompareDesc(const Value& a, const Value& b, int language)
|
||||
{
|
||||
return -StdValueCompare(a, b, language);
|
||||
}
|
||||
|
||||
int StdValueCompareDesc(const Value& a, const Value& b)
|
||||
{
|
||||
return -StdValueCompare(a, b);
|
||||
}
|
||||
|
||||
StdValueOrder::StdValueOrder(int l) : language(l) {}
|
||||
|
||||
bool StdValueOrder::operator()(const Value& a, const Value& b) const
|
||||
{
|
||||
return StdValueCompare(a, b, language) < 0;
|
||||
}
|
||||
|
||||
bool FnValueOrder::operator()(const Value& a, const Value& b) const
|
||||
{
|
||||
return (*fn)(a, b) < 0;
|
||||
}
|
||||
|
||||
bool StdValuePairOrder::operator()(const Value& k1, const Value& v1, const Value& k2, const Value& v2) const
|
||||
{
|
||||
int q = StdValueCompare(k1, k2, language);
|
||||
|
|
@ -657,6 +608,11 @@ bool FnValuePairOrder::operator()(const Value& keya, const Value& valuea, const
|
|||
return (*fn)(keya, valuea, keyb, valueb) < 0;
|
||||
}
|
||||
|
||||
int CompareStrings(const Value& a, const Value& b, const LanguageInfo& f)
|
||||
{
|
||||
return f.Compare(WString(a), WString(b));
|
||||
}
|
||||
|
||||
void Complex::Xmlize(XmlIO& xio)
|
||||
{
|
||||
double r, i;
|
||||
|
|
|
|||
|
|
@ -20,9 +20,11 @@ inline T Nvl(T a, T b, T c, T d) { return Nvl(Nvl(
|
|||
template <class T>
|
||||
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);
|
||||
|
||||
|
|
@ -34,15 +36,15 @@ struct ValueOrder {
|
|||
struct StdValueOrder : ValueOrder {
|
||||
int language;
|
||||
|
||||
virtual bool operator()(const Value& a, const Value& b) const;
|
||||
virtual bool operator()(const Value& a, const Value& b) const { return StdValueCompare(a, b, language) < 0; }
|
||||
|
||||
StdValueOrder(int l = -1);
|
||||
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;
|
||||
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) {}
|
||||
};
|
||||
|
|
@ -68,6 +70,8 @@ struct FnValuePairOrder : ValuePairOrder {
|
|||
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<Id> {
|
||||
String id;
|
||||
|
||||
|
|
|
|||
|
|
@ -5,6 +5,43 @@ void ValueMap::Add(const Value& key, const Value& value) {
|
|||
d.value.Add(value);
|
||||
}
|
||||
|
||||
inline
|
||||
int StdValueCompare(const Value& a, const Value& b, const LanguageInfo& f)
|
||||
{
|
||||
return IsString(a) && IsString(b) ? CompareStrings(a, b, f) : a.Compare(b);
|
||||
}
|
||||
|
||||
inline
|
||||
int StdValueCompare(const Value& a, const Value& b, int language)
|
||||
{
|
||||
return StdValueCompare(a, b, GetLanguageInfo(language));
|
||||
}
|
||||
|
||||
inline
|
||||
int StdValueCompare(const Value& a, const Value& b)
|
||||
{
|
||||
return StdValueCompare(a, b, GetLanguageInfo());
|
||||
}
|
||||
|
||||
inline
|
||||
int StdValueCompareDesc(const Value& a, const Value& b, const LanguageInfo& f)
|
||||
{
|
||||
return -StdValueCompare(a, b, f);
|
||||
}
|
||||
|
||||
inline
|
||||
int StdValueCompareDesc(const Value& a, const Value& b, int language)
|
||||
{
|
||||
return -StdValueCompare(a, b, language);
|
||||
}
|
||||
|
||||
inline
|
||||
int StdValueCompareDesc(const Value& a, const Value& b)
|
||||
{
|
||||
return -StdValueCompare(a, b);
|
||||
}
|
||||
|
||||
|
||||
#ifdef DEPRECATED
|
||||
template <class T>
|
||||
struct RawRef : public RefManager {
|
||||
|
|
|
|||
|
|
@ -267,6 +267,7 @@ void SetCurrentLanguage(int lang)
|
|||
sLangMap()[i].Clear();
|
||||
}
|
||||
}
|
||||
SyncLngInfo__();
|
||||
}
|
||||
SetDateFormat(t_("date-format\a%2:02d/%3:02d/%1:4d"));
|
||||
SetDateScan(t_("date-scan\amdy"));
|
||||
|
|
|
|||
|
|
@ -2491,7 +2491,7 @@ void ArrayCtrl::Sort(int from, int count, Gate<int, int> order)
|
|||
for(int i = 0; i < array.GetCount(); i++)
|
||||
h.Add(i);
|
||||
SortA();
|
||||
StableSort(SubRange(h, from, count).Write(), order);
|
||||
CoStableSort(SubRange(h, from, count).Write(), order);
|
||||
SortB(h);
|
||||
Refresh();
|
||||
SyncInfo();
|
||||
|
|
|
|||
Loading…
Add table
Add a link
Reference in a new issue