00001 /* Copyright (C) 2004-2008 Oliver Lemke <olemke@core-dump.info> 00002 00003 This program is free software; you can redistribute it and/or 00004 modify it under the terms of the GNU General Public License as 00005 published by the Free Software Foundation; either version 2 of the 00006 License, or (at your option) any later version. 00007 00008 This program is distributed in the hope that it will be useful, 00009 but WITHOUT ANY WARRANTY; without even the implied warranty of 00010 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the 00011 GNU General Public License for more details. 00012 00013 You should have received a copy of the GNU General Public License 00014 along with this program; if not, write to the Free Software 00015 Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 00016 USA. */ 00017 00019 // File description 00021 00031 #include "workspace_ng.h" 00032 #include "wsv_aux.h" 00033 #include "auto_workspace.h" 00034 00035 WorkspaceMemoryHandler wsmh; 00036 00037 Array<WsvRecord> Workspace::wsv_data; 00038 00039 map<String, Index> Workspace::WsvMap; 00040 00042 00045 Workspace::Workspace () : ws(0) 00046 { 00047 } 00048 00049 00050 void Workspace::define_wsv_map() 00051 { 00052 for ( Index i=0 ; i<wsv_data.nelem() ; ++i ) 00053 { 00054 WsvMap[wsv_data[i].Name()] = i; 00055 } 00056 } 00057 00058 00059 Index Workspace::add_wsv (const WsvRecord& wsv) 00060 { 00061 Workspace::wsv_data.push_back(wsv); 00062 Workspace::define_wsv_map(); 00063 return wsv_data.nelem()-1; 00064 } 00065 00066 00068 00073 void Workspace::del (Index i) 00074 { 00075 WsvStruct *wsvs = ws[i].top (); 00076 00077 if (wsvs &&& wsvs->wsv) 00078 { 00079 wsmh.deallocate (wsv_data[i].Group(), wsvs->wsv); 00080 wsvs->wsv = NULL; 00081 wsvs->auto_allocated = false; 00082 wsvs->initialized = false; 00083 } 00084 } 00085 00086 00088 00093 void Workspace::duplicate (Index i) 00094 { 00095 WsvStruct *wsvs = new WsvStruct; 00096 00097 wsvs->auto_allocated = true; 00098 if (ws[i].size() && ws[i].top()->wsv) 00099 { 00100 wsvs->wsv = wsmh.duplicate (wsv_data[i].Group(), ws[i].top()->wsv); 00101 wsvs->initialized = true; 00102 } 00103 else 00104 { 00105 wsvs->wsv = NULL; 00106 wsvs->initialized = false; 00107 } 00108 ws[i].push (wsvs); 00109 } 00110 00111 00112 void Workspace::initialize () 00113 { 00114 ws.resize (wsv_data.nelem()); 00115 } 00116 00117 00119 00128 Workspace::Workspace (const Workspace& workspace) : ws(workspace.ws.nelem()) 00129 { 00130 for (Index i=0; i < workspace.ws.nelem(); i++) 00131 { 00132 WsvStruct *wsvs = new WsvStruct; 00133 wsvs->auto_allocated = false; 00134 if (workspace.ws[i].size() && workspace.ws[i].top()->wsv) 00135 { 00136 wsvs->wsv = workspace.ws[i].top()->wsv; 00137 wsvs->initialized = workspace.ws[i].top()->initialized; 00138 } 00139 else 00140 { 00141 wsvs->wsv = NULL; 00142 wsvs->initialized = false; 00143 } 00144 ws[i].push (wsvs); 00145 } 00146 } 00147 00148 00150 00153 Workspace::~Workspace () 00154 { 00155 for (int i = 0; i < ws.nelem (); i++) 00156 { 00157 WsvStruct *wsvs; 00158 00159 while (ws[i].size ()) 00160 { 00161 wsvs = ws[i].top (); 00162 if (wsvs->auto_allocated && wsvs->wsv) 00163 { 00164 wsmh.deallocate (wsv_data[i].Group(), wsvs->wsv); 00165 } 00166 delete (wsvs); 00167 ws[i].pop (); 00168 } 00169 } 00170 ws.empty (); 00171 } 00172 00173 00175 00181 void *Workspace::pop (Index i) 00182 { 00183 WsvStruct *wsvs = ws[i].top (); 00184 void *vp = NULL; 00185 if (wsvs) 00186 { 00187 vp = wsvs->wsv; 00188 delete wsvs; 00189 ws[i].pop (); 00190 } 00191 return vp; 00192 } 00193 00194 00196 00201 void Workspace::pop_free (Index i) 00202 { 00203 WsvStruct *wsvs = ws[i].top (); 00204 00205 if (wsvs) 00206 { 00207 if (wsvs->wsv) 00208 wsmh.deallocate (wsv_data[i].Group(), wsvs->wsv); 00209 00210 delete wsvs; 00211 ws[i].pop (); 00212 } 00213 } 00214 00215 00217 00223 void Workspace::push (Index i, void *wsv) 00224 { 00225 WsvStruct *wsvs = new WsvStruct; 00226 wsvs->auto_allocated = false; 00227 wsvs->initialized = true; 00228 wsvs->wsv = wsv; 00229 ws[i].push (wsvs); 00230 } 00231 00232 00234 00242 void Workspace::push_uninitialized (Index i, void *wsv) 00243 { 00244 WsvStruct *wsvs = new WsvStruct; 00245 wsvs->auto_allocated = false; 00246 wsvs->initialized = false; 00247 wsvs->wsv = wsv; 00248 ws[i].push (wsvs); 00249 } 00250 00251 00253 00259 void *Workspace::operator[](Index i) 00260 { 00261 if (!ws[i].size ()) 00262 push (i, NULL); 00263 00264 if (!ws[i].top ()->wsv) 00265 { 00266 ws[i].top ()->auto_allocated = true; 00267 ws[i].top ()->wsv = wsmh.allocate (wsv_data[i].Group()); 00268 } 00269 00270 ws[i].top ()->initialized = true; 00271 00272 return (ws[i].top()->wsv); 00273 } 00274