root/src/kits/debugger/util/ArchivingUtils.h
/*
 * Copyright 2009, Ingo Weinhold, ingo_weinhold@gmx.de. All Rights Reserved.
 * Distributed under the terms of the MIT License.
 */
#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>
/*static*/ 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>
/*static*/ ObjectType*
ArchivingUtils::Unarchive(const BMessage& archive)
{
        return CastOrDelete<ObjectType>(instantiate_object(
                const_cast<BMessage*>(&archive)));
}


template<typename ObjectType>
/*static*/ ObjectType*
ArchivingUtils::UnarchiveChild(const BMessage& archive, const char* fieldName,
        int32 index)
{
        return CastOrDelete<ObjectType>(UnarchiveChild(archive, fieldName, index));
}



#endif  // ARCHIVABLE_UTILS_H