summaryrefslogtreecommitdiff
path: root/Data/DefaultContent/Libraries/containers/vector.lua
blob: 0b349ceed346ca0a477bdbb8057b8274978982ee (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
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
---
--- Generated by EmmyLua(https://github.com/EmmyLua)
--- Created by Dee.
--- DateTime: 2019/3/7 14:00
--- 快速遍历修改,低效的增删
---

vector = vector or {}

function vector.create()
    local t = {}


    ---尾添加元素(高效)
    function t:add(v)
        rawset(self, #self + 1, v)
    end

    ---插入(低效)
    ---@param k 位置
    ---@param v 值
    function t:insert(k, v)
        assert(k > 0 and k <= #self, "outrange of vector")

        local cnt = #self
        for i = cnt, k, -1 do
            rawset(self, i+1, self[i])
        end

        rawset(self, k, v)
    end

    ---值的索引
    ---@return -1不存在
    function t:indexOf(i_v)
        assert(type(self) == 'table')

        local ret = -1
        local cnt = #self
        for i = 1, #self do
            if self[i] == i_v then
                ret = i
            end
        end

        return ret
    end

    ---是否存在某元素
    function t:contains(v)
        assert(type(self) == 'table')
        return self:indexOf(v) ~= -1
    end

    ---根据下标索引移除元素(低效)
    function t:removeAt(idx)
        assert(idx <= #self)
        table.remove(self, idx)
    end

    ---删除值(非贪婪)
    ---@return 删除位置 -1未删除
    function t:remove(v)
        local ret = self:indexOf(v)
        if ret ~= -1 then
            self:removeAt(ret)
        end

        return ret
    end

    ---删除所有值
    function t:removeAll(v)
        assert(type(self) == 'table')
        error(">>Dee: wait ...")
    end

    ---排序
    function t:sort(comparer)
        assert(type(self) == 'table')
        table.sort(self, comparer)
    end

    ---匹配
    ---@param 匹配函数
    ---@return idx,value
    function t:find(matcher)
        assert(type(self) == 'table')

        local _idx, _value = -1, nil
        local cnt = #self
        for i = 1, cnt do
            if matcher(i, self[i]) then
                _value = self[i]
                _idx = i
                break
            end
        end

        return _idx, _value
    end

    --------------------------------metatable---------------------------------------
    t.__newindex = function(i_t,k,v)
        error(">> Dee: [], replace with add()")
    end

    t.__tostring = function(i_t)
        return table.concat(i_t, ',')
    end

    t.__pairs = function(...)
        error(">> Dee: Limited access")
    end

    setmetatable(t, t)
    -----------------------------------------------------------------------

    return t
end

return vector