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