diff --git a/doomsday/apps/libdoomsday/src/resource/databundle.cpp b/doomsday/apps/libdoomsday/src/resource/databundle.cpp index 73a63a0471..3cebd8e837 100644 --- a/doomsday/apps/libdoomsday/src/resource/databundle.cpp +++ b/doomsday/apps/libdoomsday/src/resource/databundle.cpp @@ -409,8 +409,8 @@ DENG2_PIMPL(DataBundle), public Lockable { subset = VAR_REQUIRES; } - container->packageMetadata().appendToArray(subset, new TextValue(versionedPackageId)); - + container->packageMetadata().insertToSortedArray(subset, new TextValue(versionedPackageId)); + /* qDebug() << container->d->versionedPackageId << "[" << container->d->pkgLink->objectNamespace().gets("package.tags", "") << "]" diff --git a/doomsday/sdk/libcore/include/de/data/record.h b/doomsday/sdk/libcore/include/de/data/record.h index dc872d65bc..001e4e0900 100644 --- a/doomsday/sdk/libcore/include/de/data/record.h +++ b/doomsday/sdk/libcore/include/de/data/record.h @@ -384,6 +384,15 @@ class DENG2_PUBLIC Record Variable &appendUniqueWord(String const &name, String const &word, String const &separator = " "); Variable &appendToArray(String const &name, Value *value); + + /** + * Inserts a value to an array variable. The array is assumed to be sorted, and the + * insertion point is determined based on the sorting function. + * + * @param name Name of the variable. + * @param value Value to insert. + */ + Variable &insertToSortedArray(String const &name, Value *value); /** * Looks up a variable in the record. Variables in subrecords can be accessed diff --git a/doomsday/sdk/libcore/src/data/record.cpp b/doomsday/sdk/libcore/src/data/record.cpp index abf30c00ae..d87dc6aed9 100644 --- a/doomsday/sdk/libcore/src/data/record.cpp +++ b/doomsday/sdk/libcore/src/data/record.cpp @@ -586,6 +586,29 @@ Variable &Record::appendToArray(String const &name, Value *value) var.value().add(value); return var; } + +Variable &Record::insertToSortedArray(String const &name, Value *value) +{ + if (!has(name)) + { + return appendToArray(name, value); + } + + Variable &var = (*this)[name]; + ArrayValue &array = var.value().as(); + // O(n) insertion sort. + for (dsize i = 0; i < array.size(); ++i) + { + if (value->compare(array.at(i)) <= 0) + { + array.insert(i, value); + return var; + } + } + // Value is larger than everything in the array. + array.add(value); + return var; +} Variable &Record::operator [] (String const &name) {