File: serialization.hpp

package info (click to toggle)
openmw 0.49.0-1
  • links: PTS, VCS
  • area: main
  • in suites: forky, sid
  • size: 33,992 kB
  • sloc: cpp: 372,479; xml: 2,149; sh: 1,403; python: 797; makefile: 26
file content (59 lines) | stat: -rw-r--r-- 2,293 bytes parent folder | download
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
#ifndef COMPONENTS_LUA_SERIALIZATION_H
#define COMPONENTS_LUA_SERIALIZATION_H

#include <sol/sol.hpp>

#include <components/esm3/cellref.hpp>

namespace LuaUtil
{

    // Note: it can contain \0
    using BinaryData = std::string;

    class UserdataSerializer
    {
    public:
        virtual ~UserdataSerializer() {}

        // Appends serialized sol::userdata to the end of BinaryData.
        // Returns false if this type of userdata is not supported by this serializer.
        virtual bool serialize(BinaryData&, const sol::userdata&) const = 0;

        // Deserializes userdata of type "typeName" from binaryData. Should push the result on stack using
        // sol::stack::push. Returns false if this type is not supported by this serializer.
        virtual bool deserialize(std::string_view typeName, std::string_view binaryData, lua_State*) const = 0;

    protected:
        static void append(BinaryData&, std::string_view typeName, const void* data, size_t dataSize);

        static constexpr std::string_view sRefNumTypeName = "o";
        static void appendRefNum(BinaryData&, ESM::RefNum);
        static ESM::RefNum loadRefNum(std::string_view data);
    };

    // Serializer that can load Lua data from content files and saved games, but doesn't depend on apps/openmw.
    // Instead of LObject/GObject (that are defined in apps/openmw) it loads refnums directly as ESM::RefNum.
    class BasicSerializer final : public UserdataSerializer
    {
    public:
        BasicSerializer() = default;
        explicit BasicSerializer(std::function<int(int)> adjustContentFileIndexFn)
            : mAdjustContentFilesIndexFn(std::move(adjustContentFileIndexFn))
        {
        }

    private:
        bool serialize(LuaUtil::BinaryData& out, const sol::userdata& data) const override;
        bool deserialize(std::string_view typeName, std::string_view binaryData, lua_State* lua) const override;

        std::function<int(int)> mAdjustContentFilesIndexFn;
    };

    BinaryData serialize(const sol::object&, const UserdataSerializer* customSerializer = nullptr);
    sol::object deserialize(lua_State* lua, std::string_view binaryData,
        const UserdataSerializer* customSerializer = nullptr, bool readOnly = false);

}

#endif // COMPONENTS_LUA_SERIALIZATION_H