20 #ifndef H_GUARD_SYMUTIL_H
21 #define H_GUARD_SYMUTIL_H
39 #include <boost/foreach.hpp>
40 #include <boost/static_assert.hpp>
86 const typename TMap::key_type
id)
91 typename TMap::const_iterator iter = roMap.find(
id);
92 return (roMap.end() == iter)
93 ? static_cast<typename TMap::mapped_type>(-1)
171 if (v1 <= 0 || v2 <= 0)
187 return (origin1 == origin2);
208 template <
class TDst,
typename TInserter>
217 BOOST_FOREACH(
const TObjId obj, vars) {
229 #if defined(__GNUC_MINOR__) && (__GNUC__ == 4) && (__GNUC_MINOR__ == 3)
231 void (
TCVarList::*ins)(
const CVar &&) = &TCVarList::push_back;
233 void (
TCVarList::*ins)(
const CVar &) = &TCVarList::push_back;
242 typedef std::pair<TCVarSet::iterator, bool> TRet;
243 TRet (
TCVarSet::*ins)(
const CVar &) = &TCVarSet::insert;
248 template <
class THeap,
class TVisitor,
typename TMethod>
260 (sh.*method)(fields, obj);
263 BOOST_FOREACH(
const FldHandle &fld, fields)
272 template <
class THeap,
class TVisitor>
282 template <
class THeap,
class TVisitor>
292 template <
class THeap,
class TVisitor>
302 sh.gatherUniformBlocks(bMap, obj);
303 BOOST_FOREACH(TUniBlockMap::const_reference bItem, bMap) {
304 if (!visitor(sh, bItem.second))
314 template <
unsigned N,
class THeap,
class TVisitor>
316 THeap *
const heaps[N],
321 typedef std::pair<TOffset, TObjType> TItem;
323 for (
unsigned i = 0; i < N; ++i) {
325 const TObjId obj = objs[i];
331 BOOST_FOREACH(
const FldHandle &fld, fields) {
334 const TItem item(off, clt);
340 BOOST_FOREACH(
const TItem &item, all) {
341 const TOffset off = item.first;
345 for (
unsigned i = 0; i < N; ++i) {
347 const TObjId obj = objs[i];
348 fields[i] =
FldHandle(sh, obj, clt, off);
351 if (!visitor(fields))
361 template <
unsigned N,
class THeap,
class TVisitor>
368 for (
unsigned i = 0; i < N; ++i)
371 return traverseLiveFieldsGeneric<N>(heaps, objs, visitor);
377 const TObjId pointingFrom,
386 const TObjSet &pointingNotFrom,
398 template <
unsigned N_DST,
unsigned N_SRC,
class THeap,
class TVisitor>
400 THeap *
const heaps[N_DST + N_SRC],
402 const bool allowRecovery =
false)
404 const unsigned N_TOTAL = N_DST + N_SRC;
405 BOOST_STATIC_ASSERT(N_DST < N_TOTAL);
411 bool tryingRecover =
false;
414 for (
unsigned i = 1 + N_DST; i < N_TOTAL; ++i) {
419 BOOST_FOREACH(
const TObjId obj, live) {
435 tryingRecover =
true;
439 if (live.size() == all.size())
446 tryingRecover =
true;
451 BOOST_FOREACH(
const CVar &cv, all) {
453 for (
signed i = 0; i < (signed)N_TOTAL; ++i) {
456 const bool isDst = (i < (signed)N_DST);
457 const bool isAsym = !isDst && !
isVarAlive(sh, cv);
458 if (isAsym && !cv.
inst)
462 const bool createIfNeeded = isDst || allowRecovery;