Changeset 11387 for trunk


Ignore:
Timestamp:
07/13/11 22:44:03 (13 years ago)
Author:
tbretz
Message:
Added code to unify access to parsed options; added GetOptions
Location:
trunk/FACT++/src
Files:
2 edited

Legend:

Unmodified
Added
Removed
  • trunk/FACT++/src/Configuration.cc

    r11256 r11387  
    335335#include <boost/filesystem.hpp>
    336336#include <boost/program_options.hpp>
     337#include <boost/lexical_cast.hpp>
    337338
    338339#define HAS_SQL
     
    602603}
    603604
    604 // --------------------------------------------------------------------------
    605 //
    606 //!
    607 //
    608 void Configuration::PrintOptions()
     605template<class T>
     606string Configuration::VecAsStr(const po::variable_value &v) const
     607{
     608    ostringstream str;
     609
     610    const vector<T> vec = v.as<vector<T>>();
     611    for (typename std::vector<T>::const_iterator s=vec.begin(); s<vec.end(); s++)
     612        str << " " << *s;
     613
     614    return str.str().substr(1);
     615}
     616
     617string Configuration::VarAsStr(const po::variable_value &v) const
     618{
     619    if (v.value().type()==typeid(bool))
     620        return v.as<bool>() ? "yes ": "no";
     621
     622    if (v.value().type()==typeid(string))
     623        return v.as<string>();
     624
     625    if (v.value().type()==typeid(int16_t))
     626        return boost::lexical_cast<string>(v.as<int16_t>());
     627
     628    if (v.value().type()==typeid(int32_t))
     629        return boost::lexical_cast<string>(v.as<int32_t>());
     630
     631    if (v.value().type()==typeid(int64_t))
     632        return boost::lexical_cast<string>(v.as<int64_t>());
     633
     634    if (v.value().type()==typeid(uint16_t))
     635        return boost::lexical_cast<string>(v.as<uint16_t>());
     636
     637    if (v.value().type()==typeid(uint32_t))
     638        return boost::lexical_cast<string>(v.as<uint32_t>());
     639
     640    if (v.value().type()==typeid(uint64_t))
     641        return boost::lexical_cast<string>(v.as<uint64_t>());
     642
     643    if (v.value().type()==typeid(float))
     644        return boost::lexical_cast<string>(v.as<float>());
     645
     646    if (v.value().type()==typeid(double))
     647        return boost::lexical_cast<string>(v.as<double>());
     648
     649    if (v.value().type()==typeid(vector<string>))
     650        return VecAsStr<string>(v);
     651
     652    if (v.value().type()==typeid(vector<int16_t>))
     653        return VecAsStr<int16_t>(v);
     654
     655    if (v.value().type()==typeid(vector<int32_t>))
     656        return VecAsStr<int32_t>(v);
     657
     658    if (v.value().type()==typeid(vector<int64_t>))
     659        return VecAsStr<int64_t>(v);
     660
     661    if (v.value().type()==typeid(vector<uint16_t>))
     662        return VecAsStr<uint16_t>(v);
     663
     664    if (v.value().type()==typeid(vector<uint32_t>))
     665        return VecAsStr<uint32_t>(v);
     666
     667    if (v.value().type()==typeid(vector<uint64_t>))
     668        return VecAsStr<uint64_t>(v);
     669
     670    if (v.value().type()==typeid(vector<float>))
     671        return VecAsStr<float>(v);
     672
     673    if (v.value().type()==typeid(vector<double>))
     674        return VecAsStr<double>(v);
     675
     676    ostringstream str;
     677    str << hex << setfill('0') << "0x";
     678    if (v.value().type()==typeid(Hex<uint16_t>))
     679        str << setw(4) << v.as<Hex<uint16_t>>();
     680
     681    if (v.value().type()==typeid(Hex<uint32_t>))
     682        str << setw(8) << v.as<Hex<uint32_t>>();
     683
     684    if (v.value().type()==typeid(Hex<uint64_t>))
     685        str << setw(16) << v.as<Hex<uint64_t>>();
     686
     687    return str.str();
     688}
     689
     690// --------------------------------------------------------------------------
     691//
     692//!
     693//
     694void Configuration::PrintOptions() const
    609695{
    610696    cout << "Options propagated to program:" << endl;
    611697
    612698    int maxlen = 0;
    613     for (map<string,po::variable_value>::iterator m=fVariables.begin();
     699    for (map<string,po::variable_value>::const_iterator m=fVariables.begin();
    614700         m!=fVariables.end(); m++)
    615701        Max(maxlen, m->first.length());
     
    618704
    619705    // =============> Implement prining of options in use
    620     for (map<string,po::variable_value>::iterator m=fVariables.begin();
     706    for (map<string,po::variable_value>::const_iterator m=fVariables.begin();
    621707         m!=fVariables.end(); m++)
    622708    {
    623         cout << setw(maxlen) << m->first << " = ";
    624 
    625709        const po::variable_value &v = m->second;
    626710
     711        ostringstream str;
     712
    627713        if (v.value().type()==typeid(bool))
    628             cout << (v.as<bool>()?"true":"false") << "   # bool";
    629 
     714            str << " bool";
    630715        if (v.value().type()==typeid(string))
    631             cout << v.as<string>() << "   # string";
    632 
    633         if (v.value().type()==typeid(int))
    634             cout << v.as<int>() << "   # int";
    635 
     716            str << " string";
     717        if (v.value().type()==typeid(int16_t))
     718            str << " int16_t";
     719        if (v.value().type()==typeid(int32_t))
     720            str << " int32_t";
     721        if (v.value().type()==typeid(int64_t))
     722            str << " int64_t";
     723        if (v.value().type()==typeid(uint16_t))
     724            str << " uint16_t";
     725        if (v.value().type()==typeid(uint32_t))
     726            str << " uint32_t";
     727        if (v.value().type()==typeid(uint64_t))
     728            str << " uint64_t";
     729        if (v.value().type()==typeid(float))
     730            str << " float";
    636731        if (v.value().type()==typeid(double))
    637             cout << v.as<double>() << "   # double";
    638 
    639         if (v.value().type()==typeid(float))
    640             cout << v.as<float>() << "   # float";
    641 
     732            str << " double";
     733        if (v.value().type()==typeid(Hex<uint16_t>))
     734            str << " Hex<uint16_t>";
     735        if (v.value().type()==typeid(Hex<uint32_t>))
     736            str << " Hex<uint32_t>";
     737        if (v.value().type()==typeid(Hex<uint64_t>))
     738            str << " Hex<uint64_t>";
    642739        if (v.value().type()==typeid(vector<string>))
    643         {
    644             vector<string> vec = v.as<vector<string>>();
    645             for (vector<string>::iterator s=vec.begin(); s<vec.end(); s++)
    646                 cout << *s << " ";
    647             cout << "   # strings";
    648         }
     740            str << " vector<string>";
     741        if (v.value().type()==typeid(vector<int16_t>))
     742            str << " vector<int16_t>";
     743        if (v.value().type()==typeid(vector<int32_t>))
     744            str << " vector<int32_t>";
     745        if (v.value().type()==typeid(vector<int64_t>))
     746            str << " vector<int64_t>";
     747        if (v.value().type()==typeid(vector<uint16_t>))
     748            str << " vector<uint16_t>";
     749        if (v.value().type()==typeid(vector<uint32_t>))
     750            str << " vector<uint32_t>";
     751        if (v.value().type()==typeid(vector<uint64_t>))
     752            str << " vector<uint64_t>";
     753        if (v.value().type()==typeid(vector<float>))
     754            str << " vector<float>";
    649755        if (v.value().type()==typeid(vector<double>))
    650         {
    651             vector<double> vec = v.as<vector<double>>();
    652             for (vector<double>::iterator s=vec.begin(); s<vec.end(); s++)
    653                 cout << *s << " ";
    654             cout << "   # doubles";
    655         }
     756            str << " vector<double>";
     757
     758        if (str.str().empty())
     759            str << " unknown[" << v.value().type().name() << "]";
     760
     761        cout << setw(maxlen) << m->first << " = " << VarAsStr(v);
     762        cout << "   #" << str.str();
    656763
    657764        if (v.defaulted())
    658             cout << "   # default value";
     765            cout << " [default]";
    659766        if (v.empty())
    660             cout << "   # empty value";
     767            cout << " [empty]";
    661768
    662769        cout << endl;
     
    670777//!
    671778//
    672 void Configuration::PrintUnknown(vector<string> &vec, int steps)
    673 {
    674     for (vector<string>::iterator v=vec.begin(); v<vec.end(); v+=steps)
     779void Configuration::PrintUnknown(const vector<string> &vec, int steps) const
     780{
     781    for (vector<string>::const_iterator v=vec.begin(); v<vec.end(); v+=steps)
    675782        cout << " " << *v << endl;
    676783    cout << endl;
    677784}
    678785
    679 // --------------------------------------------------------------------------
    680 //
    681 //!
    682 //
    683 void Configuration::PrintUnknown()
     786multimap<string, string> Configuration::GetOptions() const
     787{
     788    multimap<string,string> rc;
     789
     790    for (map<string,po::variable_value>::const_iterator m=fVariables.begin();
     791         m!=fVariables.end(); m++)
     792        rc.insert(make_pair(m->first, VarAsStr(m->second)));
     793
     794    return rc;
     795}
     796
     797// --------------------------------------------------------------------------
     798//
     799//!
     800//
     801void Configuration::PrintUnknown() const
    684802{
    685803    if (fUnknownCommandline.size())
     
    9541072    if (getfiles.count("print-default") || getfiles.count("print-all"))
    9551073    {
    956         if (!indef && defaulted)
     1074        if (!indef.is_open() && defaulted)
    9571075            cout << "No configuration file by --default option specified." << endl;
    9581076        else
  • trunk/FACT++/src/Configuration.h

    r11345 r11387  
    5757    }
    5858
     59    // Helper functions for PrintOptions and GetOptions
     60    template<class T>
     61        std::string VecAsStr(const po::variable_value &v) const;
     62    std::string VarAsStr(const po::variable_value &v) const;
     63
    5964    /// Print all options from a list of already parsed options
    6065    void PrintParsed(const po::parsed_options &parsed) const;
    6166    /// Print a list of all unkown options within the given vector
    62     void PrintUnknown(std::vector<std::string> &vec, int steps=1);
     67    void PrintUnknown(const std::vector<std::string> &vec, int steps=1) const;
    6368
    6469    virtual void PrintUsage() const { }
     
    105110
    106111    // Output
    107     void PrintOptions();
    108     void PrintUnknown();
     112    void PrintOptions() const;
     113    void PrintUnknown() const;
     114
     115    std::multimap<std::string, std::string> GetOptions() const;
    109116
    110117    // Process command line arguments
Note: See TracChangeset for help on using the changeset viewer.