00001 /** @file tcl/commandgroup.h represents a set of overloaded 00002 tcl::command objects */ 00003 00004 /////////////////////////////////////////////////////////////////////// 00005 // 00006 // Copyright (c) 2004-2004 California Institute of Technology 00007 // Copyright (c) 2004-2007 University of Southern California 00008 // Rob Peters <rjpeters at usc dot edu> 00009 // 00010 // created: Wed Jun 9 09:45:26 2004 00011 // commit: $Id: commandgroup.h 11876 2009-10-22 15:53:06Z icore $ 00012 // $HeadURL: svn://isvn.usc.edu/software/invt/trunk/saliency/src/tcl/commandgroup.h $ 00013 // 00014 // -------------------------------------------------------------------- 00015 // 00016 // This file is part of GroovX 00017 // [http://ilab.usc.edu/rjpeters/groovx/] 00018 // 00019 // GroovX is free software; you can redistribute it and/or modify it 00020 // under the terms of the GNU General Public License as published by 00021 // the Free Software Foundation; either version 2 of the License, or 00022 // (at your option) any later version. 00023 // 00024 // GroovX is distributed in the hope that it will be useful, but 00025 // WITHOUT ANY WARRANTY; without even the implied warranty of 00026 // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU 00027 // General Public License for more details. 00028 // 00029 // You should have received a copy of the GNU General Public License 00030 // along with GroovX; if not, write to the Free Software Foundation, 00031 // Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA. 00032 // 00033 /////////////////////////////////////////////////////////////////////// 00034 00035 #ifndef GROOVX_TCL_COMMANDGROUP_H_UTC20050628162421_DEFINED 00036 #define GROOVX_TCL_COMMANDGROUP_H_UTC20050628162421_DEFINED 00037 00038 typedef struct Tcl_Obj Tcl_Obj; 00039 struct Tcl_Interp; 00040 00041 namespace rutz 00042 { 00043 class file_pos; 00044 class fstring; 00045 template <class T> class shared_ptr; 00046 } 00047 00048 namespace tcl 00049 { 00050 class arg_spec; 00051 class command; 00052 class command_group; 00053 class function; 00054 class interpreter; 00055 } 00056 00057 /// Represents a set of overloaded tcl::command objects. 00058 class tcl::command_group 00059 { 00060 public: 00061 /// Find the named command, if it exists. 00062 /** Returns null if no such command. DO NOT DELETE the pointer 00063 returned from this function! Its lifetime is managed internally 00064 by tcl. */ 00065 static command_group* lookup(tcl::interpreter& interp, 00066 const char* name) throw(); 00067 00068 /// Find the named command, after following any namespace aliases. 00069 /** Returns null if no such command. DO NOT DELETE the pointer 00070 returned from this function! Its lifetime is managed internally 00071 by tcl. */ 00072 static command_group* lookup_original(tcl::interpreter& interp, 00073 const char* name) throw(); 00074 00075 /// Build a new tcl::command object that will be hooked into a tcl::command_group. 00076 /** If there is already a tcl::command_group for the given name, 00077 then the new tcl::command will be hooked into that 00078 tcl::command_group as an overload. Otherwise, a brand new 00079 tcl::command_group will be created. */ 00080 static rutz::shared_ptr<tcl::command> 00081 make(tcl::interpreter& interp, 00082 rutz::shared_ptr<tcl::function> callback, 00083 const char* cmd_name, 00084 const char* usage, 00085 const tcl::arg_spec& spec, 00086 const rutz::file_pos& src_pos); 00087 00088 /// Add the given tcl::command to this group's overload list. 00089 void add(rutz::shared_ptr<tcl::command> p); 00090 00091 /// Get this group's fully namespace-qualified command name. 00092 rutz::fstring resolved_name() const; 00093 00094 /// Returns a string giving the command's proper usage, including overloads. 00095 rutz::fstring usage() const; 00096 00097 int invoke_raw(int s_objc, Tcl_Obj *const objv[]) throw(); 00098 00099 private: 00100 class impl; 00101 friend class impl; 00102 impl* const rep; 00103 00104 /// Private constructor; clients shouldn't manipulate tcl::command_group objects directly. 00105 command_group(tcl::interpreter& interp, 00106 const rutz::fstring& cmd_name, 00107 const rutz::file_pos& src_pos); 00108 00109 /// Private destructor since destruction is automated by Tcl. 00110 ~command_group() throw(); 00111 00112 command_group(const command_group&); // not implemented 00113 command_group& operator=(const command_group&); // not implemented 00114 }; 00115 00116 static const char __attribute__((used)) vcid_groovx_tcl_commandgroup_h_utc20050628162421[] = "$Id: commandgroup.h 11876 2009-10-22 15:53:06Z icore $ $HeadURL: svn://isvn.usc.edu/software/invt/trunk/saliency/src/tcl/commandgroup.h $"; 00117 #endif // !GROOVX_TCL_COMMANDGROUP_H_UTC20050628162421_DEFINED