wxFileConfig uses sorted arrays (big performance improvement)

git-svn-id: https://svn.wxwidgets.org/svn/wx/wxWidgets/trunk@281 c3d73ce0-8a6f-49c7-b76d-6d57e0e08775
This commit is contained in:
Vadim Zeitlin
1998-07-16 17:30:39 +00:00
parent 3bfa440288
commit f5ae044937
2 changed files with 84 additions and 11 deletions

View File

@@ -197,8 +197,8 @@ private:
//protected: --- if wxFileConfig::ConfigEntry is not public, functions in //protected: --- if wxFileConfig::ConfigEntry is not public, functions in
// ConfigGroup such as Find/AddEntry can't return "ConfigEntry *" // ConfigGroup such as Find/AddEntry can't return "ConfigEntry *"
public: public:
WX_DEFINE_ARRAY(ConfigEntry *, ArrayEntries); WX_DEFINE_SORTED_ARRAY(ConfigEntry *, ArrayEntries);
WX_DEFINE_ARRAY(ConfigGroup *, ArrayGroups); WX_DEFINE_SORTED_ARRAY(ConfigGroup *, ArrayGroups);
class ConfigEntry class ConfigEntry
{ {

View File

@@ -57,6 +57,12 @@
// but _not_ ']' (group name delimiter) // but _not_ ']' (group name delimiter)
inline bool IsValid(char c) { return isalnum(c) || strchr("@_/-!.*%", c); } inline bool IsValid(char c) { return isalnum(c) || strchr("@_/-!.*%", c); }
// compare functions for sorting the arrays
static int CompareEntries(wxFileConfig::ConfigEntry *p1,
wxFileConfig::ConfigEntry *p2);
static int CompareGroups(wxFileConfig::ConfigGroup *p1,
wxFileConfig::ConfigGroup *p2);
// filter strings // filter strings
static wxString FilterIn(const wxString& str); static wxString FilterIn(const wxString& str);
static wxString FilterOut(const wxString& str); static wxString FilterOut(const wxString& str);
@@ -637,7 +643,9 @@ bool wxFileConfig::LineListIsEmpty()
wxFileConfig::ConfigGroup::ConfigGroup(wxFileConfig::ConfigGroup *pParent, wxFileConfig::ConfigGroup::ConfigGroup(wxFileConfig::ConfigGroup *pParent,
const wxString& strName, const wxString& strName,
wxFileConfig *pConfig) wxFileConfig *pConfig)
: m_strName(strName) : m_aEntries(CompareEntries),
m_aSubgroups(CompareGroups),
m_strName(strName)
{ {
m_pConfig = pConfig; m_pConfig = pConfig;
m_pParent = pParent; m_pParent = pParent;
@@ -741,13 +749,32 @@ wxString wxFileConfig::ConfigGroup::GetFullName() const
// find an item // find an item
// ---------------------------------------------------------------------------- // ----------------------------------------------------------------------------
// use binary search because the array is sorted
wxFileConfig::ConfigEntry * wxFileConfig::ConfigEntry *
wxFileConfig::ConfigGroup::FindEntry(const char *szName) const wxFileConfig::ConfigGroup::FindEntry(const char *szName) const
{ {
uint nCount = m_aEntries.Count(); uint i,
for ( uint n = 0; n < nCount; n++ ) { lo = 0,
if ( m_aEntries[n]->Name().IsSameAs(szName, APPCONF_CASE_SENSITIVE) ) hi = m_aEntries.Count();
return m_aEntries[n]; int res;
wxFileConfig::ConfigEntry *pEntry;
while ( lo < hi ) {
i = (lo + hi)/2;
pEntry = m_aEntries[i];
#if APPCONF_CASE_SENSITIVE
res = strcmp(pEntry->Name(), szName);
#else
res = Stricmp(pEntry->Name(), szName);
#endif
if ( res < 0 )
hi = i;
else if ( res > 0 )
lo = i + 1;
else
return pEntry;
} }
return NULL; return NULL;
@@ -756,10 +783,28 @@ wxFileConfig::ConfigGroup::FindEntry(const char *szName) const
wxFileConfig::ConfigGroup * wxFileConfig::ConfigGroup *
wxFileConfig::ConfigGroup::FindSubgroup(const char *szName) const wxFileConfig::ConfigGroup::FindSubgroup(const char *szName) const
{ {
uint nCount = m_aSubgroups.Count(); uint i,
for ( uint n = 0; n < nCount; n++ ) { lo = 0,
if ( m_aSubgroups[n]->Name().IsSameAs(szName, APPCONF_CASE_SENSITIVE) ) hi = m_aSubgroups.Count();
return m_aSubgroups[n]; int res;
wxFileConfig::ConfigGroup *pGroup;
while ( lo < hi ) {
i = (lo + hi)/2;
pGroup = m_aSubgroups[i];
#if APPCONF_CASE_SENSITIVE
res = strcmp(pGroup->Name(), szName);
#else
res = Stricmp(pGroup->Name(), szName);
#endif
if ( res < 0 )
hi = i;
else if ( res > 0 )
lo = i + 1;
else
return pGroup;
} }
return NULL; return NULL;
@@ -946,6 +991,34 @@ void wxFileConfig::ConfigEntry::SetDirty()
// global functions // global functions
// ============================================================================ // ============================================================================
// ----------------------------------------------------------------------------
// compare functions for array sorting
// ----------------------------------------------------------------------------
int CompareEntries(wxFileConfig::ConfigEntry *p1,
wxFileConfig::ConfigEntry *p2)
{
#if APPCONF_CASE_SENSITIVE
return strcmp(p1->Name(), p2->Name());
#else
return Stricmp(p1->Name(), p2->Name());
#endif
}
int CompareGroups(wxFileConfig::ConfigGroup *p1,
wxFileConfig::ConfigGroup *p2)
{
#if APPCONF_CASE_SENSITIVE
return strcmp(p1->Name(), p2->Name());
#else
return Stricmp(p1->Name(), p2->Name());
#endif
}
// ----------------------------------------------------------------------------
// filter functions
// ----------------------------------------------------------------------------
// undo FilterOut // undo FilterOut
wxString FilterIn(const wxString& str) wxString FilterIn(const wxString& str)
{ {