Main Page | Class Hierarchy | Alphabetical List | Class List | File List | Class Members | Related Pages

ArConfigArg.cpp

00001 /*
00002 ActivMedia Robotics Interface for Applications (ARIA)
00003 Copyright (C) 2004,2005 ActivMedia Robotics, LLC
00004 
00005 
00006      This program is free software; you can redistribute it and/or modify
00007      it under the terms of the GNU General Public License as published by
00008      the Free Software Foundation; either version 2 of the License, or
00009      (at your option) any later version.
00010 
00011      This program is distributed in the hope that it will be useful,
00012      but WITHOUT ANY WARRANTY; without even the implied warranty of
00013      MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
00014      GNU General Public License for more details.
00015 
00016      You should have received a copy of the GNU General Public License
00017      along with this program; if not, write to the Free Software
00018      Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA
00019 
00020 If you wish to redistribute ARIA under different terms, contact 
00021 ActivMedia Robotics for information about a commercial version of ARIA at 
00022 robots@activmedia.com or 
00023 ActivMedia Robotics, 19 Columbia Drive, Amherst, NH 03031; 800-639-9481
00024 
00025 */
00026 
00027 #include "ArExport.h"
00028 #include "ariaOSDef.h"
00029 #include "ArConfigArg.h"
00030 #include "ArLog.h"
00031 #include "ArArgumentBuilder.h"
00032 
00033 ArConfigArg::ArConfigArg()
00034 {
00035   clear();
00036 }
00037 
00038 ArConfigArg::ArConfigArg(const char * name, int *pointer, 
00039                       const char * description, int minInt, int maxInt) 
00040 { 
00041   clear();
00042   myType = INT;
00043   myIntType = INT_INT;
00044   myName = name; 
00045   myDescription = description;
00046   myMinInt = minInt;
00047   myMaxInt = maxInt;
00048   myIntPointer = pointer;
00049 }
00050 
00051 ArConfigArg::ArConfigArg(const char * name, short *pointer, 
00052                       const char * description, int minInt, int maxInt) 
00053 { 
00054   clear();
00055   myType = INT;
00056   myIntType = INT_SHORT;
00057   myName = name; 
00058   myDescription = description;
00059   myMinInt = minInt;
00060   myMaxInt = maxInt;
00061   myIntShortPointer = pointer;
00062 }
00063 
00064 ArConfigArg::ArConfigArg(const char * name, unsigned short *pointer, 
00065                       const char * description, int minInt, int maxInt) 
00066 { 
00067   clear();
00068   myType = INT;
00069   myIntType = INT_UNSIGNED_SHORT;
00070   myName = name; 
00071   myDescription = description;
00072   myMinInt = minInt;
00073   myMaxInt = maxInt;
00074   myIntUnsignedShortPointer = pointer;
00075 }
00076 
00077 ArConfigArg::ArConfigArg(const char * name, unsigned char *pointer, 
00078                       const char * description, int minInt, int maxInt) 
00079 { 
00080   clear();
00081   myType = INT;
00082   myIntType = INT_UNSIGNED_CHAR;
00083   myName = name; 
00084   myDescription = description;
00085   myMinInt = minInt;
00086   myMaxInt = maxInt;
00087   myIntUnsignedCharPointer = pointer;
00088 }
00089 
00090 ArConfigArg::ArConfigArg(const char * name, double *pointer,
00091                       const char * description, double minDouble, 
00092                       double maxDouble) 
00093 { 
00094   clear();
00095   myType = DOUBLE;
00096   myName = name; 
00097   myDescription = description;
00098   myMinDouble = minDouble;
00099   myMaxDouble = maxDouble;
00100   myDoublePointer = pointer;
00101 }
00102 
00103 ArConfigArg::ArConfigArg(const char * name, bool *pointer, 
00104                       const char * description) 
00105 { 
00106   clear();
00107   myType = BOOL;
00108   myName = name; 
00109   myDescription = description;
00110   myBoolPointer = pointer;
00111 }
00112 
00113 
00114 ArConfigArg::ArConfigArg(const char * name, int val, 
00115                       const char * description, int minInt, int maxInt) 
00116 { 
00117   clear();
00118   myType = INT;
00119   myIntType = INT_INT;
00120   myName = name; 
00121   myDescription = description;
00122   myMinInt = minInt;
00123   myMaxInt = maxInt;
00124   myIntPointer = new int;
00125   *myIntPointer = val;
00126   myOwnPointedTo = true;
00127 }
00128 
00129 ArConfigArg::ArConfigArg(const char * name, double val,
00130                       const char * description, double minDouble, 
00131                       double maxDouble) 
00132 { 
00133   clear();
00134   myType = DOUBLE;
00135   myName = name; 
00136   myDescription = description;
00137   myMinDouble = minDouble;
00138   myMaxDouble = maxDouble;
00139   myDoublePointer = new double;
00140   *myDoublePointer = val;
00141   myOwnPointedTo = true;
00142 }
00143 
00144 ArConfigArg::ArConfigArg(const char * name, bool val, 
00145                       const char * description) 
00146 { 
00147   clear();
00148   myType = BOOL;
00149   myName = name; 
00150   myDescription = description;
00151   myBoolPointer = new bool;
00152   *myBoolPointer = val;
00153   myOwnPointedTo = true;
00154 }
00155 
00162 ArConfigArg::ArConfigArg(const char * name, char *str, 
00163                       const char * description, size_t maxStrLen) 
00164 { 
00165   clear();
00166   myType = STRING;
00167   myName = name; 
00168   myDescription = description;
00169   if (maxStrLen == 0)
00170   {
00171     myUsingOwnedString = true;
00172     myString = str;
00173   }
00174   else
00175   {
00176     myStringPointer = str;
00177     myMaxStrLen = maxStrLen;
00178   }
00179 }
00180 
00193 ArConfigArg::ArConfigArg(const char *name, 
00194                       ArRetFunctor1<bool, ArArgumentBuilder *> *setFunctor, 
00195               ArRetFunctor<const std::list<ArArgumentBuilder *> *> *getFunctor,
00196                       const char *description)
00197 {
00198   clear();
00199   myType = FUNCTOR;
00200   myName = name;
00201   myDescription = description;
00202   mySetFunctor = setFunctor;
00203   myGetFunctor = getFunctor;
00204 }
00205 
00206 ArConfigArg::ArConfigArg(const char * description)
00207 { 
00208   clear();
00209   myType = DESCRIPTION_HOLDER;
00210   myDescription = description;
00211 }
00212 
00213 ArConfigArg::ArConfigArg(const ArConfigArg & arg) 
00214 {
00215   copy(arg);
00216 }
00217 
00218 ArConfigArg &ArConfigArg::operator=(const ArConfigArg & arg) 
00219 {
00220   if (this != &arg) 
00221   {
00222     copy(arg);
00223   }
00224   return *this;
00225 }
00226 
00227 void ArConfigArg::copy(const ArConfigArg &arg)
00228 {
00229   clear();
00230   myType = arg.myType;
00231   myIntType = arg.myIntType;
00232   myName = arg.myName;
00233   myDescription = arg.myDescription;
00234   myOwnPointedTo = arg.myOwnPointedTo;
00235   if (arg.myOwnPointedTo && arg.myIntPointer != NULL)
00236   {
00237     myIntPointer = new int;
00238     *myIntPointer = *arg.myIntPointer;
00239   }
00240   else
00241   {
00242     myIntPointer = arg.myIntPointer;
00243   }
00244   if (arg.myOwnPointedTo && arg.myIntShortPointer != NULL)
00245   {
00246     myIntShortPointer = new short;
00247     *myIntShortPointer = *arg.myIntShortPointer;
00248   }
00249   else
00250   {
00251     myIntShortPointer = arg.myIntShortPointer;
00252   }
00253   if (arg.myOwnPointedTo && arg.myIntUnsignedShortPointer != NULL)
00254   {
00255     myIntUnsignedShortPointer = new unsigned short;
00256     *myIntUnsignedShortPointer = *arg.myIntUnsignedShortPointer;
00257   }
00258   else
00259   {
00260     myIntUnsignedShortPointer = arg.myIntUnsignedShortPointer;
00261   }
00262   if (arg.myOwnPointedTo && arg.myIntUnsignedCharPointer != NULL)
00263   {
00264     myIntUnsignedCharPointer = new unsigned char;
00265     *myIntUnsignedCharPointer = *arg.myIntUnsignedCharPointer;
00266   }
00267   else
00268   {
00269     myIntUnsignedCharPointer = arg.myIntUnsignedCharPointer;
00270   }
00271   if (arg.myOwnPointedTo && arg.myDoublePointer != NULL) 
00272   {
00273     myDoublePointer = new double;
00274     *myDoublePointer = *arg.myDoublePointer;
00275   }
00276   else
00277   {
00278     myDoublePointer = arg.myDoublePointer;
00279   }
00280   if (arg.myOwnPointedTo && arg.myBoolPointer != NULL)
00281   {
00282     myBoolPointer = new bool;
00283     *myBoolPointer = *arg.myBoolPointer;
00284   }
00285   else
00286   {
00287     myBoolPointer = arg.myBoolPointer;
00288   }
00289   myStringPointer = arg.myStringPointer;
00290   myMinInt = arg.myMinInt;
00291   myMaxInt = arg.myMaxInt;
00292   myMinDouble = arg.myMinDouble;
00293   myMaxDouble = arg.myMaxDouble;
00294   myMaxStrLen = arg.myMaxStrLen;
00295   mySetFunctor = arg.mySetFunctor;
00296   myGetFunctor = arg.myGetFunctor;    
00297   myUsingOwnedString = arg.myUsingOwnedString;
00298   myString = arg.myString;
00299   myConfigPriority = arg.myConfigPriority;
00300   myIgnoreBounds = arg.myIgnoreBounds;
00301 }
00302 
00303 ArConfigArg::~ArConfigArg()
00304 {
00305   clear();
00306 }
00307 
00308 void ArConfigArg::clear(void)
00309 {
00310   myType = INVALID;
00311   myIntType = INT_NOT;
00312   myName = "";
00313   myDescription = "";
00314   myOwnPointedTo = false;
00315   if (myOwnPointedTo && myIntPointer != NULL)
00316     delete myIntPointer;
00317   myIntPointer = NULL;
00318   if (myOwnPointedTo && myIntShortPointer != NULL)
00319     delete myIntShortPointer;
00320   myIntShortPointer = NULL;
00321   if (myOwnPointedTo && myIntUnsignedShortPointer != NULL)
00322     delete myIntUnsignedShortPointer;
00323   myIntUnsignedShortPointer = NULL;
00324   if (myOwnPointedTo && myIntUnsignedCharPointer != NULL)
00325     delete myIntUnsignedCharPointer;
00326   myIntUnsignedCharPointer = NULL;
00327   if (myOwnPointedTo && myDoublePointer != NULL)
00328     delete myDoublePointer;
00329   myDoublePointer = NULL;
00330   if (myOwnPointedTo && myBoolPointer != NULL)
00331     delete myBoolPointer;
00332   myBoolPointer = NULL;
00333   myStringPointer = NULL;
00334   myUsingOwnedString = false;
00335   myString = "";
00336   myMinInt = INT_MIN;
00337   myMaxInt = INT_MAX;
00338   myMinDouble = -HUGE_VAL;
00339   myMaxDouble = HUGE_VAL;
00340   myMaxStrLen = 0;
00341   mySetFunctor = NULL;
00342   myGetFunctor = NULL;  
00343   myConfigPriority = ArPriority::NORMAL;
00344   myIgnoreBounds = false;
00345 }
00346 
00353 ArConfigArg::Type ArConfigArg::getType(void) const
00354 {
00355   return myType;
00356 }
00357 
00358 int ArConfigArg::getMinInt(void) const
00359 {
00360   return myMinInt;
00361 }
00362 
00363 int ArConfigArg::getMaxInt(void) const
00364 {
00365   return myMaxInt;
00366 }
00367 
00368 double ArConfigArg::getMinDouble(void) const
00369 {
00370   return myMinDouble;
00371 }
00372 
00373 double ArConfigArg::getMaxDouble(void) const
00374 {
00375   return myMaxDouble;
00376 }
00377 
00378 const char *ArConfigArg::getName(void) const
00379 {
00380   return myName.c_str();
00381 }
00382 
00383 const char *ArConfigArg::getDescription(void) const
00384 {
00385   return myDescription.c_str();
00386 }
00387 
00388 int ArConfigArg::getInt(void) const
00389 { 
00390   // only one of these will be valid
00391   if (myIntPointer != NULL)
00392     return *myIntPointer;
00393   else if (myIntShortPointer != NULL)
00394     return *myIntShortPointer;
00395   else if (myIntUnsignedShortPointer != NULL)
00396     return *myIntUnsignedShortPointer;
00397   else if (myIntUnsignedCharPointer != NULL)
00398     return *myIntUnsignedCharPointer;
00399   else
00400     return 0;
00401 }
00402 
00403 double ArConfigArg::getDouble(void) const 
00404 {
00405   if (myDoublePointer != NULL)
00406     return *myDoublePointer; 
00407   else
00408     return 0;
00409 }
00410 
00411 bool ArConfigArg::getBool(void) const
00412 {
00413   if (myBoolPointer != NULL)
00414     return *myBoolPointer;
00415   else
00416     return false;
00417 }
00418 
00419 const char *ArConfigArg::getString(void) const
00420 {
00421   if (myUsingOwnedString)
00422     return myString.c_str();
00423   else if (myStringPointer != NULL)
00424     return myStringPointer;
00425   else
00426     return NULL;
00427 }
00428 
00429 const std::list<ArArgumentBuilder *> *ArConfigArg::getArgsWithFunctor(void) const
00430 {
00431   if (myGetFunctor == NULL)
00432     return NULL;
00433   else
00434     return myGetFunctor->invokeR();
00435 }
00436 
00437 bool ArConfigArg::setInt(int val, char *errorBuffer, 
00438                                   size_t errorBufferLen, bool doNotSet)
00439 {
00440   
00441   if (!myIgnoreBounds && val < myMinInt)
00442   {
00443     ArLog::log(ArLog::Normal, "ArConfigArg of %s: setInt value %d below range [%d, %d]", getName(), val, myMinInt, myMaxInt);
00444     if (errorBuffer != NULL)
00445       snprintf(errorBuffer, errorBufferLen, "%s value of %d is below minimum of %d.", getName(), val, myMinInt);
00446     return false;
00447   }
00448   if (!myIgnoreBounds && val > myMaxInt)
00449   {
00450     ArLog::log(ArLog::Normal, "ArConfigArg of %s: setInt value %d above range [%d, %d]", getName(), val, myMinInt, myMaxInt);
00451     if (errorBuffer != NULL)
00452       snprintf(errorBuffer, errorBufferLen, "%s value of %d is above maximum of %d.", getName(), val, myMaxInt);
00453     return false;
00454   }
00455   if ((myIntType == INT_INT && myIntPointer == NULL) || 
00456       (myIntType == INT_SHORT && myIntShortPointer == NULL) || 
00457       (myIntType == INT_UNSIGNED_SHORT && 
00458        myIntUnsignedShortPointer == NULL) || 
00459       (myIntType == INT_UNSIGNED_CHAR && myIntUnsignedCharPointer == NULL))
00460   {
00461     ArLog::log(ArLog::Normal, "ArConfigArg of %s: setInt called with NULL int pointer.", getName());
00462     if (errorBuffer != NULL)
00463       snprintf(errorBuffer, errorBufferLen, "%s pointer is NULL.", getName());
00464     return false;
00465   }
00466 
00467   if (!doNotSet)
00468   {
00469     if (myIntType == INT_INT)
00470       *myIntPointer = val;
00471     else if (myIntType == INT_SHORT) 
00472       *myIntShortPointer = val;
00473     else if (myIntType == INT_UNSIGNED_SHORT) 
00474       *myIntUnsignedShortPointer = val;
00475     else if (myIntType == INT_UNSIGNED_CHAR) 
00476       *myIntUnsignedCharPointer = val;
00477     else
00478     {
00479       ArLog::log(ArLog::Normal, "ArConfigArg of %s: int is bad type.", getName());
00480       if (errorBuffer != NULL)
00481         snprintf(errorBuffer, errorBufferLen, "%s int is bad type (%d).", getName(), myIntType);
00482       return false;
00483     }
00484   }
00485   return true;
00486 }
00487 
00488 bool ArConfigArg::setDouble(double val, char *errorBuffer,
00489                                      size_t errorBufferLen, bool doNotSet)
00490 { 
00491   if (!myIgnoreBounds && val < myMinDouble)
00492   {
00493     ArLog::log(ArLog::Normal, "ArConfigArg of %s: setDouble value %g below range [%g, %g]", getName(), val, myMinDouble, myMaxDouble);
00494     if (errorBuffer != NULL)
00495       snprintf(errorBuffer, errorBufferLen, "%s value of %g is below minimum of %g.", getName(), val, myMinDouble);
00496     return false;
00497   }
00498   if (!myIgnoreBounds && val > myMaxDouble)
00499   {
00500     ArLog::log(ArLog::Normal, "ArConfigArg of %s: setDouble value %g above range [%g, %g]", getName(), val, myMinDouble, myMaxDouble);
00501     if (errorBuffer != NULL)
00502       snprintf(errorBuffer, errorBufferLen, "%s value of %g is above maximum of %g.", getName(), val, myMaxDouble);
00503     return false;
00504   }
00505   if (myDoublePointer == NULL)
00506   {
00507     ArLog::log(ArLog::Normal, "ArConfigArg of %s: setDouble called with NULL pointer.", getName());
00508     if (errorBuffer != NULL)
00509       snprintf(errorBuffer, errorBufferLen, "%s pointer is NULL.", getName());
00510     return false;
00511   }
00512   // if we got to here we're good
00513   if (!doNotSet)
00514     *myDoublePointer = val;
00515   return true;
00516 }
00517 
00518 
00519 bool ArConfigArg::setBool(bool val, char *errorBuffer,
00520                                    size_t errorBufferLen, bool doNotSet)
00521 {
00522   if (myBoolPointer == NULL)
00523   {
00524     ArLog::log(ArLog::Normal, "ArConfigArg of %s: setBool called with NULL pointer.", getName());
00525     if (errorBuffer != NULL)
00526       snprintf(errorBuffer, errorBufferLen, "%s pointer is NULL.", getName());
00527     return false;
00528   }
00529   if (!doNotSet)
00530     *myBoolPointer = val;
00531   return true;
00532 }
00533 
00534 bool ArConfigArg::setString(const char *str, char *errorBuffer,
00535                                      size_t errorBufferLen, bool doNotSet)
00536 {
00537   size_t len;
00538   if (myUsingOwnedString)
00539   {
00540     myString = str;
00541     return true;
00542   }
00543   if (myStringPointer == NULL)
00544   {
00545     ArLog::log(ArLog::Normal, "ArConfigArg of %s: setString called with NULL pointer.", getName());
00546     if (errorBuffer != NULL)
00547       snprintf(errorBuffer, errorBufferLen, "%s pointer is NULL.", getName());
00548     return false;
00549   }
00550   // this is >= so that if it wouldn't have room with NULL that's
00551   // taken care of too
00552   if ((len = strlen(str)) >= myMaxStrLen)
00553   {
00554     ArLog::log(ArLog::Normal, "ArConfigArg of %s: setString called with argument %d long, when max length is %d.", getName(), len, myMaxStrLen);
00555     if (errorBuffer != NULL)
00556       snprintf(errorBuffer, errorBufferLen, "%s string is %d long when max length is %d.", getName(), len, myMaxStrLen);
00557     return false;
00558   }
00559   if (!doNotSet)
00560     strcpy(myStringPointer, str);
00561   return true;
00562 }
00563 
00564 bool ArConfigArg::setArgWithFunctor(ArArgumentBuilder *argument, 
00565                                              char *errorBuffer,
00566                                              size_t errorBufferLen, 
00567                                              bool doNotSet)
00568 {
00569   bool ret = true;
00570   if (mySetFunctor == NULL)
00571   {
00572     ArLog::log(ArLog::Normal, "ArConfigArg of %s: setArgWithFunctor called with NULL pointer.", getName());
00573     if (errorBuffer != NULL)
00574       snprintf(errorBuffer, errorBufferLen, "%s pointer is NULL.", getName());
00575     return false;
00576   }
00577   if (!doNotSet)
00578     ret = mySetFunctor->invokeR(argument);
00579   return ret;
00580 }
00581 
00582 
00583 void ArConfigArg::log(bool verbose) const
00584 {
00585   std::list<ArArgumentBuilder *>::const_iterator it;
00586   const std::list<ArArgumentBuilder *> *argList;
00587   std::string intType;
00588 
00589   switch (getType()) 
00590   {
00591   case ArConfigArg::INVALID:
00592     ArLog::log(ArLog::Terse, 
00593                "\tType: %10s.  This argument was not created properly.", 
00594                "invalid");
00595   case ArConfigArg::INT:
00596     if (myIntType == INT_NOT)
00597       intType = "Not";
00598     else if (myIntType == INT_INT)
00599       intType = "Int";
00600   else if (myIntType == INT_SHORT)
00601       intType = "Short";
00602     else if (myIntType == INT_UNSIGNED_SHORT)
00603       intType = "Unsigned Short";
00604     else if (myIntType == INT_UNSIGNED_CHAR)
00605       intType = "Unsigned Short";
00606     else
00607       intType = "Unknown";
00608     ArLog::log(ArLog::Terse, "\tType: %10s name: %12s value: %d intType: %s",
00609                "int", getName(), getInt(), intType.c_str());
00610     if (strlen(getDescription()) != 0)
00611       ArLog::log(ArLog::Terse, "\t\tDescription: %s",
00612                  getDescription());
00613     if (verbose)
00614       ArLog::log(ArLog::Terse, "\t\tMin: %10d     Max: %10d", 
00615                  myMinInt, myMaxInt);
00616     break;
00617   case ArConfigArg::DOUBLE:
00618     ArLog::log(ArLog::Terse, "\tType: %10s name: %12s value: %f", "double",
00619                getName(), getDouble());
00620     if (strlen(getDescription()) != 0)
00621       ArLog::log(ArLog::Terse, "\t\tDescription: %s",
00622                  getDescription());
00623     if (verbose)
00624       ArLog::log(ArLog::Terse, "\t\tMin: %10g     Max: %10g", 
00625                  myMinDouble, myMaxDouble);
00626     break; 
00627   case ArConfigArg::STRING:
00628     ArLog::log(ArLog::Terse, "\tType: %10s name: %12s value: %s", "string", 
00629                getName(), getString());
00630     if (strlen(getDescription()) != 0)
00631       ArLog::log(ArLog::Terse, "\t\tDescription: %s",
00632                  getDescription());
00633     if (verbose)
00634       ArLog::log(ArLog::Terse, "\t\tLength: %d", myMaxStrLen);
00635     break;
00636   case ArConfigArg::BOOL:
00637     ArLog::log(ArLog::Terse, "\tType: %10s name: %12s value: %d", "bool",
00638                getName(), getBool());
00639     if (strlen(getDescription()) != 0)
00640       ArLog::log(ArLog::Terse, "\t\tDescription: %s",
00641                  getDescription());
00642     break;
00643   case ArConfigArg::FUNCTOR:
00644     ArLog::log(ArLog::Terse, "\tType: %10s name: %12s", 
00645                "functor", getName());
00646     if (strlen(getDescription()) != 0)
00647       ArLog::log(ArLog::Terse, "\t\tDescription: %s",
00648                  getDescription());
00649     ArLog::log(ArLog::Terse, "\t\tValues:");
00650     argList = myGetFunctor->invokeR();
00651     for (it = argList->begin(); it != argList->end(); it++)
00652       ArLog::log(ArLog::Terse, "\t\t\t%s", (*it)->getFullString());
00653     break;
00654   case ArConfigArg::DESCRIPTION_HOLDER:
00655     ArLog::log(ArLog::Terse, "\tType: %20s Description: %s", 
00656                "description_holder", getDescription());
00657 
00658   default:
00659     ArLog::log(ArLog::Terse, 
00660                "\tType: %10s.  This type doesn't have a case in ArConfigArg::print.",
00661                "unknown");
00662     break;
00663   }
00664 
00665   ArLog::log(ArLog::Terse, "\t\tPriority: %s", 
00666              ArPriority::getPriorityName(myConfigPriority));
00667 }
00668 
00672 ArPriority::Priority ArConfigArg::getConfigPriority(void) const
00673 {
00674   return myConfigPriority;
00675 }
00676 
00681 void ArConfigArg::setConfigPriority(ArPriority::Priority priority)
00682 {
00683   myConfigPriority = priority;
00684 }
00685 
00690 void ArConfigArg::setIgnoreBounds(bool ignoreBounds)
00691 {
00692   myIgnoreBounds = ignoreBounds;
00693 }

Generated on Wed Oct 19 12:56:34 2005 for Aria by  doxygen 1.4.0