dub 0.2.2 → 1.0.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.

Potentially problematic release.


This version of dub might be problematic. Click here for more details.

Files changed (277) hide show
  1. data/History.txt +92 -0
  2. data/LICENSE +20 -0
  3. data/README.rdoc +115 -0
  4. data/Rakefile +59 -0
  5. data/dub.gemspec +197 -0
  6. data/lib/dub/argument.rb +286 -0
  7. data/lib/dub/entities_unescape.rb +9 -0
  8. data/lib/dub/function.rb +177 -0
  9. data/lib/dub/function_group.rb +72 -0
  10. data/lib/dub/generator.rb +15 -0
  11. data/lib/dub/group.rb +20 -0
  12. data/lib/dub/klass.rb +338 -0
  13. data/lib/dub/lua/class.cpp.erb +114 -0
  14. data/lib/dub/lua/class_gen.rb +96 -0
  15. data/lib/dub/lua/function.cpp.erb +15 -0
  16. data/lib/dub/lua/function_gen.rb +329 -0
  17. data/lib/dub/lua/group.cpp.erb +9 -0
  18. data/lib/dub/lua/lua_cpp_helper.cpp +259 -0
  19. data/lib/dub/lua/lua_cpp_helper.h +219 -0
  20. data/lib/dub/lua/lua_object.cpp +158 -0
  21. data/lib/dub/lua/lua_object.h +69 -0
  22. data/lib/dub/lua/namespace.cpp.erb +42 -0
  23. data/lib/dub/lua/namespace_gen.rb +69 -0
  24. data/lib/dub/lua.rb +24 -0
  25. data/lib/dub/member_extraction.rb +128 -0
  26. data/lib/dub/namespace.rb +295 -0
  27. data/lib/dub/opts_parser.rb +30 -0
  28. data/lib/dub/parser.rb +46 -0
  29. data/lib/dub/templates/lua_template.erb +21 -0
  30. data/lib/dub/version.rb +3 -0
  31. data/lib/dub.rb +24 -20
  32. data/test/argument_test.rb +581 -0
  33. data/test/fixtures/app/CMakeLists.txt +54 -0
  34. data/test/fixtures/app/Doxyfile +1600 -0
  35. data/test/fixtures/app/bindings/all_lua.cpp +299 -0
  36. data/test/fixtures/app/include/matrix.h +283 -0
  37. data/test/fixtures/app/make_lua_bindings.rb +13 -0
  38. data/test/fixtures/app/vendor/lua/CMakeLists.txt +25 -0
  39. data/test/fixtures/app/vendor/lua/COPYRIGHT +34 -0
  40. data/test/fixtures/app/vendor/lua/HISTORY +183 -0
  41. data/test/fixtures/app/vendor/lua/INSTALL +99 -0
  42. data/test/fixtures/app/vendor/lua/Makefile +183 -0
  43. data/test/fixtures/app/vendor/lua/README +37 -0
  44. data/test/fixtures/app/vendor/lua/lapi.c +1080 -0
  45. data/test/fixtures/app/vendor/lua/lapi.h +16 -0
  46. data/test/fixtures/app/vendor/lua/lauxlib.c +653 -0
  47. data/test/fixtures/app/vendor/lua/lauxlib.h +174 -0
  48. data/test/fixtures/app/vendor/lua/lbaselib.c +643 -0
  49. data/test/fixtures/app/vendor/lua/lcode.c +839 -0
  50. data/test/fixtures/app/vendor/lua/lcode.h +76 -0
  51. data/test/fixtures/app/vendor/lua/ldblib.c +397 -0
  52. data/test/fixtures/app/vendor/lua/ldebug.c +622 -0
  53. data/test/fixtures/app/vendor/lua/ldebug.h +33 -0
  54. data/test/fixtures/app/vendor/lua/ldo.c +516 -0
  55. data/test/fixtures/app/vendor/lua/ldo.h +57 -0
  56. data/test/fixtures/app/vendor/lua/ldump.c +164 -0
  57. data/test/fixtures/app/vendor/lua/lfunc.c +174 -0
  58. data/test/fixtures/app/vendor/lua/lfunc.h +34 -0
  59. data/test/fixtures/app/vendor/lua/lgc.c +711 -0
  60. data/test/fixtures/app/vendor/lua/lgc.h +110 -0
  61. data/test/fixtures/app/vendor/lua/liblua.a +0 -0
  62. data/test/fixtures/app/vendor/lua/linit.c +38 -0
  63. data/test/fixtures/app/vendor/lua/liolib.c +532 -0
  64. data/test/fixtures/app/vendor/lua/llex.c +461 -0
  65. data/test/fixtures/app/vendor/lua/llex.h +81 -0
  66. data/test/fixtures/app/vendor/lua/llimits.h +128 -0
  67. data/test/fixtures/app/vendor/lua/lmathlib.c +263 -0
  68. data/test/fixtures/app/vendor/lua/lmem.c +86 -0
  69. data/test/fixtures/app/vendor/lua/lmem.h +49 -0
  70. data/test/fixtures/app/vendor/lua/loadlib.c +664 -0
  71. data/test/fixtures/app/vendor/lua/lobject.c +214 -0
  72. data/test/fixtures/app/vendor/lua/lobject.h +381 -0
  73. data/test/fixtures/app/vendor/lua/lopcodes.c +102 -0
  74. data/test/fixtures/app/vendor/lua/lopcodes.h +268 -0
  75. data/test/fixtures/app/vendor/lua/loslib.c +244 -0
  76. data/test/fixtures/app/vendor/lua/lparser.c +1337 -0
  77. data/test/fixtures/app/vendor/lua/lparser.h +82 -0
  78. data/test/fixtures/app/vendor/lua/lstate.c +214 -0
  79. data/test/fixtures/app/vendor/lua/lstate.h +168 -0
  80. data/test/fixtures/app/vendor/lua/lstring.c +111 -0
  81. data/test/fixtures/app/vendor/lua/lstring.h +31 -0
  82. data/test/fixtures/app/vendor/lua/lstrlib.c +868 -0
  83. data/test/fixtures/app/vendor/lua/ltable.c +588 -0
  84. data/test/fixtures/app/vendor/lua/ltable.h +40 -0
  85. data/test/fixtures/app/vendor/lua/ltablib.c +278 -0
  86. data/test/fixtures/app/vendor/lua/ltm.c +75 -0
  87. data/test/fixtures/app/vendor/lua/ltm.h +54 -0
  88. data/test/fixtures/app/vendor/lua/lua.c +695 -0
  89. data/test/fixtures/app/vendor/lua/lua.h +385 -0
  90. data/test/fixtures/app/vendor/lua/lua_dub_helper.h +77 -0
  91. data/test/fixtures/app/vendor/lua/luac +0 -0
  92. data/test/fixtures/app/vendor/lua/luac.c +200 -0
  93. data/test/fixtures/app/vendor/lua/luaconf.h +762 -0
  94. data/test/fixtures/app/vendor/lua/lualib.h +53 -0
  95. data/test/fixtures/app/vendor/lua/lundump.c +223 -0
  96. data/test/fixtures/app/vendor/lua/lundump.h +36 -0
  97. data/test/fixtures/app/vendor/lua/lvm.c +765 -0
  98. data/test/fixtures/app/vendor/lua/lvm.h +36 -0
  99. data/test/fixtures/app/vendor/lua/lzio.c +82 -0
  100. data/test/fixtures/app/vendor/lua/lzio.h +67 -0
  101. data/test/fixtures/app/vendor/lua/matrix.h +102 -0
  102. data/test/fixtures/app/vendor/lua/print.c +227 -0
  103. data/test/fixtures/app/vendor/lua/test/README +26 -0
  104. data/test/fixtures/app/vendor/lua/test/bisect.lua +27 -0
  105. data/test/fixtures/app/vendor/lua/test/cf.lua +16 -0
  106. data/test/fixtures/app/vendor/lua/test/echo.lua +5 -0
  107. data/test/fixtures/app/vendor/lua/test/env.lua +7 -0
  108. data/test/fixtures/app/vendor/lua/test/factorial.lua +32 -0
  109. data/test/fixtures/app/vendor/lua/test/fib.lua +40 -0
  110. data/test/fixtures/app/vendor/lua/test/fibfor.lua +13 -0
  111. data/test/fixtures/app/vendor/lua/test/globals.lua +13 -0
  112. data/test/fixtures/app/vendor/lua/test/hello.lua +3 -0
  113. data/test/fixtures/app/vendor/lua/test/life.lua +111 -0
  114. data/test/fixtures/app/vendor/lua/test/luac.lua +7 -0
  115. data/test/fixtures/app/vendor/lua/test/printf.lua +7 -0
  116. data/test/fixtures/app/vendor/lua/test/readonly.lua +12 -0
  117. data/test/fixtures/app/vendor/lua/test/sieve.lua +29 -0
  118. data/test/fixtures/app/vendor/lua/test/sort.lua +66 -0
  119. data/test/fixtures/app/vendor/lua/test/table.lua +12 -0
  120. data/test/fixtures/app/vendor/lua/test/trace-calls.lua +32 -0
  121. data/test/fixtures/app/vendor/lua/test/trace-globals.lua +38 -0
  122. data/test/fixtures/app/vendor/lua/test/xd.lua +14 -0
  123. data/test/fixtures/app/xml/classdub_1_1_base.xml +85 -0
  124. data/test/fixtures/app/xml/classdub_1_1_custom_destructor.xml +67 -0
  125. data/test/fixtures/app/xml/classdub_1_1_deletable_out_of_lua.xml +43 -0
  126. data/test/fixtures/app/xml/classdub_1_1_matrix.xml +482 -0
  127. data/test/fixtures/app/xml/classdub_1_1_no_destructor.xml +49 -0
  128. data/test/fixtures/app/xml/classdub_1_1_priv_sub_base.xml +89 -0
  129. data/test/fixtures/app/xml/classdub_1_1_private_constr.xml +68 -0
  130. data/test/fixtures/app/xml/classdub_1_1_static_constr.xml +69 -0
  131. data/test/fixtures/app/xml/classdub_1_1_sub_base.xml +89 -0
  132. data/test/fixtures/app/xml/classdub_1_1_t_mat.xml +252 -0
  133. data/test/fixtures/app/xml/combine.xslt +15 -0
  134. data/test/fixtures/app/xml/compound.xsd +814 -0
  135. data/test/fixtures/app/xml/dir_53661a2bdeb1d55e60581a7e15deb763.xml +12 -0
  136. data/test/fixtures/app/xml/index.xml +91 -0
  137. data/test/fixtures/app/xml/index.xsd +66 -0
  138. data/test/fixtures/app/xml/matrix_8h.xml +310 -0
  139. data/test/fixtures/app/xml/namespacedub.xml +48 -0
  140. data/test/fixtures/classcv_1_1_mat.xml +1996 -0
  141. data/test/fixtures/classcv_1_1_point__.xml +341 -0
  142. data/test/fixtures/classcv_1_1_scalar__.xml +269 -0
  143. data/test/fixtures/classcv_1_1_size__.xml +270 -0
  144. data/test/fixtures/dummy_class.cpp.erb +1 -0
  145. data/test/fixtures/dummy_function.cpp.erb +1 -0
  146. data/test/fixtures/group___magic_type.xml +406 -0
  147. data/test/fixtures/namespacecv.xml +12659 -0
  148. data/test/function_group_test.rb +43 -0
  149. data/test/function_test.rb +405 -0
  150. data/test/group_test.rb +241 -0
  151. data/test/helper.rb +34 -0
  152. data/test/klass_test.rb +551 -0
  153. data/test/lua_function_gen_test.rb +242 -0
  154. data/test/namespace_test.rb +220 -0
  155. data/test/parser_test.rb +36 -0
  156. metadata +229 -272
  157. checksums.yaml +0 -7
  158. data/lib/open_api_sdk/analytics.rb +0 -99
  159. data/lib/open_api_sdk/domains.rb +0 -353
  160. data/lib/open_api_sdk/dub.rb +0 -88
  161. data/lib/open_api_sdk/links.rb +0 -766
  162. data/lib/open_api_sdk/metatags.rb +0 -54
  163. data/lib/open_api_sdk/models/operations/bulkcreatelinks_response.rb +0 -60
  164. data/lib/open_api_sdk/models/operations/bulkupdatelinks_requestbody.rb +0 -27
  165. data/lib/open_api_sdk/models/operations/bulkupdatelinks_response.rb +0 -60
  166. data/lib/open_api_sdk/models/operations/color.rb +0 -24
  167. data/lib/open_api_sdk/models/operations/createdomain_requestbody.rb +0 -33
  168. data/lib/open_api_sdk/models/operations/createdomain_response.rb +0 -60
  169. data/lib/open_api_sdk/models/operations/createlink_requestbody.rb +0 -95
  170. data/lib/open_api_sdk/models/operations/createlink_response.rb +0 -60
  171. data/lib/open_api_sdk/models/operations/createtag_requestbody.rb +0 -32
  172. data/lib/open_api_sdk/models/operations/createtag_response.rb +0 -60
  173. data/lib/open_api_sdk/models/operations/data.rb +0 -83
  174. data/lib/open_api_sdk/models/operations/deletedomain_request.rb +0 -24
  175. data/lib/open_api_sdk/models/operations/deletedomain_response.rb +0 -60
  176. data/lib/open_api_sdk/models/operations/deletedomain_responsebody.rb +0 -24
  177. data/lib/open_api_sdk/models/operations/deletelink_request.rb +0 -24
  178. data/lib/open_api_sdk/models/operations/deletelink_response.rb +0 -60
  179. data/lib/open_api_sdk/models/operations/deletelink_responsebody.rb +0 -24
  180. data/lib/open_api_sdk/models/operations/event.rb +0 -21
  181. data/lib/open_api_sdk/models/operations/getlinkinfo_request.rb +0 -33
  182. data/lib/open_api_sdk/models/operations/getlinkinfo_response.rb +0 -60
  183. data/lib/open_api_sdk/models/operations/getlinks_request.rb +0 -51
  184. data/lib/open_api_sdk/models/operations/getlinks_response.rb +0 -60
  185. data/lib/open_api_sdk/models/operations/getlinkscount_request.rb +0 -48
  186. data/lib/open_api_sdk/models/operations/getlinkscount_response.rb +0 -60
  187. data/lib/open_api_sdk/models/operations/getmetatags_request.rb +0 -24
  188. data/lib/open_api_sdk/models/operations/getmetatags_response.rb +0 -33
  189. data/lib/open_api_sdk/models/operations/getmetatags_responsebody.rb +0 -30
  190. data/lib/open_api_sdk/models/operations/getqrcode_request.rb +0 -39
  191. data/lib/open_api_sdk/models/operations/getqrcode_response.rb +0 -60
  192. data/lib/open_api_sdk/models/operations/gettags_response.rb +0 -60
  193. data/lib/open_api_sdk/models/operations/getworkspace_request.rb +0 -24
  194. data/lib/open_api_sdk/models/operations/getworkspace_response.rb +0 -60
  195. data/lib/open_api_sdk/models/operations/groupby.rb +0 -28
  196. data/lib/open_api_sdk/models/operations/interval.rb +0 -25
  197. data/lib/open_api_sdk/models/operations/level.rb +0 -21
  198. data/lib/open_api_sdk/models/operations/listdomains_response.rb +0 -60
  199. data/lib/open_api_sdk/models/operations/paymentprocessor.rb +0 -20
  200. data/lib/open_api_sdk/models/operations/requestbody.rb +0 -95
  201. data/lib/open_api_sdk/models/operations/retrieveanalytics_request.rb +0 -81
  202. data/lib/open_api_sdk/models/operations/retrieveanalytics_response.rb +0 -60
  203. data/lib/open_api_sdk/models/operations/sort.rb +0 -20
  204. data/lib/open_api_sdk/models/operations/trackcustomer_requestbody.rb +0 -33
  205. data/lib/open_api_sdk/models/operations/trackcustomer_response.rb +0 -60
  206. data/lib/open_api_sdk/models/operations/trackcustomer_responsebody.rb +0 -33
  207. data/lib/open_api_sdk/models/operations/tracklead_requestbody.rb +0 -42
  208. data/lib/open_api_sdk/models/operations/tracklead_response.rb +0 -60
  209. data/lib/open_api_sdk/models/operations/tracklead_responsebody.rb +0 -42
  210. data/lib/open_api_sdk/models/operations/tracksale_requestbody.rb +0 -42
  211. data/lib/open_api_sdk/models/operations/tracksale_response.rb +0 -60
  212. data/lib/open_api_sdk/models/operations/tracksale_responsebody.rb +0 -42
  213. data/lib/open_api_sdk/models/operations/updatedomain_request.rb +0 -27
  214. data/lib/open_api_sdk/models/operations/updatedomain_requestbody.rb +0 -33
  215. data/lib/open_api_sdk/models/operations/updatedomain_response.rb +0 -60
  216. data/lib/open_api_sdk/models/operations/updatelink_request.rb +0 -27
  217. data/lib/open_api_sdk/models/operations/updatelink_requestbody.rb +0 -95
  218. data/lib/open_api_sdk/models/operations/updatelink_response.rb +0 -60
  219. data/lib/open_api_sdk/models/operations/updatetag_color.rb +0 -24
  220. data/lib/open_api_sdk/models/operations/updatetag_request.rb +0 -27
  221. data/lib/open_api_sdk/models/operations/updatetag_requestbody.rb +0 -32
  222. data/lib/open_api_sdk/models/operations/updatetag_response.rb +0 -60
  223. data/lib/open_api_sdk/models/operations/updateworkspace_request.rb +0 -27
  224. data/lib/open_api_sdk/models/operations/updateworkspace_requestbody.rb +0 -27
  225. data/lib/open_api_sdk/models/operations/updateworkspace_response.rb +0 -60
  226. data/lib/open_api_sdk/models/operations/upsertlink_requestbody.rb +0 -95
  227. data/lib/open_api_sdk/models/operations/upsertlink_response.rb +0 -60
  228. data/lib/open_api_sdk/models/operations.rb +0 -74
  229. data/lib/open_api_sdk/models/shared/badrequest.rb +0 -24
  230. data/lib/open_api_sdk/models/shared/code.rb +0 -18
  231. data/lib/open_api_sdk/models/shared/color.rb +0 -24
  232. data/lib/open_api_sdk/models/shared/conflict.rb +0 -24
  233. data/lib/open_api_sdk/models/shared/conflict_code.rb +0 -18
  234. data/lib/open_api_sdk/models/shared/conflict_error.rb +0 -30
  235. data/lib/open_api_sdk/models/shared/countrycode.rb +0 -267
  236. data/lib/open_api_sdk/models/shared/domains.rb +0 -27
  237. data/lib/open_api_sdk/models/shared/domainschema.rb +0 -48
  238. data/lib/open_api_sdk/models/shared/error.rb +0 -30
  239. data/lib/open_api_sdk/models/shared/forbidden.rb +0 -24
  240. data/lib/open_api_sdk/models/shared/forbidden_code.rb +0 -18
  241. data/lib/open_api_sdk/models/shared/forbidden_error.rb +0 -30
  242. data/lib/open_api_sdk/models/shared/geo.rb +0 -771
  243. data/lib/open_api_sdk/models/shared/internalservererror.rb +0 -24
  244. data/lib/open_api_sdk/models/shared/internalservererror_code.rb +0 -18
  245. data/lib/open_api_sdk/models/shared/internalservererror_error.rb +0 -30
  246. data/lib/open_api_sdk/models/shared/inviteexpired.rb +0 -24
  247. data/lib/open_api_sdk/models/shared/inviteexpired_code.rb +0 -18
  248. data/lib/open_api_sdk/models/shared/inviteexpired_error.rb +0 -30
  249. data/lib/open_api_sdk/models/shared/linkgeotargeting.rb +0 -771
  250. data/lib/open_api_sdk/models/shared/linkschema.rb +0 -142
  251. data/lib/open_api_sdk/models/shared/notfound.rb +0 -24
  252. data/lib/open_api_sdk/models/shared/notfound_code.rb +0 -18
  253. data/lib/open_api_sdk/models/shared/notfound_error.rb +0 -30
  254. data/lib/open_api_sdk/models/shared/plan.rb +0 -24
  255. data/lib/open_api_sdk/models/shared/ratelimitexceeded.rb +0 -24
  256. data/lib/open_api_sdk/models/shared/ratelimitexceeded_code.rb +0 -18
  257. data/lib/open_api_sdk/models/shared/ratelimitexceeded_error.rb +0 -30
  258. data/lib/open_api_sdk/models/shared/role.rb +0 -19
  259. data/lib/open_api_sdk/models/shared/security.rb +0 -24
  260. data/lib/open_api_sdk/models/shared/tagschema.rb +0 -30
  261. data/lib/open_api_sdk/models/shared/unauthorized.rb +0 -24
  262. data/lib/open_api_sdk/models/shared/unauthorized_code.rb +0 -18
  263. data/lib/open_api_sdk/models/shared/unauthorized_error.rb +0 -30
  264. data/lib/open_api_sdk/models/shared/unprocessableentity.rb +0 -24
  265. data/lib/open_api_sdk/models/shared/unprocessableentity_code.rb +0 -18
  266. data/lib/open_api_sdk/models/shared/unprocessableentity_error.rb +0 -30
  267. data/lib/open_api_sdk/models/shared/users.rb +0 -24
  268. data/lib/open_api_sdk/models/shared/workspaceschema.rb +0 -81
  269. data/lib/open_api_sdk/models/shared.rb +0 -49
  270. data/lib/open_api_sdk/qr_codes.rb +0 -97
  271. data/lib/open_api_sdk/sdkconfiguration.rb +0 -52
  272. data/lib/open_api_sdk/tags.rb +0 -272
  273. data/lib/open_api_sdk/track.rb +0 -276
  274. data/lib/open_api_sdk/utils/metadata_fields.rb +0 -150
  275. data/lib/open_api_sdk/utils/t.rb +0 -59
  276. data/lib/open_api_sdk/utils/utils.rb +0 -772
  277. data/lib/open_api_sdk/workspaces.rb +0 -192
