don't check dependencies until newMetric is called

Before, we checked them during addMetric, and that left us vulnerable
link-order errors.  With this patch, we wait until someone actually asks
for an instance of a metric, and then we check all metrics' dependencies.
That way, since the Ride Summary always creates at least one metric, we'll
still check the dependencies of them all.  We just do it a little later in
the program's execution than before.
This commit is contained in:
Sean Rhea
2010-02-03 18:05:29 -08:00
parent cd0e9c184b
commit 113375669f

View File

@@ -114,11 +114,21 @@ class RideMetricFactory {
QVector<QString> metricNames;
QHash<QString,RideMetric*> metrics;
QHash<QString,QVector<QString>*> dependencyMap;
bool dependenciesChecked;
RideMetricFactory() {}
RideMetricFactory() : dependenciesChecked(false) {}
RideMetricFactory(const RideMetricFactory &other);
RideMetricFactory &operator=(const RideMetricFactory &other);
void checkDependencies() const {
if (dependenciesChecked) return;
foreach(const QString &dependee, dependencyMap.keys()) {
foreach(const QString &dependency, *dependencyMap[dependee])
assert(metrics.contains(dependency));
}
const_cast<RideMetricFactory*>(this)->dependenciesChecked = true;
}
public:
static RideMetricFactory &instance() {
@@ -137,6 +147,7 @@ class RideMetricFactory {
RideMetric *newMetric(const QString &symbol) const {
assert(metrics.contains(symbol));
checkDependencies();
return metrics.value(symbol)->clone();
}
@@ -147,11 +158,10 @@ class RideMetricFactory {
metricNames.append(metric.symbol());
if (deps) {
QVector<QString> *copy = new QVector<QString>;
for (int i = 0; i < deps->size(); ++i) {
assert(metrics.contains((*deps)[i]));
for (int i = 0; i < deps->size(); ++i)
copy->append((*deps)[i]);
}
dependencyMap.insert(metric.symbol(), copy);
dependenciesChecked = false;
}
return true;
}