#ifndef C_TOXCORE_TOXCORE_TEST_UTIL_H #define C_TOXCORE_TOXCORE_TEST_UTIL_H #include #include #include #include #include #include #include template struct Function_Deleter { void operator()(T *ptr) const { Delete(ptr); } }; // No default deleter, because we want to catch when we forget to specialise this one. template struct Deleter; template using Ptr = std::unique_ptr>; template struct Method; template struct Method { template static R invoke(void *self, Args... args) { return (static_cast(self)->*M)(self, args...); } }; template std::array to_array(T const (&arr)[N]) { std::array stdarr; std::copy(arr, arr + N, stdarr.begin()); return stdarr; } template auto array_of(T &&make, Args... args) { std::array, N> arr; for (auto &elem : arr) { elem = make(args...); } return arr; } template auto vector_of(std::size_t n, T &&make, Args... args) { std::vector> vec; for (std::size_t i = 0; i < n; ++i) { vec.push_back(make(args...)); } return vec; } template Container sorted(Container arr, Less less) { std::sort(arr.begin(), arr.end(), less); return arr; } template T *require_not_null(const char *file, int line, T *ptr) { if (ptr == nullptr) { std::fprintf(stderr, "unexpected null pointer at %s:%d\n", file, line); std::exit(7); } return ptr; } #define REQUIRE_NOT_NULL(ptr) require_not_null(__FILE__, __LINE__, ptr) #endif // C_TOXCORE_TOXCORE_TEST_UTIL_H