Go to the documentation of this file.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 #ifndef _CHAINCON_FILTCOMPLEX_H_
00029 #define _CHAINCON_FILTCOMPLEX_H_
00030
00031
00032
00033 #include <istream>
00034 #include <ostream>
00035
00036
00037 #include "chomp/system/config.h"
00038 #include "chomp/system/textfile.h"
00039 #include "chomp/struct/hashsets.h"
00040
00041
00042
00043
00044
00045
00046
00047
00048
00049
00050
00051
00052 template <class CellT>
00053 class tFilteredComplex
00054 {
00055 public:
00056
00057 tFilteredComplex ();
00058
00059
00060
00061 int_t add (const CellT &c);
00062
00063
00064 int_t size () const;
00065
00066
00067 bool empty () const;
00068
00069
00070 const CellT &operator [] (int_t n) const;
00071
00072
00073 void swap (tFilteredComplex<CellT> &fc);
00074
00075 private:
00076
00077 chomp::homology::hashedset<CellT> cells;
00078
00079 };
00080
00081
00082
00083 template <class CellT>
00084 inline tFilteredComplex<CellT>::tFilteredComplex ():
00085 cells (1024)
00086 {
00087 return;
00088 }
00089
00090 template <class CellT>
00091 inline int_t tFilteredComplex<CellT>::add (const CellT &c)
00092 {
00093 return cells. add (c);
00094 }
00095
00096 template <class CellT>
00097 inline int_t tFilteredComplex<CellT>::size () const
00098 {
00099 return cells. size ();
00100 }
00101
00102 template <class CellT>
00103 inline bool tFilteredComplex<CellT>::empty () const
00104 {
00105 return cells. empty ();
00106 }
00107
00108 template <class CellT>
00109 inline const CellT &tFilteredComplex<CellT>::operator [] (int_t n) const
00110 {
00111 int_t size = cells. size ();
00112 if (n >= size)
00113 throw "Wrong number of a cell in a filtered complex.";
00114 return cells [size - n - 1];
00115 }
00116
00117 template <class CellT>
00118 inline void tFilteredComplex<CellT>::swap (tFilteredComplex<CellT> &fc)
00119 {
00120 cells. swap (fc. cells);
00121 }
00122
00123
00124
00125
00126 template <class CellT>
00127 inline void addBoundaries (tFilteredComplex<CellT> &K)
00128 {
00129 for (int_t n = 0; n < K. size (); ++ n)
00130 {
00131 const CellT &c = K [K. size () - n - 1];
00132 int len = c. boundaryLength ();
00133 for (int i = 0; i < len; ++ i)
00134 {
00135 CellT bc (c, i);
00136 int_t cn = K. add (bc);
00137 if (cn < n)
00138 {
00139 throw "Boundary cell appears too early "
00140 "in the filter.";
00141 }
00142 }
00143 }
00144 return;
00145 }
00146
00147
00148
00149
00150 template <class CellT>
00151 std::ostream &operator << (std::ostream &out,
00152 const tFilteredComplex<CellT> &C)
00153 {
00154 int_t size = C. size ();
00155 for (int_t i = 0; i < size; ++ i)
00156 {
00157 out << C [i] << "\n";
00158 }
00159 return out;
00160 }
00161
00162
00163
00164
00165
00166
00167
00168
00169 template <class CellT>
00170 std::istream &operator >> (std::istream &in, tFilteredComplex<CellT> &K)
00171 {
00172 chomp::homology::ignorecomments (in);
00173 while (!in. eof ())
00174 {
00175 CellT s;
00176 in >> s;
00177 if (s. dim () < 0)
00178 {
00179 #ifndef NO_EMPTY_CELL
00180 K. add (s);
00181 #endif
00182 break;
00183 }
00184 K. add (s);
00185 }
00186 return in;
00187 }
00188
00189
00190 #endif // _CHAINCON_FILTCOMPLEX_H_
00191