# HG changeset patch # User Florian Pose # Date 1294126791 -3600 # Node ID 0aea9df5fa2148fb5efc249074d00bc6d98e137b # Parent ee4782738e30ab250d2e7f5115dfb5b54e1cabbb Fixed / improved config selection. diff -r ee4782738e30 -r 0aea9df5fa21 tool/Command.cpp --- a/tool/Command.cpp Tue Jan 04 08:36:41 2011 +0100 +++ b/tool/Command.cpp Tue Jan 04 08:39:51 2011 +0100 @@ -38,6 +38,11 @@ /*****************************************************************************/ +typedef map AliasMap; +typedef map ConfigMap; + +/*****************************************************************************/ + class MasterIndexParser: public NumberListParser { @@ -85,27 +90,14 @@ public NumberListParser { public: - ConfigAliasParser(ec_ioctl_master_t &master, MasterDevice &dev): - master(master), dev(dev) {} + ConfigAliasParser(unsigned int maxAlias): + maxAlias(maxAlias) {} protected: - int getMax() { - unsigned int i; - - uint16_t maxAlias = 0; - for (i = 0; i < master.config_count; i++) { - ec_ioctl_config_t config; - dev.getConfig(&config, i); - if (config.alias > maxAlias) { - maxAlias = config.alias; - } - } - return maxAlias ? maxAlias : -1; - }; + int getMax() { return maxAlias; }; private: - ec_ioctl_master_t &master; - MasterDevice &dev; + unsigned int maxAlias; }; /*****************************************************************************/ @@ -128,6 +120,33 @@ /*****************************************************************************/ +class AliasPositionParser: + public NumberListParser +{ + public: + AliasPositionParser(const AliasMap &aliasMap): + aliasMap(aliasMap) {} + + protected: + int getMax() { + AliasMap::const_iterator i; + int maxPos = -1; + + for (i = aliasMap.begin(); i != aliasMap.end(); i++) { + if (i->first > maxPos) { + maxPos = i->first; + } + } + + return maxPos; + }; + + private: + const AliasMap &aliasMap; +}; + +/*****************************************************************************/ + Command::Command(const string &name, const string &briefDesc): name(name), briefDesc(briefDesc), @@ -293,11 +312,13 @@ unsigned int Command::getSingleMasterIndex() const { MasterIndexList masterIndices = getMasterIndices(); + if (masterIndices.size() != 1) { stringstream err; err << getName() << " requires to select a single master!"; throwInvalidUsageException(err); } + return masterIndices.front(); } @@ -316,6 +337,7 @@ PositionParser pp(master.slave_count); NumberListParser::List posList = pp.parse(positions.c_str()); NumberListParser::List::const_iterator pi; + for (pi = posList.begin(); pi != posList.end(); pi++) { m.getSlave(&slave, *pi); list.push_back(slave); @@ -389,50 +411,47 @@ m.getMaster(&master); - if (aliases == "-") { // no alias given - PositionParser pp(master.config_count); - NumberListParser::List posList = pp.parse(positions.c_str()); - NumberListParser::List::const_iterator pi; - for (pi = posList.begin(); pi != posList.end(); pi++) { - m.getConfig(&config, *pi); // FIXME use sorted list + if (aliases == "-" && positions == "-") { // shortcut + for (i = 0; i < master.config_count; i++) { + m.getConfig(&config, i); list.push_back(config); } - } else { // alias given - ConfigAliasParser ap(master, m); + } else { // take the long way home... + ConfigMap configs; + uint16_t maxAlias = 0; + + // fill cascaded map structure with all configs + for (i = 0; i < master.config_count; i++) { + m.getConfig(&config, i); + AliasMap &aliasMap = configs[config.alias]; + aliasMap[config.position] = config; + if (config.alias > maxAlias) { + maxAlias = config.alias; + } + } + + ConfigAliasParser ap(maxAlias); NumberListParser::List aliasList = ap.parse(aliases.c_str()); NumberListParser::List::const_iterator ai; for (ai = aliasList.begin(); ai != aliasList.end(); ai++) { - // gather configs with that alias - map aliasConfigs; - - int maxPos = -1; - for (i = 0; i < master.config_count; i++) { - m.getConfig(&config, i); - if (config.alias == *ai) { - aliasConfigs[config.position] = config; - if (config.position > maxPos) { - maxPos = config.position; - } - } - } - - PositionParser pp(maxPos + 1); + ConfigMap::iterator ci = configs.find(*ai); + if (ci == configs.end()) { + continue; + } + + AliasMap &aliasMap = configs[*ai]; + AliasPositionParser pp(aliasMap); NumberListParser::List posList = pp.parse(positions.c_str()); NumberListParser::List::const_iterator pi; for (pi = posList.begin(); pi != posList.end(); pi++) { - map::const_iterator ci; - ci = aliasConfigs.find(*pi); - - if (ci != aliasConfigs.end()) { + AliasMap::const_iterator ci; + + ci = aliasMap.find(*pi); + if (ci != aliasMap.end()) { list.push_back(ci->second); - } else { - stringstream err; - err << "Warning: Config " << *ai << ":" << *pi - << " does not exist on master " << m.getIndex(); - throwCommandException(err); } } }