summaryrefslogtreecommitdiff
path: root/lib/hkStubs/Havok/Common/Serialize/Util/hkRootLevelContainer.h
blob: 0ab70ec27479aad8d1790de60867d4a5d5e0f8a6 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
#pragma once

#include <Havok/Common/Base/Reflection/hkClass.h>
#include <Havok/Common/Base/hkBase.h>

class hkRootLevelContainer {
public:
    HK_DECLARE_CLASS_ALLOCATOR(hkRootLevelContainer)
    HK_DECLARE_REFLECTION()

public:
    HK_FORCE_INLINE hkRootLevelContainer();
    HK_FORCE_INLINE hkRootLevelContainer(const hkRootLevelContainer& other);
    explicit hkRootLevelContainer(hkFinishLoadedObjectFlag f);

    HK_FORCE_INLINE ~hkRootLevelContainer();

    hkRootLevelContainer& operator=(const hkRootLevelContainer&) = default;

    class NamedVariant {
    public:
        HK_DECLARE_CLASS_ALLOCATOR(hkRootLevelContainer::NamedVariant)
        HK_DECLARE_REFLECTION()

        HK_FORCE_INLINE NamedVariant();
        explicit NamedVariant(hkFinishLoadedObjectFlag flag);

        NamedVariant(const char* name, void* object, const hkClass* klass);
        NamedVariant(const char* name, const hkVariant& v);

        HK_FORCE_INLINE void set(const char* name, void* object, const hkClass* klass);
        HK_FORCE_INLINE void set(const char* name, const hkVariant& v);

        HK_FORCE_INLINE const char* getTypeName() const;
        HK_FORCE_INLINE const char* getName() const;
        HK_FORCE_INLINE void* getObject() const;
        HK_FORCE_INLINE const hkClass* getClass() const;
        HK_FORCE_INLINE const hkRefVariant& getRefVariant() const;

    private:
        hkStringPtr m_name;
        hkStringPtr m_className;
        hkRefVariant m_variant;
    };

    template <typename T>
    inline T* findObject(const void* prevObject = nullptr) const;

    void* findObjectByType(const char* typeName, const void* prevObject = nullptr) const;
    void* findObjectByName(const char* objectName, const void* prevObject = nullptr) const;

    hkArray<NamedVariant> m_namedVariants;
};

inline hkRootLevelContainer::hkRootLevelContainer() = default;

inline hkRootLevelContainer::hkRootLevelContainer(const hkRootLevelContainer& other) {
    *this = other;
}

inline hkRootLevelContainer::~hkRootLevelContainer() = default;

template <typename T>
inline T* hkRootLevelContainer::findObject(const void* prevObject) const {
    if (void* p = findObjectByType(T::staticClass().getName(), prevObject))
        return static_cast<T*>(p);
    return nullptr;
}

inline hkRootLevelContainer::NamedVariant::NamedVariant() = default;

inline void hkRootLevelContainer::NamedVariant::set(const char* name, void* object,
                                                    const hkClass* klass) {
    m_name = name;
    m_variant.set(object, klass);
    m_className = m_variant.getClass() ? m_variant.getClass()->getName() : nullptr;
}

inline void hkRootLevelContainer::NamedVariant::set(const char* name, const hkVariant& v) {
    m_name = name;
    m_variant = v;
    m_className = m_variant.getClass() ? m_variant.getClass()->getName() : nullptr;
}

inline const char* hkRootLevelContainer::NamedVariant::getTypeName() const {
    return m_variant.getClass() ? m_variant.getClass()->getName() :
                                  static_cast<const char*>(m_className);
}

inline const char* hkRootLevelContainer::NamedVariant::getName() const {
    return m_name;
}

inline void* hkRootLevelContainer::NamedVariant::getObject() const {
    return m_variant.val();
}

inline const hkClass* hkRootLevelContainer::NamedVariant::getClass() const {
    return m_variant.getClass();
}

inline const hkRefVariant& hkRootLevelContainer::NamedVariant::getRefVariant() const {
    return m_variant;
}