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