extensionPool.h revision 12855
112855Sgabeblack@google.com/***************************************************************************** 212855Sgabeblack@google.com 312855Sgabeblack@google.com Licensed to Accellera Systems Initiative Inc. (Accellera) under one or 412855Sgabeblack@google.com more contributor license agreements. See the NOTICE file distributed 512855Sgabeblack@google.com with this work for additional information regarding copyright ownership. 612855Sgabeblack@google.com Accellera licenses this file to you under the Apache License, Version 2.0 712855Sgabeblack@google.com (the "License"); you may not use this file except in compliance with the 812855Sgabeblack@google.com License. You may obtain a copy of the License at 912855Sgabeblack@google.com 1012855Sgabeblack@google.com http://www.apache.org/licenses/LICENSE-2.0 1112855Sgabeblack@google.com 1212855Sgabeblack@google.com Unless required by applicable law or agreed to in writing, software 1312855Sgabeblack@google.com distributed under the License is distributed on an "AS IS" BASIS, 1412855Sgabeblack@google.com WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or 1512855Sgabeblack@google.com implied. See the License for the specific language governing 1612855Sgabeblack@google.com permissions and limitations under the License. 1712855Sgabeblack@google.com 1812855Sgabeblack@google.com *****************************************************************************/ 1912855Sgabeblack@google.com 2012855Sgabeblack@google.com#ifndef __EXTENSION_POOL_H__ 2112855Sgabeblack@google.com#define __EXTENSION_POOL_H__ 2212855Sgabeblack@google.com 2312855Sgabeblack@google.comtemplate <class T> 2412855Sgabeblack@google.comclass ExtensionPool{ 2512855Sgabeblack@google.com struct entry{ 2612855Sgabeblack@google.com public: 2712855Sgabeblack@google.com entry(T* content){ 2812855Sgabeblack@google.com that=content; 2912855Sgabeblack@google.com next=NULL; 3012855Sgabeblack@google.com } 3112855Sgabeblack@google.com T* that; 3212855Sgabeblack@google.com entry* next; 3312855Sgabeblack@google.com }; 3412855Sgabeblack@google.com 3512855Sgabeblack@google.compublic: 3612855Sgabeblack@google.com ExtensionPool(int size): used(NULL){ 3712855Sgabeblack@google.com unused=new entry(new T()); //create first one 3812855Sgabeblack@google.com mine.push_back(unused->that); 3912855Sgabeblack@google.com for (int i=0; i<size-1; i++){ 4012855Sgabeblack@google.com entry* e=new entry(new T()); 4112855Sgabeblack@google.com e->next=unused; 4212855Sgabeblack@google.com unused=e; 4312855Sgabeblack@google.com mine.push_back(unused->that); 4412855Sgabeblack@google.com } 4512855Sgabeblack@google.com } 4612855Sgabeblack@google.com 4712855Sgabeblack@google.com ~ExtensionPool(){ 4812855Sgabeblack@google.com //delete all T* that belong to this pool 4912855Sgabeblack@google.com for (unsigned int i=0; i<mine.size(); i++){ 5012855Sgabeblack@google.com delete mine[i]; 5112855Sgabeblack@google.com } 5212855Sgabeblack@google.com 5312855Sgabeblack@google.com //delete all unused elements 5412855Sgabeblack@google.com while (unused){ 5512855Sgabeblack@google.com entry* e=unused; 5612855Sgabeblack@google.com unused=unused->next; 5712855Sgabeblack@google.com delete e; 5812855Sgabeblack@google.com } 5912855Sgabeblack@google.com 6012855Sgabeblack@google.com //delete all used elements 6112855Sgabeblack@google.com while (used){ 6212855Sgabeblack@google.com entry* e=used; 6312855Sgabeblack@google.com used=used->next; 6412855Sgabeblack@google.com delete e; 6512855Sgabeblack@google.com } 6612855Sgabeblack@google.com } 6712855Sgabeblack@google.com 6812855Sgabeblack@google.com bool is_from(T* cont){ //slow!!! 6912855Sgabeblack@google.com for (int i=0; i<mine.size(); i++){ 7012855Sgabeblack@google.com if (mine[i]==cont) return true; 7112855Sgabeblack@google.com } 7212855Sgabeblack@google.com return false; 7312855Sgabeblack@google.com } 7412855Sgabeblack@google.com 7512855Sgabeblack@google.com T* construct(){ 7612855Sgabeblack@google.com entry* e; 7712855Sgabeblack@google.com if (unused==NULL){ 7812855Sgabeblack@google.com e=new entry(new T()); 7912855Sgabeblack@google.com mine.push_back(e->that); 8012855Sgabeblack@google.com } 8112855Sgabeblack@google.com else{ 8212855Sgabeblack@google.com e=unused; 8312855Sgabeblack@google.com unused=unused->next; 8412855Sgabeblack@google.com } 8512855Sgabeblack@google.com e->next=used; 8612855Sgabeblack@google.com used=e; 8712855Sgabeblack@google.com return used->that; //if all elements of pool are used, just create a new one and go on 8812855Sgabeblack@google.com } 8912855Sgabeblack@google.com 9012855Sgabeblack@google.com void free (T* cont){ 9112855Sgabeblack@google.com sc_assert(used); 9212855Sgabeblack@google.com entry* e=used; 9312855Sgabeblack@google.com used=e->next; 9412855Sgabeblack@google.com e->that=cont; 9512855Sgabeblack@google.com e->next=unused; 9612855Sgabeblack@google.com unused=e; 9712855Sgabeblack@google.com } 9812855Sgabeblack@google.com 9912855Sgabeblack@google.comprivate: 10012855Sgabeblack@google.com entry* unused; 10112855Sgabeblack@google.com entry* used; 10212855Sgabeblack@google.com std::vector<T*> mine; //just for clean up and is_from 10312855Sgabeblack@google.com}; 10412855Sgabeblack@google.com 10512855Sgabeblack@google.com#endif 10612855Sgabeblack@google.com 107