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; }
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