Skip to content

Commit

Permalink
Fixed|Resources|libdoomsday: Sort .box contents by identifier
Browse files Browse the repository at this point in the history
Box contents are intended to be loaded in alphabetical order, so
when compiling the package metadata, ensure the ID arrays are sorted.
  • Loading branch information
skyjake committed Jul 16, 2016
1 parent 5d24d19 commit 6e92a40
Show file tree
Hide file tree
Showing 3 changed files with 34 additions and 2 deletions.
4 changes: 2 additions & 2 deletions doomsday/apps/libdoomsday/src/resource/databundle.cpp
Expand Up @@ -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", "") << "]"
Expand Down
9 changes: 9 additions & 0 deletions doomsday/sdk/libcore/include/de/data/record.h
Expand Up @@ -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
Expand Down
23 changes: 23 additions & 0 deletions doomsday/sdk/libcore/src/data/record.cpp
Expand Up @@ -586,6 +586,29 @@ Variable &Record::appendToArray(String const &name, Value *value)
var.value<ArrayValue>().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<ArrayValue>();
// 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)
{
Expand Down

0 comments on commit 6e92a40

Please sign in to comment.