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 OLENA_TOPO_COMBINATORIAL_MAP_INTERNAL_SIGMA_HH
00029 # define OLENA_TOPO_COMBINATORIAL_MAP_INTERNAL_SIGMA_HH
00030
00031 # include <oln/topo/combinatorial-map/internal/anyfunc.hh>
00032 # include <oln/topo/combinatorial-map/internal/alpha.hh>
00033
00034 # include <mlc/contract.hh>
00035
00036 # include <vector>
00037
00038 namespace oln {
00039
00040 namespace topo {
00041
00042 namespace combinatorial_map {
00043
00044 namespace internal {
00045
00046
00047
00048
00049
00050 template <class U>
00051 class sigma : public anyfunc< U, U, sigma<U> >
00052 {
00053 public:
00054 static std::string
00055 name()
00056 {
00057 return "sigma";
00058 }
00059
00060 void
00061 resize_(unsigned n)
00062 {
00063 f_.resize(n+1);
00064 f_1_.resize(n+1);
00065 }
00066
00067 void
00068 assign_(const U & i, const U & e)
00069 {
00070 assertion(e < f_1_.size());
00071
00072 f_[i] = e;
00073 f_1_[e] = i;
00074 }
00075
00076 void
00077 erase_(const U & d)
00078 {
00079 f_[f_1_[d]] = f_[d];
00080 f_1_[f_[d]] = f_1_[d];
00081 f_[d] = f_1_[d] = 0;
00082
00083 unsigned d_ = alpha<U>::result(d);
00084 f_[f_1_[d_]] = f_[d_];
00085 f_1_[f_[d_]] = f_1_[d_];
00086 f_[d_] = f_1_[d_] = 0;
00087 }
00088
00089 private:
00090 std::vector<U> f_1_;
00091 };
00092
00093 }
00094
00095 }
00096
00097 }
00098
00099 }
00100
00101 #endif // ! OLENA_TOPO_COMBINATORIAL_MAP_INTERNAL_SIGMA_HH