/home/fwph/code/wurde/rde/core/WritableType.H

Go to the documentation of this file.
00001 #ifndef WRITABLETYPE_H
00002 #define WRITABLETYPE_H
00003 
00030 // $Id: WritableType.H 68 2007-02-01 17:56:57Z fwph $
00031 
00032 /* for a logger */
00033 //#include <Logger.H>
00034 #include <string>
00035 #include <RobotTypes.H>
00036 
00037 namespace WURDE {
00038        
00056         template <class Type>
00057         class Writable {
00058               
00059         public:
00060                 Writable();
00061                 explicit Writable(Type _value);
00062                 Writable(Type _value, ConsumeMode _cmode);
00063                 Writable(Type _value, WriteMode _rwmode, std::string id);
00064                 Writable(Type _value, ConsumeMode _cmode, WriteMode _rwmode, std::string id);
00065               
00071                 bool setValue(Type _value);
00072               
00076                 Type getValue() const;
00077               
00078               
00079                 bool setRWMode(WriteMode _mode);
00083                 WriteMode getRWMode() const;
00084               
00085               
00086                 bool setCMode(ConsumeMode _mode);
00090                 ConsumeMode getCMode() const;
00091               
00096                 bool setStatus(StatusMode stat);
00097               
00098                 StatusMode getStatus() const;
00099               
00103                 bool setLock();
00104               
00108                 bool setValueAndLock(Type _value){if(!setValue(_value)){return false;} return setLock();};
00109               
00113                 bool unlock();
00114               
00118                 bool locked() const;
00119               
00123                 std::string getLockOwner() const;
00124               
00139                 void COM_ADAPTOR_setValue(Type _value);
00140               
00141               
00156                 void COM_ADAPTOR_setRWMode(WriteMode _mode);
00157               
00172                 void COM_ADAPTOR_setStatus(StatusMode stat);
00173               
00174               
00189                 void COM_ADAPTOR_setLockOwner(std::string owner);
00190               
00191                 Writable& operator=(const Writable& r) {
00192                         m_value=r.m_value;
00193                         m_rwMode=r.m_rwMode;
00194                         m_cMode=r.m_cMode;
00195                         m_sMode=r.m_sMode;
00196                         m_id=r.m_id;
00197                         m_lockOwner=r.m_lockOwner;                   
00198                         return *this;
00199                 }
00200 
00201         protected: 
00202                 Type m_value;
00203                 WriteMode m_rwMode;
00204                 ConsumeMode m_cMode;
00205                 StatusMode m_sMode;
00206                 std::string m_id;
00207                 std::string m_lockOwner;
00208               
00209         };
00210        
00211         template <class Type>
00212         Writable<Type>::Writable(Type _value, ConsumeMode _cmode, WriteMode _rwmode, std::string id){
00213                 m_value=_value;
00214                 m_cMode=_cmode;
00215                 m_rwMode=_rwmode;
00216                 m_id=id;
00217                 if(_rwmode==W_LOCKED){
00218                         m_lockOwner=m_id;
00219                 }else{
00220                         m_lockOwner="";
00221                 }
00222         }
00223        
00224         template <class Type>
00225         Writable<Type>::Writable(Type _value, ConsumeMode _cmode){
00226                 Writable(_value,_cmode,W_ALL,"Default");
00227         }
00228        
00229        
00230         template <class Type>
00231         Writable<Type>::Writable(Type _value, WriteMode _rwmode, std::string id){
00232                 Writable(_value,C_CONSUMER,_rwmode,id);
00233         }
00234        
00235         template <class Type>
00236         Writable<Type>::Writable(Type _value){
00237                 Writable(_value,C_CONSUMER,W_ALL,"Default");
00238         }
00239        
00240        
00241         template <class Type>
00242         Writable<Type>::Writable(){
00243                 m_cMode=C_CONSUMER;
00244                 m_rwMode=W_ALL;
00245                 m_id="Default";
00246                 m_lockOwner="";
00247         }
00248        
00249         template <class Type>
00250         bool Writable<Type>::setValue(Type _value){
00251                 switch (m_rwMode){
00252                 case W_SUPPLIER_ONLY: 
00253                         if(m_cMode==C_SUPPLIER){
00254                                 m_sMode=STAT_OKAY;
00255                                 m_value=_value;
00256                                 break;
00257                         }else{
00258                                 //g_warn("Consumer tried to set a supplier-only value");
00259                                 return false;
00260                         }
00261                 case W_CONSUMER_ONLY:
00262                         if(m_cMode==C_CONSUMER){
00263                                 m_sMode=STAT_REQUEST;
00264                                 m_value=_value;
00265                                 break;
00266                         }else{
00267                                 // g_warn("Supplier tried to set a consumer-only value");
00268                                 return false;
00269                         }
00270                 case W_ALL:
00271                         if(m_cMode==C_CONSUMER){
00272                                 m_sMode=STAT_REQUEST;
00273                         }else{
00274                                 m_sMode=STAT_OKAY;
00275                         }
00276                         m_value=_value;
00277                         break;
00278                 case W_LOCKED:
00279                         if(m_id==m_lockOwner){
00280                                 m_value=_value;
00281                                 break;
00282                                 if(m_cMode==C_CONSUMER){
00283                                         m_sMode=STAT_REQUEST;
00284                                 }else{
00285                                         m_sMode=STAT_NULL;
00286                                 }
00287                         }
00288                         //g_warn("Attempted to set a locked value, doesn't hold lock");
00289                         return false;
00290                 case W_NULL:
00291                 default:
00292                         //       g_error("Writable value has improper writeMode setting. THIS IS A BUG.");
00293                         return false;
00294                 }
00295               
00296                 return true;
00297         }
00298        
00299         template <class Type>
00300         Type Writable<Type>::getValue() const{
00301                 return m_value;
00302         }
00303        
00304         template <class Type>
00305         bool Writable<Type>::setRWMode(WriteMode rwmode){
00306               
00307                 /* you must EXPLICITLY use setLock or unLock to modify the read/write state of a locked variable */
00308                 if(rwmode==W_LOCKED||m_rwMode==W_LOCKED){
00309                         //g_error("Attempted to change the LOCKED status of a Writable value using setRWMode. THIS IS A BUG");
00310                         return false;
00311                 }
00312               
00313                 switch(rwmode){
00314                 case W_SUPPLIER_ONLY:
00315                         if(m_cMode==C_SUPPLIER){
00316                                 m_rwMode=rwmode;
00317                                 break;
00318                         }
00319                         return false;
00320                 case W_CONSUMER_ONLY:
00321                         if(m_cMode==C_CONSUMER){
00322                                 m_rwMode=rwmode;
00323                                 break;
00324                         }
00325                         return false;
00326                 case W_ALL:
00327                         m_rwMode=rwmode;
00328                         break;
00329                 case W_LOCKED:
00330                 case W_NULL:
00331                 default:
00332                         //             g_error("Writable value has improper mode setting. THIS IS A BUG");
00333                         return false;
00334                 }
00335               
00336                 return true;
00337               
00338         }
00339        
00340        
00341         template <class Type>
00342         WriteMode Writable<Type>::getRWMode() const{
00343                 return m_rwMode;
00344         }
00345        
00346         template <class Type>
00347         bool Writable<Type>::setCMode(ConsumeMode _mode){
00348                 m_cMode=_mode;
00349                 return true;
00350         }
00351        
00352         template <class Type>
00353         ConsumeMode Writable<Type>::getCMode() const{
00354                 return m_cMode;
00355         }
00356        
00357         template <class Type>
00358         bool Writable<Type>::setStatus(StatusMode stat){
00359                 if(m_cMode==C_SUPPLIER){
00360                         m_sMode=stat;
00361                         return true;
00362                 }
00363               
00364                 //        g_error("Consumer attempted to set the status of a Writable value. THIS IS A BUG.");
00365                 return false;
00366         }
00367        
00368         template <class Type>
00369         StatusMode Writable<Type>::getStatus() const{
00370                 return m_sMode;
00371         }
00372        
00373         template <class Type>
00374         bool Writable<Type>::setLock(){
00375                 switch (m_rwMode){
00376                 case W_SUPPLIER_ONLY:
00377                         if(m_cMode==C_SUPPLIER){
00378                                 m_rwMode=W_LOCKED;
00379                                 m_lockOwner=m_id;
00380                                 break;
00381                         }
00382                         //   g_warn("Consumer attempted to lock a value set to SUPPLIER_ONLY");
00383                         return false;
00384                 case W_CONSUMER_ONLY:
00385                         if(m_cMode==C_CONSUMER){
00386                                 m_rwMode=W_LOCKED;
00387                                 m_lockOwner=m_id;
00388                                 break;
00389                         }
00390                         //             g_warn("Supplier attempted to lock a value set to CONSUMER_ONLY");
00391                         return false;
00392                 case W_ALL:
00393                         m_rwMode=W_LOCKED;
00394                         m_lockOwner=m_id;
00395                         break;
00396                 case W_LOCKED:
00397                         //             g_warn("Attempted to lock an already locked Writable value");
00398                         return false;
00399                 case W_NULL:
00400                 default:
00401                         //g_error("Writable value has improper read/write setting. THIS IS A BUG.");
00402                         return false;
00403                 }
00404                 return true;
00405         }
00406        
00407         template <class Type>
00408         bool Writable<Type>::unlock(){
00409                 if(m_rwMode!=W_LOCKED){
00410                         //             g_warn("Attempted to unlock a Writable value which was not locked");
00411                         return false;
00412                 }
00413               
00414                 if(m_lockOwner!=m_id){
00415                         // g_warn("Non-owner attempted to unlock a Writable value.");
00416                         return false;
00417                 }
00418               
00419                 m_lockOwner="";
00420                 m_rwMode=W_ALL;
00421                 return true;
00422               
00423         }
00424        
00425         template <class Type>
00426         bool Writable<Type>::locked() const{
00427                 if (m_rwMode==W_LOCKED)
00428                         return true;
00429               
00430                 return false;
00431         }
00432        
00433        
00434         template <class Type>
00435         std::string Writable<Type>::getLockOwner() const{
00436                 return m_lockOwner;
00437         }
00438        
00439        
00440         template <class Type>
00441         void Writable<Type>::COM_ADAPTOR_setValue(Type _value){
00442                 m_value=_value;
00443         }
00444         
00445         template <class Type>
00446         void Writable<Type>::COM_ADAPTOR_setRWMode(WriteMode _mode){
00447                 m_rwMode=_mode;
00448         }
00449         
00450         template <class Type>
00451         void Writable<Type>::COM_ADAPTOR_setStatus(StatusMode stat){
00452                 m_sMode=stat;
00453         }
00454        
00455         template <class Type>
00456         void Writable<Type>::COM_ADAPTOR_setLockOwner(std::string owner){
00457                 m_lockOwner=owner;
00458         }
00459        
00460 };
00461 
00462 #endif

Generated on Thu Feb 1 15:31:54 2007 for WURDE by  doxygen 1.5.1