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