...
This commit is contained in:
parent
53779d2f13
commit
ca46e89536
@ -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)
|
||||||
|
|||||||
@ -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);
|
||||||
}
|
}
|
||||||
|
|||||||
@ -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";
|
||||||
}
|
}
|
||||||
|
|||||||
Loading…
x
Reference in New Issue
Block a user