From f8241e85c77382c4560ad2c39a86d98587492715 Mon Sep 17 00:00:00 2001 From: Ciaran McCreesh Date: Sat, 26 May 2007 16:02:17 +0000 Subject: New type safe visitor framework --- paludis/args/args_visitor.cc | 96 ++++++++++++++++++++++++++++++-------------- 1 file changed, 66 insertions(+), 30 deletions(-) (limited to 'paludis/args/args_visitor.cc') diff --git a/paludis/args/args_visitor.cc b/paludis/args/args_visitor.cc index 4eb20a418..37066ad6b 100644 --- a/paludis/args/args_visitor.cc +++ b/paludis/args/args_visitor.cc @@ -20,6 +20,7 @@ #include "args_error.hh" #include +#include #include #include #include @@ -35,7 +36,31 @@ */ using namespace paludis; -using namespace args; +using namespace paludis::args; + +template class MutableVisitor; +template class MutableAcceptInterface; + +template class MutableAcceptInterfaceVisitsThis; +template class MutableAcceptInterfaceVisitsThis; +template class MutableAcceptInterfaceVisitsThis; +template class MutableAcceptInterfaceVisitsThis; +template class MutableAcceptInterfaceVisitsThis; +template class MutableAcceptInterfaceVisitsThis; + +template class Visits; +template class Visits; +template class Visits; +template class Visits; +template class Visits; +template class Visits; + +template class Visits; +template class Visits; +template class Visits; +template class Visits; +template class Visits; +template class Visits; ArgsVisitor::ArgsVisitor(libwrapiter::ForwardIterator * ai, libwrapiter::ForwardIterator ae, @@ -47,79 +72,90 @@ ArgsVisitor::ArgsVisitor(libwrapiter::ForwardIterator } const std::string & -ArgsVisitor::get_param(const ArgsOption * const arg) +ArgsVisitor::get_param(const ArgsOption & arg) { if (++(*_args_index) == _args_end) - throw MissingValue("--" + arg->long_name()); + throw MissingValue("--" + arg.long_name()); return **_args_index; } -void ArgsVisitor::visit(ArgsOption * const arg) +void ArgsVisitor::visit(StringArg & arg) { - arg->set_specified(true); + arg.set_specified(true); if (! _env_prefix.empty()) - setenv(env_name(arg->long_name()).c_str(), "1", 1); -} + setenv(env_name(arg.long_name()).c_str(), "1", 1); -void ArgsVisitor::visit(StringArg * const arg) -{ - visit(static_cast(arg)); std::string p(get_param(arg)); - arg->set_argument(p); + arg.set_argument(p); if (! _env_prefix.empty()) - setenv(env_name(arg->long_name()).c_str(), p.c_str(), 1); + setenv(env_name(arg.long_name()).c_str(), p.c_str(), 1); } -void ArgsVisitor::visit(AliasArg * const arg) +void ArgsVisitor::visit(AliasArg & arg) { - arg->other()->accept(this); + arg.other()->accept(*this); } -void ArgsVisitor::visit(SwitchArg * const arg) +void ArgsVisitor::visit(SwitchArg & arg) { - visit(static_cast(arg)); + arg.set_specified(true); + + if (! _env_prefix.empty()) + setenv(env_name(arg.long_name()).c_str(), "1", 1); } -void ArgsVisitor::visit(IntegerArg * const arg) +void ArgsVisitor::visit(IntegerArg & arg) { - visit(static_cast(arg)); + arg.set_specified(true); + + if (! _env_prefix.empty()) + setenv(env_name(arg.long_name()).c_str(), "1", 1); + std::string param = get_param(arg); try { int a(destringify(param)); - arg->set_argument(a); + arg.set_argument(a); if (! _env_prefix.empty()) - setenv(env_name(arg->long_name()).c_str(), stringify(a).c_str(), 1); + setenv(env_name(arg.long_name()).c_str(), stringify(a).c_str(), 1); } catch (const DestringifyError &) { - throw BadValue("--" + arg->long_name(), param); + throw BadValue("--" + arg.long_name(), param); } } -void ArgsVisitor::visit(EnumArg * const arg) +void ArgsVisitor::visit(EnumArg & arg) { - visit(static_cast(arg)); + arg.set_specified(true); + + if (! _env_prefix.empty()) + setenv(env_name(arg.long_name()).c_str(), "1", 1); + std::string p(get_param(arg)); - arg->set_argument(p); + arg.set_argument(p); if (! _env_prefix.empty()) - setenv(env_name(arg->long_name()).c_str(), p.c_str(), 1); + setenv(env_name(arg.long_name()).c_str(), p.c_str(), 1); } -void ArgsVisitor::visit(StringSetArg * const arg) +void ArgsVisitor::visit(StringSetArg & arg) { - visit(static_cast(arg)); + arg.set_specified(true); + + if (! _env_prefix.empty()) + setenv(env_name(arg.long_name()).c_str(), "1", 1); + std::string param = get_param(arg); - arg->add_argument(param); + arg.add_argument(param); if (! _env_prefix.empty()) - setenv(env_name(arg->long_name()).c_str(), join(arg->begin_args(), - arg->end_args(), " ").c_str(), 1); + setenv(env_name(arg.long_name()).c_str(), join(arg.begin_args(), + arg.end_args(), " ").c_str(), 1); } std::string -- cgit v1.2.3