Option.h

Go to the documentation of this file.
00001 // ----------------------------------------------------------------------------
00002 //
00003 // $Id$
00004 //
00005 // Copyright 2008, 2009, 2010, 2011, 2012  Antonio Franchi and Paolo Stegagno    
00006 //
00007 // This file is part of MIP.
00008 //
00009 // MIP is free software: you can redistribute it and/or modify
00010 // it under the terms of the GNU General Public License as published by
00011 // the Free Software Foundation, either version 3 of the License, or
00012 // (at your option) any later version.
00013 //
00014 // MIP is distributed in the hope that it will be useful,
00015 // but WITHOUT ANY WARRANTY; without even the implied warranty of
00016 // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
00017 // GNU General Public License for more details.
00018 //
00019 // You should have received a copy of the GNU General Public License
00020 // along with MIP. If not, see <http://www.gnu.org/licenses/>.
00021 //
00022 // Contact info: antonio.franchi@tuebingen.mpg.de stegagno@diag.uniroma1.it
00023 //
00024 // ----------------------------------------------------------------------------
00025 
00026 
00030 
00034 
00036 /* @{ */
00037 
00038 
00039 #ifndef __MIP_OPTION_
00040 #define __MIP_OPTION_
00041 
00042 #ifdef MIP_HOST_APPLE
00043 #include <applePatch.h>
00044 #endif
00045 
00046 #include <vector>
00047 #include <string>
00048 #include <sstream>
00049 #include <iostream>
00050 #include <assert.h>
00051 #include <stdlib.h>
00052 #include <map>
00053 #include <set>
00054 
00055 #include <Types.h>
00056 #include <R2.h>
00057 #include <SsUtils.h>
00058 
00059 // For MIPObject
00060 #include <LogTrace.h>
00061 
00062 using namespace std;
00063 
00064 enum OptionGroupsType {
00065  OPT_GRP_COMM,
00066  OPT_GRP_RESO,
00067  OPT_GRP_TASK,
00068  OPT_GRP_ALGO,
00069  OPT_GRP_OTHE,
00070  NUM_OPT_GRP
00071 };
00072 
00073 static const char* OptionGroupsNames[NUM_OPT_GRP] = {
00074   "Common",
00075   "Resources",
00076   "Tasks",
00077   "Algorithms",
00078   "Others" };
00079 
00080 enum OptionValueType {
00081  OVT_UNDEF,
00082  OVT_DECIMAL,
00083  OVT_POSITION,
00084  OVT_POSITION3D,
00085  OVT_POSE,
00086  OVT_POSE3D,
00087  OVT_ARRAY_DECIMAL,
00088  OVT_STRING,
00089  OVT_INT,
00090  OVT_BOOL,
00091  NUM_OVT
00092 };
00093 
00094 static const char* OVTNames[NUM_OVT] = {
00095   "Undef",
00096   "Decimal",
00097   "Position",
00098   "Position3D",
00099   "Pose",
00100   "Pose3D",
00101   "ArrayDecimal",
00102   "string",
00103   "int",
00104   "bool" };
00105 
00106 enum ScenarioType {
00107  KHEPERA_SCEN,
00108  WEBOTS_SCEN,
00109  PLAYER_SCEN,
00110  SCENARIO_NUMS
00111 };
00112 
00113 static const char* scenarioNames[SCENARIO_NUMS] = {
00114   "khepera\0",
00115   "webots\0",
00116   "player\0" };
00117 
00118 
00119 // Forward Declaration for Options this is important.
00120 class Options;
00121 
00125 // Forward for GenericOptionListener
00126 class GenericOption;
00127 
00128 class DecimalOption;
00129 class PositionOption;
00130 class Position3DOption;
00131 class PoseOption;
00132 class Pose3DOption;    // Added by Marco Cognetti
00133 class DecimalArrayOption; // Added by Marco Cognetti
00134 class StringOption;
00135 class IntOption;
00136 class BoolOption;
00137 
00138 // GenericOptionHandler
00139 class OptionListener {
00140 public:
00141  // does not have to implement all
00142  virtual void optionChanged(GenericOption* option) {};
00143  virtual void optionChanged(DecimalOption* option) {};
00144  virtual void optionChanged(PositionOption* option) {};
00145  virtual void optionChanged(Position3DOption* option) {};
00146  virtual void optionChanged(PoseOption* option) {};
00147  virtual void optionChanged(DecimalArrayOption* option) {};
00148  virtual void optionChanged(Pose3DOption* option) {};
00149  virtual void optionChanged(StringOption* option) {};
00150  virtual void optionChanged(IntOption* option) {};
00151  virtual void optionChanged(BoolOption* option) {};
00152 };
00153 
00154 typedef set<OptionListener*> OptionListenerSet;
00155 
00156 // reimplementation of GenericOption
00157 class GenericOption : public MIPObject {
00158 protected:
00159 
00160  string _name;
00161  string _description;
00162 
00163  OptionListenerSet _optionsListenerSet;
00164  mutable pthread_mutex_t _valueMutex;
00165 
00166  // for OptionsListener
00167  virtual void notifyOptionListeners() = 0;
00168 
00169  // protected contstuctor
00171  GenericOption(const string& name, const string& description, Options* optionsContainer);
00172 
00173  // Every Option knows its Container
00174  Options* _optionsContainer;
00175 
00176 public:
00177  // No public Contstuctor
00180  virtual string getObjectName() const {
00181   return "GenericOption";
00182  }
00183 
00184 
00187  string getName() const {
00188   return _name;
00189  }
00190 
00193  string getDescription() const {
00194   return _description;
00195  }
00196 
00198  virtual OptionValueType getType() const = 0;
00199 
00201  virtual void setValue(const string& s) = 0;
00202 
00204  virtual string print() const = 0;
00205 
00207  virtual string printValue() const = 0;
00208 
00209  // OptionListener Functions
00210  void registerOptionListener(OptionListener* optionListener);
00211 
00212  void unRegisterOptionListener(OptionListener* optionListener);
00213 
00214  // return Optionscontainer
00215  const Options& getContainer() { return *_optionsContainer; }
00216 };
00217 
00221 class DecimalOption: public GenericOption {
00222 private:
00223  static const OptionValueType TYPE = OVT_DECIMAL;
00224  Decimal _value;
00225 
00226  // for OptionsListener (overwrite to GenericOptions)
00227  void notifyOptionListeners();
00228 
00230  DecimalOption(const string& name, const string& description, Options* optionsContainer, const Decimal& value);
00231 
00233  DecimalOption(const DecimalOption& rhs);
00234 
00235 public:
00237  DecimalOption& operator=(const DecimalOption& rhs);
00238 
00241  OptionValueType getType() const;
00242  
00245  virtual string getObjectName() const {
00246   return "DecimalOption";
00247  }
00248 
00251  void setValue(const string& s);
00252 
00253  void setValue(const Decimal& v);
00254 
00257  Decimal getValue() const;
00258 
00261  string print() const;
00262 
00265  string printValue() const;
00266 
00267  // only Option can construct
00268  friend class Options;
00269 };
00270 
00274 class PositionOption: public GenericOption {
00275 private:
00276  static const OptionValueType TYPE = OVT_POSITION;
00277  Position _value;
00278 
00279  // for OptionsListener (overwrite to GenericOptions)
00280  void notifyOptionListeners();
00281 
00283  PositionOption(const string& name, const string& description, Options* optionsContainer, const Position& value);
00284 
00286  PositionOption(const PositionOption& rhs);
00287 
00288 public:
00290  PositionOption& operator=(const PositionOption& rhs);
00291 
00294  OptionValueType getType() const;
00295  
00298  virtual string getObjectName() const {
00299   return "PositionOption";
00300  }
00301 
00304  void setValue(const string& s);
00305 
00306  void setValue(const Position& v);
00307 
00310  Position getValue() const;
00311 
00314  string print() const;
00315 
00318  string printValue() const;
00319 
00320  // only Option can construct
00321  friend class Options;
00322 };
00323 
00327 class Position3DOption: public GenericOption {
00328 private:
00329  static const OptionValueType TYPE = OVT_POSITION3D;
00330  Position3D _value;
00331 
00332  // for OptionsListener (overwrite to GenericOptions)
00333  void notifyOptionListeners();
00334 
00335 
00337  Position3DOption(const string& name, const string& description, Options* optionsContainer, const Position3D& value);
00338 
00340  Position3DOption(const Position3DOption& rhs);
00341 
00342 public:
00343 
00345  Position3DOption& operator=(const Position3DOption& rhs);
00346 
00349  OptionValueType getType() const;
00350  
00353  virtual string getObjectName() const {
00354   return "Position3DOption";
00355  }
00356 
00359  void setValue(const string& s);
00360 
00361  void setValue(const Position3D& v);
00362 
00365  Position3D getValue() const;
00366 
00369  string print() const;
00370 
00373  string printValue() const;
00374 
00375  // only Option can construct
00376  friend class Options;
00377 };
00378 
00382 class PoseOption: public GenericOption {
00383 private:
00384  static const OptionValueType TYPE = OVT_POSE;
00385  Pose _value;
00386 
00387  // for OptionsListener (overwrite to GenericOptions)
00388  void notifyOptionListeners();
00389 
00391  PoseOption(const string& name, const string& description, Options* optionsContainer, const Pose& value);
00392 
00394  PoseOption(const PoseOption& rhs);
00395 
00396 public:
00397 
00399  PoseOption& operator=(const PoseOption& rhs);
00400 
00403  OptionValueType getType() const;
00404  
00407  virtual string getObjectName() const {
00408   return "PoseOption";
00409  }
00410 
00413  void setValue(const string& s);
00414 
00415  void setValue(const Pose& v);
00416 
00419  Pose getValue() const;
00420 
00423  string print() const;
00424 
00427  string printValue() const;
00428 
00429  // only Option can construct
00430  friend class Options;
00431 };
00432 
00436 class Pose3DOption: public GenericOption {
00437 private:
00438  static const OptionValueType TYPE = OVT_POSE3D;
00439  Pose3D _value;
00440 
00441  // for OptionsListener (overwrite to GenericOptions)
00442  void notifyOptionListeners();
00443 
00445  Pose3DOption(const string& name, const string& description, Options* optionsContainer, const Pose3D& value);
00446 
00448  Pose3DOption(const Pose3DOption& rhs);
00449 
00450 public:
00451 
00453  Pose3DOption& operator=(const Pose3DOption& rhs);
00454 
00457  OptionValueType getType() const;
00458  
00461  virtual string getObjectName() const {
00462   return "Pose3DOption";
00463  }
00464 
00467  void setValue(const string& s);
00468 
00469  void setValue(const Pose3D& v);
00470 
00473  Pose3D getValue() const;
00474 
00477  string print() const;
00478 
00481  string printValue() const;
00482 
00483  // only Option can construct
00484  friend class Options;
00485 };
00486 
00493 class DecimalArrayOption: public GenericOption {
00494 private:
00495  static const OptionValueType TYPE = OVT_ARRAY_DECIMAL;
00497  vector<Decimal> _valueVec;
00499  string _value;
00500 
00501  // for OptionsListener (overwrite to GenericOptions)
00502  void notifyOptionListeners();
00503 
00506  DecimalArrayOption(const string& name, const string& description, Options* optionsContainer, const string& value);
00507 
00509  DecimalArrayOption(const DecimalArrayOption& rhs);
00510 
00511 public:
00513  DecimalArrayOption& operator=(const DecimalArrayOption& rhs);
00514 
00517  OptionValueType getType() const;
00518  
00521  virtual string getObjectName() const {
00522   return "DecimalArrayOption";
00523  }
00524 
00527  void setValue(const string& s);
00528 
00529  void setValue(const vector<Decimal>& v);
00530 
00533  string getValue() const;
00534  
00536  bool fromString();
00537  
00540  vector<Decimal> getValueVec();
00541  
00544  string print() const;
00545 
00548  string printValue() const;
00549 
00550  // only Option can construct
00551  friend class Options;
00552 };
00553 
00557 class IntOption: public GenericOption {
00558 private:
00559  static const OptionValueType TYPE = OVT_INT;
00560  int _value;
00561 
00562  // for OptionsListener (overwrite to GenericOptions)
00563  void notifyOptionListeners();
00564 
00566  IntOption(const string& name, const string& description, Options* optionsContainer, const int& value);
00567 
00569  IntOption(const IntOption& rhs);
00570 
00571 public:
00573  IntOption& operator=(const IntOption& rhs);
00574 
00577  OptionValueType getType() const;
00578  
00581  virtual string getObjectName() const {
00582   return "IntOption";
00583  }
00584 
00587  void setValue(const string& s);
00588 
00589  void setValue(const int& v);
00590 
00593  int getValue() const;
00594 
00597  string print() const;
00598 
00601  string printValue() const;
00602 
00603  // only Option can construct
00604  friend class Options;
00605 };
00606 
00610 class StringOption: public GenericOption {
00611 private:
00612  static const OptionValueType TYPE = OVT_STRING;
00613  string _value;
00614 
00615  // for OptionsListener (overwrite to GenericOptions)
00616  void notifyOptionListeners();
00617 
00619  StringOption(const string& name, const string& description, Options* optionsContainer, const string& value);
00620 
00622  StringOption(const StringOption& rhs);
00623 
00624 public:
00625 
00627  StringOption& operator=(const StringOption& rhs);
00628 
00631  OptionValueType getType() const;
00632  
00635  virtual string getObjectName() const {
00636   return "StringOption";
00637  }
00638 
00641  void setValue(const string& v);
00642 
00643  //   void setValue(string& v);
00644 
00647  string getValue() const;
00648 
00651  string print() const;
00652 
00655  string printValue() const;
00656 
00657  // only Option can construct
00658  friend class Options;
00659 };
00660 
00664 class BoolOption: public GenericOption {
00665 private:
00666  static const OptionValueType TYPE = OVT_BOOL;
00667  bool _value;
00668 
00669  // for OptionsListener (overwrite to GenericOptions)
00670  void notifyOptionListeners();
00671 
00673  BoolOption(const string& name, const string& description, Options* optionsContainer, const bool& value);
00674 
00676  BoolOption(const BoolOption& rhs);
00677 
00678 public:
00680  BoolOption& operator=(const BoolOption& rhs);
00681 
00684  OptionValueType getType() const;
00685  
00688  virtual string getObjectName() const {
00689   return "BoolOption";
00690  }
00691 
00694  void setValue(const string& s);
00695 
00696  void setValue(const bool& v);
00697 
00700  bool getValue() const;
00701 
00704  string print() const;
00705 
00708  string printValue() const;
00709 
00710  // only Option can construct
00711  friend class Options;
00712 };
00713 
00714 
00715 
00716 // fires AFTER a new Option class got created, or just BEFORE it is destroyed.
00717 class GlobalOptionsListener : public OptionListener
00718 {
00719 public:
00720  // Creation
00721  virtual void optionWasCreated(GenericOption* option) {};
00722  virtual void optionWasCreated(DecimalOption* option) {};
00723  virtual void optionWasCreated(PositionOption* option) {};
00724  virtual void optionWasCreated(Position3DOption* option) {};
00725  virtual void optionWasCreated(PoseOption* option) {};
00726  virtual void optionWasCreated(Pose3DOption* option) {};
00727  virtual void optionWasCreated(DecimalArrayOption* option) {};
00728  virtual void optionWasCreated(StringOption* option) {};
00729  virtual void optionWasCreated(IntOption* option) {};
00730  virtual void optionWasCreated(BoolOption* option) {};
00731 
00732  // Deletion
00733  virtual void optionWillBeDeleted(GenericOption* option) {};
00734  virtual void optionWillBeDeleted(DecimalOption* option) {};
00735  virtual void optionWillBeDeleted(PositionOption* option) {};
00736  virtual void optionWillBeDeleted(Position3DOption* option) {};
00737  virtual void optionWillBeDeleted(PoseOption* option) {};
00738  virtual void optionWillBeDeleted(Pose3DOption* option) {};
00739  virtual void optionWillBeDeleted(DecimalArrayOption* option) {};
00740  virtual void optionWillBeDeleted(StringOption* option) {};
00741  virtual void optionWillBeDeleted(IntOption* option) {};
00742  virtual void optionWillBeDeleted(BoolOption* option) {};
00743 };
00744 
00745 typedef set<Options*> GlobalOptionsSet;
00746 typedef set<GlobalOptionsListener*> GlobalOptionsListenerSet;
00747 
00748 
00749 typedef set<DecimalOption*> DecimalOptionSet;
00750 typedef set<PositionOption*> PositionOptionSet;
00751 typedef set<Position3DOption*> Position3DOptionSet;
00752 typedef set<PoseOption*> PoseOptionSet;
00753 typedef set<Pose3DOption*> Pose3DOptionSet;
00754 typedef set<DecimalArrayOption*> DecimalArrayOptionSet;
00755 typedef set<IntOption*> IntOptionSet;
00756 typedef set<StringOption*> StringOptionSet;
00757 typedef set<BoolOption*> BoolOptionSet;
00758 
00759 typedef map<string, GenericOption*> GenericOptionNameMap;
00760 typedef set<GenericOption*> GenericOptionSet;
00761 
00762 
00763 // New Options.
00764 class Options: public MIPObject {
00765 private:
00766  // Static OptionSet
00767  static GlobalOptionsSet _globalOptionsSet;
00768  static GlobalOptionsListenerSet _globalOptionsListenerSet;
00769 
00770  // All Options, referenced by Name
00771  GenericOptionNameMap _genericOptionNameMap;
00772 
00773  // Duplication for fast access to type specific types
00774  DecimalOptionSet _decimalOptionSet;
00775  PositionOptionSet _positionOptionSet;
00776  Position3DOptionSet _position3DOptionSet;
00777  PoseOptionSet _poseOptionSet;
00778  Pose3DOptionSet _pose3DOptionSet;
00779  DecimalArrayOptionSet _decimalArrayOptionSet;
00780  IntOptionSet _intOptionSet;
00781  StringOptionSet _stringOptionSet;
00782  BoolOptionSet _boolOptionSet;
00783 
00784  // Set that keeps track of options that are mandatory to Update
00785  GenericOptionSet _updateMandatorySet;
00786 
00787  // Notification Helper Function
00788  void notifyWasCreatedGlobalOptionsListener(DecimalOption* option);
00789  void notifyWasCreatedGlobalOptionsListener(PositionOption* option);
00790  void notifyWasCreatedGlobalOptionsListener(Position3DOption* option);
00791  void notifyWasCreatedGlobalOptionsListener(PoseOption* option);
00792  void notifyWasCreatedGlobalOptionsListener(Pose3DOption* option);
00793  void notifyWasCreatedGlobalOptionsListener(DecimalArrayOption* option);
00794  void notifyWasCreatedGlobalOptionsListener(StringOption* option);
00795  void notifyWasCreatedGlobalOptionsListener(IntOption* option);
00796  void notifyWasCreatedGlobalOptionsListener(BoolOption* option);
00797 
00798  void notifyWillBeDeletedGlobalOptionsListener(DecimalOption* option);
00799  void notifyWillBeDeletedGlobalOptionsListener(PositionOption* option);
00800  void notifyWillBeDeletedGlobalOptionsListener(Position3DOption* option);
00801  void notifyWillBeDeletedGlobalOptionsListener(PoseOption* option);
00802  void notifyWillBeDeletedGlobalOptionsListener(Pose3DOption* option);
00803  void notifyWillBeDeletedGlobalOptionsListener(DecimalArrayOption* option);
00804  void notifyWillBeDeletedGlobalOptionsListener(StringOption* option);
00805  void notifyWillBeDeletedGlobalOptionsListener(IntOption* option);
00806  void notifyWillBeDeletedGlobalOptionsListener(BoolOption* option);
00807 
00808 public:
00810  Options();
00811 
00813  virtual ~Options();
00816  virtual string getObjectName() const = 0;
00817 
00818  virtual OptionGroupsType getGroup() {
00819   return OPT_GRP_OTHE;
00820  }
00821 
00822  // Returns String Interpretation
00823  string toString() const;
00824 
00825  // Prints all variables to screen.
00826  void print() const;
00827 
00828  // Accessing Option Elements
00829  GenericOption* getOptionWithName(const string& name);
00830  bool hasOptionWithName(const string& name);
00831 
00832  // Creating & Deleting Option Elements
00833  DecimalOption* createDecimalOption(const string& name,
00834    const string& description, const Decimal& value,
00835    bool updateMandatory = false);
00836  PositionOption* createPositionOption(const string& name,
00837    const string& description, const Position& value,
00838    bool updateMandatory = false);
00839  Position3DOption* createPosition3DOption(const string& name,
00840    const string& description, const Position3D& value,
00841    bool updateMandatory = false);
00842  PoseOption* createPoseOption(const string& name, const string& description,
00843    const Pose& value, bool updateMandatory = false);
00844  Pose3DOption* createPose3DOption(const string& name, const string& description,
00845    const Pose3D& value, bool updateMandatory = false);
00846  DecimalArrayOption* createDecimalArrayOption(const string& name, const string& description,
00847    const string& value, bool updateMandatory = false);
00848  IntOption* createIntOption(const string& name, const string& description,
00849    int value, bool updateMandatory = false);
00850  StringOption* createStringOption(const string& name,
00851    const string& description, const string& value,
00852    bool updateMandatory = false);
00853  BoolOption* createBoolOption(const string& name, const string& description,
00854    bool value, bool updateMandatory = false);
00855 
00856  bool removeOption(GenericOption* genericOption);
00857  bool removeDecimalOption(DecimalOption* decimalOption);
00858  bool removePositionOption(PositionOption* positionOption);
00859  bool removePosition3DOption(Position3DOption* position3DOption);
00860  bool removePoseOption(PoseOption* poseOption);
00861  bool removePose3DOption(Pose3DOption* poseOption);
00862  bool removeDecimalArrayOption(DecimalArrayOption* DecimalArrayOption);
00863  bool removeIntOption(IntOption* intOption);
00864  bool removeStringOption(StringOption* stringOption);
00865  bool removeBoolOption(BoolOption* boolOption);
00866 
00867  // update already registered names (with the derived class)
00868  void updateValues(bool checkForUpdateMandatroy = true);
00869  void updateValue(const string& name, const string& value);
00870 
00871  // static functions. Apply to all Option Objects.
00872  static const GlobalOptionsSet& getGlobalOptionsSet() {
00873   return _globalOptionsSet;
00874  }
00875 
00876  static GenericOption* globalGetOptionWithName(const string& name);
00877 
00878 
00879  // GlobalOptionsListener Functions
00880  static void registerGlobalOptionsListener(GlobalOptionsListener* globalOptionsListener);
00881 
00882  static void unRegisterGlobalOptionsListener(GlobalOptionsListener* globalOptionsListener);
00883 };
00884 
00885 #endif // __MIP_OPTION_
00886 

Generated on Mon Feb 20 07:01:06 2017 for MIP by  doxygen 1.5.6