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:
cxl 2019-06-18 13:37:43 +00:00
parent 717de82a88
commit 1ad81ad982
11 changed files with 74 additions and 163 deletions

View file

@ -299,3 +299,5 @@ private:
public:
void SetFormat(const char *fmt) { format = fmt; }
};
Convert& LNGConvert();

View file

@ -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"

View file

@ -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));

View file

@ -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__();

View file

@ -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)

View file

@ -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;

View file

@ -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;

View file

@ -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;

View file

@ -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 {

View file

@ -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"));

View file

@ -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();