1*b1cdbd2cSJim Jagielski /**************************************************************
2*b1cdbd2cSJim Jagielski *
3*b1cdbd2cSJim Jagielski * Licensed to the Apache Software Foundation (ASF) under one
4*b1cdbd2cSJim Jagielski * or more contributor license agreements. See the NOTICE file
5*b1cdbd2cSJim Jagielski * distributed with this work for additional information
6*b1cdbd2cSJim Jagielski * regarding copyright ownership. The ASF licenses this file
7*b1cdbd2cSJim Jagielski * to you under the Apache License, Version 2.0 (the
8*b1cdbd2cSJim Jagielski * "License"); you may not use this file except in compliance
9*b1cdbd2cSJim Jagielski * with the License. You may obtain a copy of the License at
10*b1cdbd2cSJim Jagielski *
11*b1cdbd2cSJim Jagielski * http://www.apache.org/licenses/LICENSE-2.0
12*b1cdbd2cSJim Jagielski *
13*b1cdbd2cSJim Jagielski * Unless required by applicable law or agreed to in writing,
14*b1cdbd2cSJim Jagielski * software distributed under the License is distributed on an
15*b1cdbd2cSJim Jagielski * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
16*b1cdbd2cSJim Jagielski * KIND, either express or implied. See the License for the
17*b1cdbd2cSJim Jagielski * specific language governing permissions and limitations
18*b1cdbd2cSJim Jagielski * under the License.
19*b1cdbd2cSJim Jagielski *
20*b1cdbd2cSJim Jagielski *************************************************************/
21*b1cdbd2cSJim Jagielski
22*b1cdbd2cSJim Jagielski #include <precomp.h>
23*b1cdbd2cSJim Jagielski #include <ary/cpp/usedtype.hxx>
24*b1cdbd2cSJim Jagielski
25*b1cdbd2cSJim Jagielski
26*b1cdbd2cSJim Jagielski // NOT FULLY DEFINED SERVICES
27*b1cdbd2cSJim Jagielski #include <cosv/tpl/tpltools.hxx>
28*b1cdbd2cSJim Jagielski #include <ary/symtreenode.hxx>
29*b1cdbd2cSJim Jagielski #include <ary/cpp/c_ce.hxx>
30*b1cdbd2cSJim Jagielski #include <ary/cpp/c_class.hxx>
31*b1cdbd2cSJim Jagielski #include <ary/cpp/c_namesp.hxx>
32*b1cdbd2cSJim Jagielski #include <ary/cpp/c_slntry.hxx>
33*b1cdbd2cSJim Jagielski #include <ary/cpp/c_tydef.hxx>
34*b1cdbd2cSJim Jagielski #include <ary/cpp/c_traits.hxx>
35*b1cdbd2cSJim Jagielski #include <ary/cpp/c_types4cpp.hxx>
36*b1cdbd2cSJim Jagielski #include <ary/cpp/c_gate.hxx>
37*b1cdbd2cSJim Jagielski #include <ary/cpp/cp_ce.hxx>
38*b1cdbd2cSJim Jagielski #include <ary/cpp/cp_type.hxx>
39*b1cdbd2cSJim Jagielski #include <ary/doc/d_oldcppdocu.hxx>
40*b1cdbd2cSJim Jagielski #include <ary/getncast.hxx>
41*b1cdbd2cSJim Jagielski #include "tplparam.hxx"
42*b1cdbd2cSJim Jagielski
43*b1cdbd2cSJim Jagielski
44*b1cdbd2cSJim Jagielski
45*b1cdbd2cSJim Jagielski namespace
46*b1cdbd2cSJim Jagielski {
47*b1cdbd2cSJim Jagielski
48*b1cdbd2cSJim Jagielski using namespace ::ary::cpp;
49*b1cdbd2cSJim Jagielski typedef std::vector< ary::cpp::E_ConVol > PtrLevelVector;
50*b1cdbd2cSJim Jagielski
51*b1cdbd2cSJim Jagielski
52*b1cdbd2cSJim Jagielski inline bool
result2bool(intt i_nResult)53*b1cdbd2cSJim Jagielski result2bool( intt i_nResult )
54*b1cdbd2cSJim Jagielski { return i_nResult < 0; }
55*b1cdbd2cSJim Jagielski
56*b1cdbd2cSJim Jagielski
57*b1cdbd2cSJim Jagielski intt compare_PtrLevelVector(
58*b1cdbd2cSJim Jagielski const PtrLevelVector &
59*b1cdbd2cSJim Jagielski i_r1,
60*b1cdbd2cSJim Jagielski const PtrLevelVector &
61*b1cdbd2cSJim Jagielski i_r2 );
62*b1cdbd2cSJim Jagielski inline intt
compare_ConVol(E_ConVol i_e1,E_ConVol i_e2)63*b1cdbd2cSJim Jagielski compare_ConVol( E_ConVol i_e1,
64*b1cdbd2cSJim Jagielski E_ConVol i_e2 )
65*b1cdbd2cSJim Jagielski { return intt(i_e1) - intt(i_e2); }
66*b1cdbd2cSJim Jagielski
67*b1cdbd2cSJim Jagielski inline intt
compare_bool(bool i_b1,bool i_b2)68*b1cdbd2cSJim Jagielski compare_bool( bool i_b1,
69*b1cdbd2cSJim Jagielski bool i_b2 )
70*b1cdbd2cSJim Jagielski { return i_b1 == i_b2
71*b1cdbd2cSJim Jagielski ? 0
72*b1cdbd2cSJim Jagielski : i_b1
73*b1cdbd2cSJim Jagielski ? -1
74*b1cdbd2cSJim Jagielski : +1; }
75*b1cdbd2cSJim Jagielski inline intt
compare_Specialisation(E_TypeSpecialisation i_e1,E_TypeSpecialisation i_e2)76*b1cdbd2cSJim Jagielski compare_Specialisation( E_TypeSpecialisation i_e1,
77*b1cdbd2cSJim Jagielski E_TypeSpecialisation i_e2 )
78*b1cdbd2cSJim Jagielski { return intt(i_e1) - intt(i_e2); }
79*b1cdbd2cSJim Jagielski
80*b1cdbd2cSJim Jagielski inline bool
is_const(E_ConVol i_eCV)81*b1cdbd2cSJim Jagielski is_const( E_ConVol i_eCV )
82*b1cdbd2cSJim Jagielski { return ( intt(i_eCV) & intt(CONVOL_const) ) != 0; }
83*b1cdbd2cSJim Jagielski
84*b1cdbd2cSJim Jagielski inline bool
is_volatile(E_ConVol i_eCV)85*b1cdbd2cSJim Jagielski is_volatile( E_ConVol i_eCV )
86*b1cdbd2cSJim Jagielski { return ( intt(i_eCV) & intt(CONVOL_volatile) ) != 0; }
87*b1cdbd2cSJim Jagielski
88*b1cdbd2cSJim Jagielski
89*b1cdbd2cSJim Jagielski intt
compare_PtrLevelVector(const PtrLevelVector & i_r1,const PtrLevelVector & i_r2)90*b1cdbd2cSJim Jagielski compare_PtrLevelVector( const PtrLevelVector & i_r1,
91*b1cdbd2cSJim Jagielski const PtrLevelVector & i_r2 )
92*b1cdbd2cSJim Jagielski {
93*b1cdbd2cSJim Jagielski intt nResult = i_r1.size() - i_r2.size();
94*b1cdbd2cSJim Jagielski if ( nResult != 0 )
95*b1cdbd2cSJim Jagielski return nResult;
96*b1cdbd2cSJim Jagielski
97*b1cdbd2cSJim Jagielski PtrLevelVector::const_iterator it1 = i_r1.begin();
98*b1cdbd2cSJim Jagielski PtrLevelVector::const_iterator it1End = i_r1.end();
99*b1cdbd2cSJim Jagielski PtrLevelVector::const_iterator it2 = i_r2.begin();
100*b1cdbd2cSJim Jagielski
101*b1cdbd2cSJim Jagielski for ( ; it1 != it1End; ++it1, ++it2 )
102*b1cdbd2cSJim Jagielski {
103*b1cdbd2cSJim Jagielski nResult = compare_ConVol(*it1, *it2);
104*b1cdbd2cSJim Jagielski if ( nResult != 0 )
105*b1cdbd2cSJim Jagielski return nResult;
106*b1cdbd2cSJim Jagielski }
107*b1cdbd2cSJim Jagielski
108*b1cdbd2cSJim Jagielski return 0;
109*b1cdbd2cSJim Jagielski }
110*b1cdbd2cSJim Jagielski
111*b1cdbd2cSJim Jagielski
112*b1cdbd2cSJim Jagielski } // anonymous namespace
113*b1cdbd2cSJim Jagielski
114*b1cdbd2cSJim Jagielski
115*b1cdbd2cSJim Jagielski
116*b1cdbd2cSJim Jagielski
117*b1cdbd2cSJim Jagielski namespace ary
118*b1cdbd2cSJim Jagielski {
119*b1cdbd2cSJim Jagielski namespace cpp
120*b1cdbd2cSJim Jagielski {
121*b1cdbd2cSJim Jagielski
122*b1cdbd2cSJim Jagielski typedef symtree::Node<CeNode_Traits> CeNode;
123*b1cdbd2cSJim Jagielski typedef ut::NameChain::const_iterator nc_iter;
124*b1cdbd2cSJim Jagielski
125*b1cdbd2cSJim Jagielski Ce_id CheckForRelatedCe_inNode(
126*b1cdbd2cSJim Jagielski const CeNode & i_node,
127*b1cdbd2cSJim Jagielski const StringVector& i_qualification,
128*b1cdbd2cSJim Jagielski const String & i_name );
129*b1cdbd2cSJim Jagielski
130*b1cdbd2cSJim Jagielski
UsedType(Ce_id i_scope)131*b1cdbd2cSJim Jagielski UsedType::UsedType(Ce_id i_scope )
132*b1cdbd2cSJim Jagielski : aPath(),
133*b1cdbd2cSJim Jagielski aPtrLevels(),
134*b1cdbd2cSJim Jagielski eConVol_Type(CONVOL_none),
135*b1cdbd2cSJim Jagielski bIsReference(false),
136*b1cdbd2cSJim Jagielski bIsAbsolute(false),
137*b1cdbd2cSJim Jagielski bRefers2BuiltInType(false),
138*b1cdbd2cSJim Jagielski eTypeSpecialisation(TYSP_none),
139*b1cdbd2cSJim Jagielski nRelatedCe(0),
140*b1cdbd2cSJim Jagielski nScope(i_scope)
141*b1cdbd2cSJim Jagielski {
142*b1cdbd2cSJim Jagielski }
143*b1cdbd2cSJim Jagielski
~UsedType()144*b1cdbd2cSJim Jagielski UsedType::~UsedType()
145*b1cdbd2cSJim Jagielski {
146*b1cdbd2cSJim Jagielski }
147*b1cdbd2cSJim Jagielski
148*b1cdbd2cSJim Jagielski
149*b1cdbd2cSJim Jagielski bool
operator <(const UsedType & i_rType) const150*b1cdbd2cSJim Jagielski UsedType::operator<( const UsedType & i_rType ) const
151*b1cdbd2cSJim Jagielski {
152*b1cdbd2cSJim Jagielski intt nResult = compare_bool( bIsAbsolute, i_rType.bIsAbsolute );
153*b1cdbd2cSJim Jagielski if ( nResult != 0 )
154*b1cdbd2cSJim Jagielski return result2bool(nResult);
155*b1cdbd2cSJim Jagielski
156*b1cdbd2cSJim Jagielski nResult = static_cast<intt>(nScope.Value())
157*b1cdbd2cSJim Jagielski -
158*b1cdbd2cSJim Jagielski static_cast<intt>(i_rType.nScope.Value());
159*b1cdbd2cSJim Jagielski if ( nResult != 0 )
160*b1cdbd2cSJim Jagielski return result2bool(nResult);
161*b1cdbd2cSJim Jagielski
162*b1cdbd2cSJim Jagielski nResult = aPath.Compare( i_rType.aPath );
163*b1cdbd2cSJim Jagielski if ( nResult != 0 )
164*b1cdbd2cSJim Jagielski return result2bool(nResult);
165*b1cdbd2cSJim Jagielski
166*b1cdbd2cSJim Jagielski nResult = compare_ConVol( eConVol_Type, i_rType.eConVol_Type );
167*b1cdbd2cSJim Jagielski if ( nResult != 0 )
168*b1cdbd2cSJim Jagielski return result2bool(nResult);
169*b1cdbd2cSJim Jagielski
170*b1cdbd2cSJim Jagielski nResult = compare_PtrLevelVector( aPtrLevels, i_rType.aPtrLevels );
171*b1cdbd2cSJim Jagielski if ( nResult != 0 )
172*b1cdbd2cSJim Jagielski return result2bool(nResult);
173*b1cdbd2cSJim Jagielski
174*b1cdbd2cSJim Jagielski nResult = compare_bool( bIsReference, i_rType.bIsReference );
175*b1cdbd2cSJim Jagielski if ( nResult != 0 )
176*b1cdbd2cSJim Jagielski return result2bool(nResult);
177*b1cdbd2cSJim Jagielski
178*b1cdbd2cSJim Jagielski nResult = compare_Specialisation( eTypeSpecialisation, i_rType.eTypeSpecialisation );
179*b1cdbd2cSJim Jagielski if ( nResult != 0 )
180*b1cdbd2cSJim Jagielski return result2bool(nResult);
181*b1cdbd2cSJim Jagielski
182*b1cdbd2cSJim Jagielski return false;
183*b1cdbd2cSJim Jagielski }
184*b1cdbd2cSJim Jagielski
185*b1cdbd2cSJim Jagielski void
Set_Absolute()186*b1cdbd2cSJim Jagielski UsedType::Set_Absolute()
187*b1cdbd2cSJim Jagielski {
188*b1cdbd2cSJim Jagielski bIsAbsolute = true;
189*b1cdbd2cSJim Jagielski }
190*b1cdbd2cSJim Jagielski
191*b1cdbd2cSJim Jagielski void
Add_NameSegment(const char * i_sSeg)192*b1cdbd2cSJim Jagielski UsedType::Add_NameSegment( const char * i_sSeg )
193*b1cdbd2cSJim Jagielski {
194*b1cdbd2cSJim Jagielski aPath.Add_Segment(i_sSeg);
195*b1cdbd2cSJim Jagielski }
196*b1cdbd2cSJim Jagielski
197*b1cdbd2cSJim Jagielski ut::List_TplParameter &
Enter_Template()198*b1cdbd2cSJim Jagielski UsedType::Enter_Template()
199*b1cdbd2cSJim Jagielski {
200*b1cdbd2cSJim Jagielski return aPath.Templatize_LastSegment();
201*b1cdbd2cSJim Jagielski }
202*b1cdbd2cSJim Jagielski
203*b1cdbd2cSJim Jagielski void
Set_Unsigned()204*b1cdbd2cSJim Jagielski UsedType::Set_Unsigned()
205*b1cdbd2cSJim Jagielski {
206*b1cdbd2cSJim Jagielski eTypeSpecialisation = TYSP_unsigned;
207*b1cdbd2cSJim Jagielski }
208*b1cdbd2cSJim Jagielski
209*b1cdbd2cSJim Jagielski void
Set_Signed()210*b1cdbd2cSJim Jagielski UsedType::Set_Signed()
211*b1cdbd2cSJim Jagielski {
212*b1cdbd2cSJim Jagielski eTypeSpecialisation = TYSP_signed;
213*b1cdbd2cSJim Jagielski }
214*b1cdbd2cSJim Jagielski
215*b1cdbd2cSJim Jagielski void
Set_BuiltIn(const char * i_sType)216*b1cdbd2cSJim Jagielski UsedType::Set_BuiltIn( const char * i_sType )
217*b1cdbd2cSJim Jagielski {
218*b1cdbd2cSJim Jagielski aPath.Add_Segment(i_sType);
219*b1cdbd2cSJim Jagielski bRefers2BuiltInType = true;
220*b1cdbd2cSJim Jagielski }
221*b1cdbd2cSJim Jagielski
222*b1cdbd2cSJim Jagielski void
Set_Const()223*b1cdbd2cSJim Jagielski UsedType::Set_Const()
224*b1cdbd2cSJim Jagielski {
225*b1cdbd2cSJim Jagielski if (PtrLevel() == 0)
226*b1cdbd2cSJim Jagielski eConVol_Type = E_ConVol(eConVol_Type | CONVOL_const);
227*b1cdbd2cSJim Jagielski else
228*b1cdbd2cSJim Jagielski aPtrLevels.back() = E_ConVol(aPtrLevels.back() | CONVOL_const);
229*b1cdbd2cSJim Jagielski }
230*b1cdbd2cSJim Jagielski
231*b1cdbd2cSJim Jagielski void
Set_Volatile()232*b1cdbd2cSJim Jagielski UsedType::Set_Volatile()
233*b1cdbd2cSJim Jagielski {
234*b1cdbd2cSJim Jagielski if (PtrLevel() == 0)
235*b1cdbd2cSJim Jagielski eConVol_Type = E_ConVol(eConVol_Type | CONVOL_volatile);
236*b1cdbd2cSJim Jagielski else
237*b1cdbd2cSJim Jagielski aPtrLevels.back() = E_ConVol(aPtrLevels.back() | CONVOL_volatile);
238*b1cdbd2cSJim Jagielski }
239*b1cdbd2cSJim Jagielski
240*b1cdbd2cSJim Jagielski void
Add_PtrLevel()241*b1cdbd2cSJim Jagielski UsedType::Add_PtrLevel()
242*b1cdbd2cSJim Jagielski {
243*b1cdbd2cSJim Jagielski aPtrLevels.push_back(CONVOL_none);
244*b1cdbd2cSJim Jagielski }
245*b1cdbd2cSJim Jagielski
246*b1cdbd2cSJim Jagielski void
Set_Reference()247*b1cdbd2cSJim Jagielski UsedType::Set_Reference()
248*b1cdbd2cSJim Jagielski {
249*b1cdbd2cSJim Jagielski bIsReference = true;
250*b1cdbd2cSJim Jagielski }
251*b1cdbd2cSJim Jagielski
252*b1cdbd2cSJim Jagielski inline bool
IsInternal(const ary::cpp::CodeEntity & i_ce)253*b1cdbd2cSJim Jagielski IsInternal(const ary::cpp::CodeEntity & i_ce)
254*b1cdbd2cSJim Jagielski {
255*b1cdbd2cSJim Jagielski const ary::doc::OldCppDocu *
256*b1cdbd2cSJim Jagielski docu = dynamic_cast< const ary::doc::OldCppDocu* >(i_ce.Docu().Data());
257*b1cdbd2cSJim Jagielski if (docu != 0)
258*b1cdbd2cSJim Jagielski return docu->IsInternal();
259*b1cdbd2cSJim Jagielski return false;
260*b1cdbd2cSJim Jagielski }
261*b1cdbd2cSJim Jagielski
262*b1cdbd2cSJim Jagielski
263*b1cdbd2cSJim Jagielski void
Connect2Ce(const CePilot & i_ces)264*b1cdbd2cSJim Jagielski UsedType::Connect2Ce( const CePilot & i_ces)
265*b1cdbd2cSJim Jagielski {
266*b1cdbd2cSJim Jagielski StringVector
267*b1cdbd2cSJim Jagielski qualification;
268*b1cdbd2cSJim Jagielski String
269*b1cdbd2cSJim Jagielski name;
270*b1cdbd2cSJim Jagielski Get_NameParts(qualification, name);
271*b1cdbd2cSJim Jagielski
272*b1cdbd2cSJim Jagielski for ( const CeNode * scope_node = CeNode_Traits::NodeOf_(
273*b1cdbd2cSJim Jagielski i_ces.Find_Ce(nScope));
274*b1cdbd2cSJim Jagielski scope_node != 0;
275*b1cdbd2cSJim Jagielski scope_node = scope_node->Parent() )
276*b1cdbd2cSJim Jagielski {
277*b1cdbd2cSJim Jagielski nRelatedCe = CheckForRelatedCe_inNode(*scope_node, qualification, name);
278*b1cdbd2cSJim Jagielski if ( nRelatedCe.IsValid() )
279*b1cdbd2cSJim Jagielski {
280*b1cdbd2cSJim Jagielski if ( IsInternal(i_ces.Find_Ce(nRelatedCe)) )
281*b1cdbd2cSJim Jagielski nRelatedCe = Ce_id(0);
282*b1cdbd2cSJim Jagielski return;
283*b1cdbd2cSJim Jagielski }
284*b1cdbd2cSJim Jagielski } // end for
285*b1cdbd2cSJim Jagielski }
286*b1cdbd2cSJim Jagielski
287*b1cdbd2cSJim Jagielski void
Connect2CeOnlyKnownViaBaseClass(const Gate & i_gate)288*b1cdbd2cSJim Jagielski UsedType::Connect2CeOnlyKnownViaBaseClass(const Gate & i_gate)
289*b1cdbd2cSJim Jagielski {
290*b1cdbd2cSJim Jagielski csv_assert(nScope.IsValid());
291*b1cdbd2cSJim Jagielski CesResultList
292*b1cdbd2cSJim Jagielski instances = i_gate.Ces().Search_TypeName( LocalName() );
293*b1cdbd2cSJim Jagielski
294*b1cdbd2cSJim Jagielski // If there are no matches, or only one match that was already
295*b1cdbd2cSJim Jagielski // accepted, all work is done.
296*b1cdbd2cSJim Jagielski if ( (nRelatedCe.IsValid() AND instances.size() == 1)
297*b1cdbd2cSJim Jagielski OR instances.size() == 0 )
298*b1cdbd2cSJim Jagielski return;
299*b1cdbd2cSJim Jagielski
300*b1cdbd2cSJim Jagielski StringVector
301*b1cdbd2cSJim Jagielski qualification;
302*b1cdbd2cSJim Jagielski String
303*b1cdbd2cSJim Jagielski name;
304*b1cdbd2cSJim Jagielski Get_NameParts(qualification, name);
305*b1cdbd2cSJim Jagielski
306*b1cdbd2cSJim Jagielski const CodeEntity &
307*b1cdbd2cSJim Jagielski scopece = i_gate.Ces().Find_Ce(nScope);
308*b1cdbd2cSJim Jagielski
309*b1cdbd2cSJim Jagielski // Else search for declaration in own class and then in base classes.
310*b1cdbd2cSJim Jagielski // These would be of higher priority than those in parent namespaces.
311*b1cdbd2cSJim Jagielski Ce_id
312*b1cdbd2cSJim Jagielski foundce = RecursiveSearchCe_InBaseClassesOf(
313*b1cdbd2cSJim Jagielski scopece, qualification, name, i_gate);
314*b1cdbd2cSJim Jagielski if (foundce.IsValid())
315*b1cdbd2cSJim Jagielski nRelatedCe = foundce;
316*b1cdbd2cSJim Jagielski
317*b1cdbd2cSJim Jagielski if ( nRelatedCe.IsValid() AND IsInternal(i_gate.Ces().Find_Ce(nRelatedCe)) )
318*b1cdbd2cSJim Jagielski {
319*b1cdbd2cSJim Jagielski nRelatedCe = Ce_id(0);
320*b1cdbd2cSJim Jagielski }
321*b1cdbd2cSJim Jagielski }
322*b1cdbd2cSJim Jagielski
323*b1cdbd2cSJim Jagielski bool
IsBuiltInType() const324*b1cdbd2cSJim Jagielski UsedType::IsBuiltInType() const
325*b1cdbd2cSJim Jagielski {
326*b1cdbd2cSJim Jagielski return bRefers2BuiltInType
327*b1cdbd2cSJim Jagielski AND aPtrLevels.size() == 0
328*b1cdbd2cSJim Jagielski AND NOT bIsReference
329*b1cdbd2cSJim Jagielski AND eConVol_Type == ary::cpp::CONVOL_none;
330*b1cdbd2cSJim Jagielski }
331*b1cdbd2cSJim Jagielski
332*b1cdbd2cSJim Jagielski const String &
LocalName() const333*b1cdbd2cSJim Jagielski UsedType::LocalName() const
334*b1cdbd2cSJim Jagielski {
335*b1cdbd2cSJim Jagielski return aPath.LastSegment();
336*b1cdbd2cSJim Jagielski }
337*b1cdbd2cSJim Jagielski
338*b1cdbd2cSJim Jagielski E_TypeSpecialisation
TypeSpecialisation() const339*b1cdbd2cSJim Jagielski UsedType::TypeSpecialisation() const
340*b1cdbd2cSJim Jagielski {
341*b1cdbd2cSJim Jagielski return eTypeSpecialisation;
342*b1cdbd2cSJim Jagielski }
343*b1cdbd2cSJim Jagielski
344*b1cdbd2cSJim Jagielski void
do_Accept(csv::ProcessorIfc & io_processor) const345*b1cdbd2cSJim Jagielski UsedType::do_Accept(csv::ProcessorIfc & io_processor) const
346*b1cdbd2cSJim Jagielski {
347*b1cdbd2cSJim Jagielski csv::CheckedCall(io_processor,*this);
348*b1cdbd2cSJim Jagielski }
349*b1cdbd2cSJim Jagielski
350*b1cdbd2cSJim Jagielski ary::ClassId
get_AryClass() const351*b1cdbd2cSJim Jagielski UsedType::get_AryClass() const
352*b1cdbd2cSJim Jagielski {
353*b1cdbd2cSJim Jagielski return class_id;
354*b1cdbd2cSJim Jagielski }
355*b1cdbd2cSJim Jagielski
356*b1cdbd2cSJim Jagielski Rid
inq_RelatedCe() const357*b1cdbd2cSJim Jagielski UsedType::inq_RelatedCe() const
358*b1cdbd2cSJim Jagielski {
359*b1cdbd2cSJim Jagielski return nRelatedCe.Value();
360*b1cdbd2cSJim Jagielski }
361*b1cdbd2cSJim Jagielski
362*b1cdbd2cSJim Jagielski bool
inq_IsConst() const363*b1cdbd2cSJim Jagielski UsedType::inq_IsConst() const
364*b1cdbd2cSJim Jagielski {
365*b1cdbd2cSJim Jagielski if ( is_const(eConVol_Type) )
366*b1cdbd2cSJim Jagielski return true;
367*b1cdbd2cSJim Jagielski for ( PtrLevelVector::const_iterator it = aPtrLevels.begin();
368*b1cdbd2cSJim Jagielski it != aPtrLevels.end();
369*b1cdbd2cSJim Jagielski ++it )
370*b1cdbd2cSJim Jagielski {
371*b1cdbd2cSJim Jagielski if ( is_const(*it) )
372*b1cdbd2cSJim Jagielski return true;
373*b1cdbd2cSJim Jagielski }
374*b1cdbd2cSJim Jagielski
375*b1cdbd2cSJim Jagielski return false;
376*b1cdbd2cSJim Jagielski }
377*b1cdbd2cSJim Jagielski
378*b1cdbd2cSJim Jagielski void
inq_Get_Text(StreamStr & o_rPreName,StreamStr & o_rName,StreamStr & o_rPostName,const Gate & i_rGate) const379*b1cdbd2cSJim Jagielski UsedType::inq_Get_Text( StreamStr & o_rPreName,
380*b1cdbd2cSJim Jagielski StreamStr & o_rName,
381*b1cdbd2cSJim Jagielski StreamStr & o_rPostName,
382*b1cdbd2cSJim Jagielski const Gate & i_rGate ) const
383*b1cdbd2cSJim Jagielski {
384*b1cdbd2cSJim Jagielski if ( is_const(eConVol_Type) )
385*b1cdbd2cSJim Jagielski o_rPreName << "const ";
386*b1cdbd2cSJim Jagielski if ( is_volatile(eConVol_Type) )
387*b1cdbd2cSJim Jagielski o_rPreName << "volatile ";
388*b1cdbd2cSJim Jagielski if ( bIsAbsolute )
389*b1cdbd2cSJim Jagielski o_rPreName << "::";
390*b1cdbd2cSJim Jagielski
391*b1cdbd2cSJim Jagielski aPath.Get_Text( o_rPreName, o_rName, o_rPostName, i_rGate );
392*b1cdbd2cSJim Jagielski
393*b1cdbd2cSJim Jagielski for ( PtrLevelVector::const_iterator it = aPtrLevels.begin();
394*b1cdbd2cSJim Jagielski it != aPtrLevels.end();
395*b1cdbd2cSJim Jagielski ++it )
396*b1cdbd2cSJim Jagielski {
397*b1cdbd2cSJim Jagielski o_rPostName << " *";
398*b1cdbd2cSJim Jagielski if ( is_const(*it) )
399*b1cdbd2cSJim Jagielski o_rPostName << " const";
400*b1cdbd2cSJim Jagielski if ( is_volatile(*it) )
401*b1cdbd2cSJim Jagielski o_rPostName << " volatile";
402*b1cdbd2cSJim Jagielski }
403*b1cdbd2cSJim Jagielski if ( bIsReference )
404*b1cdbd2cSJim Jagielski o_rPostName << " &";
405*b1cdbd2cSJim Jagielski }
406*b1cdbd2cSJim Jagielski
407*b1cdbd2cSJim Jagielski Ce_id
RecursiveSearchCe_InBaseClassesOf(const CodeEntity & i_mayBeClass,const StringVector & i_myQualification,const String & i_myName,const Gate & i_gate) const408*b1cdbd2cSJim Jagielski UsedType::RecursiveSearchCe_InBaseClassesOf( const CodeEntity & i_mayBeClass,
409*b1cdbd2cSJim Jagielski const StringVector & i_myQualification,
410*b1cdbd2cSJim Jagielski const String & i_myName,
411*b1cdbd2cSJim Jagielski const Gate & i_gate ) const
412*b1cdbd2cSJim Jagielski {
413*b1cdbd2cSJim Jagielski // Find in this class?
414*b1cdbd2cSJim Jagielski const CeNode *
415*b1cdbd2cSJim Jagielski basenode = CeNode_Traits::NodeOf_(i_mayBeClass);
416*b1cdbd2cSJim Jagielski if (basenode == 0)
417*b1cdbd2cSJim Jagielski return Ce_id(0);
418*b1cdbd2cSJim Jagielski Ce_id
419*b1cdbd2cSJim Jagielski found = CheckForRelatedCe_inNode(*basenode, i_myQualification, i_myName);
420*b1cdbd2cSJim Jagielski if (found.IsValid())
421*b1cdbd2cSJim Jagielski return found;
422*b1cdbd2cSJim Jagielski
423*b1cdbd2cSJim Jagielski
424*b1cdbd2cSJim Jagielski const Class *
425*b1cdbd2cSJim Jagielski cl = ary_cast<Class>(&i_mayBeClass);
426*b1cdbd2cSJim Jagielski if (cl == 0)
427*b1cdbd2cSJim Jagielski return Ce_id(0);
428*b1cdbd2cSJim Jagielski
429*b1cdbd2cSJim Jagielski for ( List_Bases::const_iterator it = cl->BaseClasses().begin();
430*b1cdbd2cSJim Jagielski it != cl->BaseClasses().end();
431*b1cdbd2cSJim Jagielski ++it )
432*b1cdbd2cSJim Jagielski {
433*b1cdbd2cSJim Jagielski csv_assert((*it).nId.IsValid());
434*b1cdbd2cSJim Jagielski Ce_id
435*b1cdbd2cSJim Jagielski base = i_gate.Types().Find_Type((*it).nId).RelatedCe();
436*b1cdbd2cSJim Jagielski while (base.IsValid() AND is_type<Typedef>(i_gate.Ces().Find_Ce(base)) )
437*b1cdbd2cSJim Jagielski {
438*b1cdbd2cSJim Jagielski base = i_gate.Types().Find_Type(
439*b1cdbd2cSJim Jagielski ary_cast<Typedef>(i_gate.Ces().Find_Ce(base))
440*b1cdbd2cSJim Jagielski .DescribingType() )
441*b1cdbd2cSJim Jagielski .RelatedCe();
442*b1cdbd2cSJim Jagielski }
443*b1cdbd2cSJim Jagielski
444*b1cdbd2cSJim Jagielski if (base.IsValid())
445*b1cdbd2cSJim Jagielski {
446*b1cdbd2cSJim Jagielski const CodeEntity &
447*b1cdbd2cSJim Jagielski basece = i_gate.Ces().Find_Ce(base);
448*b1cdbd2cSJim Jagielski found = RecursiveSearchCe_InBaseClassesOf(
449*b1cdbd2cSJim Jagielski basece, i_myQualification, i_myName, i_gate);
450*b1cdbd2cSJim Jagielski if (found.IsValid())
451*b1cdbd2cSJim Jagielski return found;
452*b1cdbd2cSJim Jagielski }
453*b1cdbd2cSJim Jagielski } // end for
454*b1cdbd2cSJim Jagielski
455*b1cdbd2cSJim Jagielski return Ce_id(0);
456*b1cdbd2cSJim Jagielski }
457*b1cdbd2cSJim Jagielski
458*b1cdbd2cSJim Jagielski
459*b1cdbd2cSJim Jagielski void
Get_NameParts(StringVector & o_qualification,String & o_name)460*b1cdbd2cSJim Jagielski UsedType::Get_NameParts( StringVector & o_qualification,
461*b1cdbd2cSJim Jagielski String & o_name )
462*b1cdbd2cSJim Jagielski {
463*b1cdbd2cSJim Jagielski nc_iter nit = aPath.begin();
464*b1cdbd2cSJim Jagielski nc_iter nit_end = aPath.end();
465*b1cdbd2cSJim Jagielski csv_assert(nit != nit_end); // Each UsedType has to have a local name.
466*b1cdbd2cSJim Jagielski
467*b1cdbd2cSJim Jagielski --nit_end;
468*b1cdbd2cSJim Jagielski o_name = (*nit_end).Name();
469*b1cdbd2cSJim Jagielski for ( ;
470*b1cdbd2cSJim Jagielski nit != nit_end;
471*b1cdbd2cSJim Jagielski ++nit )
472*b1cdbd2cSJim Jagielski {
473*b1cdbd2cSJim Jagielski o_qualification.push_back( (*nit).Name() );
474*b1cdbd2cSJim Jagielski }
475*b1cdbd2cSJim Jagielski }
476*b1cdbd2cSJim Jagielski
477*b1cdbd2cSJim Jagielski Ce_id
CheckForRelatedCe_inNode(const CeNode & i_node,const StringVector & i_qualification,const String & i_name)478*b1cdbd2cSJim Jagielski CheckForRelatedCe_inNode( const CeNode & i_node,
479*b1cdbd2cSJim Jagielski const StringVector & i_qualification,
480*b1cdbd2cSJim Jagielski const String & i_name )
481*b1cdbd2cSJim Jagielski {
482*b1cdbd2cSJim Jagielski if (i_qualification.size() > 0)
483*b1cdbd2cSJim Jagielski {
484*b1cdbd2cSJim Jagielski Ce_id
485*b1cdbd2cSJim Jagielski ret(0);
486*b1cdbd2cSJim Jagielski i_node.SearchBelow( ret,
487*b1cdbd2cSJim Jagielski i_qualification.begin(),
488*b1cdbd2cSJim Jagielski i_qualification.end(),
489*b1cdbd2cSJim Jagielski i_name );
490*b1cdbd2cSJim Jagielski return ret;
491*b1cdbd2cSJim Jagielski }
492*b1cdbd2cSJim Jagielski else
493*b1cdbd2cSJim Jagielski {
494*b1cdbd2cSJim Jagielski return i_node.Search(i_name);
495*b1cdbd2cSJim Jagielski }
496*b1cdbd2cSJim Jagielski }
497*b1cdbd2cSJim Jagielski
498*b1cdbd2cSJim Jagielski
499*b1cdbd2cSJim Jagielski namespace ut
500*b1cdbd2cSJim Jagielski {
501*b1cdbd2cSJim Jagielski
List_TplParameter()502*b1cdbd2cSJim Jagielski List_TplParameter::List_TplParameter()
503*b1cdbd2cSJim Jagielski : aTplParameters()
504*b1cdbd2cSJim Jagielski {
505*b1cdbd2cSJim Jagielski }
506*b1cdbd2cSJim Jagielski
~List_TplParameter()507*b1cdbd2cSJim Jagielski List_TplParameter::~List_TplParameter()
508*b1cdbd2cSJim Jagielski {
509*b1cdbd2cSJim Jagielski csv::erase_container_of_heap_ptrs(aTplParameters);
510*b1cdbd2cSJim Jagielski }
511*b1cdbd2cSJim Jagielski
512*b1cdbd2cSJim Jagielski void
AddParam_Type(Type_id i_nType)513*b1cdbd2cSJim Jagielski List_TplParameter::AddParam_Type( Type_id i_nType )
514*b1cdbd2cSJim Jagielski {
515*b1cdbd2cSJim Jagielski aTplParameters.push_back( new TplParameter_Type(i_nType) );
516*b1cdbd2cSJim Jagielski }
517*b1cdbd2cSJim Jagielski
518*b1cdbd2cSJim Jagielski void
Get_Text(StreamStr & o_rOut,const ary::cpp::Gate & i_rGate) const519*b1cdbd2cSJim Jagielski List_TplParameter::Get_Text( StreamStr & o_rOut,
520*b1cdbd2cSJim Jagielski const ary::cpp::Gate & i_rGate ) const
521*b1cdbd2cSJim Jagielski {
522*b1cdbd2cSJim Jagielski Vector_TplArgument::const_iterator it = aTplParameters.begin();
523*b1cdbd2cSJim Jagielski Vector_TplArgument::const_iterator itEnd = aTplParameters.end();
524*b1cdbd2cSJim Jagielski
525*b1cdbd2cSJim Jagielski if ( it == itEnd )
526*b1cdbd2cSJim Jagielski {
527*b1cdbd2cSJim Jagielski o_rOut << "<>";
528*b1cdbd2cSJim Jagielski return;
529*b1cdbd2cSJim Jagielski }
530*b1cdbd2cSJim Jagielski
531*b1cdbd2cSJim Jagielski o_rOut << "< ";
532*b1cdbd2cSJim Jagielski
533*b1cdbd2cSJim Jagielski (*it)->Get_Text( o_rOut, i_rGate );
534*b1cdbd2cSJim Jagielski
535*b1cdbd2cSJim Jagielski for ( ++it; it != itEnd; ++it )
536*b1cdbd2cSJim Jagielski {
537*b1cdbd2cSJim Jagielski o_rOut << ", ";
538*b1cdbd2cSJim Jagielski (*it)->Get_Text( o_rOut, i_rGate );
539*b1cdbd2cSJim Jagielski }
540*b1cdbd2cSJim Jagielski
541*b1cdbd2cSJim Jagielski o_rOut << " >";
542*b1cdbd2cSJim Jagielski }
543*b1cdbd2cSJim Jagielski
544*b1cdbd2cSJim Jagielski intt
Compare(const List_TplParameter & i_rOther) const545*b1cdbd2cSJim Jagielski List_TplParameter::Compare( const List_TplParameter & i_rOther ) const
546*b1cdbd2cSJim Jagielski {
547*b1cdbd2cSJim Jagielski intt nResult = intt(aTplParameters.size()) - intt(i_rOther.aTplParameters.size());
548*b1cdbd2cSJim Jagielski
549*b1cdbd2cSJim Jagielski if (nResult != 0)
550*b1cdbd2cSJim Jagielski return nResult;
551*b1cdbd2cSJim Jagielski
552*b1cdbd2cSJim Jagielski Vector_TplArgument::const_iterator it1 = aTplParameters.begin();
553*b1cdbd2cSJim Jagielski Vector_TplArgument::const_iterator it1End = aTplParameters.end();
554*b1cdbd2cSJim Jagielski Vector_TplArgument::const_iterator it2 = i_rOther.aTplParameters.begin();
555*b1cdbd2cSJim Jagielski
556*b1cdbd2cSJim Jagielski for ( ; it1 != it1End; ++it1, ++it2 )
557*b1cdbd2cSJim Jagielski {
558*b1cdbd2cSJim Jagielski nResult = (*it1)->Compare( *(*it2) );
559*b1cdbd2cSJim Jagielski if (nResult != 0)
560*b1cdbd2cSJim Jagielski return nResult;
561*b1cdbd2cSJim Jagielski }
562*b1cdbd2cSJim Jagielski
563*b1cdbd2cSJim Jagielski return 0;
564*b1cdbd2cSJim Jagielski }
565*b1cdbd2cSJim Jagielski
566*b1cdbd2cSJim Jagielski
567*b1cdbd2cSJim Jagielski } // namespace ut
568*b1cdbd2cSJim Jagielski } // namespace cpp
569*b1cdbd2cSJim Jagielski } // namespace ary
570