blob: d38ee6ac6d38046ad25ad0ef021388c67492027c [file] [log] [blame]
#ifndef _RIVE_CORE_HPP_
#define _RIVE_CORE_HPP_
#include "rive/core/binary_reader.hpp"
#include "rive/status_code.hpp"
#include <cassert>
namespace rive
{
class CoreContext;
class ImportStack;
class Core
{
public:
static const int invalidPropertyKey = 0;
virtual ~Core() {}
virtual uint16_t coreType() const = 0;
virtual bool isTypeOf(uint16_t typeKey) const = 0;
virtual bool deserialize(uint16_t propertyKey,
BinaryReader& reader) = 0;
template <typename T> inline bool is() const
{
return isTypeOf(T::typeKey);
}
template <typename T> inline T* as()
{
assert(is<T>());
return reinterpret_cast<T*>(this);
}
/// Make a shallow copy of the object.
virtual Core* clone() const { return nullptr; }
template <typename T> inline const T* as() const
{
assert(is<T>());
return reinterpret_cast<const T*>(this);
}
/// Called when the object is first added to the context, other objects
/// may not have resolved their dependencies yet. This is an opportunity
/// to look up objects referenced by id, but not assume that they in
/// turn have resolved their references yet. Called during
/// load/instance.
virtual StatusCode onAddedDirty(CoreContext* context)
{
return StatusCode::Ok;
}
/// Called when all the objects in the context have had onAddedDirty
/// called. This is an opportunity to reference things referenced by
/// dependencies. (A path should be able to find a Shape somewhere in
/// its hierarchy, which may be multiple levels up).
virtual StatusCode onAddedClean(CoreContext* context)
{
return StatusCode::Ok;
}
virtual StatusCode import(ImportStack& importStack)
{
return StatusCode::Ok;
}
};
} // namespace rive
#endif