indirect arrays

This commit is contained in:
Joachim Schoeberl 2013-04-02 20:26:21 +00:00
parent 15b7f3d119
commit 8d7debaf9b
3 changed files with 94 additions and 56 deletions

View File

@ -12,6 +12,7 @@ namespace netgen
{
// template <class T, int B1, int B2> class IndirectArray;
template <class TA1, class TA2> class IndirectArray;
@ -23,7 +24,7 @@ namespace netgen
Optional range check by macro RANGE_CHECK
*/
template <class T, int BASE = 0>
template <typename T, int BASE = 0, typename TIND = int>
class FlatArray
{
protected:
@ -32,6 +33,7 @@ namespace netgen
/// the data
T * data;
public:
typedef T TELEM;
/// provide size and memory
FlatArray (int asize, T * adata)
@ -40,11 +42,11 @@ namespace netgen
/// the size
int Size() const { return size; }
int Begin() const { return BASE; }
int End() const { return size+BASE; }
TIND Begin() const { return TIND(BASE); }
TIND End() const { return TIND(size+BASE); }
/// Access array. BASE-based
T & operator[] (int i) const
T & operator[] (TIND i) const
{
#ifdef DEBUG
if (i-BASE < 0 || i-BASE >= size)
@ -54,6 +56,14 @@ namespace netgen
return data[i-BASE];
}
template <typename T2, int B2>
IndirectArray<FlatArray, FlatArray<T2,B2> > operator[] (const FlatArray<T2,B2> & ia) const
{
return IndirectArray<FlatArray, FlatArray<T2,B2> > (*this, ia);
}
/// Access array, one-based (old fashioned)
T & Elem (int i)
{
@ -113,16 +123,16 @@ namespace netgen
}
/// takes range starting from position start of end-start elements
const FlatArray<T> Range (int start, int end)
const FlatArray<T> Range (TIND start, TIND end)
{
return FlatArray<T> (end-start, data+start);
}
/// first position of element elem, returns -1 if element not contained in array
int Pos(const T & elem) const
TIND Pos(const T & elem) const
{
int pos = -1;
for(int i=0; pos==-1 && i < this->size; i++)
TIND pos = -1;
for(TIND i=0; pos==-1 && i < this->size; i++)
if(elem == data[i]) pos = i;
return pos;
}
@ -137,10 +147,10 @@ namespace netgen
// print array
template <class T, int BASE>
inline ostream & operator<< (ostream & s, const FlatArray<T,BASE> & a)
template <typename T, int BASE, typename TIND>
inline ostream & operator<< (ostream & s, const FlatArray<T,BASE,TIND> & a)
{
for (int i = a.Begin(); i < a.End(); i++)
for (TIND i = a.Begin(); i < a.End(); i++)
s << i << ": " << a[i] << endl;
return s;
}
@ -155,12 +165,12 @@ namespace netgen
Either the container takes care of memory allocation and deallocation,
or the user provides one block of data.
*/
template <class T, int BASE = 0>
class Array : public FlatArray<T, BASE>
template <class T, int BASE = 0, typename TIND = int>
class Array : public FlatArray<T, BASE, TIND>
{
protected:
using FlatArray<T,BASE>::size;
using FlatArray<T,BASE>::data;
using FlatArray<T,BASE,TIND>::size;
using FlatArray<T,BASE,TIND>::data;
/// physical size of array
int allocsize;
@ -171,34 +181,34 @@ namespace netgen
/// Generate array of logical and physical size asize
explicit Array()
: FlatArray<T, BASE> (0, NULL)
: FlatArray<T, BASE, TIND> (0, NULL)
{
allocsize = 0;
ownmem = 1;
}
explicit Array(int asize)
: FlatArray<T, BASE> (asize, new T[asize])
: FlatArray<T, BASE, TIND> (asize, new T[asize])
{
allocsize = asize;
ownmem = 1;
}
/// Generate array in user data
Array(int asize, T* adata)
: FlatArray<T, BASE> (asize, adata)
Array(TIND asize, T* adata)
: FlatArray<T, BASE, TIND> (asize, adata)
{
allocsize = asize;
ownmem = 0;
}
/// array copy
explicit Array (const Array<T> & a2)
: FlatArray<T, BASE> (a2.Size(), a2.Size() ? new T[a2.Size()] : 0)
explicit Array (const Array<T,BASE,TIND> & a2)
: FlatArray<T, BASE, TIND> (a2.Size(), a2.Size() ? new T[a2.Size()] : 0)
{
allocsize = size;
ownmem = 1;
for (int i = BASE; i < size+BASE; i++)
for (TIND i = BASE; i < size+BASE; i++)
(*this)[i] = a2[i];
}
@ -249,7 +259,7 @@ namespace netgen
/// Delete element i (0-based). Move last element to position i.
void Delete (int i)
void Delete (TIND i)
{
#ifdef CHECK_Array_RANGE
RangeCheck (i+1);
@ -262,7 +272,7 @@ namespace netgen
/// Delete element i (1-based). Move last element to position i.
void DeleteElement (int i)
void DeleteElement (TIND i)
{
#ifdef CHECK_Array_RANGE
RangeCheck (i);
@ -290,7 +300,7 @@ namespace netgen
/// Fill array with val
Array & operator= (const T & val)
{
FlatArray<T, BASE>::operator= (val);
FlatArray<T, BASE, TIND>::operator= (val);
return *this;
}
@ -298,7 +308,7 @@ namespace netgen
Array & operator= (const Array & a2)
{
SetSize (a2.Size());
for (int i = BASE; i < size+BASE; i++)
for (TIND i (BASE); i < size+BASE; i++)
(*this)[i] = a2[i];
return *this;
}
@ -307,7 +317,7 @@ namespace netgen
Array & operator= (const FlatArray<T> & a2)
{
SetSize (a2.Size());
for (int i = BASE; i < size+BASE; i++)
for (TIND i = BASE; i < size+BASE; i++)
(*this)[i] = a2[i];
return *this;
}
@ -389,29 +399,49 @@ namespace netgen
/*
template <class T, int B1, int B2>
class IndirectArray
{
template <class T, int B1, int B2>
class IndirectArray
{
const FlatArray<T, B1> & array;
const FlatArray<int, B2> & ia;
public:
public:
IndirectArray (const FlatArray<T,B1> & aa, const FlatArray<int, B2> & aia)
: array(aa), ia(aia) { ; }
int Size() const { return ia.Size(); }
const T & operator[] (int i) const { return array[ia[i]]; }
};
};
*/
template <class TA1, class TA2>
class IndirectArray
{
const TA1 & array;
const TA2 & ia;
public:
IndirectArray (const TA1 & aa, const TA2 & aia)
: array(aa), ia(aia) { ; }
int Size() const { return ia.Size(); }
int Begin() const { return ia.Begin(); }
int End() const { return ia.End(); }
const typename TA1::TELEM & operator[] (int i) const { return array[ia[i]]; }
};
template <typename T1, typename T2>
inline ostream & operator<< (ostream & s, const IndirectArray<T1,T2> & ia)
{
for (int i = ia.Begin(); i < ia.End(); i++)
s << i << ": " << ia[i] << endl;
return s;
}
/*
///
template <class T, int BASE = 0>
@ -566,7 +596,7 @@ namespace netgen
ost << i << ": " << a[i] << endl;
return ost;
}
*/
/// bubble sort array

View File

@ -139,7 +139,7 @@ namespace netgen
BASE_INDEX_CLOSED_HASHTABLE (int size)
: hash(size)
{
hash.SetName ("index-hashtable, hash");
// hash.SetName ("index-hashtable, hash");
invalid = -1;
for (int i = 1; i <= size; i++)
@ -216,7 +216,7 @@ namespace netgen
BASE_INDEX_2_CLOSED_HASHTABLE (int size)
: hash(size)
{
hash.SetName ("i2-hashtable, hash");
// hash.SetName ("i2-hashtable, hash");
invalid = -1;
for (int i = 1; i <= size; i++)

View File

@ -468,7 +468,8 @@ class BASE_INDEX_CLOSED_HASHTABLE
{
protected:
///
MoveableArray<INDEX> hash;
// MoveableArray<INDEX> hash;
Array<INDEX> hash;
///
int invalid;
public:
@ -543,14 +544,15 @@ template <class T>
class INDEX_CLOSED_HASHTABLE : public BASE_INDEX_CLOSED_HASHTABLE
{
///
MoveableArray<T> cont;
// MoveableArray<T> cont;
Array<T> cont;
public:
///
INDEX_CLOSED_HASHTABLE (int size)
: BASE_INDEX_CLOSED_HASHTABLE(size), cont(size)
{
cont.SetName ("ind-hashtable, contents");
; // cont.SetName ("ind-hashtable, contents");
}
@ -617,8 +619,8 @@ public:
void SetName (const char * aname)
{
cont.SetName(aname);
hash.SetName(aname);
// cont.SetName(aname);
// hash.SetName(aname);
}
};
@ -634,7 +636,8 @@ class BASE_INDEX_2_CLOSED_HASHTABLE
{
protected:
///
MoveableArray<INDEX_2> hash;
// MoveableArray<INDEX_2> hash;
Array<INDEX_2> hash;
///
int invalid;
public:
@ -695,7 +698,8 @@ template <class T>
class INDEX_2_CLOSED_HASHTABLE : public BASE_INDEX_2_CLOSED_HASHTABLE
{
///
MoveableArray<T> cont;
// MoveableArray<T> cont;
Array<T> cont;
public:
///
@ -726,8 +730,9 @@ public:
void SetName (const char * aname)
{
cont.SetName(aname);
hash.SetName(aname);
;
// cont.SetName(aname);
// hash.SetName(aname);
}
};
@ -755,14 +760,15 @@ inline ostream & operator<< (ostream & ost, const INDEX_2_CLOSED_HASHTABLE<T> &
class BASE_INDEX_3_CLOSED_HASHTABLE
{
protected:
MoveableArray<INDEX_3> hash;
// MoveableArray<INDEX_3> hash;
Array<INDEX_3> hash;
int invalid;
protected:
BASE_INDEX_3_CLOSED_HASHTABLE (int size)
: hash(size)
{
hash.SetName ("i3-hashtable, hash");
// hash.SetName ("i3-hashtable, hash");
invalid = -1;
for (int i = 0; i < size; i++)
hash[i].I1() = invalid;
@ -848,13 +854,14 @@ protected:
template <class T>
class INDEX_3_CLOSED_HASHTABLE : public BASE_INDEX_3_CLOSED_HASHTABLE
{
MoveableArray<T,0> cont;
// MoveableArray<T,0> cont;
Array<T,0> cont;
public:
INDEX_3_CLOSED_HASHTABLE (int size)
: BASE_INDEX_3_CLOSED_HASHTABLE(size), cont(size)
{
cont.SetName ("i3-hashtable, contents");
; //cont.SetName ("i3-hashtable, contents");
}
void Set (const INDEX_3 & ahash, const T & acont)
@ -923,8 +930,9 @@ public:
void SetName (const char * aname)
{
cont.SetName(aname);
hash.SetName(aname);
;
// cont.SetName(aname);
// hash.SetName(aname);
}
};
@ -1167,7 +1175,7 @@ inline INDEX_2_CLOSED_HASHTABLE<T> ::
INDEX_2_CLOSED_HASHTABLE (int size)
: BASE_INDEX_2_CLOSED_HASHTABLE(size), cont(size)
{
cont.SetName ("i2-hashtable, contents");
// cont.SetName ("i2-hashtable, contents");
}
template<class T>