mirror of
https://github.com/neovim/neovim.git
synced 2025-01-01 17:23:36 -07:00
d699ccfb0c
This commit will hopefully allow the cimport method to be used just as one would use #inclue <header.h> in C. It follows the following method: 1. create a pseudoheader file that #include's all the requested header files 2. runs the pseudoheader through the C preprocessor (it will try various compilers if available on the system). 3. runs the preprocessed file through a C formatter, which attempts to group statements on one line. For example, a struct definition that was formerly on several lines will take just one line after formatting. This is done so that unique declarations can be detected. Duplicates are thus easy to remove. 4. remove lines that are too complex for the LuaJIT C parser (such as: Objective-C block syntax, crazy enums defined on linux, ...) 5. remove duplicate declarations 6. pass result to ffi.cdef
73 lines
1.7 KiB
Plaintext
73 lines
1.7 KiB
Plaintext
-- a set class for fast union/diff, can always return a table with the lines
|
|
-- in the same relative order in which they were added by calling the
|
|
-- to_table method. It does this by keeping two lua tables that mirror each
|
|
-- other:
|
|
-- 1) index => item
|
|
-- 2) item => index
|
|
class Set
|
|
new: (items) =>
|
|
if type(items) == 'table'
|
|
tempset = Set()
|
|
tempset\union_table(items)
|
|
@tbl = tempset\raw_tbl!
|
|
@items = tempset\raw_items!
|
|
@nelem = tempset\size!
|
|
else
|
|
@tbl = {}
|
|
@items = {}
|
|
@nelem = 0
|
|
|
|
-- adds the argument Set to this Set
|
|
union: (other) =>
|
|
for e in other\iterator!
|
|
@add(e)
|
|
|
|
-- adds the argument table to this Set
|
|
union_table: (t) =>
|
|
for k,v in pairs(t)
|
|
@add(v)
|
|
|
|
-- substracts the argument Set from this Set
|
|
diff: (other) =>
|
|
if other\size! > @size!
|
|
-- this set is smaller than the other set
|
|
for e in @iterator!
|
|
if other\contains(e)
|
|
@remove(e)
|
|
else
|
|
-- this set is larger than the other set
|
|
for e in other\iterator!
|
|
if @items[e]
|
|
@remove(e)
|
|
|
|
add: (it) =>
|
|
if not @contains(it)
|
|
idx = #@tbl + 1
|
|
@tbl[idx] = it
|
|
@items[it] = idx
|
|
@nelem += 1
|
|
|
|
remove: (it) =>
|
|
if @contains(it)
|
|
idx = @items[it]
|
|
@tbl[idx] = nil
|
|
@items[it] = nil
|
|
@nelem -= 1
|
|
|
|
contains: (it) =>
|
|
@items[it] or false
|
|
|
|
size: => @nelem
|
|
raw_tbl: => @tbl
|
|
raw_items: => @items
|
|
iterator: => pairs(@items)
|
|
|
|
to_table: =>
|
|
-- there might be gaps in @tbl, so we have to be careful and sort first
|
|
keys = [idx for idx, _ in pairs(@tbl)]
|
|
table.sort(keys)
|
|
copy = [@tbl[idx] for idx in *keys]
|
|
copy
|
|
|
|
return Set
|