00001
00002
00003
00016
00017
00018
00019
00020
00021
00022
00023
00024
00025
00026
00027
00028
00029
00030
00031
00032
00033
00034
00035
00036
00037 #ifndef _CHOMP_CUBES_CUBEFIX_H_
00038 #define _CHOMP_CUBES_CUBEFIX_H_
00039
00040 #include "chomp/system/config.h"
00041 #include "chomp/system/textfile.h"
00042 #include "chomp/cubes/pointset.h"
00043 #include "chomp/struct/bitfield.h"
00044 #include "chomp/struct/integer.h"
00045 #include "chomp/struct/hashsets.h"
00046 #include "chomp/cubes/pointbas.h"
00047 #include "chomp/cubes/cubemain.h"
00048
00049 #include <iostream>
00050 #include <fstream>
00051 #include <cstdlib>
00052 #include <cstring>
00053
00054 namespace chomp {
00055 namespace homology {
00056
00057
00058
00059 template <int dimfix, class coordtype>
00060 class tCellFix;
00061
00062
00063
00064
00065
00066
00071 template <int dimfix, class coordtype>
00072 class tCubeFix
00073 {
00074 public:
00076 typedef coordtype CoordType;
00077
00079 typedef tCellFix<dimfix,coordtype> CellType;
00080
00082 static const int MaxDim = 512;
00083
00085 typedef tWrapBase<coordtype> PointBase;
00086
00088 tCubeFix ();
00089
00091 tCubeFix (const coordtype *c, int dim = 0);
00092
00094 tCubeFix (int number, int dim);
00095
00097 tCubeFix (const tCubeFix<dimfix,coordtype> &c);
00098
00100 tCubeFix<dimfix,coordtype> &operator =
00101 (const tCubeFix<dimfix,coordtype> &c);
00102
00104 int dim () const;
00105
00107
00108
00109 coordtype *coord (coordtype *c) const;
00110
00112 int_t hashkey1 () const;
00113
00115 int_t hashkey2 () const;
00116
00118 static const char *name ();
00119
00121 static const char *pluralname ();
00122
00124 friend int operator == (const tCubeFix<dimfix,coordtype> &c1,
00125 const tCubeFix<dimfix,coordtype> &c2)
00126 {
00127 return thesame (c1. tab, c2. tab, dimfix);
00128 }
00129
00130
00131 friend class tCellFix<dimfix, coordtype>;
00132
00133 private:
00135 coordtype tab [dimfix];
00136
00137 };
00138
00139
00140
00141 template <int dimfix, class coordtype>
00142 inline tCubeFix<dimfix,coordtype>::tCubeFix ()
00143 {
00144 return;
00145 }
00146
00147 template <int dimfix, class coordtype>
00148 inline tCubeFix<dimfix,coordtype>::tCubeFix
00149 (const coordtype *c, int dim)
00150 {
00151 if (dim && ((dim != dimfix) || (dim < 0)))
00152 throw "Wrong dimension of a fixed-dim cube.";
00153 PointBase::wrapcopy (tab, c, dimfix);
00154 return;
00155 }
00156
00157 template <int dimfix, class coordtype>
00158 inline tCubeFix<dimfix,coordtype>::tCubeFix (int, int)
00159 {
00160 throw "Unable to construct a cube from a number.";
00161 }
00162
00163 template <int dimfix, class coordtype>
00164 inline tCubeFix<dimfix,coordtype>::tCubeFix
00165 (const tCubeFix<dimfix,coordtype> &c)
00166 {
00167 for (int i = 0; i < dimfix; ++ i)
00168 tab [i] = c. tab [i];
00169 return;
00170 }
00171
00172 template <int dimfix, class coordtype>
00173 inline tCubeFix<dimfix,coordtype> &tCubeFix<dimfix,coordtype>::operator =
00174 (const tCubeFix<dimfix,coordtype> &c)
00175 {
00176 for (int i = 0; i < dimfix; ++ i)
00177 tab [i] = c. tab [i];
00178 return *this;
00179 }
00180
00181 template <int dimfix, class coordtype>
00182 inline int tCubeFix<dimfix,coordtype>::dim () const
00183 {
00184 return dimfix;
00185 }
00186
00187
00188
00189
00190
00191
00192
00193
00194
00195
00196 template <int dimfix, class coordtype>
00197 inline coordtype *tCubeFix<dimfix,coordtype>::coord (coordtype *c) const
00198 {
00199 for (int i = 0; i < dimfix; ++ i)
00200 c [i] = tab [i];
00201 return c;
00202 }
00203
00204 template <int dimfix, class coordtype>
00205 inline int_t tCubeFix<dimfix,coordtype>::hashkey1 () const
00206 {
00207 switch (dimfix)
00208 {
00209 case 1:
00210 return static_cast<int_t> (tab [0]) << 12;
00211 case 2:
00212 return ((static_cast<int_t> (tab [0])) << 18) +
00213 ((static_cast<int_t> (tab [1])) << 6);
00214 default:
00215 return ((static_cast<int_t> (tab [0])) << 18) +
00216 ((static_cast<int_t> (tab [1])) << 6) +
00217 ((static_cast<int_t> (tab [2])) >> 6);
00218 }
00219 }
00220
00221 template <int dimfix, class coordtype>
00222 inline int_t tCubeFix<dimfix,coordtype>::hashkey2 () const
00223 {
00224 switch (dimfix)
00225 {
00226 case 1:
00227 return static_cast<int_t> (tab [0]) << 3;
00228 case 2:
00229 return (static_cast<int_t> (tab [0]) >> 1) +
00230 (static_cast<int_t> (tab [1]) << 13);
00231 default:
00232 return ((static_cast<int_t> (tab [dimfix - 1])) << 20) +
00233 ((static_cast<int_t> (tab [dimfix - 2])) << 9) +
00234 ((static_cast<int_t> (tab [dimfix - 3])) >> 1);
00235 }
00236 }
00237
00238 template <int dimfix, class coordtype>
00239 const char *tCubeFix<dimfix,coordtype>::name ()
00240 {
00241 return "cube";
00242 }
00243
00244 template <int dimfix, class coordtype>
00245 const char *tCubeFix<dimfix,coordtype>::pluralname ()
00246 {
00247 return "cubes";
00248 }
00249
00251 template <int dim1, int dim2, class coordtype>
00252 inline int operator != (const tCubeFix<dim1,coordtype> &c1,
00253 const tCubeFix<dim2,coordtype> &c2)
00254 {
00255 return !(c1 == c2);
00256 }
00257
00258
00259
00261 template <int dim1, int dim2, class coordtype>
00262 inline tCubeFix<dim1+dim2,coordtype> operator *
00263 (const tCubeFix<dim1,coordtype> &c1,
00264 const tCubeFix<dim2,coordtype> &c2)
00265 {
00266 coordtype coord [dim1 + dim2];
00267 c1. coord (coord);
00268 c2. coord (coord + dim1);
00269 return tCubeFix<dim1+dim2,coordtype> (coord);
00270 }
00271
00272
00273
00277 template <int dimfix, class coordtype>
00278 inline std::ostream &operator << (std::ostream &out,
00279 const tCubeFix<dimfix,coordtype> &c)
00280 {
00281 return WriteCube (out, c);
00282 }
00283
00287 template <int dimfix, class coordtype>
00288 inline std::istream &operator >> (std::istream &in,
00289 tCubeFix<dimfix,coordtype> &c)
00290 {
00291 return ReadCubeFix (in, c, dimfix);
00292 }
00293
00295 template <int dimfix, class coordtype>
00296 inline std::istream &operator >> (std::istream &in,
00297 hashedset<tCubeFix<dimfix,coordtype> > &s)
00298 {
00299 return ReadCubes (in, s);
00300 }
00301
00303 template <int dimfix, class coordtype>
00304 inline std::istream &operator >> (std::istream &in,
00305 mvmap<tCubeFix<dimfix,coordtype>,tCubeFix<dimfix,coordtype> > &m)
00306 {
00307 return ReadCubicalMap (in, m);
00308 }
00309
00310
00311 }
00312 }
00313
00314 #endif // _CHOMP_CUBES_CUBEFIX_H_
00315
00317