From 4152ee04130eeb8b53518e161ac04c439ec78583 Mon Sep 17 00:00:00 2001 From: versustunez Date: Sun, 2 May 2021 17:25:03 +0200 Subject: [PATCH] WIP --- CMakeLists.txt | 14 +- cmake/FindJACK.cmake | 19 + headers/VUtils/FileHandler.h | 2 + headers/VUtils/Math.h | 1 + headers/VulcanoLE/API/I2C.h | 12 + headers/VulcanoLE/Audio/AudioGrabber.h | 23 +- headers/VulcanoLE/Audio/FFT.h | 10 +- headers/VulcanoLE/Audio/JackClient.h | 46 + headers/VulcanoLE/Audio/Types.h | 4 +- headers/VulcanoLE/Audio/VisAudioRunner.h | 2 + headers/VulcanoLE/Keyboards/Vulcan121.h | 1 + headers/VulcanoLE/Scripts/PoliceLike.h | 4 +- headers/VulcanoLE/Scripts/RainbowLine.h | 4 +- headers/VulcanoLE/Scripts/RainbowMap.h | 28 + headers/VulcanoLE/Scripts/Random.h | 26 + headers/VulcanoLE/Scripts/Spectrum.h | 6 +- headers/VulcanoLE/Visual/VisPlugins.h | 6 +- headers/sol/sol.hpp | 26674 +++++++++++++++++++++ main.cpp | 2 + src/VUtils/FileHandler.cpp | 11 + src/VUtils/Math.cpp | 3 + src/VulcanoLE/API/I2C.cpp | 30 + src/VulcanoLE/Audio/AudioGrabber.cpp | 129 +- src/VulcanoLE/Audio/FFT.cpp | 60 +- src/VulcanoLE/Audio/JackClient.cpp | 133 + src/VulcanoLE/Audio/VisAudioRunner.cpp | 6 +- src/VulcanoLE/Keyboards/Vulcan121.cpp | 84 +- src/VulcanoLE/Scripts/PoliceLike.cpp | 2 +- src/VulcanoLE/Scripts/RainbowLine.cpp | 32 +- src/VulcanoLE/Scripts/RainbowMap.cpp | 107 + src/VulcanoLE/Scripts/Random.cpp | 83 + src/VulcanoLE/Scripts/Spectrum.cpp | 6 +- src/VulcanoLE/Visual/VisPlugins.cpp | 19 +- 33 files changed, 27356 insertions(+), 233 deletions(-) create mode 100644 cmake/FindJACK.cmake create mode 100644 headers/VulcanoLE/API/I2C.h create mode 100644 headers/VulcanoLE/Audio/JackClient.h create mode 100644 headers/VulcanoLE/Scripts/RainbowMap.h create mode 100644 headers/VulcanoLE/Scripts/Random.h create mode 100644 headers/sol/sol.hpp create mode 100644 src/VulcanoLE/API/I2C.cpp create mode 100644 src/VulcanoLE/Audio/JackClient.cpp create mode 100644 src/VulcanoLE/Scripts/RainbowMap.cpp create mode 100644 src/VulcanoLE/Scripts/Random.cpp diff --git a/CMakeLists.txt b/CMakeLists.txt index 4fdbf33..dc2880b 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -8,16 +8,14 @@ find_package(udev REQUIRED) find_package(HIDAPI REQUIRED) pkg_check_modules(LIBUSB REQUIRED libusb-1.0) find_package(Threads REQUIRED) -find_library(PULSE_FOUND NAMES pulse) -if (PULSE_FOUND) - set(DYNAMIC_LIBRARIES ${DYNAMIC_LIBRARIES} pulse pulse-simple) - set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -D_ENABLE_PULSE") - set(CMAKE_LD_FLAGS "${CMAKE_LD_FLAGS} -D_ENABLE_PULSE") -endif () + +find_package(JACK REQUIRED) set(SOURCE_FILES src/VulcanoLE/API/HIDHelper.cpp + src/VulcanoLE/API/I2C.cpp src/VulcanoLE/Keyboards/Vulcan121.cpp + src/VulcanoLE/Audio/JackClient.cpp src/VulcanoLE/Audio/AudioGrabber.cpp src/VulcanoLE/Audio/FFT.cpp src/VulcanoLE/Audio/VisAudioRunner.cpp @@ -27,6 +25,8 @@ set(SOURCE_FILES src/VulcanoLE/Scripts/Spectrum.cpp src/VulcanoLE/Scripts/PoliceLike.cpp src/VulcanoLE/Scripts/RainbowLine.cpp + src/VulcanoLE/Scripts/Random.cpp + src/VulcanoLE/Scripts/RainbowMap.cpp ) set(UTILS_FILES src/VUtils/Logging.cpp @@ -41,5 +41,5 @@ add_executable( VulcanoLE main.cpp ${SOURCE_FILES} ${UTILS_FILES} ) -target_link_libraries(VulcanoLE fftw3 evdev hidapi-libusb udev ${CMAKE_DL_LIBS} ${DYNAMIC_LIBRARIES} Threads::Threads m +target_link_libraries(VulcanoLE fftw3 evdev hidapi-libusb udev jack ${CMAKE_DL_LIBS} ${DYNAMIC_LIBRARIES} Threads::Threads m debug tbb) diff --git a/cmake/FindJACK.cmake b/cmake/FindJACK.cmake new file mode 100644 index 0000000..6748155 --- /dev/null +++ b/cmake/FindJACK.cmake @@ -0,0 +1,19 @@ +# Copyright (c) 2015 Andrew Kelley +# This file is MIT licensed. +# See http://opensource.org/licenses/MIT + +# JACK_FOUND +# JACK_INCLUDE_DIR +# JACK_LIBRARY + +find_path(JACK_INCLUDE_DIR NAMES jack/jack.h) + +find_library(JACK_LIBRARY NAMES jack) + +include(CheckLibraryExists) +check_library_exists(jack "jack_set_port_rename_callback" "${JACK_LIBRARY}" HAVE_jack_set_port_rename_callback) + +include(FindPackageHandleStandardArgs) +find_package_handle_standard_args(JACK DEFAULT_MSG JACK_LIBRARY JACK_INCLUDE_DIR HAVE_jack_set_port_rename_callback) + +mark_as_advanced(JACK_INCLUDE_DIR JACK_LIBRARY) \ No newline at end of file diff --git a/headers/VUtils/FileHandler.h b/headers/VUtils/FileHandler.h index 37c0241..22ef789 100644 --- a/headers/VUtils/FileHandler.h +++ b/headers/VUtils/FileHandler.h @@ -1,6 +1,7 @@ #pragma once #include +#include namespace VUtils { class FileHandler { @@ -17,6 +18,7 @@ namespace VUtils { static bool createDirectoryIfNotExist(const std::basic_string& fileName); static char * getHomeDirectory(); static std::string getFromHomeDir(const std::basic_string& path); + static std::vector readDir(const std::basic_string& path); }; } diff --git a/headers/VUtils/Math.h b/headers/VUtils/Math.h index 652216b..9e48c3c 100644 --- a/headers/VUtils/Math.h +++ b/headers/VUtils/Math.h @@ -6,5 +6,6 @@ namespace VUtils { static double lerp(double a, double b, double f); static double bezierBlend(double t); static double easeIn(double ratio); + static double map(double x, double in_min, double in_max, double out_min, double out_max); }; } \ No newline at end of file diff --git a/headers/VulcanoLE/API/I2C.h b/headers/VulcanoLE/API/I2C.h new file mode 100644 index 0000000..25399d3 --- /dev/null +++ b/headers/VulcanoLE/API/I2C.h @@ -0,0 +1,12 @@ +#pragma once + +#include + +struct I2CDevice { + std::string name; +}; + +class I2C { +public: + int readDevices(); +}; \ No newline at end of file diff --git a/headers/VulcanoLE/Audio/AudioGrabber.h b/headers/VulcanoLE/Audio/AudioGrabber.h index c5cffa9..eb7299f 100644 --- a/headers/VulcanoLE/Audio/AudioGrabber.h +++ b/headers/VulcanoLE/Audio/AudioGrabber.h @@ -1,8 +1,4 @@ #pragma once - -#include -#include -#include #include #include #include @@ -12,14 +8,6 @@ #include #include -static const char recStreamName[] = "vulcanoLE"; -static const char recStreamDescription[] = "Keyboard Input Stream"; - -static const int32_t sampleRate = 44100; -static const int32_t channels = 2; - -static const std::string defaultMonitorPostfix = ".monitor"; - class AudioGrabber { public: enum class ReqMode { @@ -42,17 +30,8 @@ public: private: std::mutex m_mtx; stereoSample *m_buffer{}; - pa_simple *m_pulseaudioSimple{}; - pa_mainloop *m_pulseaudioMainloop{}; - std::string m_PulseaudioDefaultSourceName; - void populateDefaultSourceName(); - bool openPulseaudioSource(uint32_t maxBufferSize); - static void pulseaudioContextStateCallback(pa_context *c, - void *userdata); - static void pulseaudioServerInfoCallback(pa_context *context, - const pa_server_info *i, - void *userdata); void calculateRMS(stereoSample *pFrame); void calculatePEAK(stereoSample *pFrame); double m_scale = 1.0; + int availableData = 0; }; diff --git a/headers/VulcanoLE/Audio/FFT.h b/headers/VulcanoLE/Audio/FFT.h index e034c42..a5b493a 100644 --- a/headers/VulcanoLE/Audio/FFT.h +++ b/headers/VulcanoLE/Audio/FFT.h @@ -11,14 +11,18 @@ public: void process(stereoSample *frame, double d); outputSample *getData(); bool prepareInput(stereoSample *buffer, uint32_t sampleSize, double scale); + double hannWindow[BUFFER_SIZE]{}; protected: - double *m_fftwInputLeft{}; - double *m_fftwInputRight{}; + fftw_complex *m_fftwInputLeft{}; + fftw_complex *m_fftwInputRight{}; fftw_complex *m_fftwOutputLeft{}; fftw_complex *m_fftwOutputRight{}; - outputSample *m_sample = new outputSample(FFT_SIZE); + outputSample *m_sample = new outputSample(BUFFER_SIZE); fftw_plan m_fftwPlanLeft{}; fftw_plan m_fftwPlanRight{}; std::mutex m_mtx; size_t m_fftwResults; + static double valueToAmp(double value); + double times; + static double limit; }; diff --git a/headers/VulcanoLE/Audio/JackClient.h b/headers/VulcanoLE/Audio/JackClient.h new file mode 100644 index 0000000..acd9f01 --- /dev/null +++ b/headers/VulcanoLE/Audio/JackClient.h @@ -0,0 +1,46 @@ +#pragma once + +#include +#include +#include +#include +#include +#include "Types.h" +#include "AudioGrabber.h" + +class JackClient { +public: + static JackClient &get() { + static JackClient client; + return client; + } + void start(); + static int processSamples(jack_nframes_t frames, void *arg); + static void onExit(); + void connect(const char *port_name, jack_port_t* channel); + void fillSamples(stereoSample *pFrame, uint32_t i) { + std::lock_guard lockGuard(guard); + for (int j = 0; j < i; ++j) { + pFrame[j].l = samples[j].l; + pFrame[j].r = samples[j].r; + } + m_newDataAvailable = false; + } + bool isData(); + std::string getPort(bool isLeft); + bool checkPort(const std::string& port); + VUtils::Environment* env{}; + int getFrames(); + AudioGrabber *grabber; +private: + std::mutex guard; + stereoSample samples[BUFFER_SIZE]{}; + stereoSample ringBuffer[BUFFER_SIZE]{}; + int samplesAdded = 0; + jack_port_t *input_port_l = nullptr; + jack_port_t *input_port_r = nullptr; + bool m_newDataAvailable = false; + jack_client_t *client = nullptr; + jack_options_t options = jack_options_t(JackNoStartServer | JackUseExactName); + void addFrames(jack_default_audio_sample_t *pDouble, jack_default_audio_sample_t *pDouble1, jack_nframes_t i); +}; \ No newline at end of file diff --git a/headers/VulcanoLE/Audio/Types.h b/headers/VulcanoLE/Audio/Types.h index 9b52b49..f16ee65 100644 --- a/headers/VulcanoLE/Audio/Types.h +++ b/headers/VulcanoLE/Audio/Types.h @@ -1,6 +1,6 @@ #pragma once -#define FFT_SIZE 1024 -#define BUFFER_SIZE 2048 +#define FFT_SIZE 512 +#define BUFFER_SIZE 1024 struct stereoSampleFrame { float l; diff --git a/headers/VulcanoLE/Audio/VisAudioRunner.h b/headers/VulcanoLE/Audio/VisAudioRunner.h index 2187fb5..2baa4a1 100644 --- a/headers/VulcanoLE/Audio/VisAudioRunner.h +++ b/headers/VulcanoLE/Audio/VisAudioRunner.h @@ -4,6 +4,7 @@ #include #include #include +#include class VisAudioRunner { public: @@ -16,5 +17,6 @@ public: VIZ::VisPlugins* plugins; bool isActive = true; std::thread thread; + I2C i2c; VUtils::Environment *env = nullptr; }; diff --git a/headers/VulcanoLE/Keyboards/Vulcan121.h b/headers/VulcanoLE/Keyboards/Vulcan121.h index 89ed710..f5737bf 100644 --- a/headers/VulcanoLE/Keyboards/Vulcan121.h +++ b/headers/VulcanoLE/Keyboards/Vulcan121.h @@ -40,6 +40,7 @@ public: // PLEASE MAKE SURE YOU KNOW THE LIMITS! int getIndexNoCheck(int row, int col); static void fadeOutMap(led_map* map, double factor); + void fadeOutMapColumn(led_map* map, double factor); protected: void setupMap(); // we need some mapping feature! rows and cols dont have the same amount of keys. so the struct needs diff --git a/headers/VulcanoLE/Scripts/PoliceLike.h b/headers/VulcanoLE/Scripts/PoliceLike.h index 0938d61..38506d5 100644 --- a/headers/VulcanoLE/Scripts/PoliceLike.h +++ b/headers/VulcanoLE/Scripts/PoliceLike.h @@ -5,9 +5,9 @@ namespace VIZ { class PoliceLike : public VIZ { protected: - int decayRate = 10; + int decayRate = 5; double lastPeak = -1; - double threshold = 15; + double threshold = 45; public: PoliceLike(AudioGrabber *pGrabber, Vulcan121 *pVulcan121); ~PoliceLike() override = default; diff --git a/headers/VulcanoLE/Scripts/RainbowLine.h b/headers/VulcanoLE/Scripts/RainbowLine.h index 7a7e574..7744528 100644 --- a/headers/VulcanoLE/Scripts/RainbowLine.h +++ b/headers/VulcanoLE/Scripts/RainbowLine.h @@ -8,9 +8,9 @@ namespace VIZ { double deltaNeeded = 100000.0; double deltaElapsed = 0; rgba *colours = nullptr; + int maxCols = 0; double lastValue = 0; double decayValue = 0; - double ratios[4] = {1.3,1.3,1.3,1.2}; double tailFactor = 0.3; public: RainbowLine(AudioGrabber *pGrabber, Vulcan121 *vulcan); @@ -23,5 +23,7 @@ namespace VIZ { led_map *data = Vulcan121::createEmptyLEDMap(); bool firstUnder = true; double deltaMove(double val); + void moveLine(double val, double d); + double factor = 1.0; }; } \ No newline at end of file diff --git a/headers/VulcanoLE/Scripts/RainbowMap.h b/headers/VulcanoLE/Scripts/RainbowMap.h new file mode 100644 index 0000000..55c8b10 --- /dev/null +++ b/headers/VulcanoLE/Scripts/RainbowMap.h @@ -0,0 +1,28 @@ +#pragma once + +#include + +namespace VIZ { + class RainbowMap : public VIZ { + int currentColumn = 0; + double deltaNeeded = 100000.0; + double deltaElapsed = 0; + rgba *colours = nullptr; + int maxCols = 0; + double lastValue = 0; + double decayValue = 0; + public: + RainbowMap(AudioGrabber *pGrabber, Vulcan121 *vulcan); + ~RainbowMap() override; + void onSetup() override; + void onTick(float delta) override; + void calcNextDelta(double ratio); + const char *name() override; + std::string m_name = "Rainbow Map"; + led_map *data = Vulcan121::createEmptyLEDMap(); + bool firstUnder = true; + double deltaMove(double val); + void moveRainbow(double d); + void updateColumn(int column, int colIndex); + }; +} \ No newline at end of file diff --git a/headers/VulcanoLE/Scripts/Random.h b/headers/VulcanoLE/Scripts/Random.h new file mode 100644 index 0000000..6bcd73a --- /dev/null +++ b/headers/VulcanoLE/Scripts/Random.h @@ -0,0 +1,26 @@ +#pragma once + +#include +#include +#include +#include + +namespace VIZ { + class Random : public VIZ { + protected: + led_map *map = nullptr; + bool isReverse{ false }; + bool emptyTicks{ false }; + public: + Random(AudioGrabber *pGrabber, Vulcan121 *vulcan); + ~Random() override; + void onSetup() override; + void onTick(float delta) override; + const char *name() override; + float deltaElapsed; + float deltaNeeded{ 80000 }; + int row; + int columnCount{0}; // for last selected row all previous draw full + int ticks; + }; +} \ No newline at end of file diff --git a/headers/VulcanoLE/Scripts/Spectrum.h b/headers/VulcanoLE/Scripts/Spectrum.h index 16c8ab7..d5c0165 100644 --- a/headers/VulcanoLE/Scripts/Spectrum.h +++ b/headers/VulcanoLE/Scripts/Spectrum.h @@ -13,9 +13,9 @@ namespace VIZ { const char *name() override; std::string m_name = "Spectrum One"; rgba colors[3] = { - { 0, 30, 150, 0 }, - { 150, 150, 0, 0 }, - { 150, 0, 40, 0 } + { 0, 10, 180, 0 }, + { 0, 180, 0, 0 }, + { 150, 0, 0, 0 } }; }; } diff --git a/headers/VulcanoLE/Visual/VisPlugins.h b/headers/VulcanoLE/Visual/VisPlugins.h index c67cf41..0ed5c02 100644 --- a/headers/VulcanoLE/Visual/VisPlugins.h +++ b/headers/VulcanoLE/Visual/VisPlugins.h @@ -3,9 +3,10 @@ #include #include -#define VIZSIZE 4 +#define VIZSIZE 6 using micro = std::chrono::duration; +using ms = std::chrono::duration; namespace VIZ { struct VisPlugins { @@ -18,11 +19,14 @@ namespace VIZ { ~VisPlugins(); VUtils::Environment *env{}; protected: + std::mutex guard; VIZ *viz[VIZSIZE]{}; VIZ *currentVis{}; Vulcan121 *keyboard{}; AudioGrabber *grabber{}; std::chrono::time_point start; + std::chrono::time_point frameStart; + long frames = 0; }; } diff --git a/headers/sol/sol.hpp b/headers/sol/sol.hpp new file mode 100644 index 0000000..4ef5807 --- /dev/null +++ b/headers/sol/sol.hpp @@ -0,0 +1,26674 @@ +// The MIT License (MIT) + +// Copyright (c) 2013-2020 Rapptz, ThePhD and contributors + +// Permission is hereby granted, free of charge, to any person obtaining a copy of +// this software and associated documentation files (the "Software"), to deal in +// the Software without restriction, including without limitation the rights to +// use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of +// the Software, and to permit persons to whom the Software is furnished to do so, +// subject to the following conditions: + +// The above copyright notice and this permission notice shall be included in all +// copies or substantial portions of the Software. + +// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS +// FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR +// COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER +// IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN +// CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. + +// This file was generated with a script. +// Generated 2020-10-03 21:34:24.496436 UTC +// This header was generated with sol v3.2.1 (revision 48eea7b5) +// https://github.com/ThePhD/sol2 + +#ifndef SOL_SINGLE_INCLUDE_HPP +#define SOL_SINGLE_INCLUDE_HPP + +// beginning of sol/sol.hpp + +#ifndef SOL_HPP +#define SOL_HPP + +// beginning of sol/version.hpp + +#include + +#include + +#define SOL_VERSION_MAJOR 3 +#define SOL_VERSION_MINOR 5 +#define SOL_VERSION_PATCH 0 +#define SOL_VERSION_STRING "3.5.0" +#define SOL_VERSION ((SOL_VERSION_MAJOR * 100000) + (SOL_VERSION_MINOR * 100) + (SOL_VERSION_PATCH)) + +#define SOL_IS_ON(OP_SYMBOL) ((3 OP_SYMBOL 3) != 0) +#define SOL_IS_OFF(OP_SYMBOL) ((3 OP_SYMBOL 3) == 0) +#define SOL_IS_DEFAULT_ON(OP_SYMBOL) ((3 OP_SYMBOL 3) > 3) +#define SOL_IS_DEFAULT_OFF(OP_SYMBOL) ((3 OP_SYMBOL 3 OP_SYMBOL 3) < 0) + +#define SOL_ON | +#define SOL_OFF ^ +#define SOL_DEFAULT_ON + +#define SOL_DEFAULT_OFF - + +#if defined(_MSC_VER) + #define SOL_COMPILER_CLANG_I_ SOL_OFF + #define SOL_COMPILER_GCC_I_ SOL_OFF + #define SOL_COMPILER_EDG_I_ SOL_OFF + #define SOL_COMPILER_VCXX_I_ SOL_ON +#elif defined(__clang__) + #define SOL_COMPILER_CLANG_I_ SOL_ON + #define SOL_COMPILER_GCC_I_ SOL_OFF + #define SOL_COMPILER_EDG_I_ SOL_OFF + #define SOL_COMPILER_VCXX_I_ SOL_OFF +#elif defined(__GNUC__) + #define SOL_COMPILER_CLANG_I_ SOL_OFF + #define SOL_COMPILER_GCC_I_ SOL_ON + #define SOL_COMPILER_EDG_I_ SOL_OFF + #define SOL_COMPILER_VCXX_I_ SOL_OFF +#else + #define SOL_COMPILER_CLANG_I_ SOL_OFF + #define SOL_COMPILER_GCC_I_ SOL_OFF + #define SOL_COMPILER_EDG_I_ SOL_OFF + #define SOL_COMPILER_VCXX_I_ SOL_OFF +#endif + +#if defined(__MINGW32__) + #define SOL_COMPILER_FRONTEND_MINGW_I_ SOL_ON +#else + #define SOL_COMPILER_FRONTEND_MINGW_I_ SOL_OFF +#endif + +#if SIZE_MAX <= 0xFFFFULL + #define SOL_PLATFORM_X16_I_ SOL_ON + #define SOL_PLATFORM_X86_I_ SOL_OFF + #define SOL_PLATFORM_X64_I_ SOL_OFF +#elif SIZE_MAX <= 0xFFFFFFFFULL + #define SOL_PLATFORM_X16_I_ SOL_OFF + #define SOL_PLATFORM_X86_I_ SOL_ON + #define SOL_PLATFORM_X64_I_ SOL_OFF +#else + #define SOL_PLATFORM_X16_I_ SOL_OFF + #define SOL_PLATFORM_X86_I_ SOL_OFF + #define SOL_PLATFORM_X64_I_ SOL_ON +#endif + +#define SOL_PLATFORM_ARM32_I_ SOL_OFF +#define SOL_PLATFORM_ARM64_I_ SOL_OFF + +#if defined(_WIN32) + #define SOL_PLATFORM_WINDOWS_I_ SOL_ON +#else + #define SOL_PLATFORM_WINDOWS_I_ SOL_OFF +#endif +#if defined(__APPLE__) + #define SOL_PLATFORM_APPLE_I_ SOL_ON +#else + #define SOL_PLATFORM_APPLE_I_ SOL_OFF +#endif +#if defined(__unix__) + #define SOL_PLATFORM_UNIXLIKE_I_ SOL_ON +#else + #define SOL_PLATFORM_UNIXLIKE_I_ SOL_OFF +#endif +#if defined(__linux__) + #define SOL_PLATFORM_LINUXLIKE_I_ SOL_ON +#else + #define SOL_PLATFORM_LINUXLIKE_I_ SOL_OFF +#endif + +#define SOL_PLATFORM_APPLE_IPHONE_I_ SOL_OFF +#define SOL_PLATFORM_BSDLIKE_I_ SOL_OFF + +#if defined(SOL_IN_DEBUG_DETECTED) + #if SOL_IN_DEBUG_DETECTED != 0 + #define SOL_DEBUG_BUILD_I_ SOL_ON + #else + #define SOL_DEBUG_BUILD_I_ SOL_OFF + #endif +#elif !defined(NDEBUG) + #if SOL_IS_ON(SOL_COMPILER_VCXX_I_) && defined(_DEBUG) + #define SOL_DEBUG_BUILD_I_ SOL_ON + #elif (SOL_IS_ON(SOL_COMPILER_CLANG_I_) || SOL_IS_ON(SOL_COMPILER_GCC_I_)) && !defined(__OPTIMIZE__) + #define SOL_DEBUG_BUILD_I_ SOL_ON + #else + #define SOL_DEBUG_BUILD_I_ SOL_OFF + #endif +#else + #define SOL_DEBUG_BUILD_I_ SOL_DEFAULT_OFF +#endif // We are in a debug mode of some sort + +#if defined(SOL_NO_EXCEPTIONS) + #if (SOL_NO_EXCEPTIONS != 0) + #define SOL_EXCEPTIONS_I_ SOL_OFF + #else + #define SOL_EXCEPTIONS_I_ SOL_ON + #endif +#elif SOL_IS_ON(SOL_COMPILER_VCXX_I_) + #if !defined(_CPPUNWIND) + #define SOL_EXCEPTIONS_I_ SOL_OFF + #else + #define SOL_EXCEPTIONS_I_ SOL_ON + #endif +#elif SOL_IS_ON(SOL_COMPILER_CLANG_I_) || SOL_IS_ON(SOL_COMPILER_GCC_I_) + #if !defined(__EXCEPTIONS) + #define SOL_EXCEPTIONS_I_ SOL_OFF + #else + #define SOL_EXCEPTIONS_I_ SOL_ON + #endif +#else + #define SOL_EXCEPTIONS_I_ SOL_DEFAULT_ON +#endif + +#if defined(SOL_NO_RTTI) + #if (SOL_NO_RTTI != 0) + #define SOL_RTTI_I_ SOL_OFF + #else + #define SOL_RTTI_I_ SOL_ON + #endif +#elif SOL_IS_ON(SOL_COMPILER_VCXX_I_) + #if !defined(_CPPRTTI) + #define SOL_RTTI_I_ SOL_OFF + #else + #define SOL_RTTI_I_ SOL_ON + #endif +#elif SOL_IS_ON(SOL_COMPILER_CLANG_I_) || SOL_IS_ON(SOL_COMPILER_GCC_I_) + #if !defined(__GXX_RTTI) + #define SOL_RTTI_I_ SOL_OFF + #else + #define SOL_RTTI_I_ SOL_ON + #endif +#else + #define SOL_RTTI_I_ SOL_DEFAULT_ON +#endif + +#if defined(SOL_NO_THREAD_LOCAL) && (SOL_NO_THREAD_LOCAL != 0) + #define SOL_USE_THREAD_LOCAL_I_ SOL_OFF +#else + #define SOL_USE_THREAD_LOCAL_I_ SOL_DEFAULT_ON +#endif // thread_local keyword is bjorked on some platforms + +#if defined(SOL_ALL_SAFETIES_ON) && (SOL_ALL_SAFETIES_ON != 0) + #define SOL_ALL_SAFETIES_ON_I_ SOL_ON +#else + #define SOL_ALL_SAFETIES_ON_I_ SOL_DEFAULT_OFF +#endif + +#if defined(SOL_SAFE_GETTER) && (SOL_SAFE_GETTER != 0) + #define SOL_SAFE_GETTER_I_ SOL_ON +#else + #if SOL_IS_ON(SOL_ALL_SAFETIES_ON_I_) + #define SOL_SAFE_GETTER_I_ SOL_ON + #elif SOL_IS_ON(SOL_DEBUG_BUILD_I_) + #define SOL_SAFE_GETTER_I_ SOL_DEFAULT_ON + #else + #define SOL_SAFE_GETTER_I_ SOL_DEFAULT_OFF + #endif +#endif + +#if defined(SOL_SAFE_USERTYPE) && (SOL_SAFE_USERTYPE != 0) + #define SOL_SAFE_USERTYPE_I_ SOL_ON +#else + #if SOL_IS_ON(SOL_ALL_SAFETIES_ON_I_) + #define SOL_SAFE_USERTYPE_I_ SOL_ON + #elif SOL_IS_ON(SOL_DEBUG_BUILD_I_) + #define SOL_SAFE_USERTYPE_I_ SOL_DEFAULT_ON + #else + #define SOL_SAFE_USERTYPE_I_ SOL_DEFAULT_OFF + #endif +#endif + +#if defined(SOL_SAFE_REFERENCES) && (SOL_SAFE_REFERENCES != 0) + #define SOL_SAFE_REFERENCES_I_ SOL_ON +#else + #if SOL_IS_ON(SOL_ALL_SAFETIES_ON_I_) + #define SOL_SAFE_REFERENCES_I_ SOL_ON + #elif SOL_IS_ON(SOL_DEBUG_BUILD_I_) + #define SOL_SAFE_REFERENCES_I_ SOL_DEFAULT_ON + #else + #define SOL_SAFE_REFERENCES_I_ SOL_DEFAULT_OFF + #endif +#endif + +#if (defined(SOL_SAFE_FUNCTIONS) && (SOL_SAFE_FUNCTIONS != 0)) \ + || (defined(SOL_SAFE_FUNCTION_OBJECTS) && (SOL_SAFE_FUNCTION_OBJECTS != 0)) + #define SOL_SAFE_FUNCTION_OBJECTS_I_ SOL_ON +#else + #if SOL_IS_ON(SOL_ALL_SAFETIES_ON_I_) + #define SOL_SAFE_FUNCTION_OBJECTS_I_ SOL_ON + #elif SOL_IS_ON(SOL_DEBUG_BUILD_I_) + #define SOL_SAFE_FUNCTION_OBJECTS_I_ SOL_DEFAULT_ON + #else + #define SOL_SAFE_FUNCTION_OBJECTS_I_ SOL_DEFAULT_OFF + #endif +#endif + +#if defined(SOL_SAFE_FUNCTION_CALLS) && (SOL_SAFE_FUNCTION_CALLS != 0) + #define SOL_SAFE_FUNCTION_CALLS_I_ SOL_ON +#else + #if SOL_IS_ON(SOL_ALL_SAFETIES_ON_I_) + #define SOL_SAFE_FUNCTION_CALLS_I_ SOL_ON + #elif SOL_IS_ON(SOL_DEBUG_BUILD_I_) + #define SOL_SAFE_FUNCTION_CALLS_I_ SOL_DEFAULT_ON + #else + #define SOL_SAFE_FUNCTION_CALLS_I_ SOL_DEFAULT_OFF + #endif +#endif + +#if defined(SOL_SAFE_PROXIES) && (SOL_SAFE_PROXIES != 0) + #define SOL_SAFE_PROXIES_I_ SOL_ON +#else + #if SOL_IS_ON(SOL_ALL_SAFETIES_ON_I_) + #define SOL_SAFE_PROXIES_I_ SOL_ON + #elif SOL_IS_ON(SOL_DEBUG_BUILD_I_) + #define SOL_SAFE_PROXIES_I_ SOL_DEFAULT_ON + #else + #define SOL_SAFE_PROXIES_I_ SOL_DEFAULT_OFF + #endif +#endif + +#if defined(SOL_SAFE_NUMERICS) && (SOL_SAFE_NUMERICS != 0) + #define SOL_SAFE_NUMERICS_I_ SOL_ON +#else + #if SOL_IS_ON(SOL_ALL_SAFETIES_ON_I_) + #define SOL_SAFE_NUMERICS_I_ SOL_ON + #elif SOL_IS_ON(SOL_DEBUG_BUILD_I_) + #define SOL_SAFE_NUMERICS_I_ SOL_DEFAULT_ON + #else + #define SOL_SAFE_NUMERICS_I_ SOL_DEFAULT_OFF + #endif +#endif + +#if defined(SOL_SAFE_STACK_CHECK) && (SOL_SAFE_STACK_CHECK != 0) + #define SOL_SAFE_STACK_CHECK_I_ SOL_ON +#else + #if SOL_IS_ON(SOL_ALL_SAFETIES_ON_I_) + #define SOL_SAFE_STACK_CHECK_I_ SOL_ON + #elif SOL_IS_ON(SOL_DEBUG_BUILD_I_) + #define SOL_SAFE_STACK_CHECK_I_ SOL_DEFAULT_ON + #else + #define SOL_SAFE_STACK_CHECK_I_ SOL_DEFAULT_OFF + #endif +#endif + +#if (defined(SOL_NO_CHECK_NUMBER_PRECISION) && (SOL_NO_CHECK_NUMBER_PRECISION != 0)) \ + || (defined(SOL_NO_CHECKING_NUMBER_PRECISION) && (SOL_NO_CHECKING_NUMBER_PRECISION != 0)) + #define SOL_NUMBER_PRECISION_CHECKS_I_ SOL_OFF +#else + #if SOL_IS_ON(SOL_ALL_SAFETIES_ON_I_) + #define SOL_NUMBER_PRECISION_CHECKS_I_ SOL_ON + #elif SOL_IS_ON(SOL_SAFE_NUMERICS_I_) + #define SOL_NUMBER_PRECISION_CHECKS_I_ SOL_ON + #elif SOL_IS_ON(SOL_DEBUG_BUILD_I_) + #define SOL_NUMBER_PRECISION_CHECKS_I_ SOL_DEFAULT_ON + #else + #define SOL_NUMBER_PRECISION_CHECKS_I_ SOL_DEFAULT_OFF + #endif +#endif + +#if defined(SOL_STRINGS_ARE_NUMBERS) + #if (SOL_STRINGS_ARE_NUMBERS != 0) + #define SOL_STRINGS_ARE_NUMBERS_I_ SOL_ON + #else + #define SOL_STRINGS_ARE_NUMBERS_I_ SOL_OFF + #endif +#else + #define SOL_STRINGS_ARE_NUMBERS_I_ SOL_DEFAULT_OFF +#endif + +#if defined(SOL_ENABLE_INTEROP) && (SOL_ENABLE_INTEROP != 0) \ + || defined(SOL_USE_INTEROP) && (SOL_USE_INTEROP != 0) + #define SOL_USE_INTEROP_I_ SOL_ON +#else + #define SOL_USE_INTEROP_I_ SOL_DEFAULT_OFF +#endif + +#if defined(SOL_NO_NIL) + #if (SOL_NO_NIL != 0) + #define SOL_NIL_I_ SOL_OFF + #else + #define SOL_NIL_I_ SOL_ON + #endif +#elif defined(__MAC_OS_X_VERSION_MAX_ALLOWED) || defined(__OBJC__) || defined(nil) + #define SOL_NIL_I_ SOL_DEFAULT_OFF +#else + #define SOL_NIL_I_ SOL_DEFAULT_ON +#endif + +#if defined(SOL_USERTYPE_TYPE_BINDING_INFO) + #if (SOL_USERTYPE_TYPE_BINDING_INFO != 0) + #define SOL_USERTYPE_TYPE_BINDING_INFO_I_ SOL_ON + #else + #define SOL_USERTYPE_TYPE_BINDING_INFO_I_ SOL_OFF + #endif +#else + #define SOL_USERTYPE_TYPE_BINDING_INFO_I_ SOL_DEFAULT_ON +#endif // We should generate a my_type.__type table with lots of class information for usertypes + +#if defined(SOL_AUTOMAGICAL_TYPES_BY_DEFAULT) + #if (SOL_AUTOMAGICAL_TYPES_BY_DEFAULT != 0) + #define SOL_DEFAULT_AUTOMAGICAL_USERTYPES_I_ SOL_ON + #else + #define SOL_DEFAULT_AUTOMAGICAL_USERTYPES_I_ SOL_OFF + #endif +#elif defined(SOL_DEFAULT_AUTOMAGICAL_USERTYPES) + #if (SOL_DEFAULT_AUTOMAGICAL_USERTYPES != 0) + #define SOL_DEFAULT_AUTOMAGICAL_USERTYPES_I_ SOL_ON + #else + #define SOL_DEFAULT_AUTOMAGICAL_USERTYPES_I_ SOL_OFF + #endif +#else + #define SOL_DEFAULT_AUTOMAGICAL_USERTYPES_I_ SOL_DEFAULT_ON +#endif // make is_automagical on/off by default + +#if defined(SOL_STD_VARIANT) + #if (SOL_STD_VARIANT != 0) + #define SOL_STD_VARIANT_I_ SOL_ON + #else + #define SOL_STD_VARIANT_I_ SOL_OFF + #endif +#else + #if SOL_IS_ON(SOL_COMPILER_CLANG_I_) && SOL_IS_ON(SOL_PLATFORM_APPLE_I_) + #if defined(__has_include) + #if __has_include() + #define SOL_STD_VARIANT_I_ SOL_ON + #else + #define SOL_STD_VARIANT_I_ SOL_OFF + #endif + #else + #define SOL_STD_VARIANT_I_ SOL_OFF + #endif + #else + #define SOL_STD_VARIANT_I_ SOL_DEFAULT_ON + #endif +#endif // make is_automagical on/off by default + +#if defined(SOL_NOEXCEPT_FUNCTION_TYPE) + #if (SOL_NOEXCEPT_FUNCTION_TYPE != 0) + #define SOL_USE_NOEXCEPT_FUNCTION_TYPE_I_ SOL_ON + #else + #define SOL_USE_NOEXCEPT_FUNCTION_TYPE_I_ SOL_OFF + #endif +#else + #if defined(__cpp_noexcept_function_type) + #define SOL_USE_NOEXCEPT_FUNCTION_TYPE_I_ SOL_ON + #elif SOL_IS_ON(SOL_COMPILER_VCXX_I_) && (defined(_MSVC_LANG) && (_MSVC_LANG < 201403L)) + // There is a bug in the VC++ compiler?? + // on /std:c++latest under x86 conditions (VS 15.5.2), + // compiler errors are tossed for noexcept markings being on function types + // that are identical in every other way to their non-noexcept marked types function types... + // VS 2019: There is absolutely a bug. + #define SOL_USE_NOEXCEPT_FUNCTION_TYPE_I_ SOL_OFF + #else + #define SOL_USE_NOEXCEPT_FUNCTION_TYPE_I_ SOL_DEFAULT_ON + #endif +#endif // noexcept is part of a function's type + +#if defined(SOL_STACK_STRING_OPTIMIZATION_SIZE) && SOL_STACK_STRING_OPTIMIZATION_SIZE > 0 + #define SOL_OPTIMIZATION_STRING_CONVERSION_STACK_SIZE_I_ SOL_STACK_STRING_OPTIMIZATION_SIZE +#else + #define SOL_OPTIMIZATION_STRING_CONVERSION_STACK_SIZE_I_ 1024 +#endif + +#if defined(SOL_ID_SIZE) && SOL_ID_SIZE > 0 + #define SOL_ID_SIZE_I_ SOL_ID_SIZE +#else + #define SOL_ID_SIZE_I_ 512 +#endif + +#if defined(LUA_IDSIZE) && LUA_IDSIZE > 0 + #define SOL_FILE_ID_SIZE_I_ LUA_IDSIZE +#elif defined(SOL_ID_SIZE) && SOL_ID_SIZE > 0 + #define SOL_FILE_ID_SIZE_I_ SOL_FILE_ID_SIZE +#else + #define SOL_FILE_ID_SIZE_I_ 2048 +#endif + +#if defined(SOL_PRINT_ERRORS) + #if (SOL_PRINT_ERRORS != 0) + #define SOL_PRINT_ERRORS_I_ SOL_ON + #else + #define SOL_PRINT_ERRORS_I_ SOL_OFF + #endif +#else + #if SOL_IS_ON(SOL_ALL_SAFETIES_ON_I_) + #define SOL_PRINT_ERRORS_I_ SOL_ON + #elif SOL_IS_ON(SOL_DEBUG_BUILD_I_) + #define SOL_PRINT_ERRORS_I_ SOL_DEFAULT_ON + #else + #define SOL_PRINT_ERRORS_I_ SOL_OFF + #endif +#endif + +#if defined(SOL_DEFAULT_PASS_ON_ERROR) && (SOL_DEFAULT_PASS_ON_ERROR != 0) + #define SOL_DEFAULT_PASS_ON_ERROR_I_ SOL_ON +#else + #if SOL_IS_ON(SOL_ALL_SAFETIES_ON_I_) + #define SOL_DEFAULT_PASS_ON_ERROR_I_ SOL_ON + #elif SOL_IS_ON(SOL_DEBUG_BUILD_I_) + #define SOL_DEFAULT_PASS_ON_ERROR_I_ SOL_DEFAULT_ON + #else + #define SOL_DEFAULT_PASS_ON_ERROR_I_ SOL_OFF + #endif +#endif + +#if defined(SOL_USING_CXX_LUA) + #if (SOL_USING_CXX_LUA != 0) + #define SOL_USE_CXX_LUA_I_ SOL_ON + #else + #define SOL_USE_CXX_LUA_I_ SOL_OFF + #endif +#elif defined(SOL_USE_CXX_LUA) + #if (SOL_USE_CXX_LUA != 0) + #define SOL_USE_CXX_LUA_I_ SOL_ON + #else + #define SOL_USE_CXX_LUA_I_ SOL_OFF + #endif +#else + #define SOL_USE_CXX_LUA_I_ SOL_OFF +#endif + +#if defined(SOL_USING_CXX_LUAJIT) + #if (SOL_USING_CXX_LUA != 0) + #define SOL_USE_CXX_LUAJIT_I_ SOL_ON + #else + #define SOL_USE_CXX_LUAJIT_I_ SOL_OFF + #endif +#elif defined(SOL_USE_CXX_LUAJIT) + #if (SOL_USE_CXX_LUA != 0) + #define SOL_USE_CXX_LUAJIT_I_ SOL_ON + #else + #define SOL_USE_CXX_LUAJIT_I_ SOL_OFF + #endif +#else + #define SOL_USE_CXX_LUAJIT_I_ SOL_OFF +#endif + +#if defined(SOL_NO_LUA_HPP) + #if (SOL_NO_LUA_HPP != 0) + #define SOL_USE_LUA_HPP_I_ SOL_OFF + #else + #define SOL_USE_LUA_HPP_I_ SOL_ON + #endif +#elif defined(SOL_USING_CXX_LUA) + #define SOL_USE_LUA_HPP_I_ SOL_OFF +#elif defined(__has_include) + #if __has_include() + #define SOL_USE_LUA_HPP_I_ SOL_ON + #else + #define SOL_USE_LUA_HPP_I_ SOL_OFF + #endif +#else + #define SOL_USE_LUA_HPP_I_ SOL_DEFAULT_ON +#endif + +#if defined(SOL_CONTAINERS_START) + #define SOL_CONTAINER_START_INDEX_I_ SOL_CONTAINERS_START +#elif defined(SOL_CONTAINERS_START_INDEX) + #define SOL_CONTAINER_START_INDEX_I_ SOL_CONTAINERS_START_INDEX +#elif defined(SOL_CONTAINER_START_INDEX) + #define SOL_CONTAINER_START_INDEX_I_ SOL_CONTAINER_START_INDEX +#else + #define SOL_CONTAINER_START_INDEX_I_ 1 +#endif + +#if defined (SOL_NO_MEMORY_ALIGNMENT) + #if (SOL_NO_MEMORY_ALIGNMENT != 0) + #define SOL_ALIGN_MEMORY_I_ SOL_OFF + #else + #define SOL_ALIGN_MEMORY_I_ SOL_ON + #endif +#else + #define SOL_ALIGN_MEMORY_I_ SOL_DEFAULT_ON +#endif + +#if defined(SOL_USE_BOOST) + #if (SOL_USE_BOOST != 0) + #define SOL_USE_BOOST_I_ SOL_ON + #else + #define SOL_USE_BOOST_I_ SOL_OFF + #endif +#else + #define SOL_USE_BOOST_I_ SOL_OFF +#endif + +#if defined(SOL_USE_UNSAFE_BASE_LOOKUP) + #if (SOL_USE_UNSAFE_BASE_LOOKUP != 0) + #define SOL_USE_UNSAFE_BASE_LOOKUP_I_ SOL_ON + #else + #define SOL_USE_UNSAFE_BASE_LOOKUP_I_ SOL_OFF + #endif +#else + #define SOL_USE_UNSAFE_BASE_LOOKUP_I_ SOL_OFF +#endif + +#if defined(SOL_INSIDE_UNREAL) + #if (SOL_INSIDE_UNREAL != 0) + #define SOL_INSIDE_UNREAL_ENGINE_I_ SOL_ON + #else + #define SOL_INSIDE_UNREAL_ENGINE_I_ SOL_OFF + #endif +#else + #if defined(UE_BUILD_DEBUG) || defined(UE_BUILD_DEVELOPMENT) || defined(UE_BUILD_TEST) || defined(UE_BUILD_SHIPPING) || defined(UE_SERVER) + #define SOL_INSIDE_UNREAL_ENGINE_I_ SOL_ON + #else + #define SOL_INSIDE_UNREAL_ENGINE_I_ SOL_DEFAULT_OFF + #endif +#endif + +#if defined(SOL_NO_COMPAT) + #if (SOL_NO_COMPAT != 0) + #define SOL_USE_COMPATIBILITY_LAYER_I_ SOL_OFF + #else + #define SOL_USE_COMPATIBILITY_LAYER_I_ SOL_ON + #endif +#else + #define SOL_USE_COMPATIBILITY_LAYER_I_ SOL_DEFAULT_ON +#endif + +#if defined(SOL_GET_FUNCTION_POINTER_UNSAFE) + #if (SOL_GET_FUNCTION_POINTER_UNSAFE != 0) + #define SOL_GET_FUNCTION_POINTER_UNSAFE_I_ SOL_ON + #else + #define SOL_GET_FUNCTION_POINTER_UNSAFE_I_ SOL_OFF + #endif +#else + #define SOL_GET_FUNCTION_POINTER_UNSAFE_I_ SOL_DEFAULT_OFF +#endif + +#if SOL_IS_ON(SOL_COMPILER_FRONTEND_MINGW_I_) && defined(__GNUC__) && (__GNUC__ < 6) + // MinGW is off its rocker in some places... + #define SOL_MINGW_CCTYPE_IS_POISONED_I_ SOL_ON +#else + #define SOL_MINGW_CCTYPE_IS_POISONED_I_ SOL_DEFAULT_OFF +#endif + +// end of sol/version.hpp + +#if SOL_IS_ON(SOL_INSIDE_UNREAL_ENGINE_I_) +#ifdef check +#pragma push_macro("check") +#undef check +#endif +#endif // Unreal Engine 4 Bullshit + +#if SOL_IS_ON(SOL_COMPILER_GCC_I_) +#pragma GCC diagnostic push +#pragma GCC diagnostic ignored "-Wshadow" +#pragma GCC diagnostic ignored "-Wconversion" +#if __GNUC__ > 6 +#pragma GCC diagnostic ignored "-Wnoexcept-type" +#endif +#elif SOL_IS_ON(SOL_COMPILER_CLANG_I_) +#elif SOL_IS_ON(SOL_COMPILER_VCXX_I_) +#pragma warning(push) +#pragma warning(disable : 4505) // unreferenced local function has been removed GEE THANKS +#endif // clang++ vs. g++ vs. VC++ + +// beginning of sol/forward.hpp + +#ifndef SOL_FORWARD_HPP +#define SOL_FORWARD_HPP + +#include +#include +#include + +#if SOL_IS_ON(SOL_USE_CXX_LUA_I_) || SOL_IS_ON(SOL_USE_CXX_LUAJIT_I_) +struct lua_State; +#else +extern "C" { +struct lua_State; +} +#endif // C++ Mangling for Lua vs. Not + +namespace sol { + + enum class type; + + class stateless_reference; + template + class basic_reference; + using reference = basic_reference; + using main_reference = basic_reference; + class stateless_stack_reference; + class stack_reference; + + template + class basic_bytecode; + + struct lua_value; + + struct proxy_base_tag; + template + struct proxy_base; + template + struct table_proxy; + + template + class basic_table_core; + template + using table_core = basic_table_core; + template + using main_table_core = basic_table_core; + template + using stack_table_core = basic_table_core; + template + using basic_table = basic_table_core; + using table = table_core; + using global_table = table_core; + using main_table = main_table_core; + using main_global_table = main_table_core; + using stack_table = stack_table_core; + using stack_global_table = stack_table_core; + + template + struct basic_lua_table; + using lua_table = basic_lua_table; + using stack_lua_table = basic_lua_table; + + template + class basic_usertype; + template + using usertype = basic_usertype; + template + using stack_usertype = basic_usertype; + + template + class basic_metatable; + using metatable = basic_metatable; + using stack_metatable = basic_metatable; + + template + struct basic_environment; + using environment = basic_environment; + using main_environment = basic_environment; + using stack_environment = basic_environment; + + template + class basic_function; + template + class basic_protected_function; + using unsafe_function = basic_function; + using safe_function = basic_protected_function; + using main_unsafe_function = basic_function; + using main_safe_function = basic_protected_function; + using stack_unsafe_function = basic_function; + using stack_safe_function = basic_protected_function; + using stack_aligned_unsafe_function = basic_function; + using stack_aligned_safe_function = basic_protected_function; + using protected_function = safe_function; + using main_protected_function = main_safe_function; + using stack_protected_function = stack_safe_function; + using stack_aligned_protected_function = stack_aligned_safe_function; +#if SOL_IS_ON(SOL_SAFE_FUNCTION_OBJECTS_I_) + using function = protected_function; + using main_function = main_protected_function; + using stack_function = stack_protected_function; + using stack_aligned_function = stack_aligned_safe_function; +#else + using function = unsafe_function; + using main_function = main_unsafe_function; + using stack_function = stack_unsafe_function; + using stack_aligned_function = stack_aligned_unsafe_function; +#endif + using stack_aligned_stack_handler_function = basic_protected_function; + + struct unsafe_function_result; + struct protected_function_result; + using safe_function_result = protected_function_result; +#if SOL_IS_ON(SOL_SAFE_FUNCTION_OBJECTS_I_) + using function_result = safe_function_result; +#else + using function_result = unsafe_function_result; +#endif + + template + class basic_object_base; + template + class basic_object; + template + class basic_userdata; + template + class basic_lightuserdata; + template + class basic_coroutine; + template + class basic_thread; + + using object = basic_object; + using userdata = basic_userdata; + using lightuserdata = basic_lightuserdata; + using thread = basic_thread; + using coroutine = basic_coroutine; + using main_object = basic_object; + using main_userdata = basic_userdata; + using main_lightuserdata = basic_lightuserdata; + using main_coroutine = basic_coroutine; + using stack_object = basic_object; + using stack_userdata = basic_userdata; + using stack_lightuserdata = basic_lightuserdata; + using stack_thread = basic_thread; + using stack_coroutine = basic_coroutine; + + struct stack_proxy_base; + struct stack_proxy; + struct variadic_args; + struct variadic_results; + struct stack_count; + struct this_state; + struct this_main_state; + struct this_environment; + + class state_view; + class state; + + template + struct as_table_t; + template + struct as_container_t; + template + struct nested; + template + struct light; + template + struct user; + template + struct as_args_t; + template + struct protect_t; + template + struct policy_wrapper; + + template + struct usertype_traits; + template + struct unique_usertype_traits; + + template + struct types { + typedef std::make_index_sequence indices; + static constexpr std::size_t size() { + return sizeof...(Args); + } + }; + + template + struct derive : std::false_type { + typedef types<> type; + }; + + template + struct base : std::false_type { + typedef types<> type; + }; + + template + struct weak_derive { + static bool value; + }; + + template + bool weak_derive::value = false; + + namespace stack { + struct record; + } + +#if SOL_IS_OFF(SOL_USE_BOOST_I_) + template + class optional; + + template + class optional; +#endif + + using check_handler_type = int(lua_State*, int, type, type, const char*); + +} // namespace sol + +#define SOL_BASE_CLASSES(T, ...) \ + namespace sol { \ + template <> \ + struct base : std::true_type { \ + typedef ::sol::types<__VA_ARGS__> type; \ + }; \ + } \ + void a_sol3_detail_function_decl_please_no_collide() +#define SOL_DERIVED_CLASSES(T, ...) \ + namespace sol { \ + template <> \ + struct derive : std::true_type { \ + typedef ::sol::types<__VA_ARGS__> type; \ + }; \ + } \ + void a_sol3_detail_function_decl_please_no_collide() + +#endif // SOL_FORWARD_HPP +// end of sol/forward.hpp + +// beginning of sol/forward_detail.hpp + +#ifndef SOL_FORWARD_DETAIL_HPP +#define SOL_FORWARD_DETAIL_HPP + +// beginning of sol/traits.hpp + +// beginning of sol/tuple.hpp + +// beginning of sol/base_traits.hpp + +#include + +namespace sol { + namespace detail { + struct unchecked_t {}; + const unchecked_t unchecked = unchecked_t{}; + } // namespace detail + + namespace meta { + using sfinae_yes_t = std::true_type; + using sfinae_no_t = std::false_type; + + template + using void_t = void; + + template + using unqualified = std::remove_cv>; + + template + using unqualified_t = typename unqualified::type; + + namespace meta_detail { + template + struct unqualified_non_alias : unqualified {}; + + template