LCOV - code coverage report
Current view: top level - alma/Enumtcl - Enum.hpp (source / functions) Hit Total Coverage
Test: ctest_coverage.info Lines: 56 74 75.7 %
Date: 2023-11-06 10:06:49 Functions: 68 102 66.7 %

          Line data    Source code
       1             : #if     !defined(_ENUM_H)
       2             : 
       3             : #include <vector>
       4             : #include <map>
       5             : #include <set>
       6             : #include <iostream>
       7             : #include <sstream>
       8             : #include <limits>
       9             : 
      10             : #include <alma/Enumtcl/enum_set.hpp>
      11             : #include <alma/Enumtcl/enum_map.hpp>
      12             : 
      13             : template< typename enum_type, 
      14             :           typename val_type,
      15             :           typename set_traits=enum_set_traits<enum_type>,
      16             :           typename map_traits=enum_map_traits<enum_type,val_type> >
      17             : class EnumSetVal
      18             : {
      19             : public:
      20             :   EnumSetVal()
      21             :   {
      22             :     reset();
      23             :   }
      24             :   EnumSetVal(enum_type setting)
      25             :   {
      26             :     setOnly(setting);
      27             :   }
      28             :   EnumSetVal &operator&=(const EnumSetVal &rhs)
      29             :   {
      30             :     bits &= rhs.bits;
      31             :     return *this;
      32             :   }
      33             :   EnumSetVal &operator|=(const EnumSetVal &rhs)
      34             :   {
      35             :     bits |= rhs.bits;
      36             :     return *this;
      37             :   }
      38             :   bool less (const EnumSetVal &rhs){
      39             :     if(bits.to_ulong()<rhs.bits.to_ulong())return true;
      40             :     return false;
      41             :   }
      42             :   bool operator!= (const EnumSetVal &rhs)
      43             :   {
      44             :     if(bits.to_ulong()==rhs.bits.to_ulong())return false;
      45             :     return true;
      46             :   }
      47             :   bool operator== (const EnumSetVal &rhs)
      48             :   {
      49             :     if(bits.to_ulong()==rhs.bits.to_ulong())return true;
      50             :     return false;
      51             :   }
      52             :   EnumSetVal &operator^=(const EnumSetVal &rhs)
      53             :   {
      54             :     bits ^= rhs.bits;
      55             :     return *this;
      56             :   }
      57             :   std::size_t count() const
      58             :   {
      59             :     return bits.count();
      60             :   }
      61             :   std::size_t size() const
      62             :   {
      63             :     return bits.size();
      64             :   }
      65             :   bool operator[](enum_type testing) const
      66             :   {
      67             :     return bits.test(to_bit(testing));
      68             :   }
      69             :   bool only(enum_type testing) const
      70             :   {
      71             :     if(count()!=1)return false;
      72             :     return bits.test(to_bit(testing));
      73             :   }
      74             :   bool operator^(enum_type testing) const   // xor operator (^ Python bitwise operator) 
      75             :   {
      76             :     if(only(testing))return true;
      77             :     if(bits.test(to_bit(testing)))return false;
      78             :     return true;
      79             :   }
      80             : 
      81             :   EnumSetVal &set()
      82             :   {
      83             :     bits.set();
      84             :     return *this;
      85             :   }
      86             :   EnumSetVal &setOnly(enum_type setting)
      87             :   {
      88             :     bits.reset();
      89             :     bits.set(to_bit(setting), true);
      90             :     return *this;
      91             :   }
      92             :   EnumSetVal &set(enum_type setting, bool value = true)
      93             :   {
      94             :     if(set_traits::maxset<set_traits::count)bits.reset();
      95             :     bits.set(to_bit(setting), value);
      96             :     return *this;
      97             :   }
      98             :   EnumSetVal &set(std::vector<enum_type> setting, bool value = true)
      99             :   {
     100             :     if(set_traits::maxset<set_traits::count)bits.reset();
     101             :     unsigned int nmax=setting.size();
     102             :     if(nmax>set_traits::maxset)nmax=set_traits::maxset;
     103             :     for(unsigned int n=0; n<nmax; n++)
     104             :       bits.set(to_bit(setting[n]), value);
     105             :     return *this;
     106             :   }
     107             :   EnumSetVal &set(std::vector<std::string> names, bool /* value = true */)
     108             :   {
     109             :     // value is not used here, commented out above to silence a compiler warning
     110             :     bits.reset();
     111             :     typename std::map<enum_type,EnumPar<val_type> >::iterator 
     112             :       it, itb(map_traits::m_.begin()), ite(map_traits::m_.end());
     113             :     std::vector<std::string>::iterator iv, ivb=names.begin(), ive=names.end();
     114             :     for(iv=ivb; iv!=ive; ++iv)
     115             :       for(it=itb; it!=ite; ++it)if(it->second.str()==*iv)
     116             :         bits.set(to_bit(it->first));
     117             :     return *this;
     118             :   }
     119             : 
     120             : 
     121             :   EnumSetVal &reset()
     122             :   {
     123             :     bits.reset();
     124             :     return *this;
     125             :   }
     126             :   EnumSetVal &reset(enum_type resetting)
     127             :   {
     128             :     bits.reset(to_bit(resetting));
     129             :     return *this;
     130             :   }
     131             :   EnumSetVal &flip()
     132             :   {
     133             :     bits.flip();
     134             :     return *this;
     135             :   }
     136             :   EnumSetVal &flip(enum_type flipping)
     137             :   {
     138             :     bits.flip(to_bit(flipping));
     139             :     return *this;
     140             :   }
     141             :   EnumSetVal operator~() const
     142             :   {
     143             :     return EnumSetVal(*this).flip();
     144             :   }
     145             :   bool any() const
     146             :   {
     147             :     return bits.any();
     148             :   }
     149             :   bool none() const
     150             :   {
     151             :     return bits.none();
     152             :   }
     153             :   static std::vector<enum_type> enumEnumerators()
     154             :   {
     155             :     typename std::vector<enum_type> e;
     156             :     typename std::map<enum_type,EnumPar<val_type> >::iterator it, itb(map_traits::m_.begin()), ite(map_traits::m_.end());
     157             :     for(it=itb; it!=ite; ++it)e.push_back(it->first);
     158             :     return e;
     159             :   }
     160             :   static std::set<std::string> enumMemberSet()
     161             :   {
     162             :     std::set<std::string> s;
     163             :     typename std::map<enum_type,EnumPar<val_type> >::iterator it, itb(map_traits::m_.begin()), ite(map_traits::m_.end());
     164             :     for(it=itb; it!=ite; ++it)s.insert(it->second.str());
     165             :     return s;
     166             :   }
     167             :   static std::vector<std::string> enumMemberList(){
     168             :     std::vector<std::string> v;
     169             :     typename std::map<enum_type,EnumPar<val_type> >::iterator it, itb(map_traits::m_.begin()), ite(map_traits::m_.end());
     170             :     for(it=itb; it!=ite; ++it)v.push_back(it->second.str());
     171             :     return v;
     172             :   }
     173             : 
     174             :   static std::vector<val_type> enumValues(){
     175             :     std::vector<val_type> v;
     176             :     typename std::map<enum_type,EnumPar<val_type> >::iterator it, itb(map_traits::m_.begin()), ite(map_traits::m_.end());
     177             :     for(it=itb; it!=ite; ++it)v.push_back(it->second.val());
     178             :     return v;
     179             :   }
     180             : 
     181             :   static unsigned int enumNum(){
     182             :     return map_traits::m_.size();
     183             :   }
     184             : 
     185             :   static std::string doc(enum_type t){
     186             :     typename std::map<enum_type,EnumPar<val_type> >::iterator itf(map_traits::m_.find(t));
     187             :     return itf->second.desc();
     188             :   }
     189             : 
     190             :   static val_type val(enum_type t){
     191             :     typename std::map<enum_type,EnumPar<val_type> >::iterator itf(map_traits::m_.find(t));
     192             :     return itf->second.val();
     193             :   }
     194             : 
     195             :   /** Methods using bits and associated with enum_map */
     196             :   std::vector<int> id(){
     197             :     std::vector<int> v_id;
     198             :     typename std::map<enum_type,EnumPar<val_type> >::iterator it, itb(map_traits::m_.begin()), ite(map_traits::m_.end());
     199             :     for(it=itb; it!=ite; ++it)
     200             :       if(bits[it->first])v_id.push_back(it->second.id());
     201             :     return v_id;
     202             :   }
     203             : 
     204             :   std::string str(){
     205             :     return toString();
     206             :   }
     207             : 
     208             :   std::string toString(){
     209             :     std::ostringstream os;
     210             :     typename std::map<enum_type,EnumPar<val_type> >::iterator it, itb(map_traits::m_.begin()), ite(map_traits::m_.end());
     211             :     for(it=itb; it!=ite; ++it)
     212             :       if(bits[it->first])os<<it->second.str()<<" ";
     213             :     if(os.str().length())
     214             :       return os.str().substr(0,os.str().length()-1);
     215             :     else
     216             :       return os.str();
     217             :   }
     218             :   std::vector<enum_type> toEnumType(){
     219             :     std::vector<enum_type> v;
     220             :     typename std::map<enum_type,EnumPar<val_type> >::iterator it, itb(map_traits::m_.begin()), ite(map_traits::m_.end());
     221             :     for(it=itb; it!=ite; ++it)
     222             :       if(bits[it->first])v.push_back(it->first);
     223             :     return v;
     224             :   }
     225             :   // Method to define only when traits::maxset > 1
     226             :    EnumSetVal<enum_type,val_type>& fromString(std::vector<std::string> s){
     227             : //   EnumSetVal<enum_type,val_type>& fromString(std::vector<std::string> s, bool reset){
     228             : //     int id;
     229             : //     int nmax=s.size();
     230             : //     if(reset)bits.reset();
     231             : //     if(nmax>set_traits::maxset)nmax=set_traits::maxset;
     232             : //     int k=0;
     233             : //     for(int n=0; n<nmax; n++){
     234             : //       id = map_traits::fromStringToInt(s[n]);
     235             : //       if(id!=numeric_limits<int>::max())
     236             : //      bits.set(enum_type(id));
     237             : //     }
     238             : //     return *this;
     239             :     unsigned int nmax=s.size(); std::cout<<"nmax="<<nmax<<std::endl; 
     240             :     bits.reset();
     241             :     if(nmax>set_traits::maxset)
     242             :       std::cout<<"WARNING: the input number of enumerators, "<<nmax<<",exceeds the maximum number, "
     243             :                <<set_traits::maxset<<",  allowed for a compound with this EnumSet<"
     244             :                <<map_traits::typeName_<<"> type."<<std::endl;
     245             :     bool ok;
     246             :     typename std::map<enum_type,EnumPar<val_type> >::iterator it, itb(map_traits::m_.begin()), ite(map_traits::m_.end());
     247             :     unsigned int numSet=0;
     248             :     for(unsigned int n=0; n<nmax; n++){
     249             :       ok=false;
     250             :       for(it=itb;it!=ite;++it)
     251             :         if(s[n]==it->second.str()){ok=true; break;}
     252             :       if(ok){
     253             :         bits.set(it->first);
     254             :         numSet++;
     255             :       }else{
     256             :         std::cout<<"WARNING: "<<s[n]<<" is not a valid enumerator name for this enumeration "
     257             :                  <<map_traits::typeName_<<std::endl;
     258             :       }
     259             :       if(numSet==set_traits::maxset)break;
     260             :     }
     261             :     std::cout<<"numSet="<<numSet<<std::endl;
     262             :     return *this;
     263             :   }
     264             :   // Method useful when maxset>1.
     265             :   EnumSetVal<enum_type,val_type>& fromString(std::string s, bool reset){
     266             :     if(reset)bits.reset();
     267             :     int id = map_traits::fromStringToInt(s);
     268             :     if(id==std::numeric_limits<int>::max())
     269             :       bits.reset();
     270             :     else
     271             :       bits.set(enum_type(id));
     272             :     return *this;
     273             :   }
     274             :   // Method to define only when traits::maxset > 1
     275             :   EnumSetVal<enum_type,val_type>& fromString(std::string setting)
     276             :   {
     277             :     // TODO traiter le cas de 2 enumerators comme CORRECTED and UNCORRECTED  car ==> blancs avt ou apres 
     278             :     unsigned int nmax=set_traits::maxset;
     279             :     if(nmax<set_traits::count)bits.reset();
     280             :     typename std::map<enum_type,EnumPar<val_type> >::iterator it, itb(map_traits::m_.begin()), ite(map_traits::m_.end());
     281             :     for(it=itb;it!=ite;++it)
     282             :       if(setting.find(it->second.str())!=std::string::npos)bits.set(it->first);
     283             :     return *this;
     284             :   }
     285             :   // Method to get a vector of the names of the enumerators set on.
     286             :   std::vector<std::string> names()
     287             :   {
     288             :     typename std::map<enum_type,EnumPar<val_type> >::iterator it, itb(map_traits::m_.begin()), ite(map_traits::m_.end());
     289             :     std::vector<std::string> v_s;
     290             :     unsigned int numset=0; 
     291             :     for(it=itb;it!=ite;++it){
     292             :       if(bits.test(to_bit(it->first))){
     293             :         v_s.push_back(it->second.str());
     294             :         numset++; 
     295             :       }
     296             :       if(set_traits::maxset==numset)break;
     297             :       if(set_traits::last==it->first)break;
     298             :     }
     299             :     return v_s;
     300             :   }
     301             : 
     302             :   // Method to get the set of enumerators
     303             :   std::set<enum_type> enumSet()
     304             :   {
     305             :     typename std::map<enum_type,EnumPar<val_type> >::iterator it, itb(map_traits::m_.begin()), ite(map_traits::m_.end());
     306             :     std::set<enum_type> s_et;
     307             :     for(it=itb;it!=ite;++it)
     308             :       if(bits.test(to_bit(it->first)))s_et.insert(it->first);
     309             :     return s_et;
     310             :   }    
     311             :   // Method to get the set of enumerator values
     312             :   std::vector<val_type> enumVal()
     313             :   {
     314             :     std::vector<val_type> v_s;
     315             :     std::set<enum_type> s_et=enumSet();
     316             :     typename std::set<enum_type>::iterator its, itsb(s_et.begin()), itse(s_et.end());
     317             :     typename std::map<enum_type,EnumPar<val_type> >::iterator itf;
     318             :     for(its=itsb; its!=itse; ++its){
     319             :       itf=map_traits::m_.find(*its);
     320             :       v_s.push_back(itf->second.val());
     321             :     }
     322             :     return v_s;
     323             :   }    
     324             : 
     325             : 
     326             : protected:
     327             :   static std::size_t to_bit(enum_type value)
     328             :   {
     329             :     return (value - set_traits::first) / set_traits::step;
     330             :   }
     331             :   std::bitset<set_traits::count> bits;
     332             : };
     333             : 
     334             : 
     335             : template<typename enum_type,
     336             :          typename val_type=void, 
     337             :          typename set_traits=enum_set_traits<enum_type>,
     338             :          typename map_traits=enum_map_traits<enum_type,val_type> >
     339             : class EnumSet
     340             : {
     341             : public:
     342      162248 :   EnumSet()
     343      162248 :   {
     344      162248 :     reset();
     345      162248 :   }
     346             :   EnumSet(enum_type setting)
     347             :   {
     348             :     setOnly(setting);
     349             :   }
     350             :   EnumSet &operator&=(const EnumSet &rhs)
     351             :   {
     352             :     bits &= rhs.bits;
     353             :     return *this;
     354             :   }
     355             :   EnumSet &operator|=(const EnumSet &rhs)
     356             :   {
     357             :     bits |= rhs.bits;
     358             :     return *this;
     359             :   }
     360             :   bool less (const EnumSet &rhs){
     361             :     if(bits.to_ulong()<rhs.bits.to_ulong())return true;
     362             :     return false;
     363             :   }
     364             :   bool operator!= (const EnumSet &rhs){
     365             :     if(bits.to_ulong()==rhs.bits.to_ulong())return false;
     366             :     return true;
     367             :   }
     368             :   bool operator== (const EnumSet &rhs){
     369             :     if(bits.to_ulong()==rhs.bits.to_ulong())return true;
     370             :     return false;
     371             :   }
     372             :   EnumSet &operator^=(const EnumSet &rhs)
     373             :   {
     374             :     bits ^= rhs.bits;
     375             :     return *this;
     376             :   }
     377    13131657 :   std::size_t count() const
     378             :   {
     379    13131657 :     return bits.count();
     380             :   }
     381             :   std::size_t size() const
     382             :   {
     383             :     return bits.size();
     384             :   }
     385       39429 :   bool operator[](enum_type testing) const
     386             :   {
     387       39429 :     return bits.test(to_bit(testing));
     388             :   }
     389             :   bool only(enum_type testing) const
     390             :   {
     391             :     if(count()!=1)return false;
     392             :     return bits.test(to_bit(testing));
     393             :   }
     394             :   bool operator^(enum_type testing) const   // xor operator (^ Python bitwise operator) 
     395             :   {
     396             :     if(only(testing))return true;
     397             :     if(bits.test(to_bit(testing)))return false;
     398             :     return true;
     399             :   }
     400             : 
     401             :   EnumSet &set()
     402             :   {
     403             :     bits.set();
     404             :     return *this;
     405             :   }
     406             :   EnumSet &setOnly(enum_type setting)
     407             :   {
     408             :     bits.reset();
     409             :     bits.set(to_bit(setting), true);
     410             :     return *this;
     411             :   }
     412             : //   error: call of overloaded `set(StokesParameter)'
     413             : //   EnumSet &set(enum_type setting)
     414             : //   {
     415             : //     bits.set(to_bit(setting), true);
     416             : //     return *this;
     417             : //   }
     418         309 :   EnumSet &set(enum_type setting, bool value = true)
     419             :   {
     420             :     if(set_traits::maxset<set_traits::count)bits.reset();
     421         309 :     bits.set(to_bit(setting), value);
     422         309 :     return *this;
     423             :   }
     424        9340 :   EnumSet &set(std::vector<enum_type> setting, bool value = true)
     425             :   {
     426             : //     if(set_traits::maxset<set_traits::count)bits.reset();
     427        9340 :     bits.reset();
     428        9340 :     unsigned int nmax=setting.size();
     429        9340 :     if(nmax>set_traits::maxset)nmax=set_traits::maxset;
     430       23616 :     for(unsigned int n=0; n<nmax; n++)
     431       14276 :       bits.set(to_bit(setting[n]), value);
     432        9340 :     return *this;
     433             :   }
     434             : 
     435             :   EnumSet &set(std::vector<std::string> names, bool /* value = true */)
     436             :   {
     437             :     // value is not used here, commented out above to silence a compiler warning
     438             :     bits.reset();
     439             :     typename std::map<enum_type,EnumPar<val_type> >::iterator 
     440             :       it, itb(map_traits::m_.begin()), ite(map_traits::m_.end());
     441             :     std::vector<std::string>::iterator iv, ivb=names.begin(), ive=names.end();
     442             :     for(iv=ivb; iv!=ive; ++iv)
     443             :       for(it=itb; it!=ite; ++it)if(it->second.str()==*iv)
     444             :         bits.set(to_bit(it->first));
     445             :     return *this;
     446             :   }
     447             : 
     448      162342 :   EnumSet &reset()
     449             :   {
     450      162342 :     bits.reset();
     451      162342 :     return *this;
     452             :   }
     453             :   EnumSet &reset(enum_type resetting)
     454             :   {
     455             :     bits.reset(to_bit(resetting));
     456             :     return *this;
     457             :   }
     458        5511 :   EnumSet &flip()
     459             :   {
     460        5511 :     bits.flip();
     461        5511 :     return *this;
     462             :   }
     463             :   EnumSet &flip(enum_type flipping)
     464             :   {
     465             :     bits.flip(to_bit(flipping));
     466             :     return *this;
     467             :   }
     468             :   EnumSet operator~() const
     469             :   {
     470             :     return EnumSet(*this).flip();
     471             :   }
     472             :   bool any() const
     473             :   {
     474             :     return bits.any();
     475             :   }
     476             :   bool none() const
     477             :   {
     478             :     return bits.none();
     479             :   }
     480             :   static void enumEnumerators(std::vector<enum_type>& v)
     481             :   {
     482             :     typename std::map<enum_type,EnumPar<val_type> >::iterator it, itb(map_traits::m_.begin()), ite(map_traits::m_.end());
     483             :     for(it=itb; it!=ite; ++it)v.push_back(it->first);
     484             :     return;
     485             :   }
     486             :   static std::set<std::string> enumMemberSet()
     487             :   {
     488             :     std::set<std::string> s;
     489             :     typename std::map<enum_type,EnumPar<val_type> >::iterator it, itb(map_traits::m_.begin()), ite(map_traits::m_.end());
     490             :     for(it=itb; it!=ite; ++it)s.insert(it->second.str());
     491             :     return s;
     492             :   }
     493             :   static std::vector<std::string> enumMemberList(){
     494             :     std::vector<std::string> v;
     495             :     typename std::map<enum_type,EnumPar<val_type> >::iterator it, itb(map_traits::m_.begin()), ite(map_traits::m_.end());
     496             :     for(it=itb; it!=ite; ++it)v.push_back(it->second.str());
     497             :     return v;
     498             :   }
     499             :   static std::string doc(enum_type t){
     500             :     typename std::map<enum_type,EnumPar<val_type> >::iterator itf(map_traits::m_.find(t));
     501             :     return itf->second.desc();
     502             :   }
     503             : 
     504             : //   static std::string val(enum_type t){
     505             : //     typename std::map<enum_type,EnumPar<val_type> >::iterator itf(map_traits::m_.find(t));
     506             : //     return itf->second.val();
     507             : //   }
     508             : 
     509             :   /** Methods using bits and associated with enum_map */
     510             :   std::vector<int> id(){
     511             :     std::vector<int> v_id;
     512             :     typename std::map<enum_type,EnumPar<val_type> >::iterator it, itb(map_traits::m_.begin()), ite(map_traits::m_.end());
     513             :     for(it=itb; it!=ite; ++it)
     514             :       if(bits[it->first])v_id.push_back(it->second.id());
     515             :     return v_id;
     516             :   }
     517           0 :   std::string str(){
     518           0 :     return toString();
     519             :   }
     520           0 :   std::string toString(){
     521           0 :     std::ostringstream os;
     522           0 :     typename std::map<enum_type,EnumPar<val_type> >::iterator it, itb(map_traits::m_.begin()), ite(map_traits::m_.end());
     523           0 :     for(it=itb; it!=ite; ++it)
     524           0 :       if(bits[it->first])os<<it->second.str()<<" ";
     525           0 :     if(os.str().length())
     526           0 :       return os.str().substr(0,os.str().length()-1);
     527             :     else
     528           0 :       return os.str();
     529             :   }
     530        5079 :   std::vector<enum_type> toEnumType(){
     531        5079 :     std::vector<enum_type> v;
     532        5079 :     typename std::map<enum_type,EnumPar<val_type> >::iterator it, itb(map_traits::m_.begin()), ite(map_traits::m_.end());
     533       20316 :     for(it=itb; it!=ite; ++it)
     534       15237 :       if(bits[it->first])v.push_back(it->first);
     535       10158 :     return v;
     536             :   }
     537             :   // Method to define only when traits::maxset > 1
     538             :   EnumSet<enum_type,val_type>& fromString(std::vector<std::string> s){
     539             : //   EnumSet<enum_type,val_type>& fromString(std::vector<std::string> s, bool reset){
     540             : //     int id;
     541             : //     int nmax=s.size();
     542             : //     if(reset)bits.reset();
     543             : //     if(nmax>set_traits::maxset)nmax=set_traits::maxset;
     544             : //     int k=0;
     545             : //     for(int n=0; n<nmax; n++){
     546             : //       id = map_traits::fromStringToInt(s[n]);
     547             : //       if(id!=numeric_limits<int>::max())
     548             : //      bits.set(enum_type(id));
     549             : //     }
     550             : //     return *this;
     551             :     unsigned int nmax=s.size(); std::cout<<"nmax="<<nmax<<std::endl; 
     552             :     bits.reset();
     553             :     if(nmax>set_traits::maxset)
     554             :       std::cout<<"WARNING: the input number of enumerators, "<<nmax<<",exceeds the maximum number, "
     555             :                <<set_traits::maxset<<",  allowed for a compound with this EnumSet<"
     556             :                <<map_traits::typeName_<<"> type."<<std::endl;
     557             :     bool ok;
     558             :     typename std::map<enum_type,EnumPar<val_type> >::iterator it, itb(map_traits::m_.begin()), ite(map_traits::m_.end());
     559             :     int numSet=0;
     560             :     for(int n=0; n<nmax; n++){
     561             :       ok=false;
     562             :       for(it=itb;it!=ite;++it)
     563             :         if(s[n]==it->second.str()){ok=true; break;}
     564             :       if(ok){
     565             :         bits.set(it->first);
     566             :         numSet++;
     567             :       }else{
     568             :         std::cout<<"WARNING: "<<s[n]<<" is not a valid enumerator name for this enumeration "
     569             :                  <<map_traits::typeName_<<std::endl;
     570             :       }
     571             :       if(numSet==set_traits::maxset)break;
     572             :     }
     573             :     std::cout<<"numSet="<<numSet<<std::endl;
     574             :     return *this;
     575             :   }
     576             :   // Method useful when maxset>1.
     577             :   EnumSet<enum_type,val_type>& fromString(std::string s, bool reset){
     578             :     if(reset)bits.reset();
     579             :     typename std::map<enum_type,EnumPar<val_type> >::iterator it, itb(map_traits::m_.begin()), ite(map_traits::m_.end());
     580             :     for(it=itb;it!=ite;++it)
     581             :       if(s.find(it->second.str())!=std::string::npos)bits.set(it->first);
     582             :     return *this;
     583             :   }
     584             :   // Method to define only when traits::maxset > 1
     585         162 :   EnumSet <enum_type,val_type>& fromString(std::string setting)
     586             :   {
     587             :     // TODO traiter le cas de 2 enumerators comme CORRECTED and UNCORRECTED  car ==> blancs avt ou apres 
     588         162 :     unsigned int nmax=set_traits::maxset;
     589         162 :     if(nmax<set_traits::count)bits.reset();
     590         162 :     typename std::map<enum_type,EnumPar<val_type> >::iterator it, itb(map_traits::m_.begin()), ite(map_traits::m_.end());
     591         486 :     for(it=itb;it!=ite;++it)
     592         324 :       if(setting.find(it->second.str())!=std::string::npos)bits.set(it->first);
     593         162 :     return *this;
     594             :   }
     595             :   // Method to get a vector of the names of the enumerators set on.
     596             :   std::vector<std::string> names()
     597             :   {
     598             :     typename std::map<enum_type,EnumPar<val_type> >::iterator it, itb(map_traits::m_.begin()), ite(map_traits::m_.end());
     599             :     std::vector<std::string> v_s;
     600             :     unsigned int numset=0;
     601             :     for(it=itb;it!=ite;++it){
     602             :       if(bits.test(to_bit(it->first))){
     603             :         v_s.push_back(it->second.str());
     604             :         numset++; 
     605             :       }
     606             :       if(set_traits::maxset==numset)break;
     607             :       if(set_traits::last==it->first)break;
     608             :     }
     609             :     return v_s;  
     610             :   }
     611             :   // Method to get the set of enumerators
     612             :   std::set<enum_type> enumSet()
     613             :   {
     614             :     typename std::map<enum_type,EnumPar<val_type> >::iterator it, itb(map_traits::m_.begin()), ite(map_traits::m_.end());
     615             :     std::set<enum_type> s_et;
     616             :     for(it=itb;it!=ite;++it)
     617             :       if(bits.test(to_bit(it->first)))s_et.insert(it->first);
     618             :     return s_et;
     619             :   }    
     620             : //   // Method to get the set of enumerator values
     621             : //   std::vector<std::string> enumVal()
     622             : //   {
     623             : //     std::vector<std::string> v_s;
     624             : //     std::set<enum_type> s_et=enumSet();
     625             : //     typename std::set<enum_type>::iterator its, itsb(s_et.begin()), itse(s_et.end());
     626             : //     typename std::map<enum_type,EnumPar<val_type> >::iterator itf;
     627             : //     for(its=itsb; its!=itse; ++its){
     628             : //       itf=map_traits::m_.find(*its);
     629             : //       v_s.push_back(itf->second.val());
     630             : //     }
     631             : //     return v_s;
     632             : //   }    
     633             : 
     634             : 
     635             : protected:
     636       54014 :   static std::size_t to_bit(enum_type value)
     637             :   {
     638       54014 :     return (value - set_traits::first) / set_traits::step;
     639             :   }
     640             :   std::bitset<set_traits::count> bits;
     641             : };
     642             : 
     643             : 
     644             : 
     645             : template< typename enum_type, 
     646             :           typename val_type,
     647             :           typename set_traits=enum_set_traits<enum_type>,
     648             :           typename map_traits=enum_map_traits<enum_type,val_type> >
     649             : class EnumVal
     650             : {
     651             : public:
     652             :   EnumVal()
     653             :   {
     654             :   }
     655             :   EnumVal(enum_type setting)
     656             :   {
     657             :     set(setting);
     658             :   }
     659             :   EnumVal &operator&=(const EnumVal &rhs)
     660             :   {
     661             :     bits &= rhs.bits;
     662             :     return *this;
     663             :   }
     664             :   EnumVal &operator|=(const EnumVal &rhs)
     665             :   {
     666             :     bits |= rhs.bits;
     667             :     return *this;
     668             :   }
     669             :   bool less (const EnumVal &rhs){
     670             :     if(bits.to_ulong()<rhs.bits.to_ulong())return true;
     671             :     return false;
     672             :   }
     673             :   bool operator!= (const EnumVal &rhs){
     674             :     if(bits.to_ulong()==rhs.bits.to_ulong())return false;
     675             :     return true;
     676             :   }
     677             :   bool operator== (const EnumVal &rhs){
     678             :     if(bits.to_ulong()==rhs.bits.to_ulong())return true;
     679             :     return false;
     680             :   }
     681             :   EnumVal &operator^=(const EnumVal &rhs)
     682             :   {
     683             :     bits ^= rhs.bits;
     684             :     return *this;
     685             :   }
     686             :   std::size_t count() const
     687             :   {
     688             :     return bits.count();
     689             :   }
     690             :   std::size_t size() const
     691             :   {
     692             :     return bits.size();
     693             :   }
     694             :   bool operator[](enum_type testing) const
     695             :   {
     696             :     return bits.test(to_bit(testing));
     697             :   }
     698             :   bool only(enum_type testing) const
     699             :   {
     700             :     if(count()!=1)return false;
     701             :     return bits.test(to_bit(testing));
     702             :   }
     703             :   bool operator^(enum_type testing) const   // xor operator (^ Python bitwise operator) 
     704             :   {
     705             :     if(only(testing))return true;
     706             :     if(bits.test(to_bit(testing)))return false;
     707             :     return true;
     708             :   }
     709             : 
     710             :   EnumVal &set()
     711             :   {
     712             :     bits.set();
     713             :     return *this;
     714             :   }
     715             :   /** Store a boolean value as the new value for bit at position setting.
     716             :    * @pre if the number if bits set is smaller than the maximum
     717             :    *      allowed number of bit set then the bitset is first reset
     718             :    * @param setting the position in the bitset where "value" must be stored
     719             :    * @param value the boolean value to store
     720             :    * @post all positions are unset (i.e. false), except the position "setting"
     721             :    *       would value=true
     722             :    */
     723             :   EnumVal &set(enum_type setting, bool value = true)
     724             :   {
     725             :     if(set_traits::maxset<set_traits::count)bits.reset();
     726             :     bits.set(to_bit(setting), value);
     727             :     return *this;
     728             :   }
     729             :   /** Store "true" at a set of positions.
     730             :    * @param setting vector of positions in the bitset (Order positions 
     731             :    *        are counted from the rightmost bit, which is order position 0.
     732             :    * @post the value "true" stored at these positions in the bitset.
     733             :    */
     734             :   EnumVal &set(std::vector<enum_type> setting)
     735             :   {
     736             :     bits.reset();
     737             :     unsigned int nmax=setting.size();
     738             :     if(nmax>set_traits::maxset)nmax=set_traits::maxset;
     739             :     for(int n=1; n<nmax; n++)
     740             :       bits.set(to_bit(setting[n]),true);
     741             :     return *this;
     742             :   }
     743             : 
     744             :   EnumVal &reset()
     745             :   {
     746             :     bits.reset();
     747             :     return *this;
     748             :   }
     749             :   EnumVal &reset(enum_type resetting)
     750             :   {
     751             :     bits.reset(to_bit(resetting));
     752             :     return *this;
     753             :   }
     754             :   EnumVal &flip()
     755             :   {
     756             :     bits.flip();
     757             :     return *this;
     758             :   }
     759             :   EnumVal &flip(enum_type flipping)
     760             :   {
     761             :     bits.flip(to_bit(flipping));
     762             :     return *this;
     763             :   }
     764             :   EnumVal operator~() const
     765             :   {
     766             :     return EnumVal(*this).flip();
     767             :   }
     768             :   bool any() const
     769             :   {
     770             :     return bits.any();
     771             :   }
     772             :   bool none() const
     773             :   {
     774             :     return bits.none();
     775             :   }
     776             :   static std::set<std::string> enumMemberSet()
     777             :   {
     778             :     std::set<std::string> s;
     779             :     typename std::map<enum_type,EnumPar<val_type> >::iterator it, itb(map_traits::m_.begin()), ite(map_traits::m_.end());
     780             :     for(it=itb; it!=ite; ++it)s.insert(it->second.str());
     781             :     return s;
     782             :   }
     783             :   static std::vector<std::string> enumMemberList(){
     784             :     std::vector<std::string> v;
     785             :     typename std::map<enum_type,EnumPar<val_type> >::iterator it, itb(map_traits::m_.begin()), ite(map_traits::m_.end());
     786             :     for(it=itb; it!=ite; ++it)v.push_back(it->second.str());
     787             :     return v;
     788             :   }
     789             : 
     790             :   static std::vector<val_type> enumValues(){
     791             :     std::vector<val_type> v;
     792             :     typename std::map<enum_type,EnumPar<val_type> >::iterator it, itb(map_traits::m_.begin()), ite(map_traits::m_.end());
     793             :     for(it=itb; it!=ite; ++it)v.push_back(it->second.val());
     794             :     return v;
     795             :   }
     796             : 
     797             :   static unsigned int enumNum(){
     798             :     return map_traits::m_.size();
     799             :   }
     800             : 
     801             :   static std::string doc(enum_type t){
     802             :     typename std::map<enum_type,EnumPar<val_type> >::iterator itf(map_traits::m_.find(t));
     803             :     return itf->second.desc();
     804             :   }
     805             : 
     806             :   static val_type val(enum_type t){
     807             :     typename std::map<enum_type,EnumPar<val_type> >::iterator itf(map_traits::m_.find(t));
     808             :     return itf->second.val();
     809             :   }
     810             : 
     811             :   // Method to get the name of the enumerator set on, if set, else return empty string
     812             :   std::string name()
     813             :   {
     814             :     typename std::map<enum_type,EnumPar<val_type> >::iterator it, itb(map_traits::m_.begin()), ite(map_traits::m_.end());
     815             :     std::string s="";
     816             :     for(it=itb;it!=ite;++it){
     817             :       if(bits.test(to_bit(it->first)))
     818             :         return it->second.str();
     819             :       if(set_traits::last==it->first)break;
     820             :     }
     821             :     return s;
     822             :   }
     823             :   /** Methods using bits and associated with enum_map */
     824             :   int id(){
     825             :     int id;
     826             :     typename std::map<enum_type,EnumPar<val_type> >::iterator it, itb(map_traits::m_.begin()), ite(map_traits::m_.end());
     827             :     for(it=itb; it!=ite; ++it)
     828             :       if(bits[it->first])id=it->second.id();
     829             :     return id;
     830             :   }
     831             :   std::string str(){
     832             :     return toString();
     833             :   }
     834             :   std::string toString(){
     835             :     std::ostringstream os;
     836             :     typename std::map<enum_type,EnumPar<val_type> >::iterator it, itb(map_traits::m_.begin()), ite(map_traits::m_.end());
     837             :     for(it=itb; it!=ite; ++it)
     838             :       if(bits[it->first])os<<it->second.str();
     839             :     return os.str();
     840             :   }
     841             :   enum_type toEnumType(){
     842             :     typename std::map<enum_type,EnumPar<val_type> >::iterator it, itb(map_traits::m_.begin()), ite(map_traits::m_.end());
     843             :     for(it=itb; it!=ite; ++it)
     844             :       if(bits[it->first])return it->first;
     845             :     std::cout<<"ERROR: state with no enumerator set"<<std::endl;
     846             :   }
     847             : 
     848             :   EnumVal<enum_type,val_type>& fromString(std::string setting)
     849             :   {
     850             :     bits.reset();
     851             :     typename std::map<enum_type,EnumPar<val_type> >::iterator it, itb(map_traits::m_.begin()), ite(map_traits::m_.end());
     852             :     for(it=itb;it!=ite;++it)
     853             :       if(setting.find(it->second.str())!=std::string::npos)bits.set(it->first);
     854             :     return *this;
     855             :   }
     856             :   // Method to get the enumerator value for the bit currently set
     857             :   std::vector<val_type> enumVal()
     858             :   {
     859             :     std::vector<val_type> v;
     860             :     typename std::map<enum_type,EnumPar<val_type> >::iterator 
     861             :       it, 
     862             :       itb=map_traits::m_.begin(), 
     863             :       ite=map_traits::m_.end();
     864             :     for(it=itb; it!=ite; ++it)
     865             :       if(bits.test(it->first))v.push_back(it->second.val());
     866             :     return v;
     867             :   }    
     868             : 
     869             : 
     870             : protected:
     871             :   static std::size_t to_bit(enum_type value)
     872             :   {
     873             :     return (value - set_traits::first) / set_traits::step;
     874             :   }
     875             :   std::bitset<set_traits::count> bits;
     876             : };
     877             : 
     878             : 
     879             : template<typename enum_type,
     880             :          typename val_type=void, 
     881             :          typename set_traits=enum_set_traits<enum_type>,
     882             :          typename map_traits=enum_map_traits<enum_type,val_type> >
     883             : class Enum
     884             : {
     885             : public:
     886        4204 :   Enum()
     887        4204 :   {
     888        4204 :   }
     889        9556 :   Enum(const enum_type setting)
     890        9556 :   {
     891        9556 :     set(setting);
     892        9556 :   }
     893             :   Enum &operator&=(const Enum &rhs)
     894             :   {
     895             :     bits &= rhs.bits;
     896             :     return *this;
     897             :   }
     898             :   Enum &operator|=(const Enum &rhs)
     899             :   {
     900             :     bits |= rhs.bits;
     901             :     return *this;
     902             :   }
     903             :   bool less (const Enum &rhs){
     904             :     if(bits.to_ulong()<rhs.bits.to_ulong())return true;
     905             :     return false;
     906             :   }
     907             :   bool operator!= (const Enum &rhs){
     908             :     if(bits.to_ulong()==rhs.bits.to_ulong())return false;
     909             :     return true;
     910             :   }
     911             :   bool operator== (const Enum &rhs){
     912             :     if(bits.to_ulong()==rhs.bits.to_ulong())return true;
     913             :     return false;
     914             :   }
     915             :   Enum &operator^=(const Enum &rhs)
     916             :   {
     917             :     bits ^= rhs.bits;
     918             :     return *this;
     919             :   }
     920         697 :   std::size_t count() const
     921             :   {
     922         697 :     return bits.count();
     923             :   }
     924             :   std::size_t size() const
     925             :   {
     926             :     return bits.size();
     927             :   }
     928     1511099 :   bool operator[](enum_type testing) const
     929             :   {
     930     1511099 :     return bits.test(to_bit(testing));
     931             :   }
     932             :   bool only(enum_type testing) const
     933             :   {
     934             :     if(count()!=1)return false;
     935             :     return bits.test(to_bit(testing));
     936             :   }
     937             :   bool operator^(enum_type testing) const   // xor operator (^ Python bitwise operator) 
     938             :   {
     939             :     if(only(testing))return true;
     940             :     if(bits.test(to_bit(testing)))return false;
     941             :     return true;
     942             :   }
     943             : 
     944             :   Enum &set()
     945             :   {
     946             :     bits.set();
     947             :     return *this;
     948             :   }
     949        9628 :   Enum &set(enum_type setting)
     950             :   {
     951        9628 :     bits.reset();
     952        9628 :     bits.set(to_bit(setting), true);
     953        9628 :     return *this;
     954             :   }
     955             :   Enum &reset()
     956             :   {
     957             :     bits.reset();
     958             :     return *this;
     959             :   }
     960             :   Enum &reset(enum_type resetting)
     961             :   {
     962             :     bits.reset(to_bit(resetting));
     963             :     return *this;
     964             :   }
     965             :   Enum &flip()
     966             :   {
     967             :     bits.flip();
     968             :     return *this;
     969             :   }
     970             :   Enum &flip(enum_type flipping)
     971             :   {
     972             :     bits.flip(to_bit(flipping));
     973             :     return *this;
     974             :   }
     975             :   Enum operator~() const
     976             :   {
     977             :     return Enum(*this).flip();
     978             :   }
     979             :   bool any() const
     980             :   {
     981             :     return bits.any();
     982             :   }
     983             :   bool none() const
     984             :   {
     985             :     return bits.none();
     986             :   }
     987             :   static std::set<std::string> enumMemberSet()
     988             :   {
     989             :     std::set<std::string> s;
     990             :     typename std::map<enum_type,EnumPar<val_type> >::iterator it, itb(map_traits::m_.begin()), ite(map_traits::m_.end());
     991             :     for(it=itb; it!=ite; ++it)s.insert(it->second.str());
     992             :     return s;
     993             :   }
     994             :   static std::vector<std::string> enumMemberList(){
     995             :     std::vector<std::string> v;
     996             :     typename std::map<enum_type,EnumPar<val_type> >::iterator it, itb(map_traits::m_.begin()), ite(map_traits::m_.end());
     997             :     for(it=itb; it!=ite; ++it)v.push_back(it->second.str());
     998             :     return v;
     999             :   }
    1000             :   static std::string doc(enum_type t){
    1001             :     typename std::map<enum_type,EnumPar<val_type> >::iterator itf(map_traits::m_.find(t));
    1002             :     return itf->second.desc();
    1003             :   }
    1004             : 
    1005             :   // Method to get the name of the enumerator set on, if set, else return empty string
    1006             :   std::string name()
    1007             :   {
    1008             :     typename std::map<enum_type,EnumPar<val_type> >::iterator it, itb(map_traits::m_.begin()), ite(map_traits::m_.end());
    1009             :     std::string s="";
    1010             :     for(it=itb;it!=ite;++it){
    1011             :       if(bits.test(to_bit(it->first)))
    1012             :         return it->second.str();
    1013             :       if(set_traits::last==it->first)break;
    1014             :     }
    1015             :     return s;
    1016             :   }
    1017             : 
    1018             :   unsigned int hash() {
    1019             :     std::string s = str();
    1020             :     unsigned int hash = 0;
    1021             :     for(size_t i = 0; i < s.size(); ++i) 
    1022             :       hash = 65599 * hash + s[i];
    1023             :     return hash ^ (hash >> 16);
    1024             :   }
    1025             : 
    1026             :   /** Methods using bits and associated with enum_map */
    1027             :   int id(){
    1028             :     int id;
    1029             :     typename std::map<enum_type,EnumPar<val_type> >::iterator it, itb(map_traits::m_.begin()), ite(map_traits::m_.end());
    1030             :     for(it=itb; it!=ite; ++it)
    1031             :       if(bits[it->first])id=it->second.id();
    1032             :     return id;
    1033             :   }
    1034           0 :   std::string str(){
    1035           0 :     return toString();
    1036             :   }
    1037           0 :   std::string toString(){
    1038           0 :     std::ostringstream os;
    1039           0 :     typename std::map<enum_type,EnumPar<val_type> >::iterator it, itb(map_traits::m_.begin()), ite(map_traits::m_.end());
    1040           0 :     for(it=itb; it!=ite; ++it)
    1041           0 :       if(bits[it->first])os<<it->second.str();
    1042           0 :     return os.str();
    1043             :   }
    1044             :   enum_type toEnumType() const{
    1045             :     typename std::map<enum_type,EnumPar<val_type> >::iterator it, itb(map_traits::m_.begin()), ite(map_traits::m_.end());
    1046             :     for(it=itb; it!=ite; ++it)
    1047             :       if(bits[it->first])return it->first;
    1048             :     std::cout<<"ERROR: state with no enumerator set"<<std::endl;
    1049             :   }
    1050             :   // Method useful when maxset>1.
    1051             :   Enum<enum_type,val_type>& fromString(std::string s){
    1052             :     bits.reset();
    1053             :     typename std::map<enum_type,EnumPar<val_type> >::iterator it, itb(map_traits::m_.begin()), ite(map_traits::m_.end());
    1054             :     for(it=itb;it!=ite;++it)
    1055             :       if(s.find(it->second.str())!=std::string::npos)bits.set(it->first);
    1056             :     return *this;
    1057             :   }
    1058             : 
    1059             : 
    1060             : protected:
    1061     1520727 :   static std::size_t to_bit(enum_type value)
    1062             :   {
    1063     1520727 :     return (value - set_traits::first) / set_traits::step;
    1064             :   }
    1065             :   std::bitset<set_traits::count> bits;
    1066             : };
    1067             : 
    1068             : 
    1069             : 
    1070             : #define _ENUM_H
    1071             : #endif

Generated by: LCOV version 1.16