#ifndef ARCHIVABLE_UTILS_H
#define ARCHIVABLE_UTILS_H
#include <Archivable.h>
class ArchivingUtils {
public:
template<typename ObjectType>
static ObjectType* CastOrDelete(BArchivable* archivable);
template<typename ObjectType>
static ObjectType* Unarchive(const BMessage& archive);
static status_t ArchiveChild(BArchivable* object,
BMessage& parentArchive,
const char* fieldName);
static BArchivable* UnarchiveChild(const BMessage& parentArchive,
const char* fieldName, int32 index = 0);
template<typename ObjectType>
static ObjectType* UnarchiveChild(const BMessage& archive,
const char* fieldName, int32 index = 0);
};
template<typename ObjectType>
ObjectType*
ArchivingUtils::CastOrDelete(BArchivable* archivable)
{
if (archivable == NULL)
return NULL;
ObjectType* object = dynamic_cast<ObjectType*>(archivable);
if (object == NULL)
delete archivable;
return object;
}
template<typename ObjectType>
ObjectType*
ArchivingUtils::Unarchive(const BMessage& archive)
{
return CastOrDelete<ObjectType>(instantiate_object(
const_cast<BMessage*>(&archive)));
}
template<typename ObjectType>
ObjectType*
ArchivingUtils::UnarchiveChild(const BMessage& archive, const char* fieldName,
int32 index)
{
return CastOrDelete<ObjectType>(UnarchiveChild(archive, fieldName, index));
}
#endif