WorkItem.h

Go to the documentation of this file.
00001 #ifndef WorkItem_HEADER
00002 #define WorkItem_HEADER
00003 
00004 #ifdef HAVE_CONFIG_H
00005 # include <config.h>
00006 #endif
00007 
00008 #include <string>
00009 #include <utilities/SmallMemoryPool.h>
00010 #include "MeshTypes.h"
00011 #include "Mesh.h"
00012 template <size_t ambient> class SplitData;
00013 
00014 template <size_t ambient>
00015 struct WorkItem {
00016   typedef ::SplitData<ambient> SplitData;
00017   typedef typename MeshTypes<ambient>::Ball Ball;
00018   typedef typename MeshTypes<ambient>::Vertex Vertex;
00019   typedef ::Mesh<ambient, ambient> TopMesh;
00020 
00021   enum Reason {
00022     NEW_BOUNDARY_VERTEX = 0,
00023     ENCROACHED,
00024     VERY_SKINNY,
00025     CROWDED_STEINER,
00026     CROWDED_INPUT,
00027     SLIVER,
00028     MEDIUM_SKINNY,
00029     UNRESOLVED,
00030     NONE
00031   };
00032 
00033   static string toString(Reason r) {
00034     switch(r) {
00035       case NEW_BOUNDARY_VERTEX: return "new bdry vertex";
00036       case ENCROACHED: return "encroached";
00037       case VERY_SKINNY: return "very_skinny";
00038       case CROWDED_STEINER: return "crowded (steiner)";
00039       case CROWDED_INPUT: return "crowded (input)";
00040       case SLIVER: return "sliver";
00041       case MEDIUM_SKINNY: return "medium_skinny";
00042       case UNRESOLVED: return "unresolved";
00043       case NONE: return "none";
00044     }
00045     assert(0);
00046     return "ASSERTION FAILURE";
00047   }
00048 
00049   virtual ~WorkItem() { }
00050   virtual double size() const = 0;
00051   virtual size_t topological() const = 0;
00052   virtual Reason getReason() const = 0;
00053   virtual bool isActive() const = 0;
00054 
00055   virtual bool split(SplitData&) = 0;
00056 
00057   virtual std::string toString() const = 0;
00058 
00059   private:
00060   template <class Derived>
00061   class AllocatedItem : public WorkItem, public hudson::SmallMemoryItem<Derived> { };
00062 
00063   template <class Derived>
00064   class BallBased : public AllocatedItem<Derived> {
00065     protected:
00066     Ball *ball_;
00067 
00068     BallBased(Ball *b) : ball_(b) {
00069       assert(ball_);
00070     }
00071     public:
00072     virtual double size() const { return ball_->center().radius2; }
00073     virtual size_t topological() const { return ball_->topological(); }
00074 
00075     virtual bool split(SplitData& sdata) {
00076       return ball_->split(sdata);
00077     }
00078     virtual std::string toString() const {
00079       return WorkItem::toString(getReason()) + std::string(" ball ") + ball_->toString();
00080     }
00081   };
00082 
00083   template <class Derived>
00084   class VertexBasedAmbient : public AllocatedItem<Derived> {
00085     protected:
00086     Vertex *vertex_;
00087     TopMesh *mesh_;
00088 
00089     VertexBasedAmbient(Vertex *v, TopMesh *m) : vertex_(v), mesh_(m) {
00090       assert(vertex_);
00091     }
00092     public:
00093     virtual double size() const { return 1.0; } /* TODO: order? */
00094     virtual size_t topological() const { return ambient; }
00095     virtual std::string toString() const {
00096       return WorkItem::toString(getReason()) + std::string(" vertex ") + vertex_->toString();
00097     }
00098     virtual bool split(SplitData& sdata) {
00099       return mesh_->split(vertex_, sdata);
00100     }
00101     virtual bool isActive() const { return this->vertex_->isCrowded(mesh_); }
00102   };
00103 
00104 
00105   public:
00106   class NewBoundaryVertex : public AllocatedItem<NewBoundaryVertex> {
00107     Ball *ball_;
00108     Vertex *hint_;
00109 
00110     public:
00111     NewBoundaryVertex(Ball *b, Vertex *hint) : ball_(b), hint_(hint) {
00112       assert(ball_);
00113       assert(hint_);
00114     }
00115 
00116     virtual double size() const { return ball_->center().radius2; }
00117     virtual size_t topological() const { return ball_->topological(); }
00118 
00119     virtual bool split(SplitData& sdata) {
00120       return ball_->split(sdata, hint_, true);
00121     }
00122 
00123     virtual std::string toString() const {
00124       return WorkItem::toString(getReason()) + std::string(" ball ") + ball_->toString()
00125         + std::string(" [hint: ") + hint_->toString() + std::string("]");
00126     }
00127     virtual Reason getReason() const { return NEW_BOUNDARY_VERTEX; }
00128     virtual bool isActive() const { return this->ball_->isLive(); }
00129   };
00130 
00131   struct Encroached : public BallBased<Encroached> {
00132     Encroached(Ball *b) :  BallBased<Encroached> (b) { }
00133     virtual Reason getReason() const { return ENCROACHED; }
00134     virtual bool isActive() const { return this->ball_->isLive(); }
00135   };
00136 
00137   struct VerySkinny : public BallBased<VerySkinny> {
00138     VerySkinny(Ball *b) :  BallBased<VerySkinny> (b) { }
00139     virtual Reason getReason() const { return VERY_SKINNY; }
00140     virtual bool isActive() const { return this->ball_->isLive(); }
00141   };
00142 
00143   struct CrowdedSteiner : public VertexBasedAmbient<CrowdedSteiner> {
00144     CrowdedSteiner(Vertex *v, TopMesh *m) :  VertexBasedAmbient<CrowdedSteiner> (v, m) { }
00145     virtual Reason getReason() const { return CROWDED_STEINER; }
00146   };
00147 
00148   struct CrowdedInput : public VertexBasedAmbient<CrowdedInput> {
00149     CrowdedInput(Vertex *v, TopMesh *m) :  VertexBasedAmbient<CrowdedInput> (v, m) { }
00150     virtual Reason getReason() const { return CROWDED_INPUT; }
00151   };
00152 
00153   struct Sliver : public BallBased<Sliver> {
00154     Sliver(Ball *b) :  BallBased<Sliver> (b) { }
00155     virtual Reason getReason() const { return SLIVER; }
00156     virtual bool isActive() const { return this->ball_->isLive(); }
00157   };
00158 
00159   struct MediumSkinny : public BallBased<MediumSkinny> {
00160     MediumSkinny(Ball *b) :  BallBased<MediumSkinny> (b) { }
00161     virtual Reason getReason() const { return MEDIUM_SKINNY; }
00162     virtual bool isActive() const { return this->ball_->isLive(); }
00163   };
00164 
00165   struct Unresolved : public BallBased<Unresolved> {
00166     Unresolved(Ball *b) :  BallBased<Unresolved> (b) { }
00167     virtual Reason getReason() const { return UNRESOLVED; }
00168     virtual bool isActive() const {
00169       return this->ball_->isLive() && !this->ball_->isResolved();
00170     }
00171   };
00172 };
00173 
00174 #endif

Generated on Thu Mar 27 19:04:14 2008 by  doxygen 1.4.6