Software / code / prosody
Comparison
util/set.lua @ 6054:7a5ddbaf758d
Merge 0.9->0.10
| author | Matthew Wild <mwild1@gmail.com> |
|---|---|
| date | Wed, 02 Apr 2014 17:41:38 +0100 |
| parent | 5908:081a91507e4f |
| child | 6673:b123fcd65d2e |
comparison
equal
deleted
inserted
replaced
| 6053:2f93a04564b2 | 6054:7a5ddbaf758d |
|---|---|
| 1 -- Prosody IM | 1 -- Prosody IM |
| 2 -- Copyright (C) 2008-2010 Matthew Wild | 2 -- Copyright (C) 2008-2010 Matthew Wild |
| 3 -- Copyright (C) 2008-2010 Waqas Hussain | 3 -- Copyright (C) 2008-2010 Waqas Hussain |
| 4 -- | 4 -- |
| 5 -- This project is MIT/X11 licensed. Please see the | 5 -- This project is MIT/X11 licensed. Please see the |
| 6 -- COPYING file in the source package for more information. | 6 -- COPYING file in the source package for more information. |
| 7 -- | 7 -- |
| 8 | 8 |
| 9 local ipairs, pairs, setmetatable, next, tostring = | 9 local ipairs, pairs, setmetatable, next, tostring = |
| 38 for item in pairs(set1) do | 38 for item in pairs(set1) do |
| 39 if not set2[item] then | 39 if not set2[item] then |
| 40 return false; | 40 return false; |
| 41 end | 41 end |
| 42 end | 42 end |
| 43 | 43 |
| 44 for item in pairs(set2) do | 44 for item in pairs(set2) do |
| 45 if not set1[item] then | 45 if not set1[item] then |
| 46 return false; | 46 return false; |
| 47 end | 47 end |
| 48 end | 48 end |
| 49 | 49 |
| 50 return true; | 50 return true; |
| 51 end | 51 end |
| 52 function set_mt.__tostring(set) | 52 function set_mt.__tostring(set) |
| 53 local s, items = { }, set._items; | 53 local s, items = { }, set._items; |
| 54 for item in pairs(items) do | 54 for item in pairs(items) do |
| 63 end | 63 end |
| 64 | 64 |
| 65 function new(list) | 65 function new(list) |
| 66 local items = setmetatable({}, items_mt); | 66 local items = setmetatable({}, items_mt); |
| 67 local set = { _items = items }; | 67 local set = { _items = items }; |
| 68 | 68 |
| 69 function set:add(item) | 69 function set:add(item) |
| 70 items[item] = true; | 70 items[item] = true; |
| 71 end | 71 end |
| 72 | 72 |
| 73 function set:contains(item) | 73 function set:contains(item) |
| 74 return items[item]; | 74 return items[item]; |
| 75 end | 75 end |
| 76 | 76 |
| 77 function set:items() | 77 function set:items() |
| 78 return items; | 78 return next, items; |
| 79 end | 79 end |
| 80 | 80 |
| 81 function set:remove(item) | 81 function set:remove(item) |
| 82 items[item] = nil; | 82 items[item] = nil; |
| 83 end | 83 end |
| 84 | 84 |
| 85 function set:add_list(list) | 85 function set:add_list(list) |
| 86 if list then | 86 if list then |
| 87 for _, item in ipairs(list) do | 87 for _, item in ipairs(list) do |
| 88 items[item] = true; | 88 items[item] = true; |
| 89 end | 89 end |
| 90 end | 90 end |
| 91 end | 91 end |
| 92 | 92 |
| 93 function set:include(otherset) | 93 function set:include(otherset) |
| 94 for item in otherset do | 94 for item in otherset do |
| 95 items[item] = true; | 95 items[item] = true; |
| 96 end | 96 end |
| 97 end | 97 end |
| 99 function set:exclude(otherset) | 99 function set:exclude(otherset) |
| 100 for item in otherset do | 100 for item in otherset do |
| 101 items[item] = nil; | 101 items[item] = nil; |
| 102 end | 102 end |
| 103 end | 103 end |
| 104 | 104 |
| 105 function set:empty() | 105 function set:empty() |
| 106 return not next(items); | 106 return not next(items); |
| 107 end | 107 end |
| 108 | 108 |
| 109 if list then | 109 if list then |
| 110 set:add_list(list); | 110 set:add_list(list); |
| 111 end | 111 end |
| 112 | 112 |
| 113 return setmetatable(set, set_mt); | 113 return setmetatable(set, set_mt); |
| 114 end | 114 end |
| 115 | 115 |
| 116 function union(set1, set2) | 116 function union(set1, set2) |
| 117 local set = new(); | 117 local set = new(); |
| 118 local items = set._items; | 118 local items = set._items; |
| 119 | 119 |
| 120 for item in pairs(set1._items) do | 120 for item in pairs(set1._items) do |
| 121 items[item] = true; | 121 items[item] = true; |
| 122 end | 122 end |
| 123 | 123 |
| 124 for item in pairs(set2._items) do | 124 for item in pairs(set2._items) do |
| 125 items[item] = true; | 125 items[item] = true; |
| 126 end | 126 end |
| 127 | 127 |
| 128 return set; | 128 return set; |
| 129 end | 129 end |
| 130 | 130 |
| 131 function difference(set1, set2) | 131 function difference(set1, set2) |
| 132 local set = new(); | 132 local set = new(); |
| 133 local items = set._items; | 133 local items = set._items; |
| 134 | 134 |
| 135 for item in pairs(set1._items) do | 135 for item in pairs(set1._items) do |
| 136 items[item] = (not set2._items[item]) or nil; | 136 items[item] = (not set2._items[item]) or nil; |
| 137 end | 137 end |
| 138 | 138 |
| 139 return set; | 139 return set; |
| 140 end | 140 end |
| 141 | 141 |
| 142 function intersection(set1, set2) | 142 function intersection(set1, set2) |
| 143 local set = new(); | 143 local set = new(); |
| 144 local items = set._items; | 144 local items = set._items; |
| 145 | 145 |
| 146 set1, set2 = set1._items, set2._items; | 146 set1, set2 = set1._items, set2._items; |
| 147 | 147 |
| 148 for item in pairs(set1) do | 148 for item in pairs(set1) do |
| 149 items[item] = (not not set2[item]) or nil; | 149 items[item] = (not not set2[item]) or nil; |
| 150 end | 150 end |
| 151 | 151 |
| 152 return set; | 152 return set; |
| 153 end | 153 end |
| 154 | 154 |
| 155 function xor(set1, set2) | 155 function xor(set1, set2) |
| 156 return union(set1, set2) - intersection(set1, set2); | 156 return union(set1, set2) - intersection(set1, set2); |