]> git.mxchange.org Git - simgear.git/blobdiff - simgear/structure/commands.hxx
Fix PagedLOD for random objects.
[simgear.git] / simgear / structure / commands.hxx
index 09f1c1bcf132799814e12a2d27be2aa47c9fbe72..7f4185ec421fad63aa33b4b5ae3f336dfc09baee 100644 (file)
 
 #include <string>
 #include <map>
-#include <vector>
 
-#include <simgear/threads/SGThread.hxx>
 #include <simgear/math/sg_types.hxx>
-#include <simgear/props/props.hxx>
 
+// forward decls
+class SGPropertyNode;
+     
 /**
  * Manage commands.
  *
 class SGCommandMgr
 {
 public:
+    /**
+     * Command functor object
+     */
+    class Command
+    {
+    public:
+        virtual ~Command() { }
+        virtual bool operator()(const SGPropertyNode * arg) = 0;
+    };
+
+    
+         typedef bool (*command_t) (const SGPropertyNode * arg);
 
-  /**
-   * Type for a command function.
-   */
-  typedef bool (*command_t) (const SGPropertyNode * arg);
-
+private:
+    class FunctionCommand : public Command
+    {
+    public:
+        FunctionCommand( command_t fun )
+       : f_(fun) {}
+
+        virtual bool operator()(const SGPropertyNode * arg) { return (*f_)(arg); }
+    private:
+        command_t f_;
+    };
+
+    template< class ObjPtr, typename MemFn >
+    class MethodCommand : public Command
+    {
+    public:
+        MethodCommand( const ObjPtr& pObj, MemFn pMemFn ) :
+         pObj_(pObj), pMemFn_(pMemFn) {}
+
+        virtual bool operator()(const SGPropertyNode * arg)
+        {
+            return ((*pObj_).*pMemFn_)(arg);
+        }
+    private:
+        ObjPtr pObj_;
+        MemFn pMemFn_;
+    };
+    
+   /**
+    * Helper template functions.
+    */
+
+   template< class ObjPtr, typename MemFn >
+   Command* make_functor( const ObjPtr& pObj, MemFn pMemFn )
+   {
+       return new MethodCommand<ObjPtr,MemFn>(pObj, pMemFn );
+   }
+   
+public:
+   /**
+    * Default constructor (sets instance to created item)
+    */
+   SGCommandMgr ();
 
   /**
-   * Destructor.
+   * Destructor. (sets instance to NULL)
    */
   virtual ~SGCommandMgr ();
 
-  /**
-   * Implement the classical singleton.
-   */
   static SGCommandMgr* instance();
 
   /**
    * Register a new command with the manager.
    *
-   * @param name The command name.  Any existing command with
-   * the same name will silently be overwritten.
-   * @param command A pointer to a one-arg function returning
-   * a bool result.  The argument is always a const pointer to
-   * an SGPropertyNode (which may contain multiple values).
+   * @param name    The command name. Any existing command with the same name
+   *                will silently be overwritten.
+   * @param f       A pointer to a one-arg function returning a bool result. The
+   *                argument is always a const pointer to an SGPropertyNode
+   *                (which may contain multiple values).
    */
-  virtual void addCommand (const std::string &name, command_t command);
-
-
+  void addCommand(const std::string& name, command_t f)
+  { addCommandObject(name, new FunctionCommand(f)); }
+       
+  void addCommandObject (const std::string &name, Command* command);
+
+  template<class OBJ, typename METHOD>
+  void addCommand(const std::string& name, const OBJ& o, METHOD m)
+  { 
+    addCommandObject(name, make_functor(o,m));
+  }
+  
   /**
    * Look up an existing command.
    *
@@ -70,7 +125,7 @@ public:
    * @return A pointer to the command, or 0 if there is no registered
    * command with the name specified.
    */
-  virtual command_t getCommand (const std::string &name) const;
+  virtual Command* getCommand (const std::string &name) const;
 
 
   /**
@@ -94,20 +149,19 @@ public:
    */
   virtual bool execute (const std::string &name, const SGPropertyNode * arg) const;
 
-protected:
   /**
-   * Default constructor.
+   * Remove a command registration
    */
-  SGCommandMgr ();
+  bool removeCommand(const std::string& name);
+protected:
+
 
 
 private:
 
-  typedef std::map<std::string,command_t> command_map;
+  typedef std::map<std::string,Command*> command_map;
   command_map _commands;
 
-  static SGMutex _instanceMutex;
-
 };
 
 #endif // __COMMANDS_HXX