diff --git a/pic/arm32.png b/pic/arm32.png deleted file mode 100644 index 2c0f464..0000000 Binary files a/pic/arm32.png and /dev/null differ diff --git a/pic/arm64.png b/pic/arm64.png deleted file mode 100644 index 3ae6baa..0000000 Binary files a/pic/arm64.png and /dev/null differ diff --git a/pic/cc.png b/pic/cc.png deleted file mode 100644 index c444e00..0000000 Binary files a/pic/cc.png and /dev/null differ diff --git a/pic/ctgen.PNG b/pic/ctgen.PNG deleted file mode 100644 index 80abb9b..0000000 Binary files a/pic/ctgen.PNG and /dev/null differ diff --git a/pic/inline.png b/pic/inline.png deleted file mode 100644 index b36f34a..0000000 Binary files a/pic/inline.png and /dev/null differ diff --git a/pic/intel.png b/pic/intel.png deleted file mode 100644 index 2830875..0000000 Binary files a/pic/intel.png and /dev/null differ diff --git a/pic/mips64.png b/pic/mips64.png deleted file mode 100644 index 6684f86..0000000 Binary files a/pic/mips64.png and /dev/null differ diff --git a/pic/mm.png b/pic/mm.png deleted file mode 100644 index b0a9218..0000000 Binary files a/pic/mm.png and /dev/null differ diff --git a/pic/pltgot.png b/pic/pltgot.png deleted file mode 100644 index 53ba3f6..0000000 Binary files a/pic/pltgot.png and /dev/null differ diff --git a/pic/riscv.png b/pic/riscv.png deleted file mode 100644 index 1c3fcde..0000000 Binary files a/pic/riscv.png and /dev/null differ diff --git a/pic/se.png b/pic/se.png deleted file mode 100644 index 0bce66d..0000000 Binary files a/pic/se.png and /dev/null differ diff --git a/test/Makefile.linux32.clang b/test/Makefile.linux32.clang deleted file mode 100644 index 70d3c5e..0000000 --- a/test/Makefile.linux32.clang +++ /dev/null @@ -1,19 +0,0 @@ -#sudo apt-get install clang -#sudo update-alternatives --config clang -SOURCE = $(filter-out %win.cpp, $(wildcard *.cpp)) -SOURCE := $(filter-out test_virtual_function_linux.cpp test_virtual_overload_function_linux.cpp, $(SOURCE)) -TARGETS = $(patsubst %.cpp, %, $(SOURCE)) -INC=-I../src -I../src_linux -LIB=-lm -CC = clang++ -#CFLAGS =-std=c++11 -m32 -g -no-pie -fno-stack-protector -Wall -Wno-unused-function -Wno-unused-variable -Wno-unused-private-field -CFLAGS =-std=c++11 -g -no-pie -fno-stack-protector -Wall -Wno-unused-function -Wno-unused-variable -Wno-unused-private-field - -all:clean $(TARGETS) - -$(TARGETS):%:%.cpp - $(CC) $< $(CFLAGS) $(INC) ${LIB} -o $@ - -.PHONY:clean all -clean: - -rm -rf $(TARGETS) diff --git a/test/Makefile.linux32.gcc b/test/Makefile.linux32.gcc deleted file mode 100644 index 8753523..0000000 --- a/test/Makefile.linux32.gcc +++ /dev/null @@ -1,17 +0,0 @@ -#apt-get install gcc-multilib g++-multilib -SOURCE = $(filter-out %win.cpp, $(wildcard *.cpp)) -TARGETS = $(patsubst %.cpp, %, $(SOURCE)) -INC=-I../src -I../src_linux -LIB=-lm -CC = g++ -#CFLAGS =-std=c++11 -m32 -g -no-pie -fno-stack-protector -Wall -Wno-unused-function -Wno-unused-variable -Wno-pmf-conversions -CFLAGS =-std=c++11 -g -no-pie -fno-stack-protector -Wall -Wno-unused-function -Wno-unused-variable -Wno-pmf-conversions - -all:clean $(TARGETS) - -$(TARGETS):%:%.cpp - $(CC) $< $(CFLAGS) $(INC) ${LIB} -o $@ - -.PHONY:clean all -clean: - -rm -rf $(TARGETS) diff --git a/test/Makefile.linux64.clang b/test/Makefile.linux64.clang deleted file mode 100644 index 9f2206b..0000000 --- a/test/Makefile.linux64.clang +++ /dev/null @@ -1,19 +0,0 @@ -#sudo apt-get install clang -#sudo update-alternatives --config clang -SOURCE = $(filter-out %win.cpp, $(wildcard *.cpp)) -SOURCE := $(filter-out test_virtual_function_linux.cpp test_virtual_overload_function_linux.cpp, $(SOURCE)) -TARGETS = $(patsubst %.cpp, %, $(SOURCE)) -INC=-I../src -I../src_linux -LIB=-lm -CC = clang++ -#CFLAGS =-std=c++11 -m64 -g -no-pie -fno-stack-protector -Wall -Wno-unused-function -Wno-unused-variable -Wno-unused-private-field -CFLAGS =-std=c++11 -g -no-pie -fno-stack-protector -Wall -Wno-unused-function -Wno-unused-variable -Wno-unused-private-field - -all:clean $(TARGETS) - -$(TARGETS):%:%.cpp - $(CC) $< $(CFLAGS) $(INC) ${LIB} -o $@ - -.PHONY:clean all -clean: - -rm -rf $(TARGETS) diff --git a/test/Makefile.linux64.gcc b/test/Makefile.linux64.gcc deleted file mode 100644 index 361c65a..0000000 --- a/test/Makefile.linux64.gcc +++ /dev/null @@ -1,17 +0,0 @@ -#apt-get install gcc-multilib g++-multilib -SOURCE = $(filter-out %win.cpp, $(wildcard *.cpp)) -TARGETS = $(patsubst %.cpp, %, $(SOURCE)) -INC=-I../src -I../src_linux -LIB=-lm -CC = g++ -#CFLAGS =-std=c++11 -m64 -g -no-pie -fno-stack-protector -Wall -Wno-unused-function -Wno-unused-variable -Wno-pmf-conversions -CFLAGS =-std=c++11 -g -no-pie -fno-stack-protector -Wall -Wno-unused-function -Wno-unused-variable -Wno-pmf-conversions - -all:clean $(TARGETS) - -$(TARGETS):%:%.cpp - $(CC) $< $(CFLAGS) $(INC) ${LIB} -o $@ - -.PHONY:clean all -clean: - -rm -rf $(TARGETS) diff --git a/test/Makefile.win32 b/test/Makefile.win32 deleted file mode 100644 index 0b18b73..0000000 --- a/test/Makefile.win32 +++ /dev/null @@ -1,45 +0,0 @@ -# usage -# dos:\nmake -f Makefile.win32 (using -f to specify the Makefile) - -CC = cl.exe -LINK = link.exe -RM = del -# -CPPFLAGS = /nologo /D "WIN32" /Od /c /EHsc /Z7 /I..\src /I..\src_win -LDFLAGS = /nologo /DEBUG:FULL /MAP /INCREMENTAL:NO -INC = /I..\src /I..\src_win -# -SRCS_CXX = test_private_member_function_win.cpp\ - test_template_function_win.cpp\ - test_virtual_function_x86_win.cpp\ - test_overload_function_win.cpp\ - test_object_member_function_win.cpp\ - test_addr_any_win.cpp\ - test_function.cpp\ - test_functor_win.cpp\ - test_dynamic_library_win.cpp\ - test_variadic_function.cpp\ - test_class_member_function.cpp\ - test_constructor_function_x86_win.cpp\ - test_dtor_function_x86_win.cpp\ - test_addr_lambda_win.cpp -OBJS_CXX = $(SRCS_CXX:.cpp=.obj) -TARGET = $(SRCS_CXX:.cpp=) -TARGETEXE = $(SRCS_CXX:.cpp=.exe) -# -!MESSAGE begin.... -all: clean $(TARGET) - @echo "Done." -#compile -.cpp.obj:: - $(CC) $(INC) $(CPPFLAGS) $< -#link -$(TARGET): $(OBJS_CXX) - $(LINK) $@.obj $(LDFLAGS) /OUT:$@.exe - -clean: - @echo "Cleaning..." - $(RM) $(TARGETEXE) *.obj *.ilk *.pdb *.map - @echo "Done." - -.PHONY: clean all \ No newline at end of file diff --git a/test/Makefile.win64 b/test/Makefile.win64 deleted file mode 100644 index c0ea90e..0000000 --- a/test/Makefile.win64 +++ /dev/null @@ -1,42 +0,0 @@ -# usage -# dos:\nmake -f Makefile.win32 (using -f to specify the Makefile) - -CC = cl.exe -LINK = link.exe -RM = del -# -CPPFLAGS = /nologo /D "WIN32" /Od /c /EHsc /Z7 /I..\src /I..\src_win -LDFLAGS = /nologo /DEBUG:FULL /MAP /INCREMENTAL:NO -INC = /I..\src /I..\src_win -# -SRCS_CXX = test_private_member_function_win.cpp\ - test_template_function_win.cpp\ - test_overload_function_win.cpp\ - test_object_member_function_win.cpp\ - test_addr_any_win.cpp\ - test_function.cpp\ - test_functor_win.cpp\ - test_dynamic_library_win.cpp\ - test_variadic_function.cpp\ - test_constructor_function_x86_win.cpp\ - test_class_member_function.cpp -OBJS_CXX = $(SRCS_CXX:.cpp=.obj) -TARGET = $(SRCS_CXX:.cpp=) -TARGETEXE = $(SRCS_CXX:.cpp=.exe) -# -!MESSAGE begin.... -all: clean $(TARGET) - @echo "Done." -#compile -.cpp.obj:: - $(CC) $(INC) $(CPPFLAGS) $< -#link -$(TARGET): $(OBJS_CXX) - $(LINK) $@.obj $(LDFLAGS) /OUT:$@.exe - -clean: - @echo "Cleaning..." - $(RM) $(TARGETEXE) *.obj *.ilk *.pdb *.map - @echo "Done." - -.PHONY: clean all \ No newline at end of file diff --git a/test/README.md b/test/README.md deleted file mode 100644 index ca66f1f..0000000 --- a/test/README.md +++ /dev/null @@ -1,13 +0,0 @@ - -**Windows msvc use** -- nmake -f Makefile.win32 (x86 Native Tools Command Prompt for VS 2019) -- nmake -f Makefile.win64 (x64 Native Tools Command Prompt for VS 2019) - -**Linux gcc use** -- make -f Makefile.linux32.gcc -- make -f Makefile.linux64.gcc - -**Linux clang use** - -- make -f Makefile.linux32.clang -- make -f Makefile.linux64.clang diff --git a/test/test_addr_any_linux.cpp b/test/test_addr_any_linux.cpp deleted file mode 100644 index 31020b3..0000000 --- a/test/test_addr_any_linux.cpp +++ /dev/null @@ -1,73 +0,0 @@ -#include -#include -#include "stub.h" -#include "addr_any.h" - -// g++ -g test_addr_any.cpp -std=c++11 -I../src -I../src/elfio/elfio -o test_addr_any - -//This static function can be in another file or in another dynamic library, needed -g -O0 compile -static int foo() -{ - printf("I am foo\n"); - return 0; -} - - -int foo_stub() -{ - std::cout << "I am foo_stub" << std::endl; - return 0; -} - -int printf_stub(const char * format, ...) -{ - std::cout<< "I am printf_stub" << std::endl; - return 0; -} - -int main(int argc, char **argv) -{ - //Get application static function address - { - AddrAny any; - - std::map result; - any.get_local_func_addr_symtab("^foo()$", result); - - foo(); - Stub stub; - std::map::iterator it; - for (it=result.begin(); it!=result.end(); ++it) - { - stub.set(it->second ,foo_stub); - std::cout << it->first << " => " << it->second << std::endl; - } - foo(); - - } - //Get dynamic library static function address - { - //AddrAny any("libc-2.27.so");// cat /proc/pid/maps - AddrAny any("libc.so.6");// cat /proc/pid/maps - std::map result; -#ifdef __clang__ - any.get_global_func_addr_dynsym("^printf$", result); -#else - any.get_weak_func_addr_dynsym("^puts", result); -#endif - { - foo(); - Stub stub; - std::map::iterator it; - for (it=result.begin(); it!=result.end(); ++it) - { - stub.set(it->second ,printf_stub); - std::cout << it->first << " => " << it->second << std::endl; - } - foo(); - } - foo(); - } - return 0; -} - diff --git a/test/test_addr_any_win.cpp b/test/test_addr_any_win.cpp deleted file mode 100644 index be1dc90..0000000 --- a/test/test_addr_any_win.cpp +++ /dev/null @@ -1,69 +0,0 @@ -#include -#include -#include "stub.h" -#include "addr_any.h" - -using namespace std; - -static int foo() -{ - printf("I am foo\n"); - return 0; -} - -int foo_stub() -{ - std::cout << "I am foo_stub" << std::endl; - return 0; -} - -int printf_stub(const char * format, ...) -{ - std::cout<< "I am printf_stub" << std::endl; - return 0; -} - -int main(int argc, char **argv) -{ - - //Get application static function address - { - AddrAny any; - - std::map result; - any.get_func_addr("foo", result); - - foo(); - Stub stub; - std::map::iterator it; - for (it=result.begin(); it!=result.end(); ++it) - { - stub.set(it->second ,foo_stub); - std::cout << it->first << " => " << it->second << std::endl; - } - foo(); - - } - //Get dynamic library static function address - { - AddrAny any; - - std::map result; - any.get_func_addr("printf", result); - - - foo(); - Stub stub; - std::map::iterator it; - for (it=result.begin(); it!=result.end(); ++it) - { - stub.set(it->second ,printf_stub); - std::cout << it->first << " => " << it->second << std::endl; - } - foo(); - } - return 0; - -} - - diff --git a/test/test_addr_lambda_linux.cpp b/test/test_addr_lambda_linux.cpp deleted file mode 100644 index 770fa61..0000000 --- a/test/test_addr_lambda_linux.cpp +++ /dev/null @@ -1,50 +0,0 @@ -#include -#include -#include "stub.h" -#include "addr_any.h" - -// g++ -g test_addr_lambda_linux.cpp -std=c++11 -I../src -I../src/elfio/elfio -o test_addr_lambda_linux - -//This lambda function can be in another file or in another dynamic library, needed -g -O0 compile -static int foo() -{ - int temp = 2; - auto a = [temp](int a){std::cout << "foo lambda:" << a + temp << std::endl;}; - a(1); - std::cout << "I am foo" << std::endl; - return 0; -} - - -void foo_lambda_stub(void *obj, int a) -{ - //__closure={__temp = 2} - std::cout << "I am foo_lambda_stub:" << *(int*)obj + a << std::endl; - return; -} - - -int main(int argc, char **argv) -{ - //Get application static function address - { - AddrAny any; - - std::map result; - any.get_local_func_addr_symtab("^foo()::{lambda.*", result); - - foo(); - Stub stub; - std::map::iterator it; - for (it=result.begin(); it!=result.end(); ++it) - { - stub.set(it->second ,foo_lambda_stub); - std::cout << it->first << " => " << it->second << std::endl; - } - foo(); - - } - - return 0; -} - diff --git a/test/test_addr_lambda_win.cpp b/test/test_addr_lambda_win.cpp deleted file mode 100644 index bdbc61e..0000000 --- a/test/test_addr_lambda_win.cpp +++ /dev/null @@ -1,111 +0,0 @@ -#include -#include -#include "stub.h" -#include "addr_any.h" - -static int foo() -{ - int love = 3; - auto a = [love](int a){std::cout << "foo lambda:" << a + love << std::endl;}; - a(4); - std::cout << "I am foo" << std::endl; - return 0; -} - - -void foo_lambda_stub(int a, int love) -{ - //void (int a){love=0x00000003 } - std::cout << "I am foo_lambda_stub:" << love + a << std::endl; - return; -} - -#if 1 - -int main(int argc, char **argv) -{ - - //Get application static function address - { - AddrAny any; - - std::map result; - any.get_func_addr("::operator()", result); - - foo(); - Stub stub; - std::map::iterator it; - for (it=result.begin(); it!=result.end(); ++it) - { - stub.set(it->second ,foo_lambda_stub); - std::cout << it->first << " => " << it->second << std::endl; - } - foo(); - - } - return 0; -} -#endif -#if 0 - -#include -#include -#include - -BOOL CALLBACK EnumSymProc( - PSYMBOL_INFO pSymInfo, - ULONG SymbolSize, - PVOID UserContext) -{ - UNREFERENCED_PARAMETER(UserContext); - - printf("%llX %s\n", - pSymInfo->Address, pSymInfo->Name); - return TRUE; -} - -void main() -{ - HANDLE hProcess = GetCurrentProcess(); - DWORD64 BaseOfDll; - char* Mask = "::operator()"; - BOOL status; - foo(); - status = SymInitialize(hProcess, NULL, FALSE); - if (status == FALSE) - { - return; - } - - BaseOfDll = SymLoadModuleEx(hProcess, - NULL, - "test_addr_lambda_win.exe", - NULL, - 0, - 0, - NULL, - 0); - - if (BaseOfDll == 0) - { - SymCleanup(hProcess); - return; - } - - if (SymEnumSymbols(hProcess, // Process handle from SymInitialize. - BaseOfDll, // Base address of module. - Mask, // Name of symbols to match. - EnumSymProc, // Symbol handler procedure. - NULL)) // User context. - { - // SymEnumSymbols succeeded - } - else - { - // SymEnumSymbols failed - printf("SymEnumSymbols failed: %d\n", GetLastError()); - } - - SymCleanup(hProcess); -} -#endif \ No newline at end of file diff --git a/test/test_class_member_function.cpp b/test/test_class_member_function.cpp deleted file mode 100644 index d4564e8..0000000 --- a/test/test_class_member_function.cpp +++ /dev/null @@ -1,27 +0,0 @@ -#include -#include "stub.h" -using namespace std; -class A{ - int i; -public: - static int foo(int a){ - cout<<"I am A_foo"< -#include "stub.h" -using namespace std; - - -template -void * get_ctor_addr(bool start = true) -{ - //the start vairable must be true, or the compiler will optimize out. - if(start) goto Start; -Call_Constructor: - //This line of code will not be executed. - //The purpose of the code is to allow the compiler to generate the assembly code that calls the constructor. - T(); -Start: - //The address of the line of code T() obtained by assembly - char * p = (char*)&&Call_Constructor;//https://gcc.gnu.org/onlinedocs/gcc/Labels-as-Values.html - //CALL rel32 - void * ret = 0; - char pos; - char call = 0xe8; - do{ - pos = *p; - if(pos == call) - { - ret = p + 5 + (*(int*)(p+1)); - } - - }while(!ret&&(++p)); - - return ret; -} - - -class A { -public: - A(){cout << "I am A_constructor" << endl;} -}; - -class B { -public: - B(){cout << "I am B_constructor" << endl;} -}; - - -int main() -{ - Stub stub; - auto xa = get_ctor_addr(); - auto xb = get_ctor_addr(); - stub.set(xa, xb); - A aa; - return 0; -} diff --git a/test/test_constructor_function_x86_win.cpp b/test/test_constructor_function_x86_win.cpp deleted file mode 100644 index 6685f8f..0000000 --- a/test/test_constructor_function_x86_win.cpp +++ /dev/null @@ -1,80 +0,0 @@ -//for windows x86(32位) -#include -#include "stub.h" -using namespace std; - -template -char* addrof(T addr) -{ - union - { - T _s; - char* _d; - }ut; - ut._s = addr; - return ut._d; -} - - -template -void * get_ctor_addr() -{ - goto Start; -Call_Constructor: - //This line of code will not be executed. - //The purpose of the code is to allow the compiler to generate the assembly code that calls the constructor. - T(); -Start: - //The address of the line of code T() obtained by assembly - char * p = nullptr; -#if 0 - __asm { mov[p], offset Call_Constructor } - /* - __asm - { - MOV EAX, OFFSET Call_Constructor - MOV DWORD PTR[p], EAX - } - */ -#else - p = addrof(&get_ctor_addr); -#endif - //CALL rel32 - void * ret = 0; - char pos; - char call = 0xe8; - do{ - pos = *p; - if(pos == call) - { - ret = p + 5 + (*(int*)(p+1)); - } - - }while(!ret&&(++p)); - - return ret; -} - - -class A { -public: - A(){cout << "I am A_constructor" << endl;} -}; - -class B { -public: - B(){cout << "I am B_constructor" << endl;} -}; - - -int main() -{ - Stub stub; - auto xa = get_ctor_addr(); - auto xb = get_ctor_addr(); - stub.set(xa, xb); - A aa; - return 0; -} -//for windows x64(64位),VS编译器不支持内嵌汇编。可以把汇编代码独立成一个文件。 -//https://social.msdn.microsoft.com/Forums/vstudio/en-US/e8b13ec0-32f0-4dcd-a5a2-59fc29e824e5/true-address-of-virtual-member-function-not-thunk?forum=vclanguage \ No newline at end of file diff --git a/test/test_dtor_function_linux.cpp b/test/test_dtor_function_linux.cpp deleted file mode 100644 index 7e86d94..0000000 --- a/test/test_dtor_function_linux.cpp +++ /dev/null @@ -1,61 +0,0 @@ - -#include -#include "stub.h" -using namespace std; - - -template -void * get_dtor_addr(bool start = true) -{ - //the start vairable must be true, or the compiler will optimize out. - if(start) goto Start; - //This line of code will not be executed. - //The purpose of the code is to allow the compiler to generate the assembly code that calls the constructor. - { - T(); -Call_dtor: - ;; - } - -Start: - //The address of the line of code T() obtained by assembly - char * p = (char*)&&Call_dtor;//https://gcc.gnu.org/onlinedocs/gcc/Labels-as-Values.html - //CALL rel32 - void * ret = 0; - char pos; - char call = 0xe8; - do{ - pos = *p; - if(pos == call) - { - ret = p + 5 + (*(int*)(p+1)); - } - - }while(!ret&&(--p)); - - return ret; -} - - -class A { -public: - A(){cout << "I am A_constructor" << endl;} - ~A(){{cout << "I am A_dtor" << endl;}} -}; - -class B { -public: - B(){cout << "I am B_constructor" << endl;} - ~B(){cout << "I am B_dtor" << endl;} -}; - - -int main() -{ - Stub stub; - auto xa = get_dtor_addr(); - auto xb = get_dtor_addr(); - stub.set(xa, xb); - A aa; - return 0; -} diff --git a/test/test_dtor_function_x86_win.cpp b/test/test_dtor_function_x86_win.cpp deleted file mode 100644 index 527a3bd..0000000 --- a/test/test_dtor_function_x86_win.cpp +++ /dev/null @@ -1,61 +0,0 @@ -#include -#include "stub.h" -using namespace std; - -template -void * get_dtor_addr() -{ - //the start vairable must be true, or the compiler will optimize out. - goto Start; - //This line of code will not be executed. - //The purpose of the code is to allow the compiler to generate the assembly code that calls the constructor. - { - T(); -Call_dtor: - ;; - } - -Start: - //The address of the line of code T() obtained by assembly - char * p; - __asm { mov[p], offset Call_dtor } - - //CALL rel32 - void * ret = 0; - char pos; - char call = 0xe8; - do{ - pos = *p; - if(pos == call) - { - ret = p + 5 + (*(int*)(p+1)); - } - - }while(!ret&&(--p)); - - return ret; -} - - -class A { -public: - A(){cout << "I am A_constructor" << endl;} - ~A(){{cout << "I am A_dtor" << endl;}} -}; - -class B { -public: - B(){cout << "I am B_constructor" << endl;} - ~B(){cout << "I am B_dtor" << endl;} -}; - - -int main() -{ - Stub stub; - auto xa = get_dtor_addr(); - auto xb = get_dtor_addr(); - stub.set(xa, xb); - A aa; - return 0; -} diff --git a/test/test_dynamic_library_linux.cpp b/test/test_dynamic_library_linux.cpp deleted file mode 100644 index b2c89a2..0000000 --- a/test/test_dynamic_library_linux.cpp +++ /dev/null @@ -1,25 +0,0 @@ -#include -#include -#include "stub.h" -using namespace std; -int foo(int a) -{ - printf("I am foo\n"); - return 0; -} - -int printf_stub(const char * format, ...) -{ - cout<<"I am printf_stub"< -#include -#include "stub.h" -using namespace std; -int foo(int a) -{ - printf("I am foo\n"); - return 0; -} - -int printf_stub(const char * format, ...) -{ - cout<<"I am printf_stub"< -#include "stub.h" -using namespace std; -int foo(int a) -{ - cout<<"I am foo"< -#include "stub.h" -using namespace std; - - -class Foo -{ -public: - void operator() (int a) - { - cout<<"I am foo"< -#include "stub.h" -using namespace std; - - -class Foo -{ -public: - void operator() (int a) - { - cout<<"I am foo"< -#include "stub.h" -using namespace std; -class A{ - int i; -public: - int foo(int a){ - cout<<"I am A_foo"< -#include "stub.h" -using namespace std; -class A{ - int i; -public: - int foo(int a){ - cout<<"I am A_foo"< -#include "stub.h" -using namespace std; -class A{ - int i; -public: - int foo(int a){ - cout<<"I am A_foo_int"< -#include "stub.h" -using namespace std; -class A{ - int i; -public: - int foo(int a){ - cout<<"I am A_foo_int"< -#include "stub.h" -#include "addr_pri.h" -using namespace std; -class A{ - int a; - int foo(int x){ - cout<<"I am A_foo "<< a << endl; - return 0; - } - static int b; - static int bar(int x){ - cout<<"I am A_bar "<< b << endl; - return 0; - } -}; - - -ACCESS_PRIVATE_FIELD(A, int, a); -ACCESS_PRIVATE_FUN(A, int(int), foo); -ACCESS_PRIVATE_STATIC_FIELD(A, int, b); -ACCESS_PRIVATE_STATIC_FUN(A, int(int), bar); - -int foo_stub(void* obj, int x) -{ - A* o= (A*)obj; - cout<<"I am foo_stub"< -#include "stub.h" -#include "addr_pri.h" -using namespace std; -class A{ - int a; - int foo(int x){ - cout<<"I am A_foo "<< a << endl; - return 0; - } - static int b; - static int bar(int x){ - cout<<"I am A_bar "<< b << endl; - return 0; - } -}; - - -ACCESS_PRIVATE_FIELD(A, int, a); -ACCESS_PRIVATE_FUN(A, int(int), foo); -ACCESS_PRIVATE_STATIC_FIELD(A, int, b); -ACCESS_PRIVATE_STATIC_FUN(A, int(int), bar); -class B { -public: - int foo_stub(int x) - { - cout << "I am foo_stub" << endl; - return 0; - } -}; -int bar_stub(int x) -{ - cout<<"I am bar_stub"< -#include "stub.h" -using namespace std; -class A{ -public: - template - int foo(T a) - { - cout<<"I am A_foo"< -#include "stub.h" -using namespace std; -class A{ -public: - template - int foo(T a) - { - cout<<"I am A_foo"< -#include -#include "stub.h" - -/* -1. Build test_valgrind_discard_translation_linux without -D__VALGRIND__ by below command: - -g++ test_valgrind_discard_translation_linux.cpp -o test_valgrind_discard_translation_linux -std=c++11 -m32 -I../src -fno-pie -fno-stack-protector -Wall -Wno-unused-function -Wno-unused-variable -Wno-pmf-conversions - -then run the compiled elf with "valgrind ./test_valgrind_discard_translation_linux" and you -will see the output as below, you failed to set the stub to foo_stub2. -" -set stub function to 0x8048b86 -I am foo_stub1 -set stub function to 0x8048bb7 -I am foo_stub1 -" - -2. Build test_valgrind_discard_translation_linux with -D__VALGRIND__ by below command: - -g++ test_valgrind_discard_translation_linux.cpp -o test_valgrind_discard_translation_linux -std=c++11 -m32 -I../src -D__VALGRIND__ -fno-pie -fno-stack-protector -Wall -Wno-unused-function -Wno-unused-variable -Wno-pmf-conversions - -then run the compiled elf with "valgrind ./test_valgrind_discard_translation_linux" and you -will see the output as below, you succeeded to set the stub to foo_stub2. -" -set stub function to 0x8048c36 -I am foo_stub1 -set stub function to 0x8048c67 -I am foo_stub2 -" -*/ - - -static int foo() -{ - printf("I am foo\n"); - return 0; -} - -int foo_stub1() -{ - std::cout << "I am foo_stub1" << std::endl; - return 0; -} - -int foo_stub2() -{ - std::cout << "I am foo_stub2" << std::endl; - return 0; -} - -typedef int (*stub_f)(); - -Stub stub; - -void test(stub_f f) -{ - printf("set stub function to %p\n", f); - - stub.set(foo, f); - foo(); - stub.reset(foo); -} - -int main(int argc, char **argv) -{ - test(foo_stub1); - - test(foo_stub2); - - return 0; -} diff --git a/test/test_variadic_function.cpp b/test/test_variadic_function.cpp deleted file mode 100644 index 71cf6f7..0000000 --- a/test/test_variadic_function.cpp +++ /dev/null @@ -1,48 +0,0 @@ -#include -#include -#include "stub.h" -using namespace std; - -double average(int num, ...) -{ - - va_list valist; - double sum = 0.0; - int i; - - va_start(valist, num); - - for (i = 0; i < num; i++) - { - sum += va_arg(valist, int); - } - va_end(valist); - cout<<"I am foo"< -#include "stub.h" -using namespace std; -class A { -public: - virtual int foo(int a) { - cout << "I am A_foo" << endl; - return 0; - } -}; - -class B { -public: - int foo_stub(int a) - { - cout << "I am foo_stub" << endl; - return 0; - } -}; - - - -int main() -{ - unsigned long addr; - _asm {mov eax, A::foo} - _asm {mov addr, eax} - Stub stub; - stub.set(addr, ADDR(B, foo_stub)); - A a; - a.foo(1); - return 0; -} -//for windows x64(64位),VS编译器不支持内嵌汇编。可以把汇编代码独立成一个文件。 -//https://social.msdn.microsoft.com/Forums/vstudio/en-US/e8b13ec0-32f0-4dcd-a5a2-59fc29e824e5/true-address-of-virtual-member-function-not-thunk?forum=vclanguage \ No newline at end of file diff --git a/test/test_virtual_overload_function_linux.cpp b/test/test_virtual_overload_function_linux.cpp deleted file mode 100644 index b157353..0000000 --- a/test/test_virtual_overload_function_linux.cpp +++ /dev/null @@ -1,35 +0,0 @@ -//for linux gcc -#include -#include "stub.h" -using namespace std; -class A{ - int i; -public: - virtual int foo(int a){ - cout<<"I am A_foo"< -#include -#include -#include "stub.h" - -template -struct ThiefMember { - friend auto steal_impl(T&) { - return std::make_tuple(field...); - } -}; - -class Bank_t{ - int id; - std::string name; - - std::string money(){ - return "100$"; - } -public: - Bank_t(int i, std::string str) : id(i), name(str){} - void set_id(int i){id = i;} -}; - -auto steal_impl(Bank_t& t); -template struct ThiefMember; - - - -std::string money_stub(void *) -{ - return "10000$"; -} - -int main(void) { - Bank_t bank(1, "ok"); - auto tp = steal_impl(bank); - - auto& id = bank.*(std::get<0>(tp)); // 1 - auto name = bank.*(std::get<1>(tp)); //ok - - auto money = (bank.*(std::get<2>(tp)))(); // 100$ - std::cout << "id: " << id << std::endl; - std::cout << "name: " << name << std::endl; - std::cout << "money: " << money << std::endl; - bank.set_id(2); - std::cout << "id: " << id << std::endl; - Stub stub; - auto money_ptr = (void*)(bank.*(std::get<2>(tp))); - stub.set(money_ptr, money_stub); - auto money_stub = (bank.*(std::get<2>(tp)))(); // 10000$ - std::cout << "money_stub: " << money_stub << std::endl; - - return 0; -} diff --git a/ut_examples/catch2/README.md b/ut_examples/catch2/README.md deleted file mode 100644 index d32e532..0000000 --- a/ut_examples/catch2/README.md +++ /dev/null @@ -1,10 +0,0 @@ -# Sample catch2 test project - -This is a sample project using the Catch2 framework with -some examples of a few tests. - -The framework is well documented at: - * [Catch2](https://github.com/catchorg/Catch2/tree/master/docs) - - - diff --git a/ut_examples/catch2/src/Makefile b/ut_examples/catch2/src/Makefile deleted file mode 100644 index ae86cec..0000000 --- a/ut_examples/catch2/src/Makefile +++ /dev/null @@ -1,20 +0,0 @@ - -TARGET=test - -GCC = g++ -CFLAGS=--std=c++11 -m64 -g -Wall - -SOURCE=$(wildcard *.cpp) -OBJS = $(patsubst %.cpp, %.o, $(SOURCE)) -DEPS = $(patsubst %.o, %.d, $(OBJS)) - -INCLUDES=-I../include -LIBS =-lm - -$(TARGET): $(OBJS) - $(GCC) $(CFLAGS) $(OBJS) -L../lib $(LIBS) -o $@ -%.o: %.cpp - $(GCC) $(CFLAGS) $(INCLUDES) -c -MMD $< -o $@ --include $(DEPS) -clean: - rm $(OBJS) $(TARGET) diff --git a/ut_examples/catch2/src/main.cpp b/ut_examples/catch2/src/main.cpp deleted file mode 100644 index 769dae5..0000000 --- a/ut_examples/catch2/src/main.cpp +++ /dev/null @@ -1,10 +0,0 @@ -#include -#include "obj_operations.hpp" - - -int main(int argc, char *argv[]) -{ - Obj obj; - check_obj(obj); - return 0; -} diff --git a/ut_examples/catch2/src/obj.cpp b/ut_examples/catch2/src/obj.cpp deleted file mode 100644 index 0c7df07..0000000 --- a/ut_examples/catch2/src/obj.cpp +++ /dev/null @@ -1,19 +0,0 @@ -#include "obj.hpp" - - -Obj::Obj() -{ - m_i = 1; -} - - -bool Obj::is_valid(std::string str) -{ - return str.find("test") == 0; -} - - -int Obj::get_number() -{ - return m_i; -} diff --git a/ut_examples/catch2/src/obj.hpp b/ut_examples/catch2/src/obj.hpp deleted file mode 100644 index e502d2e..0000000 --- a/ut_examples/catch2/src/obj.hpp +++ /dev/null @@ -1,16 +0,0 @@ -#pragma once - -#include - - -class Obj -{ - public: - Obj(); - virtual bool is_valid(std::string str); - int get_number(); - private: - int m_i; -}; - - diff --git a/ut_examples/catch2/src/obj_operations.cpp b/ut_examples/catch2/src/obj_operations.cpp deleted file mode 100644 index 73baf97..0000000 --- a/ut_examples/catch2/src/obj_operations.cpp +++ /dev/null @@ -1,15 +0,0 @@ -#include -#include "obj_operations.hpp" - - -bool check_obj(Obj &obj) -{ - if (obj.is_valid("Kanotest")) - { - std::cout << "invalid" << std::endl; - return false; - } - - std::cout << obj.get_number() << std::endl; - return true; -} diff --git a/ut_examples/catch2/src/obj_operations.hpp b/ut_examples/catch2/src/obj_operations.hpp deleted file mode 100644 index 11cda4c..0000000 --- a/ut_examples/catch2/src/obj_operations.hpp +++ /dev/null @@ -1,6 +0,0 @@ -#pragma once - -#include "obj.hpp" - - -bool check_obj(Obj &obj); diff --git a/ut_examples/catch2/ut/include/catch.hpp b/ut_examples/catch2/ut/include/catch.hpp deleted file mode 100644 index 94e20c2..0000000 --- a/ut_examples/catch2/ut/include/catch.hpp +++ /dev/null @@ -1,17802 +0,0 @@ -/* - * Catch v2.13.1 - * Generated: 2020-09-07 12:12:38.090364 - * ---------------------------------------------------------- - * This file has been merged from multiple headers. Please don't edit it directly - * Copyright (c) 2020 Two Blue Cubes Ltd. All rights reserved. - * - * Distributed under the Boost Software License, Version 1.0. (See accompanying - * file LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt) - */ -#ifndef TWOBLUECUBES_SINGLE_INCLUDE_CATCH_HPP_INCLUDED -#define TWOBLUECUBES_SINGLE_INCLUDE_CATCH_HPP_INCLUDED -// start catch.hpp - - -#define CATCH_VERSION_MAJOR 2 -#define CATCH_VERSION_MINOR 13 -#define CATCH_VERSION_PATCH 1 - -#ifdef __clang__ -# pragma clang system_header -#elif defined __GNUC__ -# pragma GCC system_header -#endif - -// start catch_suppress_warnings.h - -#ifdef __clang__ -# ifdef __ICC // icpc defines the __clang__ macro -# pragma warning(push) -# pragma warning(disable: 161 1682) -# else // __ICC -# pragma clang diagnostic push -# pragma clang diagnostic ignored "-Wpadded" -# pragma clang diagnostic ignored "-Wswitch-enum" -# pragma clang diagnostic ignored "-Wcovered-switch-default" -# endif -#elif defined __GNUC__ - // Because REQUIREs trigger GCC's -Wparentheses, and because still - // supported version of g++ have only buggy support for _Pragmas, - // Wparentheses have to be suppressed globally. -# pragma GCC diagnostic ignored "-Wparentheses" // See #674 for details - -# pragma GCC diagnostic push -# pragma GCC diagnostic ignored "-Wunused-variable" -# pragma GCC diagnostic ignored "-Wpadded" -#endif -// end catch_suppress_warnings.h -#if defined(CATCH_CONFIG_MAIN) || defined(CATCH_CONFIG_RUNNER) -# define CATCH_IMPL -# define CATCH_CONFIG_ALL_PARTS -#endif - -// In the impl file, we want to have access to all parts of the headers -// Can also be used to sanely support PCHs -#if defined(CATCH_CONFIG_ALL_PARTS) -# define CATCH_CONFIG_EXTERNAL_INTERFACES -# if defined(CATCH_CONFIG_DISABLE_MATCHERS) -# undef CATCH_CONFIG_DISABLE_MATCHERS -# endif -# if !defined(CATCH_CONFIG_ENABLE_CHRONO_STRINGMAKER) -# define CATCH_CONFIG_ENABLE_CHRONO_STRINGMAKER -# endif -#endif - -#if !defined(CATCH_CONFIG_IMPL_ONLY) -// start catch_platform.h - -#ifdef __APPLE__ -# include -# if TARGET_OS_OSX == 1 -# define CATCH_PLATFORM_MAC -# elif TARGET_OS_IPHONE == 1 -# define CATCH_PLATFORM_IPHONE -# endif - -#elif defined(linux) || defined(__linux) || defined(__linux__) -# define CATCH_PLATFORM_LINUX - -#elif defined(WIN32) || defined(__WIN32__) || defined(_WIN32) || defined(_MSC_VER) || defined(__MINGW32__) -# define CATCH_PLATFORM_WINDOWS -#endif - -// end catch_platform.h - -#ifdef CATCH_IMPL -# ifndef CLARA_CONFIG_MAIN -# define CLARA_CONFIG_MAIN_NOT_DEFINED -# define CLARA_CONFIG_MAIN -# endif -#endif - -// start catch_user_interfaces.h - -namespace Catch { - unsigned int rngSeed(); -} - -// end catch_user_interfaces.h -// start catch_tag_alias_autoregistrar.h - -// start catch_common.h - -// start catch_compiler_capabilities.h - -// Detect a number of compiler features - by compiler -// The following features are defined: -// -// CATCH_CONFIG_COUNTER : is the __COUNTER__ macro supported? -// CATCH_CONFIG_WINDOWS_SEH : is Windows SEH supported? -// CATCH_CONFIG_POSIX_SIGNALS : are POSIX signals supported? -// CATCH_CONFIG_DISABLE_EXCEPTIONS : Are exceptions enabled? -// **************** -// Note to maintainers: if new toggles are added please document them -// in configuration.md, too -// **************** - -// In general each macro has a _NO_ form -// (e.g. CATCH_CONFIG_NO_POSIX_SIGNALS) which disables the feature. -// Many features, at point of detection, define an _INTERNAL_ macro, so they -// can be combined, en-mass, with the _NO_ forms later. - -#ifdef __cplusplus - -# if (__cplusplus >= 201402L) || (defined(_MSVC_LANG) && _MSVC_LANG >= 201402L) -# define CATCH_CPP14_OR_GREATER -# endif - -# if (__cplusplus >= 201703L) || (defined(_MSVC_LANG) && _MSVC_LANG >= 201703L) -# define CATCH_CPP17_OR_GREATER -# endif - -#endif - -#if defined(__cpp_lib_uncaught_exceptions) -# define CATCH_INTERNAL_CONFIG_CPP17_UNCAUGHT_EXCEPTIONS -#endif - -// We have to avoid both ICC and Clang, because they try to mask themselves -// as gcc, and we want only GCC in this block -#if defined(__GNUC__) && !defined(__clang__) && !defined(__ICC) -# define CATCH_INTERNAL_START_WARNINGS_SUPPRESSION _Pragma( "GCC diagnostic push" ) -# define CATCH_INTERNAL_STOP_WARNINGS_SUPPRESSION _Pragma( "GCC diagnostic pop" ) - -# define CATCH_INTERNAL_IGNORE_BUT_WARN(...) (void)__builtin_constant_p(__VA_ARGS__) - -#endif - -#if defined(__clang__) - -# define CATCH_INTERNAL_START_WARNINGS_SUPPRESSION _Pragma( "clang diagnostic push" ) -# define CATCH_INTERNAL_STOP_WARNINGS_SUPPRESSION _Pragma( "clang diagnostic pop" ) - -// As of this writing, IBM XL's implementation of __builtin_constant_p has a bug -// which results in calls to destructors being emitted for each temporary, -// without a matching initialization. In practice, this can result in something -// like `std::string::~string` being called on an uninitialized value. -// -// For example, this code will likely segfault under IBM XL: -// ``` -// REQUIRE(std::string("12") + "34" == "1234") -// ``` -// -// Therefore, `CATCH_INTERNAL_IGNORE_BUT_WARN` is not implemented. -# if !defined(__ibmxl__) -# define CATCH_INTERNAL_IGNORE_BUT_WARN(...) (void)__builtin_constant_p(__VA_ARGS__) /* NOLINT(cppcoreguidelines-pro-type-vararg, hicpp-vararg) */ -# endif - -# define CATCH_INTERNAL_SUPPRESS_GLOBALS_WARNINGS \ - _Pragma( "clang diagnostic ignored \"-Wexit-time-destructors\"" ) \ - _Pragma( "clang diagnostic ignored \"-Wglobal-constructors\"") - -# define CATCH_INTERNAL_SUPPRESS_PARENTHESES_WARNINGS \ - _Pragma( "clang diagnostic ignored \"-Wparentheses\"" ) - -# define CATCH_INTERNAL_SUPPRESS_UNUSED_WARNINGS \ - _Pragma( "clang diagnostic ignored \"-Wunused-variable\"" ) - -# define CATCH_INTERNAL_SUPPRESS_ZERO_VARIADIC_WARNINGS \ - _Pragma( "clang diagnostic ignored \"-Wgnu-zero-variadic-macro-arguments\"" ) - -# define CATCH_INTERNAL_SUPPRESS_UNUSED_TEMPLATE_WARNINGS \ - _Pragma( "clang diagnostic ignored \"-Wunused-template\"" ) - -#endif // __clang__ - -//////////////////////////////////////////////////////////////////////////////// -// Assume that non-Windows platforms support posix signals by default -#if !defined(CATCH_PLATFORM_WINDOWS) - #define CATCH_INTERNAL_CONFIG_POSIX_SIGNALS -#endif - -//////////////////////////////////////////////////////////////////////////////// -// We know some environments not to support full POSIX signals -#if defined(__CYGWIN__) || defined(__QNX__) || defined(__EMSCRIPTEN__) || defined(__DJGPP__) - #define CATCH_INTERNAL_CONFIG_NO_POSIX_SIGNALS -#endif - -#ifdef __OS400__ -# define CATCH_INTERNAL_CONFIG_NO_POSIX_SIGNALS -# define CATCH_CONFIG_COLOUR_NONE -#endif - -//////////////////////////////////////////////////////////////////////////////// -// Android somehow still does not support std::to_string -#if defined(__ANDROID__) -# define CATCH_INTERNAL_CONFIG_NO_CPP11_TO_STRING -# define CATCH_INTERNAL_CONFIG_ANDROID_LOGWRITE -#endif - -//////////////////////////////////////////////////////////////////////////////// -// Not all Windows environments support SEH properly -#if defined(__MINGW32__) -# define CATCH_INTERNAL_CONFIG_NO_WINDOWS_SEH -#endif - -//////////////////////////////////////////////////////////////////////////////// -// PS4 -#if defined(__ORBIS__) -# define CATCH_INTERNAL_CONFIG_NO_NEW_CAPTURE -#endif - -//////////////////////////////////////////////////////////////////////////////// -// Cygwin -#ifdef __CYGWIN__ - -// Required for some versions of Cygwin to declare gettimeofday -// see: http://stackoverflow.com/questions/36901803/gettimeofday-not-declared-in-this-scope-cygwin -# define _BSD_SOURCE -// some versions of cygwin (most) do not support std::to_string. Use the libstd check. -// https://gcc.gnu.org/onlinedocs/gcc-4.8.2/libstdc++/api/a01053_source.html line 2812-2813 -# if !((__cplusplus >= 201103L) && defined(_GLIBCXX_USE_C99) \ - && !defined(_GLIBCXX_HAVE_BROKEN_VSWPRINTF)) - -# define CATCH_INTERNAL_CONFIG_NO_CPP11_TO_STRING - -# endif -#endif // __CYGWIN__ - -//////////////////////////////////////////////////////////////////////////////// -// Visual C++ -#if defined(_MSC_VER) - -# define CATCH_INTERNAL_START_WARNINGS_SUPPRESSION __pragma( warning(push) ) -# define CATCH_INTERNAL_STOP_WARNINGS_SUPPRESSION __pragma( warning(pop) ) - -# if _MSC_VER >= 1900 // Visual Studio 2015 or newer -# define CATCH_INTERNAL_CONFIG_CPP17_UNCAUGHT_EXCEPTIONS -# endif - -// Universal Windows platform does not support SEH -// Or console colours (or console at all...) -# if defined(WINAPI_FAMILY) && (WINAPI_FAMILY == WINAPI_FAMILY_APP) -# define CATCH_CONFIG_COLOUR_NONE -# else -# define CATCH_INTERNAL_CONFIG_WINDOWS_SEH -# endif - -// MSVC traditional preprocessor needs some workaround for __VA_ARGS__ -// _MSVC_TRADITIONAL == 0 means new conformant preprocessor -// _MSVC_TRADITIONAL == 1 means old traditional non-conformant preprocessor -# if !defined(__clang__) // Handle Clang masquerading for msvc -# if !defined(_MSVC_TRADITIONAL) || (defined(_MSVC_TRADITIONAL) && _MSVC_TRADITIONAL) -# define CATCH_INTERNAL_CONFIG_TRADITIONAL_MSVC_PREPROCESSOR -# endif // MSVC_TRADITIONAL -# endif // __clang__ - -#endif // _MSC_VER - -#if defined(_REENTRANT) || defined(_MSC_VER) -// Enable async processing, as -pthread is specified or no additional linking is required -# define CATCH_INTERNAL_CONFIG_USE_ASYNC -#endif // _MSC_VER - -//////////////////////////////////////////////////////////////////////////////// -// Check if we are compiled with -fno-exceptions or equivalent -#if defined(__EXCEPTIONS) || defined(__cpp_exceptions) || defined(_CPPUNWIND) -# define CATCH_INTERNAL_CONFIG_EXCEPTIONS_ENABLED -#endif - -//////////////////////////////////////////////////////////////////////////////// -// DJGPP -#ifdef __DJGPP__ -# define CATCH_INTERNAL_CONFIG_NO_WCHAR -#endif // __DJGPP__ - -//////////////////////////////////////////////////////////////////////////////// -// Embarcadero C++Build -#if defined(__BORLANDC__) - #define CATCH_INTERNAL_CONFIG_POLYFILL_ISNAN -#endif - -//////////////////////////////////////////////////////////////////////////////// - -// Use of __COUNTER__ is suppressed during code analysis in -// CLion/AppCode 2017.2.x and former, because __COUNTER__ is not properly -// handled by it. -// Otherwise all supported compilers support COUNTER macro, -// but user still might want to turn it off -#if ( !defined(__JETBRAINS_IDE__) || __JETBRAINS_IDE__ >= 20170300L ) - #define CATCH_INTERNAL_CONFIG_COUNTER -#endif - -//////////////////////////////////////////////////////////////////////////////// - -// RTX is a special version of Windows that is real time. -// This means that it is detected as Windows, but does not provide -// the same set of capabilities as real Windows does. -#if defined(UNDER_RTSS) || defined(RTX64_BUILD) - #define CATCH_INTERNAL_CONFIG_NO_WINDOWS_SEH - #define CATCH_INTERNAL_CONFIG_NO_ASYNC - #define CATCH_CONFIG_COLOUR_NONE -#endif - -#if !defined(_GLIBCXX_USE_C99_MATH_TR1) -#define CATCH_INTERNAL_CONFIG_GLOBAL_NEXTAFTER -#endif - -// Various stdlib support checks that require __has_include -#if defined(__has_include) - // Check if string_view is available and usable - #if __has_include() && defined(CATCH_CPP17_OR_GREATER) - # define CATCH_INTERNAL_CONFIG_CPP17_STRING_VIEW - #endif - - // Check if optional is available and usable - # if __has_include() && defined(CATCH_CPP17_OR_GREATER) - # define CATCH_INTERNAL_CONFIG_CPP17_OPTIONAL - # endif // __has_include() && defined(CATCH_CPP17_OR_GREATER) - - // Check if byte is available and usable - # if __has_include() && defined(CATCH_CPP17_OR_GREATER) - # include - # if __cpp_lib_byte > 0 - # define CATCH_INTERNAL_CONFIG_CPP17_BYTE - # endif - # endif // __has_include() && defined(CATCH_CPP17_OR_GREATER) - - // Check if variant is available and usable - # if __has_include() && defined(CATCH_CPP17_OR_GREATER) - # if defined(__clang__) && (__clang_major__ < 8) - // work around clang bug with libstdc++ https://bugs.llvm.org/show_bug.cgi?id=31852 - // fix should be in clang 8, workaround in libstdc++ 8.2 - # include - # if defined(__GLIBCXX__) && defined(_GLIBCXX_RELEASE) && (_GLIBCXX_RELEASE < 9) - # define CATCH_CONFIG_NO_CPP17_VARIANT - # else - # define CATCH_INTERNAL_CONFIG_CPP17_VARIANT - # endif // defined(__GLIBCXX__) && defined(_GLIBCXX_RELEASE) && (_GLIBCXX_RELEASE < 9) - # else - # define CATCH_INTERNAL_CONFIG_CPP17_VARIANT - # endif // defined(__clang__) && (__clang_major__ < 8) - # endif // __has_include() && defined(CATCH_CPP17_OR_GREATER) -#endif // defined(__has_include) - -#if defined(CATCH_INTERNAL_CONFIG_COUNTER) && !defined(CATCH_CONFIG_NO_COUNTER) && !defined(CATCH_CONFIG_COUNTER) -# define CATCH_CONFIG_COUNTER -#endif -#if defined(CATCH_INTERNAL_CONFIG_WINDOWS_SEH) && !defined(CATCH_CONFIG_NO_WINDOWS_SEH) && !defined(CATCH_CONFIG_WINDOWS_SEH) && !defined(CATCH_INTERNAL_CONFIG_NO_WINDOWS_SEH) -# define CATCH_CONFIG_WINDOWS_SEH -#endif -// This is set by default, because we assume that unix compilers are posix-signal-compatible by default. -#if defined(CATCH_INTERNAL_CONFIG_POSIX_SIGNALS) && !defined(CATCH_INTERNAL_CONFIG_NO_POSIX_SIGNALS) && !defined(CATCH_CONFIG_NO_POSIX_SIGNALS) && !defined(CATCH_CONFIG_POSIX_SIGNALS) -# define CATCH_CONFIG_POSIX_SIGNALS -#endif -// This is set by default, because we assume that compilers with no wchar_t support are just rare exceptions. -#if !defined(CATCH_INTERNAL_CONFIG_NO_WCHAR) && !defined(CATCH_CONFIG_NO_WCHAR) && !defined(CATCH_CONFIG_WCHAR) -# define CATCH_CONFIG_WCHAR -#endif - -#if !defined(CATCH_INTERNAL_CONFIG_NO_CPP11_TO_STRING) && !defined(CATCH_CONFIG_NO_CPP11_TO_STRING) && !defined(CATCH_CONFIG_CPP11_TO_STRING) -# define CATCH_CONFIG_CPP11_TO_STRING -#endif - -#if defined(CATCH_INTERNAL_CONFIG_CPP17_OPTIONAL) && !defined(CATCH_CONFIG_NO_CPP17_OPTIONAL) && !defined(CATCH_CONFIG_CPP17_OPTIONAL) -# define CATCH_CONFIG_CPP17_OPTIONAL -#endif - -#if defined(CATCH_INTERNAL_CONFIG_CPP17_UNCAUGHT_EXCEPTIONS) && !defined(CATCH_CONFIG_NO_CPP17_UNCAUGHT_EXCEPTIONS) && !defined(CATCH_CONFIG_CPP17_UNCAUGHT_EXCEPTIONS) -# define CATCH_CONFIG_CPP17_UNCAUGHT_EXCEPTIONS -#endif - -#if defined(CATCH_INTERNAL_CONFIG_CPP17_STRING_VIEW) && !defined(CATCH_CONFIG_NO_CPP17_STRING_VIEW) && !defined(CATCH_CONFIG_CPP17_STRING_VIEW) -# define CATCH_CONFIG_CPP17_STRING_VIEW -#endif - -#if defined(CATCH_INTERNAL_CONFIG_CPP17_VARIANT) && !defined(CATCH_CONFIG_NO_CPP17_VARIANT) && !defined(CATCH_CONFIG_CPP17_VARIANT) -# define CATCH_CONFIG_CPP17_VARIANT -#endif - -#if defined(CATCH_INTERNAL_CONFIG_CPP17_BYTE) && !defined(CATCH_CONFIG_NO_CPP17_BYTE) && !defined(CATCH_CONFIG_CPP17_BYTE) -# define CATCH_CONFIG_CPP17_BYTE -#endif - -#if defined(CATCH_CONFIG_EXPERIMENTAL_REDIRECT) -# define CATCH_INTERNAL_CONFIG_NEW_CAPTURE -#endif - -#if defined(CATCH_INTERNAL_CONFIG_NEW_CAPTURE) && !defined(CATCH_INTERNAL_CONFIG_NO_NEW_CAPTURE) && !defined(CATCH_CONFIG_NO_NEW_CAPTURE) && !defined(CATCH_CONFIG_NEW_CAPTURE) -# define CATCH_CONFIG_NEW_CAPTURE -#endif - -#if !defined(CATCH_INTERNAL_CONFIG_EXCEPTIONS_ENABLED) && !defined(CATCH_CONFIG_DISABLE_EXCEPTIONS) -# define CATCH_CONFIG_DISABLE_EXCEPTIONS -#endif - -#if defined(CATCH_INTERNAL_CONFIG_POLYFILL_ISNAN) && !defined(CATCH_CONFIG_NO_POLYFILL_ISNAN) && !defined(CATCH_CONFIG_POLYFILL_ISNAN) -# define CATCH_CONFIG_POLYFILL_ISNAN -#endif - -#if defined(CATCH_INTERNAL_CONFIG_USE_ASYNC) && !defined(CATCH_INTERNAL_CONFIG_NO_ASYNC) && !defined(CATCH_CONFIG_NO_USE_ASYNC) && !defined(CATCH_CONFIG_USE_ASYNC) -# define CATCH_CONFIG_USE_ASYNC -#endif - -#if defined(CATCH_INTERNAL_CONFIG_ANDROID_LOGWRITE) && !defined(CATCH_CONFIG_NO_ANDROID_LOGWRITE) && !defined(CATCH_CONFIG_ANDROID_LOGWRITE) -# define CATCH_CONFIG_ANDROID_LOGWRITE -#endif - -#if defined(CATCH_INTERNAL_CONFIG_GLOBAL_NEXTAFTER) && !defined(CATCH_CONFIG_NO_GLOBAL_NEXTAFTER) && !defined(CATCH_CONFIG_GLOBAL_NEXTAFTER) -# define CATCH_CONFIG_GLOBAL_NEXTAFTER -#endif - -// Even if we do not think the compiler has that warning, we still have -// to provide a macro that can be used by the code. -#if !defined(CATCH_INTERNAL_START_WARNINGS_SUPPRESSION) -# define CATCH_INTERNAL_START_WARNINGS_SUPPRESSION -#endif -#if !defined(CATCH_INTERNAL_STOP_WARNINGS_SUPPRESSION) -# define CATCH_INTERNAL_STOP_WARNINGS_SUPPRESSION -#endif -#if !defined(CATCH_INTERNAL_SUPPRESS_PARENTHESES_WARNINGS) -# define CATCH_INTERNAL_SUPPRESS_PARENTHESES_WARNINGS -#endif -#if !defined(CATCH_INTERNAL_SUPPRESS_GLOBALS_WARNINGS) -# define CATCH_INTERNAL_SUPPRESS_GLOBALS_WARNINGS -#endif -#if !defined(CATCH_INTERNAL_SUPPRESS_UNUSED_WARNINGS) -# define CATCH_INTERNAL_SUPPRESS_UNUSED_WARNINGS -#endif -#if !defined(CATCH_INTERNAL_SUPPRESS_ZERO_VARIADIC_WARNINGS) -# define CATCH_INTERNAL_SUPPRESS_ZERO_VARIADIC_WARNINGS -#endif - -// The goal of this macro is to avoid evaluation of the arguments, but -// still have the compiler warn on problems inside... -#if !defined(CATCH_INTERNAL_IGNORE_BUT_WARN) -# define CATCH_INTERNAL_IGNORE_BUT_WARN(...) -#endif - -#if defined(__APPLE__) && defined(__apple_build_version__) && (__clang_major__ < 10) -# undef CATCH_INTERNAL_SUPPRESS_UNUSED_TEMPLATE_WARNINGS -#elif defined(__clang__) && (__clang_major__ < 5) -# undef CATCH_INTERNAL_SUPPRESS_UNUSED_TEMPLATE_WARNINGS -#endif - -#if !defined(CATCH_INTERNAL_SUPPRESS_UNUSED_TEMPLATE_WARNINGS) -# define CATCH_INTERNAL_SUPPRESS_UNUSED_TEMPLATE_WARNINGS -#endif - -#if defined(CATCH_CONFIG_DISABLE_EXCEPTIONS) -#define CATCH_TRY if ((true)) -#define CATCH_CATCH_ALL if ((false)) -#define CATCH_CATCH_ANON(type) if ((false)) -#else -#define CATCH_TRY try -#define CATCH_CATCH_ALL catch (...) -#define CATCH_CATCH_ANON(type) catch (type) -#endif - -#if defined(CATCH_INTERNAL_CONFIG_TRADITIONAL_MSVC_PREPROCESSOR) && !defined(CATCH_CONFIG_NO_TRADITIONAL_MSVC_PREPROCESSOR) && !defined(CATCH_CONFIG_TRADITIONAL_MSVC_PREPROCESSOR) -#define CATCH_CONFIG_TRADITIONAL_MSVC_PREPROCESSOR -#endif - -// end catch_compiler_capabilities.h -#define INTERNAL_CATCH_UNIQUE_NAME_LINE2( name, line ) name##line -#define INTERNAL_CATCH_UNIQUE_NAME_LINE( name, line ) INTERNAL_CATCH_UNIQUE_NAME_LINE2( name, line ) -#ifdef CATCH_CONFIG_COUNTER -# define INTERNAL_CATCH_UNIQUE_NAME( name ) INTERNAL_CATCH_UNIQUE_NAME_LINE( name, __COUNTER__ ) -#else -# define INTERNAL_CATCH_UNIQUE_NAME( name ) INTERNAL_CATCH_UNIQUE_NAME_LINE( name, __LINE__ ) -#endif - -#include -#include -#include - -// We need a dummy global operator<< so we can bring it into Catch namespace later -struct Catch_global_namespace_dummy {}; -std::ostream& operator<<(std::ostream&, Catch_global_namespace_dummy); - -namespace Catch { - - struct CaseSensitive { enum Choice { - Yes, - No - }; }; - - class NonCopyable { - NonCopyable( NonCopyable const& ) = delete; - NonCopyable( NonCopyable && ) = delete; - NonCopyable& operator = ( NonCopyable const& ) = delete; - NonCopyable& operator = ( NonCopyable && ) = delete; - - protected: - NonCopyable(); - virtual ~NonCopyable(); - }; - - struct SourceLineInfo { - - SourceLineInfo() = delete; - SourceLineInfo( char const* _file, std::size_t _line ) noexcept - : file( _file ), - line( _line ) - {} - - SourceLineInfo( SourceLineInfo const& other ) = default; - SourceLineInfo& operator = ( SourceLineInfo const& ) = default; - SourceLineInfo( SourceLineInfo&& ) noexcept = default; - SourceLineInfo& operator = ( SourceLineInfo&& ) noexcept = default; - - bool empty() const noexcept { return file[0] == '\0'; } - bool operator == ( SourceLineInfo const& other ) const noexcept; - bool operator < ( SourceLineInfo const& other ) const noexcept; - - char const* file; - std::size_t line; - }; - - std::ostream& operator << ( std::ostream& os, SourceLineInfo const& info ); - - // Bring in operator<< from global namespace into Catch namespace - // This is necessary because the overload of operator<< above makes - // lookup stop at namespace Catch - using ::operator<<; - - // Use this in variadic streaming macros to allow - // >> +StreamEndStop - // as well as - // >> stuff +StreamEndStop - struct StreamEndStop { - std::string operator+() const; - }; - template - T const& operator + ( T const& value, StreamEndStop ) { - return value; - } -} - -#define CATCH_INTERNAL_LINEINFO \ - ::Catch::SourceLineInfo( __FILE__, static_cast( __LINE__ ) ) - -// end catch_common.h -namespace Catch { - - struct RegistrarForTagAliases { - RegistrarForTagAliases( char const* alias, char const* tag, SourceLineInfo const& lineInfo ); - }; - -} // end namespace Catch - -#define CATCH_REGISTER_TAG_ALIAS( alias, spec ) \ - CATCH_INTERNAL_START_WARNINGS_SUPPRESSION \ - CATCH_INTERNAL_SUPPRESS_GLOBALS_WARNINGS \ - namespace{ Catch::RegistrarForTagAliases INTERNAL_CATCH_UNIQUE_NAME( AutoRegisterTagAlias )( alias, spec, CATCH_INTERNAL_LINEINFO ); } \ - CATCH_INTERNAL_STOP_WARNINGS_SUPPRESSION - -// end catch_tag_alias_autoregistrar.h -// start catch_test_registry.h - -// start catch_interfaces_testcase.h - -#include - -namespace Catch { - - class TestSpec; - - struct ITestInvoker { - virtual void invoke () const = 0; - virtual ~ITestInvoker(); - }; - - class TestCase; - struct IConfig; - - struct ITestCaseRegistry { - virtual ~ITestCaseRegistry(); - virtual std::vector const& getAllTests() const = 0; - virtual std::vector const& getAllTestsSorted( IConfig const& config ) const = 0; - }; - - bool isThrowSafe( TestCase const& testCase, IConfig const& config ); - bool matchTest( TestCase const& testCase, TestSpec const& testSpec, IConfig const& config ); - std::vector filterTests( std::vector const& testCases, TestSpec const& testSpec, IConfig const& config ); - std::vector const& getAllTestCasesSorted( IConfig const& config ); - -} - -// end catch_interfaces_testcase.h -// start catch_stringref.h - -#include -#include -#include -#include - -namespace Catch { - - /// A non-owning string class (similar to the forthcoming std::string_view) - /// Note that, because a StringRef may be a substring of another string, - /// it may not be null terminated. - class StringRef { - public: - using size_type = std::size_t; - using const_iterator = const char*; - - private: - static constexpr char const* const s_empty = ""; - - char const* m_start = s_empty; - size_type m_size = 0; - - public: // construction - constexpr StringRef() noexcept = default; - - StringRef( char const* rawChars ) noexcept; - - constexpr StringRef( char const* rawChars, size_type size ) noexcept - : m_start( rawChars ), - m_size( size ) - {} - - StringRef( std::string const& stdString ) noexcept - : m_start( stdString.c_str() ), - m_size( stdString.size() ) - {} - - explicit operator std::string() const { - return std::string(m_start, m_size); - } - - public: // operators - auto operator == ( StringRef const& other ) const noexcept -> bool; - auto operator != (StringRef const& other) const noexcept -> bool { - return !(*this == other); - } - - auto operator[] ( size_type index ) const noexcept -> char { - assert(index < m_size); - return m_start[index]; - } - - public: // named queries - constexpr auto empty() const noexcept -> bool { - return m_size == 0; - } - constexpr auto size() const noexcept -> size_type { - return m_size; - } - - // Returns the current start pointer. If the StringRef is not - // null-terminated, throws std::domain_exception - auto c_str() const -> char const*; - - public: // substrings and searches - // Returns a substring of [start, start + length). - // If start + length > size(), then the substring is [start, size()). - // If start > size(), then the substring is empty. - auto substr( size_type start, size_type length ) const noexcept -> StringRef; - - // Returns the current start pointer. May not be null-terminated. - auto data() const noexcept -> char const*; - - constexpr auto isNullTerminated() const noexcept -> bool { - return m_start[m_size] == '\0'; - } - - public: // iterators - constexpr const_iterator begin() const { return m_start; } - constexpr const_iterator end() const { return m_start + m_size; } - }; - - auto operator += ( std::string& lhs, StringRef const& sr ) -> std::string&; - auto operator << ( std::ostream& os, StringRef const& sr ) -> std::ostream&; - - constexpr auto operator "" _sr( char const* rawChars, std::size_t size ) noexcept -> StringRef { - return StringRef( rawChars, size ); - } -} // namespace Catch - -constexpr auto operator "" _catch_sr( char const* rawChars, std::size_t size ) noexcept -> Catch::StringRef { - return Catch::StringRef( rawChars, size ); -} - -// end catch_stringref.h -// start catch_preprocessor.hpp - - -#define CATCH_RECURSION_LEVEL0(...) __VA_ARGS__ -#define CATCH_RECURSION_LEVEL1(...) CATCH_RECURSION_LEVEL0(CATCH_RECURSION_LEVEL0(CATCH_RECURSION_LEVEL0(__VA_ARGS__))) -#define CATCH_RECURSION_LEVEL2(...) CATCH_RECURSION_LEVEL1(CATCH_RECURSION_LEVEL1(CATCH_RECURSION_LEVEL1(__VA_ARGS__))) -#define CATCH_RECURSION_LEVEL3(...) CATCH_RECURSION_LEVEL2(CATCH_RECURSION_LEVEL2(CATCH_RECURSION_LEVEL2(__VA_ARGS__))) -#define CATCH_RECURSION_LEVEL4(...) CATCH_RECURSION_LEVEL3(CATCH_RECURSION_LEVEL3(CATCH_RECURSION_LEVEL3(__VA_ARGS__))) -#define CATCH_RECURSION_LEVEL5(...) CATCH_RECURSION_LEVEL4(CATCH_RECURSION_LEVEL4(CATCH_RECURSION_LEVEL4(__VA_ARGS__))) - -#ifdef CATCH_CONFIG_TRADITIONAL_MSVC_PREPROCESSOR -#define INTERNAL_CATCH_EXPAND_VARGS(...) __VA_ARGS__ -// MSVC needs more evaluations -#define CATCH_RECURSION_LEVEL6(...) CATCH_RECURSION_LEVEL5(CATCH_RECURSION_LEVEL5(CATCH_RECURSION_LEVEL5(__VA_ARGS__))) -#define CATCH_RECURSE(...) CATCH_RECURSION_LEVEL6(CATCH_RECURSION_LEVEL6(__VA_ARGS__)) -#else -#define CATCH_RECURSE(...) CATCH_RECURSION_LEVEL5(__VA_ARGS__) -#endif - -#define CATCH_REC_END(...) -#define CATCH_REC_OUT - -#define CATCH_EMPTY() -#define CATCH_DEFER(id) id CATCH_EMPTY() - -#define CATCH_REC_GET_END2() 0, CATCH_REC_END -#define CATCH_REC_GET_END1(...) CATCH_REC_GET_END2 -#define CATCH_REC_GET_END(...) CATCH_REC_GET_END1 -#define CATCH_REC_NEXT0(test, next, ...) next CATCH_REC_OUT -#define CATCH_REC_NEXT1(test, next) CATCH_DEFER ( CATCH_REC_NEXT0 ) ( test, next, 0) -#define CATCH_REC_NEXT(test, next) CATCH_REC_NEXT1(CATCH_REC_GET_END test, next) - -#define CATCH_REC_LIST0(f, x, peek, ...) , f(x) CATCH_DEFER ( CATCH_REC_NEXT(peek, CATCH_REC_LIST1) ) ( f, peek, __VA_ARGS__ ) -#define CATCH_REC_LIST1(f, x, peek, ...) , f(x) CATCH_DEFER ( CATCH_REC_NEXT(peek, CATCH_REC_LIST0) ) ( f, peek, __VA_ARGS__ ) -#define CATCH_REC_LIST2(f, x, peek, ...) f(x) CATCH_DEFER ( CATCH_REC_NEXT(peek, CATCH_REC_LIST1) ) ( f, peek, __VA_ARGS__ ) - -#define CATCH_REC_LIST0_UD(f, userdata, x, peek, ...) , f(userdata, x) CATCH_DEFER ( CATCH_REC_NEXT(peek, CATCH_REC_LIST1_UD) ) ( f, userdata, peek, __VA_ARGS__ ) -#define CATCH_REC_LIST1_UD(f, userdata, x, peek, ...) , f(userdata, x) CATCH_DEFER ( CATCH_REC_NEXT(peek, CATCH_REC_LIST0_UD) ) ( f, userdata, peek, __VA_ARGS__ ) -#define CATCH_REC_LIST2_UD(f, userdata, x, peek, ...) f(userdata, x) CATCH_DEFER ( CATCH_REC_NEXT(peek, CATCH_REC_LIST1_UD) ) ( f, userdata, peek, __VA_ARGS__ ) - -// Applies the function macro `f` to each of the remaining parameters, inserts commas between the results, -// and passes userdata as the first parameter to each invocation, -// e.g. CATCH_REC_LIST_UD(f, x, a, b, c) evaluates to f(x, a), f(x, b), f(x, c) -#define CATCH_REC_LIST_UD(f, userdata, ...) CATCH_RECURSE(CATCH_REC_LIST2_UD(f, userdata, __VA_ARGS__, ()()(), ()()(), ()()(), 0)) - -#define CATCH_REC_LIST(f, ...) CATCH_RECURSE(CATCH_REC_LIST2(f, __VA_ARGS__, ()()(), ()()(), ()()(), 0)) - -#define INTERNAL_CATCH_EXPAND1(param) INTERNAL_CATCH_EXPAND2(param) -#define INTERNAL_CATCH_EXPAND2(...) INTERNAL_CATCH_NO## __VA_ARGS__ -#define INTERNAL_CATCH_DEF(...) INTERNAL_CATCH_DEF __VA_ARGS__ -#define INTERNAL_CATCH_NOINTERNAL_CATCH_DEF -#define INTERNAL_CATCH_STRINGIZE(...) INTERNAL_CATCH_STRINGIZE2(__VA_ARGS__) -#ifndef CATCH_CONFIG_TRADITIONAL_MSVC_PREPROCESSOR -#define INTERNAL_CATCH_STRINGIZE2(...) #__VA_ARGS__ -#define INTERNAL_CATCH_STRINGIZE_WITHOUT_PARENS(param) INTERNAL_CATCH_STRINGIZE(INTERNAL_CATCH_REMOVE_PARENS(param)) -#else -// MSVC is adding extra space and needs another indirection to expand INTERNAL_CATCH_NOINTERNAL_CATCH_DEF -#define INTERNAL_CATCH_STRINGIZE2(...) INTERNAL_CATCH_STRINGIZE3(__VA_ARGS__) -#define INTERNAL_CATCH_STRINGIZE3(...) #__VA_ARGS__ -#define INTERNAL_CATCH_STRINGIZE_WITHOUT_PARENS(param) (INTERNAL_CATCH_STRINGIZE(INTERNAL_CATCH_REMOVE_PARENS(param)) + 1) -#endif - -#define INTERNAL_CATCH_MAKE_NAMESPACE2(...) ns_##__VA_ARGS__ -#define INTERNAL_CATCH_MAKE_NAMESPACE(name) INTERNAL_CATCH_MAKE_NAMESPACE2(name) - -#define INTERNAL_CATCH_REMOVE_PARENS(...) INTERNAL_CATCH_EXPAND1(INTERNAL_CATCH_DEF __VA_ARGS__) - -#ifndef CATCH_CONFIG_TRADITIONAL_MSVC_PREPROCESSOR -#define INTERNAL_CATCH_MAKE_TYPE_LIST2(...) decltype(get_wrapper()) -#define INTERNAL_CATCH_MAKE_TYPE_LIST(...) INTERNAL_CATCH_MAKE_TYPE_LIST2(INTERNAL_CATCH_REMOVE_PARENS(__VA_ARGS__)) -#else -#define INTERNAL_CATCH_MAKE_TYPE_LIST2(...) INTERNAL_CATCH_EXPAND_VARGS(decltype(get_wrapper())) -#define INTERNAL_CATCH_MAKE_TYPE_LIST(...) INTERNAL_CATCH_EXPAND_VARGS(INTERNAL_CATCH_MAKE_TYPE_LIST2(INTERNAL_CATCH_REMOVE_PARENS(__VA_ARGS__))) -#endif - -#define INTERNAL_CATCH_MAKE_TYPE_LISTS_FROM_TYPES(...)\ - CATCH_REC_LIST(INTERNAL_CATCH_MAKE_TYPE_LIST,__VA_ARGS__) - -#define INTERNAL_CATCH_REMOVE_PARENS_1_ARG(_0) INTERNAL_CATCH_REMOVE_PARENS(_0) -#define INTERNAL_CATCH_REMOVE_PARENS_2_ARG(_0, _1) INTERNAL_CATCH_REMOVE_PARENS(_0), INTERNAL_CATCH_REMOVE_PARENS_1_ARG(_1) -#define INTERNAL_CATCH_REMOVE_PARENS_3_ARG(_0, _1, _2) INTERNAL_CATCH_REMOVE_PARENS(_0), INTERNAL_CATCH_REMOVE_PARENS_2_ARG(_1, _2) -#define INTERNAL_CATCH_REMOVE_PARENS_4_ARG(_0, _1, _2, _3) INTERNAL_CATCH_REMOVE_PARENS(_0), INTERNAL_CATCH_REMOVE_PARENS_3_ARG(_1, _2, _3) -#define INTERNAL_CATCH_REMOVE_PARENS_5_ARG(_0, _1, _2, _3, _4) INTERNAL_CATCH_REMOVE_PARENS(_0), INTERNAL_CATCH_REMOVE_PARENS_4_ARG(_1, _2, _3, _4) -#define INTERNAL_CATCH_REMOVE_PARENS_6_ARG(_0, _1, _2, _3, _4, _5) INTERNAL_CATCH_REMOVE_PARENS(_0), INTERNAL_CATCH_REMOVE_PARENS_5_ARG(_1, _2, _3, _4, _5) -#define INTERNAL_CATCH_REMOVE_PARENS_7_ARG(_0, _1, _2, _3, _4, _5, _6) INTERNAL_CATCH_REMOVE_PARENS(_0), INTERNAL_CATCH_REMOVE_PARENS_6_ARG(_1, _2, _3, _4, _5, _6) -#define INTERNAL_CATCH_REMOVE_PARENS_8_ARG(_0, _1, _2, _3, _4, _5, _6, _7) INTERNAL_CATCH_REMOVE_PARENS(_0), INTERNAL_CATCH_REMOVE_PARENS_7_ARG(_1, _2, _3, _4, _5, _6, _7) -#define INTERNAL_CATCH_REMOVE_PARENS_9_ARG(_0, _1, _2, _3, _4, _5, _6, _7, _8) INTERNAL_CATCH_REMOVE_PARENS(_0), INTERNAL_CATCH_REMOVE_PARENS_8_ARG(_1, _2, _3, _4, _5, _6, _7, _8) -#define INTERNAL_CATCH_REMOVE_PARENS_10_ARG(_0, _1, _2, _3, _4, _5, _6, _7, _8, _9) INTERNAL_CATCH_REMOVE_PARENS(_0), INTERNAL_CATCH_REMOVE_PARENS_9_ARG(_1, _2, _3, _4, _5, _6, _7, _8, _9) -#define INTERNAL_CATCH_REMOVE_PARENS_11_ARG(_0, _1, _2, _3, _4, _5, _6, _7, _8, _9, _10) INTERNAL_CATCH_REMOVE_PARENS(_0), INTERNAL_CATCH_REMOVE_PARENS_10_ARG(_1, _2, _3, _4, _5, _6, _7, _8, _9, _10) - -#define INTERNAL_CATCH_VA_NARGS_IMPL(_0, _1, _2, _3, _4, _5, _6, _7, _8, _9, _10, N, ...) N - -#define INTERNAL_CATCH_TYPE_GEN\ - template struct TypeList {};\ - template\ - constexpr auto get_wrapper() noexcept -> TypeList { return {}; }\ - template class...> struct TemplateTypeList{};\ - template class...Cs>\ - constexpr auto get_wrapper() noexcept -> TemplateTypeList { return {}; }\ - template\ - struct append;\ - template\ - struct rewrap;\ - template class, typename...>\ - struct create;\ - template class, typename>\ - struct convert;\ - \ - template \ - struct append { using type = T; };\ - template< template class L1, typename...E1, template class L2, typename...E2, typename...Rest>\ - struct append, L2, Rest...> { using type = typename append, Rest...>::type; };\ - template< template class L1, typename...E1, typename...Rest>\ - struct append, TypeList, Rest...> { using type = L1; };\ - \ - template< template class Container, template class List, typename...elems>\ - struct rewrap, List> { using type = TypeList>; };\ - template< template class Container, template class List, class...Elems, typename...Elements>\ - struct rewrap, List, Elements...> { using type = typename append>, typename rewrap, Elements...>::type>::type; };\ - \ - template