1
0
mirror of https://github.com/cookiengineer/audacity synced 2025-06-17 00:20:06 +02:00

Simplify repeated lookups and iterations in PluginManager

This commit is contained in:
Paul Licameli 2021-06-19 06:10:05 -04:00
parent 8fda526577
commit 731ab8d554
2 changed files with 58 additions and 102 deletions

View File

@ -22,7 +22,6 @@ class wxCommandEvent;
class AudacityProject; class AudacityProject;
class CommandContext; class CommandContext;
class CommandManager; class CommandManager;
class PluginDescriptor;
class Track; class Track;
class TrackList; class TrackList;
class ViewInfo; class ViewInfo;

View File

@ -1422,18 +1422,14 @@ RegistryPath PluginManager::GetPluginEnabledSetting(
bool PluginManager::IsPluginRegistered( bool PluginManager::IsPluginRegistered(
const PluginPath &path, const TranslatableString *pName) const PluginPath &path, const TranslatableString *pName)
{ {
for (PluginMap::iterator iter = mPlugins.begin(); iter != mPlugins.end(); ++iter) for (auto &pair : mPlugins) {
{ if (auto &descriptor = pair.second; descriptor.GetPath() == path) {
auto &descriptor = iter->second;
if (descriptor.GetPath() == path)
{
if (pName) if (pName)
descriptor.SetSymbol( descriptor.SetSymbol(
{ descriptor.GetSymbol().Internal(), *pName }); { descriptor.GetSymbol().Internal(), *pName });
return true; return true;
} }
} }
return false; return false;
} }
@ -2056,12 +2052,8 @@ void PluginManager::LoadGroup(FileConfig *pRegistry, PluginType type)
groupName = ConvertID(groupName); groupName = ConvertID(groupName);
// Bypass group if the ID is already in use // Bypass group if the ID is already in use
if (mPlugins.find(groupName) != mPlugins.end()) if (mPlugins.count(groupName))
{
pRegistry->SetPath(wxT(".."));
continue; continue;
}
// Set the ID and type // Set the ID and type
plug.SetID(groupName); plug.SetID(groupName);
@ -2071,10 +2063,8 @@ void PluginManager::LoadGroup(FileConfig *pRegistry, PluginType type)
if (!pRegistry->Read(KEY_PROVIDERID, &strVal, wxEmptyString)) if (!pRegistry->Read(KEY_PROVIDERID, &strVal, wxEmptyString))
{ {
// Bypass group if the provider isn't valid // Bypass group if the provider isn't valid
if (!strVal.empty() && mPlugins.find(strVal) == mPlugins.end()) if (!strVal.empty() && !mPlugins.count(strVal))
{
continue; continue;
}
} }
plug.SetProviderID(PluginID(strVal)); plug.SetProviderID(PluginID(strVal));
@ -2297,9 +2287,8 @@ void PluginManager::Save()
void PluginManager::SaveGroup(FileConfig *pRegistry, PluginType type) void PluginManager::SaveGroup(FileConfig *pRegistry, PluginType type)
{ {
wxString group = GetPluginTypeString(type); wxString group = GetPluginTypeString(type);
for (PluginMap::iterator iter = mPlugins.begin(); iter != mPlugins.end(); ++iter) for (auto &pair : mPlugins) {
{ auto & plug = pair.second;
PluginDescriptor & plug = iter->second;
if (plug.GetPluginType() != type) if (plug.GetPluginType() != type)
{ {
@ -2383,21 +2372,14 @@ void PluginManager::SaveGroup(FileConfig *pRegistry, PluginType type)
// and built-ins. // and built-ins.
void PluginManager::CheckForUpdates(bool bFast) void PluginManager::CheckForUpdates(bool bFast)
{ {
// Get ModuleManager reference
ModuleManager & mm = ModuleManager::Get(); ModuleManager & mm = ModuleManager::Get();
wxArrayString pathIndex; wxArrayString pathIndex;
for (PluginMap::iterator iter = mPlugins.begin(); iter != mPlugins.end(); ++iter) for (auto &pair : mPlugins) {
{ auto &plug = pair.second;
PluginDescriptor & plug = iter->second;
// Bypass 2.1.0 placeholders...remove this after a few releases past 2.1.0 // Bypass 2.1.0 placeholders...remove this after a few releases past 2.1.0
if (plug.GetPluginType() == PluginTypeNone) if (plug.GetPluginType() != PluginTypeNone)
{ pathIndex.push_back(plug.GetPath().BeforeFirst(wxT(';')));
continue;
}
pathIndex.push_back(plug.GetPath().BeforeFirst(wxT(';')));
} }
// Check all known plugins to ensure they are still valid and scan for NEW ones. // Check all known plugins to ensure they are still valid and scan for NEW ones.
@ -2411,9 +2393,8 @@ void PluginManager::CheckForUpdates(bool bFast)
// //
// When the user enables the plugin, each provider that reported it will be asked // When the user enables the plugin, each provider that reported it will be asked
// to register the plugin. // to register the plugin.
for (PluginMap::iterator iter = mPlugins.begin(); iter != mPlugins.end(); ++iter) for (auto &pair : mPlugins) {
{ auto &plug = pair.second;
PluginDescriptor & plug = iter->second;
const PluginID & plugID = plug.GetID(); const PluginID & plugID = plug.GetID();
const wxString & plugPath = plug.GetPath(); const wxString & plugPath = plug.GetPath();
PluginType plugType = plug.GetPluginType(); PluginType plugType = plug.GetPluginType();
@ -2506,37 +2487,21 @@ const PluginID & PluginManager::RegisterPlugin(
// a better solution is devised. // a better solution is devised.
void PluginManager::UnregisterPlugin(const PluginID & ID) void PluginManager::UnregisterPlugin(const PluginID & ID)
{ {
if (mPlugins.find(ID) == mPlugins.end())
{
return;
}
mPlugins.erase(ID); mPlugins.erase(ID);
} }
int PluginManager::GetPluginCount(PluginType type) int PluginManager::GetPluginCount(PluginType type)
{ {
int num = 0; return count_if(mPlugins.begin(), mPlugins.end(), [type](auto &pair){
return pair.second.GetPluginType() == type; });
for (PluginMap::iterator iter = mPlugins.begin(); iter != mPlugins.end(); ++iter)
{
if (iter->second.GetPluginType() == type)
{
num++;
}
}
return num;
} }
const PluginDescriptor *PluginManager::GetPlugin(const PluginID & ID) const PluginDescriptor *PluginManager::GetPlugin(const PluginID & ID)
{ {
if (mPlugins.find(ID) == mPlugins.end()) if (auto iter = mPlugins.find(ID); iter == mPlugins.end())
{ return nullptr;
return NULL; else
} return &iter->second;
return &mPlugins[ID];
} }
const PluginDescriptor *PluginManager::GetFirstPlugin(int type) const PluginDescriptor *PluginManager::GetFirstPlugin(int type)
@ -2630,56 +2595,49 @@ const PluginDescriptor *PluginManager::GetNextPluginForEffectType(EffectType typ
bool PluginManager::IsPluginEnabled(const PluginID & ID) bool PluginManager::IsPluginEnabled(const PluginID & ID)
{ {
if (mPlugins.find(ID) == mPlugins.end()) if (auto iter = mPlugins.find(ID); iter == mPlugins.end())
{
return false; return false;
} else
return iter->second.IsEnabled();
return mPlugins[ID].IsEnabled();
} }
void PluginManager::EnablePlugin(const PluginID & ID, bool enable) void PluginManager::EnablePlugin(const PluginID & ID, bool enable)
{ {
if (mPlugins.find(ID) == mPlugins.end()) if (auto iter = mPlugins.find(ID); iter == mPlugins.end())
{
return; return;
} else
iter->second.SetEnabled(enable);
return mPlugins[ID].SetEnabled(enable);
} }
const ComponentInterfaceSymbol & PluginManager::GetSymbol(const PluginID & ID) const ComponentInterfaceSymbol & PluginManager::GetSymbol(const PluginID & ID)
{ {
if (mPlugins.find(ID) == mPlugins.end()) if (auto iter = mPlugins.find(ID); iter == mPlugins.end()) {
{
static ComponentInterfaceSymbol empty; static ComponentInterfaceSymbol empty;
return empty; return empty;
} }
else
return mPlugins[ID].GetSymbol(); return iter->second.GetSymbol();
} }
ComponentInterface *PluginManager::GetInstance(const PluginID & ID) ComponentInterface *PluginManager::GetInstance(const PluginID & ID)
{ {
if (mPlugins.find(ID) == mPlugins.end()) if (auto iter = mPlugins.find(ID); iter == mPlugins.end())
{ return nullptr;
return NULL; else {
} auto &plug = iter->second;
PluginDescriptor & plug = mPlugins[ID]; // If not dealing with legacy effects, make sure the provider is loaded
if (!plug.IsEffectLegacy())
// If not dealing with legacy effects, make sure the provider is loaded
if (!plug.IsEffectLegacy())
{
const PluginID & prov = plug.GetProviderID();
if (mPlugins.find(prov) == mPlugins.end())
{ {
return NULL; const PluginID & prov = plug.GetProviderID();
if (auto iter2 = mPlugins.find(prov); iter2 == mPlugins.end())
return nullptr;
else
iter2->second.GetInstance();
} }
mPlugins[prov].GetInstance();
}
return plug.GetInstance(); return plug.GetInstance();
}
} }
PluginID PluginManager::GetID(ModuleInterface *module) PluginID PluginManager::GetID(ModuleInterface *module)
@ -3005,26 +2963,25 @@ RegistryPath PluginManager::SettingsPath(const PluginID & ID, bool shared)
// be changed across Audacity versions, or else compatibility of the // be changed across Audacity versions, or else compatibility of the
// configuration files will break. // configuration files will break.
if (mPlugins.find(ID) == mPlugins.end()) if (auto iter = mPlugins.find(ID); iter == mPlugins.end())
{ return {};
return wxEmptyString; else {
const PluginDescriptor & plug = iter->second;
wxString id = GetPluginTypeString(plug.GetPluginType()) +
wxT("_") +
plug.GetEffectFamily() + // is empty for non-Effects
wxT("_") +
plug.GetVendor() +
wxT("_") +
(shared ? wxString{} : plug.GetSymbol().Internal());
return SETROOT +
ConvertID(id) +
wxCONFIG_PATH_SEPARATOR +
(shared ? wxT("shared") : wxT("private")) +
wxCONFIG_PATH_SEPARATOR;
} }
const PluginDescriptor & plug = mPlugins[ID];
wxString id = GetPluginTypeString(plug.GetPluginType()) +
wxT("_") +
plug.GetEffectFamily() + // is empty for non-Effects
wxT("_") +
plug.GetVendor() +
wxT("_") +
(shared ? wxString{} : plug.GetSymbol().Internal());
return SETROOT +
ConvertID(id) +
wxCONFIG_PATH_SEPARATOR +
(shared ? wxT("shared") : wxT("private")) +
wxCONFIG_PATH_SEPARATOR;
} }
/* Return value is a key for lookup in a config file */ /* Return value is a key for lookup in a config file */