Path: blob/devel/ElmerGUI/netgen/libsrc/general/table.cpp
3206 views
/**************************************************************************/1/* File: table.cpp */2/* Author: Joachim Schoeberl */3/* Date: 01. Jun. 95 */4/**************************************************************************/56/*7Abstract data type TABLE8*/910#include <mystdlib.h>11#include <myadt.hpp>1213namespace netgen14{15//using namespace netgen;1617BASE_TABLE :: BASE_TABLE (int size)18: data(size)19{20for (int i = 0; i < size; i++)21{22data[i].maxsize = 0;23data[i].size = 0;24data[i].col = NULL;25}26oneblock = NULL;27}2829BASE_TABLE :: BASE_TABLE (const FlatArray<int> & entrysizes, int elemsize)30: data(entrysizes.Size())31{32int i, cnt = 0;33int n = entrysizes.Size();3435for (i = 0; i < n; i++)36cnt += entrysizes[i];37oneblock = new char[elemsize * cnt];38// mem_total_alloc_table += elemsize * cnt;3940cnt = 0;41for (i = 0; i < n; i++)42{43data[i].maxsize = entrysizes[i];44data[i].size = 0;4546data[i].col = &oneblock[elemsize * cnt];47cnt += entrysizes[i];48}49}5051BASE_TABLE :: ~BASE_TABLE ()52{53if (oneblock)54delete [] oneblock;55else56{57for (int i = 0; i < data.Size(); i++)58delete [] (char*)data[i].col;59}60}6162void BASE_TABLE :: SetSize (int size)63{64for (int i = 0; i < data.Size(); i++)65delete [] (char*)data[i].col;6667data.SetSize(size);68for (int i = 0; i < size; i++)69{70data[i].maxsize = 0;71data[i].size = 0;72data[i].col = NULL;73}74}7576void BASE_TABLE :: ChangeSize (int size)77{78int oldsize = data.Size();79if (size == oldsize)80return;8182if (size < oldsize)83for (int i = size; i < oldsize; i++)84delete [] (char*)data[i].col;8586data.SetSize(size);8788for (int i = oldsize; i < size; i++)89{90data[i].maxsize = 0;91data[i].size = 0;92data[i].col = NULL;93}94}9596void BASE_TABLE :: IncSize2 (int i, int elsize)97{98#ifdef DEBUG99if (i < 0 || i >= data.Size())100{101MyError ("BASE_TABLE::Inc: Out of range");102return;103}104#endif105106linestruct & line = data[i];107if (line.size == line.maxsize)108{109void * p = new char [(line.maxsize+5) * elsize];110111memcpy (p, line.col, line.maxsize * elsize);112delete [] (char*)line.col;113114line.col = p;115line.maxsize += 5;116}117118line.size++;119}120121122123/*124void BASE_TABLE :: DecSize (int i)125{126#ifdef DEBUG127if (i < 0 || i >= data.Size())128{129MyError ("BASE_TABLE::Dec: Out of range");130return;131}132#endif133134linestruct & line = data[i];135136#ifdef DEBUG137if (line.size == 0)138{139MyError ("BASE_TABLE::Dec: EntrySize < 0");140return;141}142#endif143144line.size--;145}146*/147148149150void BASE_TABLE :: AllocateElementsOneBlock (int elemsize)151{152int cnt = 0;153int n = data.Size();154155for (int i = 0; i < n; i++)156cnt += data[i].maxsize;157oneblock = new char[elemsize * cnt];158159cnt = 0;160for (int i = 0; i < n; i++)161{162data[i].size = 0;163data[i].col = &oneblock[elemsize * cnt];164cnt += data[i].maxsize;165}166}167168169170int BASE_TABLE :: AllocatedElements () const171{172int els = 0;173for (int i = 0; i < data.Size(); i++)174els += data[i].maxsize;175return els;176}177178int BASE_TABLE :: UsedElements () const179{180int els = 0;181for (int i = 0; i < data.Size(); i++)182els += data[i].size;183return els;184}185186void BASE_TABLE :: SetElementSizesToMaxSizes ()187{188for (int i = 0; i < data.Size(); i++)189data[i].size = data[i].maxsize;190}191192}193194195