Main Page | Modules | Namespace List | Class Hierarchy | Alphabetical List | Class List | Directories | File List | Namespace Members | Class Members | File Members | Related Pages

kvplib/KeyRing.cc

Go to the documentation of this file.
00001 
00002 #include <iostream>
00003 #include <math.h>
00004 #include "KeyRing.h"
00005 
00006 KeyRing::KeyRing ()
00007 {
00008    keyCount = 0 ;
00009 }
00010 
00011 KeyRing::KeyRing (char* buffer)
00012 {
00013    char* key ;
00014    KeyType type ;
00015    int* ivalues ;
00016    float fval ;
00017    char* csval ;
00018    int size ;
00019 
00020    keyCount = kvpParse (buffer) ;
00021    for (int entry = 0 ; entry < keyCount ; entry++) {
00022       kvpGetEntry (entry, &key, &type, &size, &csval) ;
00023       switch (type) {
00024       case KT_INT:
00025          ivalues = new int[size] ;
00026          kvpGetIntArray (key, ivalues, &size) ;
00027          addKey (key, ivalues, size) ;
00028          delete [] ivalues ;
00029          break ;
00030       case KT_FLOAT:
00031          fval = kvpGetFloat (key, 0) ;
00032          addKey (key, fval) ;
00033          break ;
00034       case KT_STRING:
00035          addKey (key, csval) ;
00036          break ;
00037       case KT_INVALID:
00038          // Ignore it
00039          break;
00040       }
00041    }
00042 }
00043 
00044 KeyRing::~KeyRing ()
00045 {
00046    for (KvMap::iterator kvIter = myMap.begin () ; kvIter != myMap.end () ;
00047         kvIter++) {
00048       delete (*kvIter).second ;
00049    }
00050 
00051 }
00052 
00053 void KeyRing::addKey (string key, int value)
00054 {
00055    myMap.insert (KvMap::value_type (key, new IntArray (&value, 1))) ;
00056 }
00057 void KeyRing::addKey (const string key, const int* values, int size)
00058 {
00059    myMap.insert (KvMap::value_type (key, new IntArray (values, size))) ;
00060 }
00061 void KeyRing::addKey (string key, float value)
00062 {
00063    myMap.insert (KvMap::value_type (key, new FloatArray (&value, 1))) ;
00064 }
00065 void KeyRing::addKey (string key, string value)
00066 {
00067    myMap.insert (KvMap::value_type (key, new StringValue (value))) ;
00068 }
00069 
00070 void KeyRing::dump ()
00071 {
00072    IntArray* iarray ;
00073    FloatArray* farray ;
00074    StringValue* sval ;
00075    int* ivals ;
00076    float* fvals ;
00077 
00078    for (KvMap::iterator kvIter = myMap.begin () ; kvIter != myMap.end () ;
00079         kvIter++) {
00080       cout << "key : <" << (*kvIter).first << ">,  type : " ;
00081       switch ((*kvIter).second->type()) {
00082       case KT_INT:
00083          iarray = (IntArray*) (*kvIter).second ;
00084          cout << "int,  value :" ;
00085          ivals = iarray->value() ;
00086          for (int element = 0 ; element < iarray->size () ; element++) {
00087             cout << " " << ivals[element] ;
00088          }
00089          cout << endl ;
00090          break ;
00091       case KT_FLOAT:
00092          farray = (FloatArray*) (*kvIter).second ;
00093          cout << "float,  value : " ;
00094          fvals = farray->value() ;
00095          for (int element = 0 ; element < farray->size () ; element++) {
00096             cout << " " << fvals[element] ;
00097          }
00098          cout << endl ;
00099          break ;
00100       case KT_STRING:
00101          sval = (StringValue*) (*kvIter).second ;
00102          cout << "string,  value : <" << sval->value() << ">\n" ;
00103          break ;
00104       case KT_INVALID:
00105          // Ignore it
00106          break;
00107       }
00108    }
00109 }
00110 
00111 int KeyRing::intKey (string key)
00112 {
00113    KvMap::iterator kvIter = myMap.find (key) ; 
00114    if (kvIter != myMap.end ()) {
00115       if ((*kvIter).second->type() == KT_INT) {
00116          IntArray* vptr = (IntArray*) (*kvIter).second ;
00117          return (vptr->value()[0]) ;
00118       }
00119       else {
00120          return (-2) ;
00121       }
00122    }
00123    else {
00124       return (-1) ;
00125    }
00126 }
00127 
00128 int KeyRing::intArray (const string key, int* array, int maxLength)
00129 {
00130    KvMap::iterator kvIter = myMap.find (key) ; 
00131    if (kvIter != myMap.end ()) {
00132       if ((*kvIter).second->type() == KT_INT) {
00133          IntArray* vptr = (IntArray*) (*kvIter).second ;
00134          int length = vptr->size () ;
00135          if (length > maxLength) {
00136             length = maxLength ;
00137          }
00138          int* vals = vptr->value() ;
00139          for (int element = 0 ; element < length ; element++) {
00140             array[element] = vals[element] ;
00141          }
00142          return (length) ;
00143       }
00144    }
00145    return (0) ;
00146 }
00147 
00148 float KeyRing::floatKey (string key)
00149 {
00150    KvMap::iterator kvIter = myMap.find (key) ; 
00151    if (kvIter != myMap.end ()) {
00152       if ((*kvIter).second->type() == KT_FLOAT) {
00153          FloatArray* vptr = (FloatArray*) (*kvIter).second ;
00154          return (vptr->value()[0]) ;
00155       }
00156       else {
00157          return (HUGE) ;
00158       }
00159    }
00160    else {
00161       return (HUGE) ;
00162    }
00163 }
00164 string KeyRing::stringKey (string key)
00165 {
00166    KvMap::iterator kvIter = myMap.find (key) ; 
00167    if (kvIter != myMap.end ()) {
00168       if ((*kvIter).second->type() == KT_STRING) {
00169          StringValue* vptr = (StringValue*) (*kvIter).second ;
00170          return (vptr->value()) ;
00171       }
00172       else {
00173          return (0) ;
00174       }
00175    }
00176    else {
00177       return (0) ;
00178    }
00179 }
00180 
00181 void KeyRing::write (int stream)
00182 {
00183    kvpReset () ;
00184    IntArray* ival ;
00185    FloatArray* fval ;
00186    StringValue* sval ;
00187    for (KvMap::iterator kvIter = myMap.begin () ; kvIter != myMap.end () ;
00188         kvIter++) {
00189       switch ((*kvIter).second->type()) {
00190       case KT_INT:
00191          ival = (IntArray*) (*kvIter).second ;
00192          kvpSetIntArray ((*kvIter).first.c_str(),
00193                          ival->value(), ival->size()) ;
00194          break ;
00195       case KT_FLOAT:
00196          fval = (FloatArray*) (*kvIter).second ;
00197          kvpSetFloatArray ((*kvIter).first.c_str(),
00198                            fval->value(), fval->size()) ;
00199          break ;
00200       case KT_STRING:
00201          sval = (StringValue*) (*kvIter).second ;
00202          kvpSetString ((*kvIter).first.c_str(), sval->value().c_str()) ;
00203          break ;
00204       case KT_INVALID:
00205          // Ignore it
00206          break;
00207       }
00208    }
00209    kvpWrite (stream) ;
00210 }

Generated on Mon Feb 15 11:06:50 2010 for loon by  doxygen 1.3.9.1