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/namechain.hxx>
24*b1cdbd2cSJim Jagielski 
25*b1cdbd2cSJim Jagielski 
26*b1cdbd2cSJim Jagielski // NOT FULLY DEFINED SERVICES
27*b1cdbd2cSJim Jagielski #include <ary/cpp/usedtype.hxx>
28*b1cdbd2cSJim Jagielski #include <ary/cpp/c_gate.hxx>
29*b1cdbd2cSJim Jagielski #include "tplparam.hxx"
30*b1cdbd2cSJim Jagielski 
31*b1cdbd2cSJim Jagielski 
32*b1cdbd2cSJim Jagielski 
33*b1cdbd2cSJim Jagielski namespace ary
34*b1cdbd2cSJim Jagielski {
35*b1cdbd2cSJim Jagielski namespace cpp
36*b1cdbd2cSJim Jagielski {
37*b1cdbd2cSJim Jagielski namespace ut
38*b1cdbd2cSJim Jagielski {
39*b1cdbd2cSJim Jagielski 
40*b1cdbd2cSJim Jagielski 
41*b1cdbd2cSJim Jagielski //*********************		NameSegment		******************//
42*b1cdbd2cSJim Jagielski 
NameSegment(const char * i_sName)43*b1cdbd2cSJim Jagielski NameSegment::NameSegment( const char * i_sName )
44*b1cdbd2cSJim Jagielski 	:	sName( i_sName )
45*b1cdbd2cSJim Jagielski 		// pTemplate
46*b1cdbd2cSJim Jagielski {
47*b1cdbd2cSJim Jagielski }
48*b1cdbd2cSJim Jagielski 
NameSegment(const NameSegment & i_rSeg)49*b1cdbd2cSJim Jagielski NameSegment::NameSegment( const NameSegment & i_rSeg )
50*b1cdbd2cSJim Jagielski 	:	sName(i_rSeg.sName)
51*b1cdbd2cSJim Jagielski 		// pTemplate
52*b1cdbd2cSJim Jagielski {
53*b1cdbd2cSJim Jagielski     // KORR_FUTURE :   Handling of copying of templates.
54*b1cdbd2cSJim Jagielski //	csv_assert( NOT i_rSeg.pTemplate );
55*b1cdbd2cSJim Jagielski }
56*b1cdbd2cSJim Jagielski 
operator =(const NameSegment & i_rSeg)57*b1cdbd2cSJim Jagielski NameSegment& NameSegment::operator=(const NameSegment & i_rSeg)
58*b1cdbd2cSJim Jagielski {
59*b1cdbd2cSJim Jagielski 	sName = i_rSeg.sName;
60*b1cdbd2cSJim Jagielski 	return *this;
61*b1cdbd2cSJim Jagielski }
62*b1cdbd2cSJim Jagielski 
~NameSegment()63*b1cdbd2cSJim Jagielski NameSegment::~NameSegment()
64*b1cdbd2cSJim Jagielski {
65*b1cdbd2cSJim Jagielski }
66*b1cdbd2cSJim Jagielski 
67*b1cdbd2cSJim Jagielski List_TplParameter &
AddTemplate()68*b1cdbd2cSJim Jagielski NameSegment::AddTemplate()
69*b1cdbd2cSJim Jagielski {
70*b1cdbd2cSJim Jagielski 	return * (pTemplate = new List_TplParameter);
71*b1cdbd2cSJim Jagielski }
72*b1cdbd2cSJim Jagielski 
73*b1cdbd2cSJim Jagielski intt
Compare(const NameSegment & i_rOther) const74*b1cdbd2cSJim Jagielski NameSegment::Compare( const NameSegment & i_rOther ) const
75*b1cdbd2cSJim Jagielski {
76*b1cdbd2cSJim Jagielski 	intt nResult = strcmp( sName.c_str(), i_rOther.sName.c_str() );
77*b1cdbd2cSJim Jagielski 	if (nResult != 0)
78*b1cdbd2cSJim Jagielski 		return nResult;
79*b1cdbd2cSJim Jagielski 	if ( bool(pTemplate) != bool(i_rOther.pTemplate) )
80*b1cdbd2cSJim Jagielski 	{
81*b1cdbd2cSJim Jagielski 		if ( NOT pTemplate )
82*b1cdbd2cSJim Jagielski 			return -1;
83*b1cdbd2cSJim Jagielski 		else
84*b1cdbd2cSJim Jagielski 			return +1;
85*b1cdbd2cSJim Jagielski 	}
86*b1cdbd2cSJim Jagielski 	else if ( NOT pTemplate )
87*b1cdbd2cSJim Jagielski 		return 0;
88*b1cdbd2cSJim Jagielski 	else
89*b1cdbd2cSJim Jagielski 		return pTemplate->Compare( *i_rOther.pTemplate );
90*b1cdbd2cSJim Jagielski }
91*b1cdbd2cSJim Jagielski 
92*b1cdbd2cSJim Jagielski void
Get_Text_AsScope(StreamStr & o_rOut,const Gate & i_rGate) const93*b1cdbd2cSJim Jagielski NameSegment::Get_Text_AsScope( StreamStr &   o_rOut,
94*b1cdbd2cSJim Jagielski 						       const Gate &  i_rGate ) const
95*b1cdbd2cSJim Jagielski {
96*b1cdbd2cSJim Jagielski 	o_rOut << sName;
97*b1cdbd2cSJim Jagielski 	if ( pTemplate )
98*b1cdbd2cSJim Jagielski 		pTemplate->Get_Text( o_rOut, i_rGate );
99*b1cdbd2cSJim Jagielski }
100*b1cdbd2cSJim Jagielski 
101*b1cdbd2cSJim Jagielski void
Get_Text_AsMainType(StreamStr & o_rName,StreamStr & o_rPostName,const Gate & i_rGate) const102*b1cdbd2cSJim Jagielski NameSegment::Get_Text_AsMainType( StreamStr &   o_rName,
103*b1cdbd2cSJim Jagielski 						          StreamStr &   o_rPostName,
104*b1cdbd2cSJim Jagielski 						          const Gate &  i_rGate ) const
105*b1cdbd2cSJim Jagielski {
106*b1cdbd2cSJim Jagielski 	o_rName << sName;
107*b1cdbd2cSJim Jagielski 	if ( pTemplate )
108*b1cdbd2cSJim Jagielski 		pTemplate->Get_Text( o_rPostName, i_rGate );
109*b1cdbd2cSJim Jagielski }
110*b1cdbd2cSJim Jagielski 
111*b1cdbd2cSJim Jagielski 
112*b1cdbd2cSJim Jagielski //*********************		NameChain     ******************//
113*b1cdbd2cSJim Jagielski 
NameChain()114*b1cdbd2cSJim Jagielski NameChain::NameChain()
115*b1cdbd2cSJim Jagielski //  :   aSegments
116*b1cdbd2cSJim Jagielski {
117*b1cdbd2cSJim Jagielski }
118*b1cdbd2cSJim Jagielski 
~NameChain()119*b1cdbd2cSJim Jagielski NameChain::~NameChain()
120*b1cdbd2cSJim Jagielski {
121*b1cdbd2cSJim Jagielski }
122*b1cdbd2cSJim Jagielski 
123*b1cdbd2cSJim Jagielski void
Add_Segment(const char * i_sSeg)124*b1cdbd2cSJim Jagielski NameChain::Add_Segment( const char * i_sSeg )
125*b1cdbd2cSJim Jagielski {
126*b1cdbd2cSJim Jagielski 	aSegments.push_back( NameSegment(i_sSeg) );
127*b1cdbd2cSJim Jagielski }
128*b1cdbd2cSJim Jagielski 
129*b1cdbd2cSJim Jagielski List_TplParameter &
Templatize_LastSegment()130*b1cdbd2cSJim Jagielski NameChain::Templatize_LastSegment()
131*b1cdbd2cSJim Jagielski {
132*b1cdbd2cSJim Jagielski 	csv_assert( ! aSegments.empty() );
133*b1cdbd2cSJim Jagielski 
134*b1cdbd2cSJim Jagielski 	return aSegments.back().AddTemplate();
135*b1cdbd2cSJim Jagielski }
136*b1cdbd2cSJim Jagielski 
137*b1cdbd2cSJim Jagielski intt
Compare(const NameChain & i_rChain) const138*b1cdbd2cSJim Jagielski NameChain::Compare( const NameChain & i_rChain ) const
139*b1cdbd2cSJim Jagielski {
140*b1cdbd2cSJim Jagielski 	intt nResult = intt(aSegments.size()) - intt(i_rChain.aSegments.size());
141*b1cdbd2cSJim Jagielski 	if (nResult != 0)
142*b1cdbd2cSJim Jagielski 		return nResult;
143*b1cdbd2cSJim Jagielski 
144*b1cdbd2cSJim Jagielski 	std::vector< NameSegment >::const_iterator it1 = aSegments.begin();
145*b1cdbd2cSJim Jagielski 	std::vector< NameSegment >::const_iterator it1End = aSegments.end();
146*b1cdbd2cSJim Jagielski 	std::vector< NameSegment >::const_iterator it2 = i_rChain.aSegments.begin();
147*b1cdbd2cSJim Jagielski 
148*b1cdbd2cSJim Jagielski 	for ( ; it1 != it1End; ++it1, ++it2 )
149*b1cdbd2cSJim Jagielski 	{
150*b1cdbd2cSJim Jagielski 		nResult = (*it1).Compare(*it2);
151*b1cdbd2cSJim Jagielski 		if (nResult != 0)
152*b1cdbd2cSJim Jagielski 			return nResult;
153*b1cdbd2cSJim Jagielski 	}
154*b1cdbd2cSJim Jagielski 
155*b1cdbd2cSJim Jagielski 	return 0;
156*b1cdbd2cSJim Jagielski }
157*b1cdbd2cSJim Jagielski 
158*b1cdbd2cSJim Jagielski const String  &
LastSegment() const159*b1cdbd2cSJim Jagielski NameChain::LastSegment() const
160*b1cdbd2cSJim Jagielski {
161*b1cdbd2cSJim Jagielski 	if ( ! aSegments.empty() )
162*b1cdbd2cSJim Jagielski 		return aSegments.back().Name();
163*b1cdbd2cSJim Jagielski 	return String::Null_();
164*b1cdbd2cSJim Jagielski }
165*b1cdbd2cSJim Jagielski 
166*b1cdbd2cSJim Jagielski void
Get_Text(StreamStr & o_rPreName,StreamStr & o_rName,StreamStr & o_rPostName,const Gate & i_rGate) const167*b1cdbd2cSJim Jagielski NameChain::Get_Text( StreamStr &    o_rPreName,
168*b1cdbd2cSJim Jagielski 					 StreamStr &    o_rName,
169*b1cdbd2cSJim Jagielski 					 StreamStr &    o_rPostName,
170*b1cdbd2cSJim Jagielski 					 const Gate &   i_rGate ) const
171*b1cdbd2cSJim Jagielski {
172*b1cdbd2cSJim Jagielski 	std::vector< NameSegment >::const_iterator it = aSegments.begin();
173*b1cdbd2cSJim Jagielski 	std::vector< NameSegment >::const_iterator itEnd = aSegments.end();
174*b1cdbd2cSJim Jagielski 
175*b1cdbd2cSJim Jagielski 	if ( it == itEnd )
176*b1cdbd2cSJim Jagielski 		return;
177*b1cdbd2cSJim Jagielski 
178*b1cdbd2cSJim Jagielski 	for ( --itEnd; it != itEnd; ++it )
179*b1cdbd2cSJim Jagielski 	{
180*b1cdbd2cSJim Jagielski 		(*it).Get_Text_AsScope( o_rPreName, i_rGate );
181*b1cdbd2cSJim Jagielski 		o_rPreName << "::";
182*b1cdbd2cSJim Jagielski 	}
183*b1cdbd2cSJim Jagielski 	(*it).Get_Text_AsMainType( o_rName, o_rPostName, i_rGate );
184*b1cdbd2cSJim Jagielski }
185*b1cdbd2cSJim Jagielski 
186*b1cdbd2cSJim Jagielski 
187*b1cdbd2cSJim Jagielski 
188*b1cdbd2cSJim Jagielski }   // namespace ut
189*b1cdbd2cSJim Jagielski }   // namespace cpp
190*b1cdbd2cSJim Jagielski }   // namespace ary
191