xref: /aoo4110/main/autodoc/source/ary/cpp/usedtype.cxx (revision b1cdbd2c)
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