Skip to content

Commit 8d663ff

Browse files
committed
dev
1 parent e68b7b7 commit 8d663ff

File tree

11 files changed

+1883
-1887
lines changed

11 files changed

+1883
-1887
lines changed

.gitmodules

Lines changed: 3 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,3 @@
1-
[submodule "vendor/reaper-sdk"]
2-
path = vendor/reaper-sdk
3-
url = https://github.com/justinfrankel/reaper-sdk
4-
[submodule "vendor/WDL"]
5-
path = vendor/WDL
6-
url = https://github.com/justinfrankel/WDL
1+
[submodule "vendor/WDL"]
2+
path = vendor/WDL
3+
url = https://github.com/justinfrankel/WDL

cmake/FindSWELL.cmake

Lines changed: 33 additions & 33 deletions
Original file line numberDiff line numberDiff line change
@@ -1,33 +1,33 @@
1-
if(TARGET SWELL::swell)
2-
return()
3-
endif()
4-
5-
find_package(WDL REQUIRED)
6-
7-
find_path(SWELL_INCLUDE_DIR
8-
NAMES swell/swell.h
9-
PATHS ${WDL_DIR}
10-
NO_DEFAULT_PATH
11-
)
12-
mark_as_advanced(SWELL_INCLUDE_DIR)
13-
14-
set(SWELL_DIR "${SWELL_INCLUDE_DIR}/swell")
15-
set(SWELL_RESGEN "${SWELL_DIR}/mac_resgen.php")
16-
17-
include(FindPackageHandleStandardArgs)
18-
find_package_handle_standard_args(SWELL REQUIRED_VARS SWELL_DIR)
19-
20-
add_library(swell
21-
${SWELL_DIR}/swell-modstub$<IF:$<BOOL:${APPLE}>,.mm,-generic.cpp>)
22-
23-
set_property(TARGET swell PROPERTY CXX_STANDARD 98)
24-
target_compile_definitions(swell PUBLIC SWELL_PROVIDED_BY_APP)
25-
target_include_directories(swell INTERFACE ${SWELL_INCLUDE_DIR})
26-
target_link_libraries(swell PUBLIC WDL::WDL)
27-
28-
if(APPLE)
29-
find_library(APPKIT_LIB AppKit)
30-
target_link_libraries(swell PUBLIC ${APPKIT_LIB})
31-
endif()
32-
33-
add_library(SWELL::swell ALIAS swell)
1+
if(TARGET SWELL::swell)
2+
return()
3+
endif()
4+
5+
find_package(WDL REQUIRED)
6+
7+
find_path(SWELL_INCLUDE_DIR
8+
NAMES swell/swell.h
9+
PATHS ${WDL_DIR}
10+
NO_DEFAULT_PATH
11+
)
12+
mark_as_advanced(SWELL_INCLUDE_DIR)
13+
14+
set(SWELL_DIR "${SWELL_INCLUDE_DIR}/swell")
15+
set(SWELL_RESGEN "${SWELL_DIR}/mac_resgen.php")
16+
17+
include(FindPackageHandleStandardArgs)
18+
find_package_handle_standard_args(SWELL REQUIRED_VARS SWELL_DIR)
19+
20+
add_library(swell
21+
${SWELL_DIR}/swell-modstub$<IF:$<BOOL:${APPLE}>,.mm,-generic.cpp>)
22+
23+
set_property(TARGET swell PROPERTY CXX_STANDARD 98)
24+
target_compile_definitions(swell PUBLIC SWELL_PROVIDED_BY_APP)
25+
target_include_directories(swell INTERFACE ${SWELL_INCLUDE_DIR})
26+
target_link_libraries(swell PUBLIC WDL::WDL)
27+
28+
if(APPLE)
29+
find_library(APPKIT_LIB AppKit)
30+
target_link_libraries(swell PUBLIC ${APPKIT_LIB})
31+
endif()
32+
33+
add_library(SWELL::swell ALIAS swell)

cmake/FindWDL.cmake

