Giter Site home page Giter Site logo

effil's Introduction

Effil

Generic badge Generic badge Generic badge Generic badge

LuaRocks license Join the chat at https://gitter.im/effil-chat/Lobby

Linux + MacOS Windows
build & run tests Build status

Effil is a multithreading library for Lua. It allows to spawn native threads and safe data exchange. Effil has been designed to provide clear and simple API for lua developers.

Effil supports lua 5.1, 5.2, 5.3 and LuaJIT. Requires C++14 compiler compliance. Tested with GCC 4.9+, clang 3.8 and Visual Studio 2015.

Table Of Contents

How to install

Build from src on Linux and Mac

  1. git clone --recursive https://github.com/effil/effil effil
  2. cd effil && mkdir build && cd build
  3. cmake .. && make install
  4. Copy effil.so to your project.

From lua rocks

luarocks install effil

Quick guide

As you may know there are not much script languages with real multithreading support (Lua/Python/Ruby and etc has global interpreter lock aka GIL). Effil solves this problem by running independent Lua VM instances in separate native threads and provides robust communicating primitives for creating threads and data sharing.

Effil library provides three major abstractions:

  1. effil.thread - provides API for threads management.
  2. effil.table - provides API for tables management. Tables can be shared between threads.
  3. effil.channel - provides First-In-First-Out container for sequential data exchange.

And bunch of utilities to handle threads and tables as well.

Examples

Spawn the thread

local effil = require("effil")

function bark(name)
    print(name .. " barks from another thread!")
end

-- run funtion bark in separate thread with name "Spaky"
local thr = effil.thread(bark)("Sparky")

-- wait for completion
thr:wait()

Output: Sparky barks from another thread!

Sharing data with effil.channel

local effil = require("effil")

-- channel allow to push data in one thread and pop in other
local channel = effil.channel()

-- writes some numbers to channel
local function producer(channel)
    for i = 1, 5 do
        print("push " .. i)
        channel:push(i)
    end
    channel:push(nil)
end

-- read numbers from channels
local function consumer(channel)
    local i = channel:pop()
    while i do
        print("pop " .. i)
        i = channel:pop()
    end
end

-- run producer
local thr = effil.thread(producer)(channel)

-- run consumer
consumer(channel)

thr:wait()

Output:

push 1
push 2
pop 1
pop 2
push 3
push 4
push 5
pop 3 
pop 4
pop 5

Sharing data with effil.table

effil = require("effil")

-- effil.table transfers data between threads
-- and behaves like regualr lua table
local storage = effil.table { string_field = "first value" }
storage.numeric_field = 100500
storage.function_field = function(a, b) return a + b end
storage.table_field = { fist = 1, second = 2 }

function check_shared_table(storage)
   print(storage.string_field)
   print(storage.numeric_field)
   print(storage.table_field.first)
   print(storage.table_field.second)
   return storage.function_field(1, 2)
end

local thr = effil.thread(check_shared_table)(storage)
local ret = thr:get()
print("Thread result: " .. ret)

Output:

first value
100500
1
2
Thread result: 3

Important notes

Effil allows to transmit data between threads (Lua interpreter states) using effil.channel, effil.table or directly as parameters of effil.thread.

  • Primitive types are transmitted 'as is' by copy: nil, boolean, number, string
  • Functions are dumped using lua_dump. Upvalues are captured according to the rules.
    • C functions (for which lua_iscfunction returns true) are transmitted just by a pointer using lua_tocfunction (in original lua_State) and lua_pushcfunction (in new lua_State).
      caution: in LuaJIT standard functions like tonumber are not real C function, so lua_iscfunction returns true but lua_tocfunction returns nullptr. Due to that we don't find way to transmit it between lua_States.
  • Userdata and Lua threads (coroutines) are not supported.
  • Tables are serialized to effil.table recursively. So, any Lua table becomes effil.table. Table serialization may take a lot of time for big table. Thus, it's better to put data directly to effil.table avoiding a table serialization. Let's consider 2 examples:
-- Example #1
t = {}
for i = 1, 100 do
   t[i] = i
end
shared_table = effil.table(t)

-- Example #2
t = effil.table()
for i = 1, 100 do
   t[i] = i
end

In the example #1 we create regular table, fill it and convert it to effil.table. In this case Effil needs to go through all table fields one more time. Another way is example #2 where we firstly created effil.table and after that we put data directly to effil.table. The 2nd way pretty much faster try to follow this principle.

Blocking and nonblocking operations:

All operations which use time metrics can be blocking or non blocking and use following API: (time, metric) where metric is time interval like 's' (seconds) and time is a number of intervals.

Example:

  • thread:get() - infinitely wait for thread completion.
  • thread:get(0) - non blocking get, just check is thread finished and return
  • thread:get(50, "ms") - blocking wait for 50 milliseconds.

List of available time intervals:

  • ms - milliseconds;
  • s - seconds (default);
  • m - minutes;
  • h - hours.

All blocking operations (even in non blocking mode) are interruption points. Thread hanged in such operation can be interrupted by invoking thread:cancel() method.

Example

local effil = require "effil"

local worker = effil.thread(function()
    effil.sleep(999) -- worker will hang for 999 seconds
end)()

worker:cancel(1) -- returns true, cause blocking operation was interrupted and thread was cancelled

Function's upvalues

Working with functions Effil serializes and deserializes them using lua_dump and lua_load methods. All function's upvalues are stored following the same rules as usual. If function has upvalue of unsupported type this function cannot be transmitted to Effil. You will get error in that case.

Working with function Effil can store function environment (_ENV) as well. Considering environment as a regular table Effil will store it in the same way as any other table. But it does not make sence to store global _G, so there are some specific:

  • Lua = 5.1: function environment is not stored at all (due to limitations of lua_setfenv we cannot use userdata)
  • Lua > 5.1: Effil serialize and store function environment only if it's not equal to global environment (_ENV ~= _G).

Thread cancellation and pausing

The effil.thread can be paused and cancelled using corresponding methods of thread object thread:cancel() and thread:pause().
Thread that you try to interrupt can be interrupted in two execution points: explicit and implicit.

  • Explicit points are effil.yield()

    Example of explicit interruption point

    local thread = effil.thread(function()
       while true do
          effil.yield()
       end
       -- will never reach this line
    end)()
    thread:cancel()

  • Implicit points are lua debug hook invocation which is set using lua_sethook with LUA_MASKCOUNT.
    Implicit points are optional and enabled only if thread_runner.step > 0.

    Example of implicit interruption point

    local thread_runner = effil.thread(function()
       while true do
       end
       -- will never reach this line
    end)
    thread_runner.step = 10
    thread = thread_runner()
    thread:cancel()

  • Additionally thread can be cancelled (but not paused) in any blocking or non-blocking waiting operation.

    Example

    local channel = effil.channel()
    local thread = effil.thread(function()
       channel:pop() -- thread hangs waiting infinitely
       -- will never reach this line
    end)()
    thread:cancel()

How does cancellation works?
When you cancel thread it generates lua error with message "Effil: thread is cancelled" when it reaches any interruption point. It means that you can catch this error using pcall but thread will generate new error on next interruption point.
If you want to catch your own error but pass cancellation error you can use effil.pcall().
Status of cancelled thread will be equal to cancelled only if it finished with cancellation error. It means that if you catch cancellation error thread may finished with completed status or failed status if there will be some another error.

API Reference

Thread

effil.thread is the way to create a thread. Threads can be stopped, paused, resumed and cancelled. All operation with threads can be synchronous (with optional timeout) or asynchronous. Each thread runs with its own lua state.

Use effil.table and effil.channel to transmit data over threads. See example of thread usage here.

runner = effil.thread(func)

Creates thread runner. Runner spawns new thread for each invocation.

input: func - Lua function

output: runner - thread runner object to configure and run a new thread

Thread runner

Allows to configure and run a new thread.

thread = runner(...)

Run captured function with specified arguments in separate thread and returns thread handle.

input: Any number of arguments required by captured function.

output: Thread handle object.

runner.path

Is a Lua package.path value for new state. Default value inherits package.path form parent state.

runner.cpath

Is a Lua package.cpath value for new state. Default value inherits package.cpath form parent state.

runner.step

Number of lua instructions lua between cancelation points (where thread can be stopped or paused). Default value is 200. If this values is 0 then thread uses only explicit cancelation points.

Thread handle

Thread handle provides API for interaction with thread.

status, err, stacktrace = thread:status()

Returns thread status.

output:

  • status - string values describes status of thread. Possible values are: "running", "paused", "cancelled", "completed" and "failed".
  • err - error message, if any. This value is specified only if thread status == "failed".
  • stacktrace - stacktrace of failed thread. This value is specified only if thread status == "failed".

... = thread:get(time, metric)

Waits for thread completion and returns function result or nothing in case of error.

input: Operation timeout in terms of time metrics

output: Results of captured function invocation or nothing in case of error.

thread:wait(time, metric)

Waits for thread completion and returns thread status.

input: Operation timeout in terms of time metrics

output: Returns status of thread. The output is the same as thread:status()

thread:cancel(time, metric)

Interrupts thread execution. Once this function was invoked 'cancellation' flag is set and thread can be stopped sometime in the future (even after this function call done). To be sure that thread is stopped invoke this function with infinite timeout. Cancellation of finished thread will do nothing and return true.

input: Operation timeout in terms of time metrics

output: Returns true if thread was stopped or false.

thread:pause(time, metric)

Pauses thread. Once this function was invoked 'pause' flag is set and thread can be paused sometime in the future (even after this function call done). To be sure that thread is paused invoke this function with infinite timeout.

input: Operation timeout in terms of time metrics

output: Returns true if thread was paused or false. If the thread is completed function will return false

thread:resume()

Resumes paused thread. Function resumes thread immediately if it was paused. This function does nothing for completed thread. Function has no input and output parameters.

Thread helpers

id = effil.thread_id()

Gives unique identifier.

output: returns unique string id for current thread.

effil.yield()

Explicit cancellation point. Function checks cancellation or pausing flags of current thread and if it's required it performs corresponding actions (cancel or pause thread).

effil.sleep(time, metric)

Suspend current thread.

input: time metrics arguments.

effil.hardware_threads()

Returns the number of concurrent threads supported by implementation. Basically forwards value from std::thread::hardware_concurrency.
output: number of concurrent hardware threads.

status, ... = effil.pcall(func, ...)

Works exactly the same way as standard pcall except that it will not catch thread cancellation error caused by thread:cancel() call.

input:

  • func - function to call
  • ... - arguments to pass to functions

output:

  • status - true if no error occurred, false otherwise
  • ... - in case of error return one additional result with message of error, otherwise return function call results

Table

effil.table is a way to exchange data between effil threads. It behaves almost like standard lua tables. All operations with shared table are thread safe. Shared table stores primitive types (number, boolean, string), function, table, light userdata and effil based userdata. Shared table doesn't store lua threads (coroutines) or arbitrary userdata. See examples of shared table usage here

Notes: shared tables usage

Use Shared tables with regular tables. If you want to store regular table in shared table, effil will implicitly dump origin table into new shared table. Shared tables always stores subtables as shared tables.

