00001 
00002 
00003 
00004 
00005 
00006 
00007 
00008 
00009 
00010 
00011 
00012 
00013 
00014 
00015 
00016 
00017 
00018 
00019 
00020 
00021 
00022 
00023 
00024 
00025 
00026 
00027 
00028 
00029 
00030 
00031 
00032 
00033 
00034 
00035 
00036 
00037 
00038 
00039 
00040 
00041 
00042 
00043 
00044 
00045 
00046 
00047 #ifndef SHYPERCUBE_H
00048 #define SHYPERCUBE_H
00049 
00050 
00051 #include <iostream>
00052 
00053 #include <LEDA/array.h>
00054 #include <LEDA/h_array.h>
00055 
00056 
00057 #include "STopology.h"
00058 #include "SHypercubeMod.h"
00059 #include "SHypercubePosition.h"
00060 
00061 
00062 
00063 class SHypercubeEntry {
00064 public:
00065   int _ID, _dim;
00066   const SHypercubePosition *_pos;  
00067   
00068   SHypercubeEntry(int id, int dim, const SHypercubePosition *pos) :
00069     _ID(id), _dim(dim), _pos(pos) {};
00070 
00071   friend std::istream &operator>>(std::istream &i, SHypercubeEntry &e)
00072     { return i; };
00073   friend std::ostream &operator<<(std::ostream &o, const SHypercubeEntry &e)
00074     { return o; };
00075 };
00076 
00077 
00078 
00079 class SHypercube : public virtual STopology {
00080   TYPEINFO0(SHypercube, "hypercube");
00081   friend class SHypercubeMod;
00082 public:
00086   SHypercube(int dim);
00087 
00090   virtual ~SHypercube() {}
00091 
00094   virtual STopologyMod &getModifier() 
00095     { return _mod; };
00096 
00101   virtual int getCount() const {
00102     int count = 1;
00103     for (int i=0; i<_dim; i++)
00104       count *= 2;
00105     return count;
00106   };
00107   
00111   virtual int getDim() const { return _dim; };
00112 
00117   virtual int getIDAt(int pos) const;
00118   
00123   virtual int getPos(int ID) const;
00124   
00129   virtual bool isPosFree(int pos) const;
00130 
00136   virtual bool canEmbedAt(const STopology &top, int pos) const;
00137   virtual bool canEmbedAt(const SComplexPosition &rHcPos) const;
00138 
00139   
00140   
00141   
00142   
00143   
00144   
00150   virtual void embed(const STopology& top, int pos, int ID)
00151     { assert(false); }
00152   virtual void embed(const STopology& top,
00153          const SComplexPosition *pHcPos, int ID);
00154   
00158   virtual void remove(int ID);
00159   
00162   virtual void clear();
00163 
00164   virtual bool fitsInto(const STopology *top) const {
00165     const SHypercube *hc = dynamic_cast<const SHypercube*>(top);
00166     return (_dim <= hc->getDim());
00167   }
00168 
00169 private:
00170   int _dim;
00171 
00172   SHypercubeMod _mod;
00173   
00174 
00175 protected:
00176   
00177   
00178   leda_h_array<int, SHypercubeEntry*> _IDtoEntry;
00179   static SHypercubeEntry _defaultEntry;
00180 
00181   void setSize(int dim);
00182 
00183 };
00184 
00185 #endif //SHYPERCUBE_H