start ...

This commit is contained in:
Timur A. Fatkhullin
2026-06-20 21:53:15 +03:00
commit 7d7ad25cfb
3 changed files with 185 additions and 0 deletions

84
.gitignore vendored Normal file
View File

@@ -0,0 +1,84 @@
# This file is used to ignore files which are generated
# ----------------------------------------------------------------------------
*~
*.autosave
*.a
*.core
*.moc
*.o
*.obj
*.orig
*.rej
*.so
*.so.*
*_pch.h.cpp
*_resource.rc
*.qm
.#*
*.*#
core
!core/
tags
.DS_Store
.directory
*.debug
Makefile*
*.prl
*.app
moc_*.cpp
ui_*.h
qrc_*.cpp
Thumbs.db
*.res
*.rc
/.qmake.cache
/.qmake.stash
**/.qmlls.ini
# qtcreator generated files
*.pro.user*
*.qbs.user*
CMakeLists.txt.user*
# xemacs temporary files
*.flc
# Vim temporary files
.*.swp
# Visual Studio generated files
*.ib_pdb_index
*.idb
*.ilk
*.pdb
*.sln
*.suo
*.vcproj
*vcproj.*.*.user
*.ncb
*.sdf
*.opensdf
*.vcxproj
*vcxproj.*
# MinGW generated files
*.Debug
*.Release
# Python byte code
*.pyc
# Binaries
# --------
*.dll
*.exe
# Directories with generated files
.moc/
.obj/
.pch/
.rcc/
.uic/
/build*/
/.qtcreator/

31
CMakeLists.txt Normal file
View File

@@ -0,0 +1,31 @@
cmake_minimum_required(VERSION 3.16)
project(ADCLIB LANGUAGES CXX DESCRIPTION "Abstract Device Components Library")
set(CMAKE_CXX_STANDARD 23)
set(CMAKE_CXX_STANDARD_REQUIRED ON)
# ------- dependencies -------
include(FetchContent)
FetchContent_Declare(
snplib
GIT_REPOSITORY https://timur@git.sao.ru/timur/snipplib.git
GIT_TAG main
GIT_SHALLOW 1
GIT_PROGRESS 1
SOURCE_DIR ${CMAKE_BINARY_DIR}/snipplib
)
FetchContent_MakeAvailable(snplib)
set(ADCLIB_HEADERS include/adclib/adclib_device.h)
add_library(${PROJECT_NAME} INTERFACE ${ADCLIB_HEADERS})
include(GNUInstallDirs)
install(TARGETS ADCLIB
LIBRARY DESTINATION ${CMAKE_INSTALL_LIBDIR}
RUNTIME DESTINATION ${CMAKE_INSTALL_BINDIR}
)

View File

@@ -0,0 +1,70 @@
#pragma once
/****************************************************************************************
* ABSTRACT DEVICE COMPONENTS LIBRARY *
****************************************************************************************/
#include <snipplib/containers/snplib_hmap.h>
namespace adc
{
enum class adc_device_error_code_t : int { ERROR_OK, ERROR_RO_ATTR, ERROR_WO_ATTR, ERROR_ATTR_RANGE };
} // namespace adc
namespace adc
{
template <std::formattable<char> ATTR_ID_T = std::string_view, std::formattable<char> CMD_ID_T = std::string_view>
class adc_device_t
{
public:
typedef std::error_code error_t;
template <typename VT>
using op_result_t = std::expected<VT, error_t>;
protected:
template <typename VT>
struct attr_t {
ATTR_ID_T id;
std::function<op_result_t<VT>()> getter;
std::function<void(VT const&)> setter;
};
struct attr_proxy_t {
template <typename VT>
VT get(ATTR_ID_T id)
{
}
};
std::unordered_map<CMD_ID_T, std::function<void()>> _commands{};
snplib::HeterogenMap<ATTR_ID_T> _attrs{};
public:
adc_device_t() {}
template <snplib::snplib_callable_c ET>
void addCommand(CMD_ID_T id, ET&& exec_func)
{
_commands.emplace(std::move(id), std::forward<ET>(exec_func));
}
template <typename GT, typename ST>
void addAttr(ATTR_ID_T id, GT&& getter, ST&& setter)
{
// deduce attribute value type
using v_t = std::invoke_result_t<GT>;
static_assert(std::invocable<ST, v_t const&>, "Invalid setter type!");
_attrs.push(std::move(id), attr_t<v_t>{.getter = std::forward<GT>(getter), .setter = std::forward<ST>(setter)});
}
};
} // namespace adc