Alien-SmokeQt
view release on metacpan or search on metacpan
generator/generators/smoke/helpers.cpp view on Meta::CPAN
/*
Generator for the SMOKE sources
Copyright (C) 2009 Arno Rehn <arno@arnorehn.de>
This program is free software; you can redistribute it and/or modify
it under the terms of the GNU General Public License as published by
the Free Software Foundation; either version 2 of the License, or
(at your option) any later version.
This program is distributed in the hope that it will be useful,
but WITHOUT ANY WARRANTY; without even the implied warranty of
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
GNU General Public License for more details.
You should have received a copy of the GNU General Public License along
with this program; if not, write to the Free Software Foundation, Inc.,
51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.
*/
#include <QHash>
#include <QList>
#include <QStack>
#include <type.h>
#include "globals.h"
#include "../../options.h"
QHash<QString, QString> Util::typeMap;
QHash<const Method*, const Function*> Util::globalFunctionMap;
QHash<const Method*, const Field*> Util::fieldAccessors;
// looks up the inheritance path from desc to super and sets 'virt' to true if it encounters a virtual base
static bool isVirtualInheritancePathPrivate(const Class* desc, const Class* super, bool *virt)
{
foreach (const Class::BaseClassSpecifier bspec, desc->baseClasses()) {
if (bspec.baseClass == super || isVirtualInheritancePathPrivate(bspec.baseClass, super, virt)) {
if (bspec.isVirtual)
*virt = true;
return true;
}
}
return false;
}
bool Util::isVirtualInheritancePath(const Class* desc, const Class* super)
{
bool isVirtual = false;
isVirtualInheritancePathPrivate(desc, super, &isVirtual);
return isVirtual;
}
QList<const Class*> Util::superClassList(const Class* klass)
{
static QHash<const Class*, QList<const Class*> > superClassCache;
QList<const Class*> ret;
if (superClassCache.contains(klass))
return superClassCache[klass];
foreach (const Class::BaseClassSpecifier& base, klass->baseClasses()) {
ret << base.baseClass;
ret += superClassList(base.baseClass);
}
// cache
superClassCache[klass] = ret;
return ret;
}
QList<const Class*> Util::descendantsList(const Class* klass)
{
static QHash<const Class*, QList<const Class*> > descendantsClassCache;
QList<const Class*> ret;
if (descendantsClassCache.contains(klass))
return descendantsClassCache[klass];
for (QHash<QString, Class>::const_iterator iter = classes.constBegin(); iter != classes.constEnd(); iter++) {
if (superClassList(&iter.value()).contains(klass))
ret << &iter.value();
}
// cache
descendantsClassCache[klass] = ret;
return ret;
}
bool operator==(const Field& lhs, const Field& rhs)
{
return (lhs.name() == rhs.name() && lhs.declaringType() == rhs.declaringType() && lhs.type() == rhs.type());
}
bool operator==(const EnumMember& lhs, const EnumMember& rhs)
{
return (lhs.name() == rhs.name() && lhs.declaringType() == rhs.declaringType() && lhs.type() == rhs.type());
}
( run in 0.664 second using v1.01-cache-2.11-cpan-cdf2f3d4e48 )