Browse Source

update: framework of common code global test

master
Dnomd343 2 years ago
parent
commit
7a1f4a4590
  1. 14
      test/CMakeLists.txt
  2. 25
      test/global/common_code.cc
  3. 29
      test/global/global_utils.cc
  4. 27
      test/global/global_utils.h
  5. 37
      test/global/utils.cc
  6. 2
      third_party/tiny_thread_pool

14
test/CMakeLists.txt

@ -15,8 +15,8 @@ add_library(md5 STATIC ../third_party/md5/md5.cpp)
################################################################################
unset(CMAKE_ARCHIVE_OUTPUT_DIRECTORY)
include_directories(../third_party/tiny_thread_pool/src)
add_library(tiny_pool STATIC ../third_party/tiny_thread_pool/src/tiny_pool.c)
include_directories(../third_party/tiny_thread_pool)
add_library(tiny_pool STATIC ../third_party/tiny_thread_pool/tiny_pool.c)
################################################################################
@ -55,15 +55,13 @@ add_test(NAME ffi COMMAND test_ffi)
################################################################################
include_directories(../src/klotski_core)
add_library(test_global_utils STATIC global/global_utils.cc)
set(TEST_GLOBAL_DEPS ${TEST_DEPS} test_global_utils tiny_pool)
add_library(test_global_utils STATIC global/utils.cc)
include_directories(../src/klotski_core/common_code)
add_executable(test_global_common_code global/common_code.cc)
target_link_libraries(test_global_common_code test_global_utils tiny_pool)
target_link_libraries(test_global_common_code ${TEST_DEPS})
target_link_libraries(test_global_common_code ${TEST_GLOBAL_DEPS})
add_test(NAME global_common_code COMMAND test_global_common_code)
################################################################################

25
test/global/common_code.cc

@ -1,8 +1,29 @@
#include "klotski.h"
#include "gtest/gtest.h"
#include "common_code.h"
#include "global_utils.h"
using klotski::CommonCode;
std::vector<uint64_t> common_code_search(uint64_t start, uint64_t end) {
std::vector<uint64_t> ret;
for (uint64_t common_code = start; common_code < end; ++common_code) {
if (CommonCode::check(common_code)) {
ret.emplace_back(common_code); // valid common code
}
}
return ret;
}
TEST(GLOBAL, common_code) {
// std::cout << "demo ok" << std::endl;
// auto ranges = range_split(0, 100, 30);
// auto ranges = range_split(0, 91, 30);
// auto ranges = range_split(0, 89, 30);
auto ranges = range_split(0, 90, 30);
for (const auto &r : ranges) {
printf("[%lu, %lu)\n", r.first, r.second);
}
}

29
test/global/global_utils.cc

@ -0,0 +1,29 @@
#include "global_utils.h"
template <typename Func, typename ...Args>
auto TinyPool::submit(Func &&func, Args &&...args) -> std::future<decltype(func(args...))> {
std::function<decltype(func(args...))()> wrap_func = std::bind(
std::forward<Func>(func), std::forward<Args>(args)...
);
auto func_ptr = std::make_shared<
std::packaged_task<decltype(func(args...))()>
>(wrap_func);
tiny_pool_submit(pool, TinyPool::wrap_c_func, (void*)(
new std::function<void()> (
[func_ptr]() { (*func_ptr)(); }
)
));
return func_ptr->get_future();
}
range_split_t range_split(uint64_t start, uint64_t end, uint64_t size) {
uint64_t rear = end - (end - start) % size; // (rear - start) % size == 0
range_split_t ranges;
for (uint64_t i = start; i < rear; i += size) {
ranges.emplace_back(i, i + size);
}
if (rear != end) {
ranges.emplace_back(rear, end);
}
return ranges;
}

27
test/global/global_utils.h

@ -0,0 +1,27 @@
#include <future>
#include <vector>
#include <functional>
#include "tiny_pool.h"
class TinyPool { // OOP for tiny_thread_pool
pool_t *pool;
static void wrap_c_func(void *func) { // wrap std::function as c-style function ptr
auto func_ptr = static_cast<std::function<void()>*>(func);
(*func_ptr)();
delete func_ptr;
}
public:
void boot() { tiny_pool_boot(pool); }
void join() { tiny_pool_join(pool); }
void kill() { tiny_pool_kill(pool); }
void detach() { tiny_pool_detach(pool); }
explicit TinyPool(uint32_t size) { pool = tiny_pool_create(size); }
template <typename Func, typename ...Args>
auto submit(Func &&func, Args &&...args) -> std::future<decltype(func(args...))>;
};
typedef std::vector<std::pair<uint64_t, uint64_t>> range_split_t;
range_split_t range_split(uint64_t start, uint64_t end, uint64_t size);

37
test/global/utils.cc

@ -1,37 +0,0 @@
#include <future>
#include <functional>
#include "tiny_pool.h"
class TinyPool { // OOP for tiny_thread_pool
pool_t *pool;
static void wrap_c_func(void *func) { // wrap std::function as c-style function ptr
(*static_cast<std::function<void()>*>(func))();
free(func);
}
public:
void boot() { tiny_pool_boot(pool); }
void join() { tiny_pool_join(pool); }
void kill() { tiny_pool_kill(pool); }
void detach() { tiny_pool_detach(pool); }
explicit TinyPool(uint32_t size) { pool = tiny_pool_create(size); }
template <typename Func, typename ...Args>
auto submit(Func &&func, Args &&...args) -> std::future<decltype(func(args...))>;
};
template <typename Func, typename ...Args>
auto TinyPool::submit(Func &&func, Args &&...args) -> std::future<decltype(func(args...))> {
std::function<decltype(func(args...))()> wrap_func = std::bind(
std::forward<Func>(func), std::forward<Args>(args)...
);
auto func_ptr = std::make_shared<
std::packaged_task<decltype(func(args...))()>
>(wrap_func);
tiny_pool_submit(pool, TinyPool::wrap_c_func, (void*)(
new std::function<void()> (
[func_ptr]() { (*func_ptr)(); }
)
));
return func_ptr->get_future();
}

2
third_party/tiny_thread_pool

@ -1 +1 @@
Subproject commit 77351b1aace75c17b5163ea1d2940f665d7ed400
Subproject commit 216c55476c45f9c2b8b6567ea2bf1aa643d95c0a
Loading…
Cancel
Save