@@ -0,0 +1,588 @@
1
+ /*
2
+ ** $Id: ltable.c,v 2.32 2006/01/18 11:49:02 roberto Exp $
3
+ ** Lua tables (hash)
4
+ ** See Copyright Notice in lua.h
5
+ */
6
+
7
+
8
+ /*
9
+ ** Implementation of tables (aka arrays, objects, or hash tables).
10
+ ** Tables keep its elements in two parts: an array part and a hash part.
11
+ ** Non-negative integer keys are all candidates to be kept in the array
12
+ ** part. The actual size of the array is the largest `n' such that at
13
+ ** least half the slots between 0 and n are in use.
14
+ ** Hash uses a mix of chained scatter table with Brent's variation.
15
+ ** A main invariant of these tables is that, if an element is not
16
+ ** in its main position (i.e. the `original' position that its hash gives
17
+ ** to it), then the colliding element is in its own main position.
18
+ ** Hence even when the load factor reaches 100%, performance remains good.
19
+ */
20
+
21
+ #include <math.h>
22
+ #include <string.h>
23
+
24
+ #define ltable_c
25
+ #define LUA_CORE
26
+
27
+ #include "lua.h"
28
+
29
+ #include "ldebug.h"
30
+ #include "ldo.h"
31
+ #include "lgc.h"
32
+ #include "lmem.h"
33
+ #include "lobject.h"
34
+ #include "lstate.h"
35
+ #include "ltable.h"
36
+
37
+
38
+ /*
39
+ ** max size of array part is 2^MAXBITS
40
+ */
41
+ #if LUAI_BITSINT > 26
42
+ #define MAXBITS 26
43
+ #else
44
+ #define MAXBITS (LUAI_BITSINT-2)
45
+ #endif
46
+
47
+ #define MAXASIZE (1 << MAXBITS)
48
+
49
+
50
+ #define hashpow2(t,n) (gnode(t, lmod((n), sizenode(t))))
51
+
52
+ #define hashstr(t,str) hashpow2(t, (str)->tsv.hash)
53
+ #define hashboolean(t,p) hashpow2(t, p)
54
+
55
+
56
+ /*
57
+ ** for some types, it is better to avoid modulus by power of 2, as
58
+ ** they tend to have many 2 factors.
59
+ */
60
+ #define hashmod(t,n) (gnode(t, ((n) % ((sizenode(t)-1)|1))))
61
+
62
+
63
+ #define hashpointer(t,p) hashmod(t, IntPoint(p))
64
+
65
+
66
+ /*
67
+ ** number of ints inside a lua_Number
68
+ */
69
+ #define numints cast_int(sizeof(lua_Number)/sizeof(int))
70
+
71
+
72
+
73
+ #define dummynode (&dummynode_)
74
+
75
+ static const Node dummynode_ = {
76
+ {{NULL}, LUA_TNIL}, /* value */
77
+ {{{NULL}, LUA_TNIL, NULL}} /* key */
78
+ };
79
+
80
+
81
+ /*
82
+ ** hash for lua_Numbers
83
+ */
84
+ static Node *hashnum (const Table *t, lua_Number n) {
85
+ unsigned int a[numints];
86
+ int i;
87
+ n += 1; /* normalize number (avoid -0) */
88
+ lua_assert(sizeof(a) <= sizeof(n));
89
+ memcpy(a, &n, sizeof(a));
90
+ for (i = 1; i < numints; i++) a[0] += a[i];
91
+ return hashmod(t, a[0]);
92
+ }
93
+
94
+
95
+
96
+ /*
97
+ ** returns the `main' position of an element in a table (that is, the index
98
+ ** of its hash value)
99
+ */
100
+ static Node *mainposition (const Table *t, const TValue *key) {
101
+ switch (ttype(key)) {
102
+ case LUA_TNUMBER:
103
+ return hashnum(t, nvalue(key));
104
+ case LUA_TSTRING:
105
+ return hashstr(t, rawtsvalue(key));
106
+ case LUA_TBOOLEAN:
107
+ return hashboolean(t, bvalue(key));
108
+ case LUA_TLIGHTUSERDATA:
109
+ return hashpointer(t, pvalue(key));
110
+ default:
111
+ return hashpointer(t, gcvalue(key));
112
+ }
113
+ }
114
+
115
+
116
+ /*
117
+ ** returns the index for `key' if `key' is an appropriate key to live in
118
+ ** the array part of the table, -1 otherwise.
119
+ */
120
+ static int arrayindex (const TValue *key) {
121
+ if (ttisnumber(key)) {
122
+ lua_Number n = nvalue(key);
123
+ int k;
124
+ lua_number2int(k, n);
125
+ if (luai_numeq(cast_num(k), n))
126
+ return k;
127
+ }
128
+ return -1; /* `key' did not match some condition */
129
+ }
130
+
131
+
132
+ /*
133
+ ** returns the index of a `key' for table traversals. First goes all
134
+ ** elements in the array part, then elements in the hash part. The
135
+ ** beginning of a traversal is signalled by -1.
136
+ */
137
+ static int findindex (lua_State *L, Table *t, StkId key) {
138
+ int i;
139
+ if (ttisnil(key)) return -1; /* first iteration */
140
+ i = arrayindex(key);
141
+ if (0 < i && i <= t->sizearray) /* is `key' inside array part? */
142
+ return i-1; /* yes; that's the index (corrected to C) */
143
+ else {
144
+ Node *n = mainposition(t, key);
145
+ do { /* check whether `key' is somewhere in the chain */
146
+ /* key may be dead already, but it is ok to use it in `next' */
147
+ if (luaO_rawequalObj(key2tval(n), key) ||
148
+ (ttype(gkey(n)) == LUA_TDEADKEY && iscollectable(key) &&
149
+ gcvalue(gkey(n)) == gcvalue(key))) {
150
+ i = cast_int(n - gnode(t, 0)); /* key index in hash table */
151
+ /* hash elements are numbered after array ones */
152
+ return i + t->sizearray;
153
+ }
154
+ else n = gnext(n);
155
+ } while (n);
156
+ luaG_runerror(L, "invalid key to " LUA_QL("next")); /* key not found */
157
+ return 0; /* to avoid warnings */
158
+ }
159
+ }
160
+
161
+
162
+ int luaH_next (lua_State *L, Table *t, StkId key) {
163
+ int i = findindex(L, t, key); /* find original element */
164
+ for (i++; i < t->sizearray; i++) { /* try first array part */
165
+ if (!ttisnil(&t->array[i])) { /* a non-nil value? */
166
+ setnvalue(key, cast_num(i+1));
167
+ setobj2s(L, key+1, &t->array[i]);
168
+ return 1;
169
+ }
170
+ }
171
+ for (i -= t->sizearray; i < sizenode(t); i++) { /* then hash part */
172
+ if (!ttisnil(gval(gnode(t, i)))) { /* a non-nil value? */
173
+ setobj2s(L, key, key2tval(gnode(t, i)));
174
+ setobj2s(L, key+1, gval(gnode(t, i)));
175
+ return 1;
176
+ }
177
+ }
178
+ return 0; /* no more elements */
179
+ }
180
+
181
+
182
+ /*
183
+ ** {=============================================================
184
+ ** Rehash
185
+ ** ==============================================================
186
+ */
187
+
188
+
189
+ static int computesizes (int nums[], int *narray) {
190
+ int i;
191
+ int twotoi; /* 2^i */
192
+ int a = 0; /* number of elements smaller than 2^i */
193
+ int na = 0; /* number of elements to go to array part */
194
+ int n = 0; /* optimal size for array part */
195
+ for (i = 0, twotoi = 1; twotoi/2 < *narray; i++, twotoi *= 2) {
196
+ if (nums[i] > 0) {
197
+ a += nums[i];
198
+ if (a > twotoi/2) { /* more than half elements present? */
199
+ n = twotoi; /* optimal size (till now) */
200
+ na = a; /* all elements smaller than n will go to array part */
201
+ }
202
+ }
203
+ if (a == *narray) break; /* all elements already counted */
204
+ }
205
+ *narray = n;
206
+ lua_assert(*narray/2 <= na && na <= *narray);
207
+ return na;
208
+ }
209
+
210
+
211
+ static int countint (const TValue *key, int *nums) {
212
+ int k = arrayindex(key);
213
+ if (0 < k && k <= MAXASIZE) { /* is `key' an appropriate array index? */
214
+ nums[ceillog2(k)]++; /* count as such */
215
+ return 1;
216
+ }
217
+ else
218
+ return 0;
219
+ }
220
+
221
+
222
+ static int numusearray (const Table *t, int *nums) {
223
+ int lg;
224
+ int ttlg; /* 2^lg */
225
+ int ause = 0; /* summation of `nums' */
226
+ int i = 1; /* count to traverse all array keys */
227
+ for (lg=0, ttlg=1; lg<=MAXBITS; lg++, ttlg*=2) { /* for each slice */
228
+ int lc = 0; /* counter */
229
+ int lim = ttlg;
230
+ if (lim > t->sizearray) {
231
+ lim = t->sizearray; /* adjust upper limit */
232
+ if (i > lim)
233
+ break; /* no more elements to count */
234
+ }
235
+ /* count elements in range (2^(lg-1), 2^lg] */
236
+ for (; i <= lim; i++) {
237
+ if (!ttisnil(&t->array[i-1]))
238
+ lc++;
239
+ }
240
+ nums[lg] += lc;
241
+ ause += lc;
242
+ }
243
+ return ause;
244
+ }
245
+
246
+
247
+ static int numusehash (const Table *t, int *nums, int *pnasize) {
248
+ int totaluse = 0; /* total number of elements */
249
+ int ause = 0; /* summation of `nums' */
250
+ int i = sizenode(t);
251
+ while (i--) {
252
+ Node *n = &t->node[i];
253
+ if (!ttisnil(gval(n))) {
254
+ ause += countint(key2tval(n), nums);
255
+ totaluse++;
256
+ }
257
+ }
258
+ *pnasize += ause;
259
+ return totaluse;
260
+ }
261
+
262
+
263
+ static void setarrayvector (lua_State *L, Table *t, int size) {
264
+ int i;
265
+ luaM_reallocvector(L, t->array, t->sizearray, size, TValue);
266
+ for (i=t->sizearray; i<size; i++)
267
+ setnilvalue(&t->array[i]);
268
+ t->sizearray = size;
269
+ }
270
+
271
+
272
+ static void setnodevector (lua_State *L, Table *t, int size) {
273
+ int lsize;
274
+ if (size == 0) { /* no elements to hash part? */
275
+ t->node = cast(Node *, dummynode); /* use common `dummynode' */
276
+ lsize = 0;
277
+ }
278
+ else {
279
+ int i;
280
+ lsize = ceillog2(size);
281
+ if (lsize > MAXBITS)
282
+ luaG_runerror(L, "table overflow");
283
+ size = twoto(lsize);
284
+ t->node = luaM_newvector(L, size, Node);
285
+ for (i=0; i<size; i++) {
286
+ Node *n = gnode(t, i);
287
+ gnext(n) = NULL;
288
+ setnilvalue(gkey(n));
289
+ setnilvalue(gval(n));
290
+ }
291
+ }
292
+ t->lsizenode = cast_byte(lsize);
293
+ t->lastfree = gnode(t, size); /* all positions are free */
294
+ }
295
+
296
+
297
+ static void resize (lua_State *L, Table *t, int nasize, int nhsize) {
298
+ int i;
299
+ int oldasize = t->sizearray;
300
+ int oldhsize = t->lsizenode;
301
+ Node *nold = t->node; /* save old hash ... */
302
+ if (nasize > oldasize) /* array part must grow? */
303
+ setarrayvector(L, t, nasize);
304
+ /* create new hash part with appropriate size */
305
+ setnodevector(L, t, nhsize);
306
+ if (nasize < oldasize) { /* array part must shrink? */
307
+ t->sizearray = nasize;
308
+ /* re-insert elements from vanishing slice */
309
+ for (i=nasize; i<oldasize; i++) {
310
+ if (!ttisnil(&t->array[i]))
311
+ setobjt2t(L, luaH_setnum(L, t, i+1), &t->array[i]);
312
+ }
313
+ /* shrink array */
314
+ luaM_reallocvector(L, t->array, oldasize, nasize, TValue);
315
+ }
316
+ /* re-insert elements from hash part */
317
+ for (i = twoto(oldhsize) - 1; i >= 0; i--) {
318
+ Node *old = nold+i;
319
+ if (!ttisnil(gval(old)))
320
+ setobjt2t(L, luaH_set(L, t, key2tval(old)), gval(old));
321
+ }
322
+ if (nold != dummynode)
323
+ luaM_freearray(L, nold, twoto(oldhsize), Node); /* free old array */
324
+ }
325
+
326
+
327
+ void luaH_resizearray (lua_State *L, Table *t, int nasize) {
328
+ int nsize = (t->node == dummynode) ? 0 : sizenode(t);
329
+ resize(L, t, nasize, nsize);
330
+ }
331
+
332
+
333
+ static void rehash (lua_State *L, Table *t, const TValue *ek) {
334
+ int nasize, na;
335
+ int nums[MAXBITS+1]; /* nums[i] = number of keys between 2^(i-1) and 2^i */
336
+ int i;
337
+ int totaluse;
338
+ for (i=0; i<=MAXBITS; i++) nums[i] = 0; /* reset counts */
339
+ nasize = numusearray(t, nums); /* count keys in array part */
340
+ totaluse = nasize; /* all those keys are integer keys */
341
+ totaluse += numusehash(t, nums, &nasize); /* count keys in hash part */
342
+ /* count extra key */
343
+ nasize += countint(ek, nums);
344
+ totaluse++;
345
+ /* compute new size for array part */
346
+ na = computesizes(nums, &nasize);
347
+ /* resize the table to new computed sizes */
348
+ resize(L, t, nasize, totaluse - na);
349
+ }
350
+
351
+
352
+
353
+ /*
354
+ ** }=============================================================
355
+ */
356
+
357
+
358
+ Table *luaH_new (lua_State *L, int narray, int nhash) {
359
+ Table *t = luaM_new(L, Table);
360
+ luaC_link(L, obj2gco(t), LUA_TTABLE);
361
+ t->metatable = NULL;
362
+ t->flags = cast_byte(~0);
363
+ /* temporary values (kept only if some malloc fails) */
364
+ t->array = NULL;
365
+ t->sizearray = 0;
366
+ t->lsizenode = 0;
367
+ t->node = cast(Node *, dummynode);
368
+ setarrayvector(L, t, narray);
369
+ setnodevector(L, t, nhash);
370
+ return t;
371
+ }
372
+
373
+
374
+ void luaH_free (lua_State *L, Table *t) {
375
+ if (t->node != dummynode)
376
+ luaM_freearray(L, t->node, sizenode(t), Node);
377
+ luaM_freearray(L, t->array, t->sizearray, TValue);
378
+ luaM_free(L, t);
379
+ }
380
+
381
+
382
+ static Node *getfreepos (Table *t) {
383
+ while (t->lastfree-- > t->node) {
384
+ if (ttisnil(gkey(t->lastfree)))
385
+ return t->lastfree;
386
+ }
387
+ return NULL; /* could not find a free place */
388
+ }
389
+
390
+
391
+
392
+ /*
393
+ ** inserts a new key into a hash table; first, check whether key's main
394
+ ** position is free. If not, check whether colliding node is in its main
395
+ ** position or not: if it is not, move colliding node to an empty place and
396
+ ** put new key in its main position; otherwise (colliding node is in its main
397
+ ** position), new key goes to an empty position.
398
+ */
399
+ static TValue *newkey (lua_State *L, Table *t, const TValue *key) {
400
+ Node *mp = mainposition(t, key);
401
+ if (!ttisnil(gval(mp)) || mp == dummynode) {
402
+ Node *othern;
403
+ Node *n = getfreepos(t); /* get a free place */
404
+ if (n == NULL) { /* cannot find a free place? */
405
+ rehash(L, t, key); /* grow table */
406
+ return luaH_set(L, t, key); /* re-insert key into grown table */
407
+ }
408
+ lua_assert(n != dummynode);
409
+ othern = mainposition(t, key2tval(mp));
410
+ if (othern != mp) { /* is colliding node out of its main position? */
411
+ /* yes; move colliding node into free position */
412
+ while (gnext(othern) != mp) othern = gnext(othern); /* find previous */
413
+ gnext(othern) = n; /* redo the chain with `n' in place of `mp' */
414
+ *n = *mp; /* copy colliding node into free pos. (mp->next also goes) */
415
+ gnext(mp) = NULL; /* now `mp' is free */
416
+ setnilvalue(gval(mp));
417
+ }
418
+ else { /* colliding node is in its own main position */
419
+ /* new node will go into free position */
420
+ gnext(n) = gnext(mp); /* chain new position */
421
+ gnext(mp) = n;
422
+ mp = n;
423
+ }
424
+ }
425
+ gkey(mp)->value = key->value; gkey(mp)->tt = key->tt;
426
+ luaC_barriert(L, t, key);
427
+ lua_assert(ttisnil(gval(mp)));
428
+ return gval(mp);
429
+ }
430
+
431
+
432
+ /*
433
+ ** search function for integers
434
+ */
435
+ const TValue *luaH_getnum (Table *t, int key) {
436
+ /* (1 <= key && key <= t->sizearray) */
437
+ if (cast(unsigned int, key-1) < cast(unsigned int, t->sizearray))
438
+ return &t->array[key-1];
439
+ else {
440
+ lua_Number nk = cast_num(key);
441
+ Node *n = hashnum(t, nk);
442
+ do { /* check whether `key' is somewhere in the chain */
443
+ if (ttisnumber(gkey(n)) && luai_numeq(nvalue(gkey(n)), nk))
444
+ return gval(n); /* that's it */
445
+ else n = gnext(n);
446
+ } while (n);
447
+ return luaO_nilobject;
448
+ }
449
+ }
450
+
451
+
452
+ /*
453
+ ** search function for strings
454
+ */
455
+ const TValue *luaH_getstr (Table *t, TString *key) {
456
+ Node *n = hashstr(t, key);
457
+ do { /* check whether `key' is somewhere in the chain */
458
+ if (ttisstring(gkey(n)) && rawtsvalue(gkey(n)) == key)
459
+ return gval(n); /* that's it */
460
+ else n = gnext(n);
461
+ } while (n);
462
+ return luaO_nilobject;
463
+ }
464
+
465
+
466
+ /*
467
+ ** main search function
468
+ */
469
+ const TValue *luaH_get (Table *t, const TValue *key) {
470
+ switch (ttype(key)) {
471
+ case LUA_TNIL: return luaO_nilobject;
472
+ case LUA_TSTRING: return luaH_getstr(t, rawtsvalue(key));
473
+ case LUA_TNUMBER: {
474
+ int k;
475
+ lua_Number n = nvalue(key);
476
+ lua_number2int(k, n);
477
+ if (luai_numeq(cast_num(k), nvalue(key))) /* index is int? */
478
+ return luaH_getnum(t, k); /* use specialized version */
479
+ /* else go through */
480
+ }
481
+ default: {
482
+ Node *n = mainposition(t, key);
483
+ do { /* check whether `key' is somewhere in the chain */
484
+ if (luaO_rawequalObj(key2tval(n), key))
485
+ return gval(n); /* that's it */
486
+ else n = gnext(n);
487
+ } while (n);
488
+ return luaO_nilobject;
489
+ }
490
+ }
491
+ }
492
+
493
+
494
+ TValue *luaH_set (lua_State *L, Table *t, const TValue *key) {
495
+ const TValue *p = luaH_get(t, key);
496
+ t->flags = 0;
497
+ if (p != luaO_nilobject)
498
+ return cast(TValue *, p);
499
+ else {
500
+ if (ttisnil(key)) luaG_runerror(L, "table index is nil");
501
+ else if (ttisnumber(key) && luai_numisnan(nvalue(key)))
502
+ luaG_runerror(L, "table index is NaN");
503
+ return newkey(L, t, key);
504
+ }
505
+ }
506
+
507
+
508
+ TValue *luaH_setnum (lua_State *L, Table *t, int key) {
509
+ const TValue *p = luaH_getnum(t, key);
510
+ if (p != luaO_nilobject)
511
+ return cast(TValue *, p);
512
+ else {
513
+ TValue k;
514
+ setnvalue(&k, cast_num(key));
515
+ return newkey(L, t, &k);
516
+ }
517
+ }
518
+
519
+
520
+ TValue *luaH_setstr (lua_State *L, Table *t, TString *key) {
521
+ const TValue *p = luaH_getstr(t, key);
522
+ if (p != luaO_nilobject)
523
+ return cast(TValue *, p);
524
+ else {
525
+ TValue k;
526
+ setsvalue(L, &k, key);
527
+ return newkey(L, t, &k);
528
+ }
529
+ }
530
+
531
+
532
+ static int unbound_search (Table *t, unsigned int j) {
533
+ unsigned int i = j; /* i is zero or a present index */
534
+ j++;
535
+ /* find `i' and `j' such that i is present and j is not */
536
+ while (!ttisnil(luaH_getnum(t, j))) {
537
+ i = j;
538
+ j *= 2;
539
+ if (j > cast(unsigned int, MAX_INT)) { /* overflow? */
540
+ /* table was built with bad purposes: resort to linear search */
541
+ i = 1;
542
+ while (!ttisnil(luaH_getnum(t, i))) i++;
543
+ return i - 1;
544
+ }
545
+ }
546
+ /* now do a binary search between them */
547
+ while (j - i > 1) {
548
+ unsigned int m = (i+j)/2;
549
+ if (ttisnil(luaH_getnum(t, m))) j = m;
550
+ else i = m;
551
+ }
552
+ return i;
553
+ }
554
+
555
+
556
+ /*
557
+ ** Try to find a boundary in table `t'. A `boundary' is an integer index
558
+ ** such that t[i] is non-nil and t[i+1] is nil (and 0 if t[1] is nil).
559
+ */
560
+ int luaH_getn (Table *t) {
561
+ unsigned int j = t->sizearray;
562
+ if (j > 0 && ttisnil(&t->array[j - 1])) {
563
+ /* there is a boundary in the array part: (binary) search for it */
564
+ unsigned int i = 0;
565
+ while (j - i > 1) {
566
+ unsigned int m = (i+j)/2;
567
+ if (ttisnil(&t->array[m - 1])) j = m;
568
+ else i = m;
569
+ }
570
+ return i;
571
+ }
572
+ /* else must find a boundary in hash part */
573
+ else if (t->node == dummynode) /* hash part is empty? */
574
+ return j; /* that is easy... */
575
+ else return unbound_search(t, j);
576
+ }
577
+
578
+
579
+
580
+ #if defined(LUA_DEBUG)
581
+
582
+ Node *luaH_mainposition (const Table *t, const TValue *key) {
583
+ return mainposition(t, key);
584
+ }
585
+
586
+ int luaH_isdummy (Node *n) { return n == dummynode; }
587
+
588
+ #endif
@@ -0,0 +1,40 @@
1
+ /*
2
+ ** $Id: ltable.h,v 2.10 2006/01/10 13:13:06 roberto Exp $
3
+ ** Lua tables (hash)
4
+ ** See Copyright Notice in lua.h
5
+ */
6
+
7
+ #ifndef ltable_h
8
+ #define ltable_h
9
+
10
+ #include "lobject.h"
11
+
12
+
13
+ #define gnode(t,i) (&(t)->node[i])
14
+ #define gkey(n) (&(n)->i_key.nk)
15
+ #define gval(n) (&(n)->i_val)
16
+ #define gnext(n) ((n)->i_key.nk.next)
17
+
18
+ #define key2tval(n) (&(n)->i_key.tvk)
19
+
20
+
21
+ LUAI_FUNC const TValue *luaH_getnum (Table *t, int key);
22
+ LUAI_FUNC TValue *luaH_setnum (lua_State *L, Table *t, int key);
23
+ LUAI_FUNC const TValue *luaH_getstr (Table *t, TString *key);
24
+ LUAI_FUNC TValue *luaH_setstr (lua_State *L, Table *t, TString *key);
25
+ LUAI_FUNC const TValue *luaH_get (Table *t, const TValue *key);
26
+ LUAI_FUNC TValue *luaH_set (lua_State *L, Table *t, const TValue *key);
27
+ LUAI_FUNC Table *luaH_new (lua_State *L, int narray, int lnhash);
28
+ LUAI_FUNC void luaH_resizearray (lua_State *L, Table *t, int nasize);
29
+ LUAI_FUNC void luaH_free (lua_State *L, Table *t);
30
+ LUAI_FUNC int luaH_next (lua_State *L, Table *t, StkId key);
31
+ LUAI_FUNC int luaH_getn (Table *t);
32
+
33
+
34
+ #if defined(LUA_DEBUG)
35
+ LUAI_FUNC Node *luaH_mainposition (const Table *t, const TValue *key);
36
+ LUAI_FUNC int luaH_isdummy (Node *n);
37
+ #endif
38
+
39
+
40
+ #endif