| #ifndef _RIVE_CORE_HPP_ |
| #define _RIVE_CORE_HPP_ |
| |
| #include "rive/rive_types.hpp" |
| #include "rive/core/binary_reader.hpp" |
| #include "rive/status_code.hpp" |
| |
| 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 |