Skip to content

Commit

Permalink
libcore|Scripting: RecordValue is now derived from RecordAccessor
Browse files Browse the repository at this point in the history
Easier to access contents of the record.
  • Loading branch information
skyjake committed Oct 30, 2015
1 parent 3f11e13 commit 5cb3495
Show file tree
Hide file tree
Showing 4 changed files with 29 additions and 11 deletions.
7 changes: 4 additions & 3 deletions doomsday/sdk/libcore/include/de/data/recordaccessor.h
Expand Up @@ -24,6 +24,7 @@
namespace de {

class Record;
class RecordValue;

/**
* Utility class with convenient get*() methods. While Record is designed to be used
Expand Down Expand Up @@ -64,16 +65,16 @@ class DENG2_PUBLIC RecordAccessor
String gets(String const &name) const;
String gets(String const &name, String const &defaultValue) const;
ArrayValue const &geta(String const &name) const;
RecordValue const &getr(String const &name) const;

Record const &subrecord(String const &name) const;

template <typename ValueType>
ValueType const &getAs(String const &name) const {
ValueType const *v = get(name).maybeAs<ValueType>();
if(!v)
{
if(!v) {
throw ValueTypeError("RecordAccessor::getAs", String("Cannot cast to expected type (") +
DENG2_TYPE_NAME(ValueType) + ")");
DENG2_TYPE_NAME(ValueType) + " const)");
}
return *v;
}
Expand Down
9 changes: 7 additions & 2 deletions doomsday/sdk/libcore/include/de/data/recordvalue.h
Expand Up @@ -33,7 +33,10 @@ namespace de {
*
* @ingroup data
*/
class DENG2_PUBLIC RecordValue : public Value, DENG2_OBSERVES(Record, Deletion)
class DENG2_PUBLIC RecordValue
: public Value
, public RecordAccessor
, DENG2_OBSERVES(Record, Deletion)
{
public:
/// Attempt to access the record after it has been deleted. @ingroup errors
Expand All @@ -51,7 +54,9 @@ class DENG2_PUBLIC RecordValue : public Value, DENG2_OBSERVES(Record, Deletion)
enum OwnershipFlag
{
/// The value has ownership of the record.
OwnsRecord = 0x1
OwnsRecord = 0x1,

RecordNotOwned = 0
};
Q_DECLARE_FLAGS(OwnershipFlags, OwnershipFlag)

Expand Down
7 changes: 6 additions & 1 deletion doomsday/sdk/libcore/src/data/recordaccessor.cpp
Expand Up @@ -17,7 +17,7 @@
*/

#include "de/RecordAccessor"
#include "de/Record"
#include "de/RecordValue"

namespace de {

Expand Down Expand Up @@ -119,6 +119,11 @@ ArrayValue const &RecordAccessor::geta(String const &name) const
return getAs<ArrayValue>(name);
}

RecordValue const &RecordAccessor::getr(String const &name) const
{
return getAs<RecordValue>(name);
}

Record const &RecordAccessor::subrecord(String const &name) const
{
return accessedRecord().subrecord(name);
Expand Down
17 changes: 12 additions & 5 deletions doomsday/sdk/libcore/src/data/recordvalue.cpp
Expand Up @@ -42,7 +42,9 @@ DENG2_PIMPL_NOREF(RecordValue)
Instance() : record(0) {}
};

RecordValue::RecordValue(Record *record, OwnershipFlags o) : d(new Instance)
RecordValue::RecordValue(Record *record, OwnershipFlags o)
: RecordAccessor(record)
, d(new Instance)
{
d->record = record;
d->ownership = o;
Expand All @@ -57,7 +59,9 @@ RecordValue::RecordValue(Record *record, OwnershipFlags o) : d(new Instance)
}
}

RecordValue::RecordValue(Record const &record) : d(new Instance)
RecordValue::RecordValue(Record const &record)
: RecordAccessor(record)
, d(new Instance)
{
d->record = const_cast<Record *>(&record);

Expand Down Expand Up @@ -104,6 +108,7 @@ void RecordValue::setRecord(Record *record, OwnershipFlags ownership)

d->record = record;
d->ownership = ownership;
setAccessedRecord(d->record);

if(d->record && !d->ownership.testFlag(OwnsRecord))
{
Expand All @@ -121,8 +126,9 @@ Record *RecordValue::takeRecord()
throw OwnershipError("RecordValue::takeRecord", "Value does not own the record");
}
Record *rec = d->record;
d->record = 0;
d->ownership = 0;
d->record = nullptr;
d->ownership = RecordNotOwned;
setAccessedRecord(nullptr);
return rec;
}

Expand Down Expand Up @@ -301,7 +307,8 @@ void RecordValue::recordBeingDeleted(Record &DENG2_DEBUG_ONLY(record))

DENG2_ASSERT(d->record == &record);
DENG2_ASSERT(!d->ownership.testFlag(OwnsRecord));
d->record = 0;
d->record = nullptr;
setAccessedRecord(nullptr);
}

} // namespace de

0 comments on commit 5cb3495

Please sign in to comment.