Merge pull request #2309 from mitza-oci/warnings
[ACE_TAO.git] / ACE / ace / XML_Utils / XSCRT / Traversal.tpp
blobc490f536cf578e8cf86260d036da0feaae6f657d
1 // file      : XSCRT/Traversal.tpp
2 // author    : Boris Kolpackov <boris@dre.vanderbilt.edu>
4 namespace XSCRT
6   namespace Traversal
7   {
8     //@@ merge after dropping VC6
9     template <typename B>
10     void DispatcherBase<B>::
11     dispatch (B& n)
12     {
13       LevelMap levels;
15       //@@ VC6
16       ExtendedTypeInfo const& ti = extended_type_info (n);
18       unsigned long max = compute_levels (ti, 0, levels);
21       //wcerr << "starting dispatch process for "
22       //      << typeid (n).name () << " with "
23       //      << max << " levels" << endl;
25       for (unsigned long l = 0; l < max + 1; ++l)
26       {
27         TypeInfoSet dispatched;
29         for (typename LevelMap::const_iterator
30                i (levels.begin ()), e (levels.end ());
31              i != e; ++i)
32         {
33           if (i->second == l)
34           {
35             typename TraversalMap::const_iterator v (
36               traversal_map_.find (i->first.type_id ()));
38             if (v != traversal_map_.end ())
39             {
40               //wcerr << "dispatching traversers for "
41               //      << typeid (n).name () << " as "
42               //      << i->first.type_id ().name () << endl;
44               //@@ VC6
45               Traversers const& traversers  = v->second;
46               for (typename Traversers::const_iterator
47                      ti (traversers.begin ()), te (traversers.end ());
48                    ti != te; ++ti)
49               {
50                 (*ti)->trampoline (n);
51               }
53               flatten_tree (i->first, dispatched);
54             }
55           }
56         }
58         // Remove traversed types from the level map.
59         //
60     //@@ VC6
61         {
62           for (typename TypeInfoSet::const_iterator i = dispatched.begin ();
63                i != dispatched.end ();
64                ++i)
65           {
66             levels.erase (*i);
67           }
68     }
69       }
70     }
72     template <typename B>
73     void DispatcherBase<B>::
74     dispatch (B const& n)
75     {
76       LevelMap levels;
78       //@@ VC6
79       ExtendedTypeInfo const& ti = extended_type_info (n);
81       unsigned long max = compute_levels (ti, 0, levels);
84       //wcerr << "starting dispatch process for "
85       //      << typeid (n).name () << " with "
86       //      << max << " levels" << endl;
88       //wcerr << "using " << &traversal_map_ << " traversal map" << endl;
90       for (unsigned long l = 0; l < max + 1; ++l)
91       {
92         TypeInfoSet dispatched;
94         for (typename LevelMap::const_iterator
95                i (levels.begin ()), e (levels.end ());
96              i != e; ++i)
97         {
98           if (i->second == l)
99           {
100             typename TraversalMap::const_iterator v (
101               traversal_map_.find (i->first.type_id ()));
103             if (v != traversal_map_.end ())
104             {
105               //wcerr << "dispatching traversers for "
106               //      << typeid (n).name () << " as "
107               //      << i->first.type_id ().name () << endl;
109               //@@ VC6
110               Traversers const& traversers  = v->second;
111               for (typename Traversers::const_iterator
112                      ti (traversers.begin ()), te (traversers.end ());
113                    ti != te; ++ti)
114               {
115                 (*ti)->trampoline (n);
116               }
118               flatten_tree (i->first, dispatched);
119             }
120           }
121         }
123         // Remove traversed types from the level map.
124         //
125     //@@ VC6
126         {
127           for (typename TypeInfoSet::const_iterator i = dispatched.begin ();
128                i != dispatched.end ();
129                ++i)
130           {
131             levels.erase (*i);
132           }
133     }
134       }
135     }
137     template <typename B>
138     unsigned long DispatcherBase<B>::
139     compute_levels (ExtendedTypeInfo const& ti,
140                     unsigned long cur,
141                     LevelMap& map)
142     {
143       unsigned long ret = cur;
145       if (map.find (ti) == map.end () || map[ti] < cur) map[ti] = cur;
147       for (ExtendedTypeInfo::BaseIterator i = ti.begin_base ();
148            i != ti.end_base ();
149            i++)
150       {
151         unsigned long t = compute_levels (i->type_info (), cur + 1, map);
152         if (t > ret) ret = t;
153       }
155       return ret;
156     }
158     template <typename B>
159     void DispatcherBase<B>::
160     flatten_tree (ExtendedTypeInfo const& ti, TypeInfoSet& set)
161     {
162       set.insert (ti);
164       for (ExtendedTypeInfo::BaseIterator i = ti.begin_base ();
165            i != ti.end_base ();
166            i++)
167       {
168         flatten_tree (i->type_info (), set);
169       }
170     }
171   }