leveljumper.h

Go to the documentation of this file.
00001 #ifndef __leveljumper_h
00002 
00003 #include <math.h>
00004 #include <map>
00005 #include "quad.h"
00006 #include "hex.h"
00007 
00008 /*---------------------------------------------------*/
00009 
00010 namespace Gascoigne
00011 {
00012 class LevelJump
00013 {
00014   int mini, maxi;
00015 
00016 public:
00017 
00018   int  Min() const { return mini;}
00019   int  Max() const { return maxi;}
00020   int& Min()       { return mini;}
00021   int& Max()       { return maxi;}
00022   const int& Maxi() const  { return maxi;}
00023 
00024   void update(int i)           { maxi = std::max(maxi,i); mini=std::min(mini,i); }
00025   void reinit()   { maxi=0; mini=1000;}
00026 
00027   LevelJump() { reinit();}
00028   
00029 };
00030 
00031 /*---------------------------------------------------*/
00032 
00033 class LevelJumper
00034 {
00035   std::map<int,LevelJump>  Phi;
00036 
00037 public:
00038 
00039   LevelJumper() : Phi() {} 
00040 
00041   void update(const Quad& Q)
00042     {
00043       for (int i=0; i<4; i++)
00044         {
00045           Phi[ Q[i] ].update(Q.level());
00046         }
00047     }
00048   void update(const Hex& Q)
00049     {
00050       for (int i=0; i<8; i++)
00051         {
00052           Phi[ Q[i] ].update(Q.level());
00053         }
00054     }
00055   bool check() const
00056     {
00057       for(std::map<int,LevelJump>::const_iterator p=Phi.begin();
00058           p!=Phi.end();p++)
00059         {
00060           if(p->second.Max()>p->second.Min()+1) return 1;
00061         }
00062       return 0;
00063     }
00064   LevelJump& operator()(int i)  { return Phi[i];}
00065   const LevelJump& operator()(int i) const { return Phi.find(i)->second;}
00066 
00067   bool VertexOK(const Quad& Q)
00068     {
00069       for(int ii=0;ii<4;ii++)
00070         {
00071           if( Phi[ Q[ii] ].Maxi() > Q.level()+1 )
00072             {
00073 //            std::cerr << "\t" << Q[ii] << " " << Phi[ Q[ii] ].Maxi() << " " << Q.level() << std::endl;
00074               return 0;
00075             }
00076         }
00077       return 1;
00078     }
00079   bool VertexOK(const Hex& Q)
00080     {
00081       for(int ii=0;ii<8;ii++)
00082         {
00083           if( Phi[ Q[ii] ].Maxi() > Q.level()+1 )
00084             {
00085               return 0;
00086             }
00087         }
00088       return 1;
00089     }
00090 
00091 
00092 };
00093 }
00094 
00095 /*---------------------------------------------------*/
00096 
00097 #endif

Generated on Thu Sep 14 10:34:37 2006 for Gascoigne by  doxygen 1.4.7