📄 builder.cpp
字号:
// -*-c++-*-/*************************************************************************** builder.cpp Interface for building config parameter ------------------- begin : 14-MAY-2003 copyright : (C) 2003 by The RoboCup Soccer Server Maintenance Group. email : sserver-admin@lists.sourceforge.net***************************************************************************//*************************************************************************** * * * This program is free software; you can redistribute it and/or modify * * it under the terms of the GNU LGPL as published by the Free Software * * Foundation; either version 2 of the License, or (at your option) any * * later version. * * * ***************************************************************************/#ifdef HAVE_CONFIG_H#include "config.h"#endif#include "builder.hpp"#include "statushandler.hpp"#ifdef HAVE_SSTREAM#include <sstream>#else#include <strstream>#endif#include <iostream>#include <iomanip>namespace rcss {namespace conf {Builder::Builder( const std::string & progname, const std::string & version, const std::string & module_name ) : m_err( false ), m_progname( progname ), m_version( version ), m_parent( NULL ), m_generic_help_requested( false ), m_detailed_help_requested( false ), m_module_name( module_name ){}Builder::Builder( Builder* parent, const std::string & version, const std::string & module_name ) : m_err( false ), m_version( version ), m_parent( parent ), m_generic_help_requested( false ), m_detailed_help_requested( false ), m_module_name( module_name ){ m_parent->addChild( *this );}Builder::~Builder(){ if ( m_parent ) { m_parent->removeChild( *this ); }}voidBuilder::createConfFile( std::ostream & conf, const std::string & module_name ){ if ( module_name == getModuleName() ) { doCreateConfFile( conf ); } else { for ( std::list< Builder * >::iterator i = m_children.begin(); i != m_children.end(); ++i ) { (*i)->createConfFile( conf, module_name ); } }}voidBuilder::addHandler( StatusHandler & handler ){ m_handlers.push_back( &handler ); handler.handlerAdded( *this );}voidBuilder::removeHandler( StatusHandler & handler ){ m_handlers.erase( std::find( m_handlers.begin(), m_handlers.end(), &handler ) ); handler.handlerRemoved( *this );}voidBuilder::addChild( Builder & child ){ m_children.push_back( &child ); if ( m_parser ) { child.addedToParser( *m_parser ); }}voidBuilder::removeChild( Builder & child ){ m_children.erase( std::find( m_children.begin(), m_children.end(), &child ) ); child.removedFromParser();}voidBuilder::parseError( const std::string & curr, const std::string & err, const std::string & name, int lineno ){ requestGenericHelp(); m_err = true; for ( std::list< StatusHandler * >::iterator i = m_handlers.begin(); i != m_handlers.end(); ++i ) { (*i)->parseError( curr, err, name, lineno ); } for ( std::list< Builder * >::iterator i = m_children.begin(); i != m_children.end(); ++i ) { (*i)->parseError( curr, err, name, lineno ); }}voidBuilder::buildError( const std::string & module, const std::string & param, const std::string & err, const std::string & name, int lineno ){ requestDetailedHelp(); m_err = true; for ( std::list< StatusHandler * >::iterator i = m_handlers.begin(); i != m_handlers.end(); ++i ) { (*i)->buildError( module, param, err, name, lineno ); } for ( std::list< Builder * >::iterator i = m_children.begin(); i != m_children.end(); ++i ) { (*i)->buildError( module, param, err, name, lineno ); }}voidBuilder::buildWarning( const std::string & module, const std::string & param, const std::string & warn, const std::string & name, int lineno ){ for ( std::list< StatusHandler * >::iterator i = m_handlers.begin(); i != m_handlers.end(); ++i ) { (*i)->buildWarning( module, param, warn, name, lineno ); } for ( std::list< Builder * >::iterator i = m_children.begin(); i != m_children.end(); ++i ) { (*i)->buildWarning( module, param, warn, name, lineno ); }}voidBuilder::creatingConfFile( const std::string & conf_name ){ for ( std::list< StatusHandler * >::iterator i = m_handlers.begin(); i != m_handlers.end(); ++i ) { (*i)->creatingConfFile( conf_name ); } for ( std::list< Builder * >::iterator i = m_children.begin(); i != m_children.end(); ++i ) { (*i)->creatingConfFile( conf_name ); }}voidBuilder::createdConfFile( const std::string & conf_name ){ for ( std::list< StatusHandler * >::iterator i = m_handlers.begin(); i != m_handlers.end(); ++i ) { (*i)->createdConfFile( conf_name ); } for ( std::list< Builder * >::iterator i = m_children.begin(); i != m_children.end(); ++i ) { (*i)->createdConfFile( conf_name ); }}voidBuilder::confCreationFailed( const std::string & conf_name, int error ){ for( std::list< StatusHandler * >::iterator i = m_handlers.begin(); i != m_handlers.end(); ++i ) { (*i)->confCreationFailed( conf_name, error ); } for ( std::list< Builder * >::iterator i = m_children.begin(); i != m_children.end(); ++i ) { (*i)->confCreationFailed( conf_name, error ); }}voidBuilder::includeFailed( const std::string & filename, const std::string & error, const std::string & name, int lineno ){ m_err = true; for ( std::list< StatusHandler * >::iterator i = m_handlers.begin(); i != m_handlers.end(); ++i ) { (*i)->includeFailed( filename, error, name, lineno ); } for ( std::list< Builder * >::iterator i = m_children.begin(); i != m_children.end(); ++i ) { (*i)->includeFailed( filename, error, name, lineno ); }}boolBuilder::success() const{ return !m_err;}voidBuilder::reset(){ m_err = false;}const std::string &Builder::progName() const{ if ( m_parent ) { return m_parent->progName(); } else { return m_progname; }}boolBuilder::genericHelpRequested() const{ if ( m_parent ) { return m_parent->genericHelpRequested(); } else { return m_generic_help_requested; }}boolBuilder::detailedHelpRequested() const{ return m_detailed_help_requested;}voidBuilder::requestGenericHelp(){ if ( m_parent ) { m_parent->requestGenericHelp(); } else { m_generic_help_requested = true; }}voidBuilder::requestDetailedHelp( const std::string & module_name ){ for( std::list< Builder * >::iterator i = m_children.begin(); i != m_children.end(); ++i ) { (*i)->requestDetailedHelp( module_name ); } doRequestDetailedHelp( module_name );}voidBuilder::doRequestDetailedHelp( const std::string & module_name ){ if ( module_name == m_module_name ) { Builder::requestDetailedHelp(); }}voidBuilder::addedToParser( Parser & p ){ m_parser = &p; for( std::list< Builder * >::iterator i = m_children.begin(); i != m_children.end(); ++i ) { (*i)->addedToParser( p ); }}voidBuilder::removedFromParser(){ m_parser = NULL; m_parent = NULL; for( std::list< Builder * >::iterator i = m_children.begin(); i != m_children.end(); ++i ) { (*i)->removedFromParser(); }}Parser*Builder::parser(){ return m_parser;}voidBuilder::requestDetailedHelp(){ requestGenericHelp(); m_detailed_help_requested = true;}voidBuilder::displayHelp(){ if ( genericHelpRequested() ) { if ( m_parent == NULL ) { displayUsage( m_progname ); } displayGenericHelp(); for ( std::list< Builder * >::iterator i = m_children.begin(); i != m_children.end(); ++i ) { (*i)->displayGenericHelp(); } if ( detailedHelpRequested() ) { displayDetailedHelp(); } for ( std::list< Builder * >::iterator i = m_children.begin(); i != m_children.end(); ++i ) { if ( (*i)->detailedHelpRequested() ) { (*i)->displayDetailedHelp(); } } }}conststd::string &Builder::getModuleName() const{ return m_module_name;}conststd::string &Builder::version() const{ return m_version;}conststd::string &Builder::parsedVersion() const{ return m_parsed_version;}voidBuilder::displayUsage( const std::string & progname ){ std::cout << "\nUsage: " << progname << " [[-[-]]namespace::option=value]\n" << " " << std::setfill(' ') << std::setw( progname.length() ) << ' ' << " [[-[-]][namespace::]help]\n" << " " << std::setfill(' ') << std::setw( progname.length() ) << ' ' << " [[-[-]]include=file]\n"// << " " << std::setfill(' ') << std::setw( progname.length() ) << ' '// << " [[-[-]]load=library]\n"// << " " << std::setfill(' ') << std::setw( progname.length() ) << ' '// << " [[-[-]]setpath=path]\n"// << " " << std::setfill(' ') << std::setw( progname.length() ) << ' '// << " [[-[-]]addpath=path] ...\n"; ; std::cout << "Options:\n"; displayHelpEntry( std::cout, "help", "display generic help" ); displayHelpEntry( std::cout, "include=file", "parse the specified configuration file." " Configuration files have the same format as the command line options." " The configuration file specified will be parsed before all subsequent options.");}voidBuilder::displayGenericHelp(){ displayHelpEntry( std::cout, m_module_name, "help", "display detailed help for the \"" + m_module_name + "\" module" );}voidBuilder::displayDetailedHelp(){ std::cout << m_module_name << " Options:\n"; std::ostream & conf = std::cout; for ( IntMap::iterator iter = m_ints.begin(); iter != m_ints.end(); ++iter ) { displayHelpEntry( conf, m_module_name, iter->first, iter->second.get(), iter->second.desc() ); } for ( BoolMap::iterator iter = m_bools.begin(); iter != m_bools.end(); ++iter ) { displayHelpEntry( conf, m_module_name, iter->first, iter->second.get(), iter->second.desc() ); } for ( DoubMap::iterator iter = m_doubs.begin(); iter != m_doubs.end(); ++iter ) { displayHelpEntry( conf, m_module_name, iter->first, iter->second.get(), iter->second.desc() ); } for ( StrMap::iterator iter = m_strs.begin(); iter != m_strs.end(); ++iter ) { displayHelpEntry( conf, m_module_name, iter->first, iter->second.get(), iter->second.desc() );
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -