2009-12-20 Tatsuhiro Tsujikawa <t-tujikawa@users.sourceforge.net>

Sort _optionHandlers in OptionParser by name in ascending order.
	Use vector instead of deque for efficiency.
	* src/OptionHandler.h
	* src/OptionHandlerFactory.h
	* src/OptionParser.cc
	* src/OptionParser.h
	* src/version_usage.cc
	* test/OptionParserTest.cc
pull/1/head
Tatsuhiro Tsujikawa 2009-12-20 14:25:51 +00:00
parent 6c6e7f2c51
commit e77e1ec24d
7 changed files with 129 additions and 72 deletions

View File

@ -1,3 +1,14 @@
2009-12-20 Tatsuhiro Tsujikawa <t-tujikawa@users.sourceforge.net>
Sort _optionHandlers in OptionParser by name in ascending order.
Use vector instead of deque for efficiency.
* src/OptionHandler.h
* src/OptionHandlerFactory.h
* src/OptionParser.cc
* src/OptionParser.h
* src/version_usage.cc
* test/OptionParserTest.cc
2009-12-20 Tatsuhiro Tsujikawa <t-tujikawa@users.sourceforge.net> 2009-12-20 Tatsuhiro Tsujikawa <t-tujikawa@users.sourceforge.net>
Code cleanup Code cleanup

View File

@ -38,7 +38,7 @@
#include "common.h" #include "common.h"
#include <string> #include <string>
#include <deque> #include <vector>
#include <iosfwd> #include <iosfwd>
#include "SharedHandle.h" #include "SharedHandle.h"
@ -87,8 +87,30 @@ public:
virtual void setOptionID(int id) = 0; virtual void setOptionID(int id) = 0;
}; };
class OptionHandlerNameLesser:public std::binary_function
<SharedHandle<OptionHandler>, SharedHandle<OptionHandler>, bool> {
public:
bool operator()
(const SharedHandle<OptionHandler>& lhs,
const SharedHandle<OptionHandler>& rhs) const
{
return lhs->getName() < rhs->getName();
}
};
class OptionHandlerIDLesser:public std::binary_function
<SharedHandle<OptionHandler>, SharedHandle<OptionHandler>, bool> {
public:
bool operator()
(const SharedHandle<OptionHandler>& lhs,
const SharedHandle<OptionHandler>& rhs) const
{
return lhs->getOptionID() < rhs->getOptionID();
}
};
typedef SharedHandle<OptionHandler> OptionHandlerHandle; typedef SharedHandle<OptionHandler> OptionHandlerHandle;
typedef std::deque<OptionHandlerHandle> OptionHandlers; typedef std::vector<OptionHandlerHandle> OptionHandlers;
std::ostream& operator<<(std::ostream& o, const OptionHandler& optionHandler); std::ostream& operator<<(std::ostream& o, const OptionHandler& optionHandler);

View File