Use Shared tables with functions. If you store function in shared table, effil implicitly dumps this function and saves it as string (and it's upvalues). All function's upvalues will be captured according to following rules .

table = effil.table(tbl)

Creates new empty shared table.

input: tbl - is optional parameter, it can be only regular Lua table which entries will be copied to shared table.

output: new instance of empty shared table. It can be empty or not, depending on tbl content.

table[key] = value

Set a new key of table with specified value.

input:

value = table[key]

Get a value from table with specified key.

input: key - any value of supported type. See the list of supported types

output: value - any value of supported type. See the list of supported types

tbl = effil.setmetatable(tbl, mtbl)

Sets a new metatable to shared table. Similar to standard setmetatable.

input:

  • tbl should be shared table for which you want to set metatable.
  • mtbl should be regular table or shared table which will become a metatable. If it's a regular table effil will create a new shared table and copy all fields of mtbl. Set mtbl equal to nil to delete metatable from shared table.

output: just returns tbl with a new metatable value similar to standard Lua setmetatable method.

mtbl = effil.getmetatable(tbl)

Returns current metatable. Similar to standard getmetatable

input: tbl should be shared table.

output: returns metatable of specified shared table. Returned table always has type effil.table. Default metatable is nil.

tbl = effil.rawset(tbl, key, value)

Set table entry without invoking metamethod __newindex. Similar to standard rawset

input:

  • tbl is shared table.
  • key - key of table to override. The key can be of any supported type.
  • value - value to set. The value can be of any supported type.

output: returns the same shared table tbl

value = effil.rawget(tbl, key)

Gets table value without invoking metamethod __index. Similar to standard rawget

input:

  • tbl is shared table.
  • key - key of table to receive a specific value. The key can be of any supported type.

output: returns required value stored under a specified key

effil.G

Is a global predefined shared table. This table always present in any thread (any Lua state).

effil = require "effil"

function job()
   effil = require "effil"
   effil.G.key = "value"
end

effil.thread(job)():wait()
print(effil.G.key) -- will print "value"

result = effil.dump(obj)

Truns effil.table into regular Lua table.

tbl = effil.table({})
effil.type(tbl) -- 'effil.table'
effil.type(effil.dump(tbl))  -- 'table'

Channel

effil.channel is a way to sequentially exchange data between effil threads. It allows to push message from one thread and pop it from another. Channel's message is a set of values of supported types. All operations with channels are thread safe. See examples of channel usage here

channel = effil.channel(capacity)

Creates a new channel.

input: optional capacity of channel. If capacity equals to 0 or to nil size of channel is unlimited. Default capacity is 0.

output: returns a new instance of channel.

pushed = channel:push(...)

Pushes message to channel.

input: any number of values of supported types. Multiple values are considered as a single channel message so one push to channel decreases capacity by one.

output: pushed is equal to true if value(-s) fits channel capacity, false otherwise.

... = channel:pop(time, metric)

Pop message from channel. Removes value(-s) from channel and returns them. If the channel is empty wait for any value appearance.

input: waiting timeout in terms of time metrics (used only if channel is empty).

output: variable amount of values which were pushed by a single channel:push() call.

size = channel:size()

Get actual amount of messages in channel.

output: amount of messages in channel.

Garbage collector

Effil provides custom garbage collector for effil.table and effil.channel (and functions with captured upvalues). It allows safe manage cyclic references for tables and channels in multiple threads. However it may cause extra memory usage. effil.gc provides a set of method configure effil garbage collector. But, usually you don't need to configure it.

Garbage collection trigger

Garbage collector perform it's work when effil creates new shared object (table, channel and functions with captured upvalues). Each iteration GC checks amount of objects. If amount of allocated objects becomes higher then specific threshold value GC starts garbage collecting. Threshold value is calculated as previous_count * step, where previous_count - amount of objects on previous iteration (100 by default) and step is a numerical coefficient specified by user (2.0 by default).

For example: if GC step is 2.0 and amount of allocated objects is 120 (left after previous GC iteration) then GC will start to collect garbage when amount of allocated objects will be equal to240.

How to cleanup all dereferenced objects

Each thread represented as separate Lua state with own garbage collector. Thus, objects will be deleted eventually. Effil objects itself also managed by GC and uses __gc userdata metamethod as deserializer hook. To force objects deletion:

  1. invoke standard collectgarbage() in all threads.
  2. invoke effil.gc.collect() in any thread.

effil.gc.collect()

Force garbage collection, however it doesn't guarantee deletion of all effil objects.

count = effil.gc.count()

Show number of allocated shared tables and channels.

output: returns current number of allocated objects. Minimum value is 1, effil.G is always present.

old_value = effil.gc.step(new_value)

Get/set GC memory step multiplier. Default is 2.0. GC triggers collecting when amount of allocated objects growth in step times.

input: new_value is optional value of step to set. If it's nil then function will just return a current value.

output: old_value is current (if new_value == nil) or previous (if new_value ~= nil) value of step.

effil.gc.pause()

Pause GC. Garbage collecting will not be performed automatically. Function does not have any input or output

effil.gc.resume()

Resume GC. Enable automatic garbage collecting.

enabled = effil.gc.enabled()

Get GC state.

output: return true if automatic garbage collecting is enabled or false otherwise. By default returns true.

Other methods

size = effil.size(obj)

Returns number of entries in Effil object.

input: obj is shared table or channel.

output: number of entries in shared table or number of messages in channel

type = effil.type(obj)

Threads, channels and tables are userdata. Thus, type() will return userdata for any type. If you want to detect type more precisely use effil.type. It behaves like regular type(), but it can detect effil specific userdata.

input: obj is object of any type.

output: string name of type. If obj is Effil object then function returns string like effil.table in other cases it returns result of lua_typename function.

effil.type(effil.thread()) == "effil.thread"
effil.type(effil.table()) == "effil.table"
effil.type(effil.channel()) == "effil.channel"
effil.type({}) == "table"
effil.type(1) == "number"

effil's People

Contributors

andyli avatar buckaroobanzay avatar fedepell avatar iudalov avatar luizcavalcanti avatar mihacooper avatar

Stargazers

 avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar

Watchers

 avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar

effil's Issues

при попытке собрать проект в MVS 2019 выходит ошибка Ошибка C1083

Здравствуйте, пытаюсь собрать effil через cmake, скачал репозиторий, скопировал sol в папку libs, указал папку с lua 5.3.5. при попытке собрать проект в MVS 2019 выходит ошибка
Ошибка C1083 Не удается открыть файл включение: sol.hpp: No such file or directory, effil C:\projects\effil\src\cpp\utils.h

Подскажите, пожалуйста, как решить эту проблему?

Когда проект соберется он будет effil.dll или effil.lua?
Screenshot

build concurrency TCP/IP/HTTP server

Hello, this is just a question, not issue.
I find effil so powerfull, i am using openresty server (nginx+lua scripting) with high concurency capacity,
Do you thing luajit, and effil can build high concurency server, with spawn threads as requests processing base.
Regards

CI on Windows

Implement continuous integration for Windows platform, e.g. Appveyor

Lua api for shared tables

Library needs an API to work with SharedTables.

  • Implement pairs/ipairs functions. -- done
  • Analogue of setmetatable.
  • effil.table.dumpkeys()

Change thread status while waiting data from effil.channel

It would be useful to change thread status when trying to channel:pop() empty channel. Smth like:

local channel = effil.channel()
function consumer() 
  local data = channel:pop()
end

local thread = effil.thread(consumer)()
function check_consuming()
  repeat
    local status, err, trace = thread:status()
  until status == "paused" -- or better decouple from thread:pause()
end

Fix&Simplify threads implementation

  1. Get rid of active waiting in LuaThread::wait and luaHook. Use conditional variable or mutex instead.
  2. Get rid from detach. Use implicit detach.
  3. A-B-A problem. Cancel then resume is may be ok (!!!).
  4. May be get rid of ThreadFactory. Now logic is quite complicated 😟. ThreadFactory just captures this state variable and provide some configuration. Why not to hide it in LuaThread? LuaThread::luaHook and LuaThread::work have to be free functions!

Race condition between GCObject creation and GC garbage collecting

For example:
stored-object.cpp:

  SharedTable table = GC::instance().create<SharedTable>();
  ...
  return std::make_unique<GCObjectHolder<SharedTable>>(table.handle());

When we go out of scope of this function the table which currently is the only one hard link to the new GCObject will be destroyed and GC may collect this object before we start use it.

Cache string.dump and loadstring invokation

Each time when function is converted to StoredObject and when it's converted back we call string.dump and loadstring. We think that it can be optimized by cache. This cache should be individual for each state/thread.

Add Lua API for GC

Analize and provide Lua API for internal GC (use Lua's GC API as an example)

Where are effil.lua, libeffil.so/libeffil.dylib?

I am building a large Singularity container and it takes hours to make it. Before I install effil I would like to know where are the files effil.lua, libeffil.so/libeffil.dylib so that I can put a command in my script to copy those files into another location so that I can access them once the container is built. Would you please tell me where those files are once I compile effil so that I won't have to spend another couple of hours finding them and making the container again? Are they gonna be in the main effil folder?

Another question: By copying those files to my project, do you mean I should simply do cp effil.lua libeffil.so libeffil.dylib myProjectDir/?

Thank you

Cancel at get/wait and sleep.

Add cancellation point to thread:get, thread:wait and effil.sleep methods like it's implemented in effil.yield method.

Inheritance in effil tables

Hi!
I'd like to use class inheritance with effil tables.
This works well:

globals = {}
globals.input = {}
globals.inputListPrototype = { protoFun1 = function(self) print('protoFun1') end, protoFun2 = function(self) print('protoFun2') end } 
setmetatable(globals.input, {__index = globals.inputListPrototype})
type(globals.input.protoFun1)

The same version with an effil table:

effil = require('effil')
globals = effil.table()
globals.input = {}
globals.inputListPrototype = { protoFun1 = function(self) print('protoFun1') end, protoFun2 = function(self) print('protoFun2') end } 
effil.setmetatable(globals.input, {__index = globals.inputListPrototype})
effil.type(globals.input.protoFun1)

Gives error:

attempt to call a table
stack traceback:
        [C]: in ?
        [C]: in metamethod '__index'
        stdin:1: in main chunk
        [C]: in ?

Why? How can I fix this? Thanks in advance!

Documentation: use HTTPS in git clone for installation

Hi, just a heads up. The docs say to do this to install:

$ git clone --recursive [email protected]:effil/effil.git effil                                                                                                         09:06:15
Cloning into 'effil'...
[email protected]: Permission denied (publickey).
fatal: Could not read from remote repository.

Please make sure you have the correct access rights
and the repository exists.

It should work for everyone without further configuration if you do:

git clone --recursive https://github.com/effil/effil.git effil

Serialize table's metatable as well

First place:

t = effil.table(setmetatable({}, {}))
effil.getmetatable(t) -- should no be nil

Second place:

t = effil.setmetatable({}, {})
getmetatable(effil.dump(t)) -- should no be nil

Installation instructions seem to be outdated

In README.md it's mentioned that you have to do the following to use Effil:

Copy effil.lua and libeffil.so/libeffil.dylib to your project.

This doesn't seem correct since CMake only creates 1 DLL (at least on Windows).

Threads priority

It would be nice if effil will allow to set priority for new thread.
It looks not so complicated to implement.

How to use next() with effil?

I have a program in which I need to set the metatable so that pairs() does not iterate over functions. Something like this seems to work OK with normale tables:

local mt = { -- metatable
    __pairs = function(t) -- do NOT iterate with pairs over functions!
            local k=nil
            return function ()
                local v
                repeat k,v = next(t,k) until type(v) ~= 'function' or k == nil
                return k,v
            end
        end
}
setmetatable({}, mt)

However when setting the metatable for an effil table (effil.setmetatable) I have the following error:

bad argument #1 to 'next' (table expected, got sol.effil::SharedTable*)

How can I make this work? Thanks in advance!

Compilation error

I cannot compile effil. I get lots of errors related to sol library. Am I doing something wrong?

git clone --recursive [email protected]:effil/effil.git effil && cd effil && mkdir build && cd build && cmake .. && make install
Cloning into 'effil'...
remote: Counting objects: 897, done.
remote: Compressing objects: 100% (3/3), done.
remote: Total 897 (delta 1), reused 1 (delta 1), pack-reused 893
Receiving objects: 100% (897/897), 194.03 KiB | 0 bytes/s, done.
Resolving deltas: 100% (529/529), done.
Checking connectivity... done.
Submodule 'libs/gtest' (https://github.com/google/googletest.git) registered for path 'libs/gtest'
Submodule 'libs/sol' (https://github.com/ThePhD/sol2.git) registered for path 'libs/sol'
Submodule 'libs/u-test' (https://github.com/IUdalov/u-test.git) registered for path 'libs/u-test'
Cloning into 'libs/gtest'...
remote: Counting objects: 11801, done.
remote: Compressing objects: 100% (22/22), done.
remote: Total 11801 (delta 17), reused 23 (delta 12), pack-reused 11766
Receiving objects: 100% (11801/11801), 3.43 MiB | 0 bytes/s, done.
Resolving deltas: 100% (8674/8674), done.
Checking connectivity... done.
Submodule path 'libs/gtest': checked out '9ae086a9ebafabdc49b71bb7f3879f551adee09a'
Cloning into 'libs/sol'...
remote: Counting objects: 14029, done.
remote: Compressing objects: 100% (18/18), done.
remote: Total 14029 (delta 4), reused 12 (delta 3), pack-reused 14006
Receiving objects: 100% (14029/14029), 16.16 MiB | 22.86 MiB/s, done.
Resolving deltas: 100% (10023/10023), done.
Checking connectivity... done.
Submodule path 'libs/sol': checked out '345a398cdc7748427214644bf1606ae4324abb24'
Submodule 'Catch' (https://github.com/philsquared/Catch.git) registered for path 'Catch'
Cloning into 'Catch'...
remote: Counting objects: 19892, done.
remote: Compressing objects: 100% (38/38), done.
remote: Total 19892 (delta 29), reused 41 (delta 25), pack-reused 19829
Receiving objects: 100% (19892/19892), 9.48 MiB | 16.83 MiB/s, done.
Resolving deltas: 100% (13425/13425), done.
Checking connectivity... done.
Submodule path 'libs/sol/Catch': checked out 'b1835e1de9b0e321953942de19c31aa85b00b7f2'
Cloning into 'libs/u-test'...
remote: Counting objects: 66, done.
remote: Total 66 (delta 0), reused 0 (delta 0), pack-reused 66
Unpacking objects: 100% (66/66), done.
Checking connectivity... done.
Submodule path 'libs/u-test': checked out 'c704056663b80f520109061161b868f9d1f17c54'
-- The C compiler identification is GNU 4.8.5
-- The CXX compiler identification is GNU 4.8.5
-- Check for working C compiler: /usr/bin/cc
-- Check for working C compiler: /usr/bin/cc -- works
-- Detecting C compiler ABI info
-- Checking if C linker supports --verbose
-- Checking if C linker supports --verbose - yes
-- Detecting C compiler ABI info - done
-- Detecting C compile features
-- Detecting C compile features - done
-- Check for working CXX compiler: /usr/bin/c++
-- Check for working CXX compiler: /usr/bin/c++ -- works
-- Detecting CXX compiler ABI info
-- Checking if CXX linker supports --verbose
-- Checking if CXX linker supports --verbose - yes
-- Detecting CXX compiler ABI info - done
-- Detecting CXX compile features
-- Detecting CXX compile features - done
-- Found Lua: /usr/lib64/liblua-5.1.so;/usr/lib64/libm.so (found version "5.1.4") 
-- Configuring done
-- Generating done
-- Build files have been written to: /om/user/arsalans/testoo/effil/build
Scanning dependencies of target effil
[ 10%] Building CXX object CMakeFiles/effil.dir/src/cpp/channel.cpp.o
In file included from /om/user/arsalans/testoo/effil/src/cpp/utils.h:7:0,
                 from /om/user/arsalans/testoo/effil/src/cpp/stored-object.h:3,
                 from /om/user/arsalans/testoo/effil/src/cpp/lua-helpers.h:3,
                 from /om/user/arsalans/testoo/effil/src/cpp/channel.h:4,
                 from /om/user/arsalans/testoo/effil/src/cpp/channel.cpp:1:
/om/user/arsalans/testoo/effil/libs/sol/single/sol/sol.hpp:116:25: error: ‘make_index_sequence’ in namespace ‘std’ does not name a type
  struct types { typedef std::make_index_sequence<sizeof...(Args)> indices; static constexpr std::size_t size() { return sizeof...(Args); } };
                         ^
In file included from /om/user/arsalans/testoo/effil/src/cpp/utils.h:7:0,
                 from /om/user/arsalans/testoo/effil/src/cpp/stored-object.h:3,
                 from /om/user/arsalans/testoo/effil/src/cpp/lua-helpers.h:3,
                 from /om/user/arsalans/testoo/effil/src/cpp/channel.h:4,
                 from /om/user/arsalans/testoo/effil/src/cpp/channel.cpp:1:
/om/user/arsalans/testoo/effil/libs/sol/single/sol/sol.hpp:127:38: error: ‘remove_reference_t’ is not a member of ‘std’
   using unqualified = std::remove_cv<std::remove_reference_t<T>>;
                                      ^
/om/user/arsalans/testoo/effil/libs/sol/single/sol/sol.hpp:127:38: error: ‘remove_reference_t’ is not a member of ‘std’
/om/user/arsalans/testoo/effil/libs/sol/single/sol/sol.hpp:127:62: error: template argument 1 is invalid
   using unqualified = std::remove_cv<std::remove_reference_t<T>>;
                                                              ^
/om/user/arsalans/testoo/effil/libs/sol/single/sol/sol.hpp:130:34: error: expected nested-name-specifier before ‘unqualified’
   using unqualified_t = typename unqualified<T>::type;
                                  ^
/om/user/arsalans/testoo/effil/libs/sol/single/sol/sol.hpp:148:47: error: ‘unqualified_t’ was not declared in this scope
   using tuple_element = std::tuple_element<N, unqualified_t<Tuple>>;
                                               ^
/om/user/arsalans/testoo/effil/libs/sol/single/sol/sol.hpp:148:61: error: template argument 2 is invalid
   using tuple_element = std::tuple_element<N, unqualified_t<Tuple>>;
                                                             ^
/om/user/arsalans/testoo/effil/libs/sol/single/sol/sol.hpp:151:27: error: expected type-specifier
   using tuple_element_t = std::tuple_element_t<N, unqualified_t<Tuple>>;
                           ^
/om/user/arsalans/testoo/effil/libs/sol/single/sol/sol.hpp:154:37: error: expected type-specifier before ‘unqualified’
   using unqualified_tuple_element = unqualified<tuple_element_t<N, Tuple>>;
                                     ^
/om/user/arsalans/testoo/effil/libs/sol/single/sol/sol.hpp:157:39: error: expected type-specifier before ‘unqualified_t’
   using unqualified_tuple_element_t = unqualified_t<tuple_element_t<N, Tuple>>;
                                       ^
/om/user/arsalans/testoo/effil/libs/sol/single/sol/sol.hpp:266:51: error: expected template-name before ‘<’ token
    struct void_tuple_element : meta::tuple_element<I, T> {};
                                                   ^
/om/user/arsalans/testoo/effil/libs/sol/single/sol/sol.hpp:266:51: error: expected ‘{’ before ‘<’ token
/om/user/arsalans/testoo/effil/libs/sol/single/sol/sol.hpp:266:51: error: expected unqualified-id before ‘<’ token
/om/user/arsalans/testoo/effil/libs/sol/single/sol/sol.hpp:266:60: warning: extra ‘;’ [-Wpedantic]
    struct void_tuple_element : meta::tuple_element<I, T> {};
                                                            ^
/om/user/arsalans/testoo/effil/libs/sol/single/sol/sol.hpp:277:13: error: ‘conditional_t’ in namespace ‘std’ does not name a type
     typedef std::conditional_t<std::is_void<T>::value, int, T>& first_type;
             ^
/om/user/arsalans/testoo/effil/libs/sol/single/sol/sol.hpp:291:13: error: ‘conditional_t’ in namespace ‘std’ does not name a type
     typedef std::conditional_t<std::is_void<T>::value, args_list, types<first_type, Args...>> free_args_list;
             ^
/om/user/arsalans/testoo/effil/libs/sol/single/sol/sol.hpp:292:13: error: ‘conditional_t’ in namespace ‘std’ does not name a type
     typedef std::conditional_t<std::is_void<T>::value, R(Args...), R(first_type, Args...)> free_function_type;
             ^
/om/user/arsalans/testoo/effil/libs/sol/single/sol/sol.hpp:293:13: error: ‘conditional_t’ in namespace ‘std’ does not name a type
     typedef std::conditional_t<std::is_void<T>::value, R(*)(Args...), R(*)(first_type, Args...)> free_function_pointer_type;
             ^
/om/user/arsalans/testoo/effil/libs/sol/single/sol/sol.hpp:294:13: error: ‘remove_pointer_t’ in namespace ‘std’ does not name a type
     typedef std::remove_pointer_t<free_function_pointer_type> signature_type;
             ^
/om/user/arsalans/testoo/effil/libs/sol/single/sol/sol.hpp:536:39: error: ‘decay_t’ is not a member of ‘std’
    struct callable_traits : fx_traits<std::decay_t<Signature>> {
                                       ^
/om/user/arsalans/testoo/effil/libs/sol/single/sol/sol.hpp:536:39: error: ‘decay_t’ is not a member of ‘std’
/om/user/arsalans/testoo/effil/libs/sol/single/sol/sol.hpp:536:52: error: template argument 1 is invalid
    struct callable_traits : fx_traits<std::decay_t<Signature>> {
                                                    ^
/om/user/arsalans/testoo/effil/libs/sol/single/sol/sol.hpp:536:52: error: template argument 2 is invalid
/om/user/arsalans/testoo/effil/libs/sol/single/sol/sol.hpp:536:61: error: expected ‘{’ before ‘>’ token
    struct callable_traits : fx_traits<std::decay_t<Signature>> {
                                                             ^
/om/user/arsalans/testoo/effil/libs/sol/single/sol/sol.hpp:536:61: error: expected unqualified-id before ‘>’ token
/om/user/arsalans/testoo/effil/libs/sol/single/sol/sol.hpp:538:5: warning: extra ‘;’ [-Wpedantic]
    };
     ^
In file included from /om/user/arsalans/testoo/effil/src/cpp/utils.h:7:0,
                 from /om/user/arsalans/testoo/effil/src/cpp/stored-object.h:3,
                 from /om/user/arsalans/testoo/effil/src/cpp/lua-helpers.h:3,
                 from /om/user/arsalans/testoo/effil/src/cpp/channel.h:4,
                 from /om/user/arsalans/testoo/effil/src/cpp/channel.cpp:1:
/om/user/arsalans/testoo/effil/libs/sol/single/sol/sol.hpp:619:41: error: ‘unqualified_t’ was not declared in this scope
   struct unwrap_unqualified : unwrapped<unqualified_t<T>> {};
                                         ^
/om/user/arsalans/testoo/effil/libs/sol/single/sol/sol.hpp:619:55: error: template argument 1 is invalid
   struct unwrap_unqualified : unwrapped<unqualified_t<T>> {};
                                                       ^
/om/user/arsalans/testoo/effil/libs/sol/single/sol/sol.hpp:619:56: error: expected ‘{’ before ‘>’ token
   struct unwrap_unqualified : unwrapped<unqualified_t<T>> {};
                                                        ^
/om/user/arsalans/testoo/effil/libs/sol/single/sol/sol.hpp:619:56: error: expected unqualified-id before ‘>’ token
/om/user/arsalans/testoo/effil/libs/sol/single/sol/sol.hpp:619:61: warning: extra ‘;’ [-Wpedantic]
   struct unwrap_unqualified : unwrapped<unqualified_t<T>> {};
                                                             ^
/om/user/arsalans/testoo/effil/libs/sol/single/sol/sol.hpp:667:21: error: expected type-specifier
   using condition = std::conditional_t<Condition::value, Then, Else>;
                     ^
/om/user/arsalans/testoo/effil/libs/sol/single/sol/sol.hpp:673:37: error: expected template-name before ‘<’ token
   struct all<T, Args...> : condition<T, all<Args...>, boolean<false>> {};
                                     ^
/om/user/arsalans/testoo/effil/libs/sol/single/sol/sol.hpp:673:37: error: expected ‘{’ before ‘<’ token
/om/user/arsalans/testoo/effil/libs/sol/single/sol/sol.hpp:673:37: error: expected unqualified-id before ‘<’ token
/om/user/arsalans/testoo/effil/libs/sol/single/sol/sol.hpp:673:73: warning: extra ‘;’ [-Wpedantic]
   struct all<T, Args...> : condition<T, all<Args...>, boolean<false>> {};
                                                                         ^
/om/user/arsalans/testoo/effil/libs/sol/single/sol/sol.hpp:679:37: error: expected template-name before ‘<’ token
   struct any<T, Args...> : condition<T, boolean<true>, any<Args...>> {};
                                     ^
/om/user/arsalans/testoo/effil/libs/sol/single/sol/sol.hpp:679:37: error: expected ‘{’ before ‘<’ token
/om/user/arsalans/testoo/effil/libs/sol/single/sol/sol.hpp:679:37: error: expected unqualified-id before ‘<’ token
/om/user/arsalans/testoo/effil/libs/sol/single/sol/sol.hpp:679:72: warning: extra ‘;’ [-Wpedantic]
   struct any<T, Args...> : condition<T, boolean<true>, any<Args...>> {};
                                                                        ^
/om/user/arsalans/testoo/effil/libs/sol/single/sol/sol.hpp:688:24: error: expected type-specifier
   using disable_if_t = std::enable_if_t<!value, T>;
                        ^
/om/user/arsalans/testoo/effil/libs/sol/single/sol/sol.hpp:691:18: error: expected type-specifier
   using enable = std::enable_if_t<all<Args...>::value, enable_t>;
                  ^
/om/user/arsalans/testoo/effil/libs/sol/single/sol/sol.hpp:694:19: error: expected type-specifier
   using disable = std::enable_if_t<neg<all<Args...>>::value, enable_t>;
                   ^
/om/user/arsalans/testoo/effil/libs/sol/single/sol/sol.hpp:697:23: error: expected type-specifier
   using disable_any = std::enable_if_t<neg<any<Args...>>::value, enable_t>;
                       ^
/om/user/arsalans/testoo/effil/libs/sol/single/sol/sol.hpp:710:64: error: expected template-name before ‘<’ token
    struct index_in_pack<I, T, T1, Args...> : std::conditional_t<std::is_same<T, T1>::value, std::integral_constant<std::ptrdiff_t, I>, index_in_pack<I + 1, T, Args...>> { };
                                                                ^
/om/user/arsalans/testoo/effil/libs/sol/single/sol/sol.hpp:710:64: error: expected ‘{’ before ‘<’ token
/om/user/arsalans/testoo/effil/libs/sol/single/sol/sol.hpp:710:64: error: expected unqualified-id before ‘<’ token
/om/user/arsalans/testoo/effil/libs/sol/single/sol/sol.hpp:710:173: warning: extra ‘;’ [-Wpedantic]
    struct index_in_pack<I, T, T1, Args...> : std::conditional_t<std::is_same<T, T1>::value, std::integral_constant<std::ptrdiff_t, I>, index_in_pack<I + 1, T, Args...>> { };
                                                                                                                                                                             ^
/om/user/arsalans/testoo/effil/libs/sol/single/sol/sol.hpp:738:73: error: expected template-name before ‘<’ token
    struct count_for_pack<Limit, I, Pred, T, Ts...> : std::conditional_t < sizeof...(Ts) == 0 || Limit < 2,
                                                                         ^
/om/user/arsalans/testoo/effil/libs/sol/single/sol/sol.hpp:738:73: error: expected ‘{’ before ‘<’ token
/om/user/arsalans/testoo/effil/libs/sol/single/sol/sol.hpp:738:73: error: expected unqualified-id before ‘<’ token
/om/user/arsalans/testoo/effil/libs/sol/single/sol/sol.hpp:741:9: warning: extra ‘;’ [-Wpedantic]
    > { };
         ^
/om/user/arsalans/testoo/effil/libs/sol/single/sol/sol.hpp:745:70: error: expected template-name before ‘<’ token
    struct count_2_for_pack<I, Pred, T, U, Ts...> : std::conditional_t<sizeof...(Ts) == 0,
                                                                      ^
/om/user/arsalans/testoo/effil/libs/sol/single/sol/sol.hpp:745:70: error: expected ‘{’ before ‘<’ token
/om/user/arsalans/testoo/effil/libs/sol/single/sol/sol.hpp:745:70: error: expected unqualified-id before ‘<’ token
/om/user/arsalans/testoo/effil/libs/sol/single/sol/sol.hpp:748:9: warning: extra ‘;’ [-Wpedantic]
    > { };
         ^
/om/user/arsalans/testoo/effil/libs/sol/single/sol/sol.hpp:801:54: error: ‘unqualified_t’ was not declared in this scope
    template<typename T, bool isclass = std::is_class<unqualified_t<T>>::value>
                                                      ^
/om/user/arsalans/testoo/effil/libs/sol/single/sol/sol.hpp:801:68: error: template argument 1 is invalid
    template<typename T, bool isclass = std::is_class<unqualified_t<T>>::value>
                                                                    ^
/om/user/arsalans/testoo/effil/libs/sol/single/sol/sol.hpp:801:71: error: ‘value’ in namespace ‘::’ does not name a type
    template<typename T, bool isclass = std::is_class<unqualified_t<T>>::value>
                                                                       ^
/om/user/arsalans/testoo/effil/libs/sol/single/sol/sol.hpp:802:70: warning: extra ‘;’ [-Wpedantic]
    struct is_callable : std::is_function<std::remove_pointer_t<T>> {};
                                                                      ^
/om/user/arsalans/testoo/effil/libs/sol/single/sol/sol.hpp:805:11: error: ‘is_callable’ is not a class template
    struct is_callable<T, true> {
           ^
/om/user/arsalans/testoo/effil/libs/sol/single/sol/sol.hpp:823:39: error: expected type-specifier before ‘unqualified_t’
     template<typename T, typename U = unqualified_t<T>,
                                       ^
/om/user/arsalans/testoo/effil/libs/sol/single/sol/sol.hpp:823:39: error: expected ‘>’ before ‘unqualified_t’
/om/user/arsalans/testoo/effil/libs/sol/single/sol/sol.hpp:833:39: error: expected type-specifier before ‘unqualified_t’
     template<typename T, typename U = unqualified_t<T>,
                                       ^
/om/user/arsalans/testoo/effil/libs/sol/single/sol/sol.hpp:833:39: error: expected ‘>’ before ‘unqualified_t’
/om/user/arsalans/testoo/effil/libs/sol/single/sol/sol.hpp:842:39: error: expected type-specifier before ‘unqualified_t’
     template<typename T, typename U = unqualified_t<T>,
                                       ^
/om/user/arsalans/testoo/effil/libs/sol/single/sol/sol.hpp:842:39: error: expected ‘>’ before ‘unqualified_t’
/om/user/arsalans/testoo/effil/libs/sol/single/sol/sol.hpp:851:39: error: expected type-specifier before ‘unqualified_t’
     template<typename T, typename U = unqualified_t<T>,
                                       ^
/om/user/arsalans/testoo/effil/libs/sol/single/sol/sol.hpp:851:39: error: expected ‘>’ before ‘unqualified_t’
/om/user/arsalans/testoo/effil/libs/sol/single/sol/sol.hpp:899:52: error: ‘unqualified_t’ was not declared in this scope
   using is_string_constructible = any<std::is_same<unqualified_t<T>, const char*>, std::is_same<unqualified_t<T>, char>, std::is_same<unqualified_t<T>, std::string>, std::is_same<unqualified_t<T>, std::initializer_list<char>>>;
                                                    ^
/om/user/arsalans/testoo/effil/libs/sol/single/sol/sol.hpp:899:67: error: wrong number of template arguments (1, should be 2)
   using is_string_constructible = any<std::is_same<unqualified_t<T>, const char*>, std::is_same<unqualified_t<T>, char>, std::is_same<unqualified_t<T>, std::string>, std::is_same<unqualified_t<T>, std::initializer_list<char>>>;
                                                                   ^
In file included from /usr/include/c++/4.8.2/bits/move.h:57:0,
                 from /usr/include/c++/4.8.2/bits/stl_pair.h:59,
                 from /usr/include/c++/4.8.2/utility:70,
                 from /usr/include/c++/4.8.2/tuple:38,
                 from /usr/include/c++/4.8.2/mutex:38,
                 from /om/user/arsalans/testoo/effil/src/cpp/notifier.h:3,
                 from /om/user/arsalans/testoo/effil/src/cpp/channel.h:3,
                 from /om/user/arsalans/testoo/effil/src/cpp/channel.cpp:1:
/usr/include/c++/4.8.2/type_traits:823:12: error: provided for ‘template<class, class> struct std::is_same’
     struct is_same;
            ^
In file included from /om/user/arsalans/testoo/effil/src/cpp/utils.h:7:0,
                 from /om/user/arsalans/testoo/effil/src/cpp/stored-object.h:3,
                 from /om/user/arsalans/testoo/effil/src/cpp/lua-helpers.h:3,
                 from /om/user/arsalans/testoo/effil/src/cpp/channel.h:4,
                 from /om/user/arsalans/testoo/effil/src/cpp/channel.cpp:1:
/om/user/arsalans/testoo/effil/libs/sol/single/sol/sol.hpp:899:81: error: template argument 1 is invalid
   using is_string_constructible = any<std::is_same<unqualified_t<T>, const char*>, std::is_same<unqualified_t<T>, char>, std::is_same<unqualified_t<T>, std::string>, std::is_same<unqualified_t<T>, std::initializer_list<char>>>;
                                                                                 ^
/om/user/arsalans/testoo/effil/libs/sol/single/sol/sol.hpp:909:17: error: ‘decay_t’ is not a member of ‘std’
    std::is_same<std::decay_t<unqualified_t<T>>, const char*>,
                 ^
/om/user/arsalans/testoo/effil/libs/sol/single/sol/sol.hpp:909:17: error: ‘decay_t’ is not a member of ‘std’
/om/user/arsalans/testoo/effil/libs/sol/single/sol/sol.hpp:909:30: error: ‘unqualified_t’ was not declared in this scope
    std::is_same<std::decay_t<unqualified_t<T>>, const char*>,
                              ^
/om/user/arsalans/testoo/effil/libs/sol/single/sol/sol.hpp:909:44: error: wrong number of template arguments (1, should be 2)
    std::is_same<std::decay_t<unqualified_t<T>>, const char*>,
                                            ^
In file included from /usr/include/c++/4.8.2/bits/move.h:57:0,
                 from /usr/include/c++/4.8.2/bits/stl_pair.h:59,
                 from /usr/include/c++/4.8.2/utility:70,
                 from /usr/include/c++/4.8.2/tuple:38,
                 from /usr/include/c++/4.8.2/mutex:38,
                 from /om/user/arsalans/testoo/effil/src/cpp/notifier.h:3,
                 from /om/user/arsalans/testoo/effil/src/cpp/channel.h:3,
                 from /om/user/arsalans/testoo/effil/src/cpp/channel.cpp:1:
/usr/include/c++/4.8.2/type_traits:823:12: error: provided for ‘template<class, class> struct std::is_same’
     struct is_same;
            ^
In file included from /om/user/arsalans/testoo/effil/src/cpp/utils.h:7:0,
                 from /om/user/arsalans/testoo/effil/src/cpp/stored-object.h:3,
                 from /om/user/arsalans/testoo/effil/src/cpp/lua-helpers.h:3,
                 from /om/user/arsalans/testoo/effil/src/cpp/channel.h:4,
                 from /om/user/arsalans/testoo/effil/src/cpp/channel.cpp:1:
/om/user/arsalans/testoo/effil/libs/sol/single/sol/sol.hpp:909:45: error: template argument 1 is invalid
    std::is_same<std::decay_t<unqualified_t<T>>, const char*>,
                                             ^
/om/user/arsalans/testoo/effil/libs/sol/single/sol/sol.hpp:917:35: error: ‘unqualified_t’ was not declared in this scope
    neg<std::is_copy_constructible<unqualified_t<T>>>,
                                   ^
/om/user/arsalans/testoo/effil/libs/sol/single/sol/sol.hpp:917:49: error: template argument 1 is invalid
    neg<std::is_copy_constructible<unqualified_t<T>>>,
                                                 ^
/om/user/arsalans/testoo/effil/libs/sol/single/sol/sol.hpp:917:50: error: template argument 1 is invalid
    neg<std::is_copy_constructible<unqualified_t<T>>>,
                                                  ^
/om/user/arsalans/testoo/effil/libs/sol/single/sol/sol.hpp:917:52: error: template argument 2 is invalid
    neg<std::is_copy_constructible<unqualified_t<T>>>,
                                                    ^
/om/user/arsalans/testoo/effil/libs/sol/single/sol/sol.hpp:918:31: error: ‘unqualified_t’ was not declared in this scope
    std::is_move_constructible<unqualified_t<T>>
                               ^
/om/user/arsalans/testoo/effil/libs/sol/single/sol/sol.hpp:918:45: error: template argument 1 is invalid
    std::is_move_constructible<unqualified_t<T>>
                                             ^
/om/user/arsalans/testoo/effil/libs/sol/single/sol/sol.hpp:918:46: error: expected ‘{’ before ‘>’ token
    std::is_move_constructible<unqualified_t<T>>
                                              ^
/om/user/arsalans/testoo/effil/libs/sol/single/sol/sol.hpp:918:46: error: expected unqualified-id before ‘>’ token
/om/user/arsalans/testoo/effil/libs/sol/single/sol/sol.hpp:919:7: warning: extra ‘;’ [-Wpedantic]
   > {};
       ^
/om/user/arsalans/testoo/effil/libs/sol/single/sol/sol.hpp:925:32: error: ‘sol::meta::disable’ has not been declared
    template <typename T, meta::disable<meta::is_specialization_of<std::tuple, meta::unqualified_t<T>>> = meta::enabler>
                                ^
/om/user/arsalans/testoo/effil/libs/sol/single/sol/sol.hpp:925:39: error: expected ‘>’ before ‘<’ token
    template <typename T, meta::disable<meta::is_specialization_of<std::tuple, meta::unqualified_t<T>>> = meta::enabler>
                                       ^
/om/user/arsalans/testoo/effil/libs/sol/single/sol/sol.hpp:926:13: error: expected primary-expression before ‘auto’
    decltype(auto) force_tuple(T&& x) {
             ^
/om/user/arsalans/testoo/effil/libs/sol/single/sol/sol.hpp:926:13: error: expected ‘)’ before ‘auto’
/om/user/arsalans/testoo/effil/libs/sol/single/sol/sol.hpp:926:4: error: expected unqualified-id before ‘decltype’
    decltype(auto) force_tuple(T&& x) {
    ^
/om/user/arsalans/testoo/effil/libs/sol/single/sol/sol.hpp:930:32: error: ‘sol::meta::enable’ has not been declared
    template <typename T, meta::enable<meta::is_specialization_of<std::tuple, meta::unqualified_t<T>>> = meta::enabler>
                                ^
/om/user/arsalans/testoo/effil/libs/sol/single/sol/sol.hpp:930:38: error: expected ‘>’ before ‘<’ token
    template <typename T, meta::enable<meta::is_specialization_of<std::tuple, meta::unqualified_t<T>>> = meta::enabler>
                                      ^
/om/user/arsalans/testoo/effil/libs/sol/single/sol/sol.hpp:931:13: error: expected primary-expression before ‘auto’
    decltype(auto) force_tuple(T&& x) {
             ^
/om/user/arsalans/testoo/effil/libs/sol/single/sol/sol.hpp:931:13: error: expected ‘)’ before ‘auto’
/om/user/arsalans/testoo/effil/libs/sol/single/sol/sol.hpp:931:4: error: expected unqualified-id before ‘decltype’
    decltype(auto) force_tuple(T&& x) {
    ^
/om/user/arsalans/testoo/effil/libs/sol/single/sol/sol.hpp:937:12: error: expected primary-expression before ‘auto’
   decltype(auto) tuplefy(X&&... x) {
            ^
/om/user/arsalans/testoo/effil/libs/sol/single/sol/sol.hpp:937:12: error: expected ‘)’ before ‘auto’
/om/user/arsalans/testoo/effil/libs/sol/single/sol/sol.hpp:937:3: error: expected unqualified-id before ‘decltype’
   decltype(auto) tuplefy(X&&... x) {
   ^
/om/user/arsalans/testoo/effil/libs/sol/single/sol/sol.hpp:947:26: error: ‘conditional_t’ is not a member of ‘std’
   struct iterator_tag<T, std::conditional_t<false, typename T::iterator_category, void>> {
                          ^
/om/user/arsalans/testoo/effil/libs/sol/single/sol/sol.hpp:947:26: error: ‘conditional_t’ is not a member of ‘std’
/om/user/arsalans/testoo/effil/libs/sol/single/sol/sol.hpp:947:83: error: wrong number of template arguments (4, should be 2)
   struct iterator_tag<T, std::conditional_t<false, typename T::iterator_category, void>> {
                                                                                   ^
/om/user/arsalans/testoo/effil/libs/sol/single/sol/sol.hpp:942:10: error: provided for ‘template<class T, class> struct sol::meta::iterator_tag’
   struct iterator_tag {
          ^
/om/user/arsalans/testoo/effil/libs/sol/single/sol/sol.hpp:947:87: error: expected unqualified-id before ‘>’ token
   struct iterator_tag<T, std::conditional_t<false, typename T::iterator_category, void>> {
                                                                                       ^
/om/user/arsalans/testoo/effil/libs/sol/single/sol/sol.hpp:949:4: warning: extra ‘;’ [-Wpedantic]
   };
    ^
/om/user/arsalans/testoo/effil/libs/sol/single/sol/sol.hpp:955:12: error: expected primary-expression before ‘auto’
   decltype(auto) forward_get(Tuple&& tuple) {
            ^
/om/user/arsalans/testoo/effil/libs/sol/single/sol/sol.hpp:955:12: error: expected ‘)’ before ‘auto’
/om/user/arsalans/testoo/effil/libs/sol/single/sol/sol.hpp:955:3: error: expected unqualified-id before ‘decltype’
   decltype(auto) forward_get(Tuple&& tuple) {
   ^
/om/user/arsalans/testoo/effil/libs/sol/single/sol/sol.hpp:960:32: error: template declaration of ‘auto sol::detail::forward_tuple_impl’
   auto forward_tuple_impl(std::index_sequence<I...>, Tuple&& tuple) -> decltype(std::tuple<decltype(forward_get<I>(tuple))...>(forward_get<I>(tuple)...)) {
                                ^
/om/user/arsalans/testoo/effil/libs/sol/single/sol/sol.hpp:960:27: error: ‘index_sequence’ is not a member of ‘std’
   auto forward_tuple_impl(std::index_sequence<I...>, Tuple&& tuple) -> decltype(std::tuple<decltype(forward_get<I>(tuple))...>(forward_get<I>(tuple)...)) {
                           ^
/om/user/arsalans/testoo/effil/libs/sol/single/sol/sol.hpp:960:59: error: expected primary-expression before ‘&&’ token
   auto forward_tuple_impl(std::index_sequence<I...>, Tuple&& tuple) -> decltype(std::tuple<decltype(forward_get<I>(tuple))...>(forward_get<I>(tuple)...)) {
                                                           ^
/om/user/arsalans/testoo/effil/libs/sol/single/sol/sol.hpp:960:62: error: ‘tuple’ was not declared in this scope
   auto forward_tuple_impl(std::index_sequence<I...>, Tuple&& tuple) -> decltype(std::tuple<decltype(forward_get<I>(tuple))...>(forward_get<I>(tuple)...)) {
                                                              ^
/om/user/arsalans/testoo/effil/libs/sol/single/sol/sol.hpp:960:62: note: suggested alternative:
In file included from /usr/include/c++/4.8.2/utility:70:0,
                 from /usr/include/c++/4.8.2/tuple:38,
                 from /usr/include/c++/4.8.2/mutex:38,
                 from /om/user/arsalans/testoo/effil/src/cpp/notifier.h:3,
                 from /om/user/arsalans/testoo/effil/src/cpp/channel.h:3,
                 from /om/user/arsalans/testoo/effil/src/cpp/channel.cpp:1:
/usr/include/c++/4.8.2/bits/stl_pair.h:83:11: note:   ‘std::tuple’
     class tuple;
           ^
In file included from /om/user/arsalans/testoo/effil/src/cpp/utils.h:7:0,
                 from /om/user/arsalans/testoo/effil/src/cpp/stored-object.h:3,
                 from /om/user/arsalans/testoo/effil/src/cpp/lua-helpers.h:3,
                 from /om/user/arsalans/testoo/effil/src/cpp/channel.h:4,
                 from /om/user/arsalans/testoo/effil/src/cpp/channel.cpp:1:
/om/user/arsalans/testoo/effil/libs/sol/single/sol/sol.hpp: In function ‘auto sol::detail::forward_tuple(Tuple&&)’:
/om/user/arsalans/testoo/effil/libs/sol/single/sol/sol.hpp:966:32: error: ‘make_index_sequence’ is not a member of ‘std’
    auto x = forward_tuple_impl(std::make_index_sequence<std::tuple_size<meta::unqualified_t<Tuple>>::value>(), std::forward<Tuple>(tuple));
                                ^
/om/user/arsalans/testoo/effil/libs/sol/single/sol/sol.hpp:966:73: error: ‘unqualified_t’ is not a member of ‘sol::meta’
    auto x = forward_tuple_impl(std::make_index_sequence<std::tuple_size<meta::unqualified_t<Tuple>>::value>(), std::forward<Tuple>(tuple));
                                                                         ^
/om/user/arsalans/testoo/effil/libs/sol/single/sol/sol.hpp:966:73: error: ‘unqualified_t’ is not a member of ‘sol::meta’
/om/user/arsalans/testoo/effil/libs/sol/single/sol/sol.hpp:966:93: error: template argument 1 is invalid
    auto x = forward_tuple_impl(std::make_index_sequence<std::tuple_size<meta::unqualified_t<Tuple>>::value>(), std::forward<Tuple>(tuple));
                                                                                             ^
/om/user/arsalans/testoo/effil/libs/sol/single/sol/sol.hpp:966:100: error: ‘::value’ has not been declared
    auto x = forward_tuple_impl(std::make_index_sequence<std::tuple_size<meta::unqualified_t<Tuple>>::value>(), std::forward<Tuple>(tuple));
                                                                                                    ^
/om/user/arsalans/testoo/effil/libs/sol/single/sol/sol.hpp:966:109: error: expected primary-expression before ‘)’ token
    auto x = forward_tuple_impl(std::make_index_sequence<std::tuple_size<meta::unqualified_t<Tuple>>::value>(), std::forward<Tuple>(tuple));
                                                                                                             ^
/om/user/arsalans/testoo/effil/libs/sol/single/sol/sol.hpp: At global scope:
/om/user/arsalans/testoo/effil/libs/sol/single/sol/sol.hpp:991:10: error: ‘add_lvalue_reference_t’ in namespace ‘std’ does not name a type
   inline std::add_lvalue_reference_t<T> deref(std::unique_ptr<T, Dx>& item) {
          ^
/om/user/arsalans/testoo/effil/libs/sol/single/sol/sol.hpp:996:10: error: ‘add_lvalue_reference_t’ in namespace ‘std’ does not name a type
   inline std::add_lvalue_reference_t<T> deref(std::shared_ptr<T>& item) {
          ^
/om/user/arsalans/testoo/effil/libs/sol/single/sol/sol.hpp:1001:10: error: ‘add_lvalue_reference_t’ in namespace ‘std’ does not name a type
   inline std::add_lvalue_reference_t<T> deref(const std::unique_ptr<T, Dx>& item) {
          ^
/om/user/arsalans/testoo/effil/libs/sol/single/sol/sol.hpp:1006:10: error: ‘add_lvalue_reference_t’ in namespace ‘std’ does not name a type
   inline std::add_lvalue_reference_t<T> deref(const std::shared_ptr<T>& item) {
          ^
In file included from /om/user/arsalans/testoo/effil/src/cpp/utils.h:7:0,
                 from /om/user/arsalans/testoo/effil/src/cpp/stored-object.h:3,
                 from /om/user/arsalans/testoo/effil/src/cpp/lua-helpers.h:3,
                 from /om/user/arsalans/testoo/effil/src/cpp/channel.h:4,
                 from /om/user/arsalans/testoo/effil/src/cpp/channel.cpp:1:
/om/user/arsalans/testoo/effil/libs/sol/single/sol/sol.hpp: In function ‘int sol::detail::trampoline(lua_State*, Fx&&, Args&& ...)’:
/om/user/arsalans/testoo/effil/libs/sol/single/sol/sol.hpp:3270:26: error: ‘unqualified_t’ is not a member of ‘sol::meta’
    if (meta::bind_traits<meta::unqualified_t<Fx>>::is_noexcept) {
                          ^
/om/user/arsalans/testoo/effil/libs/sol/single/sol/sol.hpp:3270:26: error: ‘unqualified_t’ is not a member of ‘sol::meta’
/om/user/arsalans/testoo/effil/libs/sol/single/sol/sol.hpp:3270:46: error: template argument 1 is invalid
    if (meta::bind_traits<meta::unqualified_t<Fx>>::is_noexcept) {
                                              ^
/om/user/arsalans/testoo/effil/libs/sol/single/sol/sol.hpp:3270:50: error: ‘::is_noexcept’ has not been declared
    if (meta::bind_traits<meta::unqualified_t<Fx>>::is_noexcept) {
                                                  ^
/om/user/arsalans/testoo/effil/libs/sol/single/sol/sol.hpp: At global scope:
/om/user/arsalans/testoo/effil/libs/sol/single/sol/sol.hpp:3348:10: error: ‘remove_pointer_t’ in namespace ‘std’ does not name a type
  typedef std::remove_pointer_t<lua_CFunction> lua_r_CFunction;
          ^
/om/user/arsalans/testoo/effil/libs/sol/single/sol/sol.hpp: In function ‘auto sol::make_light(T&)’:
/om/user/arsalans/testoo/effil/libs/sol/single/sol/sol.hpp:3472:29: error: ‘remove_pointer_t’ is not a member of ‘std’
   typedef meta::unwrapped_t<std::remove_pointer_t<std::remove_pointer_t<T>>> L;
                             ^
/om/user/arsalans/testoo/effil/libs/sol/single/sol/sol.hpp:3472:29: error: ‘remove_pointer_t’ is not a member of ‘std’
/om/user/arsalans/testoo/effil/libs/sol/single/sol/sol.hpp:3472:51: error: ‘remove_pointer_t’ is not a member of ‘std’
   typedef meta::unwrapped_t<std::remove_pointer_t<std::remove_pointer_t<T>>> L;
                                                   ^
/om/user/arsalans/testoo/effil/libs/sol/single/sol/sol.hpp:3472:73: error: template argument 1 is invalid
   typedef meta::unwrapped_t<std::remove_pointer_t<std::remove_pointer_t<T>>> L;
                                                                         ^
/om/user/arsalans/testoo/effil/libs/sol/single/sol/sol.hpp:3472:74: error: expected unqualified-id before ‘>’ token
   typedef meta::unwrapped_t<std::remove_pointer_t<std::remove_pointer_t<T>>> L;
                                                                          ^
/om/user/arsalans/testoo/effil/libs/sol/single/sol/sol.hpp:3473:16: error: ‘L’ was not declared in this scope
   return light<L>(l);
                ^
/om/user/arsalans/testoo/effil/libs/sol/single/sol/sol.hpp:3473:17: error: template argument 1 is invalid
   return light<L>(l);
                 ^
/om/user/arsalans/testoo/effil/libs/sol/single/sol/sol.hpp: In function ‘auto sol::make_user(T&&)’:
/om/user/arsalans/testoo/effil/libs/sol/single/sol/sol.hpp:3488:29: error: ‘unqualified_t’ is not a member of ‘sol::meta’
   typedef meta::unwrapped_t<meta::unqualified_t<T>> U;
                             ^
/om/user/arsalans/testoo/effil/libs/sol/single/sol/sol.hpp:3488:29: error: ‘unqualified_t’ is not a member of ‘sol::meta’
/om/user/arsalans/testoo/effil/libs/sol/single/sol/sol.hpp:3488:49: error: template argument 1 is invalid
   typedef meta::unwrapped_t<meta::unqualified_t<T>> U;
                                                 ^
/om/user/arsalans/testoo/effil/libs/sol/single/sol/sol.hpp:3488:50: error: expected unqualified-id before ‘>’ token
   typedef meta::unwrapped_t<meta::unqualified_t<T>> U;
                                                  ^
/om/user/arsalans/testoo/effil/libs/sol/single/sol/sol.hpp:3489:15: error: ‘U’ was not declared in this scope
   return user<U>(std::forward<T>(u));
               ^
/om/user/arsalans/testoo/effil/libs/sol/single/sol/sol.hpp:3489:16: error: template argument 1 is invalid
   return user<U>(std::forward<T>(u));
                ^
/om/user/arsalans/testoo/effil/libs/sol/single/sol/sol.hpp: In function ‘auto sol::meta_registry_key(T&&)’:
/om/user/arsalans/testoo/effil/libs/sol/single/sol/sol.hpp:3501:11: error: ‘unqualified_t’ in namespace ‘sol::meta’ does not name a type
   typedef meta::unqualified_t<T> K;
           ^
/om/user/arsalans/testoo/effil/libs/sol/single/sol/sol.hpp:3502:33: error: ‘K’ was not declared in this scope
   return metatable_registry_key<K>(std::forward<T>(key));
                                 ^
/om/user/arsalans/testoo/effil/libs/sol/single/sol/sol.hpp:3502:34: error: template argument 1 is invalid
   return metatable_registry_key<K>(std::forward<T>(key));
                                  ^
/om/user/arsalans/testoo/effil/libs/sol/single/sol/sol.hpp: At global scope:
/om/user/arsalans/testoo/effil/libs/sol/single/sol/sol.hpp:3529:51: error: ‘sol::meta::disable’ has not been declared
   template <typename Arg, typename... Args, meta::disable<std::is_same<meta::unqualified_t<Arg>, function_arguments>> = meta::enabler>
                                                   ^
/om/user/arsalans/testoo/effil/libs/sol/single/sol/sol.hpp:3529:58: error: expected ‘>’ before ‘<’ token
   template <typename Arg, typename... Args, meta::disable<std::is_same<meta::unqualified_t<Arg>, function_arguments>> = meta::enabler>
                                                          ^
/om/user/arsalans/testoo/effil/libs/sol/single/sol/sol.hpp: In function ‘auto sol::as_function(Args&& ...)’:
/om/user/arsalans/testoo/effil/libs/sol/single/sol/sol.hpp:3535:34: error: ‘decay_t’ is not a member of ‘std’
   return function_arguments<Sig, std::decay_t<Args>...>(std::forward<Args>(args)...);
                                  ^
/om/user/arsalans/testoo/effil/libs/sol/single/sol/sol.hpp:3535:34: error: ‘decay_t’ is not a member of ‘std’
/om/user/arsalans/testoo/effil/libs/sol/single/sol/sol.hpp:3535:51: error: template argument 2 is invalid
   return function_arguments<Sig, std::decay_t<Args>...>(std::forward<Args>(args)...);
                                                   ^
/om/user/arsalans/testoo/effil/libs/sol/single/sol/sol.hpp:3535:52: error: expected ‘;’ before ‘...’ token
   return function_arguments<Sig, std::decay_t<Args>...>(std::forward<Args>(args)...);
                                                    ^
/om/user/arsalans/testoo/effil/libs/sol/single/sol/sol.hpp:3535:52: error: expected primary-expression before ‘...’ token
/om/user/arsalans/testoo/effil/libs/sol/single/sol/sol.hpp:3535:52: error: expected ‘;’ before ‘...’ token
/om/user/arsalans/testoo/effil/libs/sol/single/sol/sol.hpp: At global scope:
/om/user/arsalans/testoo/effil/libs/sol/single/sol/sol.hpp:3549:12: error: expected type-specifier
   operator std::add_lvalue_reference_t<T> () {
            ^
/om/user/arsalans/testoo/effil/libs/sol/single/sol/sol.hpp:3561:12: error: expected type-specifier
   operator std::add_lvalue_reference_t<T>() {
            ^
/om/user/arsalans/testoo/effil/libs/sol/single/sol/sol.hpp:4005:22: error: ‘remove_pointer_t’ is not a member of ‘std’
   struct lua_type_of<std::remove_pointer_t<lua_CFunction>> : std::integral_constant<type, type::function> {};
                      ^
/om/user/arsalans/testoo/effil/libs/sol/single/sol/sol.hpp:4005:22: error: ‘remove_pointer_t’ is not a member of ‘std’
/om/user/arsalans/testoo/effil/libs/sol/single/sol/sol.hpp:4005:44: error: template argument 1 is invalid
   struct lua_type_of<std::remove_pointer_t<lua_CFunction>> : std::integral_constant<type, type::function> {};
                                            ^
/om/user/arsalans/testoo/effil/libs/sol/single/sol/sol.hpp:4005:57: error: expected unqualified-id before ‘>’ token
   struct lua_type_of<std::remove_pointer_t<lua_CFunction>> : std::integral_constant<type, type::function> {};
                                                         ^
/om/user/arsalans/testoo/effil/libs/sol/single/sol/sol.hpp:4005:109: warning: extra ‘;’ [-Wpedantic]
   struct lua_type_of<std::remove_pointer_t<lua_CFunction>> : std::integral_constant<type, type::function> {};
                                                                                                             ^
/om/user/arsalans/testoo/effil/libs/sol/single/sol/sol.hpp:4041:25: error: ‘enable_if_t’ is not a member of ‘std’
   struct lua_type_of<T, std::enable_if_t<std::is_arithmetic<T>::value>> : std::integral_constant<type, type::number> {};
                         ^
/om/user/arsalans/testoo/effil/libs/sol/single/sol/sol.hpp:4041:25: error: ‘enable_if_t’ is not a member of ‘std’
/om/user/arsalans/testoo/effil/libs/sol/single/sol/sol.hpp:4041:65: error: type/value mismatch at argument 2 in template parameter list for ‘template<class T, class> struct sol::detail::lua_type_of’
   struct lua_type_of<T, std::enable_if_t<std::is_arithmetic<T>::value>> : std::integral_constant<type, type::number> {};
                                                                 ^
/om/user/arsalans/testoo/effil/libs/sol/single/sol/sol.hpp:4041:65: error:   expected a type, got ‘(<expression error> < std::is_arithmetic<_Tp>::value)’
/om/user/arsalans/testoo/effil/libs/sol/single/sol/sol.hpp:4041:70: error: expected unqualified-id before ‘>’ token
   struct lua_type_of<T, std::enable_if_t<std::is_arithmetic<T>::value>> : std::integral_constant<type, type::number> {};
                                                                      ^
/om/user/arsalans/testoo/effil/libs/sol/single/sol/sol.hpp:4041:120: warning: extra ‘;’ [-Wpedantic]
   struct lua_type_of<T, std::enable_if_t<std::is_arithmetic<T>::value>> : std::integral_constant<type, type::number> {};
                                                                                                                        ^
/om/user/arsalans/testoo/effil/libs/sol/single/sol/sol.hpp:4044:25: error: ‘enable_if_t’ is not a member of ‘std’
   struct lua_type_of<T, std::enable_if_t<std::is_enum<T>::value>> : std::integral_constant<type, type::number> {};
                         ^
/om/user/arsalans/testoo/effil/libs/sol/single/sol/sol.hpp:4044:25: error: ‘enable_if_t’ is not a member of ‘std’
/om/user/arsalans/testoo/effil/libs/sol/single/sol/sol.hpp:4044:59: error: type/value mismatch at argument 2 in template parameter list for ‘template<class T, class> struct sol::detail::lua_type_of’
   struct lua_type_of<T, std::enable_if_t<std::is_enum<T>::value>> : std::integral_constant<type, type::number> {};
                                                           ^
/om/user/arsalans/testoo/effil/libs/sol/single/sol/sol.hpp:4044:59: error:   expected a type, got ‘(<expression error> < std::is_enum<_Tp>::value)’
/om/user/arsalans/testoo/effil/libs/sol/single/sol/sol.hpp:4044:64: error: expected unqualified-id before ‘>’ token
   struct lua_type_of<T, std::enable_if_t<std::is_enum<T>::value>> : std::integral_constant<type, type::number> {};
                                                                ^
/om/user/arsalans/testoo/effil/libs/sol/single/sol/sol.hpp:4044:114: warning: extra ‘;’ [-Wpedantic]
   struct lua_type_of<T, std::enable_if_t<std::is_enum<T>::value>> : std::integral_constant<type, type::number> {};
                                                                                                                  ^
/om/user/arsalans/testoo/effil/libs/sol/single/sol/sol.hpp:4062:26: error: ‘enable_if_t’ is not a member of ‘std’
   struct is_container<T, std::enable_if_t<meta::has_begin_end<meta::unqualified_t<T>>::value>> : std::true_type {};
                          ^
/om/user/arsalans/testoo/effil/libs/sol/single/sol/sol.hpp:4062:26: error: ‘enable_if_t’ is not a member of ‘std’
/om/user/arsalans/testoo/effil/libs/sol/single/sol/sol.hpp:4062:63: error: ‘unqualified_t’ is not a member of ‘sol::meta’
   struct is_container<T, std::enable_if_t<meta::has_begin_end<meta::unqualified_t<T>>::value>> : std::true_type {};
                                                               ^
/om/user/arsalans/testoo/effil/libs/sol/single/sol/sol.hpp:4062:63: error: ‘unqualified_t’ is not a member of ‘sol::meta’
/om/user/arsalans/testoo/effil/libs/sol/single/sol/sol.hpp:4062:83: error: template argument 1 is invalid
   struct is_container<T, std::enable_if_t<meta::has_begin_end<meta::unqualified_t<T>>::value>> : std::true_type {};
                                                                                   ^
/om/user/arsalans/testoo/effil/libs/sol/single/sol/sol.hpp:4062:84: error: template argument 2 is invalid
   struct is_container<T, std::enable_if_t<meta::has_begin_end<meta::unqualified_t<T>>::value>> : std::true_type {};
                                                                                    ^
/om/user/arsalans/testoo/effil/libs/sol/single/sol/sol.hpp:4062:93: error: expected unqualified-id before ‘>>’ token
   struct is_container<T, std::enable_if_t<meta::has_begin_end<meta::unqualified_t<T>>::value>> : std::true_type {};
                                                                                             ^
/om/user/arsalans/testoo/effil/libs/sol/single/sol/sol.hpp:4062:115: warning: extra ‘;’ [-Wpedantic]
   struct is_container<T, std::enable_if_t<meta::has_begin_end<meta::unqualified_t<T>>::value>> : std::true_type {};
                                                                                                                   ^
/om/user/arsalans/testoo/effil/libs/sol/single/sol/sol.hpp:4107:33: error: ‘unqualified_t’ is not a member of ‘sol::meta’
   type::userdata != lua_type_of<meta::unqualified_t<T>>::value
                                 ^
/om/user/arsalans/testoo/effil/libs/sol/single/sol/sol.hpp:4107:33: error: ‘unqualified_t’ is not a member of ‘sol::meta’
/om/user/arsalans/testoo/effil/libs/sol/single/sol/sol.hpp:4107:53: error: template argument 1 is invalid
   type::userdata != lua_type_of<meta::unqualified_t<T>>::value
                                                     ^
/om/user/arsalans/testoo/effil/libs/sol/single/sol/sol.hpp:4107:54: error: template argument 2 is invalid
   type::userdata != lua_type_of<meta::unqualified_t<T>>::value
                                                      ^
/om/user/arsalans/testoo/effil/libs/sol/single/sol/sol.hpp:4107:58: error: expected ‘{’ before ‘value’
   type::userdata != lua_type_of<meta::unqualified_t<T>>::value
                                                          ^
/om/user/arsalans/testoo/effil/libs/sol/single/sol/sol.hpp:4108:3: error: expected initializer before ‘||’ token
   || ((type::userdata == lua_type_of<meta::unqualified_t<T>>::value) 
   ^
/om/user/arsalans/testoo/effil/libs/sol/single/sol/sol.hpp:4115:7: warning: extra ‘;’ [-Wpedantic]
  > { };
       ^
/om/user/arsalans/testoo/effil/libs/sol/single/sol/sol.hpp:4119:30: error: ‘unqualified_t’ is not a member of ‘sol::meta’
   std::is_base_of<reference, meta::unqualified_t<T>>::value
                              ^
/om/user/arsalans/testoo/effil/libs/sol/single/sol/sol.hpp:4119:30: error: ‘unqualified_t’ is not a member of ‘sol::meta’
/om/user/arsalans/testoo/effil/libs/sol/single/sol/sol.hpp:4119:50: error: template argument 2 is invalid
   std::is_base_of<reference, meta::unqualified_t<T>>::value
                                                  ^
/om/user/arsalans/testoo/effil/libs/sol/single/sol/sol.hpp:4119:51: error: template argument 2 is invalid
   std::is_base_of<reference, meta::unqualified_t<T>>::value
                                                   ^
/om/user/arsalans/testoo/effil/libs/sol/single/sol/sol.hpp:4119:55: error: expected ‘{’ before ‘value’
   std::is_base_of<reference, meta::unqualified_t<T>>::value
                                                       ^
/om/user/arsalans/testoo/effil/libs/sol/single/sol/sol.hpp:4120:3: error: expected initializer before ‘||’ token
   || std::is_base_of<stack_reference, meta::unqualified_t<T>>::value
   ^
/om/user/arsalans/testoo/effil/libs/sol/single/sol/sol.hpp:4122:7: warning: extra ‘;’ [-Wpedantic]
  > { };
       ^
/om/user/arsalans/testoo/effil/libs/sol/single/sol/sol.hpp: In function ‘sol::type sol::type_of()’:
/om/user/arsalans/testoo/effil/libs/sol/single/sol/sol.hpp:4201:22: error: ‘unqualified_t’ is not a member of ‘sol::meta’
   return lua_type_of<meta::unqualified_t<T>>::value;
                      ^
/om/user/arsalans/testoo/effil/libs/sol/single/sol/sol.hpp:4201:22: error: ‘unqualified_t’ is not a member of ‘sol::meta’
/om/user/arsalans/testoo/effil/libs/sol/single/sol/sol.hpp:4201:42: error: template argument 1 is invalid
   return lua_type_of<meta::unqualified_t<T>>::value;
                                          ^
/om/user/arsalans/testoo/effil/libs/sol/single/sol/sol.hpp:4201:45: error: ‘::value’ has not been declared
   return lua_type_of<meta::unqualified_t<T>>::value;
                                             ^
/om/user/arsalans/testoo/effil/libs/sol/single/sol/sol.hpp: At global scope:
/om/user/arsalans/testoo/effil/libs/sol/single/sol/sol.hpp:4206:33: error: ‘enable_if_t’ is not a member of ‘std’
   struct lua_type_of<nested<T>, std::enable_if_t<::sol::is_container<T>::value>> : std::integral_constant<type, type::table> {};
                                 ^
/om/user/arsalans/testoo/effil/libs/sol/single/sol/sol.hpp:4206:33: error: ‘enable_if_t’ is not a member of ‘std’
/om/user/arsalans/testoo/effil/libs/sol/single/sol/sol.hpp:4206:74: error: type/value mismatch at argument 2 in template parameter list for ‘template<class T, class> struct sol::detail::lua_type_of’
   struct lua_type_of<nested<T>, std::enable_if_t<::sol::is_container<T>::value>> : std::integral_constant<type, type::table> {};
                                                                          ^
/om/user/arsalans/testoo/effil/libs/sol/single/sol/sol.hpp:4206:74: error:   expected a type, got ‘(<expression error> < sol::is_container<T>::value)’
/om/user/arsalans/testoo/effil/libs/sol/single/sol/sol.hpp:4206:79: error: expected unqualified-id before ‘>’ token
   struct lua_type_of<nested<T>, std::enable_if_t<::sol::is_container<T>::value>> : std::integral_constant<type, type::table> {};
                                                                               ^
/om/user/arsalans/testoo/effil/libs/sol/single/sol/sol.hpp:4206:128: warning: extra ‘;’ [-Wpedantic]
   struct lua_type_of<nested<T>, std::enable_if_t<::sol::is_container<T>::value>> : std::integral_constant<type, type::table> {};
                                                                                                                                ^
/om/user/arsalans/testoo/effil/libs/sol/single/sol/sol.hpp:4209:33: error: ‘enable_if_t’ is not a member of ‘std’
   struct lua_type_of<nested<T>, std::enable_if_t<!::sol::is_container<T>::value>> : lua_type_of<T> {};
                                 ^
/om/user/arsalans/testoo/effil/libs/sol/single/sol/sol.hpp:4209:33: error: ‘enable_if_t’ is not a member of ‘std’
/om/user/arsalans/testoo/effil/libs/sol/single/sol/sol.hpp:4209:75: error: type/value mismatch at argument 2 in template parameter list for ‘template<class T, class> struct sol::detail::lua_type_of’
   struct lua_type_of<nested<T>, std::enable_if_t<!::sol::is_container<T>::value>> : lua_type_of<T> {};
                                                                           ^
/om/user/arsalans/testoo/effil/libs/sol/single/sol/sol.hpp:4209:75: error:   expected a type, got ‘(<expression error> < (! sol::is_container<T>::value))’
/om/user/arsalans/testoo/effil/libs/sol/single/sol/sol.hpp:4209:80: error: expected unqualified-id before ‘>’ token
   struct lua_type_of<nested<T>, std::enable_if_t<!::sol::is_container<T>::value>> : lua_type_of<T> {};
                                                                                ^
/om/user/arsalans/testoo/effil/libs/sol/single/sol/sol.hpp:4209:102: warning: extra ‘;’ [-Wpedantic]
   struct lua_type_of<nested<T>, std::enable_if_t<!::sol::is_container<T>::value>> : lua_type_of<T> {};
                                                                                                      ^
/om/user/arsalans/testoo/effil/libs/sol/single/sol/sol.hpp:4548:35: error: ‘add_lvalue_reference_t’ is not a member of ‘std’
  struct tie_t : public std::tuple<std::add_lvalue_reference_t<Tn>...> {
                                   ^
/om/user/arsalans/testoo/effil/libs/sol/single/sol/sol.hpp:4548:35: error: ‘add_lvalue_reference_t’ is not a member of ‘std’
/om/user/arsalans/testoo/effil/libs/sol/single/sol/sol.hpp:4548:65: error: template argument 1 is invalid
  struct tie_t : public std::tuple<std::add_lvalue_reference_t<Tn>...> {
                                                                 ^
/om/user/arsalans/testoo/effil/libs/sol/single/sol/sol.hpp:4548:69: error: expected ‘{’ before ‘>’ token
  struct tie_t : public std::tuple<std::add_lvalue_reference_t<Tn>...> {
                                                                     ^
/om/user/arsalans/testoo/effil/libs/sol/single/sol/sol.hpp:4548:69: error: expected unqualified-id before ‘>’ token
/om/user/arsalans/testoo/effil/libs/sol/single/sol/sol.hpp:4592:3: warning: extra ‘;’ [-Wpedantic]
  };
   ^
/om/user/arsalans/testoo/effil/libs/sol/single/sol/sol.hpp:4599:16: error: ‘remove_reference_t’ is not a member of ‘std’
   inline tie_t<std::remove_reference_t<Tn>...> tie(Tn&&... argn) {
                ^
/om/user/arsalans/testoo/effil/libs/sol/single/sol/sol.hpp:4599:16: error: ‘remove_reference_t’ is not a member of ‘std’
/om/user/arsalans/testoo/effil/libs/sol/single/sol/sol.hpp:4599:42: error: template argument 1 is invalid
   inline tie_t<std::remove_reference_t<Tn>...> tie(Tn&&... argn) {
                                          ^
/om/user/arsalans/testoo/effil/libs/sol/single/sol/sol.hpp:4599:43: error: expected unqualified-id before ‘...’ token
   inline tie_t<std::remove_reference_t<Tn>...> tie(Tn&&... argn) {
                                           ^
In file included from /om/user/arsalans/testoo/effil/src/cpp/utils.h:7:0,
                 from /om/user/arsalans/testoo/effil/src/cpp/stored-object.h:3,
                 from /om/user/arsalans/testoo/effil/src/cpp/lua-helpers.h:3,
                 from /om/user/arsalans/testoo/effil/src/cpp/channel.h:4,
                 from /om/user/arsalans/testoo/effil/src/cpp/channel.cpp:1:
/om/user/arsalans/testoo/effil/libs/sol/single/sol/sol.hpp:84:3: warning: unused parameter ‘e’ [-Wunused-parameter]
   error(error&& e) = default;
   ^
In file included from /om/user/arsalans/testoo/effil/src/cpp/utils.h:7:0,
                 from /om/user/arsalans/testoo/effil/src/cpp/stored-object.h:3,
                 from /om/user/arsalans/testoo/effil/src/cpp/lua-helpers.h:3,
                 from /om/user/arsalans/testoo/effil/src/cpp/channel.h:4,
                 from /om/user/arsalans/testoo/effil/src/cpp/channel.cpp:1:
/om/user/arsalans/testoo/effil/libs/sol/single/sol/sol.hpp: In function ‘void sol::detail::stack_fail(int, int)’:
/om/user/arsalans/testoo/effil/libs/sol/single/sol/sol.hpp:4616:79: note: synthesized method ‘sol::error::error(sol::error&&)’ first required here 
    throw error(detail::direct_error, "imbalanced stack after operation finish");
                                                                               ^
In file included from /om/user/arsalans/testoo/effil/src/cpp/utils.h:7:0,
                 from /om/user/arsalans/testoo/effil/src/cpp/stored-object.h:3,
                 from /om/user/arsalans/testoo/effil/src/cpp/lua-helpers.h:3,
                 from /om/user/arsalans/testoo/effil/src/cpp/channel.h:4,
                 from /om/user/arsalans/testoo/effil/src/cpp/channel.cpp:1:
/om/user/arsalans/testoo/effil/libs/sol/single/sol/sol.hpp: At global scope:
/om/user/arsalans/testoo/effil/libs/sol/single/sol/sol.hpp:4777:20: error: expected primary-expression before ‘auto’
    inline decltype(auto) unchecked_get(lua_State* L, int index, record& tracking) {
                    ^
/om/user/arsalans/testoo/effil/libs/sol/single/sol/sol.hpp:4777:20: error: expected ‘)’ before ‘auto’
/om/user/arsalans/testoo/effil/libs/sol/single/sol/sol.hpp:4777:11: error: expected unqualified-id before ‘decltype’
    inline decltype(auto) unchecked_get(lua_State* L, int index, record& tracking) {
           ^
/om/user/arsalans/testoo/effil/libs/sol/single/sol/sol.hpp: In function ‘int sol::stack::stack_detail::push_reference(lua_State*, Arg&&, Args&& ...)’:
/om/user/arsalans/testoo/effil/libs/sol/single/sol/sol.hpp:4786:33: error: ‘unqualified_t’ is not a member of ‘sol::meta’
      meta::neg<is_lua_primitive<meta::unqualified_t<T>>>,
                                 ^
/om/user/arsalans/testoo/effil/libs/sol/single/sol/sol.hpp:4786:33: error: ‘unqualified_t’ is not a member of ‘sol::meta’
/om/user/arsalans/testoo/effil/libs/sol/single/sol/sol.hpp:4786:53: error: template argument 1 is invalid
      meta::neg<is_lua_primitive<meta::unqualified_t<T>>>,
                                                     ^
/om/user/arsalans/testoo/effil/libs/sol/single/sol/sol.hpp:4786:54: error: template argument 1 is invalid
      meta::neg<is_lua_primitive<meta::unqualified_t<T>>>,
                                                      ^
/om/user/arsalans/testoo/effil/libs/sol/single/sol/sol.hpp:4786:56: error: template argument 3 is invalid
      meta::neg<is_lua_primitive<meta::unqualified_t<T>>>,
                                                        ^
/om/user/arsalans/testoo/effil/libs/sol/single/sol/sol.hpp:4786:57: error: expected unqualified-id before ‘,’ token
      meta::neg<is_lua_primitive<meta::unqualified_t<T>>>,
                                                         ^
/om/user/arsalans/testoo/effil/libs/sol/single/sol/sol.hpp:4787:35: error: ‘unqualified_t’ is not a member of ‘sol::meta’
      meta::neg<is_unique_usertype<meta::unqualified_t<T>>>
                                   ^
/om/user/arsalans/testoo/effil/libs/sol/single/sol/sol.hpp:4787:35: error: ‘unqualified_t’ is not a member of ‘sol::meta’
/om/user/arsalans/testoo/effil/libs/sol/single/sol/sol.hpp:4787:55: error: template argument 1 is invalid
      meta::neg<is_unique_usertype<meta::unqualified_t<T>>>
                                                       ^
/om/user/arsalans/testoo/effil/libs/sol/single/sol/sol.hpp:4787:56: error: template argument 1 is invalid
      meta::neg<is_unique_usertype<meta::unqualified_t<T>>>
                                                        ^
/om/user/arsalans/testoo/effil/libs/sol/single/sol/sol.hpp:4789:19: error: ‘conditional_t’ is not a member of ‘std’
     return pusher<std::conditional_t<use_reference_tag::value, detail::as_reference_tag, meta::unqualified_t<T>>>{}.push(L, std::forward<Arg>(arg), std::forward<Args>(args)...);
                   ^
/om/user/arsalans/testoo/effil/libs/sol/single/sol/sol.hpp:4789:19: error: ‘conditional_t’ is not a member of ‘std’
/om/user/arsalans/testoo/effil/libs/sol/single/sol/sol.hpp:4789:38: error: ‘use_reference_tag’ was not declared in this scope
     return pusher<std::conditional_t<use_reference_tag::value, detail::as_reference_tag, meta::unqualified_t<T>>>{}.push(L, std::forward<Arg>(arg), std::forward<Args>(args)...);
                                      ^
/om/user/arsalans/testoo/effil/libs/sol/single/sol/sol.hpp:4789:111: error: template argument 1 is invalid
     return pusher<std::conditional_t<use_reference_tag::value, detail::as_reference_tag, meta::unqualified_t<T>>>{}.push(L, std::forward<Arg>(arg), std::forward<Args>(args)...);
                                                                                                               ^
/om/user/arsalans/testoo/effil/libs/sol/single/sol/sol.hpp:4789:114: error: expected primary-expression before ‘{’ token
     return pusher<std::conditional_t<use_reference_tag::value, detail::as_reference_tag, meta::unqualified_t<T>>>{}.push(L, std::forward<Arg>(arg), std::forward<Args>(args)...);
                                                                                                                  ^
/om/user/arsalans/testoo/effil/libs/sol/single/sol/sol.hpp:4789:114: error: expected ‘;’ before ‘{’ token
/om/user/arsalans/testoo/effil/libs/sol/single/sol/sol.hpp:4789:116: error: expected primary-expression before ‘.’ token
     return pusher<std::conditional_t<use_reference_tag::value, detail::as_reference_tag, meta::unqualified_t<T>>>{}.push(L, std::forward<Arg>(arg), std::forward<Args>(args)...);
                                                                                                                    ^
In file included from /om/user/arsalans/testoo/effil/src/cpp/utils.h:7:0,
                 from /om/user/arsalans/testoo/effil/src/cpp/stored-object.h:3,
                 from /om/user/arsalans/testoo/effil/src/cpp/lua-helpers.h:3,
                 from /om/user/arsalans/testoo/effil/src/cpp/channel.h:4,
                 from /om/user/arsalans/testoo/effil/src/cpp/channel.cpp:1:
/om/user/arsalans/testoo/effil/libs/sol/single/sol/sol.hpp: In function ‘int sol::stack::push(lua_State*, T&&, Args&& ...)’:
/om/user/arsalans/testoo/effil/libs/sol/single/sol/sol.hpp:4800:18: error: ‘unqualified_t’ is not a member of ‘sol::meta’
    return pusher<meta::unqualified_t<T>>{}.push(L, std::forward<T>(t), std::forward<Args>(args)...);
                  ^
/om/user/arsalans/testoo/effil/libs/sol/single/sol/sol.hpp:4800:18: error: ‘unqualified_t’ is not a member of ‘sol::meta’
/om/user/arsalans/testoo/effil/libs/sol/single/sol/sol.hpp:4800:38: error: template argument 1 is invalid
    return pusher<meta::unqualified_t<T>>{}.push(L, std::forward<T>(t), std::forward<Args>(args)...);
                                      ^
/om/user/arsalans/testoo/effil/libs/sol/single/sol/sol.hpp:4800:41: error: expected primary-expression before ‘{’ token
    return pusher<meta::unqualified_t<T>>{}.push(L, std::forward<T>(t), std::forward<Args>(args)...);
                                         ^
/om/user/arsalans/testoo/effil/libs/sol/single/sol/sol.hpp:4800:41: error: expected ‘;’ before ‘{’ token
/om/user/arsalans/testoo/effil/libs/sol/single/sol/sol.hpp:4800:43: error: expected primary-expression before ‘.’ token
    return pusher<meta::unqualified_t<T>>{}.push(L, std::forward<T>(t), std::forward<Args>(args)...);
                                           ^
/om/user/arsalans/testoo/effil/libs/sol/single/sol/sol.hpp: At global scope:
/om/user/arsalans/testoo/effil/libs/sol/single/sol/sol.hpp:4804:67: error: expected type-specifier
   template<typename T, typename Arg, typename... Args, typename = std::enable_if_t<!std::is_same<T, Arg>::value>>
                                                                   ^
/om/user/arsalans/testoo/effil/libs/sol/single/sol/sol.hpp:4804:67: error: expected ‘>’
/om/user/arsalans/testoo/effil/libs/sol/single/sol/sol.hpp: In function ‘int sol::stack::push(lua_State*, Arg&&, Args&& ...)’:
/om/user/arsalans/testoo/effil/libs/sol/single/sol/sol.hpp:4806:18: error: ‘unqualified_t’ is not a member of ‘sol::meta’
    return pusher<meta::unqualified_t<T>>{}.push(L, std::forward<Arg>(arg), std::forward<Args>(args)...);
                  ^
/om/user/arsalans/testoo/effil/libs/sol/single/sol/sol.hpp:4806:18: error: ‘unqualified_t’ is not a member of ‘sol::meta’
/om/user/arsalans/testoo/effil/libs/sol/single/sol/sol.hpp:4806:38: error: template argument 1 is invalid
    return pusher<meta::unqualified_t<T>>{}.push(L, std::forward<Arg>(arg), std::forward<Args>(args)...);
                                      ^
/om/user/arsalans/testoo/effil/libs/sol/single/sol/sol.hpp:4806:41: error: expected primary-expression before ‘{’ token
    return pusher<meta::unqualified_t<T>>{}.push(L, std::forward<Arg>(arg), std::forward<Args>(args)...);
                                         ^
/om/user/arsalans/testoo/effil/libs/sol/single/sol/sol.hpp:4806:41: error: expected ‘;’ before ‘{’ token
/om/user/arsalans/testoo/effil/libs/sol/single/sol/sol.hpp:4806:43: error: expected primary-expression before ‘.’ token
    return pusher<meta::unqualified_t<T>>{}.push(L, std::forward<Arg>(arg), std::forward<Args>(args)...);
                                           ^
/om/user/arsalans/testoo/effil/libs/sol/single/sol/sol.hpp: In function ‘bool sol::stack::check(lua_State*, int, Handler&&, sol::stack::record&)’:
/om/user/arsalans/testoo/effil/libs/sol/single/sol/sol.hpp:4845:12: error: ‘unqualified_t’ in namespace ‘sol::meta’ does not name a type
    typedef meta::unqualified_t<T> Tu;
            ^
/om/user/arsalans/testoo/effil/libs/sol/single/sol/sol.hpp:4846:12: error: ‘Tu’ was not declared in this scope
    checker<Tu> c;
            ^
/om/user/arsalans/testoo/effil/libs/sol/single/sol/sol.hpp:4846:14: error: template argument 1 is invalid
    checker<Tu> c;
              ^
/om/user/arsalans/testoo/effil/libs/sol/single/sol/sol.hpp:4846:14: error: template argument 2 is invalid
/om/user/arsalans/testoo/effil/libs/sol/single/sol/sol.hpp:4846:17: error: invalid type in declaration before ‘;’ token
    checker<Tu> c;
                 ^
/om/user/arsalans/testoo/effil/libs/sol/single/sol/sol.hpp:4849:13: error: request for member ‘check’ in ‘c’, which is of non-class type ‘int’
    return c.check(L, index, std::forward<Handler>(handler), tracking);
             ^
/om/user/arsalans/testoo/effil/libs/sol/single/sol/sol.hpp: At global scope:
/om/user/arsalans/testoo/effil/libs/sol/single/sol/sol.hpp:4859:50: error: ‘unqualified_t’ is not a member of ‘sol::meta’
   bool check(lua_State* L, int index = -lua_size<meta::unqualified_t<T>>::value) {
                                                  ^
/om/user/arsalans/testoo/effil/libs/sol/single/sol/sol.hpp:4859:50: error: ‘unqualified_t’ is not a member of ‘sol::meta’
/om/user/arsalans/testoo/effil/libs/sol/single/sol/sol.hpp:4859:70: error: template argument 1 is invalid
   bool check(lua_State* L, int index = -lua_size<meta::unqualified_t<T>>::value) {
                                                                      ^
/om/user/arsalans/testoo/effil/libs/sol/single/sol/sol.hpp:4859:50: error: ‘unqualified_t’ is not a member of ‘sol::meta’
   bool check(lua_State* L, int index = -lua_size<meta::unqualified_t<T>>::value) {
                                                  ^
/om/user/arsalans/testoo/effil/libs/sol/single/sol/sol.hpp:4859:50: error: ‘unqualified_t’ is not a member of ‘sol::meta’
/om/user/arsalans/testoo/effil/libs/sol/single/sol/sol.hpp:4859:71: error: template argument 1 is invalid
   bool check(lua_State* L, int index = -lua_size<meta::unqualified_t<T>>::value) {
                                                                       ^
/om/user/arsalans/testoo/effil/libs/sol/single/sol/sol.hpp:4859:50: error: ‘unqualified_t’ is not a member of ‘sol::meta’
   bool check(lua_State* L, int index = -lua_size<meta::unqualified_t<T>>::value) {
                                                  ^
/om/user/arsalans/testoo/effil/libs/sol/single/sol/sol.hpp:4859:50: error: ‘unqualified_t’ is not a member of ‘sol::meta’
/om/user/arsalans/testoo/effil/libs/sol/single/sol/sol.hpp:4859:71: error: template argument 1 is invalid
   bool check(lua_State* L, int index = -lua_size<meta::unqualified_t<T>>::value) {
                                                                       ^
/om/user/arsalans/testoo/effil/libs/sol/single/sol/sol.hpp:4859:50: error: ‘unqualified_t’ is not a member of ‘sol::meta’
   bool check(lua_State* L, int index = -lua_size<meta::unqualified_t<T>>::value) {
                                                  ^
/om/user/arsalans/testoo/effil/libs/sol/single/sol/sol.hpp:4859:50: error: ‘unqualified_t’ is not a member of ‘sol::meta’
/om/user/arsalans/testoo/effil/libs/sol/single/sol/sol.hpp:4859:71: error: template argument 1 is invalid
   bool check(lua_State* L, int index = -lua_size<meta::unqualified_t<T>>::value) {
                                                                       ^
/om/user/arsalans/testoo/effil/libs/sol/single/sol/sol.hpp:4859:50: error: ‘unqualified_t’ is not a member of ‘sol::meta’
   bool check(lua_State* L, int index = -lua_size<meta::unqualified_t<T>>::value) {
                                                  ^
/om/user/arsalans/testoo/effil/libs/sol/single/sol/sol.hpp:4859:50: error: ‘unqualified_t’ is not a member of ‘sol::meta’
/om/user/arsalans/testoo/effil/libs/sol/single/sol/sol.hpp:4859:71: error: template argument 1 is invalid
   bool check(lua_State* L, int index = -lua_size<meta::unqualified_t<T>>::value) {
                                                                       ^
/om/user/arsalans/testoo/effil/libs/sol/single/sol/sol.hpp:4859:50: error: ‘unqualified_t’ is not a member of ‘sol::meta’
   bool check(lua_State* L, int index = -lua_size<meta::unqualified_t<T>>::value) {
                                                  ^
/om/user/arsalans/testoo/effil/libs/sol/single/sol/sol.hpp:4859:50: error: ‘unqualified_t’ is not a member of ‘sol::meta’
/om/user/arsalans/testoo/effil/libs/sol/single/sol/sol.hpp:4859:71: error: template argument 1 is invalid
   bool check(lua_State* L, int index = -lua_size<meta::unqualified_t<T>>::value) {
                                                                       ^
/om/user/arsalans/testoo/effil/libs/sol/single/sol/sol.hpp:4859:50: error: ‘unqualified_t’ is not a member of ‘sol::meta’
   bool check(lua_State* L, int index = -lua_size<meta::unqualified_t<T>>::value) {
                                                  ^
/om/user/arsalans/testoo/effil/libs/sol/single/sol/sol.hpp:4859:50: error: ‘unqualified_t’ is not a member of ‘sol::meta’
/om/user/arsalans/testoo/effil/libs/sol/single/sol/sol.hpp:4859:71: error: template argument 1 is invalid
   bool check(lua_State* L, int index = -lua_size<meta::unqualified_t<T>>::value) {
                                                                       ^
/om/user/arsalans/testoo/effil/libs/sol/single/sol/sol.hpp:4859:50: error: ‘unqualified_t’ is not a member of ‘sol::meta’
   bool check(lua_State* L, int index = -lua_size<meta::unqualified_t<T>>::value) {
                                                  ^
/om/user/arsalans/testoo/effil/libs/sol/single/sol/sol.hpp:4859:50: error: ‘unqualified_t’ is not a member of ‘sol::meta’
/om/user/arsalans/testoo/effil/libs/sol/single/sol/sol.hpp:4859:71: error: template argument 1 is invalid
   bool check(lua_State* L, int index = -lua_size<meta::unqualified_t<T>>::value) {
                                                                       ^
/om/user/arsalans/testoo/effil/libs/sol/single/sol/sol.hpp:4859:50: error: ‘unqualified_t’ is not a member of ‘sol::meta’
   bool check(lua_State* L, int index = -lua_size<meta::unqualified_t<T>>::value) {
                                                  ^
/om/user/arsalans/testoo/effil/libs/sol/single/sol/sol.hpp:4859:50: error: ‘unqualified_t’ is not a member of ‘sol::meta’
/om/user/arsalans/testoo/effil/libs/sol/single/sol/sol.hpp:4859:71: error: template argument 1 is invalid
   bool check(lua_State* L, int index = -lua_size<meta::unqualified_t<T>>::value) {
                                                                       ^
/om/user/arsalans/testoo/effil/libs/sol/single/sol/sol.hpp:4859:49: error: missing template arguments before ‘<’ token
   bool check(lua_State* L, int index = -lua_size<meta::unqualified_t<T>>::value) {
                                                 ^
/om/user/arsalans/testoo/effil/libs/sol/single/sol/sol.hpp:4859:50: error: ‘unqualified_t’ is not a member of ‘sol::meta’
   bool check(lua_State* L, int index = -lua_size<meta::unqualified_t<T>>::value) {
                                                  ^
/om/user/arsalans/testoo/effil/libs/sol/single/sol/sol.hpp:4859:71: error: expected primary-expression before ‘>’ token
   bool check(lua_State* L, int index = -lua_size<meta::unqualified_t<T>>::value) {
                                                                       ^
/om/user/arsalans/testoo/effil/libs/sol/single/sol/sol.hpp:4859:73: error: ‘::value’ has not been declared
   bool check(lua_State* L, int index = -lua_size<meta::unqualified_t<T>>::value) {
                                                                         ^
/om/user/arsalans/testoo/effil/libs/sol/single/sol/sol.hpp:4865:19: error: expected primary-expression before ‘auto’
   inline decltype(auto) check_get(lua_State* L, int index, Handler&& handler, record& tracking) {
                   ^
/om/user/arsalans/testoo/effil/libs/sol/single/sol/sol.hpp:4865:19: error: expected ‘)’ before ‘auto’
/om/user/arsalans/testoo/effil/libs/sol/single/sol/sol.hpp:4865:10: error: expected unqualified-id before ‘decltype’
   inline decltype(auto) check_get(lua_State* L, int index, Handler&& handler, record& tracking) {
          ^
/om/user/arsalans/testoo/effil/libs/sol/single/sol/sol.hpp:4870:19: error: expected primary-expression before ‘auto’
   inline decltype(auto) check_get(lua_State* L, int index, Handler&& handler) {
                   ^
/om/user/arsalans/testoo/effil/libs/sol/single/sol/sol.hpp:4870:19: error: expected ‘)’ before ‘auto’
/om/user/arsalans/testoo/effil/libs/sol/single/sol/sol.hpp:4870:10: error: expected unqualified-id before ‘decltype’
   inline decltype(auto) check_get(lua_State* L, int index, Handler&& handler) {
          ^
/om/user/arsalans/testoo/effil/libs/sol/single/sol/sol.hpp:4876:19: error: expected primary-expression before ‘auto’
   inline decltype(auto) check_get(lua_State* L, int index = -lua_size<meta::unqualified_t<T>>::value) {
                   ^
/om/user/arsalans/testoo/effil/libs/sol/single/sol/sol.hpp:4876:19: error: expected ‘)’ before ‘auto’
/om/user/arsalans/testoo/effil/libs/sol/single/sol/sol.hpp:4876:10: error: expected unqualified-id before ‘decltype’
   inline decltype(auto) check_get(lua_State* L, int index = -lua_size<meta::unqualified_t<T>>::value) {
          ^
/om/user/arsalans/testoo/effil/libs/sol/single/sol/sol.hpp:4891:20: error: expected primary-expression before ‘auto’
    inline decltype(auto) tagged_get(types<T>, lua_State* L, int index, record& tracking) {
                    ^
/om/user/arsalans/testoo/effil/libs/sol/single/sol/sol.hpp:4891:20: error: expected ‘)’ before ‘auto’
/om/user/arsalans/testoo/effil/libs/sol/single/sol/sol.hpp:4891:11: error: expected unqualified-id before ‘decltype’
    inline decltype(auto) tagged_get(types<T>, lua_State* L, int index, record& tracking) {
           ^
/om/user/arsalans/testoo/effil/libs/sol/single/sol/sol.hpp:4897:20: error: expected primary-expression before ‘auto’
    inline decltype(auto) tagged_get(types<optional<T>>, lua_State* L, int index, record& tracking) {
                    ^
/om/user/arsalans/testoo/effil/libs/sol/single/sol/sol.hpp:4897:20: error: expected ‘)’ before ‘auto’
/om/user/arsalans/testoo/effil/libs/sol/single/sol/sol.hpp:4897:11: error: expected unqualified-id before ‘decltype’
    inline decltype(auto) tagged_get(types<optional<T>>, lua_State* L, int index, record& tracking) {
           ^
/om/user/arsalans/testoo/effil/libs/sol/single/sol/sol.hpp: In function ‘bool sol::stack::multi_check(lua_State*, int, Handler&&, sol::stack::record&)’:
/om/user/arsalans/testoo/effil/libs/sol/single/sol/sol.hpp:4928:54: error: ‘unqualified_t’ is not a member of ‘sol::meta’
    return stack_detail::check_types<b>{}.check(types<meta::unqualified_t<Args>...>(), L, index, std::forward<Handler>(handler), tracking);
                                                      ^
/om/user/arsalans/testoo/effil/libs/sol/single/sol/sol.hpp:4928:54: error: ‘unqualified_t’ is not a member of ‘sol::meta’
/om/user/arsalans/testoo/effil/libs/sol/single/sol/sol.hpp:4928:78: error: template argument 1 is invalid
    return stack_detail::check_types<b>{}.check(types<meta::unqualified_t<Args>...>(), L, index, std::forward<Handler>(handler), tracking);
                                                                              ^
/om/user/arsalans/testoo/effil/libs/sol/single/sol/sol.hpp: At global scope:
/om/user/arsalans/testoo/effil/libs/sol/single/sol/sol.hpp:4959:19: error: expected primary-expression before ‘auto’
   inline decltype(auto) get(lua_State* L, int index, record& tracking) {
                   ^
/om/user/arsalans/testoo/effil/libs/sol/single/sol/sol.hpp:4959:19: error: expected ‘)’ before ‘auto’
/om/user/arsalans/testoo/effil/libs/sol/single/sol/sol.hpp:4959:10: error: expected unqualified-id before ‘decltype’
   inline decltype(auto) get(lua_State* L, int index, record& tracking) {
          ^
/om/user/arsalans/testoo/effil/libs/sol/single/sol/sol.hpp:4964:19: error: expected primary-expression before ‘auto’
   inline decltype(auto) get(lua_State* L, int index = -lua_size<meta::unqualified_t<T>>::value) {
                   ^
/om/user/arsalans/testoo/effil/libs/sol/single/sol/sol.hpp:4964:19: error: expected ‘)’ before ‘auto’
/om/user/arsalans/testoo/effil/libs/sol/single/sol/sol.hpp:4964:10: error: expected unqualified-id before ‘decltype’
   inline decltype(auto) get(lua_State* L, int index = -lua_size<meta::unqualified_t<T>>::value) {
          ^
/om/user/arsalans/testoo/effil/libs/sol/single/sol/sol.hpp:4970:19: error: expected primary-expression before ‘auto’
   inline decltype(auto) pop(lua_State* L) {
                   ^
/om/user/arsalans/testoo/effil/libs/sol/single/sol/sol.hpp:4970:19: error: expected ‘)’ before ‘auto’
/om/user/arsalans/testoo/effil/libs/sol/single/sol/sol.hpp:4970:10: error: expected unqualified-id before ‘decltype’
   inline decltype(auto) pop(lua_State* L) {
          ^
/om/user/arsalans/testoo/effil/libs/sol/single/sol/sol.hpp: In function ‘void sol::stack::get_field(lua_State*, Key&&)’:
/om/user/arsalans/testoo/effil/libs/sol/single/sol/sol.hpp:4976:17: error: ‘unqualified_t’ is not a member of ‘sol::meta’
    field_getter<meta::unqualified_t<Key>, global, raw>{}.get(L, std::forward<Key>(key));
                 ^
/om/user/arsalans/testoo/effil/libs/sol/single/sol/sol.hpp:4976:17: error: ‘unqualified_t’ is not a member of ‘sol::meta’
/om/user/arsalans/testoo/effil/libs/sol/single/sol/sol.hpp:4976:40: error: template argument 1 is invalid
    field_getter<meta::unqualified_t<Key>, global, raw>{}.get(L, std::forward<Key>(key));
                                        ^
/om/user/arsalans/testoo/effil/libs/sol/single/sol/sol.hpp:4976:41: error: expected unqualified-id before ‘,’ token
    field_getter<meta::unqualified_t<Key>, global, raw>{}.get(L, std::forward<Key>(key));
                                         ^
/om/user/arsalans/testoo/effil/libs/sol/single/sol/sol.hpp:4976:49: error: invalid type in declaration before ‘,’ token
    field_getter<meta::unqualified_t<Key>, global, raw>{}.get(L, std::forward<Key>(key));
                                                 ^
/om/user/arsalans/testoo/effil/libs/sol/single/sol/sol.hpp:4976:49: error: declaration of ‘int global’
/om/user/arsalans/testoo/effil/libs/sol/single/sol/sol.hpp:4974:13: error:  shadows template parm ‘bool global’
   template <bool global = false, bool raw = false, typename Key>
             ^
/om/user/arsalans/testoo/effil/libs/sol/single/sol/sol.hpp:4976:54: error: expected initializer before ‘>’ token
    field_getter<meta::unqualified_t<Key>, global, raw>{}.get(L, std::forward<Key>(key));
                                                      ^
/om/user/arsalans/testoo/effil/libs/sol/single/sol/sol.hpp:4976:57: error: expected primary-expression before ‘.’ token
    field_getter<meta::unqualified_t<Key>, global, raw>{}.get(L, std::forward<Key>(key));
                                                         ^
/om/user/arsalans/testoo/effil/libs/sol/single/sol/sol.hpp: In function ‘void sol::stack::get_field(lua_State*, Key&&, int)’:
/om/user/arsalans/testoo/effil/libs/sol/single/sol/sol.hpp:4981:17: error: ‘unqualified_t’ is not a member of ‘sol::meta’
    field_getter<meta::unqualified_t<Key>, global, raw>{}.get(L, std::forward<Key>(key), tableindex);
                 ^
/om/user/arsalans/testoo/effil/libs/sol/single/sol/sol.hpp:4981:17: error: ‘unqualified_t’ is not a member of ‘sol::meta’
/om/user/arsalans/testoo/effil/libs/sol/single/sol/sol.hpp:4981:40: error: template argument 1 is invalid
    field_getter<meta::unqualified_t<Key>, global, raw>{}.get(L, std::forward<Key>(key), tableindex);
                                        ^
/om/user/arsalans/testoo/effil/libs/sol/single/sol/sol.hpp:4981:41: error: expected unqualified-id before ‘,’ token
    field_getter<meta::unqualified_t<Key>, global, raw>{}.get(L, std::forward<Key>(key), tableindex);
                                         ^
/om/user/arsalans/testoo/effil/libs/sol/single/sol/sol.hpp:4981:49: error: invalid type in declaration before ‘,’ token
    field_getter<meta::unqualified_t<Key>, global, raw>{}.get(L, std::forward<Key>(key), tableindex);
                                                 ^
/om/user/arsalans/testoo/effil/libs/sol/single/sol/sol.hpp:4981:49: error: declaration of ‘int global’
/om/user/arsalans/testoo/effil/libs/sol/single/sol/sol.hpp:4979:13: error:  shadows template parm ‘bool global’
   template <bool global = false, bool raw = false, typename Key>
             ^
/om/user/arsalans/testoo/effil/libs/sol/single/sol/sol.hpp:4981:54: error: expected initializer before ‘>’ token
    field_getter<meta::unqualified_t<Key>, global, raw>{}.get(L, std::forward<Key>(key), tableindex);
                                                      ^
/om/user/arsalans/testoo/effil/libs/sol/single/sol/sol.hpp:4981:57: error: expected primary-expression before ‘.’ token
    field_getter<meta::unqualified_t<Key>, global, raw>{}.get(L, std::forward<Key>(key), tableindex);
                                                         ^
/om/user/arsalans/testoo/effil/libs/sol/single/sol/sol.hpp: In function ‘sol::stack::probe sol::stack::probe_get_field(lua_State*, Key&&)’:
/om/user/arsalans/testoo/effil/libs/sol/single/sol/sol.hpp:4996:30: error: ‘unqualified_t’ is not a member of ‘sol::meta’
    return probe_field_getter<meta::unqualified_t<Key>, global, raw>{}.get(L, std::forward<Key>(key));
                              ^
/om/user/arsalans/testoo/effil/libs/sol/single/sol/sol.hpp:4996:30: error: ‘unqualified_t’ is not a member of ‘sol::meta’
/om/user/arsalans/testoo/effil/libs/sol/single/sol/sol.hpp:4996:53: error: template argument 1 is invalid
    return probe_field_getter<meta::unqualified_t<Key>, global, raw>{}.get(L, std::forward<Key>(key));
                                                     ^
/om/user/arsalans/testoo/effil/libs/sol/single/sol/sol.hpp:4996:68: error: expected primary-expression before ‘{’ token
    return probe_field_getter<meta::unqualified_t<Key>, global, raw>{}.get(L, std::forward<Key>(key));
                                                                    ^
/om/user/arsalans/testoo/effil/libs/sol/single/sol/sol.hpp:4996:68: error: expected ‘;’ before ‘{’ token
/om/user/arsalans/testoo/effil/libs/sol/single/sol/sol.hpp:4996:70: error: expected primary-expression before ‘.’ token
    return probe_field_getter<meta::unqualified_t<Key>, global, raw>{}.get(L, std::forward<Key>(key));
                                                                      ^
/om/user/arsalans/testoo/effil/libs/sol/single/sol/sol.hpp: In function ‘sol::stack::probe sol::stack::probe_get_field(lua_State*, Key&&, int)’:
/om/user/arsalans/testoo/effil/libs/sol/single/sol/sol.hpp:5001:30: error: ‘unqualified_t’ is not a member of ‘sol::meta’
    return probe_field_getter<meta::unqualified_t<Key>, global, raw>{}.get(L, std::forward<Key>(key), tableindex);
                              ^
/om/user/arsalans/testoo/effil/libs/sol/single/sol/sol.hpp:5001:30: error: ‘unqualified_t’ is not a member of ‘sol::meta’
/om/user/arsalans/testoo/effil/libs/sol/single/sol/sol.hpp:5001:53: error: template argument 1 is invalid
    return probe_field_getter<meta::unqualified_t<Key>, global, raw>{}.get(L, std::forward<Key>(key), tableindex);
                                                     ^
/om/user/arsalans/testoo/effil/libs/sol/single/sol/sol.hpp:5001:68: error: expected primary-expression before ‘{’ token
    return probe_field_getter<meta::unqualified_t<Key>, global, raw>{}.get(L, std::forward<Key>(key), tableindex);
                                                                    ^
/om/user/arsalans/testoo/effil/libs/sol/single/sol/sol.hpp:5001:68: error: expected ‘;’ before ‘{’ token
/om/user/arsalans/testoo/effil/libs/sol/single/sol/sol.hpp:5001:70: error: expected primary-expression before ‘.’ token
    return probe_field_getter<meta::unqualified_t<Key>, global, raw>{}.get(L, std::forward<Key>(key), tableindex);
                                                                      ^
/om/user/arsalans/testoo/effil/libs/sol/single/sol/sol.hpp: In function ‘void sol::stack::set_field(lua_State*, Key&&, Value&&)’:
/om/user/arsalans/testoo/effil/libs/sol/single/sol/sol.hpp:5016:17: error: ‘unqualified_t’ is not a member of ‘sol::meta’
    field_setter<meta::unqualified_t<Key>, global, raw>{}.set(L, std::forward<Key>(key), std::forward<Value>(value));
                 ^
/om/user/arsalans/testoo/effil/libs/sol/single/sol/sol.hpp:5016:17: error: ‘unqualified_t’ is not a member of ‘sol::meta’
/om/user/arsalans/testoo/effil/libs/sol/single/sol/sol.hpp:5016:40: error: template argument 1 is invalid
    field_setter<meta::unqualified_t<Key>, global, raw>{}.set(L, std::forward<Key>(key), std::forward<Value>(value));
                                        ^
/om/user/arsalans/testoo/effil/libs/sol/single/sol/sol.hpp:5016:41: error: expected unqualified-id before ‘,’ token
    field_setter<meta::unqualified_t<Key>, global, raw>{}.set(L, std::forward<Key>(key), std::forward<Value>(value));
                                         ^
/om/user/arsalans/testoo/effil/libs/sol/single/sol/sol.hpp:5016:49: error: invalid type in declaration before ‘,’ token
    field_setter<meta::unqualified_t<Key>, global, raw>{}.set(L, std::forward<Key>(key), std::forward<Value>(value));
                                                 ^
/om/user/arsalans/testoo/effil/libs/sol/single/sol/sol.hpp:5016:49: error: declaration of ‘int global’
/om/user/arsalans/testoo/effil/libs/sol/single/sol/sol.hpp:5014:13: error:  shadows template parm ‘bool global’
   template <bool global = false, bool raw = false, typename Key, typename Value>
             ^
/om/user/arsalans/testoo/effil/libs/sol/single/sol/sol.hpp:5016:54: error: expected initializer before ‘>’ token
    field_setter<meta::unqualified_t<Key>, global, raw>{}.set(L, std::forward<Key>(key), std::forward<Value>(value));
                                                      ^
/om/user/arsalans/testoo/effil/libs/sol/single/sol/sol.hpp:5016:57: error: expected primary-expression before ‘.’ token
    field_setter<meta::unqualified_t<Key>, global, raw>{}.set(L, std::forward<Key>(key), std::forward<Value>(value));
                                                         ^
/om/user/arsalans/testoo/effil/libs/sol/single/sol/sol.hpp: In function ‘void sol::stack::set_field(lua_State*, Key&&, Value&&, int)’:
/om/user/arsalans/testoo/effil/libs/sol/single/sol/sol.hpp:5021:17: error: ‘unqualified_t’ is not a member of ‘sol::meta’
    field_setter<meta::unqualified_t<Key>, global, raw>{}.set(L, std::forward<Key>(key), std::forward<Value>(value), tableindex);
                 ^
/om/user/arsalans/testoo/effil/libs/sol/single/sol/sol.hpp:5021:17: error: ‘unqualified_t’ is not a member of ‘sol::meta’
/om/user/arsalans/testoo/effil/libs/sol/single/sol/sol.hpp:5021:40: error: template argument 1 is invalid
    field_setter<meta::unqualified_t<Key>, global, raw>{}.set(L, std::forward<Key>(key), std::forward<Value>(value), tableindex);
                                        ^
/om/user/arsalans/testoo/effil/libs/sol/single/sol/sol.hpp:5021:41: error: expected unqualified-id before ‘,’ token
    field_setter<meta::unqualified_t<Key>, global, raw>{}.set(L, std::forward<Key>(key), std::forward<Value>(value), tableindex);
                                         ^
/om/user/arsalans/testoo/effil/libs/sol/single/sol/sol.hpp:5021:49: error: invalid type in declaration before ‘,’ token
    field_setter<meta::unqualified_t<Key>, global, raw>{}.set(L, std::forward<Key>(key), std::forward<Value>(value), tableindex);
                                                 ^
/om/user/arsalans/testoo/effil/libs/sol/single/sol/sol.hpp:5021:49: error: declaration of ‘int global’
/om/user/arsalans/testoo/effil/libs/sol/single/sol/sol.hpp:5019:13: error:  shadows template parm ‘bool global’
   template <bool global = false, bool raw = false, typename Key, typename Value>
             ^
/om/user/arsalans/testoo/effil/libs/sol/single/sol/sol.hpp:5021:54: error: expected initializer before ‘>’ token
    field_setter<meta::unqualified_t<Key>, global, raw>{}.set(L, std::forward<Key>(key), std::forward<Value>(value), tableindex);
                                                      ^
/om/user/arsalans/testoo/effil/libs/sol/single/sol/sol.hpp:5021:57: error: expected primary-expression before ‘.’ token
    field_setter<meta::unqualified_t<Key>, global, raw>{}.set(L, std::forward<Key>(key), std::forward<Value>(value), tableindex);
                                                         ^
In file included from /om/user/arsalans/testoo/effil/src/cpp/utils.h:7:0,
                 from /om/user/arsalans/testoo/effil/src/cpp/stored-object.h:3,
                 from /om/user/arsalans/testoo/effil/src/cpp/lua-helpers.h:3,
                 from /om/user/arsalans/testoo/effil/src/cpp/channel.h:4,
                 from /om/user/arsalans/testoo/effil/src/cpp/channel.cpp:1:
/om/user/arsalans/testoo/effil/libs/sol/single/sol/sol.hpp: At global scope:
/om/user/arsalans/testoo/effil/libs/sol/single/sol/sol.hpp:5248:19: error: expected primary-expression before ‘auto’
   inline decltype(auto) base_class_check_key() {
                   ^
/om/user/arsalans/testoo/effil/libs/sol/single/sol/sol.hpp:5248:19: error: expected ‘)’ before ‘auto’
/om/user/arsalans/testoo/effil/libs/sol/single/sol/sol.hpp:5248:10: error: expected unqualified-id before ‘decltype’
   inline decltype(auto) base_class_check_key() {
          ^
/om/user/arsalans/testoo/effil/libs/sol/single/sol/sol.hpp:5253:19: error: expected primary-expression before ‘auto’
   inline decltype(auto) base_class_cast_key() {
                   ^
/om/user/arsalans/testoo/effil/libs/sol/single/sol/sol.hpp:5253:19: error: expected ‘)’ before ‘auto’
/om/user/arsalans/testoo/effil/libs/sol/single/sol/sol.hpp:5253:10: error: expected unqualified-id before ‘decltype’
   inline decltype(auto) base_class_cast_key() {
          ^
/om/user/arsalans/testoo/effil/libs/sol/single/sol/sol.hpp:5258:19: error: expected primary-expression before ‘auto’
   inline decltype(auto) base_class_index_propogation_key() {
                   ^
/om/user/arsalans/testoo/effil/libs/sol/single/sol/sol.hpp:5258:19: error: expected ‘)’ before ‘auto’
/om/user/arsalans/testoo/effil/libs/sol/single/sol/sol.hpp:5258:10: error: expected unqualified-id before ‘decltype’
   inline decltype(auto) base_class_index_propogation_key() {
          ^
/om/user/arsalans/testoo/effil/libs/sol/single/sol/sol.hpp:5263:19: error: expected primary-expression before ‘auto’
   inline decltype(auto) base_class_new_index_propogation_key() {
                   ^
/om/user/arsalans/testoo/effil/libs/sol/single/sol/sol.hpp:5263:19: error: expected ‘)’ before ‘auto’
/om/user/arsalans/testoo/effil/libs/sol/single/sol/sol.hpp:5263:10: error: expected unqualified-id before ‘decltype’
   inline decltype(auto) base_class_new_index_propogation_key() {
          ^
In file included from /om/user/arsalans/testoo/effil/src/cpp/utils.h:7:0,
                 from /om/user/arsalans/testoo/effil/src/cpp/stored-object.h:3,
                 from /om/user/arsalans/testoo/effil/src/cpp/lua-helpers.h:3,
                 from /om/user/arsalans/testoo/effil/src/cpp/channel.h:4,
                 from /om/user/arsalans/testoo/effil/src/cpp/channel.cpp:1:
/om/user/arsalans/testoo/effil/libs/sol/single/sol/sol.hpp:5358:35: error: ‘enable_if_t’ is not a member of ‘std’
   struct checker<T, type::number, std::enable_if_t<std::is_integral<T>::value>> {
                                   ^
/om/user/arsalans/testoo/effil/libs/sol/single/sol/sol.hpp:5358:35: error: ‘enable_if_t’ is not a member of ‘std’
/om/user/arsalans/testoo/effil/libs/sol/single/sol/sol.hpp:5358:73: error: type/value mismatch at argument 3 in template parameter list for ‘template<class T, sol::type <anonymous>, class> struct sol::stack::checker’
   struct checker<T, type::number, std::enable_if_t<std::is_integral<T>::value>> {
                                                                         ^
/om/user/arsalans/testoo/effil/libs/sol/single/sol/sol.hpp:5358:73: error:   expected a type, got ‘(<expression error> < std::is_integral<_Tp>::value)’
/om/user/arsalans/testoo/effil/libs/sol/single/sol/sol.hpp:5358:78: error: expected unqualified-id before ‘>’ token
   struct checker<T, type::number, std::enable_if_t<std::is_integral<T>::value>> {
                                                                              ^
/om/user/arsalans/testoo/effil/libs/sol/single/sol/sol.hpp:5369:4: warning: extra ‘;’ [-Wpedantic]
   };
    ^
/om/user/arsalans/testoo/effil/libs/sol/single/sol/sol.hpp:5372:35: error: ‘enable_if_t’ is not a member of ‘std’
   struct checker<T, type::number, std::enable_if_t<std::is_floating_point<T>::value>> {
                                   ^
/om/user/arsalans/testoo/effil/libs/sol/single/sol/sol.hpp:5372:35: error: ‘enable_if_t’ is not a member of ‘std’
/om/user/arsalans/testoo/effil/libs/sol/single/sol/sol.hpp:5372:79: error: type/value mismatch at argument 3 in template parameter list for ‘template<class T, sol::type <anonymous>, class> struct sol::stack::checker’
   struct checker<T, type::number, std::enable_if_t<std::is_floating_point<T>::value>> {
                                                                               ^
/om/user/arsalans/testoo/effil/libs/sol/single/sol/sol.hpp:5372:79: error:   expected a type, got ‘(<expression error> < std::is_floating_point<_Tp>::value)’
/om/user/arsalans/testoo/effil/libs/sol/single/sol/sol.hpp:5372:84: error: expected unqualified-id before ‘>’ token
   struct checker<T, type::number, std::enable_if_t<std::is_floating_point<T>::value>> {
                                                                                    ^
/om/user/arsalans/testoo/effil/libs/sol/single/sol/sol.hpp:5383:4: warning: extra ‘;’ [-Wpedantic]
   };
    ^
/om/user/arsalans/testoo/effil/libs/sol/single/sol/sol.hpp:5504:18: error: ‘remove_pointer_t’ is not a member of ‘std’
   struct checker<std::remove_pointer_t<lua_CFunction>, type::function, C> : checker<lua_CFunction, type::function, C> {};
                  ^
/om/user/arsalans/testoo/effil/libs/sol/single/sol/sol.hpp:5504:18: error: ‘remove_pointer_t’ is not a member of ‘std’
/om/user/arsalans/testoo/effil/libs/sol/single/sol/sol.hpp:5504:53: error: template argument 1 is invalid
   struct checker<std::remove_pointer_t<lua_CFunction>, type::function, C> : checker<lua_CFunction, type::function, C> {};
                                                     ^
/om/user/arsalans/testoo/effil/libs/sol/single/sol/sol.hpp:5504:53: error: template argument 2 is invalid
/om/user/arsalans/testoo/effil/libs/sol/single/sol/sol.hpp:5504:121: warning: extra ‘;’ [-Wpedantic]
   struct checker<std::remove_pointer_t<lua_CFunction>, type::function, C> : checker<lua_CFunction, type::function, C> {};
                                                                                                                         ^
/om/user/arsalans/testoo/effil/libs/sol/single/sol/sol.hpp: In static member function ‘static bool sol::stack::checker<sol::detail::as_value_tag<T>, (sol::type)7, C>::check(sol::types<U>, lua_State*, sol::type, int, Handler&&, sol::stack::record&)’:
/om/user/arsalans/testoo/effil/libs/sol/single/sol/sol.hpp:5653:25: error: ‘base_class_check_key’ is not a member of ‘sol::detail’
      lua_pushstring(L, &detail::base_class_check_key()[0]);
                         ^
/om/user/arsalans/testoo/effil/libs/sol/single/sol/sol.hpp: In static member function ‘static bool sol::stack::checker<T*, (sol::type)7, C>::check(lua_State*, int, Handler&&, sol::stack::record&)’:
/om/user/arsalans/testoo/effil/libs/sol/single/sol/sol.hpp:5690:20: error: ‘unqualified_t’ is not a member of ‘sol::meta’
     return checker<meta::unqualified_t<T>, type::userdata, C>{}.check(L, index, std::forward<Handler>(handler), tracking);
                    ^
/om/user/arsalans/testoo/effil/libs/sol/single/sol/sol.hpp:5690:20: error: ‘unqualified_t’ is not a member of ‘sol::meta’
/om/user/arsalans/testoo/effil/libs/sol/single/sol/sol.hpp:5690:41: error: template argument 1 is invalid
     return checker<meta::unqualified_t<T>, type::userdata, C>{}.check(L, index, std::forward<Handler>(handler), tracking);
                                         ^
/om/user/arsalans/testoo/effil/libs/sol/single/sol/sol.hpp:5690:41: error: template argument 2 is invalid
/om/user/arsalans/testoo/effil/libs/sol/single/sol/sol.hpp:5690:61: error: expected primary-expression before ‘>’ token
     return checker<meta::unqualified_t<T>, type::userdata, C>{}.check(L, index, std::forward<Handler>(handler), tracking);
                                                             ^
/om/user/arsalans/testoo/effil/libs/sol/single/sol/sol.hpp:5690:62: error: expected primary-expression before ‘{’ token
     return checker<meta::unqualified_t<T>, type::userdata, C>{}.check(L, index, std::forward<Handler>(handler), tracking);
                                                              ^
/om/user/arsalans/testoo/effil/libs/sol/single/sol/sol.hpp:5690:62: error: expected ‘;’ before ‘{’ token
/om/user/arsalans/testoo/effil/libs/sol/single/sol/sol.hpp:5690:64: error: expected primary-expression before ‘.’ token
     return checker<meta::unqualified_t<T>, type::userdata, C>{}.check(L, index, std::forward<Handler>(handler), tracking);
                                                                ^
/om/user/arsalans/testoo/effil/libs/sol/single/sol/sol.hpp: At global scope:
/om/user/arsalans/testoo/effil/libs/sol/single/sol/sol.hpp:5695:37: error: ‘enable_if_t’ is not a member of ‘std’
   struct checker<X, type::userdata, std::enable_if_t<is_unique_usertype<X>::value>> {
                                     ^
/om/user/arsalans/testoo/effil/libs/sol/single/sol/sol.hpp:5695:37: error: ‘enable_if_t’ is not a member of ‘std’
/om/user/arsalans/testoo/effil/libs/sol/single/sol/sol.hpp:5695:77: error: type/value mismatch at argument 3 in template parameter list for ‘template<class T, sol::type <anonymous>, class> struct sol::stack::checker’
   struct checker<X, type::userdata, std::enable_if_t<is_unique_usertype<X>::value>> {
                                                                             ^
/om/user/arsalans/testoo/effil/libs/sol/single/sol/sol.hpp:5695:77: error:   expected a type, got ‘(<expression error> < sol::is_unique_usertype<T>::value)’
/om/user/arsalans/testoo/effil/libs/sol/single/sol/sol.hpp:5695:82: error: expected unqualified-id before ‘>’ token
   struct checker<X, type::userdata, std::enable_if_t<is_unique_usertype<X>::value>> {
                                                                                  ^
/om/user/arsalans/testoo/effil/libs/sol/single/sol/sol.hpp:5723:4: warning: extra ‘;’ [-Wpedantic]
   };
    ^
/om/user/arsalans/testoo/effil/libs/sol/single/sol/sol.hpp:5778:57: error: ‘sol::meta::disable’ has not been declared
         template <typename Arg, typename... Args, meta::disable<std::is_same<overload_set, meta::unqualified_t<Arg>>> = meta::enabler>
                                                         ^
/om/user/arsalans/testoo/effil/libs/sol/single/sol/sol.hpp:5778:64: error: expected ‘>’ before ‘<’ token
         template <typename Arg, typename... Args, meta::disable<std::is_same<overload_set, meta::unqualified_t<Arg>>> = meta::enabler>
                                                                ^
/om/user/arsalans/testoo/effil/libs/sol/single/sol/sol.hpp:5787:14: error: expected primary-expression before ‘auto’
     decltype(auto) overload(Args&&... args) {
              ^
/om/user/arsalans/testoo/effil/libs/sol/single/sol/sol.hpp:5787:14: error: expected ‘)’ before ‘auto’
/om/user/arsalans/testoo/effil/libs/sol/single/sol/sol.hpp:5787:5: error: expected unqualified-id before ‘decltype’
     decltype(auto) overload(Args&&... args) {
     ^
/om/user/arsalans/testoo/effil/libs/sol/single/sol/sol.hpp:5809:20: error: ‘enable_if_t’ is not a member of ‘std’
   struct getter<T, std::enable_if_t<std::is_floating_point<T>::value>> {
                    ^
/om/user/arsalans/testoo/effil/libs/sol/single/sol/sol.hpp:5809:20: error: ‘enable_if_t’ is not a member of ‘std’
/om/user/arsalans/testoo/effil/libs/sol/single/sol/sol.hpp:5809:64: error: type/value mismatch at argument 2 in template parameter list for ‘template<class T, class> struct sol::stack::getter’
   struct getter<T, std::enable_if_t<std::is_floating_point<T>::value>> {
                                                                ^
/om/user/arsalans/testoo/effil/libs/sol/single/sol/sol.hpp:5809:64: error:   expected a type, got ‘(<expression error> < std::is_floating_point<_Tp>::value)’
/om/user/arsalans/testoo/effil/libs/sol/single/sol/sol.hpp:5809:69: error: expected unqualified-id before ‘>’ token
   struct getter<T, std::enable_if_t<std::is_floating_point<T>::value>> {
                                                                     ^
/om/user/arsalans/testoo/effil/libs/sol/single/sol/sol.hpp:5814:4: warning: extra ‘;’ [-Wpedantic]
   };
    ^
/om/user/arsalans/testoo/effil/libs/sol/single/sol/sol.hpp:5817:20: error: ‘enable_if_t’ is not a member of ‘std’
   struct getter<T, std::enable_if_t<meta::all<std::is_integral<T>, std::is_signed<T>>::value>> {
                    ^
/om/user/arsalans/testoo/effil/libs/sol/single/sol/sol.hpp:5817:20: error: ‘enable_if_t’ is not a member of ‘std’
/om/user/arsalans/testoo/effil/libs/sol/single/sol/sol.hpp:5817:88: error: type/value mismatch at argument 2 in template parameter list for ‘template<class T, class> struct sol::stack::getter’
   struct getter<T, std::enable_if_t<meta::all<std::is_integral<T>, std::is_signed<T>>::value>> {
                                                                                        ^
/om/user/arsalans/testoo/effil/libs/sol/single/sol/sol.hpp:5817:88: error:   expected a type, got ‘(<expression error> < sol::meta::all<std::is_integral<_Tp>, std::is_signed<_Tp> >::value)’
/om/user/arsalans/testoo/effil/libs/sol/single/sol/sol.hpp:5817:93: error: expected unqualified-id before ‘>’ token
   struct getter<T, std::enable_if_t<meta::all<std::is_integral<T>, std::is_signed<T>>::value>> {
                                                                                             ^
/om/user/arsalans/testoo/effil/libs/sol/single/sol/sol.hpp:5822:4: warning: extra ‘;’ [-Wpedantic]
   };
    ^
/om/user/arsalans/testoo/effil/libs/sol/single/sol/sol.hpp:5825:20: error: ‘enable_if_t’ is not a member of ‘std’
   struct getter<T, std::enable_if_t<meta::all<std::is_integral<T>, std::is_unsigned<T>>::value>> {
                    ^
/om/user/arsalans/testoo/effil/libs/sol/single/sol/sol.hpp:5825:20: error: ‘enable_if_t’ is not a member of ‘std’
/om/user/arsalans/testoo/effil/libs/sol/single/sol/sol.hpp:5825:90: error: type/value mismatch at argument 2 in template parameter list for ‘template<class T, class> struct sol::stack::getter’
   struct getter<T, std::enable_if_t<meta::all<std::is_integral<T>, std::is_unsigned<T>>::value>> {
                                                                                          ^
/om/user/arsalans/testoo/effil/libs/sol/single/sol/sol.hpp:5825:90: error:   expected a type, got ‘(<expression error> < sol::meta::all<std::is_integral<_Tp>, std::is_unsigned<T> >::value)’
/om/user/arsalans/testoo/effil/libs/sol/single/sol/sol.hpp:5825:95: error: expected unqualified-id before ‘>’ token
   struct getter<T, std::enable_if_t<meta::all<std::is_integral<T>, std::is_unsigned<T>>::value>> {
                                                                                               ^
/om/user/arsalans/testoo/effil/libs/sol/single/sol/sol.hpp:5830:4: warning: extra ‘;’ [-Wpedantic]
   };
    ^
/om/user/arsalans/testoo/effil/libs/sol/single/sol/sol.hpp:5833:20: error: ‘enable_if_t’ is not a member of ‘std’
   struct getter<T, std::enable_if_t<std::is_enum<T>::value>> {
                    ^
/om/user/arsalans/testoo/effil/libs/sol/single/sol/sol.hpp:5833:20: error: ‘enable_if_t’ is not a member of ‘std’
/om/user/arsalans/testoo/effil/libs/sol/single/sol/sol.hpp:5833:54: error: type/value mismatch at argument 2 in template parameter list for ‘template<class T, class> struct sol::stack::getter’
   struct getter<T, std::enable_if_t<std::is_enum<T>::value>> {
                                                      ^
/om/user/arsalans/testoo/effil/libs/sol/single/sol/sol.hpp:5833:54: error:   expected a type, got ‘(<expression error> < std::is_enum<_Tp>::value)’
/om/user/arsalans/testoo/effil/libs/sol/single/sol/sol.hpp:5833:59: error: expected unqualified-id before ‘>’ token
   struct getter<T, std::enable_if_t<std::is_enum<T>::value>> {
                                                           ^
/om/user/arsalans/testoo/effil/libs/sol/single/sol/sol.hpp:5838:4: warning: extra ‘;’ [-Wpedantic]
   };
    ^
/om/user/arsalans/testoo/effil/libs/sol/single/sol/sol.hpp:5841:32: error: ‘enable_if_t’ is not a member of ‘std’
   struct getter<as_table_t<T>, std::enable_if_t<!meta::has_key_value_pair<meta::unqualified_t<T>>::value>> {
                                ^
/om/user/arsalans/testoo/effil/libs/sol/single/sol/sol.hpp:5841:32: error: ‘enable_if_t’ is not a member of ‘std’
/om/user/arsalans/testoo/effil/libs/sol/single/sol/sol.hpp:5841:75: error: ‘unqualified_t’ is not a member of ‘sol::meta’
   struct getter<as_table_t<T>, std::enable_if_t<!meta::has_key_value_pair<meta::unqualified_t<T>>::value>> {
                                                                           ^
/om/user/arsalans/testoo/effil/libs/sol/single/sol/sol.hpp:5841:75: error: ‘unqualified_t’ is not a member of ‘sol::meta’
/om/user/arsalans/testoo/effil/libs/sol/single/sol/sol.hpp:5841:95: error: template argument 1 is invalid
   struct getter<as_table_t<T>, std::enable_if_t<!meta::has_key_value_pair<meta::unqualified_t<T>>::value>> {
                                                                                               ^
/om/user/arsalans/testoo/effil/libs/sol/single/sol/sol.hpp:5841:96: error: template argument 2 is invalid
   struct getter<as_table_t<T>, std::enable_if_t<!meta::has_key_value_pair<meta::unqualified_t<T>>::value>> {
                                                                                                ^
/om/user/arsalans/testoo/effil/libs/sol/single/sol/sol.hpp:5841:105: error: expected unqualified-id before ‘>>’ token
   struct getter<as_table_t<T>, std::enable_if_t<!meta::has_key_value_pair<meta::unqualified_t<T>>::value>> {
                                                                                                         ^
/om/user/arsalans/testoo/effil/libs/sol/single/sol/sol.hpp:5896:4: warning: extra ‘;’ [-Wpedantic]
   };
    ^
/om/user/arsalans/testoo/effil/libs/sol/single/sol/sol.hpp:5899:32: error: ‘enable_if_t’ is not a member of ‘std’
   struct getter<as_table_t<T>, std::enable_if_t<meta::has_key_value_pair<meta::unqualified_t<T>>::value>> {
                                ^
/om/user/arsalans/testoo/effil/libs/sol/single/sol/sol.hpp:5899:32: error: ‘enable_if_t’ is not a member of ‘std’
/om/user/arsalans/testoo/effil/libs/sol/single/sol/sol.hpp:5899:74: error: ‘unqualified_t’ is not a member of ‘sol::meta’
   struct getter<as_table_t<T>, std::enable_if_t<meta::has_key_value_pair<meta::unqualified_t<T>>::value>> {
                                                                          ^
/om/user/arsalans/testoo/effil/libs/sol/single/sol/sol.hpp:5899:74: error: ‘unqualified_t’ is not a member of ‘sol::meta’
/om/user/arsalans/testoo/effil/libs/sol/single/sol/sol.hpp:5899:94: error: template argument 1 is invalid
   struct getter<as_table_t<T>, std::enable_if_t<meta::has_key_value_pair<meta::unqualified_t<T>>::value>> {
                                                                                              ^
/om/user/arsalans/testoo/effil/libs/sol/single/sol/sol.hpp:5899:95: error: template argument 2 is invalid
   struct getter<as_table_t<T>, std::enable_if_t<meta::has_key_value_pair<meta::unqualified_t<T>>::value>> {
                                                                                               ^
/om/user/arsalans/testoo/effil/libs/sol/single/sol/sol.hpp:5899:104: error: expected unqualified-id before ‘>>’ token
   struct getter<as_table_t<T>, std::enable_if_t<meta::has_key_value_pair<meta::unqualified_t<T>>::value>> {
                                                                                                        ^
/om/user/arsalans/testoo/effil/libs/sol/single/sol/sol.hpp:5925:4: warning: extra ‘;’ [-Wpedantic]
   };
    ^
/om/user/arsalans/testoo/effil/libs/sol/single/sol/sol.hpp:5928:28: error: ‘enable_if_t’ is not a member of ‘std’
   struct getter<nested<T>, std::enable_if_t<!is_container<T>::value>> {
                            ^
/om/user/arsalans/testoo/effil/libs/sol/single/sol/sol.hpp:5928:28: error: ‘enable_if_t’ is not a member of ‘std’
/om/user/arsalans/testoo/effil/libs/sol/single/sol/sol.hpp:5928:63: error: type/value mismatch at argument 2 in template parameter list for ‘template<class T, class> struct sol::stack::getter’
   struct getter<nested<T>, std::enable_if_t<!is_container<T>::value>> {
                                                               ^
/om/user/arsalans/testoo/effil/libs/sol/single/sol/sol.hpp:5928:63: error:   expected a type, got ‘(<expression error> < (! sol::is_container<T>::value))’
/om/user/arsalans/testoo/effil/libs/sol/single/sol/sol.hpp:5928:68: error: expected unqualified-id before ‘>’ token
   struct getter<nested<T>, std::enable_if_t<!is_container<T>::value>> {
                                                                    ^
/om/user/arsalans/testoo/effil/libs/sol/single/sol/sol.hpp:5935:4: warning: extra ‘;’ [-Wpedantic]
   };
    ^
/om/user/arsalans/testoo/effil/libs/sol/single/sol/sol.hpp:5938:28: error: ‘enable_if_t’ is not a member of ‘std’
   struct getter<nested<T>, std::enable_if_t<meta::all<is_container<T>, meta::neg<meta::has_key_value_pair<meta::unqualified_t<T>>>>::value>> {
                            ^
/om/user/arsalans/testoo/effil/libs/sol/single/sol/sol.hpp:5938:28: error: ‘enable_if_t’ is not a member of ‘std’
/om/user/arsalans/testoo/effil/libs/sol/single/sol/sol.hpp:5938:107: error: ‘unqualified_t’ is not a member of ‘sol::meta’
   struct getter<nested<T>, std::enable_if_t<meta::all<is_container<T>, meta::neg<meta::has_key_value_pair<meta::unqualified_t<T>>>>::value>> {
                                                                                                           ^
/om/user/arsalans/testoo/effil/libs/sol/single/sol/sol.hpp:5938:107: error: ‘unqualified_t’ is not a member of ‘sol::meta’
/om/user/arsalans/testoo/effil/libs/sol/single/sol/sol.hpp:5938:127: error: template argument 1 is invalid
   struct getter<nested<T>, std::enable_if_t<meta::all<is_container<T>, meta::neg<meta::has_key_value_pair<meta::unqualified_t<T>>>>::value>> {
                                                                                                                               ^
/om/user/arsalans/testoo/effil/libs/sol/single/sol/sol.hpp:5938:128: error: template argument 1 is invalid
   struct getter<nested<T>, std::enable_if_t<meta::all<is_container<T>, meta::neg<meta::has_key_value_pair<meta::unqualified_t<T>>>>::value>> {
                                                                                                                                ^
/om/user/arsalans/testoo/effil/libs/sol/single/sol/sol.hpp:5938:78: error: template argument 2 is invalid
   struct getter<nested<T>, std::enable_if_t<meta::all<is_container<T>, meta::neg<meta::has_key_value_pair<meta::unqualified_t<T>>>>::value>> {
                                                                              ^
/om/user/arsalans/testoo/effil/libs/sol/single/sol/sol.hpp:5938:130: error: template argument 2 is invalid
   struct getter<nested<T>, std::enable_if_t<meta::all<is_container<T>, meta::neg<meta::has_key_value_pair<meta::unqualified_t<T>>>>::value>> {
                                                                                                                                  ^
/om/user/arsalans/testoo/effil/libs/sol/single/sol/sol.hpp:5938:139: error: expected unqualified-id before ‘>>’ token
   struct getter<nested<T>, std::enable_if_t<meta::all<is_container<T>, meta::neg<meta::has_key_value_pair<meta::unqualified_t<T>>>>::value>> {
                                                                                                                                           ^
/om/user/arsalans/testoo/effil/libs/sol/single/sol/sol.hpp:5946:4: warning: extra ‘;’ [-Wpedantic]
   };
    ^
/om/user/arsalans/testoo/effil/libs/sol/single/sol/sol.hpp:5949:28: error: ‘enable_if_t’ is not a member of ‘std’
   struct getter<nested<T>, std::enable_if_t<meta::all<is_container<T>, meta::has_key_value_pair<meta::unqualified_t<T>>>::value>> {
                            ^
/om/user/arsalans/testoo/effil/libs/sol/single/sol/sol.hpp:5949:28: error: ‘enable_if_t’ is not a member of ‘std’
/om/user/arsalans/testoo/effil/libs/sol/single/sol/sol.hpp:5949:97: error: ‘unqualified_t’ is not a member of ‘sol::meta’
   struct getter<nested<T>, std::enable_if_t<meta::all<is_container<T>, meta::has_key_value_pair<meta::unqualified_t<T>>>::value>> {
                                                                                                 ^
/om/user/arsalans/testoo/effil/libs/sol/single/sol/sol.hpp:5949:97: error: ‘unqualified_t’ is not a member of ‘sol::meta’
/om/user/arsalans/testoo/effil/libs/sol/single/sol/sol.hpp:5949:117: error: template argument 1 is invalid
   struct getter<nested<T>, std::enable_if_t<meta::all<is_container<T>, meta::has_key_value_pair<meta::unqualified_t<T>>>::value>> {
                                                                                                                     ^
/om/user/arsalans/testoo/effil/libs/sol/single/sol/sol.hpp:5949:118: error: template argument 2 is invalid
   struct getter<nested<T>, std::enable_if_t<meta::all<is_container<T>, meta::has_key_value_pair<meta::unqualified_t<T>>>::value>> {
                                                                                                                      ^
/om/user/arsalans/testoo/effil/libs/sol/single/sol/sol.hpp:5949:120: error: template argument 2 is invalid
   struct getter<nested<T>, std::enable_if_t<meta::all<is_container<T>, meta::has_key_value_pair<meta::unqualified_t<T>>>::value>> {
                                                                                                                        ^
/om/user/arsalans/testoo/effil/libs/sol/single/sol/sol.hpp:5949:128: error: expected unqualified-id before ‘>>’ token
   struct getter<nested<T>, std::enable_if_t<meta::all<is_container<T>, meta::has_key_value_pair<meta::unqualified_t<T>>>::value>> {
                                                                                                                                ^
/om/user/arsalans/testoo/effil/libs/sol/single/sol/sol.hpp:5959:4: warning: extra ‘;’ [-Wpedantic]
   };
    ^
/om/user/arsalans/testoo/effil/libs/sol/single/sol/sol.hpp:5962:20: error: ‘enable_if_t’ is not a member of ‘std’
   struct getter<T, std::enable_if_t<std::is_base_of<reference, T>::value || std::is_base_of<stack_reference, T>::value>> {
                    ^
/om/user/arsalans/testoo/effil/libs/sol/single/sol/sol.hpp:5962:20: error: ‘enable_if_t’ is not a member of ‘std’
/om/user/arsalans/testoo/effil/libs/sol/single/sol/sol.hpp:5962:114: error: type/value mismatch at argument 2 in template parameter list for ‘template<class T, class> struct sol::stack::getter’
   struct getter<T, std::enable_if_t<std::is_base_of<reference, T>::value || std::is_base_of<stack_reference, T>::value>> {
                                                                                                                  ^
/om/user/arsalans/testoo/effil/libs/sol/single/sol/sol.hpp:5962:114: error:   expected a type, got ‘((<expression error> < std::is_base_of<sol::reference, T>::value) || std::is_base_of<sol::stack_reference, T>::value)’
/om/user/arsalans/testoo/effil/libs/sol/single/sol/sol.hpp:5962:119: error: expected unqualified-id before ‘>’ token
   struct getter<T, std::enable_if_t<std::is_base_of<reference, T>::value || std::is_base_of<stack_reference, T>::value>> {
                                                                                                                       ^
/om/user/arsalans/testoo/effil/libs/sol/single/sol/sol.hpp:5967:4: warning: extra ‘;’ [-Wpedantic]
   };
    ^
/om/user/arsalans/testoo/effil/libs/sol/single/sol/sol.hpp: In static member function ‘static T* sol::stack::getter<sol::detail::as_value_tag<T> >::get_no_lua_nil_from(lua_State*, void*, int, sol::stack::record&)’:
/om/user/arsalans/testoo/effil/libs/sol/single/sol/sol.hpp:6251:71: error: ‘base_class_cast_key’ is not a member of ‘sol::detail’
     if (detail::has_derived<T>::value && luaL_getmetafield(L, index, &detail::base_class_cast_key()[0]) != 0) {
                                                                       ^
/om/user/arsalans/testoo/effil/libs/sol/single/sol/sol.hpp: At global scope:
/om/user/arsalans/testoo/effil/libs/sol/single/sol/sol.hpp:6323:20: error: ‘enable_if_t’ is not a member of ‘std’
   struct getter<T, std::enable_if_t<is_unique_usertype<T>::value>> {
                    ^
/om/user/arsalans/testoo/effil/libs/sol/single/sol/sol.hpp:6323:20: error: ‘enable_if_t’ is not a member of ‘std’
/om/user/arsalans/testoo/effil/libs/sol/single/sol/sol.hpp:6323:60: error: type/value mismatch at argument 2 in template parameter list for ‘template<class T, class> struct sol::stack::getter’
   struct getter<T, std::enable_if_t<is_unique_usertype<T>::value>> {
                                                            ^
/om/user/arsalans/testoo/effil/libs/sol/single/sol/sol.hpp:6323:60: error:   expected a type, got ‘(<expression error> < sol::is_unique_usertype<T>::value)’
/om/user/arsalans/testoo/effil/libs/sol/single/sol/sol.hpp:6323:65: error: expected unqualified-id before ‘>’ token
   struct getter<T, std::enable_if_t<is_unique_usertype<T>::value>> {
                                                                 ^
/om/user/arsalans/testoo/effil/libs/sol/single/sol/sol.hpp:6334:4: warning: extra ‘;’ [-Wpedantic]
   };
    ^
/om/user/arsalans/testoo/effil/libs/sol/single/sol/sol.hpp:6338:32: error: ‘get’ is not a member of ‘sol::stack’
    typedef std::tuple<decltype(stack::get<Args>(nullptr, 0))...> R;
                                ^
/om/user/arsalans/testoo/effil/libs/sol/single/sol/sol.hpp:6338:32: note: suggested alternative:
In file included from /usr/include/c++/4.8.2/mutex:38:0,
                 from /om/user/arsalans/testoo/effil/src/cpp/notifier.h:3,
                 from /om/user/arsalans/testoo/effil/src/cpp/channel.h:3,
                 from /om/user/arsalans/testoo/effil/src/cpp/channel.cpp:1:
/usr/include/c++/4.8.2/tuple:773:5: note:   ‘std::get’
     get(tuple<_Elements...>&& __t) noexcept
     ^
In file included from /om/user/arsalans/testoo/effil/src/cpp/utils.h:7:0,
                 from /om/user/arsalans/testoo/effil/src/cpp/stored-object.h:3,
                 from /om/user/arsalans/testoo/effil/src/cpp/lua-helpers.h:3,
                 from /om/user/arsalans/testoo/effil/src/cpp/channel.h:4,
                 from /om/user/arsalans/testoo/effil/src/cpp/channel.cpp:1:
/om/user/arsalans/testoo/effil/libs/sol/single/sol/sol.hpp:6338:32: error: ‘get’ is not a member of ‘sol::stack’
    typedef std::tuple<decltype(stack::get<Args>(nullptr, 0))...> R;
                                ^
/om/user/arsalans/testoo/effil/libs/sol/single/sol/sol.hpp:6338:32: note: suggested alternative:
In file included from /usr/include/c++/4.8.2/mutex:38:0,
                 from /om/user/arsalans/testoo/effil/src/cpp/notifier.h:3,
                 from /om/user/arsalans/testoo/effil/src/cpp/channel.h:3,
                 from /om/user/arsalans/testoo/effil/src/cpp/channel.cpp:1:
/usr/include/c++/4.8.2/tuple:773:5: note:   ‘std::get’
     get(tuple<_Elements...>&& __t) noexcept
     ^
In file included from /om/user/arsalans/testoo/effil/src/cpp/utils.h:7:0,
                 from /om/user/arsalans/testoo/effil/src/cpp/stored-object.h:3,
                 from /om/user/arsalans/testoo/effil/src/cpp/lua-helpers.h:3,
                 from /om/user/arsalans/testoo/effil/src/cpp/channel.h:4,
                 from /om/user/arsalans/testoo/effil/src/cpp/channel.cpp:1:
/om/user/arsalans/testoo/effil/libs/sol/single/sol/sol.hpp:6338:64: error: template argument 1 is invalid
    typedef std::tuple<decltype(stack::get<Args>(nullptr, 0))...> R;
                                                                ^
/om/user/arsalans/testoo/effil/libs/sol/single/sol/sol.hpp:6341:24: error: ‘std::index_sequence’ has not been declared
    static R apply(std::index_sequence<>, lua_State*, int, record&, TArgs&&... args) {
                        ^
/om/user/arsalans/testoo/effil/libs/sol/single/sol/sol.hpp:6341:38: error: expected ‘,’ or ‘...’ before ‘<’ token
    static R apply(std::index_sequence<>, lua_State*, int, record&, TArgs&&... args) {
                                      ^
/om/user/arsalans/testoo/effil/libs/sol/single/sol/sol.hpp:6347:24: error: ‘std::index_sequence’ has not been declared
    static R apply(std::index_sequence<I, Ix...>, lua_State* L, int index, record& tracking, TArgs&&... args) {
                        ^
/om/user/arsalans/testoo/effil/libs/sol/single/sol/sol.hpp:6347:38: error: expected ‘,’ or ‘...’ before ‘<’ token
    static R apply(std::index_sequence<I, Ix...>, lua_State* L, int index, record& tracking, TArgs&&... args) {
                                      ^
/om/user/arsalans/testoo/effil/libs/sol/single/sol/sol.hpp: In static member function ‘static sol::stack::getter<std::tuple<_Elements ...> >::R sol::stack::getter<std::tuple<_Elements ...> >::apply(int)’:
/om/user/arsalans/testoo/effil/libs/sol/single/sol/sol.hpp:6343:34: error: ‘args’ was not declared in this scope
     return R{std::forward<TArgs>(args)...};
                                  ^
/om/user/arsalans/testoo/effil/libs/sol/single/sol/sol.hpp: In static member function ‘static sol::stack::getter<std::tuple<_Elements ...> >::R sol::stack::getter<std::tuple<_Elements ...> >::apply(int)’:
/om/user/arsalans/testoo/effil/libs/sol/single/sol/sol.hpp:6349:13: error: ‘tuple_element_t’ in namespace ‘std’ does not name a type
     typedef std::tuple_element_t<I, std::tuple<Args...>> T;
             ^
/om/user/arsalans/testoo/effil/libs/sol/single/sol/sol.hpp:6350:18: error: ‘index_sequence’ is not a member of ‘std’
     return apply(std::index_sequence<Ix...>(), L, index, tracking, std::forward<TArgs>(args)..., stack::get<T>(L, index + tracking.used, tracking));
                  ^
/om/user/arsalans/testoo/effil/libs/sol/single/sol/sol.hpp:6350:48: error: ‘L’ was not declared in this scope
     return apply(std::index_sequence<Ix...>(), L, index, tracking, std::forward<TArgs>(args)..., stack::get<T>(L, index + tracking.used, tracking));
                                                ^
/om/user/arsalans/testoo/effil/libs/sol/single/sol/sol.hpp:6350:58: error: ‘tracking’ was not declared in this scope
     return apply(std::index_sequence<Ix...>(), L, index, tracking, std::forward<TArgs>(args)..., stack::get<T>(L, index + tracking.used, tracking));
                                                          ^
/om/user/arsalans/testoo/effil/libs/sol/single/sol/sol.hpp:6350:88: error: ‘args’ was not declared in this scope
     return apply(std::index_sequence<Ix...>(), L, index, tracking, std::forward<TArgs>(args)..., stack::get<T>(L, index + tracking.used, tracking));
                                                                                        ^
/om/user/arsalans/testoo/effil/libs/sol/single/sol/sol.hpp:6350:98: error: ‘get’ is not a member of ‘sol::stack’
     return apply(std::index_sequence<Ix...>(), L, index, tracking, std::forward<TArgs>(args)..., stack::get<T>(L, index + tracking.used, tracking));
                                                                                                  ^
/om/user/arsalans/testoo/effil/libs/sol/single/sol/sol.hpp:6350:98: note: suggested alternative:
In file included from /usr/include/c++/4.8.2/mutex:38:0,
                 from /om/user/arsalans/testoo/effil/src/cpp/notifier.h:3,
                 from /om/user/arsalans/testoo/effil/src/cpp/channel.h:3,
                 from /om/user/arsalans/testoo/effil/src/cpp/channel.cpp:1:
/usr/include/c++/4.8.2/tuple:773:5: note:   ‘std::get’
     get(tuple<_Elements...>&& __t) noexcept
     ^
In file included from /om/user/arsalans/testoo/effil/src/cpp/utils.h:7:0,
                 from /om/user/arsalans/testoo/effil/src/cpp/stored-object.h:3,
                 from /om/user/arsalans/testoo/effil/src/cpp/lua-helpers.h:3,
                 from /om/user/arsalans/testoo/effil/src/cpp/channel.h:4,
                 from /om/user/arsalans/testoo/effil/src/cpp/channel.cpp:1:
/om/user/arsalans/testoo/effil/libs/sol/single/sol/sol.hpp:6350:109: error: ‘T’ was not declared in this scope
     return apply(std::index_sequence<Ix...>(), L, index, tracking, std::forward<TArgs>(args)..., stack::get<T>(L, index + tracking.used, tracking));
                                                                                                             ^
/om/user/arsalans/testoo/effil/libs/sol/single/sol/sol.hpp: In static member function ‘static sol::stack::getter<std::tuple<_Elements ...> >::R sol::stack::getter<std::tuple<_Elements ...> >::get(lua_State*, int, sol::stack::record&)’:
/om/user/arsalans/testoo/effil/libs/sol/single/sol/sol.hpp:6354:18: error: ‘make_index_sequence’ is not a member of ‘std’
     return apply(std::make_index_sequence<sizeof...(Args)>(), L, index, tracking);
                  ^
/om/user/arsalans/testoo/effil/libs/sol/single/sol/sol.hpp:6354:60: error: expected primary-expression before ‘)’ token
     return apply(std::make_index_sequence<sizeof...(Args)>(), L, index, tracking);
                                                            ^
/om/user/arsalans/testoo/effil/libs/sol/single/sol/sol.hpp: At global scope:
/om/user/arsalans/testoo/effil/libs/sol/single/sol/sol.hpp:6360:20: error: expected primary-expression before ‘auto’
    static decltype(auto) get(lua_State* L, int index, record& tracking) {
                    ^
/om/user/arsalans/testoo/effil/libs/sol/single/sol/sol.hpp:6360:20: error: expected ‘)’ before ‘auto’
/om/user/arsalans/testoo/effil/libs/sol/single/sol/sol.hpp:6360:11: error: expected unqualified-id before ‘decltype’
    static decltype(auto) get(lua_State* L, int index, record& tracking) {
           ^
In file included from /om/user/arsalans/testoo/effil/src/cpp/utils.h:7:0,
                 from /om/user/arsalans/testoo/effil/src/cpp/stored-object.h:3,
                 from /om/user/arsalans/testoo/effil/src/cpp/lua-helpers.h:3,
                 from /om/user/arsalans/testoo/effil/src/cpp/channel.h:4,
                 from /om/user/arsalans/testoo/effil/src/cpp/channel.cpp:1:
/om/user/arsalans/testoo/effil/libs/sol/single/sol/sol.hpp:14854:27: error: expected ‘}’ before end of line
 #pragma GCC diagnostic pop
                           ^
/om/user/arsalans/testoo/effil/libs/sol/single/sol/sol.hpp:14854:27: error: expected unqualified-id before end of line
/om/user/arsalans/testoo/effil/libs/sol/single/sol/sol.hpp:14854:27: error: expected ‘}’ before end of line
/om/user/arsalans/testoo/effil/libs/sol/single/sol/sol.hpp:14854:27: error: expected ‘}’ before end of line
/om/user/arsalans/testoo/effil/libs/sol/single/sol/sol.hpp:14854:27: error: expected declaration before end of line
make[2]: *** [CMakeFiles/effil.dir/src/cpp/channel.cpp.o] Error 1
make[1]: *** [CMakeFiles/effil.dir/all] Error 2
make: *** [all] Error 2

userdata

Hello

Is it planned to manage userdata ? I need to use socket (tls) and separate incoming data and sent data.
Unfortunately, socket return userdata and I am blocked

Best regards
Julien

Make channels iteration easier

It would be nice if I can write code like this:

local channel = effil.channel()
-- fill channel
for value in channel:iterate() do
    print(value)
end

как встроить новый поток в код с++, чтобы функция foo запускалась в новом потоке?

Очень восхищен Вашей библиотекой многопоточности Effil в lua. Возник вопрос: как встроить новый поток в код с++, чтобы функция foo запускалась в новом потоке? Очень хочу разобраться в механизме. Буду очень рад Вашему ответу. Спасибо.
`
#include
#include<lua.hpp>
#include<threading.h>
using namespace std;
using namespace sol;
using namespace effil;

const char* LUA =
R"(
foo()
)";
int foo(lua_State* L) {
cout << "hi foo c++" << endl;
return 0;
};

int embeds_sol(lua_State* L) {
// start using sol with a pre-existing system
state_view lua(L); // non-owning
// runner = thread(foo);
Thread::exportAPI(lua);
lua.open_libraries(lib::base, lib::package); // открыть доп.библиотеки.
lua.set("foo", foo); // вариант 2.

//Thread::resume();
lua.script(LUA);

return 0; // все, что требуется для работы с необработанной функцией.

};

int main(int argc, char* argv[]) {
lua_State* L = luaL_newstate();
luaL_openlibs(L);
embeds_sol(L);
lua_close(L);

return 0;

};
`

Thread pool implementation

We want to create a thread pool over out threads and channels. To do that we should perform research for proper implementation and API design.

speed test

how many messages per second? 500? 5000? 50000? 500000?

Nested inner/outer classes with effil

I am learning to create Lua5.3 classes, and am trying to obtain a structure like this: outerObject = {innerObject1, innerObject2, ...}, where both outerObject and innerObject have their own methods. Both should only contain objects, the methods should be defined in their respective class and inherited via the standard __index approach.

The following works fine without Effil:

innerClass = {
    someMethod = function(self) print('some inner method called') end
}

outerClass = {
    newObject = function(self, tab) -- Create a new inner object inheriting from innerClass
        local innerMetatable = {
            __index = function(_, key) return innerClass[key] end
        }
        setmetatable(tab, innerMetatable)
        return tab
    end,
    someMethod = function(self) print('some outer method called') end,
    someOtherMethod = function(self) print('some outer method called which exists only in outer') end
}

 -- Create the outer object inheriting from outerClass
outerMetatable = {
    __index = function(_, key) return outerClass[key] end
}
outer = {}
setmetatable(outer, outerMetatable)
for i,k in pairs(outer) do print(i, k) end -- outer is empty now

-- Create an inner object
outer.innerObject = outer:newObject({'some table or thing'})
print(outer.innerObject)    -- OK: a table
for i,k in pairs(outer) do print(i, k) end -- outer has a key-value pair, of course

outer:someMethod() -- Works
outer:someOtherMethod() -- Works
outer.innerObject:someMethod() -- Works

The same with the outer object as en Effil table:

effil = require('effil')

innerClass = {
    someMethod = function(self) print('some inner method called') end
}

outerClass = {
    newObject = function(self, tab) -- Create a new inner object inheriting from innerClass
        local innerMetatable = {
            __index = function(_, key) return innerClass[key] end
        }
        setmetatable(tab, innerMetatable)
        return tab
    end,
    someMethod = function(self) print('some outer method called') end,
    someOtherMethod = function(self) print('some outer method called which exists only in outer') end
}

 -- Create the outer object inheriting from outerClass
outerMetatable = {
    __index = function(_, key) return outerClass[key] end
}
outer = effil.table()
effil.setmetatable(outer, outerMetatable)
for i,k in pairs(outer) do print(i, k) end -- outer is empty now

-- Create an inner object
outer.innerObject = outer:newObject({'some table or thing'})
print(outer.innerObject)    -- NIL!!!
for i,k in effil.pairs(outer) do print(i, k) end    -- BUT IT IS NOT EMPTY!

outer:someMethod() -- Works
outer:someOtherMethod() -- Works
outer.innerObject:someMethod() -- Does not work! outer.innerObject is NIL!

How can I make nested classes work using Effil? Is there something fundamentally wrong with my approach?

Method to turn an effil.table into a normal table

Hi and thanks for effil!

Sometimes it's be nice to be able to turn an effil.table back into a normal table, for example when using external libraries that check for the type() of an input.

One can do this with a simple loop, bu it's a bit tedious (especially for nested tables). Can you provide a function to do this?

(if it's not there already and I missed it!)

Thanks!

очень нужно в файле запустить функцию в отдельной сопрограмме

спасибо большое за Вашу чудесную библиотеку. она здорово облегчает жизнь. смог ее собрать и запустить.
немного пришлось помучатся из-за своей неопытность.
Скажите, пожалуйста, есть lua плагин gta vice city. каждый lua файл имеет свое состояние. иногда очень нужно в файле запустить функцию в отдельной сопрограмме. например, жив ли пед, то есть поочередное приостановление и возобновление.

вот на этом пример.

local effil = require 'effil'
function foo()
    for i = 1, 3 do print("foo= "..i)
    end
end
function foo3()
    for i = 1, 3 do  print("foo3= ".. i)
    end
end
thr = effil.thread(foo)()

thr1 = effil.thread(foo3)()

thr:wait()
thr1:wait()

а вот для игры

require("lualoader/mod")
--model = VICE8
t = {}
function funs(ped, m)
 player = findplayer()-- получить игрока
 x,y,z =getcoordinates_on_y(player,5)-- получить координаты на 5 м впереди.
 man = Createped(ped,x,y,z) 
 mar = create_marker_actor(man) -- создать маркер педа.
while true do 
 if 0 == gethealth(man)
 then  
 printmessage(m, 1500,1)
 remove_ped(man)
 removemarker(mar)-- удалить маркер над педом.
 break
 end
end
end
function main()
while lualoader == nil do
 wait()
 player = findplayer()-- получить игрока
 if Keypress(VK_G)
 then 
 newthread(funs,"BMYBB","remove ped")
 end 
 if Keypress(VK_H)
 then 
  Giveweaponped(player,300,"colt45","ruger","uzi")-- дать педу оружие. 
 end 
 end  
 end

Get rid of "gc.get" method usage

Do not save GCObjects in StoredObjects by handle (or only by handle) store a raw pointer as well, so gc.get will no be needed

Sleep a thread

Hello
I try to sleep a thread with socket.sleep or socket.select(nil, nil, x) but, the only way I found is to use os.execute("sleep x") where x is a number as follow:

local effil = require("effil")

-- channel allow to push data in one thread and pop in other
local channel = effil.channel()

-- writes some numbers to channel
function producer(channel)
    for i = 1, 5 do
        print("push " .. i)
        channel:push(i)
        os.execute("sleep " .. tostring(i))
    end
    channel:push(nil)
end

-- read numbers from channels
local function consumer(channel)
    local i = channel:pop()
    while i do
        print("pop " .. i)
        i = channel:pop()
    end
end

-- run producer
local thr = effil.thread(producer)(channel)

-- run consumer
consumer(channel)

thr:wait()

So, the code is bad. Is there another solution ?
Thank for your help and nice job for effil

Best regards
Julien

Upvalues support

Implement upvalues support for all functions used in Effil. If upvalue is Effil's Stored object then we just copy it.
HELP: what to do with regular table: serialize or ignore? If we will just serialize it it can be a problem if some upvalue is _G table.

Userdata types identification

  • Search for opportunities to determine type of Lua userdata
  • Modify StoredObject's userdata handling principles based on research results

Submodule instruction is missing from readme

I spent some time trying to find sol library as a dynlib on mac before realizing it is actually referenced as a submodule on this repo.

I propose to put a git submodule update --init instruction on README.md a submodule made the submodule step explicit in the README so new people can have a easier time.

(I actually already have a pull request ready, just following CONTRIBUTING.md, and waiting for confirmation if it's really an issue :) )

Recommend Projects

  • React photo React

    A declarative, efficient, and flexible JavaScript library for building user interfaces.

  • Vue.js photo Vue.js

    🖖 Vue.js is a progressive, incrementally-adoptable JavaScript framework for building UI on the web.

  • Typescript photo Typescript

    TypeScript is a superset of JavaScript that compiles to clean JavaScript output.

  • TensorFlow photo TensorFlow

    An Open Source Machine Learning Framework for Everyone

  • Django photo Django

    The Web framework for perfectionists with deadlines.

  • D3 photo D3

    Bring data to life with SVG, Canvas and HTML. 📊📈🎉

Recommend Topics

  • javascript

    JavaScript (JS) is a lightweight interpreted programming language with first-class functions.

  • web

    Some thing interesting about web. New door for the world.

  • server

    A server is a program made to process requests and deliver data to clients.

  • Machine learning

    Machine learning is a way of modeling and interpreting data that allows a piece of software to respond intelligently.

  • Game

    Some thing interesting about game, make everyone happy.

Recommend Org

  • Facebook photo Facebook

    We are working to build community through open source technology. NB: members must have two-factor auth.

  • Microsoft photo Microsoft

    Open source projects and samples from Microsoft.

  • Google photo Google

    Google ❤️ Open Source for everyone.

  • D3 photo D3

    Data-Driven Documents codes.