Lines changed: 22 additions & 22 deletions
Original file line numberDiff line numberDiff line change
@@ -1,22 +1,22 @@
1-
if(TARGET WDL::WDL)
2-
return()
3-
endif()
4-
5-
find_path(WDL_INCLUDE_DIR
6-
NAMES WDL/wdltypes.h
7-
PATHS ${CMAKE_SOURCE_DIR}/vendor/WDL
8-
NO_DEFAULT_PATH
9-
)
10-
mark_as_advanced(WDL_INCLUDE_DIR)
11-
12-
set(WDL_DIR "${WDL_INCLUDE_DIR}/WDL")
13-
14-
include(FindPackageHandleStandardArgs)
15-
find_package_handle_standard_args(WDL REQUIRED_VARS WDL_DIR WDL_INCLUDE_DIR)
16-
17-
add_library(wdl INTERFACE)
18-
19-
target_compile_definitions(wdl INTERFACE WDL_NO_DEFINE_MINMAX)
20-
target_include_directories(wdl INTERFACE ${WDL_INCLUDE_DIR})
21-
22-
add_library(WDL::WDL ALIAS wdl)
1+
if(TARGET WDL::WDL)
2+
return()
3+
endif()
4+
5+
find_path(WDL_INCLUDE_DIR
6+
NAMES WDL/wdltypes.h
7+
PATHS ${CMAKE_SOURCE_DIR}/vendor/WDL
8+
NO_DEFAULT_PATH
9+
)
10+
mark_as_advanced(WDL_INCLUDE_DIR)
11+
12+
set(WDL_DIR "${WDL_INCLUDE_DIR}/WDL")
13+
14+
include(FindPackageHandleStandardArgs)
15+
find_package_handle_standard_args(WDL REQUIRED_VARS WDL_DIR WDL_INCLUDE_DIR)
16+
17+
add_library(wdl INTERFACE)
18+
19+
target_compile_definitions(wdl INTERFACE WDL_NO_DEFINE_MINMAX)
20+
target_include_directories(wdl INTERFACE ${WDL_INCLUDE_DIR})
21+
22+
add_library(WDL::WDL ALIAS wdl)

include/reaper_imgui_functions.h

Lines changed: 777 additions & 777 deletions
Large diffs are not rendered by default.

include/reascript_vararg.hpp

