Path: blob/devel/ElmerGUI/netgen/libsrc/general/template.hpp
3206 views
#ifndef FILE_TEMPLATE1#define FILE_TEMPLATE23/**************************************************************************/4/* File: template.hh */5/* Author: Joachim Schoeberl */6/* Date: 01. Jun. 95 */7/**************************************************************************/89/*10templates, global types, defines and variables11*/1213/// The following value may be adapted to the hardware !14#ifndef CLOCKS_PER_SEC15#define CLOCKS_PER_SEC 100000016#endif171819// #include <iostream>20/** output stream for testing.21testout is opened by main */22extern ostream * testout;2324/** use instead of cout */25extern ostream * mycout;2627/** error output stream */28extern ostream * myerr;2930/** Error messages display.31Error messages are displayed by this function */32extern void MyError (const char * ch);333435/** Rings the bell.36Produces nr beeps. */37extern void MyBeep (int nr = 1);383940template <class T>41inline void Swap (T & a, T & b)42{43T temp = a;44a = b;45b = temp;46}4748/*49template <class T>50inline void swap (T & a, T & b)51{52T temp = a;53a = b;54b = temp;55}56*/57585960/**61INDEX is a typedef for (at least) 4-byte integer62*/63typedef int INDEX;6465/**66BOOL is a typedef for boolean variables67*/68// typedef int BOOL;6970typedef int ELIND;71typedef int PIND;727374class twoint75{76public: ///77int i1, i2; ///78twoint() {};79///80twoint(int ii1, int ii2) {i1 = ii1; i2 = ii2;}81friend int operator== (const twoint& t1, const twoint& t2);82///83void Swap() {int x = i1; i1 = i2; i2 = x;}84void Sort() {if (i1 > i2) {Swap();}}85};8687inline int operator== (const twoint& t1, const twoint& t2)88{89return t1.i1 == t2.i1 && t1.i2 == t2.i2;90}9192class threeint93{94public: ///95int i1, i2, i3; ///96threeint() {};97///98threeint(int ii1, int ii2, int ii3) {i1 = ii1; i2 = ii2; i3 = ii3;}99};100101///102class twodouble103{104public:105///106double d1, d2;107///108twodouble() {d1 = 0; d2 = 0;};109///110twodouble(double id1, double id2) {d1 = id1; d2 = id2;}111///112void Swap() {double x = d1; d1 = d2; d2 = x;}113};114115class fourint { public: int i1, i2, i3, i4; fourint() {}; };116117118///119class INDEX_2;120ostream & operator<<(ostream & s, const INDEX_2 & i2);121122123class INDEX_2124{125///126INDEX i[2];127128public:129///130INDEX_2 () { }131///132INDEX_2 (INDEX ai1, INDEX ai2)133{ i[0] = ai1; i[1] = ai2; }134135///136INDEX_2 (const INDEX_2 & in2)137{ i[0] = in2.i[0]; i[1] = in2.i[1]; }138139///140int operator== (const INDEX_2 & in2) const141{ return i[0] == in2.i[0] && i[1] == in2.i[1]; }142143///144145146INDEX_2 Sort ()147{148if (i[0] > i[1])149{150INDEX hi = i[0];151i[0] = i[1];152i[1] = hi;153}154return *this;155}156157static INDEX_2 Sort (int i1, int i2)158{159if (i1 > i2)160return INDEX_2 (i2,i1);161else162return INDEX_2 (i1,i2);163}164165166///167INDEX & I1 () { return i[0]; }168///169INDEX & I2 () { return i[1]; }170///171INDEX & I (int j) { return i[j-1]; }172///173const INDEX & I1 () const { return i[0]; }174///175const INDEX & I2 () const { return i[1]; }176///177const INDEX & I (int j) const { return i[j-1]; }178///179int & operator[] (int j) { return i[j]; }180///181const int & operator[] (int j) const { return i[j]; }182///183friend ostream & operator<<(ostream & s, const INDEX_2 & i2);184};185186187///188class INDEX_3189{190///191INDEX i[3];192193public:194///195INDEX_3 () { }196///197INDEX_3 (INDEX ai1, INDEX ai2, INDEX ai3)198{ i[0] = ai1; i[1] = ai2; i[2] = ai3; }199200///201INDEX_3 (const INDEX_3 & in2)202{ i[0] = in2.i[0]; i[1] = in2.i[1]; i[2] = in2.i[2]; }203204205static INDEX_3 Sort (INDEX_3 i3)206{207return i3.Sort();208}209210static INDEX_3 Sort (int i1, int i2, int i3)211{212if (i1 > i2) Swap (i1, i2);213if (i2 > i3) Swap (i2, i3);214if (i1 > i2) Swap (i1, i2);215return INDEX_3 (i1, i2, i3);216}217218INDEX_3 Sort ()219{220if (i[0] > i[1]) Swap (i[0], i[1]);221if (i[1] > i[2]) Swap (i[1], i[2]);222if (i[0] > i[1]) Swap (i[0], i[1]);223return *this;224}225226int operator== (const INDEX_3 & in2) const227{ return i[0] == in2.i[0] && i[1] == in2.i[1] && i[2] == in2.i[2];}228229///230INDEX & I1 () { return i[0]; }231///232INDEX & I2 () { return i[1]; }233///234INDEX & I3 () { return i[2]; }235///236INDEX & I (int j) { return i[j-1]; }237///238const INDEX & I1 () const { return i[0]; }239///240const INDEX & I2 () const { return i[1]; }241///242const INDEX & I3 () const { return i[2]; }243///244const INDEX & I (int j) const { return i[j-1]; }245///246int & operator[] (int j) { return i[j]; }247///248const int & operator[] (int j) const { return i[j]; }249250///251friend ostream & operator<<(ostream & s, const INDEX_3 & i3);252};253254255256///257class INDEX_4258{259///260INDEX i[4];261262public:263///264INDEX_4 () { }265///266INDEX_4 (INDEX ai1, INDEX ai2, INDEX ai3, INDEX ai4)267{ i[0] = ai1; i[1] = ai2; i[2] = ai3; i[3] = ai4; }268269///270INDEX_4 (const INDEX_4 & in2)271{ i[0] = in2.i[0]; i[1] = in2.i[1]; i[2] = in2.i[2]; i[3] = in2.i[3]; }272273///274void Sort ();275276///277int operator== (const INDEX_4 & in2) const278{ return279i[0] == in2.i[0] && i[1] == in2.i[1] &&280i[2] == in2.i[2] && i[3] == in2.i[3]; }281282///283INDEX & I1 () { return i[0]; }284///285INDEX & I2 () { return i[1]; }286///287INDEX & I3 () { return i[2]; }288///289INDEX & I4 () { return i[3]; }290///291INDEX & I (int j) { return i[j-1]; }292///293const INDEX & I1 () const { return i[0]; }294///295const INDEX & I2 () const { return i[1]; }296///297const INDEX & I3 () const { return i[2]; }298///299const INDEX & I4 () const { return i[3]; }300///301const INDEX & I (int j) const { return i[j-1]; }302///303int & operator[] (int j) { return i[j]; }304///305const int & operator[] (int j) const { return i[j]; }306307///308friend ostream & operator<<(ostream & s, const INDEX_4 & i4);309};310311312313314315316317318/// The sort preserves quads !!!319class INDEX_4Q320{321///322INDEX i[4];323324public:325///326INDEX_4Q () { }327///328INDEX_4Q (INDEX ai1, INDEX ai2, INDEX ai3, INDEX ai4)329{ i[0] = ai1; i[1] = ai2; i[2] = ai3; i[3] = ai4; }330331///332INDEX_4Q (const INDEX_4Q & in2)333{ i[0] = in2.i[0]; i[1] = in2.i[1]; i[2] = in2.i[2]; i[3] = in2.i[3]; }334335///336void Sort ();337338///339int operator== (const INDEX_4Q & in2) const340{ return341i[0] == in2.i[0] && i[1] == in2.i[1] &&342i[2] == in2.i[2] && i[3] == in2.i[3]; }343344///345INDEX & I1 () { return i[0]; }346///347INDEX & I2 () { return i[1]; }348///349INDEX & I3 () { return i[2]; }350///351INDEX & I4 () { return i[3]; }352///353INDEX & I (int j) { return i[j-1]; }354///355const INDEX & I1 () const { return i[0]; }356///357const INDEX & I2 () const { return i[1]; }358///359const INDEX & I3 () const { return i[2]; }360///361const INDEX & I4 () const { return i[3]; }362///363const INDEX & I (int j) const { return i[j-1]; }364///365friend ostream & operator<<(ostream & s, const INDEX_4Q & i4);366};367368369370371372373374375376377378379///380template <class T>381inline T min2 (T a, T b)382{383///384return (a < b) ? a : b;385}386///387template <class T>388inline T max2 (T a, T b)389{390///391return (a > b) ? a : b;392}393///394template <class T>395inline T min3 (T a, T b, T c)396{397///398return (a < b) ? (a < c) ? a : c399: (b < c) ? b : c;400}401///402template <class T>403inline T max3 (T a, T b, T c)404{405///406return (a > b) ? ((a > c) ? a : c)407: ((b > c) ? b : c);408}409410///411412///413template <class T>414inline int sgn (T a)415{416return (a > 0) ? 1 : ( ( a < 0) ? -1 : 0 );417}418419///420template <class T>421inline T sqr (const T a)422{423return a * a;424}425426///427template <class T>428inline T pow3 (const T a)429{430return a * a * a;431}432433434435/*436template <class T>437void BubbleSort (int size, T * data);438439template <class T>440void MergeSort (int size, T * data, T * help);441*/442443444445446447#endif448449450