summaryrefslogtreecommitdiff
path: root/src/factories/GenericArrayFactory.h
blob: 2b06825e3236bac52eb4bb8d80cafe09183738ab (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
#pragma once

#include "BaseFactory.h"
#include <vector>
#include <variant>
#include <types/Vec3D.h>

typedef std::variant<uint8_t, int8_t, uint16_t, int16_t, uint32_t, int32_t, uint64_t, float, double, Vec2f, Vec3f, Vec3s, Vec3i, Vec4f, Vec4s> ArrayDatum;

enum class ArrayType {
    u8, s8, u16, s16, u32, s32, u64, f32, f64, Vec2f, Vec3f, Vec3s, Vec3i, Vec4f, Vec4s,
};

std::unordered_map<std::string, ArrayType> arrayTypeMap = {
    { "u8", ArrayType::u8 },
    { "s8", ArrayType::s8 },
    { "u16", ArrayType::u16 },
    { "s16", ArrayType::s16 },
    { "u32", ArrayType::u32 },
    { "s32", ArrayType::s32 },
    { "u64", ArrayType::u64 },
    { "f32", ArrayType::f32 },
    { "f64", ArrayType::f64 },
    { "Vec2f", ArrayType::Vec2f },
    { "Vec3f", ArrayType::Vec3f },
    { "Vec3s", ArrayType::Vec3s },
    { "Vec3i", ArrayType::Vec3i },
    { "Vec4f", ArrayType::Vec4f },
    { "Vec4s", ArrayType::Vec4s },
};

std::unordered_map<ArrayType, size_t> typeSizeMap = {
    { ArrayType::u8, 1 },
    { ArrayType::s8, 1 },
    { ArrayType::u16, 2 },
    { ArrayType::s16, 2 },
    { ArrayType::u32, 4 },
    { ArrayType::s32, 4 },
    { ArrayType::u64, 8 },
    { ArrayType::f32, 4 },
    { ArrayType::f64, 8 },
    { ArrayType::Vec2f, 8 },
    { ArrayType::Vec3f, 12 },
    { ArrayType::Vec3s, 6 },
    { ArrayType::Vec3i, 12 },
    { ArrayType::Vec4f, 16 },
    { ArrayType::Vec4s, 8 },
};

class GenericArray : public IParsedData {
public:
    uint32_t mMaxWidth;
    std::vector<ArrayDatum> mData;

    explicit GenericArray(std::vector<ArrayDatum> data);
};

class ArrayCodeExporter : public BaseExporter {
    ExportResult Export(std::ostream& write, std::shared_ptr<IParsedData> data, std::string& entryName, YAML::Node& node, std::string* replacement) override;
};

class ArrayHeaderExporter : public BaseExporter {
    ExportResult Export(std::ostream& write, std::shared_ptr<IParsedData> data, std::string& entryName, YAML::Node& node, std::string* replacement) override;
};

class ArrayBinaryExporter : public BaseExporter {
    ExportResult Export(std::ostream& write, std::shared_ptr<IParsedData> data, std::string& entryName, YAML::Node& node, std::string* replacement) override;
};

class GenericArrayFactory : public BaseFactory {
public:
    std::optional<std::shared_ptr<IParsedData>> parse(std::vector<uint8_t>& buffer, YAML::Node& data) override;
    std::unordered_map<ExportType, std::shared_ptr<BaseExporter>> GetExporters() override {
        return {
            REGISTER(Header, ArrayHeaderExporter)
            REGISTER(Binary, ArrayBinaryExporter)
            REGISTER(Code, ArrayCodeExporter)
        };
    }
};