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_ANYFUNC_HH
00029 # define OLENA_TOPO_COMBINATORIAL_MAP_INTERNAL_ANYFUNC_HH
00030
00031 # include <mlc/contract.hh>
00032
00033 # include <vector>
00034 namespace oln {
00035
00036 namespace topo {
00037
00038 namespace combinatorial_map {
00039
00041 namespace internal {
00042
00047 template <class Inf>
00048 class any
00049 {
00050 public:
00051 const Inf & self() const { return static_cast<const Inf &>(*this); }
00052 Inf & self() { return static_cast<Inf &>(*this); }
00053 };
00054
00060 template <class U, class V, class Inf>
00061 class anyfunc : public any<Inf>
00062 {
00063 protected:
00064 anyfunc() : f_(1) {}
00066 anyfunc(unsigned n) : f_(n+1) { assertion(n); }
00067
00068 public:
00070 V operator()(const U & e) const
00071 {
00072 assertion(e < f_.size());
00073 return f_[e];
00074 }
00075
00077 void resize(unsigned n)
00078 {
00079 self().resize_(n);
00080 }
00082 void assign(const U & i, const V & e)
00083 {
00084 assertion(i < f_.size());
00085 self().assign_(i, e);
00086 }
00087
00089 void erase(const U & i)
00090 {
00091 assertion(i < f_.size());
00092 self().erase_(i);
00093 }
00095 std::ostream & print(std::ostream & ostr) const
00096 {
00097 for (unsigned i = 1; i < f_.size(); ++i)
00098 ostr << self().name() << "(" << i << ") = " << f_[i] << std::endl;
00099 return ostr;
00100 }
00101
00102 protected:
00103 std::vector<V> f_;
00104 };
00105
00106 }
00107
00108 }
00109
00110 }
00111
00112 }
00113
00114 template <class U, class V, class Inf>
00115 inline std::ostream &
00116 operator<<(std::ostream & ostr,
00117 const oln::topo::combinatorial_map::internal::anyfunc<U,V,Inf> & f)
00118 {
00119 return f.exact().print(ostr);
00120 }
00121
00122 #endif // ! OLENA_TOPO_COMBINATORIAL_MAP_INTERNAL_ANYFUNC_HH