Lines changed: 72 additions & 72 deletions
Original file line numberDiff line numberDiff line change
@@ -1,72 +1,72 @@
1-
// Extracted from ReaPack's and ReaImGui's source code (LGPL v3)
2-
3-
/* Usage example:
4-
static int HelloWorld(int foo, int bar) { return foo * bar; }
5-
6-
extern "C" REAPER_PLUGIN_DLL_EXPORT int REAPER_PLUGIN_ENTRYPOINT(
7-
REAPER_PLUGIN_HINSTANCE instance, reaper_plugin_info_t *rec)
8-
{
9-
// ...
10-
// API_HelloWorld and APIdef_HelloWorld must also be registered as usual
11-
plugin_register("APIvararg_HelloWorld",
12-
reinterpret_cast<void *>(&InvokeReaScriptAPI<&HelloWorld>));
13-
// ...
14-
}
15-
*/
16-
17-
#include <tuple>
18-
19-
template<typename T>
20-
struct ReaScriptAPI;
21-
22-
template<typename R, typename... Args>
23-
struct ReaScriptAPI<R(*)(Args...)>
24-
{
25-
static const void *applyVarArg(R(*fn)(Args...), void **argv, const int argc)
26-
{
27-
if(static_cast<size_t>(argc) < sizeof...(Args))
28-
return nullptr;
29-
30-
const auto &args { makeTuple(argv, std::index_sequence_for<Args...>{}) };
31-
32-
if constexpr (std::is_void_v<R>) {
33-
std::apply(fn, args);
34-
return nullptr;
35-
}
36-
else if constexpr (std::is_floating_point_v<R>) {
37-
const auto value { std::apply(fn, args) };
38-
void *storage { argv[argc - 1] };
39-
*static_cast<double *>(storage) = value;
40-
return storage;
41-
}
42-
else {
43-
// cast numbers to have the same size as a pointer to avoid warnings
44-
using IntPtrR = std::conditional_t<std::is_pointer_v<R>, R, uintptr_t>;
45-
const auto value { static_cast<IntPtrR>(std::apply(fn, args)) };
46-
return reinterpret_cast<const void *>(value);
47-
}
48-
}
49-
50-
private:
51-
template<size_t I>
52-
using NthType = typename std::tuple_element<I, std::tuple<Args...>>::type;
53-
54-
template<size_t... I>
55-
static auto makeTuple(void **argv, std::index_sequence<I...>)
56-
{
57-
// C++17 is amazing
58-
return std::make_tuple(
59-
std::is_floating_point_v<NthType<I>> ?
60-
*reinterpret_cast<NthType<I>*>(argv[I]) :
61-
(NthType<I>)reinterpret_cast<uintptr_t>(argv[I])
62-
...
63-
);
64-
}
65-
66-
};
67-
68-
template<auto fn>
69-
const void *InvokeReaScriptAPI(void **argv, int argc)
70-
{
71-
return ReaScriptAPI<decltype(fn)>::applyVarArg(fn, argv, argc);
72-
}
1+
// Extracted from ReaPack's and ReaImGui's source code (LGPL v3)
2+
3+
/* Usage example:
4+
static int HelloWorld(int foo, int bar) { return foo * bar; }
5+
6+
extern "C" REAPER_PLUGIN_DLL_EXPORT int REAPER_PLUGIN_ENTRYPOINT(
7+
REAPER_PLUGIN_HINSTANCE instance, reaper_plugin_info_t *rec)
8+
{
9+
// ...
10+
// API_HelloWorld and APIdef_HelloWorld must also be registered as usual
11+
plugin_register("APIvararg_HelloWorld",
12+
reinterpret_cast<void *>(&InvokeReaScriptAPI<&HelloWorld>));
13+
// ...
14+
}
15+
*/
16+
17+
#include <tuple>
18+
19+
template<typename T>
20+
struct ReaScriptAPI;
21+
22+
template<typename R, typename... Args>
23+
struct ReaScriptAPI<R(*)(Args...)>
24+
{
25+
static const void *applyVarArg(R(*fn)(Args...), void **argv, const int argc)
26+
{
27+
if(static_cast<size_t>(argc) < sizeof...(Args))
28+
return nullptr;
29+
30+
const auto &args { makeTuple(argv, std::index_sequence_for<Args...>{}) };
31+
32+
if constexpr (std::is_void_v<R>) {
33+
std::apply(fn, args);
34+
return nullptr;
35+
}
36+
else if constexpr (std::is_floating_point_v<R>) {
37+
const auto value { std::apply(fn, args) };
38+
void *storage { argv[argc - 1] };
39+
*static_cast<double *>(storage) = value;
40+
return storage;
41+
}
42+
else {
43+
// cast numbers to have the same size as a pointer to avoid warnings
44+
using IntPtrR = std::conditional_t<std::is_pointer_v<R>, R, uintptr_t>;
45+
const auto value { static_cast<IntPtrR>(std::apply(fn, args)) };
46+
return reinterpret_cast<const void *>(value);
47+
}
48+
}
49+
50+
private:
51+
template<size_t I>
52+
using NthType = typename std::tuple_element<I, std::tuple<Args...>>::type;
53+
54+
template<size_t... I>
55+
static auto makeTuple(void **argv, std::index_sequence<I...>)
56+
{
57+
// C++17 is amazing
58+
return std::make_tuple(
59+
std::is_floating_point_v<NthType<I>> ?
60+
*reinterpret_cast<NthType<I>*>(argv[I]) :
61+
(NthType<I>)reinterpret_cast<uintptr_t>(argv[I])
62+
...
63+
);
64+
}
65+
66+
};
67+
68+
template<auto fn>
69+
const void *InvokeReaScriptAPI(void **argv, int argc)
70+
{
71+
return ReaScriptAPI<decltype(fn)>::applyVarArg(fn, argv, argc);
72+
}

0 commit comments

Comments
 (0)