00001 /** @file tcl/argspec.h specify min/max number of arguments that a tcl 00002 command can accept */ 00003 00004 /////////////////////////////////////////////////////////////////////// 00005 // 00006 // Copyright (c) 2005-2007 University of Southern California 00007 // Rob Peters <rjpeters at usc dot edu> 00008 // 00009 // created: Mon Jun 27 16:47:04 2005 00010 // commit: $Id: argspec.h 11876 2009-10-22 15:53:06Z icore $ 00011 // $HeadURL: svn://isvn.usc.edu/software/invt/trunk/saliency/src/tcl/argspec.h $ 00012 // 00013 // -------------------------------------------------------------------- 00014 // 00015 // This file is part of GroovX 00016 // [http://ilab.usc.edu/rjpeters/groovx/] 00017 // 00018 // GroovX is free software; you can redistribute it and/or modify it 00019 // under the terms of the GNU General Public License as published by 00020 // the Free Software Foundation; either version 2 of the License, or 00021 // (at your option) any later version. 00022 // 00023 // GroovX is distributed in the hope that it will be useful, but 00024 // WITHOUT ANY WARRANTY; without even the implied warranty of 00025 // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU 00026 // General Public License for more details. 00027 // 00028 // You should have received a copy of the GNU General Public License 00029 // along with GroovX; if not, write to the Free Software Foundation, 00030 // Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA. 00031 // 00032 /////////////////////////////////////////////////////////////////////// 00033 00034 #ifndef GROOVX_TCL_ARGSPEC_H_UTC20050628064704_DEFINED 00035 #define GROOVX_TCL_ARGSPEC_H_UTC20050628064704_DEFINED 00036 00037 #include <limits> 00038 00039 namespace tcl 00040 { 00041 /// Specify how many args a command can take. 00042 /** By convention, argc_min() and argc_max() INCLUDE the zero'th 00043 argument (i.e. the command name) in the arg count. Thus a 00044 command that takes no parameters would have an arg count of 00045 1. If is_exact() is true, then the argc of a command invocation 00046 is required to be exactly equal either argc_min() or argc_max(); 00047 if it is false, then argc must be between argc_min() and 00048 argc_max(), inclusive. */ 00049 class arg_spec 00050 { 00051 public: 00052 arg_spec() 00053 : 00054 m_argc_min(0), 00055 m_argc_max(0), 00056 m_is_exact(false) 00057 {} 00058 00059 /// Construct with initial values for m_argc_min/m_argc_max/m_is_exact. 00060 /** If the value given for nmax is negative, then m_argc_max will 00061 be set to the same value as nmin. */ 00062 explicit arg_spec(int nmin, int nmax = -1, bool ex = false) 00063 : 00064 m_argc_min(nmin < 0 00065 ? 0 00066 : static_cast<unsigned int>(nmin)), 00067 m_argc_max(nmax == -1 00068 ? m_argc_min 00069 : static_cast<unsigned int>(nmax)), 00070 m_is_exact(ex) 00071 {} 00072 00073 arg_spec& min(int nmin) { m_argc_min = nmin; return *this; } 00074 arg_spec& max(int nmax) { m_argc_max = nmax; return *this; } 00075 arg_spec& exact(bool ex) { m_is_exact = ex; return *this; } 00076 00077 arg_spec& nolimit() 00078 { 00079 m_argc_max = std::numeric_limits<unsigned int>::max(); 00080 m_is_exact = false; 00081 return *this; 00082 } 00083 00084 bool allows_argc(unsigned int objc) const 00085 { 00086 if (this->m_is_exact) 00087 { 00088 return (objc == this->m_argc_min || 00089 objc == this->m_argc_max); 00090 } 00091 // else... 00092 return (objc >= this->m_argc_min && 00093 objc <= this->m_argc_max); 00094 } 00095 00096 unsigned int argc_min() const { return m_argc_min; } 00097 unsigned int argc_max() const { return m_argc_max; } 00098 bool is_exact() const { return m_is_exact; } 00099 00100 private: 00101 unsigned int m_argc_min; 00102 unsigned int m_argc_max; 00103 bool m_is_exact; 00104 }; 00105 } 00106 00107 static const char __attribute__((used)) vcid_groovx_tcl_argspec_h_utc20050628064704[] = "$Id: argspec.h 11876 2009-10-22 15:53:06Z icore $ $HeadURL: svn://isvn.usc.edu/software/invt/trunk/saliency/src/tcl/argspec.h $"; 00108 #endif // !GROOVX_TCL_ARGSPEC_H_UTC20050628064704DEFINED