This commit is contained in:
Timur A. Fatkhullin 2024-04-13 23:47:22 +03:00
parent 53779d2f13
commit ca46e89536
3 changed files with 33 additions and 9 deletions

View File

@ -4,6 +4,7 @@ project(ADC LANGUAGES CXX)
set(CMAKE_CXX_STANDARD 20) set(CMAKE_CXX_STANDARD 20)
set(CMAKE_CXX_STANDARD_REQUIRED ON) set(CMAKE_CXX_STANDARD_REQUIRED ON)
# set(CMAKE_BUILD_TYPE Release)
set(ADC_COMMON_HEADERS set(ADC_COMMON_HEADERS
@ -16,7 +17,7 @@ set(ADC_DEVICE_HEADERS
device/adc_device_command.h device/adc_device_command.h
) )
option(BUILD_TESTS "Buiuld tests" ON) option(BUILD_TESTS "Build tests" ON)
if (BUILD_TESTS) if (BUILD_TESTS)
find_package(doctest) find_package(doctest)
@ -35,6 +36,9 @@ if (BUILD_TESTS)
endif() endif()
target_link_libraries(${VALUEHOLDER_TEST_APP} PRIVATE doctest::doctest) target_link_libraries(${VALUEHOLDER_TEST_APP} PRIVATE doctest::doctest)
include(CTest)
add_test(VALUE_HOLDER ${VALUEHOLDER_TEST_APP})
enable_testing()
endif(BUILD_TESTS) endif(BUILD_TESTS)
include(GNUInstallDirs) include(GNUInstallDirs)

View File

@ -8,7 +8,6 @@
#include <functional> #include <functional>
#include <map>
#include <system_error> #include <system_error>
#include "adc_traits.h" #include "adc_traits.h"
@ -251,8 +250,10 @@ public:
{ {
using from_sig_t = typename traits::adc_func_traits<FromFuncT>; using from_sig_t = typename traits::adc_func_traits<FromFuncT>;
using to_sig_t = typename traits::adc_func_traits<ToFuncT>; using to_sig_t = typename traits::adc_func_traits<ToFuncT>;
using value_t = typename to_sig_t::ret_t; // internal value type // using value_t = typename to_sig_t::ret_t; // internal value type
using user_t = typename from_sig_t::ret_t; using value_t = std::remove_cv_t<typename to_sig_t::ret_t>; // internal value type
// using user_t = typename from_sig_t::ret_t;
using user_t = std::remove_cv_t<typename from_sig_t::ret_t>;
// static_assert(!std::is_same_v<value_t, void>, "void IS NOT VALID TYPE!!!"); // static_assert(!std::is_same_v<value_t, void>, "void IS NOT VALID TYPE!!!");
@ -267,7 +268,8 @@ public:
this]() { this]() {
if (_getterFunc<value_t>[this]) { if (_getterFunc<value_t>[this]) {
auto val = _getterFunc<value_t>[this](); auto val = _getterFunc<value_t>[this]();
return std::get<0>(wrapper)(val); // convert from internal type // return std::get<0>(wrapper)(val); // convert from internal type
return std::get<0>(wrapper)(_getterFunc<value_t>[this]()); // convert from internal type
} }
// invalid conversion function signature // invalid conversion function signature
throw std::system_error(AdcValueHolderErrorCode::ERROR_INTERNAL_TYPE_MISMATCH); throw std::system_error(AdcValueHolderErrorCode::ERROR_INTERNAL_TYPE_MISMATCH);
@ -307,12 +309,14 @@ public:
AdcValueHolder& operator=(UT&& value) AdcValueHolder& operator=(UT&& value)
{ {
// using v_t = std::remove_reference_t<UT>; // using v_t = std::remove_reference_t<UT>;
using v_t = std::remove_cvref_t<UT>; // using v_t = std::remove_cvref_t<UT>;
using val_t = std::conditional_t<std::is_array_v<v_t>, std::add_pointer_t<std::remove_extent_t<v_t>>, v_t>; // using val_t = std::conditional_t<std::is_array_v<v_t>, std::add_pointer_t<std::remove_extent_t<v_t>>, v_t>;
using val_t = std::decay_t<UT>;
auto setter = _setterFunc<val_t>[this]; auto setter = _setterFunc<val_t>[this];
if (setter) { if (setter) {
setter(std::forward<UT>(value)); // setter(std::forward<UT>(value));
setter(value);
} else { } else {
throw std::system_error(AdcValueHolderErrorCode::ERROR_NO_CONV_FUNC); throw std::system_error(AdcValueHolderErrorCode::ERROR_NO_CONV_FUNC);
} }

View File

@ -1,6 +1,7 @@
#include <list> #include <list>
#define DOCTEST_CONFIG_IMPLEMENT_WITH_MAIN #define DOCTEST_CONFIG_IMPLEMENT_WITH_MAIN
#include <doctest/doctest.h> #include <doctest/doctest.h>
#include <chrono>
#include <iostream> #include <iostream>
#include "../common/adc_utils.h" #include "../common/adc_utils.h"
@ -76,7 +77,8 @@ TEST_CASE("[ADC VALUEHOLDER]")
// }); // });
vsh.addConvertFunc([](const std::string& v) { return v.c_str(); }, [](const char* v) { return std::string(v); }); vsh.addConvertFunc([&str](const std::string&) { return str.c_str(); },
[](const char* v) { return std::string(v); });
vsh = "NEW VALUE"; vsh = "NEW VALUE";
@ -84,6 +86,8 @@ TEST_CASE("[ADC VALUEHOLDER]")
const char* sptr = vsh; const char* sptr = vsh;
std::cout << "SPTR: " << sptr << "\n";
REQUIRE_EQ(std::strcmp(sptr, "NEW VALUE"), 0); REQUIRE_EQ(std::strcmp(sptr, "NEW VALUE"), 0);
using namespace std::literals; using namespace std::literals;
@ -134,4 +138,16 @@ TEST_CASE("[ADC VALUEHOLDER]")
std::cout << "SR: " << sr(std::list<float>{11.11, 22.22, 33.33}) << "\n"; std::cout << "SR: " << sr(std::list<float>{11.11, 22.22, 33.33}) << "\n";
ss = ",\t"; ss = ",\t";
std::cout << "SR: " << sr.setDelimiter(" , ")(std::vector<float>{11.11, 22.22, 33.33}) << "\n"; std::cout << "SR: " << sr.setDelimiter(" , ")(std::vector<float>{11.11, 22.22, 33.33}) << "\n";
int zz;
auto t1 = std::chrono::system_clock::now();
for (int i = 10; i < 1000000; ++i) {
vah = i;
zz = (int)vah + 10;
}
auto t2 = std::chrono::system_clock::now();
std::cout << "ZZ = " << zz << "\n";
std::cout << "ELAPS: " << std::chrono::duration_cast<std::chrono::microseconds>(t2 - t1).count() << " mksec\n";
} }