20 #ifndef H_GUARD_SYMUTIL_H
21 #define H_GUARD_SYMUTIL_H
39 #include <boost/foreach.hpp>
40 #include <boost/static_assert.hpp>
92 const typename TMap::key_type
id)
97 typename TMap::const_iterator iter = roMap.find(
id);
98 return (roMap.end() == iter)
99 ? static_cast<typename TMap::mapped_type>(-1)
177 if (v1 <= 0 || v2 <= 0)
193 return (origin1 == origin2);
214 template <
class TDst,
typename TInserter>
223 BOOST_FOREACH(
const TObjId obj, vars) {
235 #if defined(__GNUC_MINOR__) && (__GNUC__ == 4) && (__GNUC_MINOR__ == 3)
237 void (
TCVarList::*ins)(
const CVar &&) = &TCVarList::push_back;
239 void (
TCVarList::*ins)(
const CVar &) = &TCVarList::push_back;
248 typedef std::pair<TCVarSet::iterator, bool> TRet;
249 TRet (
TCVarSet::*ins)(
const CVar &) = &TCVarSet::insert;
254 template <
class THeap,
class TVisitor>
265 sh.gatherLiveFields(fields, obj);
268 BOOST_FOREACH(
const FldHandle &fld, fields)
277 template <
class THeap,
class TVisitor>
287 sh.gatherUniformBlocks(bMap, obj);
288 BOOST_FOREACH(TUniBlockMap::const_reference bItem, bMap) {
289 if (!visitor(sh, bItem.second))
299 template <
unsigned N,
class THeap,
class TVisitor>
301 THeap *
const heaps[N],
306 typedef std::pair<TOffset, TObjType> TItem;
308 for (
unsigned i = 0; i < N; ++i) {
310 const TObjId obj = objs[i];
316 BOOST_FOREACH(
const FldHandle &fld, fields) {
319 const TItem item(off, clt);
325 BOOST_FOREACH(
const TItem &item, all) {
326 const TOffset off = item.first;
330 for (
unsigned i = 0; i < N; ++i) {
332 const TObjId obj = objs[i];
333 fields[i] =
FldHandle(sh, obj, clt, off);
336 if (!visitor(fields))
346 template <
unsigned N,
class THeap,
class TVisitor>
353 for (
unsigned i = 0; i < N; ++i)
356 return traverseLiveFieldsGeneric<N>(heaps, objs, visitor);
371 const TObjSet &pointingNotFrom,
383 template <
unsigned N_DST,
unsigned N_SRC,
class THeap,
class TVisitor>
385 THeap *
const heaps[N_DST + N_SRC],
387 const bool allowRecovery =
false)
389 const unsigned N_TOTAL = N_DST + N_SRC;
390 BOOST_STATIC_ASSERT(N_DST < N_TOTAL);
396 bool tryingRecover =
false;
399 for (
unsigned i = 1 + N_DST; i < N_TOTAL; ++i) {
404 BOOST_FOREACH(
const TObjId obj, live) {
420 tryingRecover =
true;
424 if (live.size() == all.size())
431 tryingRecover =
true;
436 BOOST_FOREACH(
const CVar &cv, all) {
438 for (
signed i = 0; i < (signed)N_TOTAL; ++i) {
441 const bool isDst = (i < (signed)N_DST);
442 const bool isAsym = !isDst && !
isVarAlive(sh, cv);
443 if (isAsym && !cv.
inst)
447 const bool createIfNeeded = isDst || allowRecovery;