/usr/include/cutl/compiler/traversal.txx is in libcutl-dev 1.8.1+ds1-1.
This file is owned by root:root, with mode 0o644.
The actual contents of the file can be viewed below.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 | // file : cutl/compiler/traversal.txx
// copyright : Copyright (c) 2009-2013 Code Synthesis Tools CC
// license : MIT; see accompanying LICENSE file
namespace cutl
{
namespace compiler
{
// traverser
//
template<typename B>
traverser<B>::
~traverser ()
{
}
// traverser_impl
//
template <typename X, typename B>
void traverser_impl<X, B>::
trampoline (B& x)
{
this->traverse (dynamic_cast<type&> (x));
}
// dispatcher
//
template <typename B>
dispatcher<B>::
~dispatcher ()
{
}
template <typename B>
void dispatcher<B>::
traverser (traverser_map<B>& m)
{
// Copy entries from m to our map.
//
for (typename traverser_map<B>::iterator
i (m.begin ()), e (m.end ()); i != e; ++i)
{
typename traverser_map<B>::traversers& travs (this->map_[i->first]);
for (typename traverser_map<B>::traversers::const_iterator
t (i->second.begin ()), e (i->second.end ()); t != e; ++t)
{
travs.push_back (*t);
}
}
}
template <typename B>
void dispatcher<B>::
dispatch (B& x)
{
using std::size_t;
level_map levels;
type_info const& ti (lookup (x));
size_t max (compute_levels (ti, 0, levels));
// cerr << "starting dispatch process for " << ti.type_id ().name ()
// << " with " << max << " levels" << endl;
for (size_t l (0); l < max + 1; ++l)
{
type_info_set dispatched;
for (typename level_map::const_iterator
i (levels.begin ()), e (levels.end ()); i != e; ++i)
{
if (i->second == l)
{
typename traverser_map<B>::map_type::const_iterator v (
this->map_.find (i->first.type_id ()));
if (v != this->map_.end ())
{
// cerr << "dispatching traversers for " << ti.type_id ().name ()
// << " as " << i->first.type_id ().name () << endl;
typename traverser_map<B>::traversers const& travs (v->second);
for (typename traverser_map<B>::traversers::const_iterator
ti (travs.begin ()), te (travs.end ()); ti != te; ++ti)
{
(*ti)->trampoline (x);
}
flatten_tree (i->first, dispatched);
}
}
}
// Remove traversed types from the level map.
//
for (typename type_info_set::const_iterator i (dispatched.begin ());
i != dispatched.end (); ++i)
{
levels.erase (*i);
}
}
}
template <typename B>
std::size_t dispatcher<B>::
compute_levels (type_info const& ti, std::size_t cur, level_map& map)
{
using std::size_t;
size_t ret (cur);
if (map.find (ti) == map.end () || map[ti] < cur)
map[ti] = cur;
for (type_info::base_iterator i (ti.begin_base ());
i != ti.end_base (); ++i)
{
size_t tmp (compute_levels (i->type_info (), cur + 1, map));
if (tmp > ret)
ret = tmp;
}
return ret;
}
template <typename B>
void dispatcher<B>::
flatten_tree (type_info const& ti, type_info_set& set)
{
set.insert (ti);
for (type_info::base_iterator i (ti.begin_base ());
i != ti.end_base (); ++i)
{
flatten_tree (i->type_info (), set);
}
}
}
}
|