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

unitempgen.cc

Go to the documentation of this file.
00001 /* 00002 * Worldvisions Weaver Software: 00003 * Copyright (C) 2002 Net Integration Technologies, Inc. 00004 * 00005 * A UniConf generator that stores keys in memory. 00006 */ 00007 #include "unitempgen.h" 00008 #include "wvmoniker.h" 00009 #include "wvlog.h" 00010 00011 static UniConfGen *creator(WvStringParm, IObject *, void *) 00012 { 00013 return new UniTempGen(); 00014 } 00015 00016 static WvMoniker<UniConfGen> reg("temp", creator); 00017 00018 /***** UniTempGen *****/ 00019 00020 UniTempGen::UniTempGen() 00021 : root(NULL) 00022 { 00023 } 00024 00025 00026 UniTempGen::~UniTempGen() 00027 { 00028 delete root; 00029 } 00030 00031 00032 WvString UniTempGen::get(const UniConfKey &key) 00033 { 00034 if (root) 00035 { 00036 UniConfValueTree *node = root->find(key); 00037 if (node) 00038 return node->value(); 00039 } 00040 return WvString::null; 00041 } 00042 00043 00044 void UniTempGen::set(const UniConfKey &key, WvStringParm value) 00045 { 00046 hold_delta(); 00047 if (value.isnull()) 00048 { 00049 // remove a subtree 00050 if (root) 00051 { 00052 UniConfValueTree *node = root->find(key); 00053 if (node) 00054 { 00055 delete node; 00056 if (node == root) 00057 root = NULL; 00058 dirty = true; 00059 delta(key, WvString::null); // REMOVED 00060 } 00061 } 00062 } 00063 else 00064 { 00065 UniConfValueTree *node = root; 00066 UniConfValueTree *prev = NULL; 00067 UniConfKey prevkey; 00068 00069 UniConfKey::Iter it(key); 00070 it.rewind(); 00071 for (;;) 00072 { 00073 bool more = it.next(); // not the last node in the key? 00074 00075 if (!node) 00076 { 00077 // we'll have to create the sub-node, since we couldn't 00078 // find the most recent part of the key. 00079 node = new UniConfValueTree(prev, prevkey, 00080 more ? WvStringParm("") : value); 00081 dirty = true; 00082 if (!prev) // we just created the root 00083 root = node; 00084 delta(node->fullkey(), value); // ADDED 00085 if (!more) 00086 break; // done! 00087 } 00088 else if (!more) 00089 { 00090 // don't have to create the most recent sub-node, but there 00091 // are no more sub-nodes; that means we're changing the value 00092 // of an existing node. 00093 if (value != node->value()) 00094 { 00095 node->setvalue(value); 00096 dirty = true; 00097 delta(node->fullkey(), value); // CHANGED 00098 } 00099 break; 00100 } 00101 prevkey = *it; 00102 prev = node; 00103 node = prev->findchild(prevkey); 00104 } 00105 assert(node); 00106 } 00107 00108 unhold_delta(); 00109 } 00110 00111 00112 bool UniTempGen::exists(const UniConfKey &key) 00113 { 00114 if (root) 00115 { 00116 UniConfValueTree *node = root->find(key); 00117 return node != NULL; 00118 } 00119 return false; 00120 } 00121 00122 00123 bool UniTempGen::haschildren(const UniConfKey &key) 00124 { 00125 if (root) 00126 { 00127 UniConfValueTree *node = root->find(key); 00128 return node != NULL && node->haschildren(); 00129 } 00130 return false; 00131 } 00132 00133 00134 UniConfGen::Iter *UniTempGen::iterator(const UniConfKey &key) 00135 { 00136 if (root) 00137 { 00138 UniConfValueTree *node = root->find(key); 00139 if (node) 00140 return new NodeIter(this, UniConfValueTree::Iter(*node)); 00141 } 00142 return new NullIter(); 00143 } 00144 00145 00146 00147 /***** UniTempGen::NodeIter *****/ 00148 00149 UniTempGen::NodeIter::NodeIter(UniTempGen *gen, 00150 const UniConfValueTree::Iter &it) : 00151 xgen(gen), xit(it) 00152 { 00153 } 00154 00155 00156 UniTempGen::NodeIter::~NodeIter() 00157 { 00158 } 00159 00160 00161 void UniTempGen::NodeIter::rewind() 00162 { 00163 xit.rewind(); 00164 } 00165 00166 00167 bool UniTempGen::NodeIter::next() 00168 { 00169 return xit.next(); 00170 } 00171 00172 00173 UniConfKey UniTempGen::NodeIter::key() const 00174 { 00175 return xit->key(); 00176 }

Generated on Tue Oct 5 01:09:19 2004 for WvStreams by doxygen 1.3.7