Performance

- It it not necessary to make a copy of all configuration variable names, if the
  Config::const_iterator is sufficient.

(cherry picked from commit 5708cb90780f1f6c8f58f5b549796c4af612b1ab)
This commit is contained in:
Paul Beckingham 2013-05-26 11:40:18 -04:00
parent c16a735040
commit 7b89bc92e1
10 changed files with 95 additions and 128 deletions

View file

@ -105,25 +105,21 @@ void Hooks::initialize ()
bool big_red_switch = context.config.getBoolean ("extensions"); bool big_red_switch = context.config.getBoolean ("extensions");
if (big_red_switch) if (big_red_switch)
{ {
std::vector <std::string> vars; Config::const_iterator it;
context.config.all (vars); for (it = context.config.begin (); it != context.config.end (); ++it)
std::vector <std::string>::iterator it;
for (it = vars.begin (); it != vars.end (); ++it)
{ {
std::string type; std::string type;
std::string name; std::string name;
std::string value; std::string value;
// "<type>.<name>" // "<type>.<name>"
Nibbler n (*it); Nibbler n (it->first);
if (n.getUntil ('.', type) && if (n.getUntil ('.', type) &&
type == "hook" && type == "hook" &&
n.skip ('.') && n.skip ('.') &&
n.getUntilEOS (name)) n.getUntilEOS (name))
{ {
std::string value = context.config.get (*it); Nibbler n (it->second);
Nibbler n (value);
// <path>:<function> [, ...] // <path>:<function> [, ...]
while (!n.depleted ()) while (!n.depleted ())
@ -141,7 +137,7 @@ void Hooks::initialize ()
(void) n.skip (','); (void) n.skip (',');
} }
else else
; // Was: throw std::string (format ("Malformed hook definition '{1}'.", *it)); ; // Was: throw std::string (format ("Malformed hook definition '{1}'.", it->first));
} }
} }
} }

View file

