diff --git a/CMakeLists.txt b/CMakeLists.txt index db77510..57cab90 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -144,6 +144,17 @@ if(DEFINED _qtty_rpath) ) endif() +# JSON serialization example — requires qtty-ffi built with the 'serde' feature: +# cmake -B build -DQTTY_FFI_FEATURES=serde && cmake --build build +add_executable(serialization examples/serialization.cpp) +target_link_libraries(serialization PRIVATE qtty_cpp) +if(DEFINED _qtty_rpath) + set_target_properties(serialization PROPERTIES + BUILD_RPATH ${_qtty_rpath} + INSTALL_RPATH ${_qtty_rpath} + ) +endif() + # Test executables with Google Test set(TEST_FFI_SOURCES tests/main.cpp diff --git a/build-coverage/CMakeDoxyfile.in b/build-coverage/CMakeDoxyfile.in deleted file mode 100644 index 041b254..0000000 --- a/build-coverage/CMakeDoxyfile.in +++ /dev/null @@ -1,298 +0,0 @@ -# -# DO NOT EDIT! THIS FILE WAS GENERATED BY CMAKE! -# - -DOXYFILE_ENCODING = @DOXYGEN_DOXYFILE_ENCODING@ -PROJECT_NAME = @DOXYGEN_PROJECT_NAME@ -PROJECT_NUMBER = @DOXYGEN_PROJECT_NUMBER@ -PROJECT_BRIEF = @DOXYGEN_PROJECT_BRIEF@ -PROJECT_LOGO = @DOXYGEN_PROJECT_LOGO@ -OUTPUT_DIRECTORY = @DOXYGEN_OUTPUT_DIRECTORY@ -CREATE_SUBDIRS = @DOXYGEN_CREATE_SUBDIRS@ -CREATE_SUBDIRS_LEVEL = @DOXYGEN_CREATE_SUBDIRS_LEVEL@ -ALLOW_UNICODE_NAMES = @DOXYGEN_ALLOW_UNICODE_NAMES@ -OUTPUT_LANGUAGE = @DOXYGEN_OUTPUT_LANGUAGE@ -BRIEF_MEMBER_DESC = @DOXYGEN_BRIEF_MEMBER_DESC@ -REPEAT_BRIEF = @DOXYGEN_REPEAT_BRIEF@ -ABBREVIATE_BRIEF = @DOXYGEN_ABBREVIATE_BRIEF@ -ALWAYS_DETAILED_SEC = @DOXYGEN_ALWAYS_DETAILED_SEC@ -INLINE_INHERITED_MEMB = @DOXYGEN_INLINE_INHERITED_MEMB@ -FULL_PATH_NAMES = @DOXYGEN_FULL_PATH_NAMES@ -STRIP_FROM_PATH = @DOXYGEN_STRIP_FROM_PATH@ -STRIP_FROM_INC_PATH = @DOXYGEN_STRIP_FROM_INC_PATH@ -SHORT_NAMES = @DOXYGEN_SHORT_NAMES@ -JAVADOC_AUTOBRIEF = @DOXYGEN_JAVADOC_AUTOBRIEF@ -JAVADOC_BANNER = @DOXYGEN_JAVADOC_BANNER@ -QT_AUTOBRIEF = @DOXYGEN_QT_AUTOBRIEF@ -MULTILINE_CPP_IS_BRIEF = @DOXYGEN_MULTILINE_CPP_IS_BRIEF@ -PYTHON_DOCSTRING = @DOXYGEN_PYTHON_DOCSTRING@ -INHERIT_DOCS = @DOXYGEN_INHERIT_DOCS@ -SEPARATE_MEMBER_PAGES = @DOXYGEN_SEPARATE_MEMBER_PAGES@ -TAB_SIZE = @DOXYGEN_TAB_SIZE@ -ALIASES = @DOXYGEN_ALIASES@ -OPTIMIZE_OUTPUT_FOR_C = @DOXYGEN_OPTIMIZE_OUTPUT_FOR_C@ -OPTIMIZE_OUTPUT_JAVA = @DOXYGEN_OPTIMIZE_OUTPUT_JAVA@ -OPTIMIZE_FOR_FORTRAN = @DOXYGEN_OPTIMIZE_FOR_FORTRAN@ -OPTIMIZE_OUTPUT_VHDL = @DOXYGEN_OPTIMIZE_OUTPUT_VHDL@ -OPTIMIZE_OUTPUT_SLICE = @DOXYGEN_OPTIMIZE_OUTPUT_SLICE@ -EXTENSION_MAPPING = @DOXYGEN_EXTENSION_MAPPING@ -MARKDOWN_SUPPORT = @DOXYGEN_MARKDOWN_SUPPORT@ -TOC_INCLUDE_HEADINGS = @DOXYGEN_TOC_INCLUDE_HEADINGS@ -MARKDOWN_ID_STYLE = @DOXYGEN_MARKDOWN_ID_STYLE@ -AUTOLINK_SUPPORT = @DOXYGEN_AUTOLINK_SUPPORT@ -BUILTIN_STL_SUPPORT = @DOXYGEN_BUILTIN_STL_SUPPORT@ -CPP_CLI_SUPPORT = @DOXYGEN_CPP_CLI_SUPPORT@ -SIP_SUPPORT = @DOXYGEN_SIP_SUPPORT@ -IDL_PROPERTY_SUPPORT = @DOXYGEN_IDL_PROPERTY_SUPPORT@ -DISTRIBUTE_GROUP_DOC = @DOXYGEN_DISTRIBUTE_GROUP_DOC@ -GROUP_NESTED_COMPOUNDS = @DOXYGEN_GROUP_NESTED_COMPOUNDS@ -SUBGROUPING = @DOXYGEN_SUBGROUPING@ -INLINE_GROUPED_CLASSES = @DOXYGEN_INLINE_GROUPED_CLASSES@ -INLINE_SIMPLE_STRUCTS = @DOXYGEN_INLINE_SIMPLE_STRUCTS@ -TYPEDEF_HIDES_STRUCT = @DOXYGEN_TYPEDEF_HIDES_STRUCT@ -LOOKUP_CACHE_SIZE = @DOXYGEN_LOOKUP_CACHE_SIZE@ -NUM_PROC_THREADS = @DOXYGEN_NUM_PROC_THREADS@ -TIMESTAMP = @DOXYGEN_TIMESTAMP@ -EXTRACT_ALL = @DOXYGEN_EXTRACT_ALL@ -EXTRACT_PRIVATE = @DOXYGEN_EXTRACT_PRIVATE@ -EXTRACT_PRIV_VIRTUAL = @DOXYGEN_EXTRACT_PRIV_VIRTUAL@ -EXTRACT_PACKAGE = @DOXYGEN_EXTRACT_PACKAGE@ -EXTRACT_STATIC = @DOXYGEN_EXTRACT_STATIC@ -EXTRACT_LOCAL_CLASSES = @DOXYGEN_EXTRACT_LOCAL_CLASSES@ -EXTRACT_LOCAL_METHODS = @DOXYGEN_EXTRACT_LOCAL_METHODS@ -EXTRACT_ANON_NSPACES = @DOXYGEN_EXTRACT_ANON_NSPACES@ -RESOLVE_UNNAMED_PARAMS = @DOXYGEN_RESOLVE_UNNAMED_PARAMS@ -HIDE_UNDOC_MEMBERS = @DOXYGEN_HIDE_UNDOC_MEMBERS@ -HIDE_UNDOC_CLASSES = @DOXYGEN_HIDE_UNDOC_CLASSES@ -HIDE_FRIEND_COMPOUNDS = @DOXYGEN_HIDE_FRIEND_COMPOUNDS@ -HIDE_IN_BODY_DOCS = @DOXYGEN_HIDE_IN_BODY_DOCS@ -INTERNAL_DOCS = @DOXYGEN_INTERNAL_DOCS@ -CASE_SENSE_NAMES = @DOXYGEN_CASE_SENSE_NAMES@ -HIDE_SCOPE_NAMES = @DOXYGEN_HIDE_SCOPE_NAMES@ -HIDE_COMPOUND_REFERENCE= @DOXYGEN_HIDE_COMPOUND_REFERENCE@ -SHOW_HEADERFILE = @DOXYGEN_SHOW_HEADERFILE@ -SHOW_INCLUDE_FILES = @DOXYGEN_SHOW_INCLUDE_FILES@ -SHOW_GROUPED_MEMB_INC = @DOXYGEN_SHOW_GROUPED_MEMB_INC@ -FORCE_LOCAL_INCLUDES = @DOXYGEN_FORCE_LOCAL_INCLUDES@ -INLINE_INFO = @DOXYGEN_INLINE_INFO@ -SORT_MEMBER_DOCS = @DOXYGEN_SORT_MEMBER_DOCS@ -SORT_BRIEF_DOCS = @DOXYGEN_SORT_BRIEF_DOCS@ -SORT_MEMBERS_CTORS_1ST = @DOXYGEN_SORT_MEMBERS_CTORS_1ST@ -SORT_GROUP_NAMES = @DOXYGEN_SORT_GROUP_NAMES@ -SORT_BY_SCOPE_NAME = @DOXYGEN_SORT_BY_SCOPE_NAME@ -STRICT_PROTO_MATCHING = @DOXYGEN_STRICT_PROTO_MATCHING@ -GENERATE_TODOLIST = @DOXYGEN_GENERATE_TODOLIST@ -GENERATE_TESTLIST = @DOXYGEN_GENERATE_TESTLIST@ -GENERATE_BUGLIST = @DOXYGEN_GENERATE_BUGLIST@ -GENERATE_DEPRECATEDLIST= @DOXYGEN_GENERATE_DEPRECATEDLIST@ -ENABLED_SECTIONS = @DOXYGEN_ENABLED_SECTIONS@ -MAX_INITIALIZER_LINES = @DOXYGEN_MAX_INITIALIZER_LINES@ -SHOW_USED_FILES = @DOXYGEN_SHOW_USED_FILES@ -SHOW_FILES = @DOXYGEN_SHOW_FILES@ -SHOW_NAMESPACES = @DOXYGEN_SHOW_NAMESPACES@ -FILE_VERSION_FILTER = @DOXYGEN_FILE_VERSION_FILTER@ -LAYOUT_FILE = @DOXYGEN_LAYOUT_FILE@ -CITE_BIB_FILES = @DOXYGEN_CITE_BIB_FILES@ -QUIET = @DOXYGEN_QUIET@ -WARNINGS = @DOXYGEN_WARNINGS@ -WARN_IF_UNDOCUMENTED = @DOXYGEN_WARN_IF_UNDOCUMENTED@ -WARN_IF_DOC_ERROR = @DOXYGEN_WARN_IF_DOC_ERROR@ -WARN_IF_INCOMPLETE_DOC = @DOXYGEN_WARN_IF_INCOMPLETE_DOC@ -WARN_NO_PARAMDOC = @DOXYGEN_WARN_NO_PARAMDOC@ -WARN_IF_UNDOC_ENUM_VAL = @DOXYGEN_WARN_IF_UNDOC_ENUM_VAL@ -WARN_AS_ERROR = @DOXYGEN_WARN_AS_ERROR@ -WARN_FORMAT = @DOXYGEN_WARN_FORMAT@ -WARN_LINE_FORMAT = @DOXYGEN_WARN_LINE_FORMAT@ -WARN_LOGFILE = @DOXYGEN_WARN_LOGFILE@ -INPUT = @DOXYGEN_INPUT@ -INPUT_ENCODING = @DOXYGEN_INPUT_ENCODING@ -INPUT_FILE_ENCODING = @DOXYGEN_INPUT_FILE_ENCODING@ -FILE_PATTERNS = @DOXYGEN_FILE_PATTERNS@ -RECURSIVE = @DOXYGEN_RECURSIVE@ -EXCLUDE = @DOXYGEN_EXCLUDE@ -EXCLUDE_SYMLINKS = @DOXYGEN_EXCLUDE_SYMLINKS@ -EXCLUDE_PATTERNS = @DOXYGEN_EXCLUDE_PATTERNS@ -EXCLUDE_SYMBOLS = @DOXYGEN_EXCLUDE_SYMBOLS@ -EXAMPLE_PATH = @DOXYGEN_EXAMPLE_PATH@ -EXAMPLE_PATTERNS = @DOXYGEN_EXAMPLE_PATTERNS@ -EXAMPLE_RECURSIVE = @DOXYGEN_EXAMPLE_RECURSIVE@ -IMAGE_PATH = @DOXYGEN_IMAGE_PATH@ -INPUT_FILTER = @DOXYGEN_INPUT_FILTER@ -FILTER_PATTERNS = @DOXYGEN_FILTER_PATTERNS@ -FILTER_SOURCE_FILES = @DOXYGEN_FILTER_SOURCE_FILES@ -FILTER_SOURCE_PATTERNS = @DOXYGEN_FILTER_SOURCE_PATTERNS@ -USE_MDFILE_AS_MAINPAGE = @DOXYGEN_USE_MDFILE_AS_MAINPAGE@ -FORTRAN_COMMENT_AFTER = @DOXYGEN_FORTRAN_COMMENT_AFTER@ -SOURCE_BROWSER = @DOXYGEN_SOURCE_BROWSER@ -INLINE_SOURCES = @DOXYGEN_INLINE_SOURCES@ -STRIP_CODE_COMMENTS = @DOXYGEN_STRIP_CODE_COMMENTS@ -REFERENCED_BY_RELATION = @DOXYGEN_REFERENCED_BY_RELATION@ -REFERENCES_RELATION = @DOXYGEN_REFERENCES_RELATION@ -REFERENCES_LINK_SOURCE = @DOXYGEN_REFERENCES_LINK_SOURCE@ -SOURCE_TOOLTIPS = @DOXYGEN_SOURCE_TOOLTIPS@ -USE_HTAGS = @DOXYGEN_USE_HTAGS@ -VERBATIM_HEADERS = @DOXYGEN_VERBATIM_HEADERS@ -CLANG_ASSISTED_PARSING = @DOXYGEN_CLANG_ASSISTED_PARSING@ -CLANG_ADD_INC_PATHS = @DOXYGEN_CLANG_ADD_INC_PATHS@ -CLANG_OPTIONS = @DOXYGEN_CLANG_OPTIONS@ -CLANG_DATABASE_PATH = @DOXYGEN_CLANG_DATABASE_PATH@ -ALPHABETICAL_INDEX = @DOXYGEN_ALPHABETICAL_INDEX@ -IGNORE_PREFIX = @DOXYGEN_IGNORE_PREFIX@ -GENERATE_HTML = @DOXYGEN_GENERATE_HTML@ -HTML_OUTPUT = @DOXYGEN_HTML_OUTPUT@ -HTML_FILE_EXTENSION = @DOXYGEN_HTML_FILE_EXTENSION@ -HTML_HEADER = @DOXYGEN_HTML_HEADER@ -HTML_FOOTER = @DOXYGEN_HTML_FOOTER@ -HTML_STYLESHEET = @DOXYGEN_HTML_STYLESHEET@ -HTML_EXTRA_STYLESHEET = @DOXYGEN_HTML_EXTRA_STYLESHEET@ -HTML_EXTRA_FILES = @DOXYGEN_HTML_EXTRA_FILES@ -HTML_COLORSTYLE = @DOXYGEN_HTML_COLORSTYLE@ -HTML_COLORSTYLE_HUE = @DOXYGEN_HTML_COLORSTYLE_HUE@ -HTML_COLORSTYLE_SAT = @DOXYGEN_HTML_COLORSTYLE_SAT@ -HTML_COLORSTYLE_GAMMA = @DOXYGEN_HTML_COLORSTYLE_GAMMA@ -HTML_DYNAMIC_MENUS = @DOXYGEN_HTML_DYNAMIC_MENUS@ -HTML_DYNAMIC_SECTIONS = @DOXYGEN_HTML_DYNAMIC_SECTIONS@ -HTML_CODE_FOLDING = @DOXYGEN_HTML_CODE_FOLDING@ -HTML_INDEX_NUM_ENTRIES = @DOXYGEN_HTML_INDEX_NUM_ENTRIES@ -GENERATE_DOCSET = @DOXYGEN_GENERATE_DOCSET@ -DOCSET_FEEDNAME = @DOXYGEN_DOCSET_FEEDNAME@ -DOCSET_FEEDURL = @DOXYGEN_DOCSET_FEEDURL@ -DOCSET_BUNDLE_ID = @DOXYGEN_DOCSET_BUNDLE_ID@ -DOCSET_PUBLISHER_ID = @DOXYGEN_DOCSET_PUBLISHER_ID@ -DOCSET_PUBLISHER_NAME = @DOXYGEN_DOCSET_PUBLISHER_NAME@ -GENERATE_HTMLHELP = @DOXYGEN_GENERATE_HTMLHELP@ -CHM_FILE = @DOXYGEN_CHM_FILE@ -HHC_LOCATION = @DOXYGEN_HHC_LOCATION@ -GENERATE_CHI = @DOXYGEN_GENERATE_CHI@ -CHM_INDEX_ENCODING = @DOXYGEN_CHM_INDEX_ENCODING@ -BINARY_TOC = @DOXYGEN_BINARY_TOC@ -TOC_EXPAND = @DOXYGEN_TOC_EXPAND@ -SITEMAP_URL = @DOXYGEN_SITEMAP_URL@ -GENERATE_QHP = @DOXYGEN_GENERATE_QHP@ -QCH_FILE = @DOXYGEN_QCH_FILE@ -QHP_NAMESPACE = @DOXYGEN_QHP_NAMESPACE@ -QHP_VIRTUAL_FOLDER = @DOXYGEN_QHP_VIRTUAL_FOLDER@ -QHP_CUST_FILTER_NAME = @DOXYGEN_QHP_CUST_FILTER_NAME@ -QHP_CUST_FILTER_ATTRS = @DOXYGEN_QHP_CUST_FILTER_ATTRS@ -QHP_SECT_FILTER_ATTRS = @DOXYGEN_QHP_SECT_FILTER_ATTRS@ -QHG_LOCATION = @DOXYGEN_QHG_LOCATION@ -GENERATE_ECLIPSEHELP = @DOXYGEN_GENERATE_ECLIPSEHELP@ -ECLIPSE_DOC_ID = @DOXYGEN_ECLIPSE_DOC_ID@ -DISABLE_INDEX = @DOXYGEN_DISABLE_INDEX@ -GENERATE_TREEVIEW = @DOXYGEN_GENERATE_TREEVIEW@ -FULL_SIDEBAR = @DOXYGEN_FULL_SIDEBAR@ -ENUM_VALUES_PER_LINE = @DOXYGEN_ENUM_VALUES_PER_LINE@ -TREEVIEW_WIDTH = @DOXYGEN_TREEVIEW_WIDTH@ -EXT_LINKS_IN_WINDOW = @DOXYGEN_EXT_LINKS_IN_WINDOW@ -OBFUSCATE_EMAILS = @DOXYGEN_OBFUSCATE_EMAILS@ -HTML_FORMULA_FORMAT = @DOXYGEN_HTML_FORMULA_FORMAT@ -FORMULA_FONTSIZE = @DOXYGEN_FORMULA_FONTSIZE@ -FORMULA_MACROFILE = @DOXYGEN_FORMULA_MACROFILE@ -USE_MATHJAX = @DOXYGEN_USE_MATHJAX@ -MATHJAX_VERSION = @DOXYGEN_MATHJAX_VERSION@ -MATHJAX_FORMAT = @DOXYGEN_MATHJAX_FORMAT@ -MATHJAX_RELPATH = @DOXYGEN_MATHJAX_RELPATH@ -MATHJAX_EXTENSIONS = @DOXYGEN_MATHJAX_EXTENSIONS@ -MATHJAX_CODEFILE = @DOXYGEN_MATHJAX_CODEFILE@ -SEARCHENGINE = @DOXYGEN_SEARCHENGINE@ -SERVER_BASED_SEARCH = @DOXYGEN_SERVER_BASED_SEARCH@ -EXTERNAL_SEARCH = @DOXYGEN_EXTERNAL_SEARCH@ -SEARCHENGINE_URL = @DOXYGEN_SEARCHENGINE_URL@ -SEARCHDATA_FILE = @DOXYGEN_SEARCHDATA_FILE@ -EXTERNAL_SEARCH_ID = @DOXYGEN_EXTERNAL_SEARCH_ID@ -EXTRA_SEARCH_MAPPINGS = @DOXYGEN_EXTRA_SEARCH_MAPPINGS@ -GENERATE_LATEX = @DOXYGEN_GENERATE_LATEX@ -LATEX_OUTPUT = @DOXYGEN_LATEX_OUTPUT@ -LATEX_CMD_NAME = @DOXYGEN_LATEX_CMD_NAME@ -MAKEINDEX_CMD_NAME = @DOXYGEN_MAKEINDEX_CMD_NAME@ -LATEX_MAKEINDEX_CMD = @DOXYGEN_LATEX_MAKEINDEX_CMD@ -COMPACT_LATEX = @DOXYGEN_COMPACT_LATEX@ -PAPER_TYPE = @DOXYGEN_PAPER_TYPE@ -EXTRA_PACKAGES = @DOXYGEN_EXTRA_PACKAGES@ -LATEX_HEADER = @DOXYGEN_LATEX_HEADER@ -LATEX_FOOTER = @DOXYGEN_LATEX_FOOTER@ -LATEX_EXTRA_STYLESHEET = @DOXYGEN_LATEX_EXTRA_STYLESHEET@ -LATEX_EXTRA_FILES = @DOXYGEN_LATEX_EXTRA_FILES@ -PDF_HYPERLINKS = @DOXYGEN_PDF_HYPERLINKS@ -USE_PDFLATEX = @DOXYGEN_USE_PDFLATEX@ -LATEX_BATCHMODE = @DOXYGEN_LATEX_BATCHMODE@ -LATEX_HIDE_INDICES = @DOXYGEN_LATEX_HIDE_INDICES@ -LATEX_BIB_STYLE = @DOXYGEN_LATEX_BIB_STYLE@ -LATEX_EMOJI_DIRECTORY = @DOXYGEN_LATEX_EMOJI_DIRECTORY@ -GENERATE_RTF = @DOXYGEN_GENERATE_RTF@ -RTF_OUTPUT = @DOXYGEN_RTF_OUTPUT@ -COMPACT_RTF = @DOXYGEN_COMPACT_RTF@ -RTF_HYPERLINKS = @DOXYGEN_RTF_HYPERLINKS@ -RTF_STYLESHEET_FILE = @DOXYGEN_RTF_STYLESHEET_FILE@ -RTF_EXTENSIONS_FILE = @DOXYGEN_RTF_EXTENSIONS_FILE@ -GENERATE_MAN = @DOXYGEN_GENERATE_MAN@ -MAN_OUTPUT = @DOXYGEN_MAN_OUTPUT@ -MAN_EXTENSION = @DOXYGEN_MAN_EXTENSION@ -MAN_SUBDIR = @DOXYGEN_MAN_SUBDIR@ -MAN_LINKS = @DOXYGEN_MAN_LINKS@ -GENERATE_XML = @DOXYGEN_GENERATE_XML@ -XML_OUTPUT = @DOXYGEN_XML_OUTPUT@ -XML_PROGRAMLISTING = @DOXYGEN_XML_PROGRAMLISTING@ -XML_NS_MEMB_FILE_SCOPE = @DOXYGEN_XML_NS_MEMB_FILE_SCOPE@ -GENERATE_DOCBOOK = @DOXYGEN_GENERATE_DOCBOOK@ -DOCBOOK_OUTPUT = @DOXYGEN_DOCBOOK_OUTPUT@ -GENERATE_AUTOGEN_DEF = @DOXYGEN_GENERATE_AUTOGEN_DEF@ -GENERATE_SQLITE3 = @DOXYGEN_GENERATE_SQLITE3@ -SQLITE3_OUTPUT = @DOXYGEN_SQLITE3_OUTPUT@ -SQLITE3_RECREATE_DB = @DOXYGEN_SQLITE3_RECREATE_DB@ -GENERATE_PERLMOD = @DOXYGEN_GENERATE_PERLMOD@ -PERLMOD_LATEX = @DOXYGEN_PERLMOD_LATEX@ -PERLMOD_PRETTY = @DOXYGEN_PERLMOD_PRETTY@ -PERLMOD_MAKEVAR_PREFIX = @DOXYGEN_PERLMOD_MAKEVAR_PREFIX@ -ENABLE_PREPROCESSING = @DOXYGEN_ENABLE_PREPROCESSING@ -MACRO_EXPANSION = @DOXYGEN_MACRO_EXPANSION@ -EXPAND_ONLY_PREDEF = @DOXYGEN_EXPAND_ONLY_PREDEF@ -SEARCH_INCLUDES = @DOXYGEN_SEARCH_INCLUDES@ -INCLUDE_PATH = @DOXYGEN_INCLUDE_PATH@ -INCLUDE_FILE_PATTERNS = @DOXYGEN_INCLUDE_FILE_PATTERNS@ -PREDEFINED = @DOXYGEN_PREDEFINED@ -EXPAND_AS_DEFINED = @DOXYGEN_EXPAND_AS_DEFINED@ -SKIP_FUNCTION_MACROS = @DOXYGEN_SKIP_FUNCTION_MACROS@ -TAGFILES = @DOXYGEN_TAGFILES@ -GENERATE_TAGFILE = @DOXYGEN_GENERATE_TAGFILE@ -ALLEXTERNALS = @DOXYGEN_ALLEXTERNALS@ -EXTERNAL_GROUPS = @DOXYGEN_EXTERNAL_GROUPS@ -EXTERNAL_PAGES = @DOXYGEN_EXTERNAL_PAGES@ -HIDE_UNDOC_RELATIONS = @DOXYGEN_HIDE_UNDOC_RELATIONS@ -HAVE_DOT = @DOXYGEN_HAVE_DOT@ -DOT_NUM_THREADS = @DOXYGEN_DOT_NUM_THREADS@ -DOT_COMMON_ATTR = @DOXYGEN_DOT_COMMON_ATTR@ -DOT_EDGE_ATTR = @DOXYGEN_DOT_EDGE_ATTR@ -DOT_NODE_ATTR = @DOXYGEN_DOT_NODE_ATTR@ -DOT_FONTPATH = @DOXYGEN_DOT_FONTPATH@ -CLASS_GRAPH = @DOXYGEN_CLASS_GRAPH@ -COLLABORATION_GRAPH = @DOXYGEN_COLLABORATION_GRAPH@ -GROUP_GRAPHS = @DOXYGEN_GROUP_GRAPHS@ -UML_LOOK = @DOXYGEN_UML_LOOK@ -UML_LIMIT_NUM_FIELDS = @DOXYGEN_UML_LIMIT_NUM_FIELDS@ -DOT_UML_DETAILS = @DOXYGEN_DOT_UML_DETAILS@ -DOT_WRAP_THRESHOLD = @DOXYGEN_DOT_WRAP_THRESHOLD@ -TEMPLATE_RELATIONS = @DOXYGEN_TEMPLATE_RELATIONS@ -INCLUDE_GRAPH = @DOXYGEN_INCLUDE_GRAPH@ -INCLUDED_BY_GRAPH = @DOXYGEN_INCLUDED_BY_GRAPH@ -CALL_GRAPH = @DOXYGEN_CALL_GRAPH@ -CALLER_GRAPH = @DOXYGEN_CALLER_GRAPH@ -GRAPHICAL_HIERARCHY = @DOXYGEN_GRAPHICAL_HIERARCHY@ -DIRECTORY_GRAPH = @DOXYGEN_DIRECTORY_GRAPH@ -DIR_GRAPH_MAX_DEPTH = @DOXYGEN_DIR_GRAPH_MAX_DEPTH@ -DOT_IMAGE_FORMAT = @DOXYGEN_DOT_IMAGE_FORMAT@ -INTERACTIVE_SVG = @DOXYGEN_INTERACTIVE_SVG@ -DOT_PATH = @DOXYGEN_DOT_PATH@ -DOTFILE_DIRS = @DOXYGEN_DOTFILE_DIRS@ -DIA_PATH = @DOXYGEN_DIA_PATH@ -DIAFILE_DIRS = @DOXYGEN_DIAFILE_DIRS@ -PLANTUML_JAR_PATH = @DOXYGEN_PLANTUML_JAR_PATH@ -PLANTUML_CFG_FILE = @DOXYGEN_PLANTUML_CFG_FILE@ -PLANTUML_INCLUDE_PATH = @DOXYGEN_PLANTUML_INCLUDE_PATH@ -DOT_GRAPH_MAX_NODES = @DOXYGEN_DOT_GRAPH_MAX_NODES@ -MAX_DOT_GRAPH_DEPTH = @DOXYGEN_MAX_DOT_GRAPH_DEPTH@ -DOT_MULTI_TARGETS = @DOXYGEN_DOT_MULTI_TARGETS@ -GENERATE_LEGEND = @DOXYGEN_GENERATE_LEGEND@ -DOT_CLEANUP = @DOXYGEN_DOT_CLEANUP@ -MSCGEN_TOOL = @DOXYGEN_MSCGEN_TOOL@ -MSCFILE_DIRS = @DOXYGEN_MSCFILE_DIRS@ diff --git a/build-coverage/Doxyfile.qtty_cpp b/build-coverage/Doxyfile.qtty_cpp deleted file mode 100644 index beddd9e..0000000 --- a/build-coverage/Doxyfile.qtty_cpp +++ /dev/null @@ -1,65 +0,0 @@ -DOXYFILE_ENCODING = UTF-8 -PROJECT_NAME = "qtty-cpp" -PROJECT_NUMBER = "0.1.0" -PROJECT_BRIEF = "Header-only C++ wrapper for qtty" -PROJECT_LOGO = "/home/valles/workspace/siderust/siderust-cpp/qtty-cpp/../../public/logo.png" -OUTPUT_DIRECTORY = "/home/valles/workspace/siderust/siderust-cpp/qtty-cpp/build-coverage/docs/doxygen" -OUTPUT_LANGUAGE = English -BRIEF_MEMBER_DESC = YES -REPEAT_BRIEF = YES -ALWAYS_DETAILED_SEC = NO -FULL_PATH_NAMES = NO -STRIP_FROM_PATH = "/home/valles/workspace/siderust/siderust-cpp/qtty-cpp" -STRIP_FROM_INC_PATH = "/home/valles/workspace/siderust/siderust-cpp/qtty-cpp/include" - -MARKDOWN_SUPPORT = YES -AUTOLINK_SUPPORT = YES -BUILTIN_STL_SUPPORT = YES - -EXTRACT_ALL = YES -EXTRACT_PRIVATE = NO -EXTRACT_STATIC = YES -EXTRACT_LOCAL_CLASSES = YES -HIDE_UNDOC_MEMBERS = NO -HIDE_UNDOC_CLASSES = NO -INTERNAL_DOCS = NO - -QUIET = YES -WARNINGS = YES -WARN_IF_UNDOCUMENTED = NO -WARN_IF_DOC_ERROR = YES -WARN_NO_PARAMDOC = NO -WARN_AS_ERROR = NO - -INPUT = \ - "/home/valles/workspace/siderust/siderust-cpp/qtty-cpp/docs" \ - "/home/valles/workspace/siderust/siderust-cpp/qtty-cpp/docs/mainpage.md" \ - "/home/valles/workspace/siderust/siderust-cpp/qtty-cpp/docs/README.md" \ - "/home/valles/workspace/siderust/siderust-cpp/qtty-cpp/include/qtty" -FILE_PATTERNS = *.hpp *.md -RECURSIVE = YES -EXAMPLE_PATH = "/home/valles/workspace/siderust/siderust-cpp/qtty-cpp/examples" -EXAMPLE_PATTERNS = *.cpp -USE_MDFILE_AS_MAINPAGE = "/home/valles/workspace/siderust/siderust-cpp/qtty-cpp/docs/mainpage.md" - -ENABLE_PREPROCESSING = YES -MACRO_EXPANSION = NO -SKIP_FUNCTION_MACROS = YES -INCLUDE_PATH = \ - "/home/valles/workspace/siderust/siderust-cpp/qtty-cpp/include" \ - "/home/valles/workspace/siderust/siderust-cpp/qtty-cpp/qtty/qtty-ffi/include" - -SOURCE_BROWSER = YES -INLINE_SOURCES = NO -REFERENCED_BY_RELATION = YES -REFERENCES_RELATION = YES -VERBATIM_HEADERS = YES - -GENERATE_HTML = YES -HTML_OUTPUT = html -HTML_DYNAMIC_MENUS = YES -GENERATE_TREEVIEW = YES -TOC_INCLUDE_HEADINGS = 2 - -GENERATE_LATEX = NO -GENERATE_XML = NO diff --git a/examples/serialization.cpp b/examples/serialization.cpp new file mode 100644 index 0000000..1c7c088 --- /dev/null +++ b/examples/serialization.cpp @@ -0,0 +1,116 @@ +// SPDX-License-Identifier: AGPL-3.0-or-later +// Copyright (C) 2026 Vallés Puig, Ramon + +/** + * @file serialization.cpp + * @example serialization.cpp + * @brief Demonstrates JSON serialization and deserialization of qtty + * quantities. + * + * Requires the qtty-ffi library built with the `serde` Cargo feature: + * + * cmake -B build -DQTTY_FFI_FEATURES=serde && cmake --build build + * ./build/serialization + * + * Features shown: + * - Compact value-only JSON via `to_json_value` / `from_json_value` + * - Self-documenting JSON (value + unit) via `to_json` / `from_json` + * - DerivedQuantity JSON round-trip + * - Constructing quantities from external JSON payloads + */ + +#include "qtty/serialization.hpp" +#include "qtty/qtty.hpp" +#include +#include +#include + +using namespace qtty; +using namespace qtty::serialization; + +int main() { + std::cout << "=== qtty-cpp Serialization Demo ===" << std::endl; + std::cout << "FFI ABI Version: " << abi_version() << "\n" << std::endl; + + // ── 1. Value-only JSON ────────────────────────────────────────────────── + std::cout << "1. Value-only JSON (compact, default serde format):" + << std::endl; + + auto distance = Meter(42.5); + auto time = Second(9.58); + auto mass = Kilogram(70.0); + + std::string json_d = to_json_value(distance); + std::string json_t = to_json_value(time); + std::string json_m = to_json_value(mass); + + std::cout << " " << distance << " → " << json_d << std::endl; + std::cout << " " << time << " → " << json_t << std::endl; + std::cout << " " << mass << " → " << json_m << std::endl; + + // Deserialize back + Meter d_rt = from_json_value(json_d); + Second t_rt = from_json_value(json_t); + Kilogram m_rt = from_json_value(json_m); + + std::cout << " (restored) " << d_rt << ", " << t_rt << ", " << m_rt + << std::endl; + assert(std::abs(d_rt.value() - 42.5) < 1e-9); + assert(std::abs(t_rt.value() - 9.58) < 1e-9); + assert(std::abs(m_rt.value() - 70.0) < 1e-9); + + // ── 2. Self-documenting JSON (value + unit name) ──────────────────────── + std::cout << "\n2. Self-documenting JSON (value + unit name):" << std::endl; + + auto wavelength = Nanometer(656.3); // Hα spectral line + auto period = Hour(24.0); + + std::string full_d = to_json(wavelength); + std::string full_t = to_json(period); + + std::cout << " " << wavelength << " → " << full_d << std::endl; + std::cout << " " << period << " → " << full_t << std::endl; + + // Round-trip + Nanometer wl_rt = from_json(full_d); + Hour p_rt = from_json(full_t); + + std::cout << " (restored) " << wl_rt << ", " << p_rt << std::endl; + assert(std::abs(wl_rt.value() - 656.3) < 1e-6); + assert(std::abs(p_rt.value() - 24.0) < 1e-9); + + // ── 3. DerivedQuantity JSON round-trip ───────────────────────────────────── + std::cout << "\n3. DerivedQuantity JSON (velocity = length / time):" + << std::endl; + + auto velocity = MeterPerSecond(343.0); // speed of sound in air at 20 °C + std::string vel_json = derived_serialization::to_json(velocity); + std::cout << " " << velocity << " → " << vel_json << std::endl; + + MeterPerSecond vel_rt = + derived_serialization::from_json(vel_json); + std::cout << " (restored) " << vel_rt << std::endl; + assert(std::abs(vel_rt.value() - 343.0) < 1e-9); + + // ── 4. Consuming external JSON payloads + // ───────────────────────────────────── + std::cout << "\n4. External JSON payloads:" << std::endl; + + // Value-only + const std::string ext_val = "1.496e+11"; // 1 AU in metres + Meter au_m = from_json_value(ext_val); + Kilometer au_km = au_m.to(); + std::cout << std::fixed << std::setprecision(3); + std::cout << " 1 AU from JSON → " << au_km << std::endl; + + // Self-documenting + const std::string ext_full = + R"({"value":3.085677581e+16,"unit":"Meter"})"; // 1 parsec + Meter pc_m = from_json(ext_full); + std::cout << std::scientific << std::setprecision(4); + std::cout << " 1 pc from JSON → " << pc_m << std::endl; + + std::cout << "\n=== Serialization demo completed successfully ===" + << std::endl; + return 0; +} diff --git a/qtty b/qtty index 761c15d..0d07724 160000 --- a/qtty +++ b/qtty @@ -1 +1 @@ -Subproject commit 761c15df2643e9c7656035e183476b9176d9dc8f +Subproject commit 0d0772415d6ad4093107b9af3842f4540f9764a6 diff --git a/run-ci-locally.sh b/run-ci-locally.sh index 4fa2077..68ecdf5 100755 --- a/run-ci-locally.sh +++ b/run-ci-locally.sh @@ -125,6 +125,24 @@ check_command() { return 0 } +ensure_fresh_cmake_build_dir() { + local build_dir="$1" + local expected_source_dir="$2" + local cache_file="${build_dir}/CMakeCache.txt" + + if [[ ! -f "$cache_file" ]]; then + return 0 + fi + + local cached_source_dir + cached_source_dir="$(sed -n 's#^CMAKE_HOME_DIRECTORY:INTERNAL=##p' "$cache_file" | head -1)" + + if [[ -n "$cached_source_dir" && "$cached_source_dir" != "$expected_source_dir" ]]; then + print_warning "Removing stale CMake build directory: ${build_dir}" + rm -rf "$build_dir" + fi +} + # Check and install tools if [[ "$SKIP_INSTALL" == "false" ]]; then print_header "Checking/Installing build tools" @@ -224,6 +242,7 @@ if [[ "$RUN_LINT" == "true" ]]; then # First configure to generate compile_commands.json print_warning "Configuring CMake for compile commands..." + ensure_fresh_cmake_build_dir "build" "$SCRIPT_DIR" if cmake -S . -B build -G Ninja -DQTTY_BUILD_DOCS=OFF -DCMAKE_EXPORT_COMPILE_COMMANDS=ON >/dev/null 2>&1; then mapfile -t cpp_files < <(git ls-files '*.cpp' 2>/dev/null || echo "") @@ -256,6 +275,7 @@ fi if [[ "$RUN_BUILD" == "true" ]]; then print_header "Configure: CMake (build directory)" + ensure_fresh_cmake_build_dir "build" "$SCRIPT_DIR" if cmake -S . -B build -G Ninja -DQTTY_BUILD_DOCS=ON >/dev/null 2>&1; then print_success "CMake configuration complete" else @@ -306,6 +326,7 @@ fi if [[ "$RUN_COVERAGE" == "true" ]]; then print_header "Configure: CMake (coverage build)" + ensure_fresh_cmake_build_dir "build-coverage" "$SCRIPT_DIR" if cmake -S . -B build-coverage -G Ninja \ -DQTTY_BUILD_DOCS=OFF \ -DCMAKE_BUILD_TYPE=Debug \