1*d291ea28SAndrew Rist /**************************************************************
2cdf0e10cSrcweir  *
3*d291ea28SAndrew Rist  * Licensed to the Apache Software Foundation (ASF) under one
4*d291ea28SAndrew Rist  * or more contributor license agreements.  See the NOTICE file
5*d291ea28SAndrew Rist  * distributed with this work for additional information
6*d291ea28SAndrew Rist  * regarding copyright ownership.  The ASF licenses this file
7*d291ea28SAndrew Rist  * to you under the Apache License, Version 2.0 (the
8*d291ea28SAndrew Rist  * "License"); you may not use this file except in compliance
9*d291ea28SAndrew Rist  * with the License.  You may obtain a copy of the License at
10*d291ea28SAndrew Rist  *
11*d291ea28SAndrew Rist  *   http://www.apache.org/licenses/LICENSE-2.0
12*d291ea28SAndrew Rist  *
13*d291ea28SAndrew Rist  * Unless required by applicable law or agreed to in writing,
14*d291ea28SAndrew Rist  * software distributed under the License is distributed on an
15*d291ea28SAndrew Rist  * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
16*d291ea28SAndrew Rist  * KIND, either express or implied.  See the License for the
17*d291ea28SAndrew Rist  * specific language governing permissions and limitations
18*d291ea28SAndrew Rist  * under the License.
19*d291ea28SAndrew Rist  *
20*d291ea28SAndrew Rist  *************************************************************/
21cdf0e10cSrcweir 
22cdf0e10cSrcweir #include <precomp.h>
23cdf0e10cSrcweir #include "c_reposypart.hxx"
24cdf0e10cSrcweir 
25cdf0e10cSrcweir 
26cdf0e10cSrcweir // NOT FULLY DECLARED SERVICES
27cdf0e10cSrcweir #include <ary/getncast.hxx>
28cdf0e10cSrcweir #include <ary/namesort.hxx>
29cdf0e10cSrcweir #include <ary/cpp/c_builtintype.hxx>
30cdf0e10cSrcweir #include <ary/cpp/c_class.hxx>
31cdf0e10cSrcweir #include <ary/cpp/c_cppentity.hxx>
32cdf0e10cSrcweir #include <ary/cpp/c_define.hxx>
33cdf0e10cSrcweir #include <ary/cpp/c_enum.hxx>
34cdf0e10cSrcweir #include <ary/cpp/c_enuval.hxx>
35cdf0e10cSrcweir #include <ary/cpp/c_funct.hxx>
36cdf0e10cSrcweir #include <ary/cpp/c_macro.hxx>
37cdf0e10cSrcweir #include <ary/cpp/c_namesp.hxx>
38cdf0e10cSrcweir #include <ary/cpp/c_tydef.hxx>
39cdf0e10cSrcweir #include <ary/cpp/c_type.hxx>
40cdf0e10cSrcweir #include <ary/cpp/usedtype.hxx>
41cdf0e10cSrcweir #include <ary/cpp/c_vari.hxx>
42cdf0e10cSrcweir #include <ary/loc/locp_le.hxx>
43cdf0e10cSrcweir #include <ary/getncast.hxx>
44cdf0e10cSrcweir #include <loc_internalgate.hxx>
45cdf0e10cSrcweir #include <reposy.hxx>
46cdf0e10cSrcweir #include "ca_ce.hxx"
47cdf0e10cSrcweir #include "ca_def.hxx"
48cdf0e10cSrcweir #include "ca_type.hxx"
49cdf0e10cSrcweir #include "cs_ce.hxx"
50cdf0e10cSrcweir #include "cs_def.hxx"
51cdf0e10cSrcweir #include "cs_type.hxx"
52cdf0e10cSrcweir 
53cdf0e10cSrcweir 
54cdf0e10cSrcweir 
55cdf0e10cSrcweir namespace
56cdf0e10cSrcweir {
57cdf0e10cSrcweir 
58cdf0e10cSrcweir using ::ary::GlobalId;
59cdf0e10cSrcweir using ::ary::Rid;
60cdf0e10cSrcweir using namespace ::ary::cpp;
61cdf0e10cSrcweir 
62cdf0e10cSrcweir 
63cdf0e10cSrcweir inline bool
IsDefine(const GlobalId & i_id)64cdf0e10cSrcweir IsDefine( const GlobalId & i_id )
65cdf0e10cSrcweir {
66cdf0e10cSrcweir     return i_id.Class() == Define::class_id
67cdf0e10cSrcweir            OR
68cdf0e10cSrcweir            i_id.Class() == Macro::class_id;
69cdf0e10cSrcweir }
70cdf0e10cSrcweir 
71cdf0e10cSrcweir 
72cdf0e10cSrcweir /// Find Ces
73cdf0e10cSrcweir class TypeConnector
74cdf0e10cSrcweir {
75cdf0e10cSrcweir   public:
TypeConnector(Gate & i_gate)76cdf0e10cSrcweir                         TypeConnector(
77cdf0e10cSrcweir                             Gate &              i_gate )
78cdf0e10cSrcweir                             :   pGate(&i_gate) {}
~TypeConnector()79cdf0e10cSrcweir                         ~TypeConnector() {}
80cdf0e10cSrcweir 
81cdf0e10cSrcweir     void                operator()(
82cdf0e10cSrcweir                             Type &              io_rType ) const;
83cdf0e10cSrcweir   private:
84cdf0e10cSrcweir     // DATA
85cdf0e10cSrcweir     Gate *              pGate;
86cdf0e10cSrcweir };
87cdf0e10cSrcweir 
88cdf0e10cSrcweir /// Find Ces only known from base class name scope.
89cdf0e10cSrcweir class TypeConnector2ndTry
90cdf0e10cSrcweir {
91cdf0e10cSrcweir   public:
TypeConnector2ndTry(Gate & i_gate)92cdf0e10cSrcweir                         TypeConnector2ndTry(
93cdf0e10cSrcweir                             Gate &              i_gate )
94cdf0e10cSrcweir                             :   pGate(&i_gate) {}
~TypeConnector2ndTry()95cdf0e10cSrcweir                         ~TypeConnector2ndTry() {}
96cdf0e10cSrcweir 
97cdf0e10cSrcweir     void                operator()(
98cdf0e10cSrcweir                             Type &              io_rType ) const;
99cdf0e10cSrcweir   private:
100cdf0e10cSrcweir     // DATA
101cdf0e10cSrcweir     Gate *              pGate;
102cdf0e10cSrcweir };
103cdf0e10cSrcweir 
104cdf0e10cSrcweir /// Reconnect (in both directions) base-derived relations of classes.
105cdf0e10cSrcweir class HierarchyLinker
106cdf0e10cSrcweir {
107cdf0e10cSrcweir   public:
HierarchyLinker(Gate & i_gate)108cdf0e10cSrcweir                         HierarchyLinker(
109cdf0e10cSrcweir                             Gate &              i_gate )
110cdf0e10cSrcweir                             :   pGate(&i_gate) {}
111cdf0e10cSrcweir 
~HierarchyLinker()112cdf0e10cSrcweir                         ~HierarchyLinker() {}
113cdf0e10cSrcweir 
114cdf0e10cSrcweir     void                operator()(
115cdf0e10cSrcweir                             Class &             io_rCe ) const;
116cdf0e10cSrcweir   private:
117cdf0e10cSrcweir     // DATA
118cdf0e10cSrcweir     Gate *              pGate;
119cdf0e10cSrcweir };
120cdf0e10cSrcweir 
121cdf0e10cSrcweir 
122cdf0e10cSrcweir 
123cdf0e10cSrcweir /// Helper functor for ->RepositoryPartition::Get_AlphabeticalList().
124cdf0e10cSrcweir template <class TRAITS>
125cdf0e10cSrcweir struct MakeGlobalId
126cdf0e10cSrcweir {
operator ()__anonc0d622fd0111::MakeGlobalId127cdf0e10cSrcweir     GlobalId            operator()(
128cdf0e10cSrcweir                             typename TRAITS::id_type
129cdf0e10cSrcweir                                                 i_id ) const
130cdf0e10cSrcweir                         {
131cdf0e10cSrcweir                             return GlobalId( TRAITS::EntityOf_(i_id).AryClass(),
132cdf0e10cSrcweir                                              i_id.Value() );
133cdf0e10cSrcweir                         }
134cdf0e10cSrcweir };
135cdf0e10cSrcweir 
136cdf0e10cSrcweir 
137cdf0e10cSrcweir 
138cdf0e10cSrcweir 
139cdf0e10cSrcweir /** Compare two {->GlobalId}s.
140cdf0e10cSrcweir 
141cdf0e10cSrcweir 
142cdf0e10cSrcweir     @todo   Move this up to the definition of GlobalId<>.
143cdf0e10cSrcweir */
144cdf0e10cSrcweir struct LesserGlobal
145cdf0e10cSrcweir {
LesserGlobal__anonc0d622fd0111::LesserGlobal146cdf0e10cSrcweir                         LesserGlobal(
147cdf0e10cSrcweir                             const Ce_Storage &  i_ces,
148cdf0e10cSrcweir                             const Def_Storage & i_des )
149cdf0e10cSrcweir                             :   rCes(i_ces), rDes(i_des) {}
150cdf0e10cSrcweir 
151cdf0e10cSrcweir     bool                operator()(
152cdf0e10cSrcweir                             GlobalId            i_1,
153cdf0e10cSrcweir                             GlobalId            i_2 ) const;
154cdf0e10cSrcweir 
155cdf0e10cSrcweir   private:
156cdf0e10cSrcweir     const String &      NameOf(
157cdf0e10cSrcweir                             GlobalId            i_id ) const;
158cdf0e10cSrcweir     // DATA
159cdf0e10cSrcweir     const Ce_Storage &  rCes;
160cdf0e10cSrcweir     const Def_Storage & rDes;
161cdf0e10cSrcweir     ::ary::LesserName   aLess;
162cdf0e10cSrcweir };
163cdf0e10cSrcweir 
164cdf0e10cSrcweir 
165cdf0e10cSrcweir bool
operator ()(GlobalId i_1,GlobalId i_2) const166cdf0e10cSrcweir LesserGlobal::operator()(   GlobalId            i_1,
167cdf0e10cSrcweir                             GlobalId            i_2 ) const
168cdf0e10cSrcweir                         {
169cdf0e10cSrcweir                             String  s1 = NameOf(i_1);
170cdf0e10cSrcweir                             String  s2 = NameOf(i_2);
171cdf0e10cSrcweir 
172cdf0e10cSrcweir                             if (s1 != s2)
173cdf0e10cSrcweir                                 return aLess(s1, s2);
174cdf0e10cSrcweir 
175cdf0e10cSrcweir                             if ( IsDefine(i_1) != IsDefine(i_2) )
176cdf0e10cSrcweir                             {
177cdf0e10cSrcweir                                 return NOT IsDefine(i_2);
178cdf0e10cSrcweir                             }
179cdf0e10cSrcweir                             else if (IsDefine(i_1))
180cdf0e10cSrcweir                             {
181cdf0e10cSrcweir                                 return i_1.Class() < i_2.Class();
182cdf0e10cSrcweir                             }
183cdf0e10cSrcweir 
184cdf0e10cSrcweir                             return Ce_GlobalCompare::Lesser_(
185cdf0e10cSrcweir                                         rCes[i_1.Id()],
186cdf0e10cSrcweir                                         rCes[i_2.Id()] );
187cdf0e10cSrcweir                         }
188cdf0e10cSrcweir 
189cdf0e10cSrcweir 
190cdf0e10cSrcweir }   // namespace anonymous
191cdf0e10cSrcweir 
192cdf0e10cSrcweir 
193cdf0e10cSrcweir 
194cdf0e10cSrcweir 
195cdf0e10cSrcweir 
196cdf0e10cSrcweir 
197cdf0e10cSrcweir namespace ary
198cdf0e10cSrcweir {
199cdf0e10cSrcweir namespace cpp
200cdf0e10cSrcweir {
201cdf0e10cSrcweir 
202cdf0e10cSrcweir DYN InternalGate &
Create_Partition_(RepositoryCenter & i_center)203cdf0e10cSrcweir InternalGate::Create_Partition_(RepositoryCenter & i_center)
204cdf0e10cSrcweir {
205cdf0e10cSrcweir     return *new RepositoryPartition(i_center);
206cdf0e10cSrcweir }
207cdf0e10cSrcweir 
208cdf0e10cSrcweir 
RepositoryPartition(RepositoryCenter & i_center)209cdf0e10cSrcweir RepositoryPartition::RepositoryPartition(RepositoryCenter & i_center)
210cdf0e10cSrcweir     :   pRepositoryCenter(&i_center),
211cdf0e10cSrcweir         pCes(0),
212cdf0e10cSrcweir         pTypes(0),
213cdf0e10cSrcweir         pDefs(0),
214cdf0e10cSrcweir         pLocations(& loc::InternalGate::Create_Locations_())
215cdf0e10cSrcweir {
216cdf0e10cSrcweir     pCes        = new CeAdmin(*this);
217cdf0e10cSrcweir     pTypes      = new TypeAdmin(*this);
218cdf0e10cSrcweir     pDefs       = new DefAdmin(*this);
219cdf0e10cSrcweir     pCes->Set_Related(*pTypes);
220cdf0e10cSrcweir }
221cdf0e10cSrcweir 
~RepositoryPartition()222cdf0e10cSrcweir RepositoryPartition::~RepositoryPartition()
223cdf0e10cSrcweir {
224cdf0e10cSrcweir }
225cdf0e10cSrcweir 
226cdf0e10cSrcweir void
Calculate_AllSecondaryInformation()227cdf0e10cSrcweir RepositoryPartition::Calculate_AllSecondaryInformation()
228cdf0e10cSrcweir //                                        const ::autodoc::Options & )
229cdf0e10cSrcweir {
230cdf0e10cSrcweir     // KORR_FUTURE
231cdf0e10cSrcweir     //  Forward the options from here.
232cdf0e10cSrcweir 
233cdf0e10cSrcweir     Connect_AllTypes_2_TheirRelated_CodeEntites();
234cdf0e10cSrcweir }
235cdf0e10cSrcweir 
236cdf0e10cSrcweir const String &
RepositoryTitle() const237cdf0e10cSrcweir RepositoryPartition::RepositoryTitle() const
238cdf0e10cSrcweir {
239cdf0e10cSrcweir     return static_cast< ary::Repository* >(pRepositoryCenter)->Title();
240cdf0e10cSrcweir }
241cdf0e10cSrcweir 
242cdf0e10cSrcweir const CodeEntity *
Search_RelatedCe(Type_id i_type) const243cdf0e10cSrcweir RepositoryPartition::Search_RelatedCe(Type_id i_type) const
244cdf0e10cSrcweir {
245cdf0e10cSrcweir     if (NOT i_type.IsValid())
246cdf0e10cSrcweir         return 0;
247cdf0e10cSrcweir 
248cdf0e10cSrcweir     Ce_id
249cdf0e10cSrcweir         ce_id = pTypes->Find_Type(i_type).RelatedCe();
250cdf0e10cSrcweir     return ce_id.IsValid()
251cdf0e10cSrcweir                 ?   & pCes->Find_Ce(ce_id)
252cdf0e10cSrcweir                 :   (CodeEntity*)(0);
253cdf0e10cSrcweir }
254cdf0e10cSrcweir 
255cdf0e10cSrcweir const ::ary::cpp::CppEntity *
Search_Entity(GlobalId i_id) const256cdf0e10cSrcweir RepositoryPartition::Search_Entity(GlobalId i_id) const
257cdf0e10cSrcweir {
258cdf0e10cSrcweir     if (i_id.Id() == 0)
259cdf0e10cSrcweir         return 0;
260cdf0e10cSrcweir 
261cdf0e10cSrcweir     if ( NOT IsDefine(i_id) )
262cdf0e10cSrcweir     {
263cdf0e10cSrcweir         // Shall make sure this is a C++ CodeEntity:
264cdf0e10cSrcweir         csv_assert( i_id.Class() >= Namespace::class_id
265cdf0e10cSrcweir                     AND
266cdf0e10cSrcweir                     i_id.Class() < BuiltInType::class_id
267cdf0e10cSrcweir                     && "Unexpected entity type in cpp::RepositoryPartition"
268cdf0e10cSrcweir                        "::Search_Entity()." );
269cdf0e10cSrcweir         return & Ces().Find_Ce( Ce_id(i_id.Id()) );
270cdf0e10cSrcweir     }
271cdf0e10cSrcweir     else
272cdf0e10cSrcweir     {
273cdf0e10cSrcweir         return & Defs().Find_Def( De_id(i_id.Id()) );
274cdf0e10cSrcweir     }
275cdf0e10cSrcweir }
276cdf0e10cSrcweir 
277cdf0e10cSrcweir 
278cdf0e10cSrcweir const CePilot &
Ces() const279cdf0e10cSrcweir RepositoryPartition::Ces() const
280cdf0e10cSrcweir {
281cdf0e10cSrcweir     csv_assert(pCes != 0);
282cdf0e10cSrcweir     return *pCes;
283cdf0e10cSrcweir }
284cdf0e10cSrcweir 
285cdf0e10cSrcweir const DefPilot &
Defs() const286cdf0e10cSrcweir RepositoryPartition::Defs() const
287cdf0e10cSrcweir {
288cdf0e10cSrcweir     csv_assert(pDefs != 0);
289cdf0e10cSrcweir     return *pDefs;
290cdf0e10cSrcweir }
291cdf0e10cSrcweir 
292cdf0e10cSrcweir const TypePilot &
Types() const293cdf0e10cSrcweir RepositoryPartition::Types() const
294cdf0e10cSrcweir {
295cdf0e10cSrcweir     csv_assert(pTypes != 0);
296cdf0e10cSrcweir     return *pTypes;
297cdf0e10cSrcweir }
298cdf0e10cSrcweir 
299cdf0e10cSrcweir const loc::LocationPilot &
Locations() const300cdf0e10cSrcweir RepositoryPartition::Locations() const
301cdf0e10cSrcweir {
302cdf0e10cSrcweir     csv_assert(pLocations != 0);
303cdf0e10cSrcweir     return *pLocations;
304cdf0e10cSrcweir }
305cdf0e10cSrcweir 
306cdf0e10cSrcweir CePilot &
Ces()307cdf0e10cSrcweir RepositoryPartition::Ces()
308cdf0e10cSrcweir {
309cdf0e10cSrcweir     csv_assert(pCes != 0);
310cdf0e10cSrcweir     return *pCes;
311cdf0e10cSrcweir }
312cdf0e10cSrcweir 
313cdf0e10cSrcweir DefPilot &
Defs()314cdf0e10cSrcweir RepositoryPartition::Defs()
315cdf0e10cSrcweir {
316cdf0e10cSrcweir     csv_assert(pDefs != 0);
317cdf0e10cSrcweir     return *pDefs;
318cdf0e10cSrcweir }
319cdf0e10cSrcweir 
320cdf0e10cSrcweir TypePilot &
Types()321cdf0e10cSrcweir RepositoryPartition::Types()
322cdf0e10cSrcweir {
323cdf0e10cSrcweir     csv_assert(pTypes != 0);
324cdf0e10cSrcweir     return *pTypes;
325cdf0e10cSrcweir }
326cdf0e10cSrcweir 
327cdf0e10cSrcweir loc::LocationPilot &
Locations()328cdf0e10cSrcweir RepositoryPartition::Locations()
329cdf0e10cSrcweir {
330cdf0e10cSrcweir     csv_assert(pLocations != 0);
331cdf0e10cSrcweir     return *pLocations;
332cdf0e10cSrcweir }
333cdf0e10cSrcweir 
334cdf0e10cSrcweir 
335cdf0e10cSrcweir void
Connect_AllTypes_2_TheirRelated_CodeEntites()336cdf0e10cSrcweir RepositoryPartition::Connect_AllTypes_2_TheirRelated_CodeEntites()
337cdf0e10cSrcweir {
338cdf0e10cSrcweir     TypeConnector
339cdf0e10cSrcweir         aConnector(*this);
340cdf0e10cSrcweir     std::for_each( pTypes->Storage().BeginUnreserved(),
341cdf0e10cSrcweir                    pTypes->Storage().End(),
342cdf0e10cSrcweir                    aConnector );
343cdf0e10cSrcweir 
344cdf0e10cSrcweir     typedef ::ary::stg::filter_iterator<CodeEntity,Class>
345cdf0e10cSrcweir         filter_class_iter;
346cdf0e10cSrcweir 
347cdf0e10cSrcweir     HierarchyLinker
348cdf0e10cSrcweir         aHierarchyLinker(*this);
349cdf0e10cSrcweir     filter_class_iter itEnd( pCes->Storage().End() );
350cdf0e10cSrcweir     for ( filter_class_iter it( pCes->Storage().BeginUnreserved() );
351cdf0e10cSrcweir           it != itEnd;
352cdf0e10cSrcweir           ++it )
353cdf0e10cSrcweir     {
354cdf0e10cSrcweir         if (NOT it.IsValid())
355cdf0e10cSrcweir             continue;
356cdf0e10cSrcweir 
357cdf0e10cSrcweir         if (is_type<Class>(*it))
358cdf0e10cSrcweir             aHierarchyLinker(ary_cast<Class>(*it));
359cdf0e10cSrcweir     }
360cdf0e10cSrcweir 
361cdf0e10cSrcweir     TypeConnector2ndTry
362cdf0e10cSrcweir         aConnector2ndTry(*this);
363cdf0e10cSrcweir     std::for_each( pTypes->Storage().BeginUnreserved(),
364cdf0e10cSrcweir                    pTypes->Storage().End(),
365cdf0e10cSrcweir                    aConnector2ndTry );
366cdf0e10cSrcweir }
367cdf0e10cSrcweir 
368cdf0e10cSrcweir template <class COMPARE>
369cdf0e10cSrcweir void                    Add2Result(
370cdf0e10cSrcweir                             List_GlobalIds &    o_result,
371cdf0e10cSrcweir                             const SortedIds<COMPARE> &
372cdf0e10cSrcweir                                                 i_data,
373cdf0e10cSrcweir                             const char *        i_begin,
374cdf0e10cSrcweir                             const char *        i_end );
375cdf0e10cSrcweir template <class COMPARE>
376cdf0e10cSrcweir void
Add2Result(List_GlobalIds & o_result,const SortedIds<COMPARE> & i_data,const char * i_begin,const char * i_end)377cdf0e10cSrcweir Add2Result( List_GlobalIds &            o_result,
378cdf0e10cSrcweir             const SortedIds<COMPARE> &  i_data,
379cdf0e10cSrcweir             const char *                i_begin,
380cdf0e10cSrcweir             const char *                i_end )
381cdf0e10cSrcweir {
382cdf0e10cSrcweir     const size_t
383cdf0e10cSrcweir         previous_size   = o_result.size();
384cdf0e10cSrcweir     typename std::vector<typename COMPARE::id_type>::const_iterator
385cdf0e10cSrcweir         it_beg          = i_data.LowerBound(i_begin);
386cdf0e10cSrcweir     typename std::vector<typename COMPARE::id_type>::const_iterator
387cdf0e10cSrcweir         it_end          = i_data.LowerBound(i_end);
388cdf0e10cSrcweir     size_t
389cdf0e10cSrcweir         count_added = static_cast<size_t>( std::distance(it_beg,it_end) );
390cdf0e10cSrcweir     o_result.insert(    o_result.end(),
391cdf0e10cSrcweir                         count_added,
392cdf0e10cSrcweir                         GlobalId() );
393cdf0e10cSrcweir     List_GlobalIds::iterator
394cdf0e10cSrcweir         it_out          = o_result.begin() + previous_size;
395cdf0e10cSrcweir     std::transform(     it_beg, it_end,
396cdf0e10cSrcweir                         it_out,
397cdf0e10cSrcweir                         MakeGlobalId<COMPARE>() );
398cdf0e10cSrcweir }
399cdf0e10cSrcweir 
400cdf0e10cSrcweir 
401cdf0e10cSrcweir uintt
Get_AlphabeticalList(List_GlobalIds & o_result,const char * i_begin,const char * i_end) const402cdf0e10cSrcweir RepositoryPartition::Get_AlphabeticalList( List_GlobalIds &    o_result,
403cdf0e10cSrcweir                                            const char *        i_begin,
404cdf0e10cSrcweir                                            const char *        i_end ) const
405cdf0e10cSrcweir {
406cdf0e10cSrcweir     size_t
407cdf0e10cSrcweir         ret = o_result.size();
408cdf0e10cSrcweir 
409cdf0e10cSrcweir     const Ce_Storage &
410cdf0e10cSrcweir         ce_storage = pCes->Storage();
411cdf0e10cSrcweir     const Def_Storage &
412cdf0e10cSrcweir         def_storage = pDefs->Storage();
413cdf0e10cSrcweir 
414cdf0e10cSrcweir     Add2Result( o_result,
415cdf0e10cSrcweir                 ce_storage.TypeIndex(),
416cdf0e10cSrcweir                 i_begin, i_end );
417cdf0e10cSrcweir     Add2Result( o_result,
418cdf0e10cSrcweir                 ce_storage.OperationIndex(),
419cdf0e10cSrcweir                 i_begin, i_end );
420cdf0e10cSrcweir     Add2Result( o_result,
421cdf0e10cSrcweir                 ce_storage.DataIndex(),
422cdf0e10cSrcweir                 i_begin, i_end );
423cdf0e10cSrcweir     Add2Result( o_result,
424cdf0e10cSrcweir                 def_storage.DefineIndex(),
425cdf0e10cSrcweir                 i_begin, i_end );
426cdf0e10cSrcweir     Add2Result( o_result,
427cdf0e10cSrcweir                 def_storage.MacroIndex(),
428cdf0e10cSrcweir                 i_begin, i_end );
429cdf0e10cSrcweir 
430cdf0e10cSrcweir     LesserGlobal
431cdf0e10cSrcweir         aLess(ce_storage, def_storage);
432cdf0e10cSrcweir 
433cdf0e10cSrcweir     std::sort(o_result.begin(), o_result.end(), aLess);
434cdf0e10cSrcweir 
435cdf0e10cSrcweir     return o_result.size() - ret;
436cdf0e10cSrcweir }
437cdf0e10cSrcweir 
438cdf0e10cSrcweir 
439cdf0e10cSrcweir 
440cdf0e10cSrcweir 
441cdf0e10cSrcweir }   // namespace cpp
442cdf0e10cSrcweir }   // namespace ary
443cdf0e10cSrcweir 
444cdf0e10cSrcweir 
445cdf0e10cSrcweir 
446cdf0e10cSrcweir 
447cdf0e10cSrcweir 
448cdf0e10cSrcweir namespace
449cdf0e10cSrcweir {
450cdf0e10cSrcweir 
451cdf0e10cSrcweir 
452cdf0e10cSrcweir void
operator ()(Type & io_rType) const453cdf0e10cSrcweir TypeConnector::operator()( Type & io_rType ) const
454cdf0e10cSrcweir {
455cdf0e10cSrcweir     csv_assert(pGate != 0);
456cdf0e10cSrcweir     UsedType *
457cdf0e10cSrcweir         pt = ::ary::ary_cast<UsedType>(&io_rType);
458cdf0e10cSrcweir     if (pt != 0)
459cdf0e10cSrcweir         pt->Connect2Ce(pGate->Ces());
460cdf0e10cSrcweir }
461cdf0e10cSrcweir 
462cdf0e10cSrcweir void
operator ()(Type & io_rType) const463cdf0e10cSrcweir TypeConnector2ndTry::operator()( Type & io_rType ) const
464cdf0e10cSrcweir {
465cdf0e10cSrcweir     csv_assert(pGate != 0);
466cdf0e10cSrcweir     UsedType *
467cdf0e10cSrcweir         pt = ::ary::ary_cast<UsedType>(&io_rType);
468cdf0e10cSrcweir     if (pt != 0)
469cdf0e10cSrcweir         pt->Connect2CeOnlyKnownViaBaseClass(*pGate);
470cdf0e10cSrcweir }
471cdf0e10cSrcweir 
472cdf0e10cSrcweir void
operator ()(Class & io_rCe) const473cdf0e10cSrcweir HierarchyLinker::operator()( Class & io_rCe ) const
474cdf0e10cSrcweir {
475cdf0e10cSrcweir     csv_assert( ::ary::is_type<Class>(io_rCe) );
476cdf0e10cSrcweir     Class &
477cdf0e10cSrcweir         rClass = io_rCe;
478cdf0e10cSrcweir 
479cdf0e10cSrcweir     for ( List_Bases::const_iterator it = rClass.BaseClasses().begin();
480cdf0e10cSrcweir           it != rClass.BaseClasses().end();
481cdf0e10cSrcweir           ++it )
482cdf0e10cSrcweir     {
483cdf0e10cSrcweir         const CodeEntity *
484cdf0e10cSrcweir             pCe = 0;
485cdf0e10cSrcweir         Type_id
486cdf0e10cSrcweir             nTid = (*it).nId;
487cdf0e10cSrcweir         for ( pCe = pGate->Search_RelatedCe(nTid);
488cdf0e10cSrcweir               ary::ary_cast<Typedef>(pCe) != 0;
489cdf0e10cSrcweir               pCe = pGate->Search_RelatedCe(nTid) )
490cdf0e10cSrcweir         {
491cdf0e10cSrcweir             nTid = static_cast< const Typedef* >(pCe)->DescribingType();
492cdf0e10cSrcweir         }
493cdf0e10cSrcweir         const Class *
494cdf0e10cSrcweir             pClass = ary::ary_cast<Class>(pCe);
495cdf0e10cSrcweir 		if (pClass == 0)
496cdf0e10cSrcweir             return;
497cdf0e10cSrcweir         // KORR_FUTURE:  we need a non const Find_Class()
498cdf0e10cSrcweir         const_cast< Class* >(pClass)->Add_KnownDerivative( io_rCe.CeId() );
499cdf0e10cSrcweir     }
500cdf0e10cSrcweir }
501cdf0e10cSrcweir 
502cdf0e10cSrcweir const String &
NameOf(GlobalId i_id) const503cdf0e10cSrcweir LesserGlobal::NameOf(GlobalId  i_id) const
504cdf0e10cSrcweir {
505cdf0e10cSrcweir     if ( NOT IsDefine(i_id) )
506cdf0e10cSrcweir     {
507cdf0e10cSrcweir         return rCes[i_id.Id()].LocalName();
508cdf0e10cSrcweir     }
509cdf0e10cSrcweir     else
510cdf0e10cSrcweir     {
511cdf0e10cSrcweir         return rDes[i_id.Id()].LocalName();
512cdf0e10cSrcweir     }
513cdf0e10cSrcweir }
514cdf0e10cSrcweir 
515cdf0e10cSrcweir 
516cdf0e10cSrcweir 
517cdf0e10cSrcweir }   // namespace anonymous
518