1 // This is prip/vpyr/vpyr_2_pyramid_base.h
2 #ifndef vpyr_2_pyramid_base_h_
3 #define vpyr_2_pyramid_base_h_
4 //:
5 // \file
6 // \brief contains the elements of the base of a vmap_2_pyramid.
7 // \author Jocelyn Marchadier
8 // \date 06 May 2004
9 //
10 // \verbatim
11 //  Modifications
12 //   6 May 2004 Jocelyn Marchadier - initial version
13 // \endverbatim
14 
15 #include <vmap/vmap_2_map.h>
16 
17 class vpyr_2_pyramid_base_dart ;
18 
19 template <typename DPtr>
vpyr_2_pyramid_base_alpha(DPtr arg,vmap_level_index l)20 inline DPtr vpyr_2_pyramid_base_alpha(DPtr arg, vmap_level_index l)
21 {
22   return (DPtr) (*arg).vpyr_2_pyramid_base_dart::alpha(l) ;
23 }
24 
25 template <typename DPtr>
vpyr_2_pyramid_base_sigma(DPtr arg,vmap_level_index l)26 inline DPtr vpyr_2_pyramid_base_sigma(DPtr arg, vmap_level_index l)
27 {
28   return (DPtr) (*arg).vpyr_2_pyramid_base_dart::sigma(l) ;
29 }
30 
31 template <typename DPtr>
vpyr_2_pyramid_base_phi(DPtr arg,vmap_level_index l)32 inline DPtr vpyr_2_pyramid_base_phi(DPtr arg, vmap_level_index l)
33 {
34   return (DPtr) (*arg).vpyr_2_pyramid_base_dart::phi(l) ;
35 }
36 
37 template <typename DPtr>
vpyr_2_pyramid_base_ialpha(DPtr arg,vmap_level_index l)38 inline DPtr vpyr_2_pyramid_base_ialpha(DPtr arg, vmap_level_index l)
39 {
40   return (DPtr) arg->vpyr_2_pyramid_base_dart::ialpha(l) ;
41 }
42 
43 template <typename DPtr>
vpyr_2_pyramid_base_isigma(DPtr arg,vmap_level_index l)44 inline DPtr vpyr_2_pyramid_base_isigma(DPtr arg, vmap_level_index l)
45 {
46   return (DPtr) (*arg).vpyr_2_pyramid_base_dart::isigma(l) ;
47 }
48 
49 template <typename DPtr>
vpyr_2_pyramid_base_iphi(DPtr arg,vmap_level_index l)50 inline DPtr vpyr_2_pyramid_base_iphi(DPtr arg, vmap_level_index l)
51 {
52   return (DPtr) arg->vpyr_2_pyramid_base_dart::iphi(l) ;
53 }
54 
55 template <typename DPtr>
vpyr_2_pyramid_base_ancestor(DPtr arg,vmap_level_index l)56 DPtr vpyr_2_pyramid_base_ancestor(DPtr arg, vmap_level_index l)
57 {
58   return (DPtr)(arg->ancestor(l)) ;
59 }
60 
61 //: Data associated to each element at each level.
62 template <class D>
63 struct vmap_simple_data
64 {
65   typedef D value_type ;
66   value_type d;
datavmap_simple_data67   value_type &data(vmap_level_index /*arg_level*/) { return d; }
68 
datavmap_simple_data69   const value_type &data(vmap_level_index /*arg_level*/) const { return d; }
set_levelvmap_simple_data70   void set_level(vmap_level_index l) {}
71 };
72 
73 //: Data associated to each element duplicated at level.
74 template <class D>
75 struct vmap_replicated_data
76 {
77   typedef D value_type ;
78   std::vector<value_type> d;
vmap_replicated_datavmap_replicated_data79   vmap_replicated_data()
80   {
81     d.push_back(this->ReturnType()) ;
82   }
datavmap_replicated_data83   value_type & data(vmap_level_index arg_level)
84   {
85     return d[arg_level] ;
86   }
87 
datavmap_replicated_data88   const value_type & data(vmap_level_index arg_level) const
89   {
90     return d[arg_level] ;
91   }
set_levelvmap_replicated_data92   void set_level(vmap_level_index l)
93   {
94     while (d.size()<l) d.push_back(d.last()) ;
95   }
96 };
97 
98 //: the dart class of a 2-pyramid base level.
99 class vpyr_2_pyramid_base_dart : public vmap_2_map_dart
100 {
101  public:
102 #if 0
103   vpyr_2_pyramid_base_dart() ;
104 #endif // 0
105 
106   //: The last level.
last_level()107   vmap_level_index last_level() const
108   {
109     return last_level_/2;
110   }
111 
112   //: Returns true if the dart has been contracted or removed at level "arg".
modified_at_level(vmap_level_index arg)113   bool modified_at_level(vmap_level_index arg) const
114   {
115     return last_level_ == (arg*2);
116   }
117 
118   //: Returns true if the dart has been contracted or removed at its last level.
modified_at_last_level()119   bool modified_at_last_level() const
120   {
121     return !(last_level_ & 1);
122   }
123 
124   //: Sets the last level at which the dart survive.
125   void set_last_level(vmap_level_index arg) ;
126 
127   //: Returns true if the dart is a pendant dart.
is_pendant(vmap_level_index level)128   bool is_pendant(vmap_level_index level) const
129   {
130     return this == sigma(level) ;
131   }
132 
133   //: Returns true if the dart is a redundant dart.
is_redundant(vmap_level_index level)134   bool is_redundant(vmap_level_index level) const
135   {
136     return this == sigma(level)->sigma(level) ;
137   }
138 
139   //: Returns true if the dart is a self direct loop.
is_self_direct_loop(vmap_level_index level)140   bool is_self_direct_loop(vmap_level_index level) const
141   {
142     return this==phi(level) ;
143   }
144 
145   //: Returns true if the dart is a double dart.
is_double(vmap_level_index level)146   bool is_double(vmap_level_index level) const
147   {
148     return this == phi(level)->phi(level) ;
149   }
150 
151   //: Returns the corresponding surviving dart at level "level".
152   vpyr_2_pyramid_base_dart* ancestor(vmap_level_index level) ;
153 
154   //: Returns the corresponding surviving dart at level "level".
155   const vpyr_2_pyramid_base_dart* ancestor(vmap_level_index level) const ;
156 
157   //: The following functions should not be used by the user
alpha(vmap_level_index level)158   const vpyr_2_pyramid_base_dart* alpha(vmap_level_index level) const
159   {
160     return vmap_2_map_alpha(this)->ancestor(level) ;
161   }
162 
sigma(vmap_level_index level)163   const vpyr_2_pyramid_base_dart* sigma(vmap_level_index level) const
164   {
165     return vmap_2_map_sigma(this)->ancestor(level) ;
166   }
167 
phi(vmap_level_index level)168   const vpyr_2_pyramid_base_dart* phi(vmap_level_index level) const
169   {
170     return vmap_2_map_phi(this)->ancestor(level) ;
171   }
172 
isigma(vmap_level_index level)173   const vpyr_2_pyramid_base_dart* isigma(vmap_level_index level) const
174   {
175     return vmap_2_map_isigma(this)->ancestor(level) ;
176   }
177 
iphi(vmap_level_index level)178   const vpyr_2_pyramid_base_dart* iphi(vmap_level_index level)  const
179   {
180     return vmap_2_map_iphi(this)->ancestor(level) ;
181   }
182 
alpha(vmap_level_index level)183   vpyr_2_pyramid_base_dart* alpha(vmap_level_index level)
184   {
185     return vmap_2_map_alpha(this)->ancestor(level) ;
186   }
187 
sigma(vmap_level_index level)188   vpyr_2_pyramid_base_dart* sigma(vmap_level_index level)
189   {
190     return vmap_2_map_sigma(this)->ancestor(level) ;
191   }
192 
phi(vmap_level_index level)193   vpyr_2_pyramid_base_dart* phi(vmap_level_index level)
194   {
195     return vmap_2_map_phi(this)->ancestor(level) ;
196   }
197 
isigma(vmap_level_index level)198   vpyr_2_pyramid_base_dart* isigma(vmap_level_index level)
199   {
200     return vmap_2_map_isigma(this)->ancestor(level) ;
201   }
202 
iphi(vmap_level_index level)203   vpyr_2_pyramid_base_dart* iphi(vmap_level_index level)
204   {
205     return vmap_2_map_iphi(this)->ancestor(level) ;
206   }
207  protected :
208   vmap_level_index last_level_ ;
209 #if 0
210   //: Return the direct ancestor of this dart.
211   vpyr_2_pyramid_base_dart* directAncestor() ;
212 
213  private :
214   vpyr_2_pyramid_base_dart* toplevel_typeAncestor_ ;
215   vpyr_2_pyramid_base_dart* directAncestor_ ;
216 #endif // 0
217 };
218 
219 //: The public vmap_2_tmap_dart class.
220 template <class D>
221 class vmap_2_pd_dart : public vpyr_2_pyramid_base_dart
222 {
223  public:
224 
data(vmap_level_index arg_level)225   typename D::value_type & data(vmap_level_index arg_level)
226   {
227     return d_.data(arg_level) ;
228   }
229 
data(vmap_level_index arg_level)230   const typename D::value_type & data(vmap_level_index arg_level) const
231   {
232     return d_.data(arg_level) ;
233   }
234 
235  protected :
236   D d_ ;
237 };
238 
239 #endif
240