1 /**************************************************************
2 *
3 * Licensed to the Apache Software Foundation (ASF) under one
4 * or more contributor license agreements. See the NOTICE file
5 * distributed with this work for additional information
6 * regarding copyright ownership. The ASF licenses this file
7 * to you under the Apache License, Version 2.0 (the
8 * "License"); you may not use this file except in compliance
9 * with the License. You may obtain a copy of the License at
10 *
11 * http://www.apache.org/licenses/LICENSE-2.0
12 *
13 * Unless required by applicable law or agreed to in writing,
14 * software distributed under the License is distributed on an
15 * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
16 * KIND, either express or implied. See the License for the
17 * specific language governing permissions and limitations
18 * under the License.
19 *
20 *************************************************************/
21
22 #include <precomp.h>
23 #include <ary/cpp/namechain.hxx>
24
25
26 // NOT FULLY DEFINED SERVICES
27 #include <ary/cpp/usedtype.hxx>
28 #include <ary/cpp/c_gate.hxx>
29 #include "tplparam.hxx"
30
31
32
33 namespace ary
34 {
35 namespace cpp
36 {
37 namespace ut
38 {
39
40
41 //********************* NameSegment ******************//
42
NameSegment(const char * i_sName)43 NameSegment::NameSegment( const char * i_sName )
44 : sName( i_sName )
45 // pTemplate
46 {
47 }
48
NameSegment(const NameSegment & i_rSeg)49 NameSegment::NameSegment( const NameSegment & i_rSeg )
50 : sName(i_rSeg.sName)
51 // pTemplate
52 {
53 // KORR_FUTURE : Handling of copying of templates.
54 // csv_assert( NOT i_rSeg.pTemplate );
55 }
56
operator =(const NameSegment & i_rSeg)57 NameSegment& NameSegment::operator=(const NameSegment & i_rSeg)
58 {
59 sName = i_rSeg.sName;
60 return *this;
61 }
62
~NameSegment()63 NameSegment::~NameSegment()
64 {
65 }
66
67 List_TplParameter &
AddTemplate()68 NameSegment::AddTemplate()
69 {
70 return * (pTemplate = new List_TplParameter);
71 }
72
73 intt
Compare(const NameSegment & i_rOther) const74 NameSegment::Compare( const NameSegment & i_rOther ) const
75 {
76 intt nResult = strcmp( sName.c_str(), i_rOther.sName.c_str() );
77 if (nResult != 0)
78 return nResult;
79 if ( bool(pTemplate) != bool(i_rOther.pTemplate) )
80 {
81 if ( NOT pTemplate )
82 return -1;
83 else
84 return +1;
85 }
86 else if ( NOT pTemplate )
87 return 0;
88 else
89 return pTemplate->Compare( *i_rOther.pTemplate );
90 }
91
92 void
Get_Text_AsScope(StreamStr & o_rOut,const Gate & i_rGate) const93 NameSegment::Get_Text_AsScope( StreamStr & o_rOut,
94 const Gate & i_rGate ) const
95 {
96 o_rOut << sName;
97 if ( pTemplate )
98 pTemplate->Get_Text( o_rOut, i_rGate );
99 }
100
101 void
Get_Text_AsMainType(StreamStr & o_rName,StreamStr & o_rPostName,const Gate & i_rGate) const102 NameSegment::Get_Text_AsMainType( StreamStr & o_rName,
103 StreamStr & o_rPostName,
104 const Gate & i_rGate ) const
105 {
106 o_rName << sName;
107 if ( pTemplate )
108 pTemplate->Get_Text( o_rPostName, i_rGate );
109 }
110
111
112 //********************* NameChain ******************//
113
NameChain()114 NameChain::NameChain()
115 // : aSegments
116 {
117 }
118
~NameChain()119 NameChain::~NameChain()
120 {
121 }
122
123 void
Add_Segment(const char * i_sSeg)124 NameChain::Add_Segment( const char * i_sSeg )
125 {
126 aSegments.push_back( NameSegment(i_sSeg) );
127 }
128
129 List_TplParameter &
Templatize_LastSegment()130 NameChain::Templatize_LastSegment()
131 {
132 csv_assert( ! aSegments.empty() );
133
134 return aSegments.back().AddTemplate();
135 }
136
137 intt
Compare(const NameChain & i_rChain) const138 NameChain::Compare( const NameChain & i_rChain ) const
139 {
140 intt nResult = intt(aSegments.size()) - intt(i_rChain.aSegments.size());
141 if (nResult != 0)
142 return nResult;
143
144 std::vector< NameSegment >::const_iterator it1 = aSegments.begin();
145 std::vector< NameSegment >::const_iterator it1End = aSegments.end();
146 std::vector< NameSegment >::const_iterator it2 = i_rChain.aSegments.begin();
147
148 for ( ; it1 != it1End; ++it1, ++it2 )
149 {
150 nResult = (*it1).Compare(*it2);
151 if (nResult != 0)
152 return nResult;
153 }
154
155 return 0;
156 }
157
158 const String &
LastSegment() const159 NameChain::LastSegment() const
160 {
161 if ( ! aSegments.empty() )
162 return aSegments.back().Name();
163 return String::Null_();
164 }
165
166 void
Get_Text(StreamStr & o_rPreName,StreamStr & o_rName,StreamStr & o_rPostName,const Gate & i_rGate) const167 NameChain::Get_Text( StreamStr & o_rPreName,
168 StreamStr & o_rName,
169 StreamStr & o_rPostName,
170 const Gate & i_rGate ) const
171 {
172 std::vector< NameSegment >::const_iterator it = aSegments.begin();
173 std::vector< NameSegment >::const_iterator itEnd = aSegments.end();
174
175 if ( it == itEnd )
176 return;
177
178 for ( --itEnd; it != itEnd; ++it )
179 {
180 (*it).Get_Text_AsScope( o_rPreName, i_rGate );
181 o_rPreName << "::";
182 }
183 (*it).Get_Text_AsMainType( o_rName, o_rPostName, i_rGate );
184 }
185
186
187
188 } // namespace ut
189 } // namespace cpp
190 } // namespace ary
191