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
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
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
00206 break;
00207 }
00208 }
00209 kvpWrite (stream) ;
00210 }