@ -36,8 +36,10 @@
#define _D_OPTION_HANDLER_FACTORY_H_ #define _D_OPTION_HANDLER_FACTORY_H_
#include "common.h" #include "common.h"
#include <vector>
#include "SharedHandle.h" #include "SharedHandle.h"
#include <deque>
namespace aria2 { namespace aria2 {
@ -45,7 +47,7 @@ class OptionHandler;
class OptionHandlerFactory { class OptionHandlerFactory {
public: public:
static std::deque<SharedHandle<OptionHandler> > createOptionHandlers(); static std::vector<SharedHandle<OptionHandler> > createOptionHandlers();
}; };
} // namespace aria2 } // namespace aria2

View File

@ -172,36 +172,58 @@ void OptionParser::parse(Option& option, std::istream& is)
} }
} }
OptionHandlerHandle OptionParser::getOptionHandlerByName(const std::string& optName) class DummyOptionHandler:public NameMatchOptionHandler {
{ protected:
for(OptionHandlers::iterator itr = _optionHandlers.begin(); virtual void parseArg(Option& option, const std::string& arg) {}
itr != _optionHandlers.end(); ++itr) { public:
if((*itr)->canHandle(optName)) { DummyOptionHandler(const std::string& name):NameMatchOptionHandler(name) {}
return *itr;
} virtual std::string createPossibleValuesString() const
{
return A2STR::NIL;
} }
return SharedHandle<OptionHandler>(new NullOptionHandler()); };
OptionHandlerHandle OptionParser::getOptionHandlerByName
(const std::string& optName)
{
SharedHandle<OptionHandler> handler(new DummyOptionHandler(optName));
std::vector<SharedHandle<OptionHandler> >::const_iterator i =
std::lower_bound(_optionHandlers.begin(), _optionHandlers.end(),
handler, OptionHandlerNameLesser());
if(i == _optionHandlers.end()) {
handler.reset(new NullOptionHandler());
} else {
handler = *i;
}
return handler;
} }
void OptionParser::setOptionHandlers(const std::deque<SharedHandle<OptionHandler> >& optionHandlers) void OptionParser::setOptionHandlers
(const std::vector<SharedHandle<OptionHandler> >& optionHandlers)
{ {
_optionHandlers = optionHandlers; _optionHandlers = optionHandlers;
for(std::deque<SharedHandle<OptionHandler> >::iterator i = for(std::vector<SharedHandle<OptionHandler> >::iterator i =
_optionHandlers.begin(); i != _optionHandlers.end(); ++i) { _optionHandlers.begin(); i != _optionHandlers.end(); ++i) {
(*i)->setOptionID(++_idCounter); (*i)->setOptionID(++_idCounter);
} }
std::sort(_optionHandlers.begin(), _optionHandlers.end(),
OptionHandlerNameLesser());
} }
void OptionParser::addOptionHandler void OptionParser::addOptionHandler
(const SharedHandle<OptionHandler>& optionHandler) (const SharedHandle<OptionHandler>& optionHandler)
{ {
optionHandler->setOptionID(++_idCounter); optionHandler->setOptionID(++_idCounter);
_optionHandlers.push_back(optionHandler); std::vector<SharedHandle<OptionHandler> >::iterator i =
std::lower_bound(_optionHandlers.begin(), _optionHandlers.end(),
optionHandler, OptionHandlerNameLesser());
_optionHandlers.insert(i, optionHandler);
} }
void OptionParser::parseDefaultValues(Option& option) const void OptionParser::parseDefaultValues(Option& option) const
{ {
for(std::deque<SharedHandle<OptionHandler> >::const_iterator i = for(std::vector<SharedHandle<OptionHandler> >::const_iterator i =
_optionHandlers.begin(); i != _optionHandlers.end(); ++i) { _optionHandlers.begin(); i != _optionHandlers.end(); ++i) {
if(!(*i)->getDefaultValue().empty()) { if(!(*i)->getDefaultValue().empty()) {
(*i)->parse(option, (*i)->getDefaultValue()); (*i)->parse(option, (*i)->getDefaultValue());
@ -209,12 +231,12 @@ void OptionParser::parseDefaultValues(Option& option) const
} }
} }
class FindByTag : class FindOptionHandlerByTag :
public std::unary_function<SharedHandle<OptionHandler>, bool> { public std::unary_function<SharedHandle<OptionHandler>, bool> {
private: private:
std::string _tag; std::string _tag;
public: public:
FindByTag(const std::string& tag):_tag(tag) {} FindOptionHandlerByTag(const std::string& tag):_tag(tag) {}
bool operator()(const SharedHandle<OptionHandler>& optionHandler) const bool operator()(const SharedHandle<OptionHandler>& optionHandler) const
{ {
@ -222,22 +244,24 @@ public:
} }
}; };
std::deque<SharedHandle<OptionHandler> > std::vector<SharedHandle<OptionHandler> >
OptionParser::findByTag(const std::string& tag) const OptionParser::findByTag(const std::string& tag) const
{ {
std::deque<SharedHandle<OptionHandler> > result; std::vector<SharedHandle<OptionHandler> > result;
std::remove_copy_if(_optionHandlers.begin(), _optionHandlers.end(), std::remove_copy_if(_optionHandlers.begin(), _optionHandlers.end(),
std::back_inserter(result), std::back_inserter(result),
std::not1(FindByTag(tag))); std::not1(FindOptionHandlerByTag(tag)));
std::sort(result.begin(), result.end(), OptionHandlerIDLesser());
return result; return result;
} }
class FindByNameSubstring : class FindOptionHandlerByNameSubstring :
public std::unary_function<SharedHandle<OptionHandler> , bool> { public std::unary_function<SharedHandle<OptionHandler> , bool> {
private: private:
std::string _substring; std::string _substring;
public: public:
FindByNameSubstring(const std::string& substring):_substring(substring) {} FindOptionHandlerByNameSubstring
(const std::string& substring):_substring(substring) {}
bool operator()(const SharedHandle<OptionHandler>& optionHandler) const bool operator()(const SharedHandle<OptionHandler>& optionHandler) const
{ {
@ -246,22 +270,24 @@ public:
} }
}; };
std::deque<SharedHandle<OptionHandler> > std::vector<SharedHandle<OptionHandler> >
OptionParser::findByNameSubstring(const std::string& substring) const OptionParser::findByNameSubstring(const std::string& substring) const
{ {
std::deque<SharedHandle<OptionHandler> > result; std::vector<SharedHandle<OptionHandler> > result;
std::remove_copy_if(_optionHandlers.begin(), _optionHandlers.end(), std::remove_copy_if(_optionHandlers.begin(), _optionHandlers.end(),
std::back_inserter(result), std::back_inserter(result),
std::not1(FindByNameSubstring(substring))); std::not1(FindOptionHandlerByNameSubstring(substring)));
std::sort(result.begin(), result.end(), OptionHandlerIDLesser());
return result; return result;
} }
std::deque<SharedHandle<OptionHandler> > OptionParser::findAll() const std::vector<SharedHandle<OptionHandler> > OptionParser::findAll() const
{ {
std::deque<SharedHandle<OptionHandler> > result; std::vector<SharedHandle<OptionHandler> > result;
std::remove_copy_if(_optionHandlers.begin(), _optionHandlers.end(), std::remove_copy_if(_optionHandlers.begin(), _optionHandlers.end(),
std::back_inserter(result), std::back_inserter(result),
mem_fun_sh(&OptionHandler::isHidden)); mem_fun_sh(&OptionHandler::isHidden));
std::sort(result.begin(), result.end(), OptionHandlerIDLesser());
return result; return result;
} }
@ -269,39 +295,35 @@ template<typename InputIterator, typename Predicate>
static SharedHandle<OptionHandler> findOptionHandler static SharedHandle<OptionHandler> findOptionHandler
(InputIterator first, InputIterator last, Predicate pred) (InputIterator first, InputIterator last, Predicate pred)
{ {
SharedHandle<OptionHandler> handler;
InputIterator i = std::find_if(first, last, pred); InputIterator i = std::find_if(first, last, pred);
if(i == last) { if(i != last) {
return SharedHandle<OptionHandler>(); handler = *i;
} else {
return *i;
} }
return handler;
} }
class FindByName :
public std::unary_function<SharedHandle<OptionHandler> , bool> {
private:
std::string _name;
public:
FindByName(const std::string& name):_name(name) {}
bool operator()(const SharedHandle<OptionHandler>& optionHandler) const
{
return !optionHandler->isHidden() && optionHandler->getName() == _name;
}
};
SharedHandle<OptionHandler> SharedHandle<OptionHandler>
OptionParser::findByName(const std::string& name) const OptionParser::findByName(const std::string& name) const
{ {
return findOptionHandler(_optionHandlers.begin(), _optionHandlers.end(), SharedHandle<OptionHandler> handler(new DummyOptionHandler(name));
FindByName(name)); std::vector<SharedHandle<OptionHandler> >::const_iterator i =
std::lower_bound(_optionHandlers.begin(), _optionHandlers.end(),
handler, OptionHandlerNameLesser());
if(i == _optionHandlers.end() || (*i)->isHidden()) {
handler.reset();
} else {
handler = *i;
}
return handler;
} }
class FindByID:public std::unary_function<SharedHandle<OptionHandler>, bool> { class FindOptionHandlerByID:public std::unary_function
<SharedHandle<OptionHandler>, bool> {
private: private:
int _id; int _id;
public: public:
FindByID(int id):_id(id) {} FindOptionHandlerByID(int id):_id(id) {}
bool operator()(const SharedHandle<OptionHandler>& optionHandler) const bool operator()(const SharedHandle<OptionHandler>& optionHandler) const
{ {
@ -312,15 +334,15 @@ public:
SharedHandle<OptionHandler> OptionParser::findByID(int id) const SharedHandle<OptionHandler> OptionParser::findByID(int id) const
{ {
return findOptionHandler(_optionHandlers.begin(), _optionHandlers.end(), return findOptionHandler(_optionHandlers.begin(), _optionHandlers.end(),
FindByID(id)); FindOptionHandlerByID(id));
} }
class FindByShortName: class FindOptionHandlerByShortName:
public std::unary_function<SharedHandle<OptionHandler>, bool> { public std::unary_function<SharedHandle<OptionHandler>, bool> {
private: private:
char _shortName; char _shortName;
public: public:
FindByShortName(char shortName):_shortName(shortName) {} FindOptionHandlerByShortName(char shortName):_shortName(shortName) {}
bool operator()(const SharedHandle<OptionHandler>& optionHandler) const bool operator()(const SharedHandle<OptionHandler>& optionHandler) const
{ {
@ -332,16 +354,10 @@ public:
SharedHandle<OptionHandler> OptionParser::findByShortName(char shortName) const SharedHandle<OptionHandler> OptionParser::findByShortName(char shortName) const
{ {
return findOptionHandler(_optionHandlers.begin(), _optionHandlers.end(), return findOptionHandler(_optionHandlers.begin(), _optionHandlers.end(),
FindByShortName(shortName)); FindOptionHandlerByShortName(shortName));
} }
const std::deque<SharedHandle<OptionHandler> >&
OptionParser::getOptionHandlers() const
{
return _optionHandlers;
}
SharedHandle<OptionParser> OptionParser::_optionParser; SharedHandle<OptionParser> OptionParser::_optionParser;
SharedHandle<OptionParser> OptionParser::getInstance() SharedHandle<OptionParser> OptionParser::getInstance()

View File

@ -39,6 +39,7 @@
#include <string> #include <string>
#include <deque> #include <deque>
#include <vector>
#include <iosfwd> #include <iosfwd>
#include "SharedHandle.h" #include "SharedHandle.h"
@ -52,7 +53,9 @@ class OptionParser {
private: private:
int _idCounter; int _idCounter;
std::deque<SharedHandle<OptionHandler> > _optionHandlers; // _optionHandlers is sorted by OptionHandler::getName() in
// ascending order.
std::vector<SharedHandle<OptionHandler> > _optionHandlers;
SharedHandle<OptionHandler> SharedHandle<OptionHandler>
getOptionHandlerByName(const std::string& optName); getOptionHandlerByName(const std::string& optName);
@ -74,27 +77,31 @@ public:
void parseDefaultValues(Option& option) const; void parseDefaultValues(Option& option) const;
void setOptionHandlers void setOptionHandlers
(const std::deque<SharedHandle<OptionHandler> >& optionHandlers); (const std::vector<SharedHandle<OptionHandler> >& optionHandlers);
void addOptionHandler(const SharedHandle<OptionHandler>& optionHandler); void addOptionHandler(const SharedHandle<OptionHandler>& optionHandler);
std::deque<SharedHandle<OptionHandler> > // Hidden options are not returned.
std::vector<SharedHandle<OptionHandler> >
findByTag(const std::string& tag) const; findByTag(const std::string& tag) const;
std::deque<SharedHandle<OptionHandler> > // Hidden options are not returned.
std::vector<SharedHandle<OptionHandler> >
findByNameSubstring(const std::string& substring) const; findByNameSubstring(const std::string& substring) const;
std::deque<SharedHandle<OptionHandler> > findAll() const; // Hidden options are not returned.
std::vector<SharedHandle<OptionHandler> > findAll() const;
// Hidden options are not returned.
SharedHandle<OptionHandler> SharedHandle<OptionHandler>
findByName(const std::string& name) const; findByName(const std::string& name) const;
// Hidden options are not returned.
SharedHandle<OptionHandler> findByID(int id) const; SharedHandle<OptionHandler> findByID(int id) const;
// Hidden options are not returned.
SharedHandle<OptionHandler> findByShortName(char shortName) const; SharedHandle<OptionHandler> findByShortName(char shortName) const;
const std::deque<SharedHandle<OptionHandler> >& getOptionHandlers() const;
static SharedHandle<OptionParser> getInstance(); static SharedHandle<OptionParser> getInstance();
}; };

View File

@ -86,7 +86,7 @@ void showUsage(const std::string& keyword, const OptionParser& oparser) {
" METALINK_FILE]...") << "\n" " METALINK_FILE]...") << "\n"
<< "\n"; << "\n";
if(util::startsWith(keyword, "#")) { if(util::startsWith(keyword, "#")) {
std::deque<SharedHandle<OptionHandler> > handlers = std::vector<SharedHandle<OptionHandler> > handlers =
keyword == TAG_ALL ? oparser.findAll():oparser.findByTag(keyword); keyword == TAG_ALL ? oparser.findAll():oparser.findByTag(keyword);
if(keyword == TAG_ALL) { if(keyword == TAG_ALL) {
std::cout << _("Printing all options."); std::cout << _("Printing all options.");
@ -106,7 +106,7 @@ void showUsage(const std::string& keyword, const OptionParser& oparser) {
std::ostream_iterator<SharedHandle<OptionHandler> > std::ostream_iterator<SharedHandle<OptionHandler> >
(std::cout, "\n\n")); (std::cout, "\n\n"));
} else { } else {
std::deque<SharedHandle<OptionHandler> > handlers = std::vector<SharedHandle<OptionHandler> > handlers =
oparser.findByNameSubstring(keyword); oparser.findByNameSubstring(keyword);
if(!handlers.empty()) { if(!handlers.empty()) {
std::cout << StringFormat(_("Printing options whose name includes" std::cout << StringFormat(_("Printing options whose name includes"

View File

@ -2,7 +2,6 @@
#include <cstring> #include <cstring>
#include <sstream> #include <sstream>
#include <deque>
#include <cppunit/extensions/HelperMacros.h> #include <cppunit/extensions/HelperMacros.h>
@ -75,7 +74,7 @@ CPPUNIT_TEST_SUITE_REGISTRATION(OptionParserTest);
void OptionParserTest::testFindAll() void OptionParserTest::testFindAll()
{ {
std::deque<SharedHandle<OptionHandler> > res = _oparser->findAll(); std::vector<SharedHandle<OptionHandler> > res = _oparser->findAll();
CPPUNIT_ASSERT_EQUAL((size_t)3, res.size()); CPPUNIT_ASSERT_EQUAL((size_t)3, res.size());
CPPUNIT_ASSERT_EQUAL(std::string("alpha"), res[0]->getName()); CPPUNIT_ASSERT_EQUAL(std::string("alpha"), res[0]->getName());
CPPUNIT_ASSERT_EQUAL(std::string("bravo"), res[1]->getName()); CPPUNIT_ASSERT_EQUAL(std::string("bravo"), res[1]->getName());
@ -84,7 +83,7 @@ void OptionParserTest::testFindAll()
void OptionParserTest::testFindByNameSubstring() void OptionParserTest::testFindByNameSubstring()
{ {
std::deque<SharedHandle<OptionHandler> > res = std::vector<SharedHandle<OptionHandler> > res =
_oparser->findByNameSubstring("l"); _oparser->findByNameSubstring("l");
CPPUNIT_ASSERT_EQUAL((size_t)2, res.size()); CPPUNIT_ASSERT_EQUAL((size_t)2, res.size());
CPPUNIT_ASSERT_EQUAL(std::string("alpha"), res[0]->getName()); CPPUNIT_ASSERT_EQUAL(std::string("alpha"), res[0]->getName());
@ -93,7 +92,7 @@ void OptionParserTest::testFindByNameSubstring()
void OptionParserTest::testFindByTag() void OptionParserTest::testFindByTag()
{ {
std::deque<SharedHandle<OptionHandler> > res = std::vector<SharedHandle<OptionHandler> > res =
_oparser->findByTag("pineapple"); _oparser->findByTag("pineapple");
CPPUNIT_ASSERT_EQUAL((size_t)2, res.size()); CPPUNIT_ASSERT_EQUAL((size_t)2, res.size());
CPPUNIT_ASSERT_EQUAL(std::string("bravo"), res[0]->getName()); CPPUNIT_ASSERT_EQUAL(std::string("bravo"), res[0]->getName());