@ -1316,19 +1316,16 @@ void Task::validate (bool applyDefault /* = true */)
if (applyDefault) if (applyDefault)
{ {
// Gather a list of all UDAs with a .default value // Gather a list of all UDAs with a .default value
std::vector <std::string> names;
context.config.all (names);
std::vector <std::string> udas; std::vector <std::string> udas;
std::vector <std::string>::iterator name; Config::const_iterator var;
for (name = names.begin (); name != names.end (); ++name) for (var = context.config.begin (); var != context.config.end (); ++var)
{ {
if (name->substr (0, 4) == "uda." && if (var->first.substr (0, 4) == "uda." &&
name->find (".default") != std::string::npos) var->first.find (".default") != std::string::npos)
{ {
std::string::size_type period = name->find ('.', 4); std::string::size_type period = var->first.find ('.', 4);
if (period != std::string::npos) if (period != std::string::npos)
udas.push_back (name->substr (4, period - 4)); udas.push_back (var->first.substr (4, period - 4));
} }
} }

View file

@ -151,17 +151,15 @@ void Column::uda (std::map <std::string, Column*>& all)
{ {
// For each UDA, instantiate and initialize ColumnUDA(). // For each UDA, instantiate and initialize ColumnUDA().
std::map <std::string, int> udas; std::map <std::string, int> udas;
std::vector <std::string> names;
context.config.all (names);
std::vector <std::string>::iterator i; Config::const_iterator i;
for (i = names.begin (); i != names.end (); ++i) for (i = context.config.begin (); i != context.config.end (); ++i)
{ {
if (i->substr (0, 4) == "uda.") if (i->first.substr (0, 4) == "uda.")
{ {
std::string::size_type period = 4; std::string::size_type period = 4;
if ((period = i->find ('.', period)) != std::string::npos) if ((period = i->first.find ('.', period)) != std::string::npos)
udas[i->substr (4, period - 4)] = 0; udas[i->first.substr (4, period - 4)] = 0;
} }
} }

View file

@ -351,22 +351,19 @@ int CmdCalendar::execute (std::string& output)
// Table with holiday information // Table with holiday information
if (context.config.get ("calendar.holidays") == "full") if (context.config.get ("calendar.holidays") == "full")
{ {
std::vector <std::string> holidays;
context.config.all (holidays);
ViewText holTable; ViewText holTable;
holTable.width (context.getWidth ()); holTable.width (context.getWidth ());
holTable.add (Column::factory ("string", STRING_CMD_CAL_LABEL_DATE)); holTable.add (Column::factory ("string", STRING_CMD_CAL_LABEL_DATE));
holTable.add (Column::factory ("string", STRING_CMD_CAL_LABEL_HOL)); holTable.add (Column::factory ("string", STRING_CMD_CAL_LABEL_HOL));
std::vector <std::string>::iterator it; Config::const_iterator it;
std::map <time_t, std::vector<std::string> > hm; // we need to store multiple holidays per day std::map <time_t, std::vector<std::string> > hm; // we need to store multiple holidays per day
for (it = holidays.begin (); it != holidays.end (); ++it) for (it = context.config.begin (); it != context.config.end (); ++it)
if (it->substr (0, 8) == "holiday.") if (it->first.substr (0, 8) == "holiday.")
if (it->substr (it->size () - 4) == "name") if (it->first.substr (it->first.size () - 4) == "name")
{ {
std::string holName = context.config.get ("holiday." + it->substr (8, it->size () - 13) + ".name"); std::string holName = context.config.get ("holiday." + it->first.substr (8, it->first.size () - 13) + ".name");
std::string holDate = context.config.get ("holiday." + it->substr (8, it->size () - 13) + ".date"); std::string holDate = context.config.get ("holiday." + it->first.substr (8, it->first.size () - 13) + ".date");
Date hDate (holDate.c_str (), context.config.get ("dateformat.holiday")); Date hDate (holDate.c_str (), context.config.get ("dateformat.holiday"));
if (date_after < hDate && hDate < date_before) if (date_after < hDate && hDate < date_before)
@ -526,14 +523,12 @@ std::string CmdCalendar::renderMonths (
// colorize holidays // colorize holidays
if (context.config.get ("calendar.holidays") != "none") if (context.config.get ("calendar.holidays") != "none")
{ {
std::vector <std::string> holidays; Config::const_iterator hol;
context.config.all (holidays); for (hol = context.config.begin (); hol != context.config.end (); ++hol)
std::vector <std::string>::iterator hol; if (hol->first.substr (0, 8) == "holiday.")
for (hol = holidays.begin (); hol != holidays.end (); ++hol) if (hol->first.substr (hol->first.size () - 4) == "date")
if (hol->substr (0, 8) == "holiday.")
if (hol->substr (hol->size () - 4) == "date")
{ {
std::string value = context.config.get (*hol); std::string value = hol->second;
Date holDate (value.c_str (), context.config.get ("dateformat.holiday")); Date holDate (value.c_str (), context.config.get ("dateformat.holiday"));
if (holDate.day () == d && if (holDate.day () == d &&
holDate.month () == months[mpl] && holDate.month () == months[mpl] &&

View file

@ -69,27 +69,24 @@ int CmdColor::execute (std::string& output)
{ {
out << "\n" << STRING_CMD_COLOR_HERE << "\n"; out << "\n" << STRING_CMD_COLOR_HERE << "\n";
std::vector <std::string> all;
context.config.all (all);
ViewText view; ViewText view;
view.width (context.getWidth ()); view.width (context.getWidth ());
view.add (Column::factory ("string", STRING_CMD_COLOR_COLOR)); view.add (Column::factory ("string", STRING_CMD_COLOR_COLOR));
view.add (Column::factory ("string", STRING_CMD_COLOR_DEFINITION)); view.add (Column::factory ("string", STRING_CMD_COLOR_DEFINITION));
std::vector <std::string>::iterator item; Config::const_iterator item;
for (item = all.begin (); item != all.end (); ++item) for (item = context.config.begin (); item != context.config.end (); ++item)
{ {
// Skip items with 'color' in their name, that are not referring to // Skip items with 'color' in their name, that are not referring to
// actual colors. // actual colors.
if (*item != "_forcecolor" && if (item->first != "_forcecolor" &&
*item != "color" && item->first != "color" &&
item->find ("color") == 0) item->first.find ("color") == 0)
{ {
Color color (context.config.get (*item)); Color color (context.config.get (item->first));
int row = view.addRow (); int row = view.addRow ();
view.set (row, 0, *item, color); view.set (row, 0, item->first, color);
view.set (row, 1, context.config.get (*item), color); view.set (row, 1, item->second, color);
} }
} }

View file

@ -51,15 +51,12 @@ int CmdReports::execute (std::string& output)
std::vector <std::string> reports; std::vector <std::string> reports;
// Add custom reports. // Add custom reports.
std::vector <std::string> vars; Config::const_iterator i;
context.config.all (vars); for (i = context.config.begin (); i != context.config.end (); ++i)
std::vector <std::string>::iterator i;
for (i = vars.begin (); i != vars.end (); ++i)
{ {
if (i->substr (0, 7) == "report.") if (i->first.substr (0, 7) == "report.")
{ {
std::string report = i->substr (7); std::string report = i->first.substr (7);
std::string::size_type columns = report.find (".columns"); std::string::size_type columns = report.find (".columns");
if (columns != std::string::npos) if (columns != std::string::npos)
reports.push_back (report.substr (0, columns)); reports.push_back (report.substr (0, columns));

View file

@ -214,38 +214,35 @@ int CmdShow::execute (std::string& output)
// is redirected to a file, or stdout is not a tty. // is redirected to a file, or stdout is not a tty.
recognized += "_forcecolor "; recognized += "_forcecolor ";
std::vector <std::string> all;
context.config.all (all);
std::vector <std::string> unrecognized; std::vector <std::string> unrecognized;
std::vector <std::string>::iterator i; Config::const_iterator i;
for (i = all.begin (); i != all.end (); ++i) for (i = context.config.begin (); i != context.config.end (); ++i)
{ {
// Disallow partial matches by tacking a leading and trailing space on each // Disallow partial matches by tacking a leading and trailing space on each
// variable name. // variable name.
std::string pattern = " " + *i + " "; std::string pattern = " " + i->first + " ";
if (recognized.find (pattern) == std::string::npos) if (recognized.find (pattern) == std::string::npos)
{ {
// These are special configuration variables, because their name is // These are special configuration variables, because their name is
// dynamic. // dynamic.
if (i->substr (0, 14) != "color.keyword." && if (i->first.substr (0, 14) != "color.keyword." &&
i->substr (0, 14) != "color.project." && i->first.substr (0, 14) != "color.project." &&
i->substr (0, 10) != "color.tag." && i->first.substr (0, 10) != "color.tag." &&
i->substr (0, 10) != "color.uda." && i->first.substr (0, 10) != "color.uda." &&
i->substr (0, 8) != "holiday." && i->first.substr (0, 8) != "holiday." &&
i->substr (0, 7) != "report." && i->first.substr (0, 7) != "report." &&
i->substr (0, 6) != "alias." && i->first.substr (0, 6) != "alias." &&
i->substr (0, 5) != "hook." && i->first.substr (0, 5) != "hook." &&
i->substr (0, 5) != "push." && i->first.substr (0, 5) != "push." &&
i->substr (0, 5) != "pull." && i->first.substr (0, 5) != "pull." &&
i->substr (0, 6) != "merge." && i->first.substr (0, 6) != "merge." &&
i->substr (0, 4) != "uda." && i->first.substr (0, 4) != "uda." &&
i->substr (0, 4) != "default." && i->first.substr (0, 4) != "default." &&
i->substr (0, 21) != "urgency.user.project." && i->first.substr (0, 21) != "urgency.user.project." &&
i->substr (0, 17) != "urgency.user.tag." && i->first.substr (0, 17) != "urgency.user.tag." &&
i->substr (0, 12) != "urgency.uda.") i->first.substr (0, 12) != "urgency.uda.")
{ {
unrecognized.push_back (*i); unrecognized.push_back (i->first);
} }
} }
} }
@ -255,9 +252,9 @@ int CmdShow::execute (std::string& output)
Config default_config; Config default_config;
default_config.setDefaults (); default_config.setDefaults ();
for (i = all.begin (); i != all.end (); ++i) for (i = context.config.begin (); i != context.config.end (); ++i)
if (context.config.get (*i) != default_config.get (*i)) if (i->second != default_config.get (i->first))
default_values.push_back (*i); default_values.push_back (i->first);
// Create output view. // Create output view.
ViewText view; ViewText view;
@ -281,29 +278,29 @@ int CmdShow::execute (std::string& output)
section = ""; section = "";
std::string::size_type loc; std::string::size_type loc;
for (i = all.begin (); i != all.end (); ++i) for (i = context.config.begin (); i != context.config.end (); ++i)
{ {
loc = i->find (section, 0); loc = i->first.find (section, 0);
if (loc != std::string::npos) if (loc != std::string::npos)
{ {
// Look for unrecognized. // Look for unrecognized.
Color color; Color color;
if (std::find (unrecognized.begin (), unrecognized.end (), *i) != unrecognized.end ()) if (std::find (unrecognized.begin (), unrecognized.end (), i->first) != unrecognized.end ())
{ {
issue_error = true; issue_error = true;
color = error; color = error;
} }
else if (std::find (default_values.begin (), default_values.end (), *i) != default_values.end ()) else if (std::find (default_values.begin (), default_values.end (), i->first) != default_values.end ())
{ {
issue_warning = true; issue_warning = true;
color = warning; color = warning;
} }
std::string value = context.config.get (*i); std::string value = i->second;
// hide sensible information // hide sensible information
if ( (i->substr (0, 5) == "push." || if ( (i->first.substr (0, 5) == "push." ||
i->substr (0, 5) == "pull." || i->first.substr (0, 5) == "pull." ||
i->substr (0, 6) == "merge.") && (i->find (".uri") != std::string::npos) ) { i->first.substr (0, 6) == "merge.") && (i->first.find (".uri") != std::string::npos) ) {
Uri uri (value); Uri uri (value);
uri.parse (); uri.parse ();
@ -311,7 +308,7 @@ int CmdShow::execute (std::string& output)
} }
int row = view.addRow (); int row = view.addRow ();
view.set (row, 0, *i, color); view.set (row, 0, i->first, color);
view.set (row, 1, value, color); view.set (row, 1, value, color);
} }
} }
@ -336,6 +333,7 @@ int CmdShow::execute (std::string& output)
{ {
out << STRING_CMD_SHOW_UNREC << "\n"; out << STRING_CMD_SHOW_UNREC << "\n";
std::vector <std::string>::iterator i;
for (i = unrecognized.begin (); i != unrecognized.end (); ++i) for (i = unrecognized.begin (); i != unrecognized.end (); ++i)
out << " " << *i << "\n"; out << " " << *i << "\n";
@ -381,7 +379,7 @@ int CmdShow::execute (std::string& output)
// Verify installation. This is mentioned in the documentation as the way // Verify installation. This is mentioned in the documentation as the way
// to ensure everything is properly installed. // to ensure everything is properly installed.
if (all.size () == 0) if (context.config.size () == 0)
{ {
out << STRING_CMD_SHOW_EMPTY << "\n"; out << STRING_CMD_SHOW_EMPTY << "\n";
rc = 1; rc = 1;

View file

@ -53,19 +53,16 @@ int CmdUDAs::execute (std::string& output)
int rc = 0; int rc = 0;
std::stringstream out; std::stringstream out;
std::vector <std::string> names;
context.config.all (names);
std::vector <std::string> udas; std::vector <std::string> udas;
std::vector <std::string>::iterator name; Config::const_iterator name;
for (name = names.begin (); name != names.end (); ++name) for (name = context.config.begin (); name != context.config.end (); ++name)
{ {
if (name->substr (0, 4) == "uda." && if (name->first.substr (0, 4) == "uda." &&
name->find (".type") != std::string::npos) name->first.find (".type") != std::string::npos)
{ {
std::string::size_type period = name->find ('.', 4); std::string::size_type period = name->first.find ('.', 4);
if (period != std::string::npos) if (period != std::string::npos)
udas.push_back (name->substr (4, period - 4)); udas.push_back (name->first.substr (4, period - 4));
} }
} }
@ -182,19 +179,16 @@ CmdCompletionUDAs::CmdCompletionUDAs ()
//////////////////////////////////////////////////////////////////////////////// ////////////////////////////////////////////////////////////////////////////////
int CmdCompletionUDAs::execute (std::string& output) int CmdCompletionUDAs::execute (std::string& output)
{ {
std::vector <std::string> names;
context.config.all (names);
std::vector <std::string> udas; std::vector <std::string> udas;
std::vector <std::string>::iterator name; Config::const_iterator name;
for (name = names.begin (); name != names.end (); ++name) for (name = context.config.begin (); name != context.config.end (); ++name)
{ {
if (name->substr (0, 4) == "uda." && if (name->first.substr (0, 4) == "uda." &&
name->find (".type") != std::string::npos) name->first.find (".type") != std::string::npos)
{ {
std::string::size_type period = name->find ('.', 4); std::string::size_type period = name->first.find ('.', 4);
if (period != std::string::npos) if (period != std::string::npos)
udas.push_back (name->substr (4, period - 4)); udas.push_back (name->first.substr (4, period - 4));
} }
} }

View file

@ -168,16 +168,13 @@ void Command::factory (std::map <std::string, Command*>& all)
c = new CmdZshCompletionUuids (); all[c->keyword ()] = c; c = new CmdZshCompletionUuids (); all[c->keyword ()] = c;
// Instantiate a command object for each custom report. // Instantiate a command object for each custom report.
std::vector <std::string> variables;
context.config.all (variables);
std::vector <std::string> reports; std::vector <std::string> reports;
std::vector <std::string>::iterator i; Config::const_iterator i;
for (i = variables.begin (); i != variables.end (); ++i) for (i = context.config.begin (); i != context.config.end (); ++i)
{ {
if (i->substr (0, 7) == "report.") if (i->first.substr (0, 7) == "report.")
{ {
std::string report = i->substr (7); std::string report = i->first.substr (7);
std::string::size_type columns = report.find (".columns"); std::string::size_type columns = report.find (".columns");
if (columns != std::string::npos) if (columns != std::string::npos)
reports.push_back (report.substr (0, columns)); reports.push_back (report.substr (0, columns));

View file

@ -47,17 +47,15 @@ void initializeColorRules ()
// Load all the configuration values, filter to only the ones that begin with // Load all the configuration values, filter to only the ones that begin with
// "color.", then store name/value in gsColor, and name in rules. // "color.", then store name/value in gsColor, and name in rules.
std::vector <std::string> rules; std::vector <std::string> rules;
std::vector <std::string> variables; Config::const_iterator v;
context.config.all (variables); for (v = context.config.begin (); v != context.config.end (); ++v)
std::vector <std::string>::iterator v;
for (v = variables.begin (); v != variables.end (); ++v)
{ {
if (v->substr (0, 6) == "color.") if (v->first.substr (0, 6) == "color.")
{ {
Color c (context.config.get (*v)); Color c (v->second);
gsColor[*v] = c; gsColor[v->first] = c;
rules.push_back (*v); rules.push_back (v->first);
} }
} }