summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--.gitignore7
-rw-r--r--CMakeLists.txt14
-rw-r--r--CPackConfig.cmake6
-rw-r--r--CTestConfig.cmake3
-rw-r--r--ChangeLog8
-rw-r--r--CompilerChecks.cmake93
-rw-r--r--DefineOptions.cmake1
-rw-r--r--INSTALL.md (renamed from INSTALL)5
-rw-r--r--README.md (renamed from README)20
-rw-r--r--cmake/Modules/AddCCompilerFlag.cmake21
-rw-r--r--cmake/Modules/CheckCCompilerFlagSSP.cmake9
-rw-r--r--cmake/Modules/DefineCompilerFlags.cmake79
-rw-r--r--cmake/Modules/FindNSIS.cmake13
-rw-r--r--cmake/Modules/UseDoxygen.cmake140
-rw-r--r--cmocka-config.cmake.in2
-rw-r--r--doc/CMakeLists.txt38
-rw-r--r--doc/Doxyfile.in2442
-rw-r--r--doc/that_style/LICENSE21
-rw-r--r--doc/that_style/README.md22
-rw-r--r--doc/that_style/header.html56
-rw-r--r--doc/that_style/img/doc.svg97
-rw-r--r--doc/that_style/img/folderclosed.svg77
-rw-r--r--doc/that_style/img/folderopen.svg83
-rw-r--r--doc/that_style/img/mag_glass.svg73
-rw-r--r--doc/that_style/img/nav_edge_inter.svg73
-rw-r--r--doc/that_style/img/nav_edge_left.svg73
-rw-r--r--doc/that_style/img/nav_edge_right.svg73
-rw-r--r--doc/that_style/img/splitbar_handle.svg120
-rw-r--r--doc/that_style/img/sync_off.pngbin0 -> 483 bytes
-rw-r--r--doc/that_style/img/sync_on.pngbin0 -> 488 bytes
-rw-r--r--doc/that_style/js/striped_bg.js32
-rw-r--r--doc/that_style/sass/_fragment_base.scss69
-rw-r--r--doc/that_style/sass/_fragment_color.scss80
-rw-r--r--doc/that_style/sass/_menu_bar.scss70
-rw-r--r--doc/that_style/sass/_mixins.scss33
-rw-r--r--doc/that_style/sass/_nav_tree.scss72
-rw-r--r--doc/that_style/sass/_navpath.scss121
-rw-r--r--doc/that_style/sass/_search.scss89
-rw-r--r--doc/that_style/sass/that_style.scss1240
-rw-r--r--doc/that_style/that_style.css1436
-rw-r--r--example/CMakeLists.txt1
-rw-r--r--example/uptime/CMakeLists.txt21
-rw-r--r--example/uptime/README.md56
-rw-r--r--example/uptime/proc_uptime.c78
-rw-r--r--example/uptime/proc_uptime.h22
-rw-r--r--example/uptime/test_uptime.c182
-rw-r--r--example/uptime/uptime.c115
-rw-r--r--include/cmocka.h26
-rw-r--r--src/CMakeLists.txt32
-rw-r--r--src/cmocka.c245
-rw-r--r--src/cmocka.def2
-rw-r--r--tests/CMakeLists.txt14
-rw-r--r--tests/cmocka_test.cmake229
-rw-r--r--tests/test_exception_handler.c21
-rw-r--r--tests/test_strmatch.c99
-rw-r--r--tests/test_wildcard.c53
56 files changed, 5321 insertions, 2786 deletions
diff --git a/.gitignore b/.gitignore
deleted file mode 100644
index 3944fce..0000000
--- a/.gitignore
+++ /dev/null
@@ -1,7 +0,0 @@
-*.swp
-*~$
-tags
-cscope.*
-.ycm_extra_conf.pyc
-/build
-/obj*
diff --git a/CMakeLists.txt b/CMakeLists.txt
index ac224ff..d707ab5 100644
--- a/CMakeLists.txt
+++ b/CMakeLists.txt
@@ -1,14 +1,14 @@
project(cmocka C)
# Required cmake version
-cmake_minimum_required(VERSION 2.6.0)
+cmake_minimum_required(VERSION 3.3.0)
# global needed variables
set(APPLICATION_NAME ${PROJECT_NAME})
set(APPLICATION_VERSION_MAJOR "1")
set(APPLICATION_VERSION_MINOR "1")
-set(APPLICATION_VERSION_PATCH "1")
+set(APPLICATION_VERSION_PATCH "2")
set(APPLICATION_VERSION "${APPLICATION_VERSION_MAJOR}.${APPLICATION_VERSION_MINOR}.${APPLICATION_VERSION_PATCH}")
@@ -19,22 +19,22 @@ set(APPLICATION_VERSION "${APPLICATION_VERSION_MAJOR}.${APPLICATION_VERSION_MINO
# Increment AGE. Set REVISION to 0
# If the source code was changed, but there were no interface changes:
# Increment REVISION.
-set(LIBRARY_VERSION "0.4.1")
+set(LIBRARY_VERSION "0.5.0")
set(LIBRARY_SOVERSION "0")
# where to look first for cmake modules, before ${CMAKE_ROOT}/Modules/ is checked
set(CMAKE_MODULE_PATH
- ${CMAKE_SOURCE_DIR}/cmake/Modules
+ ${CMAKE_CURRENT_SOURCE_DIR}/cmake/Modules
)
# add definitions
include(DefineCMakeDefaults)
include(DefinePlatformDefaults)
-include(DefineCompilerFlags)
include(DefineInstallationPaths)
include(DefineOptions.cmake)
include(CPackConfig.cmake)
include(CheckSymbolExists)
+include(CompilerChecks.cmake)
# disallow in-source build
include(MacroEnsureOutOfSourceBuild)
@@ -86,3 +86,7 @@ install(
COMPONENT
devel
)
+
+# Add 'make dist' target which makes sure to invoke cmake before
+add_custom_target(dist
+ COMMAND ${CMAKE_MAKE_PROGRAM} package_source)
diff --git a/CPackConfig.cmake b/CPackConfig.cmake
index 8d427a3..a11f803 100644
--- a/CPackConfig.cmake
+++ b/CPackConfig.cmake
@@ -4,10 +4,10 @@
### general settings
set(CPACK_PACKAGE_NAME ${APPLICATION_NAME})
set(CPACK_PACKAGE_DESCRIPTION_SUMMARY "Unit testing framework for C with mock objects")
-set(CPACK_PACKAGE_DESCRIPTION_FILE "${CMAKE_SOURCE_DIR}/README")
+set(CPACK_PACKAGE_DESCRIPTION_FILE "${CMAKE_CURRENT_SOURCE_DIR}/README.md")
set(CPACK_PACKAGE_VENDOR "Andreas Schneider")
set(CPACK_PACKAGE_INSTALL_DIRECTORY ${CPACK_PACKAGE_NAME})
-set(CPACK_RESOURCE_FILE_LICENSE "${CMAKE_SOURCE_DIR}/COPYING")
+set(CPACK_RESOURCE_FILE_LICENSE "${CMAKE_CURRENT_SOURCE_DIR}/COPYING")
### versions
@@ -18,7 +18,7 @@ set(CPACK_PACKAGE_VERSION "${CPACK_PACKAGE_VERSION_MAJOR}.${CPACK_PACKAGE_VERSIO
### source generator
-set(CPACK_SOURCE_GENERATOR "TGZ")
+set(CPACK_SOURCE_GENERATOR "TXZ")
set(CPACK_SOURCE_IGNORE_FILES "~$;[.]swp$;/[.]svn/;/[.]git/;.gitignore;/obj*;tags;cscope.*;.ycm_extra_conf.pyc")
set(CPACK_SOURCE_PACKAGE_FILE_NAME "${CPACK_PACKAGE_NAME}-${CPACK_PACKAGE_VERSION}")
diff --git a/CTestConfig.cmake b/CTestConfig.cmake
index f93a981..8645258 100644
--- a/CTestConfig.cmake
+++ b/CTestConfig.cmake
@@ -4,7 +4,6 @@ set(CTEST_PROJECT_NAME "cmocka")
set(CTEST_NIGHTLY_START_TIME "01:00:00 UTC")
set(CTEST_DROP_METHOD "https")
-set(CTEST_DROP_SITE "mock.cryptomilk.org")
+set(CTEST_DROP_SITE "test.cmocka.org")
set(CTEST_DROP_LOCATION "/submit.php?project=${CTEST_PROJECT_NAME}")
set(CTEST_DROP_SITE_CDASH TRUE)
-
diff --git a/ChangeLog b/ChangeLog
index aa5835a..011041e 100644
--- a/ChangeLog
+++ b/ChangeLog
@@ -1,3 +1,11 @@
+Wed Aug 29 2018 Andreas Schneider <asn@cryptomilk.org>
+ * cmocka version 1.1.2
+ * Added function to filter tests (cmocka_set_test_filter)
+ * Added new mocking example (uptime)
+ * Fixed fixture error reporting
+ * Fixed compiler flags detection
+ * Some improvement for API documentation
+
Fri Apr 07 2016 Andreas Schneider <asn@cryptomilk.org>
* cmocka: version 1.1.1
* Fixed TAP output
diff --git a/CompilerChecks.cmake b/CompilerChecks.cmake
new file mode 100644
index 0000000..f8a7af1
--- /dev/null
+++ b/CompilerChecks.cmake
@@ -0,0 +1,93 @@
+include(AddCCompilerFlag)
+include(CheckCCompilerFlagSSP)
+
+if (UNIX)
+ #
+ # Check for -Werror turned on if possible
+ #
+ # This will prevent that compiler flags are detected incorrectly.
+ #
+ check_c_compiler_flag("-Werror" REQUIRED_FLAGS_WERROR)
+ if (REQUIRED_FLAGS_WERROR)
+ set(CMAKE_REQUIRED_FLAGS "-Werror")
+
+ if (PICKY_DEVELOPER)
+ list(APPEND SUPPORTED_COMPILER_FLAGS "-Werror")
+ endif()
+ endif()
+
+ add_c_compiler_flag("-std=gnu99" SUPPORTED_COMPILER_FLAGS)
+ add_c_compiler_flag("-pedantic" SUPPORTED_COMPILER_FLAGS)
+ add_c_compiler_flag("-pedantic-errors" SUPPORTED_COMPILER_FLAGS)
+ add_c_compiler_flag("-Wall" SUPPORTED_COMPILER_FLAGS)
+ add_c_compiler_flag("-Wshadow" SUPPORTED_COMPILER_FLAGS)
+ add_c_compiler_flag("-Wmissing-prototypes" SUPPORTED_COMPILER_FLAGS)
+ add_c_compiler_flag("-Wcast-align" SUPPORTED_COMPILER_FLAGS)
+ #add_c_compiler_flag("-Wcast-qual" SUPPORTED_COMPILER_FLAGS)
+ add_c_compiler_flag("-Werror=address" SUPPORTED_COMPILER_FLAGS)
+ add_c_compiler_flag("-Wstrict-prototypes" SUPPORTED_COMPILER_FLAGS)
+ add_c_compiler_flag("-Werror=strict-prototypes" SUPPORTED_COMPILER_FLAGS)
+ add_c_compiler_flag("-Wwrite-strings" SUPPORTED_COMPILER_FLAGS)
+ add_c_compiler_flag("-Werror=write-strings" SUPPORTED_COMPILER_FLAGS)
+ add_c_compiler_flag("-Werror-implicit-function-declaration" SUPPORTED_COMPILER_FLAGS)
+ add_c_compiler_flag("-Wpointer-arith" SUPPORTED_COMPILER_FLAGS)
+ add_c_compiler_flag("-Werror=pointer-arith" SUPPORTED_COMPILER_FLAGS)
+ add_c_compiler_flag("-Wdeclaration-after-statement" SUPPORTED_COMPILER_FLAGS)
+ add_c_compiler_flag("-Werror=declaration-after-statement" SUPPORTED_COMPILER_FLAGS)
+ add_c_compiler_flag("-Wreturn-type" SUPPORTED_COMPILER_FLAGS)
+ add_c_compiler_flag("-Werror=return-type" SUPPORTED_COMPILER_FLAGS)
+ add_c_compiler_flag("-Wuninitialized" SUPPORTED_COMPILER_FLAGS)
+ add_c_compiler_flag("-Werror=uninitialized" SUPPORTED_COMPILER_FLAGS)
+ add_c_compiler_flag("-Wimplicit-fallthrough" SUPPORTED_COMPILER_FLAGS)
+ add_c_compiler_flag("-Werror=strict-overflow" SUPPORTED_COMPILER_FLAGS)
+ add_c_compiler_flag("-Wstrict-overflow=2" SUPPORTED_COMPILER_FLAGS)
+ add_c_compiler_flag("-Wno-format-zero-length" SUPPORTED_COMPILER_FLAGS)
+
+ check_c_compiler_flag("-Wformat" REQUIRED_FLAGS_WFORMAT)
+ if (REQUIRED_FLAGS_WFORMAT)
+ list(APPEND SUPPORTED_COMPILER_FLAGS "-Wformat")
+ set(CMAKE_REQUIRED_FLAGS "${CMAKE_REQUIRED_FLAGS} -Wformat")
+ endif()
+ add_c_compiler_flag("-Wformat-security" SUPPORTED_COMPILER_FLAGS)
+ add_c_compiler_flag("-Werror=format-security" SUPPORTED_COMPILER_FLAGS)
+
+ # Allow zero for a variadic macro argument
+ add_c_compiler_flag("-Wno-gnu-zero-variadic-macro-arguments" SUPPORTED_COMPILER_FLAGS)
+
+ add_c_compiler_flag("-fno-common" SUPPORTED_COMPILER_FLAGS)
+
+ if (CMAKE_BUILD_TYPE)
+ string(TOLOWER "${CMAKE_BUILD_TYPE}" CMAKE_BUILD_TYPE_LOWER)
+ if (CMAKE_BUILD_TYPE_LOWER MATCHES (release|relwithdebinfo|minsizerel))
+ add_c_compiler_flag("-Wp,-D_FORTIFY_SOURCE=2" SUPPORTED_COMPILER_FLAGS)
+ endif()
+ endif()
+
+ check_c_compiler_flag_ssp("-fstack-protector" WITH_STACK_PROTECTOR)
+ if (WITH_STACK_PROTECTOR)
+ list(APPEND SUPPORTED_COMPILER_FLAGS "-fstack-protector")
+ endif()
+
+ if (PICKY_DEVELOPER)
+ add_c_compiler_flag("-Wno-error=deprecated-declarations" SUPPORTED_COMPILER_FLAGS)
+ add_c_compiler_flag("-Wno-error=tautological-compare" SUPPORTED_COMPILER_FLAGS)
+ endif()
+
+ # Unset CMAKE_REQUIRED_FLAGS
+ unset(CMAKE_REQUIRED_FLAGS)
+endif()
+
+if (MSVC)
+ add_c_compiler_flag("/D _CRT_SECURE_CPP_OVERLOAD_STANDARD_NAMES=1" SUPPORTED_COMPILER_FLAGS)
+ add_c_compiler_flag("/D _CRT_SECURE_CPP_OVERLOAD_STANDARD_NAMES_COUNT=1" SUPPORTED_COMPILER_FLAGS)
+ add_c_compiler_flag("/D _CRT_NONSTDC_NO_WARNINGS=1" SUPPORTED_COMPILER_FLAGS)
+ add_c_compiler_flag("/D _CRT_SECURE_NO_WARNINGS=1" SUPPORTED_COMPILER_FLAGS)
+endif()
+
+# This removes this annoying warning
+# "warning: 'BN_CTX_free' is deprecated: first deprecated in OS X 10.7 [-Wdeprecated-declarations]"
+if (OSX)
+ add_c_compiler_flag("-Wno-deprecated-declarations" SUPPORTED_COMPILER_FLAGS)
+endif()
+
+set(DEFAULT_C_COMPILE_FLAGS ${SUPPORTED_COMPILER_FLAGS} CACHE INTERNAL "Default C Compiler Flags" FORCE)
diff --git a/DefineOptions.cmake b/DefineOptions.cmake
index 7564a22..bca0848 100644
--- a/DefineOptions.cmake
+++ b/DefineOptions.cmake
@@ -1,6 +1,7 @@
option(WITH_STATIC_LIB "Build with a static library" OFF)
option(WITH_CMOCKERY_SUPPORT "Install a cmockery header" OFF)
option(UNIT_TESTING "Build with unit testing" OFF)
+option(PICKY_DEVELOPER "Build with picky developer flags" OFF)
if (UNIT_TESTING)
set(WITH_STATIC_LIB ON)
diff --git a/INSTALL b/INSTALL.md
index 8b438d5..cd4638e 100644
--- a/INSTALL
+++ b/INSTALL.md
@@ -26,7 +26,8 @@ On Windows you should choose a makefile gernerator with -G, for example:
cmake -G "Visual Studio 12 2013" -DCMAKE_BUILD_TYPE=Debug /path/to/source
You can also use the CMake GUI which is shipped with CMake. It will list all
-available generators for MSVC on Windows.
+available generators for MSVC on Windows. We only support Visual Studio 2013
+or newer which supports C99.
### CMake standard options
Here is a list of the most interesting options provided out of the box by
@@ -69,7 +70,7 @@ If you want to install cmocka after compilation run:
The cmocka library can be found in the `build/src` directory.
You can run the binaries in `build/examples/*` which is a
-are exsample tests.
+are example tests.
## Testing
diff --git a/README b/README.md
index b432e8e..62d99cb 100644
--- a/README
+++ b/README.md
@@ -1,15 +1,21 @@
-CMOCKA
-=======
+cmocka
+======
-cmocka is a fork for Google's cmockery unit testing framework to fix bugs and
-support it in future.
-See https://code.google.com/p/cmockery/
+cmocka is an elegant unit testing framework for C with support for mock
+objects. It only requires the standard C library, works on a range of computing
+platforms (including embedded) and with different compilers.
For information about how to use the cmocka unit testing framework see
-doc/index.html.
+doc/index.html or https://api.cmocka.org/.
-COMPILING
+Compiling
---------
+
To compile the cmocka library and example applications run, create a build dir,
and in the build dir call 'cmake /path/to/cmocka' followed by 'make'. On
Windows you can use the cmake gui. More details can be found in the INSTALL file.
+
+Website
+-------
+
+https://cmocka.org
diff --git a/cmake/Modules/AddCCompilerFlag.cmake b/cmake/Modules/AddCCompilerFlag.cmake
new file mode 100644
index 0000000..c24c215
--- /dev/null
+++ b/cmake/Modules/AddCCompilerFlag.cmake
@@ -0,0 +1,21 @@
+#
+# add_c_compiler_flag("-Werror" SUPPORTED_CFLAGS)
+#
+# Copyright (c) 2018 Andreas Schneider <asn@cryptomilk.org>
+#
+# Redistribution and use is allowed according to the terms of the BSD license.
+# For details see the accompanying COPYING-CMAKE-SCRIPTS file.
+
+include(CheckCCompilerFlag)
+
+macro(add_c_compiler_flag _COMPILER_FLAG _OUTPUT_VARIABLE)
+ string(TOUPPER ${_COMPILER_FLAG} _COMPILER_FLAG_NAME)
+ string(REGEX REPLACE "^-" "" _COMPILER_FLAG_NAME "${_COMPILER_FLAG_NAME}")
+ string(REGEX REPLACE "(-|=|\ )" "_" _COMPILER_FLAG_NAME "${_COMPILER_FLAG_NAME}")
+
+ check_c_compiler_flag("${_COMPILER_FLAG}" WITH_${_COMPILER_FLAG_NAME}_FLAG)
+ if (WITH_${_COMPILER_FLAG_NAME}_FLAG)
+ #string(APPEND ${_OUTPUT_VARIABLE} "${_COMPILER_FLAG} ")
+ list(APPEND ${_OUTPUT_VARIABLE} ${_COMPILER_FLAG})
+ endif()
+endmacro()
diff --git a/cmake/Modules/CheckCCompilerFlagSSP.cmake b/cmake/Modules/CheckCCompilerFlagSSP.cmake
index 2fe4395..e421091 100644
--- a/cmake/Modules/CheckCCompilerFlagSSP.cmake
+++ b/cmake/Modules/CheckCCompilerFlagSSP.cmake
@@ -15,12 +15,15 @@
# Redistribution and use is allowed according to the terms of the BSD license.
# For details see the accompanying COPYING-CMAKE-SCRIPTS file.
-
+# Requires cmake 3.10
+#include_guard(GLOBAL)
include(CheckCSourceCompiles)
-function(CHECK_C_COMPILER_FLAG_SSP _FLAG _RESULT)
+macro(CHECK_C_COMPILER_FLAG_SSP _FLAG _RESULT)
set(SAFE_CMAKE_REQUIRED_DEFINITIONS "${CMAKE_REQUIRED_DEFINITIONS}")
set(CMAKE_REQUIRED_DEFINITIONS "${_FLAG}")
+
check_c_source_compiles("int main(int argc, char **argv) { char buffer[256]; return buffer[argc]=0;}" ${_RESULT})
+
set(CMAKE_REQUIRED_DEFINITIONS "${SAFE_CMAKE_REQUIRED_DEFINITIONS}")
-endfunction(CHECK_C_COMPILER_FLAG_SSP)
+endmacro(CHECK_C_COMPILER_FLAG_SSP)
diff --git a/cmake/Modules/DefineCompilerFlags.cmake b/cmake/Modules/DefineCompilerFlags.cmake
deleted file mode 100644
index cef5dc1..0000000
--- a/cmake/Modules/DefineCompilerFlags.cmake
+++ /dev/null
@@ -1,79 +0,0 @@
-# define system dependent compiler flags
-
-include(CheckCCompilerFlag)
-include(CheckCCompilerFlagSSP)
-
-if (UNIX AND NOT WIN32)
- #
- # Define GNUCC compiler flags
- #
- if (${CMAKE_C_COMPILER_ID} MATCHES "(GNU|Clang)")
-
- # add -Wconversion ?
- set(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} -std=gnu99 -pedantic -pedantic-errors")
- set(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} -Wall -Wextra -Wshadow -Wmissing-prototypes -Wdeclaration-after-statement")
- set(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} -Wunused -Wfloat-equal -Wpointer-arith -Wwrite-strings -Wformat-security")
- set(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} -Wmissing-format-attribute -Wundef -Wstrict-prototypes")
-
- # with -fPIC
- check_c_compiler_flag("-fPIC" WITH_FPIC)
- if (WITH_FPIC)
- set(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} -fPIC")
- endif (WITH_FPIC)
-
- check_c_compiler_flag_ssp("-fstack-protector" WITH_STACK_PROTECTOR)
- if (WITH_STACK_PROTECTOR)
- set(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} -fstack-protector")
- endif (WITH_STACK_PROTECTOR)
-
- if (CMAKE_BUILD_TYPE)
- string(TOLOWER "${CMAKE_BUILD_TYPE}" CMAKE_BUILD_TYPE_LOWER)
- if (CMAKE_BUILD_TYPE_LOWER MATCHES (release|relwithdebinfo|minsizerel))
- check_c_compiler_flag("-Wp,-D_FORTIFY_SOURCE=2" WITH_FORTIFY_SOURCE)
- if (WITH_FORTIFY_SOURCE)
- set(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} -Wp,-D_FORTIFY_SOURCE=2")
- endif (WITH_FORTIFY_SOURCE)
- endif()
- endif()
-
- set(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} -D_GNU_SOURCE")
- endif (${CMAKE_C_COMPILER_ID} MATCHES "(GNU|Clang)")
-
- #
- # Check for large filesystem support
- #
- if (CMAKE_SIZEOF_VOID_P MATCHES "8")
- # with large file support
- execute_process(
- COMMAND
- getconf LFS64_CFLAGS
- OUTPUT_VARIABLE
- _lfs_CFLAGS
- ERROR_QUIET
- OUTPUT_STRIP_TRAILING_WHITESPACE
- )
- else (CMAKE_SIZEOF_VOID_P MATCHES "8")
- # with large file support
- execute_process(
- COMMAND
- getconf LFS_CFLAGS
- OUTPUT_VARIABLE
- _lfs_CFLAGS
- ERROR_QUIET
- OUTPUT_STRIP_TRAILING_WHITESPACE
- )
- endif (CMAKE_SIZEOF_VOID_P MATCHES "8")
- if (_lfs_CFLAGS)
- string(REGEX REPLACE "[\r\n]" " " "${_lfs_CFLAGS}" "${${_lfs_CFLAGS}}")
- set(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} ${_lfs_CFLAGS}")
- endif (_lfs_CFLAGS)
-
-endif (UNIX AND NOT WIN32)
-
-if (MSVC)
- # Use secure functions by defaualt and suppress warnings about
- #"deprecated" functions
- set(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} /D _CRT_SECURE_CPP_OVERLOAD_STANDARD_NAMES=1")
- set(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} /D _CRT_SECURE_CPP_OVERLOAD_STANDARD_NAMES_COUNT=1")
- set(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} /D _CRT_NONSTDC_NO_WARNINGS=1 /D _CRT_SECURE_NO_WARNINGS=1")
-endif (MSVC)
diff --git a/cmake/Modules/FindNSIS.cmake b/cmake/Modules/FindNSIS.cmake
index 08d839b..9f1ab17 100644
--- a/cmake/Modules/FindNSIS.cmake
+++ b/cmake/Modules/FindNSIS.cmake
@@ -1,6 +1,10 @@
# - Try to find NSIS
# Once done this will define
#
+# NSIS_ROOT_PATH - Set this variable to the root installation of NSIS
+#
+# Read-Only variables:
+#
# NSIS_FOUND - system has NSIS
# NSIS_MAKE - NSIS creator executable
#
@@ -17,17 +21,16 @@
#
if (WIN32)
- set(_NSIS_ROOT_HINTS
- "[HKEY_LOCAL_MACHINE\\SOFTWARE\\Wow6432Node\\NSIS;Default]")
+ set(_x86 "(x86)")
set(_NSIS_ROOT_PATHS
- $ENV{PROGRAMFILES}/NSIS)
+ "$ENV{ProgramFiles}/NSIS"
+ "$ENV{ProgramFiles${_x86}}/NSIS"
+ "[HKEY_LOCAL_MACHINE\\SOFTWARE\\Wow6432Node\\NSIS;Default]")
find_path(NSIS_ROOT_PATH
NAMES
Include/Library.nsh
- HINTS
- ${_NSIS_ROOT_HINTS}
PATHS
${_NSIS_ROOT_PATHS}
)
diff --git a/cmake/Modules/UseDoxygen.cmake b/cmake/Modules/UseDoxygen.cmake
deleted file mode 100644
index 72c384d..0000000
--- a/cmake/Modules/UseDoxygen.cmake
+++ /dev/null
@@ -1,140 +0,0 @@
-# - Run Doxygen
-#
-# Adds a doxygen target that runs doxygen to generate the html
-# and optionally the LaTeX API documentation.
-# The doxygen target is added to the doc target as a dependency.
-# i.e.: the API documentation is built with:
-# make doc
-#
-# USAGE: GLOBAL INSTALL
-#
-# Install it with:
-# cmake ./ && sudo make install
-# Add the following to the CMakeLists.txt of your project:
-# include(UseDoxygen OPTIONAL)
-# Optionally copy Doxyfile.in in the directory of CMakeLists.txt and edit it.
-#
-# USAGE: INCLUDE IN PROJECT
-#
-# set(CMAKE_MODULE_PATH ${CMAKE_CURRENT_SOURCE_DIR})
-# include(UseDoxygen)
-# Add the Doxyfile.in and UseDoxygen.cmake files to the projects source directory.
-#
-#
-# CONFIGURATION
-#
-# To configure Doxygen you can edit Doxyfile.in and set some variables in cmake.
-# Variables you may define are:
-# DOXYFILE_SOURCE_DIR - Path where the Doxygen input files are.
-# Defaults to the current source directory.
-# DOXYFILE_EXTRA_SOURCES - Additional source diretories/files for Doxygen to scan.
-# The Paths should be in double quotes and separated by space. e.g.:
-# "${CMAKE_CURRENT_BINARY_DIR}/foo.c" "${CMAKE_CURRENT_BINARY_DIR}/bar/"
-#
-# DOXYFILE_OUTPUT_DIR - Path where the Doxygen output is stored.
-# Defaults to "${CMAKE_CURRENT_BINARY_DIR}/doc".
-#
-# DOXYFILE_LATEX - ON/OFF; Set to "ON" if you want the LaTeX documentation
-# to be built.
-# DOXYFILE_LATEX_DIR - Directory relative to DOXYFILE_OUTPUT_DIR where
-# the Doxygen LaTeX output is stored. Defaults to "latex".
-#
-# DOXYFILE_HTML_DIR - Directory relative to DOXYFILE_OUTPUT_DIR where
-# the Doxygen html output is stored. Defaults to "html".
-#
-
-#
-# Copyright (c) 2009, 2010, 2011 Tobias Rautenkranz <tobias@rautenkranz.ch>
-#
-# Redistribution and use is allowed according to the terms of the New
-# BSD license.
-# For details see the accompanying COPYING-CMAKE-SCRIPTS file.
-#
-
-macro(usedoxygen_set_default name value type docstring)
- if(NOT DEFINED "${name}")
- set("${name}" "${value}" CACHE "${type}" "${docstring}")
- endif()
-endmacro()
-
-find_package(Doxygen)
-
-if(DOXYGEN_FOUND)
- find_file(DOXYFILE_IN "Doxyfile.in"
- PATHS "${CMAKE_CURRENT_SOURCE_DIR}" "${CMAKE_ROOT}/Modules/"
- NO_DEFAULT_PATH
- DOC "Path to the doxygen configuration template file")
- set(DOXYFILE "${CMAKE_CURRENT_BINARY_DIR}/Doxyfile")
- include(FindPackageHandleStandardArgs)
- find_package_handle_standard_args(DOXYFILE_IN DEFAULT_MSG "DOXYFILE_IN")
-endif()
-
-if(DOXYGEN_FOUND AND DOXYFILE_IN_FOUND)
- usedoxygen_set_default(DOXYFILE_OUTPUT_DIR "${CMAKE_CURRENT_BINARY_DIR}/doc"
- PATH "Doxygen output directory")
- usedoxygen_set_default(DOXYFILE_HTML_DIR "html"
- STRING "Doxygen HTML output directory")
- usedoxygen_set_default(DOXYFILE_SOURCE_DIR "${CMAKE_CURRENT_SOURCE_DIR}"
- PATH "Input files source directory")
- usedoxygen_set_default(DOXYFILE_EXTRA_SOURCE_DIRS ""
- STRING "Additional source files/directories separated by space")
- set(DOXYFILE_SOURCE_DIRS "\"${DOXYFILE_SOURCE_DIR}\" ${DOXYFILE_EXTRA_SOURCES}")
-
- usedoxygen_set_default(DOXYFILE_LATEX YES BOOL "Generate LaTeX API documentation" OFF)
- usedoxygen_set_default(DOXYFILE_LATEX_DIR "latex" STRING "LaTex output directory")
-
- mark_as_advanced(DOXYFILE_OUTPUT_DIR DOXYFILE_HTML_DIR DOXYFILE_LATEX_DIR
- DOXYFILE_SOURCE_DIR DOXYFILE_EXTRA_SOURCE_DIRS DOXYFILE_IN)
-
-
- set_property(DIRECTORY
- APPEND PROPERTY
- ADDITIONAL_MAKE_CLEAN_FILES
- "${DOXYFILE_OUTPUT_DIR}/${DOXYFILE_HTML_DIR}")
-
- add_custom_target(doxygen
- COMMAND "${DOXYGEN_EXECUTABLE}"
- "${DOXYFILE}"
- COMMENT "Writing documentation to ${DOXYFILE_OUTPUT_DIR}..."
- WORKING_DIRECTORY "${CMAKE_CURRENT_SOURCE_DIR}")
-
- set(DOXYFILE_DOT "NO")
- if(DOXYGEN_DOT_EXECUTABLE)
- set(DOXYFILE_DOT "YES")
- endif()
-
- ## LaTeX
- set(DOXYFILE_PDFLATEX "NO")
-
- set_property(DIRECTORY APPEND PROPERTY
- ADDITIONAL_MAKE_CLEAN_FILES
- "${DOXYFILE_OUTPUT_DIR}/${DOXYFILE_LATEX_DIR}")
-
- if(DOXYFILE_LATEX STREQUAL "ON")
- set(DOXYFILE_GENERATE_LATEX "YES")
- find_package(LATEX)
- find_program(DOXYFILE_MAKE make)
- mark_as_advanced(DOXYFILE_MAKE)
- if(LATEX_COMPILER AND MAKEINDEX_COMPILER AND DOXYFILE_MAKE)
- if(PDFLATEX_COMPILER)
- set(DOXYFILE_PDFLATEX "YES")
- endif()
-
- add_custom_command(TARGET doxygen
- POST_BUILD
- COMMAND "${DOXYFILE_MAKE}"
- COMMENT "Running LaTeX for Doxygen documentation in ${DOXYFILE_OUTPUT_DIR}/${DOXYFILE_LATEX_DIR}..."
- WORKING_DIRECTORY "${DOXYFILE_OUTPUT_DIR}/${DOXYFILE_LATEX_DIR}")
- else()
- set(DOXYGEN_LATEX "NO")
- endif()
- else()
- set(DOXYFILE_GENERATE_LATEX "NO")
- endif()
-
-
- configure_file("${DOXYFILE_IN}" "${DOXYFILE}" @ONLY)
-
- add_custom_target(doc)
- add_dependencies(doc doxygen)
-endif()
diff --git a/cmocka-config.cmake.in b/cmocka-config.cmake.in
index 317f0a2..e92ad03 100644
--- a/cmocka-config.cmake.in
+++ b/cmocka-config.cmake.in
@@ -9,3 +9,5 @@ endif()
set(CMOCKA_LIBRARY @LIB_INSTALL_DIR@/@CMOCKA_LIBRARY_NAME@)
set(CMOCKA_LIBRARIES @LIB_INSTALL_DIR@/@CMOCKA_LIBRARY_NAME@)
+
+mark_as_advanced(CMOCKA_LIBRARY CMOCKA_INCLUDE_DIR)
diff --git a/doc/CMakeLists.txt b/doc/CMakeLists.txt
index 3124281..4e3dc23 100644
--- a/doc/CMakeLists.txt
+++ b/doc/CMakeLists.txt
@@ -1,5 +1,41 @@
#
# Build the documentation
#
-include(UseDoxygen OPTIONAL)
+find_package(Doxygen)
+if (DOXYGEN_FOUND)
+ set(DOXYGEN_PROJECT_NAME ${APPLICATION_NAME})
+ set(DOXYGEN_PROJECT_NUMBER ${APPLICATION_VERSION})
+ set(DOXYGEN_PROJECT_BRIEF "Unit testing library with mock support")
+
+ set(DOXYGEN_TAB_SIZE 4)
+ set(DOXYGEN_OPTIMIZE_OUTPUT_FOR_C YES)
+ set(DOXYGEN_MARKDOWN_SUPPORT YES)
+
+ set(DOXYGEN_PREDEFINED DOXYGEN
+ CMOCKA_PRINTF_ATTRIBUTE(x,y))
+
+ set(DOXYGEN_EXCLUDE ${CMAKE_CURRENT_SOURCE_DIR}/that_style)
+ set(DOXYGEN_HTML_HEADER ${CMAKE_CURRENT_SOURCE_DIR}/that_style/header.html)
+ set(DOXYGEN_HTML_EXTRA_STYLESHEET ${CMAKE_CURRENT_SOURCE_DIR}/that_style/that_style.css)
+ set(DOXYGEN_HTML_EXTRA_FILES ${CMAKE_CURRENT_SOURCE_DIR}/that_style/img/nav_edge_left.svg
+ ${CMAKE_CURRENT_SOURCE_DIR}/that_style/img/nav_edge_right.svg
+ ${CMAKE_CURRENT_SOURCE_DIR}/that_style/img/nav_edge_inter.svg
+ ${CMAKE_CURRENT_SOURCE_DIR}/that_style/img/sync_off.png
+ ${CMAKE_CURRENT_SOURCE_DIR}/that_style/img/sync_on.png
+ ${CMAKE_CURRENT_SOURCE_DIR}/that_style/img/splitbar_handle.svg
+ ${CMAKE_CURRENT_SOURCE_DIR}/that_style/img/doc.svg
+ ${CMAKE_CURRENT_SOURCE_DIR}/that_style/img/mag_glass.svg
+ ${CMAKE_CURRENT_SOURCE_DIR}/that_style/img/folderclosed.svg
+ ${CMAKE_CURRENT_SOURCE_DIR}/that_style/img/folderopen.svg
+ ${CMAKE_CURRENT_SOURCE_DIR}/that_style/js/striped_bg.js)
+
+ set(_doxyfile_template "${CMAKE_BINARY_DIR}/CMakeDoxyfile.in")
+ set(_target_doxyfile "${CMAKE_CURRENT_BINARY_DIR}/Doxyfile.docs")
+ configure_file("${_doxyfile_template}" "${_target_doxyfile}")
+
+ doxygen_add_docs(docs
+ ${cmocka-library_SOURCE_DIR}
+ ${cmocka-headers_SOURCE_DIR}
+ ${CMAKE_CURRENT_SOURCE_DIR})
+endif(DOXYGEN_FOUND)
diff --git a/doc/Doxyfile.in b/doc/Doxyfile.in
deleted file mode 100644
index 221beba..0000000
--- a/doc/Doxyfile.in
+++ /dev/null
@@ -1,2442 +0,0 @@
-# Doxyfile 1.8.12
-
-# This file describes the settings to be used by the documentation system
-# doxygen (www.doxygen.org) for a project.
-#
-# All text after a double hash (##) is considered a comment and is placed in
-# front of the TAG it is preceding.
-#
-# All text after a single hash (#) is considered a comment and will be ignored.
-# The format is:
-# TAG = value [value, ...]
-# For lists, items can also be appended using:
-# TAG += value [value, ...]
-# Values that contain spaces should be placed between quotes (\" \").
-
-#---------------------------------------------------------------------------
-# Project related configuration options
-#---------------------------------------------------------------------------
-
-# This tag specifies the encoding used for all characters in the config file
-# that follow. The default is UTF-8 which is also the encoding used for all text
-# before the first occurrence of this tag. Doxygen uses libiconv (or the iconv
-# built into libc) for the transcoding. See http://www.gnu.org/software/libiconv
-# for the list of possible encodings.
-# The default value is: UTF-8.
-
-DOXYFILE_ENCODING = UTF-8
-
-# The PROJECT_NAME tag is a single word (or a sequence of words surrounded by
-# double-quotes, unless you are using Doxywizard) that should identify the
-# project for which the documentation is generated. This name is used in the
-# title of most generated pages and in a few other places.
-# The default value is: My Project.
-
-PROJECT_NAME = @APPLICATION_NAME@
-
-# The PROJECT_NUMBER tag can be used to enter a project or revision number. This
-# could be handy for archiving the generated documentation or if some version
-# control system is used.
-
-PROJECT_NUMBER = @APPLICATION_VERSION@
-
-# Using the PROJECT_BRIEF tag one can provide an optional one line description
-# for a project that appears at the top of each page and should give viewer a
-# quick idea about the purpose of the project. Keep the description short.
-
-PROJECT_BRIEF =
-
-# With the PROJECT_LOGO tag one can specify a logo or an icon that is included
-# in the documentation. The maximum height of the logo should not exceed 55
-# pixels and the maximum width should not exceed 200 pixels. Doxygen will copy
-# the logo to the output directory.
-
-PROJECT_LOGO =
-
-# The OUTPUT_DIRECTORY tag is used to specify the (relative or absolute) path
-# into which the generated documentation will be written. If a relative path is
-# entered, it will be relative to the location where doxygen was started. If
-# left blank the current directory will be used.
-
-OUTPUT_DIRECTORY = "@CMAKE_CURRENT_BINARY_DIR@"
-
-# If the CREATE_SUBDIRS tag is set to YES then doxygen will create 4096 sub-
-# directories (in 2 levels) under the output directory of each output format and
-# will distribute the generated files over these directories. Enabling this
-# option can be useful when feeding doxygen a huge amount of source files, where
-# putting all generated files in the same directory would otherwise causes
-# performance problems for the file system.
-# The default value is: NO.
-
-CREATE_SUBDIRS = NO
-
-# If the ALLOW_UNICODE_NAMES tag is set to YES, doxygen will allow non-ASCII
-# characters to appear in the names of generated files. If set to NO, non-ASCII
-# characters will be escaped, for example _xE3_x81_x84 will be used for Unicode
-# U+3044.
-# The default value is: NO.
-
-ALLOW_UNICODE_NAMES = NO
-
-# The OUTPUT_LANGUAGE tag is used to specify the language in which all
-# documentation generated by doxygen is written. Doxygen will use this
-# information to generate all constant output in the proper language.
-# Possible values are: Afrikaans, Arabic, Armenian, Brazilian, Catalan, Chinese,
-# Chinese-Traditional, Croatian, Czech, Danish, Dutch, English (United States),
-# Esperanto, Farsi (Persian), Finnish, French, German, Greek, Hungarian,
-# Indonesian, Italian, Japanese, Japanese-en (Japanese with English messages),
-# Korean, Korean-en (Korean with English messages), Latvian, Lithuanian,
-# Macedonian, Norwegian, Persian (Farsi), Polish, Portuguese, Romanian, Russian,
-# Serbian, Serbian-Cyrillic, Slovak, Slovene, Spanish, Swedish, Turkish,
-# Ukrainian and Vietnamese.
-# The default value is: English.
-
-OUTPUT_LANGUAGE = English
-
-# If the BRIEF_MEMBER_DESC tag is set to YES, doxygen will include brief member
-# descriptions after the members that are listed in the file and class
-# documentation (similar to Javadoc). Set to NO to disable this.
-# The default value is: YES.
-
-BRIEF_MEMBER_DESC = YES
-
-# If the REPEAT_BRIEF tag is set to YES, doxygen will prepend the brief
-# description of a member or function before the detailed description
-#
-# Note: If both HIDE_UNDOC_MEMBERS and BRIEF_MEMBER_DESC are set to NO, the
-# brief descriptions will be completely suppressed.
-# The default value is: YES.
-
-REPEAT_BRIEF = YES
-
-# This tag implements a quasi-intelligent brief description abbreviator that is
-# used to form the text in various listings. Each string in this list, if found
-# as the leading text of the brief description, will be stripped from the text
-# and the result, after processing the whole list, is used as the annotated
-# text. Otherwise, the brief description is used as-is. If left blank, the
-# following values are used ($name is automatically replaced with the name of
-# the entity):The $name class, The $name widget, The $name file, is, provides,
-# specifies, contains, represents, a, an and the.
-
-ABBREVIATE_BRIEF = "The $name class" \
- "The $name widget" \
- "The $name file" \
- is \
- provides \
- specifies \
- contains \
- represents \
- a \
- an \
- the
-
-# If the ALWAYS_DETAILED_SEC and REPEAT_BRIEF tags are both set to YES then
-# doxygen will generate a detailed section even if there is only a brief
-# description.
-# The default value is: NO.
-
-ALWAYS_DETAILED_SEC = NO
-
-# If the INLINE_INHERITED_MEMB tag is set to YES, doxygen will show all
-# inherited members of a class in the documentation of that class as if those
-# members were ordinary class members. Constructors, destructors and assignment
-# operators of the base classes will not be shown.
-# The default value is: NO.
-
-INLINE_INHERITED_MEMB = NO
-
-# If the FULL_PATH_NAMES tag is set to YES, doxygen will prepend the full path
-# before files name in the file list and in the header files. If set to NO the
-# shortest path that makes the file name unique will be used
-# The default value is: YES.
-
-FULL_PATH_NAMES = YES
-
-# The STRIP_FROM_PATH tag can be used to strip a user-defined part of the path.
-# Stripping is only done if one of the specified strings matches the left-hand
-# part of the path. The tag can be used to show relative paths in the file list.
-# If left blank the directory from which doxygen is run is used as the path to
-# strip.
-#
-# Note that you can specify absolute paths here, but also relative paths, which
-# will be relative from the directory where doxygen is started.
-# This tag requires that the tag FULL_PATH_NAMES is set to YES.
-
-STRIP_FROM_PATH = "@CMAKE_SOURCE_DIR@"
-
-# The STRIP_FROM_INC_PATH tag can be used to strip a user-defined part of the
-# path mentioned in the documentation of a class, which tells the reader which
-# header file to include in order to use a class. If left blank only the name of
-# the header file containing the class definition is used. Otherwise one should
-# specify the list of include paths that are normally passed to the compiler
-# using the -I flag.
-
-STRIP_FROM_INC_PATH = "@CMAKE_SOURCE_DIR@"
-
-# If the SHORT_NAMES tag is set to YES, doxygen will generate much shorter (but
-# less readable) file names. This can be useful is your file systems doesn't
-# support long names like on DOS, Mac, or CD-ROM.
-# The default value is: NO.
-
-SHORT_NAMES = NO
-
-# If the JAVADOC_AUTOBRIEF tag is set to YES then doxygen will interpret the
-# first line (until the first dot) of a Javadoc-style comment as the brief
-# description. If set to NO, the Javadoc-style will behave just like regular Qt-
-# style comments (thus requiring an explicit @brief command for a brief
-# description.)
-# The default value is: NO.
-
-JAVADOC_AUTOBRIEF = YES
-
-# If the QT_AUTOBRIEF tag is set to YES then doxygen will interpret the first
-# line (until the first dot) of a Qt-style comment as the brief description. If
-# set to NO, the Qt-style will behave just like regular Qt-style comments (thus
-# requiring an explicit \brief command for a brief description.)
-# The default value is: NO.
-
-QT_AUTOBRIEF = NO
-
-# The MULTILINE_CPP_IS_BRIEF tag can be set to YES to make doxygen treat a
-# multi-line C++ special comment block (i.e. a block of //! or /// comments) as
-# a brief description. This used to be the default behavior. The new default is
-# to treat a multi-line C++ comment block as a detailed description. Set this
-# tag to YES if you prefer the old behavior instead.
-#
-# Note that setting this tag to YES also means that rational rose comments are
-# not recognized any more.
-# The default value is: NO.
-
-MULTILINE_CPP_IS_BRIEF = NO
-
-# If the INHERIT_DOCS tag is set to YES then an undocumented member inherits the
-# documentation from any documented member that it re-implements.
-# The default value is: YES.
-
-INHERIT_DOCS = YES
-
-# If the SEPARATE_MEMBER_PAGES tag is set to YES then doxygen will produce a new
-# page for each member. If set to NO, the documentation of a member will be part
-# of the file/class/namespace that contains it.
-# The default value is: NO.
-
-SEPARATE_MEMBER_PAGES = NO
-
-# The TAB_SIZE tag can be used to set the number of spaces in a tab. Doxygen
-# uses this value to replace tabs by spaces in code fragments.
-# Minimum value: 1, maximum value: 16, default value: 4.
-
-TAB_SIZE = 2
-
-# This tag can be used to specify a number of aliases that act as commands in
-# the documentation. An alias has the form:
-# name=value
-# For example adding
-# "sideeffect=@par Side Effects:\n"
-# will allow you to put the command \sideeffect (or @sideeffect) in the
-# documentation, which will result in a user-defined paragraph with heading
-# "Side Effects:". You can put \n's in the value part of an alias to insert
-# newlines.
-
-ALIASES =
-
-# This tag can be used to specify a number of word-keyword mappings (TCL only).
-# A mapping has the form "name=value". For example adding "class=itcl::class"
-# will allow you to use the command class in the itcl::class meaning.
-
-TCL_SUBST =
-
-# Set the OPTIMIZE_OUTPUT_FOR_C tag to YES if your project consists of C sources
-# only. Doxygen will then generate output that is more tailored for C. For
-# instance, some of the names that are used will be different. The list of all
-# members will be omitted, etc.
-# The default value is: NO.
-
-OPTIMIZE_OUTPUT_FOR_C = YES
-
-# Set the OPTIMIZE_OUTPUT_JAVA tag to YES if your project consists of Java or
-# Python sources only. Doxygen will then generate output that is more tailored
-# for that language. For instance, namespaces will be presented as packages,
-# qualified scopes will look different, etc.
-# The default value is: NO.
-
-OPTIMIZE_OUTPUT_JAVA = NO
-
-# Set the OPTIMIZE_FOR_FORTRAN tag to YES if your project consists of Fortran
-# sources. Doxygen will then generate output that is tailored for Fortran.
-# The default value is: NO.
-
-OPTIMIZE_FOR_FORTRAN = NO
-
-# Set the OPTIMIZE_OUTPUT_VHDL tag to YES if your project consists of VHDL
-# sources. Doxygen will then generate output that is tailored for VHDL.
-# The default value is: NO.
-
-OPTIMIZE_OUTPUT_VHDL = NO
-
-# Doxygen selects the parser to use depending on the extension of the files it
-# parses. With this tag you can assign which parser to use for a given
-# extension. Doxygen has a built-in mapping, but you can override or extend it
-# using this tag. The format is ext=language, where ext is a file extension, and
-# language is one of the parsers supported by doxygen: IDL, Java, Javascript,
-# C#, C, C++, D, PHP, Objective-C, Python, Fortran (fixed format Fortran:
-# FortranFixed, free formatted Fortran: FortranFree, unknown formatted Fortran:
-# Fortran. In the later case the parser tries to guess whether the code is fixed
-# or free formatted code, this is the default for Fortran type files), VHDL. For
-# instance to make doxygen treat .inc files as Fortran files (default is PHP),
-# and .f files as C (default is Fortran), use: inc=Fortran f=C.
-#
-# Note: For files without extension you can use no_extension as a placeholder.
-#
-# Note that for custom extensions you also need to set FILE_PATTERNS otherwise
-# the files are not read by doxygen.
-
-EXTENSION_MAPPING =
-
-# If the MARKDOWN_SUPPORT tag is enabled then doxygen pre-processes all comments
-# according to the Markdown format, which allows for more readable
-# documentation. See http://daringfireball.net/projects/markdown/ for details.
-# The output of markdown processing is further processed by doxygen, so you can
-# mix doxygen, HTML, and XML commands with Markdown formatting. Disable only in
-# case of backward compatibilities issues.
-# The default value is: YES.
-
-MARKDOWN_SUPPORT = YES
-
-# When the TOC_INCLUDE_HEADINGS tag is set to a non-zero value, all headings up
-# to that level are automatically included in the table of contents, even if
-# they do not have an id attribute.
-# Note: This feature currently applies only to Markdown headings.
-# Minimum value: 0, maximum value: 99, default value: 0.
-# This tag requires that the tag MARKDOWN_SUPPORT is set to YES.
-
-TOC_INCLUDE_HEADINGS = 0
-
-# When enabled doxygen tries to link words that correspond to documented
-# classes, or namespaces to their corresponding documentation. Such a link can
-# be prevented in individual cases by putting a % sign in front of the word or
-# globally by setting AUTOLINK_SUPPORT to NO.
-# The default value is: YES.
-
-AUTOLINK_SUPPORT = YES
-
-# If you use STL classes (i.e. std::string, std::vector, etc.) but do not want
-# to include (a tag file for) the STL sources as input, then you should set this
-# tag to YES in order to let doxygen match functions declarations and
-# definitions whose arguments contain STL classes (e.g. func(std::string);
-# versus func(std::string) {}). This also make the inheritance and collaboration
-# diagrams that involve STL classes more complete and accurate.
-# The default value is: NO.
-
-BUILTIN_STL_SUPPORT = NO
-
-# If you use Microsoft's C++/CLI language, you should set this option to YES to
-# enable parsing support.
-# The default value is: NO.
-
-CPP_CLI_SUPPORT = NO
-
-# Set the SIP_SUPPORT tag to YES if your project consists of sip (see:
-# http://www.riverbankcomputing.co.uk/software/sip/intro) sources only. Doxygen
-# will parse them like normal C++ but will assume all classes use public instead
-# of private inheritance when no explicit protection keyword is present.
-# The default value is: NO.
-
-SIP_SUPPORT = NO
-
-# For Microsoft's IDL there are propget and propput attributes to indicate
-# getter and setter methods for a property. Setting this option to YES will make
-# doxygen to replace the get and set methods by a property in the documentation.
-# This will only work if the methods are indeed getting or setting a simple
-# type. If this is not the case, or you want to show the methods anyway, you
-# should set this option to NO.
-# The default value is: YES.
-
-IDL_PROPERTY_SUPPORT = YES
-
-# If member grouping is used in the documentation and the DISTRIBUTE_GROUP_DOC
-# tag is set to YES then doxygen will reuse the documentation of the first
-# member in the group (if any) for the other members of the group. By default
-# all members of a group must be documented explicitly.
-# The default value is: NO.
-
-DISTRIBUTE_GROUP_DOC = NO
-
-# If one adds a struct or class to a group and this option is enabled, then also
-# any nested class or struct is added to the same group. By default this option
-# is disabled and one has to add nested compounds explicitly via \ingroup.
-# The default value is: NO.
-
-GROUP_NESTED_COMPOUNDS = NO
-
-# Set the SUBGROUPING tag to YES to allow class member groups of the same type
-# (for instance a group of public functions) to be put as a subgroup of that
-# type (e.g. under the Public Functions section). Set it to NO to prevent
-# subgrouping. Alternatively, this can be done per class using the
-# \nosubgrouping command.
-# The default value is: YES.
-
-SUBGROUPING = YES
-
-# When the INLINE_GROUPED_CLASSES tag is set to YES, classes, structs and unions
-# are shown inside the group in which they are included (e.g. using \ingroup)
-# instead of on a separate page (for HTML and Man pages) or section (for LaTeX
-# and RTF).
-#
-# Note that this feature does not work in combination with
-# SEPARATE_MEMBER_PAGES.
-# The default value is: NO.
-
-INLINE_GROUPED_CLASSES = NO
-
-# When the INLINE_SIMPLE_STRUCTS tag is set to YES, structs, classes, and unions
-# with only public data fields or simple typedef fields will be shown inline in
-# the documentation of the scope in which they are defined (i.e. file,
-# namespace, or group documentation), provided this scope is documented. If set
-# to NO, structs, classes, and unions are shown on a separate page (for HTML and
-# Man pages) or section (for LaTeX and RTF).
-# The default value is: NO.
-
-INLINE_SIMPLE_STRUCTS = NO
-
-# When TYPEDEF_HIDES_STRUCT tag is enabled, a typedef of a struct, union, or
-# enum is documented as struct, union, or enum with the name of the typedef. So
-# typedef struct TypeS {} TypeT, will appear in the documentation as a struct
-# with name TypeT. When disabled the typedef will appear as a member of a file,
-# namespace, or class. And the struct will be named TypeS. This can typically be
-# useful for C code in case the coding convention dictates that all compound
-# types are typedef'ed and only the typedef is referenced, never the tag name.
-# The default value is: NO.
-
-TYPEDEF_HIDES_STRUCT = YES
-
-# The size of the symbol lookup cache can be set using LOOKUP_CACHE_SIZE. This
-# cache is used to resolve symbols given their name and scope. Since this can be
-# an expensive process and often the same symbol appears multiple times in the
-# code, doxygen keeps a cache of pre-resolved symbols. If the cache is too small
-# doxygen will become slower. If the cache is too large, memory is wasted. The
-# cache size is given by this formula: 2^(16+LOOKUP_CACHE_SIZE). The valid range
-# is 0..9, the default is 0, corresponding to a cache size of 2^16=65536
-# symbols. At the end of a run doxygen will report the cache usage and suggest
-# the optimal cache size from a speed point of view.
-# Minimum value: 0, maximum value: 9, default value: 0.
-
-LOOKUP_CACHE_SIZE = 0
-
-#---------------------------------------------------------------------------
-# Build related configuration options
-#---------------------------------------------------------------------------
-
-# If the EXTRACT_ALL tag is set to YES, doxygen will assume all entities in
-# documentation are documented, even if no documentation was available. Private
-# class members and static file members will be hidden unless the
-# EXTRACT_PRIVATE respectively EXTRACT_STATIC tags are set to YES.
-# Note: This will also disable the warnings about undocumented members that are
-# normally produced when WARNINGS is set to YES.
-# The default value is: NO.
-
-EXTRACT_ALL = NO
-
-# If the EXTRACT_PRIVATE tag is set to YES, all private members of a class will
-# be included in the documentation.
-# The default value is: NO.
-
-EXTRACT_PRIVATE = NO
-
-# If the EXTRACT_PACKAGE tag is set to YES, all members with package or internal
-# scope will be included in the documentation.
-# The default value is: NO.
-
-EXTRACT_PACKAGE = NO
-
-# If the EXTRACT_STATIC tag is set to YES, all static members of a file will be
-# included in the documentation.
-# The default value is: NO.
-
-EXTRACT_STATIC = NO
-
-# If the EXTRACT_LOCAL_CLASSES tag is set to YES, classes (and structs) defined
-# locally in source files will be included in the documentation. If set to NO,
-# only classes defined in header files are included. Does not have any effect
-# for Java sources.
-# The default value is: YES.
-
-EXTRACT_LOCAL_CLASSES = NO
-
-# This flag is only useful for Objective-C code. If set to YES, local methods,
-# which are defined in the implementation section but not in the interface are
-# included in the documentation. If set to NO, only methods in the interface are
-# included.
-# The default value is: NO.
-
-EXTRACT_LOCAL_METHODS = NO
-
-# If this flag is set to YES, the members of anonymous namespaces will be
-# extracted and appear in the documentation as a namespace called
-# 'anonymous_namespace{file}', where file will be replaced with the base name of
-# the file that contains the anonymous namespace. By default anonymous namespace
-# are hidden.
-# The default value is: NO.
-
-EXTRACT_ANON_NSPACES = NO
-
-# If the HIDE_UNDOC_MEMBERS tag is set to YES, doxygen will hide all
-# undocumented members inside documented classes or files. If set to NO these
-# members will be included in the various overviews, but no documentation
-# section is generated. This option has no effect if EXTRACT_ALL is enabled.
-# The default value is: NO.
-
-HIDE_UNDOC_MEMBERS = YES
-
-# If the HIDE_UNDOC_CLASSES tag is set to YES, doxygen will hide all
-# undocumented classes that are normally visible in the class hierarchy. If set
-# to NO, these classes will be included in the various overviews. This option
-# has no effect if EXTRACT_ALL is enabled.
-# The default value is: NO.
-
-HIDE_UNDOC_CLASSES = YES
-
-# If the HIDE_FRIEND_COMPOUNDS tag is set to YES, doxygen will hide all friend
-# (class|struct|union) declarations. If set to NO, these declarations will be
-# included in the documentation.
-# The default value is: NO.
-
-HIDE_FRIEND_COMPOUNDS = NO
-
-# If the HIDE_IN_BODY_DOCS tag is set to YES, doxygen will hide any
-# documentation blocks found inside the body of a function. If set to NO, these
-# blocks will be appended to the function's detailed documentation block.
-# The default value is: NO.
-
-HIDE_IN_BODY_DOCS = NO
-
-# The INTERNAL_DOCS tag determines if documentation that is typed after a
-# \internal command is included. If the tag is set to NO then the documentation
-# will be excluded. Set it to YES to include the internal documentation.
-# The default value is: NO.
-
-INTERNAL_DOCS = @CMAKE_INTERNAL_DOC@
-
-# If the CASE_SENSE_NAMES tag is set to NO then doxygen will only generate file
-# names in lower-case letters. If set to YES, upper-case letters are also
-# allowed. This is useful if you have classes or files whose names only differ
-# in case and if your file system supports case sensitive file names. Windows
-# and Mac users are advised to set this option to NO.
-# The default value is: system dependent.
-
-CASE_SENSE_NAMES = YES
-
-# If the HIDE_SCOPE_NAMES tag is set to NO then doxygen will show members with
-# their full class and namespace scopes in the documentation. If set to YES, the
-# scope will be hidden.
-# The default value is: NO.
-
-HIDE_SCOPE_NAMES = NO
-
-# If the HIDE_COMPOUND_REFERENCE tag is set to NO (default) then doxygen will
-# append additional text to a page's title, such as Class Reference. If set to
-# YES the compound reference will be hidden.
-# The default value is: NO.
-
-HIDE_COMPOUND_REFERENCE= NO
-
-# If the SHOW_INCLUDE_FILES tag is set to YES then doxygen will put a list of
-# the files that are included by a file in the documentation of that file.
-# The default value is: YES.
-
-SHOW_INCLUDE_FILES = YES
-
-# If the SHOW_GROUPED_MEMB_INC tag is set to YES then Doxygen will add for each
-# grouped member an include statement to the documentation, telling the reader
-# which file to include in order to use the member.
-# The default value is: NO.
-
-SHOW_GROUPED_MEMB_INC = NO
-
-# If the FORCE_LOCAL_INCLUDES tag is set to YES then doxygen will list include
-# files with double quotes in the documentation rather than with sharp brackets.
-# The default value is: NO.
-
-FORCE_LOCAL_INCLUDES = NO
-
-# If the INLINE_INFO tag is set to YES then a tag [inline] is inserted in the
-# documentation for inline members.
-# The default value is: YES.
-
-INLINE_INFO = YES
-
-# If the SORT_MEMBER_DOCS tag is set to YES then doxygen will sort the
-# (detailed) documentation of file and class members alphabetically by member
-# name. If set to NO, the members will appear in declaration order.
-# The default value is: YES.
-
-SORT_MEMBER_DOCS = YES
-
-# If the SORT_BRIEF_DOCS tag is set to YES then doxygen will sort the brief
-# descriptions of file, namespace and class members alphabetically by member
-# name. If set to NO, the members will appear in declaration order. Note that
-# this will also influence the order of the classes in the class list.
-# The default value is: NO.
-
-SORT_BRIEF_DOCS = YES
-
-# If the SORT_MEMBERS_CTORS_1ST tag is set to YES then doxygen will sort the
-# (brief and detailed) documentation of class members so that constructors and
-# destructors are listed first. If set to NO the constructors will appear in the
-# respective orders defined by SORT_BRIEF_DOCS and SORT_MEMBER_DOCS.
-# Note: If SORT_BRIEF_DOCS is set to NO this option is ignored for sorting brief
-# member documentation.
-# Note: If SORT_MEMBER_DOCS is set to NO this option is ignored for sorting
-# detailed member documentation.
-# The default value is: NO.
-
-SORT_MEMBERS_CTORS_1ST = NO
-
-# If the SORT_GROUP_NAMES tag is set to YES then doxygen will sort the hierarchy
-# of group names into alphabetical order. If set to NO the group names will
-# appear in their defined order.
-# The default value is: NO.
-
-SORT_GROUP_NAMES = NO
-
-# If the SORT_BY_SCOPE_NAME tag is set to YES, the class list will be sorted by
-# fully-qualified names, including namespaces. If set to NO, the class list will
-# be sorted only by class name, not including the namespace part.
-# Note: This option is not very useful if HIDE_SCOPE_NAMES is set to YES.
-# Note: This option applies only to the class list, not to the alphabetical
-# list.
-# The default value is: NO.
-
-SORT_BY_SCOPE_NAME = NO
-
-# If the STRICT_PROTO_MATCHING option is enabled and doxygen fails to do proper
-# type resolution of all parameters of a function it will reject a match between
-# the prototype and the implementation of a member function even if there is
-# only one candidate or it is obvious which candidate to choose by doing a
-# simple string match. By disabling STRICT_PROTO_MATCHING doxygen will still
-# accept a match between prototype and implementation in such cases.
-# The default value is: NO.
-
-STRICT_PROTO_MATCHING = NO
-
-# The GENERATE_TODOLIST tag can be used to enable (YES) or disable (NO) the todo
-# list. This list is created by putting \todo commands in the documentation.
-# The default value is: YES.
-
-GENERATE_TODOLIST = YES
-
-# The GENERATE_TESTLIST tag can be used to enable (YES) or disable (NO) the test
-# list. This list is created by putting \test commands in the documentation.
-# The default value is: YES.
-
-GENERATE_TESTLIST = YES
-
-# The GENERATE_BUGLIST tag can be used to enable (YES) or disable (NO) the bug
-# list. This list is created by putting \bug commands in the documentation.
-# The default value is: YES.
-
-GENERATE_BUGLIST = YES
-
-# The GENERATE_DEPRECATEDLIST tag can be used to enable (YES) or disable (NO)
-# the deprecated list. This list is created by putting \deprecated commands in
-# the documentation.
-# The default value is: YES.
-
-GENERATE_DEPRECATEDLIST= YES
-
-# The ENABLED_SECTIONS tag can be used to enable conditional documentation
-# sections, marked by \if <section_label> ... \endif and \cond <section_label>
-# ... \endcond blocks.
-
-ENABLED_SECTIONS =
-
-# The MAX_INITIALIZER_LINES tag determines the maximum number of lines that the
-# initial value of a variable or macro / define can have for it to appear in the
-# documentation. If the initializer consists of more lines than specified here
-# it will be hidden. Use a value of 0 to hide initializers completely. The
-# appearance of the value of individual variables and macros / defines can be
-# controlled using \showinitializer or \hideinitializer command in the
-# documentation regardless of this setting.
-# Minimum value: 0, maximum value: 10000, default value: 30.
-
-MAX_INITIALIZER_LINES = 30
-
-# Set the SHOW_USED_FILES tag to NO to disable the list of files generated at
-# the bottom of the documentation of classes and structs. If set to YES, the
-# list will mention the files that were used to generate the documentation.
-# The default value is: YES.
-
-SHOW_USED_FILES = YES
-
-# Set the SHOW_FILES tag to NO to disable the generation of the Files page. This
-# will remove the Files entry from the Quick Index and from the Folder Tree View
-# (if specified).
-# The default value is: YES.
-
-SHOW_FILES = YES
-
-# Set the SHOW_NAMESPACES tag to NO to disable the generation of the Namespaces
-# page. This will remove the Namespaces entry from the Quick Index and from the
-# Folder Tree View (if specified).
-# The default value is: YES.
-
-SHOW_NAMESPACES = YES
-
-# The FILE_VERSION_FILTER tag can be used to specify a program or script that
-# doxygen should invoke to get the current version for each file (typically from
-# the version control system). Doxygen will invoke the program by executing (via
-# popen()) the command command input-file, where command is the value of the
-# FILE_VERSION_FILTER tag, and input-file is the name of an input file provided
-# by doxygen. Whatever the program writes to standard output is used as the file
-# version. For an example see the documentation.
-
-FILE_VERSION_FILTER =
-
-# The LAYOUT_FILE tag can be used to specify a layout file which will be parsed
-# by doxygen. The layout file controls the global structure of the generated
-# output files in an output format independent way. To create the layout file
-# that represents doxygen's defaults, run doxygen with the -l option. You can
-# optionally specify a file name after the option, if omitted DoxygenLayout.xml
-# will be used as the name of the layout file.
-#
-# Note that if you run doxygen from a directory containing a file called
-# DoxygenLayout.xml, doxygen will parse it automatically even if the LAYOUT_FILE
-# tag is left empty.
-
-LAYOUT_FILE =
-
-# The CITE_BIB_FILES tag can be used to specify one or more bib files containing
-# the reference definitions. This must be a list of .bib files. The .bib
-# extension is automatically appended if omitted. This requires the bibtex tool
-# to be installed. See also http://en.wikipedia.org/wiki/BibTeX for more info.
-# For LaTeX the style of the bibliography can be controlled using
-# LATEX_BIB_STYLE. To use this feature you need bibtex and perl available in the
-# search path. See also \cite for info how to create references.
-
-CITE_BIB_FILES =
-
-#---------------------------------------------------------------------------
-# Configuration options related to warning and progress messages
-#---------------------------------------------------------------------------
-
-# The QUIET tag can be used to turn on/off the messages that are generated to
-# standard output by doxygen. If QUIET is set to YES this implies that the
-# messages are off.
-# The default value is: NO.
-
-QUIET = YES
-
-# The WARNINGS tag can be used to turn on/off the warning messages that are
-# generated to standard error (stderr) by doxygen. If WARNINGS is set to YES
-# this implies that the warnings are on.
-#
-# Tip: Turn warnings on while writing the documentation.
-# The default value is: YES.
-
-WARNINGS = YES
-
-# If the WARN_IF_UNDOCUMENTED tag is set to YES then doxygen will generate
-# warnings for undocumented members. If EXTRACT_ALL is set to YES then this flag
-# will automatically be disabled.
-# The default value is: YES.
-
-WARN_IF_UNDOCUMENTED = YES
-
-# If the WARN_IF_DOC_ERROR tag is set to YES, doxygen will generate warnings for
-# potential errors in the documentation, such as not documenting some parameters
-# in a documented function, or documenting parameters that don't exist or using
-# markup commands wrongly.
-# The default value is: YES.
-
-WARN_IF_DOC_ERROR = YES
-
-# This WARN_NO_PARAMDOC option can be enabled to get warnings for functions that
-# are documented, but have no documentation for their parameters or return
-# value. If set to NO, doxygen will only warn about wrong or incomplete
-# parameter documentation, but not about the absence of documentation.
-# The default value is: NO.
-
-WARN_NO_PARAMDOC = NO
-
-# If the WARN_AS_ERROR tag is set to YES then doxygen will immediately stop when
-# a warning is encountered.
-# The default value is: NO.
-
-WARN_AS_ERROR = NO
-
-# The WARN_FORMAT tag determines the format of the warning messages that doxygen
-# can produce. The string should contain the $file, $line, and $text tags, which
-# will be replaced by the file and line number from which the warning originated
-# and the warning text. Optionally the format may contain $version, which will
-# be replaced by the version of the file (if it could be obtained via
-# FILE_VERSION_FILTER)
-# The default value is: $file:$line: $text.
-
-WARN_FORMAT = "$file:$line: $text"
-
-# The WARN_LOGFILE tag can be used to specify a file to which warning and error
-# messages should be written. If left blank the output is written to standard
-# error (stderr).
-
-WARN_LOGFILE =
-
-#---------------------------------------------------------------------------
-# Configuration options related to the input files
-#---------------------------------------------------------------------------
-
-# The INPUT tag is used to specify the files and/or directories that contain
-# documented source files. You may enter file names like myfile.cpp or
-# directories like /usr/src/myproject. Separate the files or directories with
-# spaces. See also FILE_PATTERNS and EXTENSION_MAPPING
-# Note: If this tag is empty the current directory is searched.
-
-INPUT = "@CMAKE_SOURCE_DIR@/include" \
- "@CMAKE_SOURCE_DIR@/src" \
- "@CMAKE_SOURCE_DIR@/doc"
-
-# This tag can be used to specify the character encoding of the source files
-# that doxygen parses. Internally doxygen uses the UTF-8 encoding. Doxygen uses
-# libiconv (or the iconv built into libc) for the transcoding. See the libiconv
-# documentation (see: http://www.gnu.org/software/libiconv) for the list of
-# possible encodings.
-# The default value is: UTF-8.
-
-INPUT_ENCODING = UTF-8
-
-# If the value of the INPUT tag contains directories, you can use the
-# FILE_PATTERNS tag to specify one or more wildcard patterns (like *.cpp and
-# *.h) to filter out the source-files in the directories.
-#
-# Note that for custom extensions or not directly supported extensions you also
-# need to set EXTENSION_MAPPING for the extension otherwise the files are not
-# read by doxygen.
-#
-# If left blank the following patterns are tested:*.c, *.cc, *.cxx, *.cpp,
-# *.c++, *.java, *.ii, *.ixx, *.ipp, *.i++, *.inl, *.idl, *.ddl, *.odl, *.h,
-# *.hh, *.hxx, *.hpp, *.h++, *.cs, *.d, *.php, *.php4, *.php5, *.phtml, *.inc,
-# *.m, *.markdown, *.md, *.mm, *.dox, *.py, *.pyw, *.f90, *.f95, *.f03, *.f08,
-# *.f, *.for, *.tcl, *.vhd, *.vhdl, *.ucf and *.qsf.
-
-FILE_PATTERNS = *.cpp \
- *.cc \
- *.c \
- *.h \
- *.hh \
- *.hpp \
- *.dox
-
-# The RECURSIVE tag can be used to specify whether or not subdirectories should
-# be searched for input files as well.
-# The default value is: NO.
-
-RECURSIVE = YES
-
-# The EXCLUDE tag can be used to specify files and/or directories that should be
-# excluded from the INPUT source files. This way you can easily exclude a
-# subdirectory from a directory tree whose root is specified with the INPUT tag.
-#
-# Note that relative paths are relative to the directory from which doxygen is
-# run.
-
-EXCLUDE =
-
-# The EXCLUDE_SYMLINKS tag can be used to select whether or not files or
-# directories that are symbolic links (a Unix file system feature) are excluded
-# from the input.
-# The default value is: NO.
-
-EXCLUDE_SYMLINKS = NO
-
-# If the value of the INPUT tag contains directories, you can use the
-# EXCLUDE_PATTERNS tag to specify one or more wildcard patterns to exclude
-# certain files from those directories.
-#
-# Note that the wildcards are matched against the file with absolute path, so to
-# exclude all test directories for example use the pattern */test/*
-
-EXCLUDE_PATTERNS = */.git/* \
- */.svn/* \
- */cmake/*
-
-# The EXCLUDE_SYMBOLS tag can be used to specify one or more symbol names
-# (namespaces, classes, functions, etc.) that should be excluded from the
-# output. The symbol name can be a fully qualified name, a word, or if the
-# wildcard * is used, a substring. Examples: ANamespace, AClass,
-# AClass::ANamespace, ANamespace::*Test
-#
-# Note that the wildcards are matched against the file with absolute path, so to
-# exclude all test directories use the pattern */test/*
-
-EXCLUDE_SYMBOLS =
-
-# The EXAMPLE_PATH tag can be used to specify one or more files or directories
-# that contain example code fragments that are included (see the \include
-# command).
-
-EXAMPLE_PATH = "@CMAKE_SOURCE_DIR@/example"
-
-# If the value of the EXAMPLE_PATH tag contains directories, you can use the
-# EXAMPLE_PATTERNS tag to specify one or more wildcard pattern (like *.cpp and
-# *.h) to filter out the source-files in the directories. If left blank all
-# files are included.
-
-EXAMPLE_PATTERNS = *.c \
- *.h \
- INSTALL \
- DEPENDENCIES \
- CHANGELOG \
- LICENSE \
- LGPL
-
-# If the EXAMPLE_RECURSIVE tag is set to YES then subdirectories will be
-# searched for input files to be used with the \include or \dontinclude commands
-# irrespective of the value of the RECURSIVE tag.
-# The default value is: NO.
-
-EXAMPLE_RECURSIVE = YES
-
-# The IMAGE_PATH tag can be used to specify one or more files or directories
-# that contain images that are to be included in the documentation (see the
-# \image command).
-
-IMAGE_PATH =
-
-# The INPUT_FILTER tag can be used to specify a program that doxygen should
-# invoke to filter for each input file. Doxygen will invoke the filter program
-# by executing (via popen()) the command:
-#
-# <filter> <input-file>
-#
-# where <filter> is the value of the INPUT_FILTER tag, and <input-file> is the
-# name of an input file. Doxygen will then use the output that the filter
-# program writes to standard output. If FILTER_PATTERNS is specified, this tag
-# will be ignored.
-#
-# Note that the filter must not add or remove lines; it is applied before the
-# code is scanned, but not when the output code is generated. If lines are added
-# or removed, the anchors will not be placed correctly.
-#
-# Note that for custom extensions or not directly supported extensions you also
-# need to set EXTENSION_MAPPING for the extension otherwise the files are not
-# properly processed by doxygen.
-
-INPUT_FILTER =
-
-# The FILTER_PATTERNS tag can be used to specify filters on a per file pattern
-# basis. Doxygen will compare the file name with each pattern and apply the
-# filter if there is a match. The filters are a list of the form: pattern=filter
-# (like *.cpp=my_cpp_filter). See INPUT_FILTER for further information on how
-# filters are used. If the FILTER_PATTERNS tag is empty or if none of the
-# patterns match the file name, INPUT_FILTER is applied.
-#
-# Note that for custom extensions or not directly supported extensions you also
-# need to set EXTENSION_MAPPING for the extension otherwise the files are not
-# properly processed by doxygen.
-
-FILTER_PATTERNS =
-
-# If the FILTER_SOURCE_FILES tag is set to YES, the input filter (if set using
-# INPUT_FILTER) will also be used to filter the input files that are used for
-# producing the source files to browse (i.e. when SOURCE_BROWSER is set to YES).
-# The default value is: NO.
-
-FILTER_SOURCE_FILES = NO
-
-# The FILTER_SOURCE_PATTERNS tag can be used to specify source filters per file
-# pattern. A pattern will override the setting for FILTER_PATTERN (if any) and
-# it is also possible to disable source filtering for a specific pattern using
-# *.ext= (so without naming a filter).
-# This tag requires that the tag FILTER_SOURCE_FILES is set to YES.
-
-FILTER_SOURCE_PATTERNS =
-
-# If the USE_MDFILE_AS_MAINPAGE tag refers to the name of a markdown file that
-# is part of the input, its contents will be placed on the main page
-# (index.html). This can be useful if you have a project on for instance GitHub
-# and want to reuse the introduction page also for the doxygen output.
-
-USE_MDFILE_AS_MAINPAGE =
-
-#---------------------------------------------------------------------------
-# Configuration options related to source browsing
-#---------------------------------------------------------------------------
-
-# If the SOURCE_BROWSER tag is set to YES then a list of source files will be
-# generated. Documented entities will be cross-referenced with these sources.
-#
-# Note: To get rid of all source code in the generated output, make sure that
-# also VERBATIM_HEADERS is set to NO.
-# The default value is: NO.
-
-SOURCE_BROWSER = NO
-
-# Setting the INLINE_SOURCES tag to YES will include the body of functions,
-# classes and enums directly into the documentation.
-# The default value is: NO.
-
-INLINE_SOURCES = NO
-
-# Setting the STRIP_CODE_COMMENTS tag to YES will instruct doxygen to hide any
-# special comment blocks from generated source code fragments. Normal C, C++ and
-# Fortran comments will always remain visible.
-# The default value is: YES.
-
-STRIP_CODE_COMMENTS = YES
-
-# If the REFERENCED_BY_RELATION tag is set to YES then for each documented
-# function all documented functions referencing it will be listed.
-# The default value is: NO.
-
-REFERENCED_BY_RELATION = YES
-
-# If the REFERENCES_RELATION tag is set to YES then for each documented function
-# all documented entities called/used by that function will be listed.
-# The default value is: NO.
-
-REFERENCES_RELATION = YES
-
-# If the REFERENCES_LINK_SOURCE tag is set to YES and SOURCE_BROWSER tag is set
-# to YES then the hyperlinks from functions in REFERENCES_RELATION and
-# REFERENCED_BY_RELATION lists will link to the source code. Otherwise they will
-# link to the documentation.
-# The default value is: YES.
-
-REFERENCES_LINK_SOURCE = YES
-
-# If SOURCE_TOOLTIPS is enabled (the default) then hovering a hyperlink in the
-# source code will show a tooltip with additional information such as prototype,
-# brief description and links to the definition and documentation. Since this
-# will make the HTML file larger and loading of large files a bit slower, you
-# can opt to disable this feature.
-# The default value is: YES.
-# This tag requires that the tag SOURCE_BROWSER is set to YES.
-
-SOURCE_TOOLTIPS = YES
-
-# If the USE_HTAGS tag is set to YES then the references to source code will
-# point to the HTML generated by the htags(1) tool instead of doxygen built-in
-# source browser. The htags tool is part of GNU's global source tagging system
-# (see http://www.gnu.org/software/global/global.html). You will need version
-# 4.8.6 or higher.
-#
-# To use it do the following:
-# - Install the latest version of global
-# - Enable SOURCE_BROWSER and USE_HTAGS in the config file
-# - Make sure the INPUT points to the root of the source tree
-# - Run doxygen as normal
-#
-# Doxygen will invoke htags (and that will in turn invoke gtags), so these
-# tools must be available from the command line (i.e. in the search path).
-#
-# The result: instead of the source browser generated by doxygen, the links to
-# source code will now point to the output of htags.
-# The default value is: NO.
-# This tag requires that the tag SOURCE_BROWSER is set to YES.
-
-USE_HTAGS = NO
-
-# If the VERBATIM_HEADERS tag is set the YES then doxygen will generate a
-# verbatim copy of the header file for each class for which an include is
-# specified. Set to NO to disable this.
-# See also: Section \class.
-# The default value is: YES.
-
-VERBATIM_HEADERS = YES
-
-#---------------------------------------------------------------------------
-# Configuration options related to the alphabetical class index
-#---------------------------------------------------------------------------
-
-# If the ALPHABETICAL_INDEX tag is set to YES, an alphabetical index of all
-# compounds will be generated. Enable this if the project contains a lot of
-# classes, structs, unions or interfaces.
-# The default value is: YES.
-
-ALPHABETICAL_INDEX = YES
-
-# The COLS_IN_ALPHA_INDEX tag can be used to specify the number of columns in
-# which the alphabetical index list will be split.
-# Minimum value: 1, maximum value: 20, default value: 5.
-# This tag requires that the tag ALPHABETICAL_INDEX is set to YES.
-
-COLS_IN_ALPHA_INDEX = 2
-
-# In case all classes in a project start with a common prefix, all classes will
-# be put under the same header in the alphabetical index. The IGNORE_PREFIX tag
-# can be used to specify a prefix (or a list of prefixes) that should be ignored
-# while generating the index headers.
-# This tag requires that the tag ALPHABETICAL_INDEX is set to YES.
-
-IGNORE_PREFIX =
-
-#---------------------------------------------------------------------------
-# Configuration options related to the HTML output
-#---------------------------------------------------------------------------
-
-# If the GENERATE_HTML tag is set to YES, doxygen will generate HTML output
-# The default value is: YES.
-
-GENERATE_HTML = YES
-
-# The HTML_OUTPUT tag is used to specify where the HTML docs will be put. If a
-# relative path is entered the value of OUTPUT_DIRECTORY will be put in front of
-# it.
-# The default directory is: html.
-# This tag requires that the tag GENERATE_HTML is set to YES.
-
-HTML_OUTPUT = html
-
-# The HTML_FILE_EXTENSION tag can be used to specify the file extension for each
-# generated HTML page (for example: .htm, .php, .asp).
-# The default value is: .html.
-# This tag requires that the tag GENERATE_HTML is set to YES.
-
-HTML_FILE_EXTENSION = .html
-
-# The HTML_HEADER tag can be used to specify a user-defined HTML header file for
-# each generated HTML page. If the tag is left blank doxygen will generate a
-# standard header.
-#
-# To get valid HTML the header file that includes any scripts and style sheets
-# that doxygen needs, which is dependent on the configuration options used (e.g.
-# the setting GENERATE_TREEVIEW). It is highly recommended to start with a
-# default header using
-# doxygen -w html new_header.html new_footer.html new_stylesheet.css
-# YourConfigFile
-# and then modify the file new_header.html. See also section "Doxygen usage"
-# for information on how to generate the default header that doxygen normally
-# uses.
-# Note: The header is subject to change so you typically have to regenerate the
-# default header when upgrading to a newer version of doxygen. For a description
-# of the possible markers and block names see the documentation.
-# This tag requires that the tag GENERATE_HTML is set to YES.
-
-HTML_HEADER =
-
-# The HTML_FOOTER tag can be used to specify a user-defined HTML footer for each
-# generated HTML page. If the tag is left blank doxygen will generate a standard
-# footer. See HTML_HEADER for more information on how to generate a default
-# footer and what special commands can be used inside the footer. See also
-# section "Doxygen usage" for information on how to generate the default footer
-# that doxygen normally uses.
-# This tag requires that the tag GENERATE_HTML is set to YES.
-
-HTML_FOOTER =
-
-# The HTML_STYLESHEET tag can be used to specify a user-defined cascading style
-# sheet that is used by each HTML page. It can be used to fine-tune the look of
-# the HTML output. If left blank doxygen will generate a default style sheet.
-# See also section "Doxygen usage" for information on how to generate the style
-# sheet that doxygen normally uses.
-# Note: It is recommended to use HTML_EXTRA_STYLESHEET instead of this tag, as
-# it is more robust and this tag (HTML_STYLESHEET) will in the future become
-# obsolete.
-# This tag requires that the tag GENERATE_HTML is set to YES.
-
-HTML_STYLESHEET =
-
-# The HTML_EXTRA_STYLESHEET tag can be used to specify additional user-defined
-# cascading style sheets that are included after the standard style sheets
-# created by doxygen. Using this option one can overrule certain style aspects.
-# This is preferred over using HTML_STYLESHEET since it does not replace the
-# standard style sheet and is therefore more robust against future updates.
-# Doxygen will copy the style sheet files to the output directory.
-# Note: The order of the extra style sheet files is of importance (e.g. the last
-# style sheet in the list overrules the setting of the previous ones in the
-# list). For an example see the documentation.
-# This tag requires that the tag GENERATE_HTML is set to YES.
-
-HTML_EXTRA_STYLESHEET =
-
-# The HTML_EXTRA_FILES tag can be used to specify one or more extra images or
-# other source files which should be copied to the HTML output directory. Note
-# that these files will be copied to the base HTML output directory. Use the
-# $relpath^ marker in the HTML_HEADER and/or HTML_FOOTER files to load these
-# files. In the HTML_STYLESHEET file, use the file name only. Also note that the
-# files will be copied as-is; there are no commands or markers available.
-# This tag requires that the tag GENERATE_HTML is set to YES.
-
-HTML_EXTRA_FILES =
-
-# The HTML_COLORSTYLE_HUE tag controls the color of the HTML output. Doxygen
-# will adjust the colors in the style sheet and background images according to
-# this color. Hue is specified as an angle on a colorwheel, see
-# http://en.wikipedia.org/wiki/Hue for more information. For instance the value
-# 0 represents red, 60 is yellow, 120 is green, 180 is cyan, 240 is blue, 300
-# purple, and 360 is red again.
-# Minimum value: 0, maximum value: 359, default value: 220.
-# This tag requires that the tag GENERATE_HTML is set to YES.
-
-HTML_COLORSTYLE_HUE = 220
-
-# The HTML_COLORSTYLE_SAT tag controls the purity (or saturation) of the colors
-# in the HTML output. For a value of 0 the output will use grayscales only. A
-# value of 255 will produce the most vivid colors.
-# Minimum value: 0, maximum value: 255, default value: 100.
-# This tag requires that the tag GENERATE_HTML is set to YES.
-
-HTML_COLORSTYLE_SAT = 100
-
-# The HTML_COLORSTYLE_GAMMA tag controls the gamma correction applied to the
-# luminance component of the colors in the HTML output. Values below 100
-# gradually make the output lighter, whereas values above 100 make the output
-# darker. The value divided by 100 is the actual gamma applied, so 80 represents
-# a gamma of 0.8, The value 220 represents a gamma of 2.2, and 100 does not
-# change the gamma.
-# Minimum value: 40, maximum value: 240, default value: 80.
-# This tag requires that the tag GENERATE_HTML is set to YES.
-
-HTML_COLORSTYLE_GAMMA = 80
-
-# If the HTML_TIMESTAMP tag is set to YES then the footer of each generated HTML
-# page will contain the date and time when the page was generated. Setting this
-# to YES can help to show when doxygen was last run and thus if the
-# documentation is up to date.
-# The default value is: NO.
-# This tag requires that the tag GENERATE_HTML is set to YES.
-
-HTML_TIMESTAMP = NO
-
-# If the HTML_DYNAMIC_SECTIONS tag is set to YES then the generated HTML
-# documentation will contain sections that can be hidden and shown after the
-# page has loaded.
-# The default value is: NO.
-# This tag requires that the tag GENERATE_HTML is set to YES.
-
-HTML_DYNAMIC_SECTIONS = NO
-
-# With HTML_INDEX_NUM_ENTRIES one can control the preferred number of entries
-# shown in the various tree structured indices initially; the user can expand
-# and collapse entries dynamically later on. Doxygen will expand the tree to
-# such a level that at most the specified number of entries are visible (unless
-# a fully collapsed tree already exceeds this amount). So setting the number of
-# entries 1 will produce a full collapsed tree by default. 0 is a special value
-# representing an infinite number of entries and will result in a full expanded
-# tree by default.
-# Minimum value: 0, maximum value: 9999, default value: 100.
-# This tag requires that the tag GENERATE_HTML is set to YES.
-
-HTML_INDEX_NUM_ENTRIES = 100
-
-# If the GENERATE_DOCSET tag is set to YES, additional index files will be
-# generated that can be used as input for Apple's Xcode 3 integrated development
-# environment (see: http://developer.apple.com/tools/xcode/), introduced with
-# OSX 10.5 (Leopard). To create a documentation set, doxygen will generate a
-# Makefile in the HTML output directory. Running make will produce the docset in
-# that directory and running make install will install the docset in
-# ~/Library/Developer/Shared/Documentation/DocSets so that Xcode will find it at
-# startup. See http://developer.apple.com/tools/creatingdocsetswithdoxygen.html
-# for more information.
-# The default value is: NO.
-# This tag requires that the tag GENERATE_HTML is set to YES.
-
-GENERATE_DOCSET = NO
-
-# This tag determines the name of the docset feed. A documentation feed provides
-# an umbrella under which multiple documentation sets from a single provider
-# (such as a company or product suite) can be grouped.
-# The default value is: Doxygen generated docs.
-# This tag requires that the tag GENERATE_DOCSET is set to YES.
-
-DOCSET_FEEDNAME = "Doxygen generated docs"
-
-# This tag specifies a string that should uniquely identify the documentation
-# set bundle. This should be a reverse domain-name style string, e.g.
-# com.mycompany.MyDocSet. Doxygen will append .docset to the name.
-# The default value is: org.doxygen.Project.
-# This tag requires that the tag GENERATE_DOCSET is set to YES.
-
-DOCSET_BUNDLE_ID = org.doxygen.Project
-
-# The DOCSET_PUBLISHER_ID tag specifies a string that should uniquely identify
-# the documentation publisher. This should be a reverse domain-name style
-# string, e.g. com.mycompany.MyDocSet.documentation.
-# The default value is: org.doxygen.Publisher.
-# This tag requires that the tag GENERATE_DOCSET is set to YES.
-
-DOCSET_PUBLISHER_ID = org.doxygen.Publisher
-
-# The DOCSET_PUBLISHER_NAME tag identifies the documentation publisher.
-# The default value is: Publisher.
-# This tag requires that the tag GENERATE_DOCSET is set to YES.
-
-DOCSET_PUBLISHER_NAME = Publisher
-
-# If the GENERATE_HTMLHELP tag is set to YES then doxygen generates three
-# additional HTML index files: index.hhp, index.hhc, and index.hhk. The
-# index.hhp is a project file that can be read by Microsoft's HTML Help Workshop
-# (see: http://www.microsoft.com/en-us/download/details.aspx?id=21138) on
-# Windows.
-#
-# The HTML Help Workshop contains a compiler that can convert all HTML output
-# generated by doxygen into a single compiled HTML file (.chm). Compiled HTML
-# files are now used as the Windows 98 help format, and will replace the old
-# Windows help format (.hlp) on all Windows platforms in the future. Compressed
-# HTML files also contain an index, a table of contents, and you can search for
-# words in the documentation. The HTML workshop also contains a viewer for
-# compressed HTML files.
-# The default value is: NO.
-# This tag requires that the tag GENERATE_HTML is set to YES.
-
-GENERATE_HTMLHELP = NO
-
-# The CHM_FILE tag can be used to specify the file name of the resulting .chm
-# file. You can add a path in front of the file if the result should not be
-# written to the html output directory.
-# This tag requires that the tag GENERATE_HTMLHELP is set to YES.
-
-CHM_FILE =
-
-# The HHC_LOCATION tag can be used to specify the location (absolute path
-# including file name) of the HTML help compiler (hhc.exe). If non-empty,
-# doxygen will try to run the HTML help compiler on the generated index.hhp.
-# The file has to be specified with full path.
-# This tag requires that the tag GENERATE_HTMLHELP is set to YES.
-
-HHC_LOCATION =
-
-# The GENERATE_CHI flag controls if a separate .chi index file is generated
-# (YES) or that it should be included in the master .chm file (NO).
-# The default value is: NO.
-# This tag requires that the tag GENERATE_HTMLHELP is set to YES.
-
-GENERATE_CHI = NO
-
-# The CHM_INDEX_ENCODING is used to encode HtmlHelp index (hhk), content (hhc)
-# and project file content.
-# This tag requires that the tag GENERATE_HTMLHELP is set to YES.
-
-CHM_INDEX_ENCODING =
-
-# The BINARY_TOC flag controls whether a binary table of contents is generated
-# (YES) or a normal table of contents (NO) in the .chm file. Furthermore it
-# enables the Previous and Next buttons.
-# The default value is: NO.
-# This tag requires that the tag GENERATE_HTMLHELP is set to YES.
-
-BINARY_TOC = NO
-
-# The TOC_EXPAND flag can be set to YES to add extra items for group members to
-# the table of contents of the HTML help documentation and to the tree view.
-# The default value is: NO.
-# This tag requires that the tag GENERATE_HTMLHELP is set to YES.
-
-TOC_EXPAND = NO
-
-# If the GENERATE_QHP tag is set to YES and both QHP_NAMESPACE and
-# QHP_VIRTUAL_FOLDER are set, an additional index file will be generated that
-# can be used as input for Qt's qhelpgenerator to generate a Qt Compressed Help
-# (.qch) of the generated HTML documentation.
-# The default value is: NO.
-# This tag requires that the tag GENERATE_HTML is set to YES.
-
-GENERATE_QHP = NO
-
-# If the QHG_LOCATION tag is specified, the QCH_FILE tag can be used to specify
-# the file name of the resulting .qch file. The path specified is relative to
-# the HTML output folder.
-# This tag requires that the tag GENERATE_QHP is set to YES.
-
-QCH_FILE =
-
-# The QHP_NAMESPACE tag specifies the namespace to use when generating Qt Help
-# Project output. For more information please see Qt Help Project / Namespace
-# (see: http://qt-project.org/doc/qt-4.8/qthelpproject.html#namespace).
-# The default value is: org.doxygen.Project.
-# This tag requires that the tag GENERATE_QHP is set to YES.
-
-QHP_NAMESPACE =
-
-# The QHP_VIRTUAL_FOLDER tag specifies the namespace to use when generating Qt
-# Help Project output. For more information please see Qt Help Project / Virtual
-# Folders (see: http://qt-project.org/doc/qt-4.8/qthelpproject.html#virtual-
-# folders).
-# The default value is: doc.
-# This tag requires that the tag GENERATE_QHP is set to YES.
-
-QHP_VIRTUAL_FOLDER = doc
-
-# If the QHP_CUST_FILTER_NAME tag is set, it specifies the name of a custom
-# filter to add. For more information please see Qt Help Project / Custom
-# Filters (see: http://qt-project.org/doc/qt-4.8/qthelpproject.html#custom-
-# filters).
-# This tag requires that the tag GENERATE_QHP is set to YES.
-
-QHP_CUST_FILTER_NAME =
-
-# The QHP_CUST_FILTER_ATTRS tag specifies the list of the attributes of the
-# custom filter to add. For more information please see Qt Help Project / Custom
-# Filters (see: http://qt-project.org/doc/qt-4.8/qthelpproject.html#custom-
-# filters).
-# This tag requires that the tag GENERATE_QHP is set to YES.
-
-QHP_CUST_FILTER_ATTRS =
-
-# The QHP_SECT_FILTER_ATTRS tag specifies the list of the attributes this
-# project's filter section matches. Qt Help Project / Filter Attributes (see:
-# http://qt-project.org/doc/qt-4.8/qthelpproject.html#filter-attributes).
-# This tag requires that the tag GENERATE_QHP is set to YES.
-
-QHP_SECT_FILTER_ATTRS =
-
-# The QHG_LOCATION tag can be used to specify the location of Qt's
-# qhelpgenerator. If non-empty doxygen will try to run qhelpgenerator on the
-# generated .qhp file.
-# This tag requires that the tag GENERATE_QHP is set to YES.
-
-QHG_LOCATION =
-
-# If the GENERATE_ECLIPSEHELP tag is set to YES, additional index files will be
-# generated, together with the HTML files, they form an Eclipse help plugin. To
-# install this plugin and make it available under the help contents menu in
-# Eclipse, the contents of the directory containing the HTML and XML files needs
-# to be copied into the plugins directory of eclipse. The name of the directory
-# within the plugins directory should be the same as the ECLIPSE_DOC_ID value.
-# After copying Eclipse needs to be restarted before the help appears.
-# The default value is: NO.
-# This tag requires that the tag GENERATE_HTML is set to YES.
-
-GENERATE_ECLIPSEHELP = NO
-
-# A unique identifier for the Eclipse help plugin. When installing the plugin
-# the directory name containing the HTML and XML files should also have this
-# name. Each documentation set should have its own identifier.
-# The default value is: org.doxygen.Project.
-# This tag requires that the tag GENERATE_ECLIPSEHELP is set to YES.
-
-ECLIPSE_DOC_ID = org.doxygen.Project
-
-# If you want full control over the layout of the generated HTML pages it might
-# be necessary to disable the index and replace it with your own. The
-# DISABLE_INDEX tag can be used to turn on/off the condensed index (tabs) at top
-# of each HTML page. A value of NO enables the index and the value YES disables
-# it. Since the tabs in the index contain the same information as the navigation
-# tree, you can set this option to YES if you also set GENERATE_TREEVIEW to YES.
-# The default value is: NO.
-# This tag requires that the tag GENERATE_HTML is set to YES.
-
-DISABLE_INDEX = NO
-
-# The GENERATE_TREEVIEW tag is used to specify whether a tree-like index
-# structure should be generated to display hierarchical information. If the tag
-# value is set to YES, a side panel will be generated containing a tree-like
-# index structure (just like the one that is generated for HTML Help). For this
-# to work a browser that supports JavaScript, DHTML, CSS and frames is required
-# (i.e. any modern browser). Windows users are probably better off using the
-# HTML help feature. Via custom style sheets (see HTML_EXTRA_STYLESHEET) one can
-# further fine-tune the look of the index. As an example, the default style
-# sheet generated by doxygen has an example that shows how to put an image at
-# the root of the tree instead of the PROJECT_NAME. Since the tree basically has
-# the same information as the tab index, you could consider setting
-# DISABLE_INDEX to YES when enabling this option.
-# The default value is: NO.
-# This tag requires that the tag GENERATE_HTML is set to YES.
-
-GENERATE_TREEVIEW = NO
-
-# The ENUM_VALUES_PER_LINE tag can be used to set the number of enum values that
-# doxygen will group on one line in the generated HTML documentation.
-#
-# Note that a value of 0 will completely suppress the enum values from appearing
-# in the overview section.
-# Minimum value: 0, maximum value: 20, default value: 4.
-# This tag requires that the tag GENERATE_HTML is set to YES.
-
-ENUM_VALUES_PER_LINE = 4
-
-# If the treeview is enabled (see GENERATE_TREEVIEW) then this tag can be used
-# to set the initial width (in pixels) of the frame in which the tree is shown.
-# Minimum value: 0, maximum value: 1500, default value: 250.
-# This tag requires that the tag GENERATE_HTML is set to YES.
-
-TREEVIEW_WIDTH = 250
-
-# If the EXT_LINKS_IN_WINDOW option is set to YES, doxygen will open links to
-# external symbols imported via tag files in a separate window.
-# The default value is: NO.
-# This tag requires that the tag GENERATE_HTML is set to YES.
-
-EXT_LINKS_IN_WINDOW = NO
-
-# Use this tag to change the font size of LaTeX formulas included as images in
-# the HTML documentation. When you change the font size after a successful
-# doxygen run you need to manually remove any form_*.png images from the HTML
-# output directory to force them to be regenerated.
-# Minimum value: 8, maximum value: 50, default value: 10.
-# This tag requires that the tag GENERATE_HTML is set to YES.
-
-FORMULA_FONTSIZE = 10
-
-# Use the FORMULA_TRANPARENT tag to determine whether or not the images
-# generated for formulas are transparent PNGs. Transparent PNGs are not
-# supported properly for IE 6.0, but are supported on all modern browsers.
-#
-# Note that when changing this option you need to delete any form_*.png files in
-# the HTML output directory before the changes have effect.
-# The default value is: YES.
-# This tag requires that the tag GENERATE_HTML is set to YES.
-
-FORMULA_TRANSPARENT = YES
-
-# Enable the USE_MATHJAX option to render LaTeX formulas using MathJax (see
-# http://www.mathjax.org) which uses client side Javascript for the rendering
-# instead of using pre-rendered bitmaps. Use this if you do not have LaTeX
-# installed or if you want to formulas look prettier in the HTML output. When
-# enabled you may also need to install MathJax separately and configure the path
-# to it using the MATHJAX_RELPATH option.
-# The default value is: NO.
-# This tag requires that the tag GENERATE_HTML is set to YES.
-
-USE_MATHJAX = NO
-
-# When MathJax is enabled you can set the default output format to be used for
-# the MathJax output. See the MathJax site (see:
-# http://docs.mathjax.org/en/latest/output.html) for more details.
-# Possible values are: HTML-CSS (which is slower, but has the best
-# compatibility), NativeMML (i.e. MathML) and SVG.
-# The default value is: HTML-CSS.
-# This tag requires that the tag USE_MATHJAX is set to YES.
-
-MATHJAX_FORMAT = HTML-CSS
-
-# When MathJax is enabled you need to specify the location relative to the HTML
-# output directory using the MATHJAX_RELPATH option. The destination directory
-# should contain the MathJax.js script. For instance, if the mathjax directory
-# is located at the same level as the HTML output directory, then
-# MATHJAX_RELPATH should be ../mathjax. The default value points to the MathJax
-# Content Delivery Network so you can quickly see the result without installing
-# MathJax. However, it is strongly recommended to install a local copy of
-# MathJax from http://www.mathjax.org before deployment.
-# The default value is: http://cdn.mathjax.org/mathjax/latest.
-# This tag requires that the tag USE_MATHJAX is set to YES.
-
-MATHJAX_RELPATH = http://cdn.mathjax.org/mathjax/latest
-
-# The MATHJAX_EXTENSIONS tag can be used to specify one or more MathJax
-# extension names that should be enabled during MathJax rendering. For example
-# MATHJAX_EXTENSIONS = TeX/AMSmath TeX/AMSsymbols
-# This tag requires that the tag USE_MATHJAX is set to YES.
-
-MATHJAX_EXTENSIONS =
-
-# The MATHJAX_CODEFILE tag can be used to specify a file with javascript pieces
-# of code that will be used on startup of the MathJax code. See the MathJax site
-# (see: http://docs.mathjax.org/en/latest/output.html) for more details. For an
-# example see the documentation.
-# This tag requires that the tag USE_MATHJAX is set to YES.
-
-MATHJAX_CODEFILE =
-
-# When the SEARCHENGINE tag is enabled doxygen will generate a search box for
-# the HTML output. The underlying search engine uses javascript and DHTML and
-# should work on any modern browser. Note that when using HTML help
-# (GENERATE_HTMLHELP), Qt help (GENERATE_QHP), or docsets (GENERATE_DOCSET)
-# there is already a search function so this one should typically be disabled.
-# For large projects the javascript based search engine can be slow, then
-# enabling SERVER_BASED_SEARCH may provide a better solution. It is possible to
-# search using the keyboard; to jump to the search box use <access key> + S
-# (what the <access key> is depends on the OS and browser, but it is typically
-# <CTRL>, <ALT>/<option>, or both). Inside the search box use the <cursor down
-# key> to jump into the search results window, the results can be navigated
-# using the <cursor keys>. Press <Enter> to select an item or <escape> to cancel
-# the search. The filter options can be selected when the cursor is inside the
-# search box by pressing <Shift>+<cursor down>. Also here use the <cursor keys>
-# to select a filter and <Enter> or <escape> to activate or cancel the filter
-# option.
-# The default value is: YES.
-# This tag requires that the tag GENERATE_HTML is set to YES.
-
-SEARCHENGINE = NO
-
-# When the SERVER_BASED_SEARCH tag is enabled the search engine will be
-# implemented using a web server instead of a web client using Javascript. There
-# are two flavors of web server based searching depending on the EXTERNAL_SEARCH
-# setting. When disabled, doxygen will generate a PHP script for searching and
-# an index file used by the script. When EXTERNAL_SEARCH is enabled the indexing
-# and searching needs to be provided by external tools. See the section
-# "External Indexing and Searching" for details.
-# The default value is: NO.
-# This tag requires that the tag SEARCHENGINE is set to YES.
-
-SERVER_BASED_SEARCH = NO
-
-# When EXTERNAL_SEARCH tag is enabled doxygen will no longer generate the PHP
-# script for searching. Instead the search results are written to an XML file
-# which needs to be processed by an external indexer. Doxygen will invoke an
-# external search engine pointed to by the SEARCHENGINE_URL option to obtain the
-# search results.
-#
-# Doxygen ships with an example indexer (doxyindexer) and search engine
-# (doxysearch.cgi) which are based on the open source search engine library
-# Xapian (see: http://xapian.org/).
-#
-# See the section "External Indexing and Searching" for details.
-# The default value is: NO.
-# This tag requires that the tag SEARCHENGINE is set to YES.
-
-EXTERNAL_SEARCH = NO
-
-# The SEARCHENGINE_URL should point to a search engine hosted by a web server
-# which will return the search results when EXTERNAL_SEARCH is enabled.
-#
-# Doxygen ships with an example indexer (doxyindexer) and search engine
-# (doxysearch.cgi) which are based on the open source search engine library
-# Xapian (see: http://xapian.org/). See the section "External Indexing and
-# Searching" for details.
-# This tag requires that the tag SEARCHENGINE is set to YES.
-
-SEARCHENGINE_URL =
-
-# When SERVER_BASED_SEARCH and EXTERNAL_SEARCH are both enabled the unindexed
-# search data is written to a file for indexing by an external tool. With the
-# SEARCHDATA_FILE tag the name of this file can be specified.
-# The default file is: searchdata.xml.
-# This tag requires that the tag SEARCHENGINE is set to YES.
-
-SEARCHDATA_FILE = searchdata.xml
-
-# When SERVER_BASED_SEARCH and EXTERNAL_SEARCH are both enabled the
-# EXTERNAL_SEARCH_ID tag can be used as an identifier for the project. This is
-# useful in combination with EXTRA_SEARCH_MAPPINGS to search through multiple
-# projects and redirect the results back to the right project.
-# This tag requires that the tag SEARCHENGINE is set to YES.
-
-EXTERNAL_SEARCH_ID =
-
-# The EXTRA_SEARCH_MAPPINGS tag can be used to enable searching through doxygen
-# projects other than the one defined by this configuration file, but that are
-# all added to the same external search index. Each project needs to have a
-# unique id set via EXTERNAL_SEARCH_ID. The search mapping then maps the id of
-# to a relative location where the documentation can be found. The format is:
-# EXTRA_SEARCH_MAPPINGS = tagname1=loc1 tagname2=loc2 ...
-# This tag requires that the tag SEARCHENGINE is set to YES.
-
-EXTRA_SEARCH_MAPPINGS =
-
-#---------------------------------------------------------------------------
-# Configuration options related to the LaTeX output
-#---------------------------------------------------------------------------
-
-# If the GENERATE_LATEX tag is set to YES, doxygen will generate LaTeX output.
-# The default value is: YES.
-
-GENERATE_LATEX = @DOXYFILE_LATEX@
-
-# The LATEX_OUTPUT tag is used to specify where the LaTeX docs will be put. If a
-# relative path is entered the value of OUTPUT_DIRECTORY will be put in front of
-# it.
-# The default directory is: latex.
-# This tag requires that the tag GENERATE_LATEX is set to YES.
-
-LATEX_OUTPUT = latex
-
-# The LATEX_CMD_NAME tag can be used to specify the LaTeX command name to be
-# invoked.
-#
-# Note that when enabling USE_PDFLATEX this option is only used for generating
-# bitmaps for formulas in the HTML output, but not in the Makefile that is
-# written to the output directory.
-# The default file is: latex.
-# This tag requires that the tag GENERATE_LATEX is set to YES.
-
-LATEX_CMD_NAME = @LATEX_COMPILER@
-
-# The MAKEINDEX_CMD_NAME tag can be used to specify the command name to generate
-# index for LaTeX.
-# The default file is: makeindex.
-# This tag requires that the tag GENERATE_LATEX is set to YES.
-
-MAKEINDEX_CMD_NAME = @MAKEINDEX_COMPILER@
-
-# If the COMPACT_LATEX tag is set to YES, doxygen generates more compact LaTeX
-# documents. This may be useful for small projects and may help to save some
-# trees in general.
-# The default value is: NO.
-# This tag requires that the tag GENERATE_LATEX is set to YES.
-
-COMPACT_LATEX = NO
-
-# The PAPER_TYPE tag can be used to set the paper type that is used by the
-# printer.
-# Possible values are: a4 (210 x 297 mm), letter (8.5 x 11 inches), legal (8.5 x
-# 14 inches) and executive (7.25 x 10.5 inches).
-# The default value is: a4.
-# This tag requires that the tag GENERATE_LATEX is set to YES.
-
-PAPER_TYPE = a4
-
-# The EXTRA_PACKAGES tag can be used to specify one or more LaTeX package names
-# that should be included in the LaTeX output. The package can be specified just
-# by its name or with the correct syntax as to be used with the LaTeX
-# \usepackage command. To get the times font for instance you can specify :
-# EXTRA_PACKAGES=times or EXTRA_PACKAGES={times}
-# To use the option intlimits with the amsmath package you can specify:
-# EXTRA_PACKAGES=[intlimits]{amsmath}
-# If left blank no extra packages will be included.
-# This tag requires that the tag GENERATE_LATEX is set to YES.
-
-EXTRA_PACKAGES =
-
-# The LATEX_HEADER tag can be used to specify a personal LaTeX header for the
-# generated LaTeX document. The header should contain everything until the first
-# chapter. If it is left blank doxygen will generate a standard header. See
-# section "Doxygen usage" for information on how to let doxygen write the
-# default header to a separate file.
-#
-# Note: Only use a user-defined header if you know what you are doing! The
-# following commands have a special meaning inside the header: $title,
-# $datetime, $date, $doxygenversion, $projectname, $projectnumber,
-# $projectbrief, $projectlogo. Doxygen will replace $title with the empty
-# string, for the replacement values of the other commands the user is referred
-# to HTML_HEADER.
-# This tag requires that the tag GENERATE_LATEX is set to YES.
-
-LATEX_HEADER =
-
-# The LATEX_FOOTER tag can be used to specify a personal LaTeX footer for the
-# generated LaTeX document. The footer should contain everything after the last
-# chapter. If it is left blank doxygen will generate a standard footer. See
-# LATEX_HEADER for more information on how to generate a default footer and what
-# special commands can be used inside the footer.
-#
-# Note: Only use a user-defined footer if you know what you are doing!
-# This tag requires that the tag GENERATE_LATEX is set to YES.
-
-LATEX_FOOTER =
-
-# The LATEX_EXTRA_STYLESHEET tag can be used to specify additional user-defined
-# LaTeX style sheets that are included after the standard style sheets created
-# by doxygen. Using this option one can overrule certain style aspects. Doxygen
-# will copy the style sheet files to the output directory.
-# Note: The order of the extra style sheet files is of importance (e.g. the last
-# style sheet in the list overrules the setting of the previous ones in the
-# list).
-# This tag requires that the tag GENERATE_LATEX is set to YES.
-
-LATEX_EXTRA_STYLESHEET =
-
-# The LATEX_EXTRA_FILES tag can be used to specify one or more extra images or
-# other source files which should be copied to the LATEX_OUTPUT output
-# directory. Note that the files will be copied as-is; there are no commands or
-# markers available.
-# This tag requires that the tag GENERATE_LATEX is set to YES.
-
-LATEX_EXTRA_FILES =
-
-# If the PDF_HYPERLINKS tag is set to YES, the LaTeX that is generated is
-# prepared for conversion to PDF (using ps2pdf or pdflatex). The PDF file will
-# contain links (just like the HTML output) instead of page references. This
-# makes the output suitable for online browsing using a PDF viewer.
-# The default value is: YES.
-# This tag requires that the tag GENERATE_LATEX is set to YES.
-
-PDF_HYPERLINKS = YES
-
-# If the USE_PDFLATEX tag is set to YES, doxygen will use pdflatex to generate
-# the PDF file directly from the LaTeX files. Set this option to YES, to get a
-# higher quality PDF documentation.
-# The default value is: YES.
-# This tag requires that the tag GENERATE_LATEX is set to YES.
-
-USE_PDFLATEX = YES
-
-# If the LATEX_BATCHMODE tag is set to YES, doxygen will add the \batchmode
-# command to the generated LaTeX files. This will instruct LaTeX to keep running
-# if errors occur, instead of asking the user for help. This option is also used
-# when generating formulas in HTML.
-# The default value is: NO.
-# This tag requires that the tag GENERATE_LATEX is set to YES.
-
-LATEX_BATCHMODE = YES
-
-# If the LATEX_HIDE_INDICES tag is set to YES then doxygen will not include the
-# index chapters (such as File Index, Compound Index, etc.) in the output.
-# The default value is: NO.
-# This tag requires that the tag GENERATE_LATEX is set to YES.
-
-LATEX_HIDE_INDICES = NO
-
-# If the LATEX_SOURCE_CODE tag is set to YES then doxygen will include source
-# code with syntax highlighting in the LaTeX output.
-#
-# Note that which sources are shown also depends on other settings such as
-# SOURCE_BROWSER.
-# The default value is: NO.
-# This tag requires that the tag GENERATE_LATEX is set to YES.
-
-LATEX_SOURCE_CODE = NO
-
-# The LATEX_BIB_STYLE tag can be used to specify the style to use for the
-# bibliography, e.g. plainnat, or ieeetr. See
-# http://en.wikipedia.org/wiki/BibTeX and \cite for more info.
-# The default value is: plain.
-# This tag requires that the tag GENERATE_LATEX is set to YES.
-
-LATEX_BIB_STYLE = plain
-
-# If the LATEX_TIMESTAMP tag is set to YES then the footer of each generated
-# page will contain the date and time when the page was generated. Setting this
-# to NO can help when comparing the output of multiple runs.
-# The default value is: NO.
-# This tag requires that the tag GENERATE_LATEX is set to YES.
-
-LATEX_TIMESTAMP = NO
-
-#---------------------------------------------------------------------------
-# Configuration options related to the RTF output
-#---------------------------------------------------------------------------
-
-# If the GENERATE_RTF tag is set to YES, doxygen will generate RTF output. The
-# RTF output is optimized for Word 97 and may not look too pretty with other RTF
-# readers/editors.
-# The default value is: NO.
-
-GENERATE_RTF = NO
-
-# The RTF_OUTPUT tag is used to specify where the RTF docs will be put. If a
-# relative path is entered the value of OUTPUT_DIRECTORY will be put in front of
-# it.
-# The default directory is: rtf.
-# This tag requires that the tag GENERATE_RTF is set to YES.
-
-RTF_OUTPUT = rtf
-
-# If the COMPACT_RTF tag is set to YES, doxygen generates more compact RTF
-# documents. This may be useful for small projects and may help to save some
-# trees in general.
-# The default value is: NO.
-# This tag requires that the tag GENERATE_RTF is set to YES.
-
-COMPACT_RTF = NO
-
-# If the RTF_HYPERLINKS tag is set to YES, the RTF that is generated will
-# contain hyperlink fields. The RTF file will contain links (just like the HTML
-# output) instead of page references. This makes the output suitable for online
-# browsing using Word or some other Word compatible readers that support those
-# fields.
-#
-# Note: WordPad (write) and others do not support links.
-# The default value is: NO.
-# This tag requires that the tag GENERATE_RTF is set to YES.
-
-RTF_HYPERLINKS = NO
-
-# Load stylesheet definitions from file. Syntax is similar to doxygen's config
-# file, i.e. a series of assignments. You only have to provide replacements,
-# missing definitions are set to their default value.
-#
-# See also section "Doxygen usage" for information on how to generate the
-# default style sheet that doxygen normally uses.
-# This tag requires that the tag GENERATE_RTF is set to YES.
-
-RTF_STYLESHEET_FILE =
-
-# Set optional variables used in the generation of an RTF document. Syntax is
-# similar to doxygen's config file. A template extensions file can be generated
-# using doxygen -e rtf extensionFile.
-# This tag requires that the tag GENERATE_RTF is set to YES.
-
-RTF_EXTENSIONS_FILE =
-
-# If the RTF_SOURCE_CODE tag is set to YES then doxygen will include source code
-# with syntax highlighting in the RTF output.
-#
-# Note that which sources are shown also depends on other settings such as
-# SOURCE_BROWSER.
-# The default value is: NO.
-# This tag requires that the tag GENERATE_RTF is set to YES.
-
-RTF_SOURCE_CODE = NO
-
-#---------------------------------------------------------------------------
-# Configuration options related to the man page output
-#---------------------------------------------------------------------------
-
-# If the GENERATE_MAN tag is set to YES, doxygen will generate man pages for
-# classes and files.
-# The default value is: NO.
-
-GENERATE_MAN = YES
-
-# The MAN_OUTPUT tag is used to specify where the man pages will be put. If a
-# relative path is entered the value of OUTPUT_DIRECTORY will be put in front of
-# it. A directory man3 will be created inside the directory specified by
-# MAN_OUTPUT.
-# The default directory is: man.
-# This tag requires that the tag GENERATE_MAN is set to YES.
-
-MAN_OUTPUT = man
-
-# The MAN_EXTENSION tag determines the extension that is added to the generated
-# man pages. In case the manual section does not start with a number, the number
-# 3 is prepended. The dot (.) at the beginning of the MAN_EXTENSION tag is
-# optional.
-# The default value is: .3.
-# This tag requires that the tag GENERATE_MAN is set to YES.
-
-MAN_EXTENSION = .3
-
-# The MAN_SUBDIR tag determines the name of the directory created within
-# MAN_OUTPUT in which the man pages are placed. If defaults to man followed by
-# MAN_EXTENSION with the initial . removed.
-# This tag requires that the tag GENERATE_MAN is set to YES.
-
-MAN_SUBDIR =
-
-# If the MAN_LINKS tag is set to YES and doxygen generates man output, then it
-# will generate one additional man file for each entity documented in the real
-# man page(s). These additional files only source the real man page, but without
-# them the man command would be unable to find the correct page.
-# The default value is: NO.
-# This tag requires that the tag GENERATE_MAN is set to YES.
-
-MAN_LINKS = NO
-
-#---------------------------------------------------------------------------
-# Configuration options related to the XML output
-#---------------------------------------------------------------------------
-
-# If the GENERATE_XML tag is set to YES, doxygen will generate an XML file that
-# captures the structure of the code including all documentation.
-# The default value is: NO.
-
-GENERATE_XML = NO
-
-# The XML_OUTPUT tag is used to specify where the XML pages will be put. If a
-# relative path is entered the value of OUTPUT_DIRECTORY will be put in front of
-# it.
-# The default directory is: xml.
-# This tag requires that the tag GENERATE_XML is set to YES.
-
-XML_OUTPUT = xml
-
-# If the XML_PROGRAMLISTING tag is set to YES, doxygen will dump the program
-# listings (including syntax highlighting and cross-referencing information) to
-# the XML output. Note that enabling this will significantly increase the size
-# of the XML output.
-# The default value is: YES.
-# This tag requires that the tag GENERATE_XML is set to YES.
-
-XML_PROGRAMLISTING = YES
-
-#---------------------------------------------------------------------------
-# Configuration options related to the DOCBOOK output
-#---------------------------------------------------------------------------
-
-# If the GENERATE_DOCBOOK tag is set to YES, doxygen will generate Docbook files
-# that can be used to generate PDF.
-# The default value is: NO.
-
-GENERATE_DOCBOOK = NO
-
-# The DOCBOOK_OUTPUT tag is used to specify where the Docbook pages will be put.
-# If a relative path is entered the value of OUTPUT_DIRECTORY will be put in
-# front of it.
-# The default directory is: docbook.
-# This tag requires that the tag GENERATE_DOCBOOK is set to YES.
-
-DOCBOOK_OUTPUT = docbook
-
-# If the DOCBOOK_PROGRAMLISTING tag is set to YES, doxygen will include the
-# program listings (including syntax highlighting and cross-referencing
-# information) to the DOCBOOK output. Note that enabling this will significantly
-# increase the size of the DOCBOOK output.
-# The default value is: NO.
-# This tag requires that the tag GENERATE_DOCBOOK is set to YES.
-
-DOCBOOK_PROGRAMLISTING = NO
-
-#---------------------------------------------------------------------------
-# Configuration options for the AutoGen Definitions output
-#---------------------------------------------------------------------------
-
-# If the GENERATE_AUTOGEN_DEF tag is set to YES, doxygen will generate an
-# AutoGen Definitions (see http://autogen.sf.net) file that captures the
-# structure of the code including all documentation. Note that this feature is
-# still experimental and incomplete at the moment.
-# The default value is: NO.
-
-GENERATE_AUTOGEN_DEF = NO
-
-#---------------------------------------------------------------------------
-# Configuration options related to the Perl module output
-#---------------------------------------------------------------------------
-
-# If the GENERATE_PERLMOD tag is set to YES, doxygen will generate a Perl module
-# file that captures the structure of the code including all documentation.
-#
-# Note that this feature is still experimental and incomplete at the moment.
-# The default value is: NO.
-
-GENERATE_PERLMOD = NO
-
-# If the PERLMOD_LATEX tag is set to YES, doxygen will generate the necessary
-# Makefile rules, Perl scripts and LaTeX code to be able to generate PDF and DVI
-# output from the Perl module output.
-# The default value is: NO.
-# This tag requires that the tag GENERATE_PERLMOD is set to YES.
-
-PERLMOD_LATEX = NO
-
-# If the PERLMOD_PRETTY tag is set to YES, the Perl module output will be nicely
-# formatted so it can be parsed by a human reader. This is useful if you want to
-# understand what is going on. On the other hand, if this tag is set to NO, the
-# size of the Perl module output will be much smaller and Perl will parse it
-# just the same.
-# The default value is: YES.
-# This tag requires that the tag GENERATE_PERLMOD is set to YES.
-
-PERLMOD_PRETTY = YES
-
-# The names of the make variables in the generated doxyrules.make file are
-# prefixed with the string contained in PERLMOD_MAKEVAR_PREFIX. This is useful
-# so different doxyrules.make files included by the same Makefile don't
-# overwrite each other's variables.
-# This tag requires that the tag GENERATE_PERLMOD is set to YES.
-
-PERLMOD_MAKEVAR_PREFIX =
-
-#---------------------------------------------------------------------------
-# Configuration options related to the preprocessor
-#---------------------------------------------------------------------------
-
-# If the ENABLE_PREPROCESSING tag is set to YES, doxygen will evaluate all
-# C-preprocessor directives found in the sources and include files.
-# The default value is: YES.
-
-ENABLE_PREPROCESSING = YES
-
-# If the MACRO_EXPANSION tag is set to YES, doxygen will expand all macro names
-# in the source code. If set to NO, only conditional compilation will be
-# performed. Macro expansion can be done in a controlled way by setting
-# EXPAND_ONLY_PREDEF to YES.
-# The default value is: NO.
-# This tag requires that the tag ENABLE_PREPROCESSING is set to YES.
-
-MACRO_EXPANSION = YES
-
-# If the EXPAND_ONLY_PREDEF and MACRO_EXPANSION tags are both set to YES then
-# the macro expansion is limited to the macros specified with the PREDEFINED and
-# EXPAND_AS_DEFINED tags.
-# The default value is: NO.
-# This tag requires that the tag ENABLE_PREPROCESSING is set to YES.
-
-EXPAND_ONLY_PREDEF = NO
-
-# If the SEARCH_INCLUDES tag is set to YES, the include files in the
-# INCLUDE_PATH will be searched if a #include is found.
-# The default value is: YES.
-# This tag requires that the tag ENABLE_PREPROCESSING is set to YES.
-
-SEARCH_INCLUDES = YES
-
-# The INCLUDE_PATH tag can be used to specify one or more directories that
-# contain include files that are not input files but should be processed by the
-# preprocessor.
-# This tag requires that the tag SEARCH_INCLUDES is set to YES.
-
-INCLUDE_PATH =
-
-# You can use the INCLUDE_FILE_PATTERNS tag to specify one or more wildcard
-# patterns (like *.h and *.hpp) to filter out the header-files in the
-# directories. If left blank, the patterns specified with FILE_PATTERNS will be
-# used.
-# This tag requires that the tag ENABLE_PREPROCESSING is set to YES.
-
-INCLUDE_FILE_PATTERNS =
-
-# The PREDEFINED tag can be used to specify one or more macro names that are
-# defined before the preprocessor is started (similar to the -D option of e.g.
-# gcc). The argument of the tag is a list of macros of the form: name or
-# name=definition (no spaces). If the definition and the "=" are omitted, "=1"
-# is assumed. To prevent a macro definition from being undefined via #undef or
-# recursively expanded use the := operator instead of the = operator.
-# This tag requires that the tag ENABLE_PREPROCESSING is set to YES.
-
-PREDEFINED = DOXYGEN \
- PRINTF_ATTRIBUTE(x,y)=
-
-# If the MACRO_EXPANSION and EXPAND_ONLY_PREDEF tags are set to YES then this
-# tag can be used to specify a list of macro names that should be expanded. The
-# macro definition that is found in the sources will be used. Use the PREDEFINED
-# tag if you want to use a different macro definition that overrules the
-# definition found in the source code.
-# This tag requires that the tag ENABLE_PREPROCESSING is set to YES.
-
-EXPAND_AS_DEFINED =
-
-# If the SKIP_FUNCTION_MACROS tag is set to YES then doxygen's preprocessor will
-# remove all references to function-like macros that are alone on a line, have
-# an all uppercase name, and do not end with a semicolon. Such function macros
-# are typically used for boiler-plate code, and will confuse the parser if not
-# removed.
-# The default value is: YES.
-# This tag requires that the tag ENABLE_PREPROCESSING is set to YES.
-
-SKIP_FUNCTION_MACROS = YES
-
-#---------------------------------------------------------------------------
-# Configuration options related to external references
-#---------------------------------------------------------------------------
-
-# The TAGFILES tag can be used to specify one or more tag files. For each tag
-# file the location of the external documentation should be added. The format of
-# a tag file without this location is as follows:
-# TAGFILES = file1 file2 ...
-# Adding location for the tag files is done as follows:
-# TAGFILES = file1=loc1 "file2 = loc2" ...
-# where loc1 and loc2 can be relative or absolute paths or URLs. See the
-# section "Linking to external documentation" for more information about the use
-# of tag files.
-# Note: Each tag file must have a unique name (where the name does NOT include
-# the path). If a tag file is not located in the directory in which doxygen is
-# run, you must also specify the path to the tagfile here.
-
-TAGFILES =
-
-# When a file name is specified after GENERATE_TAGFILE, doxygen will create a
-# tag file that is based on the input files it reads. See section "Linking to
-# external documentation" for more information about the usage of tag files.
-
-GENERATE_TAGFILE = "@CMAKE_CURRENT_BINARY_DIR@/html/@PROJECT_NAME@.TAGFILE"
-
-# If the ALLEXTERNALS tag is set to YES, all external class will be listed in
-# the class index. If set to NO, only the inherited external classes will be
-# listed.
-# The default value is: NO.
-
-ALLEXTERNALS = YES
-
-# If the EXTERNAL_GROUPS tag is set to YES, all external groups will be listed
-# in the modules index. If set to NO, only the current project's groups will be
-# listed.
-# The default value is: YES.
-
-EXTERNAL_GROUPS = YES
-
-# If the EXTERNAL_PAGES tag is set to YES, all external pages will be listed in
-# the related pages index. If set to NO, only the current project's pages will
-# be listed.
-# The default value is: YES.
-
-EXTERNAL_PAGES = YES
-
-# The PERL_PATH should be the absolute path and name of the perl script
-# interpreter (i.e. the result of 'which perl').
-# The default file (with absolute path) is: /usr/bin/perl.
-
-PERL_PATH = /usr/bin/perl
-
-#---------------------------------------------------------------------------
-# Configuration options related to the dot tool
-#---------------------------------------------------------------------------
-
-# If the CLASS_DIAGRAMS tag is set to YES, doxygen will generate a class diagram
-# (in HTML and LaTeX) for classes with base or super classes. Setting the tag to
-# NO turns the diagrams off. Note that this option also works with HAVE_DOT
-# disabled, but it is recommended to install and use dot, since it yields more
-# powerful graphs.
-# The default value is: YES.
-
-CLASS_DIAGRAMS = NO
-
-# You can define message sequence charts within doxygen comments using the \msc
-# command. Doxygen will then run the mscgen tool (see:
-# http://www.mcternan.me.uk/mscgen/)) to produce the chart and insert it in the
-# documentation. The MSCGEN_PATH tag allows you to specify the directory where
-# the mscgen tool resides. If left empty the tool is assumed to be found in the
-# default search path.
-
-MSCGEN_PATH =
-
-# You can include diagrams made with dia in doxygen documentation. Doxygen will
-# then run dia to produce the diagram and insert it in the documentation. The
-# DIA_PATH tag allows you to specify the directory where the dia binary resides.
-# If left empty dia is assumed to be found in the default search path.
-
-DIA_PATH =
-
-# If set to YES the inheritance and collaboration graphs will hide inheritance
-# and usage relations if the target is undocumented or is not a class.
-# The default value is: YES.
-
-HIDE_UNDOC_RELATIONS = YES
-
-# If you set the HAVE_DOT tag to YES then doxygen will assume the dot tool is
-# available from the path. This tool is part of Graphviz (see:
-# http://www.graphviz.org/), a graph visualization toolkit from AT&T and Lucent
-# Bell Labs. The other options in this section have no effect if this option is
-# set to NO
-# The default value is: NO.
-
-HAVE_DOT = @DOXYGEN_DOT_FOUND@
-
-# The DOT_NUM_THREADS specifies the number of dot invocations doxygen is allowed
-# to run in parallel. When set to 0 doxygen will base this on the number of
-# processors available in the system. You can set it explicitly to a value
-# larger than 0 to get control over the balance between CPU load and processing
-# speed.
-# Minimum value: 0, maximum value: 32, default value: 0.
-# This tag requires that the tag HAVE_DOT is set to YES.
-
-DOT_NUM_THREADS = 0
-
-# When you want a differently looking font in the dot files that doxygen
-# generates you can specify the font name using DOT_FONTNAME. You need to make
-# sure dot is able to find the font, which can be done by putting it in a
-# standard location or by setting the DOTFONTPATH environment variable or by
-# setting DOT_FONTPATH to the directory containing the font.
-# The default value is: Helvetica.
-# This tag requires that the tag HAVE_DOT is set to YES.
-
-DOT_FONTNAME =
-
-# The DOT_FONTSIZE tag can be used to set the size (in points) of the font of
-# dot graphs.
-# Minimum value: 4, maximum value: 24, default value: 10.
-# This tag requires that the tag HAVE_DOT is set to YES.
-
-DOT_FONTSIZE = 10
-
-# By default doxygen will tell dot to use the default font as specified with
-# DOT_FONTNAME. If you specify a different font using DOT_FONTNAME you can set
-# the path where dot can find it using this tag.
-# This tag requires that the tag HAVE_DOT is set to YES.
-
-DOT_FONTPATH =
-
-# If the CLASS_GRAPH tag is set to YES then doxygen will generate a graph for
-# each documented class showing the direct and indirect inheritance relations.
-# Setting this tag to YES will force the CLASS_DIAGRAMS tag to NO.
-# The default value is: YES.
-# This tag requires that the tag HAVE_DOT is set to YES.
-
-CLASS_GRAPH = YES
-
-# If the COLLABORATION_GRAPH tag is set to YES then doxygen will generate a
-# graph for each documented class showing the direct and indirect implementation
-# dependencies (inheritance, containment, and class references variables) of the
-# class with other documented classes.
-# The default value is: YES.
-# This tag requires that the tag HAVE_DOT is set to YES.
-
-COLLABORATION_GRAPH = YES
-
-# If the GROUP_GRAPHS tag is set to YES then doxygen will generate a graph for
-# groups, showing the direct groups dependencies.
-# The default value is: YES.
-# This tag requires that the tag HAVE_DOT is set to YES.
-
-GROUP_GRAPHS = YES
-
-# If the UML_LOOK tag is set to YES, doxygen will generate inheritance and
-# collaboration diagrams in a style similar to the OMG's Unified Modeling
-# Language.
-# The default value is: NO.
-# This tag requires that the tag HAVE_DOT is set to YES.
-
-UML_LOOK = NO
-
-# If the UML_LOOK tag is enabled, the fields and methods are shown inside the
-# class node. If there are many fields or methods and many nodes the graph may
-# become too big to be useful. The UML_LIMIT_NUM_FIELDS threshold limits the
-# number of items for each type to make the size more manageable. Set this to 0
-# for no limit. Note that the threshold may be exceeded by 50% before the limit
-# is enforced. So when you set the threshold to 10, up to 15 fields may appear,
-# but if the number exceeds 15, the total amount of fields shown is limited to
-# 10.
-# Minimum value: 0, maximum value: 100, default value: 10.
-# This tag requires that the tag HAVE_DOT is set to YES.
-
-UML_LIMIT_NUM_FIELDS = 10
-
-# If the TEMPLATE_RELATIONS tag is set to YES then the inheritance and
-# collaboration graphs will show the relations between templates and their
-# instances.
-# The default value is: NO.
-# This tag requires that the tag HAVE_DOT is set to YES.
-
-TEMPLATE_RELATIONS = YES
-
-# If the INCLUDE_GRAPH, ENABLE_PREPROCESSING and SEARCH_INCLUDES tags are set to
-# YES then doxygen will generate a graph for each documented file showing the
-# direct and indirect include dependencies of the file with other documented
-# files.
-# The default value is: YES.
-# This tag requires that the tag HAVE_DOT is set to YES.
-
-INCLUDE_GRAPH = NO
-
-# If the INCLUDED_BY_GRAPH, ENABLE_PREPROCESSING and SEARCH_INCLUDES tags are
-# set to YES then doxygen will generate a graph for each documented file showing
-# the direct and indirect include dependencies of the file with other documented
-# files.
-# The default value is: YES.
-# This tag requires that the tag HAVE_DOT is set to YES.
-
-INCLUDED_BY_GRAPH = YES
-
-# If the CALL_GRAPH tag is set to YES then doxygen will generate a call
-# dependency graph for every global function or class method.
-#
-# Note that enabling this option will significantly increase the time of a run.
-# So in most cases it will be better to enable call graphs for selected
-# functions only using the \callgraph command. Disabling a call graph can be
-# accomplished by means of the command \hidecallgraph.
-# The default value is: NO.
-# This tag requires that the tag HAVE_DOT is set to YES.
-
-CALL_GRAPH = NO
-
-# If the CALLER_GRAPH tag is set to YES then doxygen will generate a caller
-# dependency graph for every global function or class method.
-#
-# Note that enabling this option will significantly increase the time of a run.
-# So in most cases it will be better to enable caller graphs for selected
-# functions only using the \callergraph command. Disabling a caller graph can be
-# accomplished by means of the command \hidecallergraph.
-# The default value is: NO.
-# This tag requires that the tag HAVE_DOT is set to YES.
-
-CALLER_GRAPH = NO
-
-# If the GRAPHICAL_HIERARCHY tag is set to YES then doxygen will graphical
-# hierarchy of all classes instead of a textual one.
-# The default value is: YES.
-# This tag requires that the tag HAVE_DOT is set to YES.
-
-GRAPHICAL_HIERARCHY = YES
-
-# If the DIRECTORY_GRAPH tag is set to YES then doxygen will show the
-# dependencies a directory has on other directories in a graphical way. The
-# dependency relations are determined by the #include relations between the
-# files in the directories.
-# The default value is: YES.
-# This tag requires that the tag HAVE_DOT is set to YES.
-
-DIRECTORY_GRAPH = YES
-
-# The DOT_IMAGE_FORMAT tag can be used to set the image format of the images
-# generated by dot. For an explanation of the image formats see the section
-# output formats in the documentation of the dot tool (Graphviz (see:
-# http://www.graphviz.org/)).
-# Note: If you choose svg you need to set HTML_FILE_EXTENSION to xhtml in order
-# to make the SVG files visible in IE 9+ (other browsers do not have this
-# requirement).
-# Possible values are: png, jpg, gif, svg, png:gd, png:gd:gd, png:cairo,
-# png:cairo:gd, png:cairo:cairo, png:cairo:gdiplus, png:gdiplus and
-# png:gdiplus:gdiplus.
-# The default value is: png.
-# This tag requires that the tag HAVE_DOT is set to YES.
-
-DOT_IMAGE_FORMAT = png
-
-# If DOT_IMAGE_FORMAT is set to svg, then this option can be set to YES to
-# enable generation of interactive SVG images that allow zooming and panning.
-#
-# Note that this requires a modern browser other than Internet Explorer. Tested
-# and working are Firefox, Chrome, Safari, and Opera.
-# Note: For IE 9+ you need to set HTML_FILE_EXTENSION to xhtml in order to make
-# the SVG files visible. Older versions of IE do not have SVG support.
-# The default value is: NO.
-# This tag requires that the tag HAVE_DOT is set to YES.
-
-INTERACTIVE_SVG = NO
-
-# The DOT_PATH tag can be used to specify the path where the dot tool can be
-# found. If left blank, it is assumed the dot tool can be found in the path.
-# This tag requires that the tag HAVE_DOT is set to YES.
-
-DOT_PATH = @DOXYGEN_DOT_EXECUTABLE_PATH@
-
-# The DOTFILE_DIRS tag can be used to specify one or more directories that
-# contain dot files that are included in the documentation (see the \dotfile
-# command).
-# This tag requires that the tag HAVE_DOT is set to YES.
-
-DOTFILE_DIRS =
-
-# The MSCFILE_DIRS tag can be used to specify one or more directories that
-# contain msc files that are included in the documentation (see the \mscfile
-# command).
-
-MSCFILE_DIRS =
-
-# The DIAFILE_DIRS tag can be used to specify one or more directories that
-# contain dia files that are included in the documentation (see the \diafile
-# command).
-
-DIAFILE_DIRS =
-
-# When using plantuml, the PLANTUML_JAR_PATH tag should be used to specify the
-# path where java can find the plantuml.jar file. If left blank, it is assumed
-# PlantUML is not used or called during a preprocessing step. Doxygen will
-# generate a warning when it encounters a \startuml command in this case and
-# will not generate output for the diagram.
-
-PLANTUML_JAR_PATH =
-
-# When using plantuml, the specified paths are searched for files specified by
-# the !include statement in a plantuml block.
-
-PLANTUML_INCLUDE_PATH =
-
-# The DOT_GRAPH_MAX_NODES tag can be used to set the maximum number of nodes
-# that will be shown in the graph. If the number of nodes in a graph becomes
-# larger than this value, doxygen will truncate the graph, which is visualized
-# by representing a node as a red box. Note that doxygen if the number of direct
-# children of the root node in a graph is already larger than
-# DOT_GRAPH_MAX_NODES then the graph will not be shown at all. Also note that
-# the size of a graph can be further restricted by MAX_DOT_GRAPH_DEPTH.
-# Minimum value: 0, maximum value: 10000, default value: 50.
-# This tag requires that the tag HAVE_DOT is set to YES.
-
-DOT_GRAPH_MAX_NODES = 50
-
-# The MAX_DOT_GRAPH_DEPTH tag can be used to set the maximum depth of the graphs
-# generated by dot. A depth value of 3 means that only nodes reachable from the
-# root by following a path via at most 3 edges will be shown. Nodes that lay
-# further from the root node will be omitted. Note that setting this option to 1
-# or 2 may greatly reduce the computation time needed for large code bases. Also
-# note that the size of a graph can be further restricted by
-# DOT_GRAPH_MAX_NODES. Using a depth of 0 means no depth restriction.
-# Minimum value: 0, maximum value: 1000, default value: 0.
-# This tag requires that the tag HAVE_DOT is set to YES.
-
-MAX_DOT_GRAPH_DEPTH = 0
-
-# Set the DOT_TRANSPARENT tag to YES to generate images with a transparent
-# background. This is disabled by default, because dot on Windows does not seem
-# to support this out of the box.
-#
-# Warning: Depending on the platform used, enabling this option may lead to
-# badly anti-aliased labels on the edges of a graph (i.e. they become hard to
-# read).
-# The default value is: NO.
-# This tag requires that the tag HAVE_DOT is set to YES.
-
-DOT_TRANSPARENT = NO
-
-# Set the DOT_MULTI_TARGETS tag to YES to allow dot to generate multiple output
-# files in one run (i.e. multiple -o and -T options on the command line). This
-# makes dot run faster, but since only newer versions of dot (>1.8.10) support
-# this, this feature is disabled by default.
-# The default value is: NO.
-# This tag requires that the tag HAVE_DOT is set to YES.
-
-DOT_MULTI_TARGETS = YES
-
-# If the GENERATE_LEGEND tag is set to YES doxygen will generate a legend page
-# explaining the meaning of the various boxes and arrows in the dot generated
-# graphs.
-# The default value is: YES.
-# This tag requires that the tag HAVE_DOT is set to YES.
-
-GENERATE_LEGEND = YES
-
-# If the DOT_CLEANUP tag is set to YES, doxygen will remove the intermediate dot
-# files that are used to generate the various graphs.
-# The default value is: YES.
-# This tag requires that the tag HAVE_DOT is set to YES.
-
-DOT_CLEANUP = YES
diff --git a/doc/that_style/LICENSE b/doc/that_style/LICENSE
new file mode 100644
index 0000000..eac42e7
--- /dev/null
+++ b/doc/that_style/LICENSE
@@ -0,0 +1,21 @@
+MIT License
+
+Copyright (c) 2017 Jan-Lukas Wynen
+
+Permission is hereby granted, free of charge, to any person obtaining a copy
+of this software and associated documentation files (the "Software"), to deal
+in the Software without restriction, including without limitation the rights
+to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
+copies of the Software, and to permit persons to whom the Software is
+furnished to do so, subject to the following conditions:
+
+The above copyright notice and this permission notice shall be included in all
+copies or substantial portions of the Software.
+
+THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
+AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
+LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
+OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
+SOFTWARE.
diff --git a/doc/that_style/README.md b/doc/that_style/README.md
new file mode 100644
index 0000000..7572720
--- /dev/null
+++ b/doc/that_style/README.md
@@ -0,0 +1,22 @@
+# that style
+A plain, more modern HTML style for Doxygen
+
+## Requirements
+- Doxygen (tested with version 1.8.13)
+- *optional*: a sass/scss compiler if you want to modify the style
+
+## Simple usage
+Tell Doxygen about the files for that style as shown in [doxyfile.conf](doxyfile.conf). You might need to adjust the
+paths depending on where you installed that style.
+When you run Doxygen, all files are copied into to generated HTML folder. So you don't need to keep the originals around
+unless you want to re-generate the documentation.
+
+## Advanced
+that style uses a custom javascript to hack some nice stripes into some tables. It has to be loaded from HTML. Hence you need
+to use the provided custom header. Since its default content may change when Doxygen is updated, there might be syntax error in
+the generated HTML. If this is the case, you can remove the custom header (adjust your doxyfile.conf). This has no
+disadvantages other than removing the stripes.
+
+[that_style.css](that_style.css) was generated from the scss files in the folder [sass](sass). If you want to change the style,
+use those files in order to have better control. For instance, you can easily change most colors by modifying the variables
+in the beginning of [that_style.scss](sass/that_style.scss).
diff --git a/doc/that_style/header.html b/doc/that_style/header.html
new file mode 100644
index 0000000..3da4639
--- /dev/null
+++ b/doc/that_style/header.html
@@ -0,0 +1,56 @@
+<!-- HTML header for doxygen 1.8.13-->
+<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
+<head>
+<meta http-equiv="Content-Type" content="text/xhtml;charset=UTF-8"/>
+<meta http-equiv="X-UA-Compatible" content="IE=9"/>
+<meta name="generator" content="Doxygen $doxygenversion"/>
+<meta name="viewport" content="width=device-width, initial-scale=1"/>
+<!--BEGIN PROJECT_NAME--><title>$projectname: $title</title><!--END PROJECT_NAME-->
+<!--BEGIN !PROJECT_NAME--><title>$title</title><!--END !PROJECT_NAME-->
+<link href="$relpath^tabs.css" rel="stylesheet" type="text/css"/>
+<script type="text/javascript" src="$relpath^jquery.js"></script>
+<script type="text/javascript" src="$relpath^dynsections.js"></script>
+$treeview
+$search
+$mathjax
+<link href="$relpath^$stylesheet" rel="stylesheet" type="text/css" />
+<script src="$relpath^striped_bg.js"></script>
+$extrastylesheet
+</head>
+<body>
+<div id="top"><!-- do not remove this div, it is closed by doxygen! -->
+
+<!--BEGIN TITLEAREA-->
+<div id="titlearea">
+<table cellspacing="0" cellpadding="0">
+ <tbody>
+ <tr style="height: 56px;">
+ <!--BEGIN PROJECT_LOGO-->
+ <td id="projectlogo"><img alt="Logo" src="$relpath^$projectlogo"/></td>
+ <!--END PROJECT_LOGO-->
+ <!--BEGIN PROJECT_NAME-->
+ <td id="projectalign" style="padding-left: 0.5em;">
+ <div id="projectname">$projectname
+ <!--BEGIN PROJECT_NUMBER-->&#160;<span id="projectnumber">$projectnumber</span><!--END PROJECT_NUMBER-->
+ </div>
+ <!--BEGIN PROJECT_BRIEF--><div id="projectbrief">$projectbrief</div><!--END PROJECT_BRIEF-->
+ </td>
+ <!--END PROJECT_NAME-->
+ <!--BEGIN !PROJECT_NAME-->
+ <!--BEGIN PROJECT_BRIEF-->
+ <td style="padding-left: 0.5em;">
+ <div id="projectbrief">$projectbrief</div>
+ </td>
+ <!--END PROJECT_BRIEF-->
+ <!--END !PROJECT_NAME-->
+ <!--BEGIN DISABLE_INDEX-->
+ <!--BEGIN SEARCHENGINE-->
+ <td>$searchbox</td>
+ <!--END SEARCHENGINE-->
+ <!--END DISABLE_INDEX-->
+ </tr>
+ </tbody>
+</table>
+</div>
+<!--END TITLEAREA-->
+<!-- end header part -->
diff --git a/doc/that_style/img/doc.svg b/doc/that_style/img/doc.svg
new file mode 100644
index 0000000..68e1ba0
--- /dev/null
+++ b/doc/that_style/img/doc.svg
@@ -0,0 +1,97 @@
+<?xml version="1.0" encoding="UTF-8" standalone="no"?>
+<!-- Created with Inkscape (http://www.inkscape.org/) -->
+
+<svg
+ xmlns:dc="http://purl.org/dc/elements/1.1/"
+ xmlns:cc="http://creativecommons.org/ns#"
+ xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
+ xmlns:svg="http://www.w3.org/2000/svg"
+ xmlns="http://www.w3.org/2000/svg"
+ xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd"
+ xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape"
+ width="24"
+ height="22"
+ viewBox="0 0 6.3499999 5.8208335"
+ version="1.1"
+ id="svg8"
+ sodipodi:docname="doc.svg"
+ inkscape:version="0.92.1 r">
+ <defs
+ id="defs2" />
+ <sodipodi:namedview
+ id="base"
+ pagecolor="#ffffff"
+ bordercolor="#666666"
+ borderopacity="1.0"
+ inkscape:pageopacity="0.0"
+ inkscape:pageshadow="2"
+ inkscape:zoom="32"
+ inkscape:cx="11.139212"
+ inkscape:cy="14.811193"
+ inkscape:document-units="mm"
+ inkscape:current-layer="layer1"
+ showgrid="false"
+ inkscape:showpageshadow="false"
+ units="px"
+ inkscape:window-width="2560"
+ inkscape:window-height="1357"
+ inkscape:window-x="0"
+ inkscape:window-y="0"
+ inkscape:window-maximized="1" />
+ <metadata
+ id="metadata5">
+ <rdf:RDF>
+ <cc:Work
+ rdf:about="">
+ <dc:format>image/svg+xml</dc:format>
+ <dc:type
+ rdf:resource="http://purl.org/dc/dcmitype/StillImage" />
+ <dc:title />
+ </cc:Work>
+ </rdf:RDF>
+ </metadata>
+ <g
+ inkscape:label="Layer 1"
+ inkscape:groupmode="layer"
+ id="layer1"
+ transform="translate(0,-291.17915)">
+ <path
+ style="color:#000000;clip-rule:nonzero;display:inline;overflow:visible;visibility:visible;opacity:1;isolation:auto;mix-blend-mode:normal;color-interpolation:sRGB;color-interpolation-filters:linearRGB;solid-color:#000000;solid-opacity:1;fill:#ffffff;fill-opacity:1;fill-rule:nonzero;stroke:#4d4d4d;stroke-width:0.26458329;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;paint-order:normal;color-rendering:auto;image-rendering:auto;shape-rendering:auto;text-rendering:auto;enable-background:accumulate"
+ d="M 3.315043,291.8406 H 1.4552083 v 4.49792 h 3.1749999 v -3.10055 z"
+ id="path5095"
+ inkscape:connector-curvature="0" />
+ <path
+ style="color:#000000;font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:medium;line-height:normal;font-family:sans-serif;font-variant-ligatures:normal;font-variant-position:normal;font-variant-caps:normal;font-variant-numeric:normal;font-variant-alternates:normal;font-feature-settings:normal;text-indent:0;text-align:start;text-decoration:none;text-decoration-line:none;text-decoration-style:solid;text-decoration-color:#000000;letter-spacing:normal;word-spacing:normal;text-transform:none;writing-mode:lr-tb;direction:ltr;text-orientation:mixed;dominant-baseline:auto;baseline-shift:baseline;text-anchor:start;white-space:normal;shape-padding:0;clip-rule:nonzero;display:inline;overflow:visible;visibility:visible;opacity:1;isolation:auto;mix-blend-mode:normal;color-interpolation:sRGB;color-interpolation-filters:linearRGB;solid-color:#000000;solid-opacity:1;vector-effect:none;fill:#4d4d4d;fill-opacity:1;fill-rule:evenodd;stroke:none;stroke-width:0.26458332px;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;color-rendering:auto;image-rendering:auto;shape-rendering:auto;text-rendering:auto;enable-background:accumulate"
+ d="m 3.1837239,291.84114 v 1.71186 h 1.4472656 v -0.31418 H 3.4473958 v -1.39768 z"
+ id="path5128"
+ inkscape:connector-curvature="0" />
+ <rect
+ style="color:#000000;clip-rule:nonzero;display:inline;overflow:visible;visibility:visible;opacity:1;isolation:auto;mix-blend-mode:normal;color-interpolation:sRGB;color-interpolation-filters:linearRGB;solid-color:#000000;solid-opacity:1;fill:#4d4d4d;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:0.52916664;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;paint-order:normal;color-rendering:auto;image-rendering:auto;shape-rendering:auto;text-rendering:auto;enable-background:accumulate"
+ id="rect5132"
+ width="2.1166668"
+ height="0.26458332"
+ x="1.8520833"
+ y="293.82498" />
+ <rect
+ style="color:#000000;clip-rule:nonzero;display:inline;overflow:visible;visibility:visible;opacity:1;isolation:auto;mix-blend-mode:normal;color-interpolation:sRGB;color-interpolation-filters:linearRGB;solid-color:#000000;solid-opacity:1;fill:#4d4d4d;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:0.52916664;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;paint-order:normal;color-rendering:auto;image-rendering:auto;shape-rendering:auto;text-rendering:auto;enable-background:accumulate"
+ id="rect5136"
+ width="1.0583334"
+ height="0.26458332"
+ x="1.8520832"
+ y="294.35416" />
+ <rect
+ y="294.88333"
+ x="1.8520832"
+ height="0.26458332"
+ width="1.8520833"
+ id="rect5138"
+ style="color:#000000;clip-rule:nonzero;display:inline;overflow:visible;visibility:visible;opacity:1;isolation:auto;mix-blend-mode:normal;color-interpolation:sRGB;color-interpolation-filters:linearRGB;solid-color:#000000;solid-opacity:1;fill:#4d4d4d;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:0.52916664;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;paint-order:normal;color-rendering:auto;image-rendering:auto;shape-rendering:auto;text-rendering:auto;enable-background:accumulate" />
+ <rect
+ style="color:#000000;clip-rule:nonzero;display:inline;overflow:visible;visibility:visible;opacity:1;isolation:auto;mix-blend-mode:normal;color-interpolation:sRGB;color-interpolation-filters:linearRGB;solid-color:#000000;solid-opacity:1;fill:#4d4d4d;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:0.52916664;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;paint-order:normal;color-rendering:auto;image-rendering:auto;shape-rendering:auto;text-rendering:auto;enable-background:accumulate"
+ id="rect4543"
+ width="1.5875"
+ height="0.26458332"
+ x="1.8520832"
+ y="295.41248" />
+ </g>
+</svg>
diff --git a/doc/that_style/img/folderclosed.svg b/doc/that_style/img/folderclosed.svg
new file mode 100644
index 0000000..e53ec90
--- /dev/null
+++ b/doc/that_style/img/folderclosed.svg
@@ -0,0 +1,77 @@
+<?xml version="1.0" encoding="UTF-8" standalone="no"?>
+<!-- Created with Inkscape (http://www.inkscape.org/) -->
+
+<svg
+ xmlns:dc="http://purl.org/dc/elements/1.1/"
+ xmlns:cc="http://creativecommons.org/ns#"
+ xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
+ xmlns:svg="http://www.w3.org/2000/svg"
+ xmlns="http://www.w3.org/2000/svg"
+ xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd"
+ xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape"
+ width="24"
+ height="22"
+ viewBox="0 0 6.3499998 5.8208335"
+ version="1.1"
+ id="svg8"
+ inkscape:version="0.92.1 r"
+ sodipodi:docname="folderclosed.svg"
+ inkscape:export-filename="/home/jl/Prog/doxygen_style/folderclosed.png"
+ inkscape:export-xdpi="96"
+ inkscape:export-ydpi="96">
+ <defs
+ id="defs2" />
+ <sodipodi:namedview
+ id="base"
+ pagecolor="#ffffff"
+ bordercolor="#666666"
+ borderopacity="1.0"
+ inkscape:pageopacity="0.0"
+ inkscape:pageshadow="2"
+ inkscape:zoom="51.113139"
+ inkscape:cx="7.7057751"
+ inkscape:cy="12.584171"
+ inkscape:document-units="mm"
+ inkscape:current-layer="layer1"
+ showgrid="false"
+ inkscape:snap-global="false"
+ units="px"
+ inkscape:showpageshadow="false"
+ inkscape:window-width="2560"
+ inkscape:window-height="1357"
+ inkscape:window-x="0"
+ inkscape:window-y="0"
+ inkscape:window-maximized="1"
+ inkscape:measure-start="0,0"
+ inkscape:measure-end="0,0" />
+ <metadata
+ id="metadata5">
+ <rdf:RDF>
+ <cc:Work
+ rdf:about="">
+ <dc:format>image/svg+xml</dc:format>
+ <dc:type
+ rdf:resource="http://purl.org/dc/dcmitype/StillImage" />
+ <dc:title />
+ </cc:Work>
+ </rdf:RDF>
+ </metadata>
+ <g
+ inkscape:label="Layer 1"
+ inkscape:groupmode="layer"
+ id="layer1"
+ transform="translate(0,-291.17915)">
+ <path
+ inkscape:connector-curvature="0"
+ style="color:#000000;clip-rule:nonzero;display:inline;overflow:visible;visibility:visible;opacity:1;isolation:auto;mix-blend-mode:normal;color-interpolation:sRGB;color-interpolation-filters:linearRGB;solid-color:#000000;solid-opacity:1;fill:#4d4d4d;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:0.26458332;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;paint-order:stroke fill markers;color-rendering:auto;image-rendering:auto;shape-rendering:auto;text-rendering:auto;enable-background:accumulate"
+ d="m 0.52916667,292.2374 -0.26458334,0.52925 v 3.43958 H 4.7625001 v -3.43958 H 2.38125 L 2.1166667,292.2374 Z"
+ id="rect4498"
+ sodipodi:nodetypes="cccccccc" />
+ <path
+ inkscape:connector-curvature="0"
+ style="color:#000000;clip-rule:nonzero;display:inline;overflow:visible;visibility:visible;opacity:1;isolation:auto;mix-blend-mode:normal;color-interpolation:sRGB;color-interpolation-filters:linearRGB;solid-color:#000000;solid-opacity:1;fill:#cccccc;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:0.66145831;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;color-rendering:auto;image-rendering:auto;shape-rendering:auto;text-rendering:auto;enable-background:accumulate"
+ d="M 2.9104167,292.76665 2.38125,293.56034 H 0.26458333 v 0.26464 H 2.38125 l 0.5291667,-0.79375 h 1.8520834 v -0.26458 z"
+ id="rect4500"
+ sodipodi:nodetypes="ccccccccc" />
+ </g>
+</svg>
diff --git a/doc/that_style/img/folderopen.svg b/doc/that_style/img/folderopen.svg
new file mode 100644
index 0000000..1ab7b78
--- /dev/null
+++ b/doc/that_style/img/folderopen.svg
@@ -0,0 +1,83 @@
+<?xml version="1.0" encoding="UTF-8" standalone="no"?>
+<!-- Created with Inkscape (http://www.inkscape.org/) -->
+
+<svg
+ xmlns:dc="http://purl.org/dc/elements/1.1/"
+ xmlns:cc="http://creativecommons.org/ns#"
+ xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
+ xmlns:svg="http://www.w3.org/2000/svg"
+ xmlns="http://www.w3.org/2000/svg"
+ xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd"
+ xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape"
+ width="24"
+ height="22"
+ viewBox="0 0 6.3499998 5.8208335"
+ version="1.1"
+ id="svg8"
+ inkscape:version="0.92.1 r"
+ sodipodi:docname="folderopen.svg"
+ inkscape:export-filename="/home/jl/Prog/doxygen_style/folderopen.png"
+ inkscape:export-xdpi="96"
+ inkscape:export-ydpi="96">
+ <defs
+ id="defs2" />
+ <sodipodi:namedview
+ id="base"
+ pagecolor="#ffffff"
+ bordercolor="#666666"
+ borderopacity="1.0"
+ inkscape:pageopacity="0.0"
+ inkscape:pageshadow="2"
+ inkscape:zoom="43.725861"
+ inkscape:cx="8.2043861"
+ inkscape:cy="13.464183"
+ inkscape:document-units="mm"
+ inkscape:current-layer="layer1"
+ showgrid="false"
+ inkscape:snap-global="false"
+ units="px"
+ inkscape:showpageshadow="false"
+ inkscape:window-width="2560"
+ inkscape:window-height="1357"
+ inkscape:window-x="0"
+ inkscape:window-y="0"
+ inkscape:window-maximized="1"
+ inkscape:measure-start="0,0"
+ inkscape:measure-end="0,0" />
+ <metadata
+ id="metadata5">
+ <rdf:RDF>
+ <cc:Work
+ rdf:about="">
+ <dc:format>image/svg+xml</dc:format>
+ <dc:type
+ rdf:resource="http://purl.org/dc/dcmitype/StillImage" />
+ <dc:title />
+ </cc:Work>
+ </rdf:RDF>
+ </metadata>
+ <g
+ inkscape:label="Layer 1"
+ inkscape:groupmode="layer"
+ id="layer1"
+ transform="translate(0,-291.17915)">
+ <path
+ inkscape:connector-curvature="0"
+ style="color:#000000;clip-rule:nonzero;display:inline;overflow:visible;visibility:visible;opacity:1;isolation:auto;mix-blend-mode:normal;color-interpolation:sRGB;color-interpolation-filters:linearRGB;solid-color:#000000;solid-opacity:1;fill:#4d4d4d;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:0.66145831;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;color-rendering:auto;image-rendering:auto;shape-rendering:auto;text-rendering:auto;enable-background:accumulate"
+ d="m 0.52916667,292.23748 -0.26458334,0.52917 v 3.43958 H 4.762461 l 7.8e-5,-3.43958 H 2.38125 l -0.2645833,-0.52917 z"
+ id="path5228"
+ sodipodi:nodetypes="cccccccc" />
+ <path
+ inkscape:connector-curvature="0"
+ id="path5279"
+ d="M 1.0583333,293.5604 H 5.55625 L 4.7625,296.20603 H 0.26458333 Z"
+ style="color:#000000;clip-rule:nonzero;display:inline;overflow:visible;visibility:visible;opacity:1;isolation:auto;mix-blend-mode:normal;color-interpolation:sRGB;color-interpolation-filters:linearRGB;solid-color:#000000;solid-opacity:1;fill:#ececec;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:0.66145831;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;color-rendering:auto;image-rendering:auto;shape-rendering:auto;text-rendering:auto;enable-background:accumulate"
+ sodipodi:nodetypes="ccccc" />
+ <path
+ sodipodi:nodetypes="ccccccc"
+ inkscape:connector-curvature="0"
+ id="path5234"
+ d="M 1.0583333,294.35415 H 3.175 l 0.5291667,-0.52917 H 5.55625 L 4.7625,296.20603 H 0.26458333 Z"
+ style="color:#000000;clip-rule:nonzero;display:inline;overflow:visible;visibility:visible;opacity:1;isolation:auto;mix-blend-mode:normal;color-interpolation:sRGB;color-interpolation-filters:linearRGB;solid-color:#000000;solid-opacity:1;fill:#4d4d4d;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:0.66145831;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;color-rendering:auto;image-rendering:auto;shape-rendering:auto;text-rendering:auto;enable-background:accumulate" />
+ </g>
+</svg>
diff --git a/doc/that_style/img/mag_glass.svg b/doc/that_style/img/mag_glass.svg
new file mode 100644
index 0000000..e21a004
--- /dev/null
+++ b/doc/that_style/img/mag_glass.svg
@@ -0,0 +1,73 @@
+<?xml version="1.0" encoding="UTF-8" standalone="no"?>
+<!-- Created with Inkscape (http://www.inkscape.org/) -->
+
+<svg
+ xmlns:dc="http://purl.org/dc/elements/1.1/"
+ xmlns:cc="http://creativecommons.org/ns#"
+ xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
+ xmlns:svg="http://www.w3.org/2000/svg"
+ xmlns="http://www.w3.org/2000/svg"
+ xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd"
+ xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape"
+ width="22"
+ height="22"
+ viewBox="0 0 5.8208332 5.8208335"
+ version="1.1"
+ id="svg8"
+ inkscape:version="0.92.1 r"
+ sodipodi:docname="mag_glass.svg">
+ <defs
+ id="defs2" />
+ <sodipodi:namedview
+ id="base"
+ pagecolor="#ffffff"
+ bordercolor="#666666"
+ borderopacity="1.0"
+ inkscape:pageopacity="0.0"
+ inkscape:pageshadow="2"
+ inkscape:zoom="32"
+ inkscape:cx="8.961936"
+ inkscape:cy="10.205344"
+ inkscape:document-units="mm"
+ inkscape:current-layer="layer1"
+ showgrid="false"
+ units="px"
+ inkscape:showpageshadow="false"
+ inkscape:snap-bbox="false"
+ inkscape:bbox-nodes="true"
+ inkscape:window-width="2560"
+ inkscape:window-height="1357"
+ inkscape:window-x="0"
+ inkscape:window-y="0"
+ inkscape:window-maximized="1"
+ inkscape:snap-global="false" />
+ <metadata
+ id="metadata5">
+ <rdf:RDF>
+ <cc:Work
+ rdf:about="">
+ <dc:format>image/svg+xml</dc:format>
+ <dc:type
+ rdf:resource="http://purl.org/dc/dcmitype/StillImage" />
+ <dc:title></dc:title>
+ </cc:Work>
+ </rdf:RDF>
+ </metadata>
+ <g
+ inkscape:label="Layer 1"
+ inkscape:groupmode="layer"
+ id="layer1"
+ transform="translate(0,-291.17915)">
+ <path
+ style="color:#000000;clip-rule:nonzero;display:inline;overflow:visible;visibility:visible;opacity:1;isolation:auto;mix-blend-mode:normal;color-interpolation:sRGB;color-interpolation-filters:linearRGB;solid-color:#000000;solid-opacity:1;fill:#333333;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:1.99999988;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;color-rendering:auto;image-rendering:auto;shape-rendering:auto;text-rendering:auto;enable-background:accumulate"
+ d="M 6.9101562 2.4082031 C 3.1105656 2.4082031 -5.9211895e-16 5.5081643 0 9.3027344 C 0 13.097342 3.1105656 16.197266 6.9101562 16.197266 C 8.2869348 16.197266 9.5698699 15.787508 10.650391 15.087891 L 15.162109 19.587891 L 16.636719 18.115234 L 12.214844 13.707031 C 13.214837 12.510659 13.818359 10.974238 13.818359 9.3027344 C 13.818359 5.5081643 10.709747 2.4082031 6.9101562 2.4082031 z M 6.9101562 4.9101562 C 9.3624717 4.9101562 11.324219 6.8631249 11.324219 9.3027344 C 11.324219 11.742382 9.3624717 13.695312 6.9101562 13.695312 C 4.4578408 13.695312 2.5019531 11.742382 2.5019531 9.3027344 C 2.5019531 6.8631249 4.4578408 4.9101562 6.9101562 4.9101562 z "
+ transform="matrix(0.26458333,0,0,0.26458333,0,291.17915)"
+ id="rect4524" />
+ <path
+ transform="matrix(0.99422295,0,0,0.68955299,-0.83134947,91.755588)"
+ style="color:#000000;clip-rule:nonzero;display:inline;overflow:visible;visibility:visible;opacity:1;isolation:auto;mix-blend-mode:normal;color-interpolation:sRGB;color-interpolation-filters:linearRGB;solid-color:#000000;solid-opacity:1;fill:#333333;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:0.63466448;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;color-rendering:auto;image-rendering:auto;shape-rendering:auto;text-rendering:auto;enable-background:accumulate"
+ inkscape:transform-center-y="0.25905895"
+ d="m 5.6074138,294.49889 -1.0836583,-1.87695 2.1673165,0 z"
+ id="path4491" />
+ </g>
+</svg>
diff --git a/doc/that_style/img/nav_edge_inter.svg b/doc/that_style/img/nav_edge_inter.svg
new file mode 100644
index 0000000..f04f10f
--- /dev/null
+++ b/doc/that_style/img/nav_edge_inter.svg
@@ -0,0 +1,73 @@
+<?xml version="1.0" encoding="UTF-8" standalone="no"?>
+<!-- Created with Inkscape (http://www.inkscape.org/) -->
+
+<svg
+ xmlns:dc="http://purl.org/dc/elements/1.1/"
+ xmlns:cc="http://creativecommons.org/ns#"
+ xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
+ xmlns:svg="http://www.w3.org/2000/svg"
+ xmlns="http://www.w3.org/2000/svg"
+ xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd"
+ xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape"
+ width="10.53333"
+ height="32"
+ viewBox="0 0 9.8749964 30"
+ id="svg2"
+ version="1.1"
+ inkscape:version="0.92.1 r"
+ sodipodi:docname="nav_edge_inter.svg">
+ <defs
+ id="defs4" />
+ <sodipodi:namedview
+ id="base"
+ pagecolor="#ffffff"
+ bordercolor="#666666"
+ borderopacity="1.0"
+ inkscape:pageopacity="0.0"
+ inkscape:pageshadow="2"
+ inkscape:zoom="32"
+ inkscape:cx="8.6823304"
+ inkscape:cy="16.225639"
+ inkscape:document-units="px"
+ inkscape:current-layer="layer1"
+ showgrid="false"
+ units="px"
+ inkscape:snap-bbox="true"
+ inkscape:bbox-paths="false"
+ inkscape:bbox-nodes="true"
+ inkscape:snap-bbox-edge-midpoints="true"
+ inkscape:object-nodes="true"
+ inkscape:window-width="2560"
+ inkscape:window-height="1357"
+ inkscape:window-x="0"
+ inkscape:window-y="0"
+ inkscape:window-maximized="1" />
+ <metadata
+ id="metadata7">
+ <rdf:RDF>
+ <cc:Work
+ rdf:about="">
+ <dc:format>image/svg+xml</dc:format>
+ <dc:type
+ rdf:resource="http://purl.org/dc/dcmitype/StillImage" />
+ <dc:title></dc:title>
+ </cc:Work>
+ </rdf:RDF>
+ </metadata>
+ <g
+ inkscape:label="Layer 1"
+ inkscape:groupmode="layer"
+ id="layer1"
+ transform="translate(0,-1022.3622)">
+ <path
+ style="color:#000000;clip-rule:nonzero;display:inline;overflow:visible;visibility:visible;opacity:1;isolation:auto;mix-blend-mode:normal;color-interpolation:sRGB;color-interpolation-filters:linearRGB;solid-color:#000000;solid-opacity:1;fill:none;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:0;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;color-rendering:auto;image-rendering:auto;shape-rendering:auto;text-rendering:auto;enable-background:accumulate"
+ d="m 0,1022.3622 v 15 15 l 8,-15 z"
+ id="path4143"
+ inkscape:connector-curvature="0" />
+ <path
+ style="color:#000000;font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:medium;line-height:normal;font-family:sans-serif;font-variant-ligatures:normal;font-variant-position:normal;font-variant-caps:normal;font-variant-numeric:normal;font-variant-alternates:normal;font-feature-settings:normal;text-indent:0;text-align:start;text-decoration:none;text-decoration-line:none;text-decoration-style:solid;text-decoration-color:#000000;letter-spacing:normal;word-spacing:normal;text-transform:none;writing-mode:lr-tb;direction:ltr;text-orientation:mixed;dominant-baseline:auto;baseline-shift:baseline;text-anchor:start;white-space:normal;shape-padding:0;clip-rule:nonzero;display:inline;overflow:visible;visibility:visible;opacity:1;isolation:auto;mix-blend-mode:normal;color-interpolation:sRGB;color-interpolation-filters:linearRGB;solid-color:#000000;solid-opacity:1;vector-effect:none;fill:#333333;fill-opacity:1;fill-rule:evenodd;stroke:none;stroke-width:0.9375px;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;color-rendering:auto;image-rendering:auto;shape-rendering:auto;text-rendering:auto;enable-background:accumulate"
+ d="m 1.2910156,1022.3496 -0.82421872,0.4473 7.87890622,14.5527 -7.87890622,14.5527 0.82421872,0.4473 8.1210938,-15 z"
+ id="path5240"
+ inkscape:connector-curvature="0" />
+ </g>
+</svg>
diff --git a/doc/that_style/img/nav_edge_left.svg b/doc/that_style/img/nav_edge_left.svg
new file mode 100644
index 0000000..ca1adf4
--- /dev/null
+++ b/doc/that_style/img/nav_edge_left.svg
@@ -0,0 +1,73 @@
+<?xml version="1.0" encoding="UTF-8" standalone="no"?>
+<!-- Created with Inkscape (http://www.inkscape.org/) -->
+
+<svg
+ xmlns:dc="http://purl.org/dc/elements/1.1/"
+ xmlns:cc="http://creativecommons.org/ns#"
+ xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
+ xmlns:svg="http://www.w3.org/2000/svg"
+ xmlns="http://www.w3.org/2000/svg"
+ xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd"
+ xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape"
+ width="8.5333338"
+ height="32"
+ viewBox="0 0 8.0000001 30"
+ id="svg2"
+ version="1.1"
+ inkscape:version="0.92.1 r"
+ sodipodi:docname="nav_edge_left.svg">
+ <defs
+ id="defs4" />
+ <sodipodi:namedview
+ id="base"
+ pagecolor="#ffffff"
+ bordercolor="#666666"
+ borderopacity="1.0"
+ inkscape:pageopacity="0.0"
+ inkscape:pageshadow="2"
+ inkscape:zoom="32"
+ inkscape:cx="5.3721385"
+ inkscape:cy="14.16429"
+ inkscape:document-units="px"
+ inkscape:current-layer="layer1"
+ showgrid="false"
+ units="px"
+ inkscape:snap-bbox="true"
+ inkscape:bbox-paths="false"
+ inkscape:bbox-nodes="false"
+ inkscape:snap-bbox-edge-midpoints="false"
+ inkscape:object-nodes="true"
+ inkscape:window-width="2560"
+ inkscape:window-height="1357"
+ inkscape:window-x="0"
+ inkscape:window-y="0"
+ inkscape:window-maximized="1" />
+ <metadata
+ id="metadata7">
+ <rdf:RDF>
+ <cc:Work
+ rdf:about="">
+ <dc:format>image/svg+xml</dc:format>
+ <dc:type
+ rdf:resource="http://purl.org/dc/dcmitype/StillImage" />
+ <dc:title></dc:title>
+ </cc:Work>
+ </rdf:RDF>
+ </metadata>
+ <g
+ inkscape:label="Layer 1"
+ inkscape:groupmode="layer"
+ id="layer1"
+ transform="translate(0,-1022.3622)">
+ <path
+ style="color:#000000;clip-rule:nonzero;display:inline;overflow:visible;visibility:visible;opacity:1;isolation:auto;mix-blend-mode:normal;color-interpolation:sRGB;color-interpolation-filters:linearRGB;solid-color:#000000;solid-opacity:1;fill:#ffffff;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:6;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;color-rendering:auto;image-rendering:auto;shape-rendering:auto;text-rendering:auto;enable-background:accumulate"
+ d="M 0 0 L 0 32 L 8.5332031 16 L 0 0 z "
+ transform="matrix(0.93749998,0,0,0.93749998,0,1022.3622)"
+ id="rect4586" />
+ <path
+ style="color:#000000;clip-rule:nonzero;display:inline;overflow:visible;visibility:visible;opacity:1;isolation:auto;mix-blend-mode:normal;color-interpolation:sRGB;color-interpolation-filters:linearRGB;solid-color:#000000;solid-opacity:1;fill:none;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:0;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;color-rendering:auto;image-rendering:auto;shape-rendering:auto;text-rendering:auto;enable-background:accumulate"
+ d="m 0,1022.3622 v 15 15 l 8,-15 z"
+ id="path4143"
+ inkscape:connector-curvature="0" />
+ </g>
+</svg>
diff --git a/doc/that_style/img/nav_edge_right.svg b/doc/that_style/img/nav_edge_right.svg
new file mode 100644
index 0000000..bb33815
--- /dev/null
+++ b/doc/that_style/img/nav_edge_right.svg
@@ -0,0 +1,73 @@
+<?xml version="1.0" encoding="UTF-8" standalone="no"?>
+<!-- Created with Inkscape (http://www.inkscape.org/) -->
+
+<svg
+ xmlns:dc="http://purl.org/dc/elements/1.1/"
+ xmlns:cc="http://creativecommons.org/ns#"
+ xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
+ xmlns:svg="http://www.w3.org/2000/svg"
+ xmlns="http://www.w3.org/2000/svg"
+ xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd"
+ xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape"
+ width="8"
+ height="30"
+ viewBox="0 0 8.0000001 30"
+ id="svg2"
+ version="1.1"
+ inkscape:version="0.91 r13725"
+ sodipodi:docname="nav_edge.svg">
+ <defs
+ id="defs4" />
+ <sodipodi:namedview
+ id="base"
+ pagecolor="#ffffff"
+ bordercolor="#666666"
+ borderopacity="1.0"
+ inkscape:pageopacity="0.0"
+ inkscape:pageshadow="2"
+ inkscape:zoom="32"
+ inkscape:cx="5.3721385"
+ inkscape:cy="14.16429"
+ inkscape:document-units="px"
+ inkscape:current-layer="layer1"
+ showgrid="false"
+ units="px"
+ inkscape:snap-bbox="true"
+ inkscape:bbox-paths="false"
+ inkscape:bbox-nodes="false"
+ inkscape:snap-bbox-edge-midpoints="false"
+ inkscape:object-nodes="true"
+ inkscape:window-width="2560"
+ inkscape:window-height="1357"
+ inkscape:window-x="0"
+ inkscape:window-y="0"
+ inkscape:window-maximized="1" />
+ <metadata
+ id="metadata7">
+ <rdf:RDF>
+ <cc:Work
+ rdf:about="">
+ <dc:format>image/svg+xml</dc:format>
+ <dc:type
+ rdf:resource="http://purl.org/dc/dcmitype/StillImage" />
+ <dc:title></dc:title>
+ </cc:Work>
+ </rdf:RDF>
+ </metadata>
+ <g
+ inkscape:label="Layer 1"
+ inkscape:groupmode="layer"
+ id="layer1"
+ transform="translate(0,-1022.3622)">
+ <path
+ style="color:#000000;clip-rule:nonzero;display:inline;overflow:visible;visibility:visible;opacity:1;isolation:auto;mix-blend-mode:normal;color-interpolation:sRGB;color-interpolation-filters:linearRGB;solid-color:#000000;solid-opacity:1;fill:none;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:0;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;color-rendering:auto;image-rendering:auto;shape-rendering:auto;text-rendering:auto;enable-background:accumulate"
+ d="m 0,1022.3622 0,15 0,15 8,-15 -8,-15 z"
+ id="path4143"
+ inkscape:connector-curvature="0" />
+ <path
+ style="color:#000000;clip-rule:nonzero;display:inline;overflow:visible;visibility:visible;opacity:1;isolation:auto;mix-blend-mode:normal;color-interpolation:sRGB;color-interpolation-filters:linearRGB;solid-color:#000000;solid-opacity:1;fill:#ffffff;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:0;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;color-rendering:auto;image-rendering:auto;shape-rendering:auto;text-rendering:auto;enable-background:accumulate"
+ d="m 1e-8,1022.3622 7.99999999,15 0,-15 -8,0 z m 7.99999999,15 -8,15 8,0 0,-15 z"
+ id="rect4136"
+ inkscape:connector-curvature="0" />
+ </g>
+</svg>
diff --git a/doc/that_style/img/splitbar_handle.svg b/doc/that_style/img/splitbar_handle.svg
new file mode 100644
index 0000000..e0dc90d
--- /dev/null
+++ b/doc/that_style/img/splitbar_handle.svg
@@ -0,0 +1,120 @@
+<?xml version="1.0" encoding="UTF-8" standalone="no"?>
+<!-- Created with Inkscape (http://www.inkscape.org/) -->
+
+<svg
+ xmlns:dc="http://purl.org/dc/elements/1.1/"
+ xmlns:cc="http://creativecommons.org/ns#"
+ xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
+ xmlns:svg="http://www.w3.org/2000/svg"
+ xmlns="http://www.w3.org/2000/svg"
+ xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd"
+ xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape"
+ width="6"
+ height="9"
+ viewBox="0 0 1.5875 2.3812501"
+ version="1.1"
+ id="svg8"
+ inkscape:version="0.92.1 r"
+ sodipodi:docname="splitbar_handle.svg">
+ <defs
+ id="defs2" />
+ <sodipodi:namedview
+ id="base"
+ pagecolor="#ffffff"
+ bordercolor="#666666"
+ borderopacity="1.0"
+ inkscape:pageopacity="0.0"
+ inkscape:pageshadow="2"
+ inkscape:zoom="32"
+ inkscape:cx="8.7681488"
+ inkscape:cy="-2.7929517"
+ inkscape:document-units="mm"
+ inkscape:current-layer="layer1"
+ showgrid="false"
+ units="px"
+ inkscape:showpageshadow="false"
+ showguides="false"
+ inkscape:window-width="2560"
+ inkscape:window-height="1357"
+ inkscape:window-x="0"
+ inkscape:window-y="0"
+ inkscape:window-maximized="1">
+ <inkscape:grid
+ type="xygrid"
+ id="grid4487" />
+ </sodipodi:namedview>
+ <metadata
+ id="metadata5">
+ <rdf:RDF>
+ <cc:Work
+ rdf:about="">
+ <dc:format>image/svg+xml</dc:format>
+ <dc:type
+ rdf:resource="http://purl.org/dc/dcmitype/StillImage" />
+ <dc:title></dc:title>
+ </cc:Work>
+ </rdf:RDF>
+ </metadata>
+ <g
+ inkscape:label="Layer 1"
+ inkscape:groupmode="layer"
+ id="layer1"
+ transform="translate(0,-294.61873)">
+ <rect
+ style="color:#000000;clip-rule:nonzero;display:inline;overflow:visible;visibility:visible;opacity:1;isolation:auto;mix-blend-mode:normal;color-interpolation:sRGB;color-interpolation-filters:linearRGB;solid-color:#000000;solid-opacity:1;fill:#ffffff;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:0.52916664;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;color-rendering:auto;image-rendering:auto;shape-rendering:auto;text-rendering:auto;enable-background:accumulate"
+ id="rect4485"
+ width="0.26458335"
+ height="0.26458332"
+ x="0.26458332"
+ y="294.8833" />
+ <rect
+ y="294.8833"
+ x="1.0583333"
+ height="0.26458332"
+ width="0.26458335"
+ id="rect4489"
+ style="color:#000000;clip-rule:nonzero;display:inline;overflow:visible;visibility:visible;opacity:1;isolation:auto;mix-blend-mode:normal;color-interpolation:sRGB;color-interpolation-filters:linearRGB;solid-color:#000000;solid-opacity:1;fill:#ffffff;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:0.52916664;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;color-rendering:auto;image-rendering:auto;shape-rendering:auto;text-rendering:auto;enable-background:accumulate" />
+ <rect
+ y="295.41248"
+ x="0.26458329"
+ height="0.26458332"
+ width="0.26458335"
+ id="rect4491"
+ style="color:#000000;clip-rule:nonzero;display:inline;overflow:visible;visibility:visible;opacity:1;isolation:auto;mix-blend-mode:normal;color-interpolation:sRGB;color-interpolation-filters:linearRGB;solid-color:#000000;solid-opacity:1;fill:#ffffff;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:0.52916664;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;color-rendering:auto;image-rendering:auto;shape-rendering:auto;text-rendering:auto;enable-background:accumulate" />
+ <rect
+ style="color:#000000;clip-rule:nonzero;display:inline;overflow:visible;visibility:visible;opacity:1;isolation:auto;mix-blend-mode:normal;color-interpolation:sRGB;color-interpolation-filters:linearRGB;solid-color:#000000;solid-opacity:1;fill:#ffffff;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:0.52916664;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;color-rendering:auto;image-rendering:auto;shape-rendering:auto;text-rendering:auto;enable-background:accumulate"
+ id="rect4493"
+ width="0.26458335"
+ height="0.26458332"
+ x="1.0583333"
+ y="295.41248" />
+ <rect
+ style="color:#000000;clip-rule:nonzero;display:inline;overflow:visible;visibility:visible;opacity:1;isolation:auto;mix-blend-mode:normal;color-interpolation:sRGB;color-interpolation-filters:linearRGB;solid-color:#000000;solid-opacity:1;fill:#ffffff;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:0.52916664;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;color-rendering:auto;image-rendering:auto;shape-rendering:auto;text-rendering:auto;enable-background:accumulate"
+ id="rect4495"
+ width="0.26458335"
+ height="0.26458332"
+ x="0.26458332"
+ y="295.94165" />
+ <rect
+ y="295.94165"
+ x="1.0583333"
+ height="0.26458332"
+ width="0.26458335"
+ id="rect4497"
+ style="color:#000000;clip-rule:nonzero;display:inline;overflow:visible;visibility:visible;opacity:1;isolation:auto;mix-blend-mode:normal;color-interpolation:sRGB;color-interpolation-filters:linearRGB;solid-color:#000000;solid-opacity:1;fill:#ffffff;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:0.52916664;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;color-rendering:auto;image-rendering:auto;shape-rendering:auto;text-rendering:auto;enable-background:accumulate" />
+ <rect
+ y="296.47079"
+ x="0.26458329"
+ height="0.26458332"
+ width="0.26458335"
+ id="rect4499"
+ style="color:#000000;clip-rule:nonzero;display:inline;overflow:visible;visibility:visible;opacity:1;isolation:auto;mix-blend-mode:normal;color-interpolation:sRGB;color-interpolation-filters:linearRGB;solid-color:#000000;solid-opacity:1;fill:#ffffff;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:0.52916664;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;color-rendering:auto;image-rendering:auto;shape-rendering:auto;text-rendering:auto;enable-background:accumulate" />
+ <rect
+ style="color:#000000;clip-rule:nonzero;display:inline;overflow:visible;visibility:visible;opacity:1;isolation:auto;mix-blend-mode:normal;color-interpolation:sRGB;color-interpolation-filters:linearRGB;solid-color:#000000;solid-opacity:1;fill:#ffffff;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:0.52916664;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;color-rendering:auto;image-rendering:auto;shape-rendering:auto;text-rendering:auto;enable-background:accumulate"
+ id="rect4501"
+ width="0.26458335"
+ height="0.26458332"
+ x="1.0583333"
+ y="296.47079" />
+ </g>
+</svg>
diff --git a/doc/that_style/img/sync_off.png b/doc/that_style/img/sync_off.png
new file mode 100644
index 0000000..9d286d9
--- /dev/null
+++ b/doc/that_style/img/sync_off.png
Binary files differ
diff --git a/doc/that_style/img/sync_on.png b/doc/that_style/img/sync_on.png
new file mode 100644
index 0000000..b8434e8
--- /dev/null
+++ b/doc/that_style/img/sync_on.png
Binary files differ
diff --git a/doc/that_style/js/striped_bg.js b/doc/that_style/js/striped_bg.js
new file mode 100644
index 0000000..97ae0a8
--- /dev/null
+++ b/doc/that_style/js/striped_bg.js
@@ -0,0 +1,32 @@
+// Adds extra CSS classes "even" and "odd" to .memberdecls to allow
+// striped backgrounds.
+function MemberDeclsStriper () {
+ var counter = 0;
+
+ this.stripe = function() {
+ $(".memberdecls tbody").children().each(function(i) {
+
+ // reset counter at every heading -> always start with even
+ if ($(this).is(".heading")) {
+ counter = 0;
+ }
+
+ // add extra classes
+ if (counter % 2 == 1) {
+ $(this).addClass("odd");
+ }
+ else {
+ $(this).addClass("even");
+ }
+
+ // advance counter at every separator
+ // this is the only way to reliably detect which table rows belong together
+ if ($(this).is('[class^="separator"]')) {
+ counter++;
+ }
+ });
+ }
+}
+
+// execute the function
+$(document).ready(new MemberDeclsStriper().stripe);
diff --git a/doc/that_style/sass/_fragment_base.scss b/doc/that_style/sass/_fragment_base.scss
new file mode 100644
index 0000000..b46e46e
--- /dev/null
+++ b/doc/that_style/sass/_fragment_base.scss
@@ -0,0 +1,69 @@
+/*
+ Basic styling for fragments shared by all themes.
+*/
+
+div.fragment {
+ padding: 0;
+ margin: 4px 8px 4px 2px;
+ color: #bebebe;
+ background-color: #323232;
+ border: 3px solid #e8e8e8;
+ border-radius: 2px;
+ overflow-y: hidden;
+ overflow-x: auto;
+ position: relative;
+
+}
+
+div.line {
+ font-family: monospace, fixed;
+ font-size: 13px;
+ min-height: 13px;
+ line-height: 1.0;
+ text-indent: -53px;
+ margin: 0px;
+ padding: 1px 0 1px 53px;
+ white-space: pre;
+
+ @include transition-property(background-color);
+ @include transition-duration(0s);
+
+ &:hover {
+ background-color: #1a1a1a;
+ }
+
+ &::after {
+ // insert linefeed
+ content:"\000A";
+ white-space: pre;
+ }
+}
+
+span.lineno {
+ padding-right: 4px;
+ text-align: right;
+ color: black;
+ height: 100px;
+ white-space: pre;
+ border-right: 3px solid #1d7567;
+ background-color: #a0a0a0;
+}
+
+span.lineno a, span.lineno a:visited {
+ background-color: inherit;
+ color: #1e595a;
+}
+
+span.lineno a:hover {
+ background-color: #C8C8C8;
+ text-decoration: none;
+}
+
+.lineno {
+ -webkit-touch-callout: none;
+ -webkit-user-select: none;
+ -khtml-user-select: none;
+ -moz-user-select: none;
+ -ms-user-select: none;
+ user-select: none;
+}
diff --git a/doc/that_style/sass/_fragment_color.scss b/doc/that_style/sass/_fragment_color.scss
new file mode 100644
index 0000000..8b7977a
--- /dev/null
+++ b/doc/that_style/sass/_fragment_color.scss
@@ -0,0 +1,80 @@
+// colours of code view
+
+div.fragment {
+ color: #bebebe;
+ background-color: #323232;
+}
+
+div.fragment::before {
+ background-color: #1a1a1a;
+ border-right: 1px solid #3e3e3e;
+}
+
+div.line:hover {
+ background-color: #1a1a1a;
+}
+
+span.lineno {
+ color: #969696;
+ background-color: #1a1a1a;
+ border-right: 1px solid #3e3e3e;
+}
+
+span.lineno a, span.lineno a:visited {
+ background-color: inherit;
+ color: #dcdcdc;
+}
+
+span.lineno a:hover {
+ background-color: #323232;
+}
+
+
+// syntax highlighting
+
+a.code, a.code:visited {
+ color: #6cc7eb;
+}
+
+a.codeRef, a.codeRef:visited {
+ color: #3d95e6;
+}
+
+span.keyword {
+ color: #98f77a;
+ font-weight: bold;
+}
+
+span.keywordtype {
+ color: #ffa0a0;
+}
+
+span.keywordflow {
+ color: #98f77a;
+ font-weight: bold;
+}
+
+span.comment {
+ // color: #dadbb1;
+ color: #999;
+ font-style: oblique;
+}
+
+span.preprocessor {
+ color: #cd5c57;
+}
+
+span.stringliteral {
+ color: #64b041;
+}
+
+span.charliteral {
+ color: #64b041;
+}
+
+blockquote {
+ background-color: #F7F8FB;
+ border-left: 2px solid #9CAFD4;
+ margin: 0 24px 0 4px;
+ padding: 0 12px 0 16px;
+}
diff --git a/doc/that_style/sass/_menu_bar.scss b/doc/that_style/sass/_menu_bar.scss
new file mode 100644
index 0000000..d6aa1c3
--- /dev/null
+++ b/doc/that_style/sass/_menu_bar.scss
@@ -0,0 +1,70 @@
+/*
+ * The main menu at the top
+ */
+
+#main-menu {
+ background-image: none;
+ background: $background-color-dark;
+ padding: 0;
+}
+
+.sm-dox {
+ // :not(:last-child) -> do not style search box
+ &> li:not(:last-child) > a {
+ background-image: none;
+ text-shadow: none;
+ color: white;
+ font-weight: normal;
+ letter-spacing: 1px;
+ font-size: 11pt;
+ text-transform: uppercase;
+ }
+
+ &> li:not(:last-child) > a:hover,
+ &> li:not(:last-child) > a.highlighted {
+ background-color: $primary-color;
+ }
+
+ a span.sub-arrow {
+ // this sets the color of the arrow
+ border-color: white transparent transparent;
+ }
+
+ ul {
+ // sub menus
+ border: none;
+ @include border-radius(0 !important);
+ padding: 0;
+ background: $background-color-dark;
+ @include box-shadow(0 0 4px rgba(0,0,0,0.35), 0 0 8px rgba(0,0,0,0.2));
+
+ a {
+ background: inherit;
+ color: white;
+ font-weight: normal;
+ letter-spacing: 1px;
+ font-size: 11pt;
+ }
+
+ a:hover {
+ background: $primary-color;
+ color: white;
+ font-weight: normal;
+ letter-spacing: 1px;
+ font-size: 11pt;
+ }
+
+ a.highlighted {
+ background: $primary-color;
+ color: white;
+ font-weight: normal;
+ letter-spacing: 1px;
+ font-size: 11pt;
+ }
+
+ a span.sub-arrow {
+ /* this sets the color of the arrow */
+ border-color: white transparent transparent;
+ }
+ }
+}
diff --git a/doc/that_style/sass/_mixins.scss b/doc/that_style/sass/_mixins.scss
new file mode 100644
index 0000000..aa030de
--- /dev/null
+++ b/doc/that_style/sass/_mixins.scss
@@ -0,0 +1,33 @@
+@mixin box-shadow($args...) {
+ -moz-box-shadow: $args;
+ -webkit-box-shadow: $args;
+ -o-box-shadow: $args;
+ box-shadow: $args;
+}
+
+@mixin border-radius($args...) {
+ -moz-border-radius: $args;
+ -webkit-border-radius: $args;
+ border-radius: $args;
+}
+
+@mixin transition($args...) {
+ -webkit-transition: $args;
+ -moz-transition: $args;
+ -o-transition: $args;
+ transition: $args;
+}
+
+@mixin transition-property($arg) {
+ -webkit-transition: $arg;
+ -moz-transition: $arg;
+ -o-transition: $arg;
+ transition: $arg;
+}
+
+@mixin transition-duration($arg) {
+ -webkit-duration: $arg;
+ -moz-duration: $arg;
+ -o-duration: $arg;
+ duration: $arg;
+}
diff --git a/doc/that_style/sass/_nav_tree.scss b/doc/that_style/sass/_nav_tree.scss
new file mode 100644
index 0000000..0b265c6
--- /dev/null
+++ b/doc/that_style/sass/_nav_tree.scss
@@ -0,0 +1,72 @@
+/*
+ * The tree view on the left
+ */
+
+.arrow {
+ color:black;
+ cursor: pointer;
+ font-size: 80%;
+ display: inline-block;
+ width: 16px;
+ height: 22px;
+ margin-left: 4px;
+
+ -webkit-user-select: none;
+ -khtml-user-select: none;
+ -moz-user-select: none;
+ -ms-user-select: none;
+ user-select: none;
+
+ &:hover {
+ color: black;
+ }
+}
+
+#selected .arrow {
+ color: white;
+
+ &:hover {
+ color: #d2d2d2;
+ }
+}
+
+#nav-tree {
+ background-image: none;
+ background-color: white;
+
+ .item {
+ margin: 0;
+
+ &:hover {
+ background-color: #d2d2d2;
+ }
+ }
+
+ .selected {
+ background-image: none;
+ background-color: $primary-color;
+ color: white;
+ text-shadow: none;
+
+ &:hover {
+ background-image: none;
+ background-color: $primary-color;
+ color: white;
+ text-shadow: none;
+ }
+ }
+
+ a {
+ color: black;
+ }
+}
+
+.ui-resizable-e {
+ background: #808080 url("splitbar_handle.svg") no-repeat center;
+ border-right: solid 1px #c0c0c0;
+ border-left: solid 1px black;
+
+ &:hover {
+ background-color: #606060;
+ }
+}
diff --git a/doc/that_style/sass/_navpath.scss b/doc/that_style/sass/_navpath.scss
new file mode 100644
index 0000000..a266dca
--- /dev/null
+++ b/doc/that_style/sass/_navpath.scss
@@ -0,0 +1,121 @@
+/*
+ * The line at the bottom
+ */
+
+.navpath {
+ ul {
+ font-size: 11px;
+ background-image: none;
+ height: 30px;
+ line-height: 30px;
+ color: black;
+ border: none;
+ border-top: 1px solid #808080;
+ overflow: hidden;
+ margin: 0px;
+ padding: 0px;
+ }
+
+ /* intermediate navelems */
+ li:not(:first-child) {
+ list-style-type: none;
+ float: left;
+ padding-left: 18px;
+ padding-right: 10px;
+ color: black;
+ background-color: white;
+ background-image: url('nav_edge_inter.svg');
+ background-repeat: no-repeat;
+ background-position: left -1px;
+ background-size: auto 100%;
+ }
+
+ /* first navelem */
+ li:first-child {
+ list-style-type: none;
+ float: left;
+ padding-left: 15px;
+ padding-right: 10px;
+ color: black;
+ background-color: white;
+ background-image: none;
+ }
+
+ /* last navelem */
+ li:nth-last-child(2) {
+ list-style-type: none;
+ float: left;
+ padding-left:10px;
+ padding-right:15px;
+ color: white;
+ background-color: $primary-color;
+ background-image: url('nav_edge_right.svg');
+ background-repeat: no-repeat;
+ background-position: right -1px;
+ background-size: auto 100%;
+
+ }
+
+ li:nth-last-child(2):not(:first-child) {
+ list-style-type: none;
+ float: left;
+ padding-left:15px;
+ padding-right:15px;
+ color: white;
+ background-color: $primary-color;
+ background-image: url('nav_edge_left.svg'), url('nav_edge_right.svg');
+ background-repeat: no-repeat;
+ background-position: -1px -1px, right -1px;
+ background-size: auto 100%;
+ }
+
+ li.navelem a, .navpath li.navelem b {
+ height:32px;
+ display:block;
+ text-decoration: none;
+ outline: none;
+ color: inherit;
+ font-family: Roboto,sans-serif;
+ text-shadow: none;
+ text-decoration: none;
+ font-weight: normal;
+ }
+
+ li.navelem a:hover {
+ color: inherit;
+ text-decoration: underline;
+ }
+
+ // the "doxygen" logo at the right
+ li.footer {
+ list-style-type: none;
+ float: right;
+ padding-left: 0;
+ padding-right: 10px;
+ background-color: #d5d5d5;
+ background-image: none;
+ color: black;
+ font-size: 8pt;
+
+ // show the edge image
+ &:before {
+ content: "";
+ width: 13px;
+ height: 30px;
+ display: inline-block;
+ float: left;
+ background-image: url("nav_edge_right.svg");
+ background-repeat: no-repeat;
+ background-position: right 0;
+ background-size: auto 100%;
+
+ /* flip the element horizontally */
+ -moz-transform: scaleX(-1);
+ -o-transform: scaleX(-1);
+ -webkit-transform: scaleX(-1);
+ transform: scaleX(-1);
+ filter: FlipH;
+ -ms-filter: "FlipH";
+ }
+ }
+}
diff --git a/doc/that_style/sass/_search.scss b/doc/that_style/sass/_search.scss
new file mode 100644
index 0000000..abd83bc
--- /dev/null
+++ b/doc/that_style/sass/_search.scss
@@ -0,0 +1,89 @@
+/*
+ * The search box
+ */
+
+.sm-dox > li:last-child {
+ margin-right: 10pt;
+}
+
+#MSearchBox {
+ border: 2px inset black;
+ display: table;
+ width: 350px;
+ height: 26px;
+ background: white;
+ margin-top: 5px;
+
+ .left {
+ background-image: none;
+ display: table-cell;
+ width: 100%;
+ height: inherit;
+ left: 0;
+ }
+
+ // don't need this element
+ .right {
+ background-image: none;
+ width: 0;
+ display: none;
+ visibility: hidden;
+ }
+}
+
+// override for when there is no main menu
+nav > #MSearchBox {
+ border: 2px solid #666666;
+ margin: 5px 10pt 0 0;
+ height: 22px;
+}
+
+#MSearchSelect, .left #MSearchSelect {
+ left: 0;
+ background-image: url("mag_glass.svg");
+ width: 22px;
+ height: 22px;
+ padding: 22px 22px 0 0 ;
+ margin: 0 4px 0 4px;
+ box-sizing: border-box;
+}
+
+#MSearchField {
+ background-image: none;
+ display: table-cell;
+ margin: 0;
+ // leave room for #MSearchSelect and a bit more for the border
+ margin-left: 30px;
+ width: calc(100% - 34px);
+ height: 22px;
+ font: 11pt sans-serif;
+}
+
+#MSearchSelectWindow {
+ background-color: $background-color-dark;
+ padding: 0;
+ border: solid 1px black;
+ @include border-radius(0);
+ @include box-shadow(0 0 4px rgba(0,0,0,0.35), 0 0 8px rgba(0,0,0,0.2));
+}
+
+a.SelectItem {
+ color: white;
+ padding: 3px 4px;
+ font: 10pt sans-serif;
+ letter-spacing: 1px;
+
+ &:hover {
+ background-color: $primary-color;
+ color: white;
+ }
+
+ &:focus, &:active {
+ color: white;
+ }
+}
+
+#MSearchResultsWindow {
+ background-color: white;
+ @include box-shadow(0 0 4px rgba(0,0,0,0.35), 0 0 8px rgba(0,0,0,0.2));
+}
diff --git a/doc/that_style/sass/that_style.scss b/doc/that_style/sass/that_style.scss
new file mode 100644
index 0000000..f1ebf92
--- /dev/null
+++ b/doc/that_style/sass/that_style.scss
@@ -0,0 +1,1240 @@
+/*
+ * My own little style
+ */
+
+@import "mixins";
+
+// colors
+$primary-color: #5f082b;
+$primary-color-dark: #2c0414;
+$primary-color-light: #820a32;
+$secondary-color: #00549f;
+$secondary-color-dark: #002546;
+$background-color: #ffffff;
+$background-color-dark: #414141;
+
+body, table, div, p, dl {
+ font: 400 14px/22px Roboto,sans-serif;
+}
+
+h1.groupheader {
+ font-size: 150%;
+}
+
+.title {
+ font: 400 14px/28px Roboto,sans-serif;
+ font-size: 150%;
+ font-weight: bold;
+ margin: 10px 2px;
+}
+
+h2.groupheader {
+ border-bottom: 1px solid #555555;
+ color: black;
+ font-size: 200%;
+ font-weight: bold;
+ margin-top: 1.75em;
+ padding-top: 1em;
+ padding-bottom: 4px;
+ width: 100%;
+}
+
+tr.heading h2 {
+ border-bottom: 1px solid #a5a5a5;
+ font-size: 150%;
+ margin-top: 6px;
+ margin-bottom: 6px;
+ padding-top: 3px;
+ padding-bottom: 7px;
+}
+
+h2.groupheader a {
+ margin-left: 1%;
+}
+
+h3.groupheader {
+ font-size: 100%;
+}
+
+h1, h2, h3, h4, h5, h6 {
+ @include transition(none);
+ margin-right: 15px;
+
+ &.glow {
+ text-shadow: none;
+ color: $primary-color;
+ }
+}
+
+dt {
+ font-weight: bold;
+}
+
+div.multicol {
+ -moz-column-gap: 1em;
+ -webkit-column-gap: 1em;
+ -moz-column-count: 3;
+ -webkit-column-count: 3;
+}
+
+p.startli, p.startdd {
+ margin-top: 2px;
+}
+
+p.starttd {
+ margin-top: 0px;
+}
+
+p.endli {
+ margin-bottom: 0px;
+}
+
+p.enddd {
+ margin-bottom: 4px;
+}
+
+p.endtd {
+ margin-bottom: 2px;
+}
+
+#top {
+ border: none;
+ position: relative;
+ z-index: 100;
+ @include box-shadow(0 0 4px rgba(0,0,0,0.4), 0 0 8px rgba(0,0,0,0.3));
+}
+
+caption {
+ font-weight: bold;
+}
+
+span.legend {
+ font-size: 70%;
+ text-align: center;
+}
+
+h3.version {
+ font-size: 90%;
+ text-align: center;
+}
+
+div.qindex, div.navtab {
+ background-color: $background-color;
+ border: none;
+ text-align: center;
+}
+
+div.qindex, div.navpath {
+ width: 100%;
+ line-height: 140%;
+}
+
+div.navtab {
+ margin-right: 15px;
+}
+
+a, a:visited {
+ color: $secondary-color;
+ font-weight: normal;
+ text-decoration: none;
+}
+
+.contents a:visited {
+ color: #4665A2;
+}
+
+a:hover {
+ text-decoration: underline;
+}
+
+a.qindex {
+ font-weight: bold;
+ text-transform: uppercase;
+}
+
+a.qindexHL {
+ font-weight: bold;
+ background-color: #9CAFD4;
+ color: #ffffff;
+ border: 1px double #869DCA;
+}
+
+.contents a.qindexHL:visited {
+ color: #ffffff;
+}
+
+a.el, a.el:visited {
+ font-weight: normal;
+ color: $secondary-color;
+}
+
+a.elRef, a.elRef:visited {
+ font-family: monospace;
+ color: #006bc8;
+}
+
+@import "menu_bar";
+
+dl.el {
+ margin-left: -1cm;
+}
+
+div.ah, span.ah {
+ background: none;
+ color: black;
+ margin-bottom: 3px;
+ margin-top: 3px;
+ padding: 0.2em;
+
+ border: none;
+ @include border-radius(0);
+ @include box-shadow(none);
+
+ font: 14pt monospace;
+ font-weight: bold;
+ text-transform: uppercase;
+}
+
+div.classindex ul {
+ list-style: none;
+ padding-left: 0;
+}
+
+div.classindex span.ai {
+ display: inline-block;
+}
+
+div.groupHeader {
+ margin-left: 16px;
+ margin-top: 12px;
+ font-weight: bold;
+}
+
+div.groupText {
+ margin-left: 16px;
+ font-style: italic;
+}
+
+body {
+ background-color: $background-color;
+ color: black;
+ margin: 0;
+}
+
+#doc-content {
+ background-color: #111;
+ color: $background-color;
+}
+
+// this is for individual member pages
+div.contents {
+ color: black;
+ background-color: $background-color;
+ padding: 0;
+ margin: 5pt;
+
+ // the line after the member documentations
+ hr {
+ display: none;
+ visibility: hidden;
+ }
+}
+
+// override for 'normal' mode
+div.header + div.contents {
+ padding: 1ex;
+ margin: 0 5pt 5pt 5pt;
+}
+
+div.textblock {
+ padding: 1ex 1ex 0 1ex;
+}
+
+div.textblock + ul {
+ padding-bottom: 1%;
+}
+
+img.footer {
+ border: 0px;
+ vertical-align: middle;
+}
+
+@import "fragment_base";
+@import "fragment_color";
+
+@import "search";
+
+table.memberdecls {
+ width: 100%;
+ border-spacing: 0px;
+ padding: 0px;
+ margin-top: 7px;
+ background-color: $background-color;
+ @include box-shadow(0 0 4px rgba(0,0,0,0.35), 0 0 8px rgba(0,0,0,0.2));
+}
+
+.memberdecls tbody {
+ background-color: $background-color;
+}
+
+.memberdecls .odd {
+ background: #f6f6f6;
+}
+
+/* all but last separator show a line */
+.memberdecls tr[class^="separator"]:not(:last-child) .memSeparator {
+ border-bottom: 1px solid #c5c5c5;
+ line-height: 1px;
+ margin: 0;
+ padding: 0;
+}
+
+.memberdecls tr[class^="separator"]:last-child .memSeparator {
+ border-bottom: none;
+ line-height: 0;
+ margin: 0;
+ padding: 0;
+}
+
+table.fieldtable {
+ @include border-radius(0);
+ @include box-shadow(none);
+}
+
+.memberdecls td, .fieldtable tr {
+ background-color: inherit;
+}
+
+.fieldtable th {
+ display: none;
+ height: 0;
+ visibility: hidden;
+}
+
+td.fieldname {
+ color: $primary-color-light;
+ font-family: monospace;
+ font-weight: bold;
+}
+
+th.markdownTableHeadLeft, th.markdownTableHeadRight,
+th.markdownTableHeadCenter, th.markdownTableHeadNone {
+ background-color: $background-color-dark;
+ color: white;
+}
+
+.memItemLeft, .memItemRight,
+.memTemplItemLeft, .memTemplItemRight, .memTemplParams {
+ font-family: monospace;
+ background-color: $background-color;
+ border: none;
+ margin: 4px;
+ padding: 1px 0 0 8px;
+}
+
+.mdescLeft, .mdescRight {
+ background-color: $background-color;
+ border: none;
+ margin: 4px;
+ padding: 1px 0 0 8px;
+}
+
+.mdescLeft, .mdescRight {
+ padding: 0px 8px 4px 8px;
+ color: #555;
+}
+
+.memItemLeft, .memTemplItemLeft {
+ white-space: nowrap;
+}
+
+.memItemRight {
+ width: 100%;
+}
+
+.memTemplParams {
+ color: #4665A2;
+ white-space: nowrap;
+ font-size: 80%;
+}
+
+/* Styles for detailed member documentation */
+
+.memtitle {
+ padding: 8px;
+ border: none;
+ margin-bottom: -1px;
+ background-image: none;
+ background-color: #f6f6f6;
+ line-height: 1.25;
+ font-weight: bold;
+ color: black;
+ float: left;
+ z-index: 0;
+ position: relative;
+ @include box-shadow(0 0 4px rgba(0,0,0,0.35), 0 0 8px rgba(0,0,0,0.2));
+}
+
+.permalink {
+ font-size: 100%;
+ display: inline-block;
+ vertical-align: middle;
+}
+
+/* replace content of permalinks */
+.permalink a {
+ visibility: hidden;
+}
+.permalink a:after {
+ content: "§";
+ visibility: visible;
+ display: block;
+ position: absolute;
+ color: black;
+ top: 20%;
+}
+
+.permalink a:visited {
+ color: black;
+}
+
+.memtemplate {
+ font-size: 100%;
+ color: black;
+ font-family: monospace;
+ font-weight: normal;
+ margin-left: 9px;
+}
+
+.memnav {
+ background-color: #EBEFF6;
+ border: 1px solid #A3B4D7;
+ text-align: center;
+ margin: 2px;
+ margin-right: 15px;
+ padding: 2px;
+}
+
+.mempage {
+ width: 100%;
+}
+
+.memitem {
+ font-family: monospace;
+ padding: 0;
+ margin-bottom: 10px;
+ margin-right: 5px;
+ -webkit-transition: none;
+ -moz-transition: none;
+ -ms-transition: none;
+ -o-transition: none;
+ transition: none;
+ display: table !important;
+ width: 100%;
+ background-color: #f6f6f6;
+ @include box-shadow(0 0 4px rgba(0,0,0,0.35), 0 0 8px rgba(0,0,0,0.2));
+}
+
+.memitem.glow {
+ @include box-shadow(none);
+}
+
+.memname {
+ font-family: monospace;
+ font-weight: 400;
+ margin-left: 6px;
+}
+
+.memname td {
+ vertical-align: bottom;
+}
+
+.memproto, dl.reflist dt {
+ border: none;
+ padding: 6px 0px 6px 0px;
+ color: black;
+ font-weight: bold;
+ text-shadow: none;
+ background-color: #f6f6f6;
+ position: relative;
+ z-index: 1;
+ @include box-shadow(none);
+}
+
+
+.overload {
+ font-family: "courier new",courier,monospace;
+ font-size: 65%;
+}
+
+.memdoc, dl.reflist dd {
+ border: none;
+ border-left: 4px solid $primary-color;
+ border-bottom-left-radius: 0px;
+ border-bottom-right-radius: 0px;
+ -webkit-border-bottom-left-radius: 0px;
+ -webkit-border-bottom-right-radius: 0px;
+ -moz-border-bottom-left-radius: 0px;
+ -moz-border-bottom-right-radius: 0px;
+ padding: 2px 1% 2px 1%;
+ margin: 1%;
+ background-color: $background-color;
+ background-image: none;
+ @include box-shadow(none);
+
+ /* allow movement of elements inside */
+ display: flex;
+ flex-direction: column;
+}
+
+/* overrides for docs on individual pages */
+
+.memtitle:nth-child(2) {
+ width: 0;
+ height: 0;
+ display: none;
+ visibility: hidden;
+}
+
+.memitem:nth-child(3) {
+ margin: 0;
+ margin-top: 0.5%;
+ background-color: $background-color;
+ @include box-shadow(none);
+}
+
+.memitem:nth-child(3) .memproto {
+ padding: 10px;
+ background-color: $background-color;
+ margin-bottom: 10px;
+}
+
+.memitem:nth-child(3) .memproto::after {
+ content: "";
+ width: 99%;
+ height: 1px;
+ position: absolute;
+ bottom: -10px;
+ left: 0.5%;
+ background: #666;
+}
+
+.memitem:nth-child(3) .memdoc {
+ border: none;
+ padding: 0;
+}
+
+.memitem:nth-child(3) table.memname {
+ background-color: #f6f6f6;
+ border-collapse: collapse;
+ border-spacing: initial;
+ border: 1px solid #aaa;
+}
+
+.memitem:nth-child(3) table.memname tr:not(:last-child) {
+ border-bottom: 1px dashed #aaa;
+}
+
+
+dl.reflist dt {
+ padding: 5px;
+ z-index: 0; /* cover the top shadow of dd */
+ position: relative;
+ @include box-shadow(0 0 4px rgba(0,0,0,0.35), 0 0 8px rgba(0,0,0,0.2));
+}
+
+/* cover up the shadow at the bottom */
+dl.reflist dt::after {
+ content: " ";
+ width: 100%;
+ display: block;
+ height: 8px;
+ position: absolute;
+ background-color: #f6f6f6;
+ left: 0;
+ bottom: -8px;
+}
+
+dl.reflist dd {
+ border-left: 4px solid $primary-color;
+ padding: 2px 1% 2px 1%;
+ margin: 8px 8px 24px 8px;
+ outline: 8px solid #f6f6f6;
+ @include box-shadow(0 0 4px 8px rgba(0,0,0,0.35), 0 0 8px 8px rgba(0,0,0,0.2));
+}
+
+dl.reflist dd p::before {
+ font-size: 85%;
+ content: "\25B6\00A0\00A0";
+ display: inline-block;
+ width: 12pt;
+}
+
+dl.reflist dd p {
+ margin-top: 4px;
+ margin-bottom: 4px;
+}
+
+.paramkey {
+ text-align: right;
+}
+
+.paramtype {
+ font-family: monospace;
+ white-space: nowrap;
+ color:$secondary-color-dark;
+}
+
+.paramname {
+ color: black;
+ font-family: monospace;
+ white-space: nowrap;
+}
+.paramname em {
+ color: $primary-color-light;
+ font-style: normal;
+}
+.paramname code {
+ color: #404040;
+ line-height: 14px;
+}
+
+.params, .retval, .exception, .tparams {
+ margin-left: 0;
+ padding-left: 0;
+ margin-bottom: -0.25em;
+}
+
+.params dt, .tparams dt {
+ margin-bottom: 0.5em;
+}
+
+.params .paramname, .tparams .paramname, .retval .paramname, .exception .paramname {
+ color: $primary-color-light;
+ font-family: monospace;
+ font-weight: bold;
+ vertical-align: top;
+}
+
+.params .paramtype, .tparams .paramtype {
+ font-family: monospace;
+ font-style: italic;
+ vertical-align: top;
+}
+
+.params .paramdir, .tparams .paramdir {
+ font-family: "courier new",courier,monospace;
+ vertical-align: top;
+}
+
+/* line over parameters docs */
+.params, .tparams {
+ border-collapse: collapse;
+}
+
+.params tr, .tparams tr {
+ @include box-shadow(0 -2px 0 -1px #606060);
+}
+
+.params .paramname, .tparams .paramname {
+ border-top: 2px solid $primary-color;
+ padding-right: 5pt;
+}
+
+.params td, .tparams td {
+ padding-bottom: 1em;
+}
+
+table.mlabels {
+ border-spacing: 0px;
+}
+
+td.mlabels-left {
+ width: 100%;
+ padding: 0px;
+}
+
+td.mlabels-right {
+ vertical-align: bottom;
+ padding: 0px;
+ white-space: nowrap;
+}
+
+span.mlabels {
+ margin-left: 8px;
+}
+
+span.mlabel {
+ background-color: #444444;
+ border: none;
+ border-radius: 3px;
+ text-shadow: none;
+ color: white;
+ margin-right: 4px;
+ padding: 3px 5px;
+ font-size: 8pt;
+ white-space: nowrap;
+ vertical-align: middle;
+}
+
+.memdoc .definition {
+ position: relative;
+ padding-top: 0.5em;
+
+ /* move definition line to bottom of memdoc */
+ order: 3;
+
+ // border above
+ &::before {
+ content: "";
+ width: 33%;
+ height: 1px;
+ border-top: 1px solid black;
+ position: absolute;
+ top: 0;
+ }
+}
+
+
+
+// list of all members and class / file / ... lists
+table.directory {
+ border-top: 1px solid #c5c5c5;
+ border-bottom: 1px solid #c5c5c5;
+ border-collapse:collapse;
+ width: 100%;
+ font: 400 14px Roboto,sans-serif;
+
+ tr {
+ // overwrite doxygen weirdness
+ background-color: white !important;
+
+ &.even {
+ background-color: #f6f6f6 !important;
+ }
+
+ &:hover {
+ background-color: #e6e6e6 !important;
+ }
+ }
+
+ td.entry {
+ padding: 1.5pt 3pt 1.5pt 3pt;
+ white-space: normal;
+ }
+}
+
+// class / file / ... lists specific
+div.directory {
+ border: none;
+
+ table.directory {
+ tr {
+ // this makes all lines the same height
+ line-height: 17pt;
+ }
+
+ td {
+ margin: 0;
+ padding: 0.5pt 6pt 0.5pt 0;
+ vertical-align: middle;
+
+ &.entry {
+ white-space: nowrap;
+ }
+
+ &.desc {
+ width: 100%;
+ padding-left: 6pt;
+ border-left: 1px solid rgba(0,0,0,0.05);
+ }
+ }
+ }
+}
+
+// "detail level" at the top
+.directory .levels {
+ white-space: nowrap;
+ width: 100%;
+ text-align: right;
+ font-size: 9pt;
+
+ span {
+ cursor: pointer;
+ padding-left: 2px;
+ padding-right: 2px;
+ color: $secondary-color;
+
+ &:hover {
+ text-decoration: underline;
+ }
+ }
+}
+
+@import "nav_tree";
+
+.icon {
+ font-family: monospace;
+ font-weight: bold;
+ font-size: 12px;
+ height: 15px;
+ width: 15px;
+ display: inline-block;
+ background-color: #444444;
+ color: white;
+ text-align: center;
+ border-radius: 3px;
+ margin: 0;
+ padding-top: 1px;
+ text-indent: -1px;
+}
+
+.icona {
+ width: 0;
+ height: 0;
+ display: none;
+ visibility: hidden;
+}
+
+.iconfopen {
+ width: 24px;
+ height: 18px;
+ margin-bottom: 4px;
+ background-image:url('folderopen.svg');
+ background-position: 0;
+ background-repeat: no-repeat;
+ vertical-align:top;
+ display: inline-block;
+}
+
+.iconfclosed {
+ width: 24px;
+ height: 18px;
+ margin-bottom: 4px;
+ background-image:url('folderclosed.svg');
+ background-position: 0;
+ background-repeat: no-repeat;
+ vertical-align:top;
+ display: inline-block;
+}
+
+.icondoc {
+ width: 24px;
+ height: 18px;
+ margin-bottom: 4px;
+ background-image:url('doc.svg');
+ background-position: 0;
+ background-repeat: no-repeat;
+ vertical-align:top;
+ display: inline-block;
+}
+
+div.dynheader {
+ margin-top: 8px;
+ -webkit-touch-callout: none;
+ -webkit-user-select: none;
+ -khtml-user-select: none;
+ -moz-user-select: none;
+ -ms-user-select: none;
+ user-select: none;
+}
+
+address {
+ font-style: normal;
+ color: #2A3D61;
+}
+
+table.doxtable caption {
+ caption-side: top;
+}
+
+table.doxtable {
+ border-collapse: collapse;
+ margin-top: 4px;
+ margin-bottom: 4px;
+}
+
+table.doxtable td, table.doxtable th {
+ border: 1px solid #444444;
+ padding: 3px 7px 2px;
+}
+
+table.doxtable th {
+ background-color: #444444;
+ color: #FFFFFF;
+ font-size: 110%;
+ padding-bottom: 4px;
+ padding-top: 5px;
+}
+
+@import "navpath";
+
+div.summary {
+ -webkit-order: 2;
+ order: 2;
+ float: right;
+ font-size: 8pt;
+ padding-right: 5px;
+ width: 50%;
+ text-align: right;
+ margin-right: 0.5%;
+}
+
+div.summary a {
+ white-space: nowrap;
+}
+
+table.classindex {
+ margin: 10px;
+ white-space: nowrap;
+ margin-left: 1%;
+ margin-right: 1%;
+ width: 98%;
+ border: none;
+ border-top: 1px solid black;
+ border-bottom: 1px solid black;
+ border-spacing: 0.5em;
+ padding: 0;
+}
+
+div.ingroups {
+ font-size: 8pt;
+ width: 50%;
+ text-align: left;
+}
+
+div.ingroups a {
+ white-space: nowrap;
+}
+
+div.header {
+ display: -webkit-flex;
+ display: flex;
+ justify-content: space-between;
+ background-image: none;
+ background-color: $background-color;
+ color: black;
+ margin: 5pt 5pt 0 5pt;
+ padding: 0 1ex 0 1ex;
+ align-items: center;
+ justify-content: center;
+ border-bottom: none;
+ position: relative;
+}
+
+div.header::after {
+ content: "";
+ height: 2px;
+ width: 99%;
+ position: absolute;
+ bottom: -5px;
+ left: 0.5%;
+ background: #666;
+}
+
+div.headertitle {
+ -webkit-order: 1;
+ order: 1;
+ margin-right: auto;
+ text-align: center;
+}
+
+dl {
+ padding: 0;
+}
+
+dl.section {
+ margin-left: 0px;
+ padding-left: 0px;
+}
+
+dl.section > dt {
+ font-weight: bold;
+ font-family: sans-serif;
+}
+
+dl.note, dl.warning, dl.attention, dl.pre, dl.post, dl.invariant,
+dl.deprecated, dl.todo, dl.test, dl.bug {
+ margin-left: -7px;
+ padding-left: 3px;
+}
+
+dl.note {
+ padding-left: 7px;
+ border: none;
+}
+
+dl.warning {
+ background-color: #ffe6ea;
+ border: 1px solid #ff0728;
+ border-left: 4px solid #ff0728;
+ padding-top: 4px;
+ padding-bottom: 3px;
+}
+
+dl.attention {
+ border-left: 4px solid #ff0728;
+}
+
+dl.pre, dl.post, dl.invariant {
+ background-color: #f0ffe6;
+ border: 1px solid #5eb82a;
+ border-left: 4px solid #5eb82a;
+}
+
+dl.deprecated {
+ background-color: #f6f6f6;
+ border: 1px solid black;
+}
+
+dl.todo {
+ border-left: 4px solid #e8d500;
+}
+
+dl.test {
+ border-left: 4px solid #00549f;
+}
+
+dl.bug {
+ background-color: #f6f6f6;
+ border: 1px solid #cc071e;
+ border-left: 4px solid #cc071e;
+}
+
+dl.section dd {
+ margin-bottom: 6px;
+}
+
+.memdoc dl dt a.el {
+ font-weight: bold;
+ color: black;
+}
+
+#projectlogo
+{
+ text-align: center;
+ vertical-align: bottom;
+ border-collapse: separate;
+}
+
+#projectlogo img
+{
+ border: 0px none;
+}
+
+#projectalign
+{
+ vertical-align: middle;
+}
+
+#projectname
+{
+ font: 300% Tahoma, Arial,sans-serif;
+ margin: 0px;
+ padding: 2px 0px;
+}
+
+#projectbrief
+{
+ font: 120% Tahoma, Arial,sans-serif;
+ margin: 0px;
+ padding: 0px;
+}
+
+#projectnumber {
+ font: 50% Roboto,sans-serif;
+ margin: 0px;
+ padding: 0px;
+}
+
+#titlearea {
+ padding: 0px;
+ margin: 0px;
+ width: 100%;
+ border-bottom: none;
+
+ // should only match if main menu is disabled (depends on javascripts in #top)
+ &:nth-last-child(2) {
+ border-bottom: 2px solid #444444;
+ }
+}
+
+.image
+{
+ text-align: center;
+}
+
+.dotgraph, .mscgraph, .diagraph {
+ text-align: center;
+}
+
+.caption
+{
+ font-weight: bold;
+}
+
+div.zoom
+{
+ border: 1px solid #90A5CE;
+}
+
+dl.citelist {
+ margin-bottom: 5ex;
+
+ dt {
+ color: black;
+ float: left;
+ font-weight: bold;
+ padding: 5px 0;
+ margin: 2px 10pt 2px 0;
+ }
+
+ dd {
+ margin: 2px 0;
+ padding: 5px 0;
+ }
+
+ .startdd {
+ margin-top: 0;
+ }
+}
+
+div.toc {
+ background-color: transparent;
+ border: 1px solid $background-color-dark;
+ @include border-radius(0);
+ float: right;
+ height: auto;
+ margin: 0 8px 10px 10px;
+ padding: 10px 15px 5px 25px;
+ width: auto;
+
+ li {
+ background: transparent;
+ font: 10pt Roboto,DejaVu Sans,sans-serif;
+ padding-left: 0;
+ padding-top: 0.5ex;
+
+ .level1 {
+ margin-left: 10pt;
+ }
+
+ .level2 {
+ margin-left: 10pt;
+ }
+
+ .level3 {
+ margin-left: 10pt;
+ }
+
+ .level4 {
+ margin-left: 10pt;
+ }
+ }
+
+ h3 {
+ font: bold 12px/1.2 Roboto,DejaVu Sans,sans-serif;
+ color: black;
+ border-bottom: none;
+ margin: 0;
+ letter-spacing: 1px;
+ }
+
+ ul {
+ list-style: disc;
+ border: none;
+ padding: 0;
+ }
+}
+
+.inherit_header {
+ font-weight: bold;
+ color: gray;
+ cursor: pointer;
+ -webkit-touch-callout: none;
+ -webkit-user-select: none;
+ -khtml-user-select: none;
+ -moz-user-select: none;
+ -ms-user-select: none;
+ user-select: none;
+}
+
+.inherit_header td {
+ padding: 6px 0px 2px 5px;
+}
+
+.inherit {
+ display: none;
+}
+
+/* tooltip related style info */
+
+.ttc {
+ position: absolute;
+ display: none;
+}
+
+#powerTip {
+ cursor: default;
+ white-space: nowrap;
+ background-color: $background-color;
+ border: 1px solid #323232;
+ border-radius: 0;
+ @include box-shadow(none);
+ display: none;
+ font-size: smaller;
+ max-width: 80%;
+ opacity: 0.9;
+ padding: 1ex 1em 1em 1em;
+ position: absolute;
+ z-index: 2147483647;
+
+ div.ttdoc {
+ color: grey;
+ font-style: italic;
+ }
+
+ div.ttname a {
+ font-weight: bold;
+ }
+
+ div.ttname {
+ font-weight: bold;
+ }
+
+ div.ttdeci {
+ color: #006318;
+ }
+
+ div {
+ margin: 0px;
+ padding: 0px;
+ font: 12px/16px Roboto,sans-serif;
+ }
+
+ &:before, &:after {
+ content: "";
+ position: absolute;
+ margin: 0px;
+ }
+}
+
+@media print
+{
+ #top { display: none; }
+ #side-nav { display: none; }
+ #nav-path { display: none; }
+ body { overflow:visible; }
+ h1, h2, h3, h4, h5, h6 { page-break-after: avoid; }
+ .summary { display: none; }
+ .memitem { page-break-inside: avoid; }
+ #doc-content
+ {
+ margin-left:0 !important;
+ height:auto !important;
+ width:auto !important;
+ overflow:inherit;
+ display:inline;
+ background-color: white;
+ }
+}
diff --git a/doc/that_style/that_style.css b/doc/that_style/that_style.css
new file mode 100644
index 0000000..34c3244
--- /dev/null
+++ b/doc/that_style/that_style.css
@@ -0,0 +1,1436 @@
+@charset "UTF-8";
+/*
+ * My own little style
+ */
+body, table, div, p, dl {
+ font: 400 14px/22px Roboto,sans-serif; }
+
+h1.groupheader {
+ font-size: 150%; }
+
+.title {
+ font: 400 14px/28px Roboto,sans-serif;
+ font-size: 150%;
+ font-weight: bold;
+ margin: 10px 2px; }
+
+h2.groupheader {
+ border-bottom: 1px solid #555555;
+ color: black;
+ font-size: 200%;
+ font-weight: bold;
+ margin-top: 1.75em;
+ padding-top: 1em;
+ padding-bottom: 4px;
+ width: 100%; }
+
+tr.heading h2 {
+ border-bottom: 1px solid #a5a5a5;
+ font-size: 150%;
+ margin-top: 6px;
+ margin-bottom: 6px;
+ padding-top: 3px;
+ padding-bottom: 7px; }
+
+h2.groupheader a {
+ margin-left: 1%; }
+
+h3.groupheader {
+ font-size: 100%; }
+
+h1, h2, h3, h4, h5, h6 {
+ -webkit-transition: none;
+ -moz-transition: none;
+ -o-transition: none;
+ transition: none;
+ margin-right: 15px; }
+ h1.glow, h2.glow, h3.glow, h4.glow, h5.glow, h6.glow {
+ text-shadow: none;
+ color: #5f082b; }
+
+dt {
+ font-weight: bold; }
+
+div.multicol {
+ -moz-column-gap: 1em;
+ -webkit-column-gap: 1em;
+ -moz-column-count: 3;
+ -webkit-column-count: 3; }
+
+p.startli, p.startdd {
+ margin-top: 2px; }
+
+p.starttd {
+ margin-top: 0px; }
+
+p.endli {
+ margin-bottom: 0px; }
+
+p.enddd {
+ margin-bottom: 4px; }
+
+p.endtd {
+ margin-bottom: 2px; }
+
+#top {
+ border: none;
+ position: relative;
+ z-index: 100;
+ -moz-box-shadow: 0 0 4px rgba(0, 0, 0, 0.4), 0 0 8px rgba(0, 0, 0, 0.3);
+ -webkit-box-shadow: 0 0 4px rgba(0, 0, 0, 0.4), 0 0 8px rgba(0, 0, 0, 0.3);
+ -o-box-shadow: 0 0 4px rgba(0, 0, 0, 0.4), 0 0 8px rgba(0, 0, 0, 0.3);
+ box-shadow: 0 0 4px rgba(0, 0, 0, 0.4), 0 0 8px rgba(0, 0, 0, 0.3); }
+
+caption {
+ font-weight: bold; }
+
+span.legend {
+ font-size: 70%;
+ text-align: center; }
+
+h3.version {
+ font-size: 90%;
+ text-align: center; }
+
+div.qindex, div.navtab {
+ background-color: #ffffff;
+ border: none;
+ text-align: center; }
+
+div.qindex, div.navpath {
+ width: 100%;
+ line-height: 140%; }
+
+div.navtab {
+ margin-right: 15px; }
+
+a, a:visited {
+ color: #00549f;
+ font-weight: normal;
+ text-decoration: none; }
+
+.contents a:visited {
+ color: #4665A2; }
+
+a:hover {
+ text-decoration: underline; }
+
+a.qindex {
+ font-weight: bold;
+ text-transform: uppercase; }
+
+a.qindexHL {
+ font-weight: bold;
+ background-color: #9CAFD4;
+ color: #ffffff;
+ border: 1px double #869DCA; }
+
+.contents a.qindexHL:visited {
+ color: #ffffff; }
+
+a.el, a.el:visited {
+ font-weight: normal;
+ color: #00549f; }
+
+a.elRef, a.elRef:visited {
+ font-family: monospace;
+ color: #006bc8; }
+
+/*
+ * The main menu at the top
+ */
+#main-menu {
+ background-image: none;
+ background: #414141;
+ padding: 0; }
+
+.sm-dox > li:not(:last-child) > a {
+ background-image: none;
+ text-shadow: none;
+ color: white;
+ font-weight: normal;
+ letter-spacing: 1px;
+ font-size: 11pt;
+ text-transform: uppercase; }
+.sm-dox > li:not(:last-child) > a:hover, .sm-dox > li:not(:last-child) > a.highlighted {
+ background-color: #5f082b; }
+.sm-dox a span.sub-arrow {
+ border-color: white transparent transparent; }
+.sm-dox ul {
+ border: none;
+ -moz-border-radius: 0 !important;
+ -webkit-border-radius: 0 !important;
+ border-radius: 0 !important;
+ padding: 0;
+ background: #414141;
+ -moz-box-shadow: 0 0 4px rgba(0, 0, 0, 0.35), 0 0 8px rgba(0, 0, 0, 0.2);
+ -webkit-box-shadow: 0 0 4px rgba(0, 0, 0, 0.35), 0 0 8px rgba(0, 0, 0, 0.2);
+ -o-box-shadow: 0 0 4px rgba(0, 0, 0, 0.35), 0 0 8px rgba(0, 0, 0, 0.2);
+ box-shadow: 0 0 4px rgba(0, 0, 0, 0.35), 0 0 8px rgba(0, 0, 0, 0.2); }
+ .sm-dox ul a {
+ background: inherit;
+ color: white;
+ font-weight: normal;
+ letter-spacing: 1px;
+ font-size: 11pt; }
+ .sm-dox ul a:hover {
+ background: #5f082b;
+ color: white;
+ font-weight: normal;
+ letter-spacing: 1px;
+ font-size: 11pt; }
+ .sm-dox ul a.highlighted {
+ background: #5f082b;
+ color: white;
+ font-weight: normal;
+ letter-spacing: 1px;
+ font-size: 11pt; }
+ .sm-dox ul a span.sub-arrow {
+ /* this sets the color of the arrow */
+ border-color: white transparent transparent; }
+
+dl.el {
+ margin-left: -1cm; }
+
+div.ah, span.ah {
+ background: none;
+ color: black;
+ margin-bottom: 3px;
+ margin-top: 3px;
+ padding: 0.2em;
+ border: none;
+ -moz-border-radius: 0;
+ -webkit-border-radius: 0;
+ border-radius: 0;
+ -moz-box-shadow: none;
+ -webkit-box-shadow: none;
+ -o-box-shadow: none;
+ box-shadow: none;
+ font: 14pt monospace;
+ font-weight: bold;
+ text-transform: uppercase; }
+
+div.classindex ul {
+ list-style: none;
+ padding-left: 0; }
+
+div.classindex span.ai {
+ display: inline-block; }
+
+div.groupHeader {
+ margin-left: 16px;
+ margin-top: 12px;
+ font-weight: bold; }
+
+div.groupText {
+ margin-left: 16px;
+ font-style: italic; }
+
+body {
+ background-color: #ffffff;
+ color: black;
+ margin: 0; }
+
+#doc-content {
+ background-color: #111;
+ color: #ffffff; }
+
+div.contents {
+ color: black;
+ background-color: #ffffff;
+ padding: 0;
+ margin: 5pt; }
+ div.contents hr {
+ display: none;
+ visibility: hidden; }
+
+div.header + div.contents {
+ padding: 1ex;
+ margin: 0 5pt 5pt 5pt; }
+
+div.textblock {
+ padding: 1ex 1ex 0 1ex; }
+
+div.textblock + ul {
+ padding-bottom: 1%; }
+
+img.footer {
+ border: 0px;
+ vertical-align: middle; }
+
+/*
+ Basic styling for fragments shared by all themes.
+*/
+div.fragment {
+ padding: 0;
+ margin: 4px 8px 4px 2px;
+ color: #bebebe;
+ background-color: #323232;
+ border: 3px solid #e8e8e8;
+ border-radius: 2px;
+ overflow-y: hidden;
+ overflow-x: auto;
+ position: relative; }
+
+div.line {
+ font-family: monospace, fixed;
+ font-size: 13px;
+ min-height: 13px;
+ line-height: 1.0;
+ text-indent: -53px;
+ margin: 0px;
+ padding: 1px 0 1px 53px;
+ white-space: pre;
+ -webkit-transition: background-color;
+ -moz-transition: background-color;
+ -o-transition: background-color;
+ transition: background-color;
+ -webkit-duration: 0s;
+ -moz-duration: 0s;
+ -o-duration: 0s;
+ duration: 0s; }
+ div.line:hover {
+ background-color: #1a1a1a; }
+ div.line::after {
+ content: "\000A";
+ white-space: pre; }
+
+span.lineno {
+ padding-right: 4px;
+ text-align: right;
+ color: black;
+ height: 100px;
+ white-space: pre;
+ border-right: 3px solid #1d7567;
+ background-color: #a0a0a0; }
+
+span.lineno a, span.lineno a:visited {
+ background-color: inherit;
+ color: #1e595a; }
+
+span.lineno a:hover {
+ background-color: #C8C8C8;
+ text-decoration: none; }
+
+.lineno {
+ -webkit-touch-callout: none;
+ -webkit-user-select: none;
+ -khtml-user-select: none;
+ -moz-user-select: none;
+ -ms-user-select: none;
+ user-select: none; }
+
+div.fragment {
+ color: #bebebe;
+ background-color: #323232; }
+
+div.fragment::before {
+ background-color: #1a1a1a;
+ border-right: 1px solid #3e3e3e; }
+
+div.line:hover {
+ background-color: #1a1a1a; }
+
+span.lineno {
+ color: #969696;
+ background-color: #1a1a1a;
+ border-right: 1px solid #3e3e3e; }
+
+span.lineno a, span.lineno a:visited {
+ background-color: inherit;
+ color: #dcdcdc; }
+
+span.lineno a:hover {
+ background-color: #323232; }
+
+a.code, a.code:visited {
+ color: #6cc7eb; }
+
+a.codeRef, a.codeRef:visited {
+ color: #3d95e6; }
+
+span.keyword {
+ color: #98f77a;
+ font-weight: bold; }
+
+span.keywordtype {
+ color: #ffa0a0; }
+
+span.keywordflow {
+ color: #98f77a;
+ font-weight: bold; }
+
+span.comment {
+ color: #999;
+ font-style: oblique; }
+
+span.preprocessor {
+ color: #cd5c57; }
+
+span.stringliteral {
+ color: #64b041; }
+
+span.charliteral {
+ color: #64b041; }
+
+blockquote {
+ background-color: #F7F8FB;
+ border-left: 2px solid #9CAFD4;
+ margin: 0 24px 0 4px;
+ padding: 0 12px 0 16px; }
+
+/*
+ * The search box
+ */
+.sm-dox > li:last-child {
+ margin-right: 10pt; }
+
+#MSearchBox {
+ border: 2px inset black;
+ display: table;
+ width: 350px;
+ height: 26px;
+ background: white;
+ margin-top: 5px; }
+ #MSearchBox .left {
+ background-image: none;
+ display: table-cell;
+ width: 100%;
+ height: inherit;
+ left: 0; }
+ #MSearchBox .right {
+ background-image: none;
+ width: 0;
+ display: none;
+ visibility: hidden; }
+
+nav > #MSearchBox {
+ border: 2px solid #666666;
+ margin: 5px 10pt 0 0;
+ height: 22px; }
+
+#MSearchSelect, .left #MSearchSelect {
+ left: 0;
+ background-image: url("mag_glass.svg");
+ width: 22px;
+ height: 22px;
+ padding: 22px 22px 0 0;
+ margin: 0 4px 0 4px;
+ box-sizing: border-box; }
+
+#MSearchField {
+ background-image: none;
+ display: table-cell;
+ margin: 0;
+ margin-left: 30px;
+ width: calc(100% - 34px);
+ height: 22px;
+ font: 11pt sans-serif; }
+
+#MSearchSelectWindow {
+ background-color: #414141;
+ padding: 0;
+ border: solid 1px black;
+ -moz-border-radius: 0;
+ -webkit-border-radius: 0;
+ border-radius: 0;
+ -moz-box-shadow: 0 0 4px rgba(0, 0, 0, 0.35), 0 0 8px rgba(0, 0, 0, 0.2);
+ -webkit-box-shadow: 0 0 4px rgba(0, 0, 0, 0.35), 0 0 8px rgba(0, 0, 0, 0.2);
+ -o-box-shadow: 0 0 4px rgba(0, 0, 0, 0.35), 0 0 8px rgba(0, 0, 0, 0.2);
+ box-shadow: 0 0 4px rgba(0, 0, 0, 0.35), 0 0 8px rgba(0, 0, 0, 0.2); }
+
+a.SelectItem {
+ color: white;
+ padding: 3px 4px;
+ font: 10pt sans-serif;
+ letter-spacing: 1px; }
+ a.SelectItem:hover {
+ background-color: #5f082b;
+ color: white; }
+ a.SelectItem:focus, a.SelectItem:active {
+ color: white; }
+
+#MSearchResultsWindow {
+ background-color: white;
+ -moz-box-shadow: 0 0 4px rgba(0, 0, 0, 0.35), 0 0 8px rgba(0, 0, 0, 0.2);
+ -webkit-box-shadow: 0 0 4px rgba(0, 0, 0, 0.35), 0 0 8px rgba(0, 0, 0, 0.2);
+ -o-box-shadow: 0 0 4px rgba(0, 0, 0, 0.35), 0 0 8px rgba(0, 0, 0, 0.2);
+ box-shadow: 0 0 4px rgba(0, 0, 0, 0.35), 0 0 8px rgba(0, 0, 0, 0.2); }
+
+table.memberdecls {
+ width: 100%;
+ border-spacing: 0px;
+ padding: 0px;
+ margin-top: 7px;
+ background-color: #ffffff;
+ -moz-box-shadow: 0 0 4px rgba(0, 0, 0, 0.35), 0 0 8px rgba(0, 0, 0, 0.2);
+ -webkit-box-shadow: 0 0 4px rgba(0, 0, 0, 0.35), 0 0 8px rgba(0, 0, 0, 0.2);
+ -o-box-shadow: 0 0 4px rgba(0, 0, 0, 0.35), 0 0 8px rgba(0, 0, 0, 0.2);
+ box-shadow: 0 0 4px rgba(0, 0, 0, 0.35), 0 0 8px rgba(0, 0, 0, 0.2); }
+
+.memberdecls tbody {
+ background-color: #ffffff; }
+
+.memberdecls .odd {
+ background: #f6f6f6; }
+
+/* all but last separator show a line */
+.memberdecls tr[class^="separator"]:not(:last-child) .memSeparator {
+ border-bottom: 1px solid #c5c5c5;
+ line-height: 1px;
+ margin: 0;
+ padding: 0; }
+
+.memberdecls tr[class^="separator"]:last-child .memSeparator {
+ border-bottom: none;
+ line-height: 0;
+ margin: 0;
+ padding: 0; }
+
+table.fieldtable {
+ -moz-border-radius: 0;
+ -webkit-border-radius: 0;
+ border-radius: 0;
+ -moz-box-shadow: none;
+ -webkit-box-shadow: none;
+ -o-box-shadow: none;
+ box-shadow: none; }
+
+.memberdecls td, .fieldtable tr {
+ background-color: inherit; }
+
+.fieldtable th {
+ display: none;
+ height: 0;
+ visibility: hidden; }
+
+td.fieldname {
+ color: #820a32;
+ font-family: monospace;
+ font-weight: bold; }
+
+th.markdownTableHeadLeft, th.markdownTableHeadRight,
+th.markdownTableHeadCenter, th.markdownTableHeadNone {
+ background-color: #414141;
+ color: white; }
+
+.memItemLeft, .memItemRight,
+.memTemplItemLeft, .memTemplItemRight, .memTemplParams {
+ font-family: monospace;
+ background-color: #ffffff;
+ border: none;
+ margin: 4px;
+ padding: 1px 0 0 8px; }
+
+.mdescLeft, .mdescRight {
+ background-color: #ffffff;
+ border: none;
+ margin: 4px;
+ padding: 1px 0 0 8px; }
+
+.mdescLeft, .mdescRight {
+ padding: 0px 8px 4px 8px;
+ color: #555; }
+
+.memItemLeft, .memTemplItemLeft {
+ white-space: nowrap; }
+
+.memItemRight {
+ width: 100%; }
+
+.memTemplParams {
+ color: #4665A2;
+ white-space: nowrap;
+ font-size: 80%; }
+
+/* Styles for detailed member documentation */
+.memtitle {
+ padding: 8px;
+ border: none;
+ margin-bottom: -1px;
+ background-image: none;
+ background-color: #f6f6f6;
+ line-height: 1.25;
+ font-weight: bold;
+ color: black;
+ float: left;
+ z-index: 0;
+ position: relative;
+ -moz-box-shadow: 0 0 4px rgba(0, 0, 0, 0.35), 0 0 8px rgba(0, 0, 0, 0.2);
+ -webkit-box-shadow: 0 0 4px rgba(0, 0, 0, 0.35), 0 0 8px rgba(0, 0, 0, 0.2);
+ -o-box-shadow: 0 0 4px rgba(0, 0, 0, 0.35), 0 0 8px rgba(0, 0, 0, 0.2);
+ box-shadow: 0 0 4px rgba(0, 0, 0, 0.35), 0 0 8px rgba(0, 0, 0, 0.2); }
+
+.permalink {
+ font-size: 100%;
+ display: inline-block;
+ vertical-align: middle; }
+
+/* replace content of permalinks */
+.permalink a {
+ visibility: hidden; }
+
+.permalink a:after {
+ content: "§";
+ visibility: visible;
+ display: block;
+ position: absolute;
+ color: black;
+ top: 20%; }
+
+.permalink a:visited {
+ color: black; }
+
+.memtemplate {
+ font-size: 100%;
+ color: black;
+ font-family: monospace;
+ font-weight: normal;
+ margin-left: 9px; }
+
+.memnav {
+ background-color: #EBEFF6;
+ border: 1px solid #A3B4D7;
+ text-align: center;
+ margin: 2px;
+ margin-right: 15px;
+ padding: 2px; }
+
+.mempage {
+ width: 100%; }
+
+.memitem {
+ font-family: monospace;
+ padding: 0;
+ margin-bottom: 10px;
+ margin-right: 5px;
+ -webkit-transition: none;
+ -moz-transition: none;
+ -ms-transition: none;
+ -o-transition: none;
+ transition: none;
+ display: table !important;
+ width: 100%;
+ background-color: #f6f6f6;
+ -moz-box-shadow: 0 0 4px rgba(0, 0, 0, 0.35), 0 0 8px rgba(0, 0, 0, 0.2);
+ -webkit-box-shadow: 0 0 4px rgba(0, 0, 0, 0.35), 0 0 8px rgba(0, 0, 0, 0.2);
+ -o-box-shadow: 0 0 4px rgba(0, 0, 0, 0.35), 0 0 8px rgba(0, 0, 0, 0.2);
+ box-shadow: 0 0 4px rgba(0, 0, 0, 0.35), 0 0 8px rgba(0, 0, 0, 0.2); }
+
+.memitem.glow {
+ -moz-box-shadow: none;
+ -webkit-box-shadow: none;
+ -o-box-shadow: none;
+ box-shadow: none; }
+
+.memname {
+ font-family: monospace;
+ font-weight: 400;
+ margin-left: 6px; }
+
+.memname td {
+ vertical-align: bottom; }
+
+.memproto, dl.reflist dt {
+ border: none;
+ padding: 6px 0px 6px 0px;
+ color: black;
+ font-weight: bold;
+ text-shadow: none;
+ background-color: #f6f6f6;
+ position: relative;
+ z-index: 1;
+ -moz-box-shadow: none;
+ -webkit-box-shadow: none;
+ -o-box-shadow: none;
+ box-shadow: none; }
+
+.overload {
+ font-family: "courier new",courier,monospace;
+ font-size: 65%; }
+
+.memdoc, dl.reflist dd {
+ border: none;
+ border-left: 4px solid #5f082b;
+ border-bottom-left-radius: 0px;
+ border-bottom-right-radius: 0px;
+ -webkit-border-bottom-left-radius: 0px;
+ -webkit-border-bottom-right-radius: 0px;
+ -moz-border-bottom-left-radius: 0px;
+ -moz-border-bottom-right-radius: 0px;
+ padding: 2px 1% 2px 1%;
+ margin: 1%;
+ background-color: #ffffff;
+ background-image: none;
+ -moz-box-shadow: none;
+ -webkit-box-shadow: none;
+ -o-box-shadow: none;
+ box-shadow: none;
+ /* allow movement of elements inside */
+ display: flex;
+ flex-direction: column; }
+
+/* overrides for docs on individual pages */
+.memtitle:nth-child(2) {
+ width: 0;
+ height: 0;
+ display: none;
+ visibility: hidden; }
+
+.memitem:nth-child(3) {
+ margin: 0;
+ margin-top: 0.5%;
+ background-color: #ffffff;
+ -moz-box-shadow: none;
+ -webkit-box-shadow: none;
+ -o-box-shadow: none;
+ box-shadow: none; }
+
+.memitem:nth-child(3) .memproto {
+ padding: 10px;
+ background-color: #ffffff;
+ margin-bottom: 10px; }
+
+.memitem:nth-child(3) .memproto::after {
+ content: "";
+ width: 99%;
+ height: 1px;
+ position: absolute;
+ bottom: -10px;
+ left: 0.5%;
+ background: #666; }
+
+.memitem:nth-child(3) .memdoc {
+ border: none;
+ padding: 0; }
+
+.memitem:nth-child(3) table.memname {
+ background-color: #f6f6f6;
+ border-collapse: collapse;
+ border-spacing: initial;
+ border: 1px solid #aaa; }
+
+.memitem:nth-child(3) table.memname tr:not(:last-child) {
+ border-bottom: 1px dashed #aaa; }
+
+dl.reflist dt {
+ padding: 5px;
+ z-index: 0;
+ /* cover the top shadow of dd */
+ position: relative;
+ -moz-box-shadow: 0 0 4px rgba(0, 0, 0, 0.35), 0 0 8px rgba(0, 0, 0, 0.2);
+ -webkit-box-shadow: 0 0 4px rgba(0, 0, 0, 0.35), 0 0 8px rgba(0, 0, 0, 0.2);
+ -o-box-shadow: 0 0 4px rgba(0, 0, 0, 0.35), 0 0 8px rgba(0, 0, 0, 0.2);
+ box-shadow: 0 0 4px rgba(0, 0, 0, 0.35), 0 0 8px rgba(0, 0, 0, 0.2); }
+
+/* cover up the shadow at the bottom */
+dl.reflist dt::after {
+ content: " ";
+ width: 100%;
+ display: block;
+ height: 8px;
+ position: absolute;
+ background-color: #f6f6f6;
+ left: 0;
+ bottom: -8px; }
+
+dl.reflist dd {
+ border-left: 4px solid #5f082b;
+ padding: 2px 1% 2px 1%;
+ margin: 8px 8px 24px 8px;
+ outline: 8px solid #f6f6f6;
+ -moz-box-shadow: 0 0 4px 8px rgba(0, 0, 0, 0.35), 0 0 8px 8px rgba(0, 0, 0, 0.2);
+ -webkit-box-shadow: 0 0 4px 8px rgba(0, 0, 0, 0.35), 0 0 8px 8px rgba(0, 0, 0, 0.2);
+ -o-box-shadow: 0 0 4px 8px rgba(0, 0, 0, 0.35), 0 0 8px 8px rgba(0, 0, 0, 0.2);
+ box-shadow: 0 0 4px 8px rgba(0, 0, 0, 0.35), 0 0 8px 8px rgba(0, 0, 0, 0.2); }
+
+dl.reflist dd p::before {
+ font-size: 85%;
+ content: "\25B6\00A0\00A0";
+ display: inline-block;
+ width: 12pt; }
+
+dl.reflist dd p {
+ margin-top: 4px;
+ margin-bottom: 4px; }
+
+.paramkey {
+ text-align: right; }
+
+.paramtype {
+ font-family: monospace;
+ white-space: nowrap;
+ color: #002546; }
+
+.paramname {
+ color: black;
+ font-family: monospace;
+ white-space: nowrap; }
+
+.paramname em {
+ color: #820a32;
+ font-style: normal; }
+
+.paramname code {
+ color: #404040;
+ line-height: 14px; }
+
+.params, .retval, .exception, .tparams {
+ margin-left: 0;
+ padding-left: 0;
+ margin-bottom: -0.25em; }
+
+.params dt, .tparams dt {
+ margin-bottom: 0.5em; }
+
+.params .paramname, .tparams .paramname, .retval .paramname, .exception .paramname {
+ color: #820a32;
+ font-family: monospace;
+ font-weight: bold;
+ vertical-align: top; }
+
+.params .paramtype, .tparams .paramtype {
+ font-family: monospace;
+ font-style: italic;
+ vertical-align: top; }
+
+.params .paramdir, .tparams .paramdir {
+ font-family: "courier new",courier,monospace;
+ vertical-align: top; }
+
+/* line over parameters docs */
+.params, .tparams {
+ border-collapse: collapse; }
+
+.params tr, .tparams tr {
+ -moz-box-shadow: 0 -2px 0 -1px #606060;
+ -webkit-box-shadow: 0 -2px 0 -1px #606060;
+ -o-box-shadow: 0 -2px 0 -1px #606060;
+ box-shadow: 0 -2px 0 -1px #606060; }
+
+.params .paramname, .tparams .paramname {
+ border-top: 2px solid #5f082b;
+ padding-right: 5pt; }
+
+.params td, .tparams td {
+ padding-bottom: 1em; }
+
+table.mlabels {
+ border-spacing: 0px; }
+
+td.mlabels-left {
+ width: 100%;
+ padding: 0px; }
+
+td.mlabels-right {
+ vertical-align: bottom;
+ padding: 0px;
+ white-space: nowrap; }
+
+span.mlabels {
+ margin-left: 8px; }
+
+span.mlabel {
+ background-color: #444444;
+ border: none;
+ border-radius: 3px;
+ text-shadow: none;
+ color: white;
+ margin-right: 4px;
+ padding: 3px 5px;
+ font-size: 8pt;
+ white-space: nowrap;
+ vertical-align: middle; }
+
+.memdoc .definition {
+ position: relative;
+ padding-top: 0.5em;
+ /* move definition line to bottom of memdoc */
+ order: 3; }
+ .memdoc .definition::before {
+ content: "";
+ width: 33%;
+ height: 1px;
+ border-top: 1px solid black;
+ position: absolute;
+ top: 0; }
+
+table.directory {
+ border-top: 1px solid #c5c5c5;
+ border-bottom: 1px solid #c5c5c5;
+ border-collapse: collapse;
+ width: 100%;
+ font: 400 14px Roboto,sans-serif; }
+ table.directory tr {
+ background-color: white !important; }
+ table.directory tr.even {
+ background-color: #f6f6f6 !important; }
+ table.directory tr:hover {
+ background-color: #e6e6e6 !important; }
+ table.directory td.entry {
+ padding: 1.5pt 3pt 1.5pt 3pt;
+ white-space: normal; }
+
+div.directory {
+ border: none; }
+ div.directory table.directory tr {
+ line-height: 17pt; }
+ div.directory table.directory td {
+ margin: 0;
+ padding: 0.5pt 6pt 0.5pt 0;
+ vertical-align: middle; }
+ div.directory table.directory td.entry {
+ white-space: nowrap; }
+ div.directory table.directory td.desc {
+ width: 100%;
+ padding-left: 6pt;
+ border-left: 1px solid rgba(0, 0, 0, 0.05); }
+
+.directory .levels {
+ white-space: nowrap;
+ width: 100%;
+ text-align: right;
+ font-size: 9pt; }
+ .directory .levels span {
+ cursor: pointer;
+ padding-left: 2px;
+ padding-right: 2px;
+ color: #00549f; }
+ .directory .levels span:hover {
+ text-decoration: underline; }
+
+/*
+ * The tree view on the left
+ */
+.arrow {
+ color: black;
+ cursor: pointer;
+ font-size: 80%;
+ display: inline-block;
+ width: 16px;
+ height: 22px;
+ margin-left: 4px;
+ -webkit-user-select: none;
+ -khtml-user-select: none;
+ -moz-user-select: none;
+ -ms-user-select: none;
+ user-select: none; }
+ .arrow:hover {
+ color: black; }
+
+#selected .arrow {
+ color: white; }
+ #selected .arrow:hover {
+ color: #d2d2d2; }
+
+#nav-tree {
+ background-image: none;
+ background-color: white; }
+ #nav-tree .item {
+ margin: 0; }
+ #nav-tree .item:hover {
+ background-color: #d2d2d2; }
+ #nav-tree .selected {
+ background-image: none;
+ background-color: #5f082b;
+ color: white;
+ text-shadow: none; }
+ #nav-tree .selected:hover {
+ background-image: none;
+ background-color: #5f082b;
+ color: white;
+ text-shadow: none; }
+ #nav-tree a {
+ color: black; }
+
+.ui-resizable-e {
+ background: #808080 url("splitbar_handle.svg") no-repeat center;
+ border-right: solid 1px #c0c0c0;
+ border-left: solid 1px black; }
+ .ui-resizable-e:hover {
+ background-color: #606060; }
+
+.icon {
+ font-family: monospace;
+ font-weight: bold;
+ font-size: 12px;
+ height: 15px;
+ width: 15px;
+ display: inline-block;
+ background-color: #444444;
+ color: white;
+ text-align: center;
+ border-radius: 3px;
+ margin: 0;
+ padding-top: 1px;
+ text-indent: -1px; }
+
+.icona {
+ width: 0;
+ height: 0;
+ display: none;
+ visibility: hidden; }
+
+.iconfopen {
+ width: 24px;
+ height: 18px;
+ margin-bottom: 4px;
+ background-image: url("folderopen.svg");
+ background-position: 0;
+ background-repeat: no-repeat;
+ vertical-align: top;
+ display: inline-block; }
+
+.iconfclosed {
+ width: 24px;
+ height: 18px;
+ margin-bottom: 4px;
+ background-image: url("folderclosed.svg");
+ background-position: 0;
+ background-repeat: no-repeat;
+ vertical-align: top;
+ display: inline-block; }
+
+.icondoc {
+ width: 24px;
+ height: 18px;
+ margin-bottom: 4px;
+ background-image: url("doc.svg");
+ background-position: 0;
+ background-repeat: no-repeat;
+ vertical-align: top;
+ display: inline-block; }
+
+div.dynheader {
+ margin-top: 8px;
+ -webkit-touch-callout: none;
+ -webkit-user-select: none;
+ -khtml-user-select: none;
+ -moz-user-select: none;
+ -ms-user-select: none;
+ user-select: none; }
+
+address {
+ font-style: normal;
+ color: #2A3D61; }
+
+table.doxtable caption {
+ caption-side: top; }
+
+table.doxtable {
+ border-collapse: collapse;
+ margin-top: 4px;
+ margin-bottom: 4px; }
+
+table.doxtable td, table.doxtable th {
+ border: 1px solid #444444;
+ padding: 3px 7px 2px; }
+
+table.doxtable th {
+ background-color: #444444;
+ color: #FFFFFF;
+ font-size: 110%;
+ padding-bottom: 4px;
+ padding-top: 5px; }
+
+/*
+ * The line at the bottom
+ */
+.navpath {
+ /* intermediate navelems */
+ /* first navelem */
+ /* last navelem */ }
+ .navpath ul {
+ font-size: 11px;
+ background-image: none;
+ height: 30px;
+ line-height: 30px;
+ color: black;
+ border: none;
+ border-top: 1px solid #808080;
+ overflow: hidden;
+ margin: 0px;
+ padding: 0px; }
+ .navpath li:not(:first-child) {
+ list-style-type: none;
+ float: left;
+ padding-left: 18px;
+ padding-right: 10px;
+ color: black;
+ background-color: white;
+ background-image: url("nav_edge_inter.svg");
+ background-repeat: no-repeat;
+ background-position: left -1px;
+ background-size: auto 100%; }
+ .navpath li:first-child {
+ list-style-type: none;
+ float: left;
+ padding-left: 15px;
+ padding-right: 10px;
+ color: black;
+ background-color: white;
+ background-image: none; }
+ .navpath li:nth-last-child(2) {
+ list-style-type: none;
+ float: left;
+ padding-left: 10px;
+ padding-right: 15px;
+ color: white;
+ background-color: #5f082b;
+ background-image: url("nav_edge_right.svg");
+ background-repeat: no-repeat;
+ background-position: right -1px;
+ background-size: auto 100%; }
+ .navpath li:nth-last-child(2):not(:first-child) {
+ list-style-type: none;
+ float: left;
+ padding-left: 15px;
+ padding-right: 15px;
+ color: white;
+ background-color: #5f082b;
+ background-image: url("nav_edge_left.svg"), url("nav_edge_right.svg");
+ background-repeat: no-repeat;
+ background-position: -1px -1px, right -1px;
+ background-size: auto 100%; }
+ .navpath li.navelem a, .navpath .navpath li.navelem b {
+ height: 32px;
+ display: block;
+ text-decoration: none;
+ outline: none;
+ color: inherit;
+ font-family: Roboto,sans-serif;
+ text-shadow: none;
+ text-decoration: none;
+ font-weight: normal; }
+ .navpath li.navelem a:hover {
+ color: inherit;
+ text-decoration: underline; }
+ .navpath li.footer {
+ list-style-type: none;
+ float: right;
+ padding-left: 0;
+ padding-right: 10px;
+ background-color: #d5d5d5;
+ background-image: none;
+ color: black;
+ font-size: 8pt; }
+ .navpath li.footer:before {
+ content: "";
+ width: 13px;
+ height: 30px;
+ display: inline-block;
+ float: left;
+ background-image: url("nav_edge_right.svg");
+ background-repeat: no-repeat;
+ background-position: right 0;
+ background-size: auto 100%;
+ /* flip the element horizontally */
+ -moz-transform: scaleX(-1);
+ -o-transform: scaleX(-1);
+ -webkit-transform: scaleX(-1);
+ transform: scaleX(-1);
+ filter: FlipH;
+ -ms-filter: "FlipH"; }
+
+div.summary {
+ -webkit-order: 2;
+ order: 2;
+ float: right;
+ font-size: 8pt;
+ padding-right: 5px;
+ width: 50%;
+ text-align: right;
+ margin-right: 0.5%; }
+
+div.summary a {
+ white-space: nowrap; }
+
+table.classindex {
+ margin: 10px;
+ white-space: nowrap;
+ margin-left: 1%;
+ margin-right: 1%;
+ width: 98%;
+ border: none;
+ border-top: 1px solid black;
+ border-bottom: 1px solid black;
+ border-spacing: 0.5em;
+ padding: 0; }
+
+div.ingroups {
+ font-size: 8pt;
+ width: 50%;
+ text-align: left; }
+
+div.ingroups a {
+ white-space: nowrap; }
+
+div.header {
+ display: -webkit-flex;
+ display: flex;
+ justify-content: space-between;
+ background-image: none;
+ background-color: #ffffff;
+ color: black;
+ margin: 5pt 5pt 0 5pt;
+ padding: 0 1ex 0 1ex;
+ align-items: center;
+ justify-content: center;
+ border-bottom: none;
+ position: relative; }
+
+div.header::after {
+ content: "";
+ height: 2px;
+ width: 99%;
+ position: absolute;
+ bottom: -5px;
+ left: 0.5%;
+ background: #666; }
+
+div.headertitle {
+ -webkit-order: 1;
+ order: 1;
+ margin-right: auto;
+ text-align: center; }
+
+dl {
+ padding: 0; }
+
+dl.section {
+ margin-left: 0px;
+ padding-left: 0px; }
+
+dl.section > dt {
+ font-weight: bold;
+ font-family: sans-serif; }
+
+dl.note, dl.warning, dl.attention, dl.pre, dl.post, dl.invariant,
+dl.deprecated, dl.todo, dl.test, dl.bug {
+ margin-left: -7px;
+ padding-left: 3px; }
+
+dl.note {
+ padding-left: 7px;
+ border: none; }
+
+dl.warning {
+ background-color: #ffe6ea;
+ border: 1px solid #ff0728;
+ border-left: 4px solid #ff0728;
+ padding-top: 4px;
+ padding-bottom: 3px; }
+
+dl.attention {
+ border-left: 4px solid #ff0728; }
+
+dl.pre, dl.post, dl.invariant {
+ background-color: #f0ffe6;
+ border: 1px solid #5eb82a;
+ border-left: 4px solid #5eb82a; }
+
+dl.deprecated {
+ background-color: #f6f6f6;
+ border: 1px solid black; }
+
+dl.todo {
+ border-left: 4px solid #e8d500; }
+
+dl.test {
+ border-left: 4px solid #00549f; }
+
+dl.bug {
+ background-color: #f6f6f6;
+ border: 1px solid #cc071e;
+ border-left: 4px solid #cc071e; }
+
+dl.section dd {
+ margin-bottom: 6px; }
+
+.memdoc dl dt a.el {
+ font-weight: bold;
+ color: black; }
+
+#projectlogo {
+ text-align: center;
+ vertical-align: bottom;
+ border-collapse: separate; }
+
+#projectlogo img {
+ border: 0px none; }
+
+#projectalign {
+ vertical-align: middle; }
+
+#projectname {
+ font: 300% Tahoma, Arial,sans-serif;
+ margin: 0px;
+ padding: 2px 0px; }
+
+#projectbrief {
+ font: 120% Tahoma, Arial,sans-serif;
+ margin: 0px;
+ padding: 0px; }
+
+#projectnumber {
+ font: 50% Roboto,sans-serif;
+ margin: 0px;
+ padding: 0px; }
+
+#titlearea {
+ padding: 0px;
+ margin: 0px;
+ width: 100%;
+ border-bottom: none; }
+ #titlearea:nth-last-child(2) {
+ border-bottom: 2px solid #444444; }
+
+.image {
+ text-align: center; }
+
+.dotgraph, .mscgraph, .diagraph {
+ text-align: center; }
+
+.caption {
+ font-weight: bold; }
+
+div.zoom {
+ border: 1px solid #90A5CE; }
+
+dl.citelist {
+ margin-bottom: 5ex; }
+ dl.citelist dt {
+ color: black;
+ float: left;
+ font-weight: bold;
+ padding: 5px 0;
+ margin: 2px 10pt 2px 0; }
+ dl.citelist dd {
+ margin: 2px 0;
+ padding: 5px 0; }
+ dl.citelist .startdd {
+ margin-top: 0; }
+
+div.toc {
+ background-color: transparent;
+ border: 1px solid #414141;
+ -moz-border-radius: 0;
+ -webkit-border-radius: 0;
+ border-radius: 0;
+ float: right;
+ height: auto;
+ margin: 0 8px 10px 10px;
+ padding: 10px 15px 5px 25px;
+ width: auto; }
+ div.toc li {
+ background: transparent;
+ font: 10pt Roboto,DejaVu Sans,sans-serif;
+ padding-left: 0;
+ padding-top: 0.5ex; }
+ div.toc li .level1 {
+ margin-left: 10pt; }
+ div.toc li .level2 {
+ margin-left: 10pt; }
+ div.toc li .level3 {
+ margin-left: 10pt; }
+ div.toc li .level4 {
+ margin-left: 10pt; }
+ div.toc h3 {
+ font: bold 12px/1.2 Roboto,DejaVu Sans,sans-serif;
+ color: black;
+ border-bottom: none;
+ margin: 0;
+ letter-spacing: 1px; }
+ div.toc ul {
+ list-style: disc;
+ border: none;
+ padding: 0; }
+
+.inherit_header {
+ font-weight: bold;
+ color: gray;
+ cursor: pointer;
+ -webkit-touch-callout: none;
+ -webkit-user-select: none;
+ -khtml-user-select: none;
+ -moz-user-select: none;
+ -ms-user-select: none;
+ user-select: none; }
+
+.inherit_header td {
+ padding: 6px 0px 2px 5px; }
+
+.inherit {
+ display: none; }
+
+/* tooltip related style info */
+.ttc {
+ position: absolute;
+ display: none; }
+
+#powerTip {
+ cursor: default;
+ white-space: nowrap;
+ background-color: #ffffff;
+ border: 1px solid #323232;
+ border-radius: 0;
+ -moz-box-shadow: none;
+ -webkit-box-shadow: none;
+ -o-box-shadow: none;
+ box-shadow: none;
+ display: none;
+ font-size: smaller;
+ max-width: 80%;
+ opacity: 0.9;
+ padding: 1ex 1em 1em 1em;
+ position: absolute;
+ z-index: 2147483647; }
+ #powerTip div.ttdoc {
+ color: grey;
+ font-style: italic; }
+ #powerTip div.ttname a {
+ font-weight: bold; }
+ #powerTip div.ttname {
+ font-weight: bold; }
+ #powerTip div.ttdeci {
+ color: #006318; }
+ #powerTip div {
+ margin: 0px;
+ padding: 0px;
+ font: 12px/16px Roboto,sans-serif; }
+ #powerTip:before, #powerTip:after {
+ content: "";
+ position: absolute;
+ margin: 0px; }
+
+@media print {
+ #top {
+ display: none; }
+
+ #side-nav {
+ display: none; }
+
+ #nav-path {
+ display: none; }
+
+ body {
+ overflow: visible; }
+
+ h1, h2, h3, h4, h5, h6 {
+ page-break-after: avoid; }
+
+ .summary {
+ display: none; }
+
+ .memitem {
+ page-break-inside: avoid; }
+
+ #doc-content {
+ margin-left: 0 !important;
+ height: auto !important;
+ width: auto !important;
+ overflow: inherit;
+ display: inline;
+ background-color: white; } }
+
+/*# sourceMappingURL=that_style.css.map */
diff --git a/example/CMakeLists.txt b/example/CMakeLists.txt
index 4951733..b672092 100644
--- a/example/CMakeLists.txt
+++ b/example/CMakeLists.txt
@@ -137,4 +137,5 @@ endif (WIN32 OR CYGWIN OR MINGW)
# TODO Execute "$CMAKE_LINKER --help" and check for --wrap
if (${CMAKE_C_COMPILER_ID} MATCHES "(GNU|Clang)" AND NOT APPLE)
add_subdirectory(chef_wrap)
+ add_subdirectory(uptime)
endif()
diff --git a/example/uptime/CMakeLists.txt b/example/uptime/CMakeLists.txt
new file mode 100644
index 0000000..99924bd
--- /dev/null
+++ b/example/uptime/CMakeLists.txt
@@ -0,0 +1,21 @@
+include_directories(
+ ${CMAKE_BINARY_DIR}
+ ${CMAKE_CURRENT_SOURCE_DIR}
+ ${CMOCKA_PUBLIC_INCLUDE_DIRS}
+)
+
+add_library(proc_uptime proc_uptime.c)
+
+add_executable(uptime uptime.c)
+target_compile_options(uptime PRIVATE ${DEFAULT_C_COMPILE_FLAGS})
+target_link_libraries(uptime proc_uptime)
+
+add_executable(test_uptime test_uptime.c)
+target_compile_options(test_uptime PRIVATE ${DEFAULT_C_COMPILE_FLAGS})
+target_link_libraries(test_uptime ${CMOCKA_SHARED_LIBRARY})
+
+set_target_properties(test_uptime
+ PROPERTIES
+ LINK_FLAGS "-Wl,--wrap=uptime")
+
+add_test(test_uptime ${CMAKE_CURRENT_BINARY_DIR}/test_uptime)
diff --git a/example/uptime/README.md b/example/uptime/README.md
new file mode 100644
index 0000000..081ae51
--- /dev/null
+++ b/example/uptime/README.md
@@ -0,0 +1,56 @@
+The uptime mock example
+=======================
+
+This is a very simple example to explain the mocking feature of cmocka. It
+implement the 'uptime' unix command in a very simple way to demonstrate how to
+test the time calculation.
+
+The problem with testing the uptime command is that /proc/uptime constantly
+ticks. The result is random whenever you call the test. To actually test it
+we need to make sure that we work with fixed values. The mocking features
+of cmocka allows us to test it anyway!
+
+Source files
+------------
+
+* *proc_uptime.c*: This implements the `uptime()` function reading and parsing
+ the /proc/uptime file.
+* *uptime.c*: This is the actual uptime implementation, it calls
+ `calc_uptime()` to get a human readable string representation of the uptime.
+ This function calls `uptime()` from proc_uptime.c.
+* *test_uptime.c*: This is the test with the mocking function for uptime().
+
+Linking magic
+-------------
+
+The test is linked using:
+
+ ld --wrap=uptime
+
+This replaces the orginal `uptime()` function which reads from `/proc/uptime`
+with the mock function we implemented for testing `calc_uptime()`.
+
+The mock function we implemented has a special name. It is called
+`__wrap_uptime()`. All the symbols you want to mock (or replace) need to start
+with the prefix `__wrap_`. So `ld --wrap=uptime` will rename the orignal
+`uptime()` function to `__real_uptime()`. This means you can still reach the
+original function using that name and call it e.g. from the wrap function.
+The symbol `uptime` will be bound to `__wrap_uptime`.
+
+You can find more details in the manpage: `man ld`
+
+The uptime test
+---------------
+
+The code should be easy to understand. If you have a hard time following, there
+are two ways to understand how things work.
+
+You can find out details about symbol binding using:
+
+ LD_DEBUG=symbols ./example/uptime/uptime
+ LD_DEBUG=symbols ./example/uptime/test_uptime
+
+You can also use a debugger to step through the code!
+
+
+Have fun!
diff --git a/example/uptime/proc_uptime.c b/example/uptime/proc_uptime.c
new file mode 100644
index 0000000..a92c2ab
--- /dev/null
+++ b/example/uptime/proc_uptime.c
@@ -0,0 +1,78 @@
+/*
+ * Copyright 2018 Andreas Scheider <asn@cryptomilk.org>
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+#include <errno.h>
+#include <stdio.h>
+#include <stdlib.h>
+#include <string.h>
+#include <sys/types.h>
+#include <sys/stat.h>
+#include <fcntl.h>
+#include <locale.h>
+#include <unistd.h>
+
+#include "proc_uptime.h"
+
+#define UPTIME_FILE "/proc/uptime"
+
+int uptime(const char *uptime_path, double *uptime_secs, double *idle_secs)
+{
+ double up = 0;
+ double idle = 0;
+ char *savelocale = NULL;
+ char buf[1024] = {0};
+ ssize_t nread;
+ int fd = -1;
+ int rc;
+
+ if (uptime_path == NULL) {
+ uptime_path = UPTIME_FILE;
+ }
+
+ fd = open(uptime_path, O_RDONLY);
+ if (fd < 0) {
+ return 0;
+ }
+
+ nread = read(fd, buf, sizeof(buf));
+ close(fd);
+ if (nread < 0) {
+ return 0;
+ }
+
+ savelocale = strdup(setlocale(LC_NUMERIC, NULL));
+ if (savelocale == NULL) {
+ return 0;
+ }
+
+ setlocale(LC_NUMERIC, "C");
+ rc = sscanf(buf, "%lf %lf", &up, &idle);
+ setlocale(LC_NUMERIC, savelocale);
+ free(savelocale);
+ if (rc < 2) {
+ errno = EFAULT;
+ return 0;
+ }
+
+ if (uptime_secs != NULL) {
+ *uptime_secs = up;
+ }
+ if (idle_secs != NULL) {
+ *idle_secs = idle;
+ }
+
+ return (int)up;
+}
diff --git a/example/uptime/proc_uptime.h b/example/uptime/proc_uptime.h
new file mode 100644
index 0000000..222ece5
--- /dev/null
+++ b/example/uptime/proc_uptime.h
@@ -0,0 +1,22 @@
+/*
+ * Copyright 2018 Andreas Scheider <asn@cryptomilk.org>
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+#ifndef _PROC_UPTIME_H
+#define _PROC_UPTIME_H
+
+int uptime(const char *uptime_path, double *uptime_secs, double *idle_secs);
+
+#endif /* _PROC_UPTIME_H */
diff --git a/example/uptime/test_uptime.c b/example/uptime/test_uptime.c
new file mode 100644
index 0000000..32ec79e
--- /dev/null
+++ b/example/uptime/test_uptime.c
@@ -0,0 +1,182 @@
+/*
+ * Copyright 2018 Andreas Scheider <asn@cryptomilk.org>
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+#include <stdarg.h>
+#include <stddef.h>
+#include <setjmp.h>
+#include <cmocka.h>
+
+#define UNIT_TESTING 1
+#include "uptime.c"
+
+#define UNUSED(x) (void)(x)
+
+/*
+ * This is a mocked object!
+ *
+ * It is a reimplementation of the uptime() function you can find in
+ * proc_uptime.c.
+ *
+ * This function can be instrumeted by the test. We can tell it what
+ * we expect or should return.
+ */
+int __wrap_uptime(const char *uptime_path,
+ double *uptime_secs,
+ double *idle_secs);
+int __wrap_uptime(const char *uptime_path,
+ double *uptime_secs,
+ double *idle_secs)
+{
+ double up;
+ double idle;
+
+ /* Verify the passed value of the argument is correct */
+ check_expected(uptime_path);
+
+ /* Assign the return values */
+ up = mock_type(double);
+ idle = mock_type(double);
+
+ if (uptime_secs != NULL) {
+ *uptime_secs = up;
+ }
+ if (idle_secs != NULL) {
+ *idle_secs = idle;
+ }
+
+ return (int)up;
+}
+
+static void test_calc_uptime_minutes(void **state)
+{
+ char *uptime_str = NULL;
+
+ UNUSED(state);
+
+ /* Make sure the passed 'in' argument is correct */
+ expect_string(__wrap_uptime, uptime_path, "/proc/uptime");
+
+ /* We tell the uptime function what values it should return */
+ will_return(__wrap_uptime, 508.16);
+ will_return(__wrap_uptime, 72.23);
+
+ /* We call the function like we would do it normally */
+ uptime_str = calc_uptime();
+
+ /* Now lets check if the result is what we expect it to be */
+ assert_non_null(uptime_str);
+ assert_string_equal(uptime_str, "up 8 minutes");
+
+ free(uptime_str);
+}
+
+static void test_calc_uptime_hour_minute(void **state)
+{
+ char *uptime_str = NULL;
+
+ UNUSED(state);
+
+ /* Make sure the passed 'in' argument is correct */
+ expect_string(__wrap_uptime, uptime_path, "/proc/uptime");
+
+ /* We tell the uptime function what values it should return */
+ will_return(__wrap_uptime, 3699.16);
+ will_return(__wrap_uptime, 4069.23);
+
+ /* We call the function like we would do it normally */
+ uptime_str = calc_uptime();
+
+ /* Now lets check if the result is what we expect it to be */
+ assert_non_null(uptime_str);
+ assert_string_equal(uptime_str, "up 1 hour, 1 minute");
+
+ free(uptime_str);
+}
+
+static void test_calc_uptime_days_minutes(void **state)
+{
+ char *uptime_str = NULL;
+
+ UNUSED(state);
+
+ /* Make sure the passed 'in' argument is correct */
+ expect_string(__wrap_uptime, uptime_path, "/proc/uptime");
+
+ /* We tell the uptime function what values it should return */
+ will_return(__wrap_uptime, 259415.14);
+ will_return(__wrap_uptime, 262446.29);
+
+ /* We call the function like we would do it normally */
+ uptime_str = calc_uptime();
+
+ /* Now lets check if the result is what we expect it to be */
+ assert_non_null(uptime_str);
+ assert_string_equal(uptime_str, "up 3 days, 3 minutes");
+
+ free(uptime_str);
+}
+
+static void test_calc_uptime_days_hours_minutes(void **state)
+{
+ char *uptime_str = NULL;
+
+ UNUSED(state);
+
+ /* Make sure the passed 'in' argument is correct */
+ expect_string(__wrap_uptime, uptime_path, "/proc/uptime");
+
+ /* We tell the uptime function what values it should return */
+ will_return(__wrap_uptime, 359415.14);
+ will_return(__wrap_uptime, 362446.29);
+
+ /* We call the function like we would do it normally */
+ uptime_str = calc_uptime();
+
+ /* Now lets check if the result is what we expect it to be */
+ assert_non_null(uptime_str);
+ assert_string_equal(uptime_str, "up 4 days, 3 hours, 50 minutes");
+
+ free(uptime_str);
+}
+
+static void test_calc_uptime_null(void **state)
+{
+ char *uptime_str = NULL;
+
+ UNUSED(state);
+
+ /* Make sure the passed 'in' argument is correct */
+ expect_string(__wrap_uptime, uptime_path, "/proc/uptime");
+
+ will_return(__wrap_uptime, -0.0);
+ will_return(__wrap_uptime, 0.1);
+
+ uptime_str = calc_uptime();
+ assert_null(uptime_str);
+}
+
+int main(void)
+{
+ const struct CMUnitTest tests[] = {
+ cmocka_unit_test(test_calc_uptime_minutes),
+ cmocka_unit_test(test_calc_uptime_hour_minute),
+ cmocka_unit_test(test_calc_uptime_days_minutes),
+ cmocka_unit_test(test_calc_uptime_days_hours_minutes),
+ cmocka_unit_test(test_calc_uptime_null),
+ };
+
+ return cmocka_run_group_tests(tests, NULL, NULL);
+}
diff --git a/example/uptime/uptime.c b/example/uptime/uptime.c
new file mode 100644
index 0000000..77776a7
--- /dev/null
+++ b/example/uptime/uptime.c
@@ -0,0 +1,115 @@
+/*
+ * Copyright 2018 Andreas Scheider <asn@cryptomilk.org>
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+#include <stdio.h>
+#include <stdlib.h>
+#include <stdint.h>
+#include <string.h>
+#include <time.h>
+#include <sys/time.h>
+
+#include "proc_uptime.h"
+
+static char *calc_uptime(void)
+{
+ uint32_t up_minutes, up_hours, up_days, up_weeks, up_years;
+ ssize_t pos = 0;
+ size_t comma = 0;
+ double uptime_secs, idle_secs;
+ char buf[1024] = {0};
+ int up;
+
+ up = uptime("/proc/uptime", &uptime_secs, &idle_secs);
+ if (up == 0) {
+ return NULL;
+ }
+
+ up_years = ((uint32_t)uptime_secs / (60 * 60 * 24 * 365)) % 10;
+ up_weeks = ((uint32_t)uptime_secs / (60 * 60 * 24 * 7)) % 52;
+ up_days = ((uint32_t)uptime_secs / (60 * 60 * 24)) % 7;
+
+ pos += snprintf(buf + pos, sizeof(buf) - pos, "up ");
+
+ up_minutes = (uint32_t)uptime_secs / 60;
+ up_hours = up_minutes / 60;
+ up_hours = up_hours % 24;
+ up_minutes = up_minutes % 60;
+
+ if (up_years > 0) {
+ pos += snprintf(buf + pos, sizeof(buf) - pos,
+ "%u %s",
+ up_years,
+ up_years > 1 ? "years" : "year");
+ comma++;
+ }
+
+ if (up_weeks > 0) {
+ pos += snprintf(buf + pos, sizeof(buf) - pos,
+ "%s%u %s",
+ comma > 0 ? ", " : "",
+ up_weeks,
+ up_weeks > 1 ? "weeks" : "week");
+ comma++;
+ }
+
+ if (up_days > 0) {
+ pos += snprintf(buf + pos, sizeof(buf) - pos,
+ "%s%u %s",
+ comma > 0 ? ", " : "",
+ up_days,
+ up_days > 1 ? "days" : "day");
+ comma++;
+ }
+
+ if (up_hours > 0) {
+ pos += snprintf(buf + pos, sizeof(buf) - pos,
+ "%s%u %s",
+ comma > 0 ? ", " : "",
+ up_hours,
+ up_hours > 1 ? "hours" : "hour");
+ comma++;
+ }
+
+ if (up_minutes > 0 || (up_minutes == 0 && uptime_secs < 60)) {
+ pos += snprintf(buf + pos, sizeof(buf) - pos,
+ "%s%u %s",
+ comma > 0 ? ", " : "",
+ up_minutes,
+ up_minutes != 1 ? "minutes" : "minute");
+ comma++;
+ }
+
+ return strdup(buf);
+}
+
+#ifndef UNIT_TESTING
+int main(void)
+{
+ char *uptime_str = NULL;
+
+ uptime_str = calc_uptime();
+ if (uptime_str == NULL) {
+ fprintf(stderr, "Failed to read uptime\n");
+ return 1;
+ }
+
+ printf("%s\n", uptime_str);
+
+ free(uptime_str);
+
+ return 0;
+}
+#endif /* UNIT_TESTING */
diff --git a/include/cmocka.h b/include/cmocka.h
index 72d6ae2..e6861c8 100644
--- a/include/cmocka.h
+++ b/include/cmocka.h
@@ -1,5 +1,6 @@
/*
* Copyright 2008 Google Inc.
+ * Copyright 2014-2018 Andreas Schneider <asn@cryptomilk.org>
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
@@ -56,7 +57,7 @@ int __stdcall IsDebuggerPresent();
/* If __WORDSIZE is not set, try to figure it out and default to 32 bit. */
#ifndef __WORDSIZE
-# if defined(__x86_64__) && !defined(__ILP32__)
+# if (defined(__x86_64__) && !defined(__ILP32__)) || defined(__sparc_v9__) || defined(__sparcv9)
# define __WORDSIZE 64
# else
# define __WORDSIZE 32
@@ -1107,7 +1108,7 @@ void assert_return_code(int rc, int error);
* @brief Assert that the given pointer is non-NULL.
*
* The function prints an error message to standard error and terminates the
- * test by calling fail() if the pointer is non-NULL.
+ * test by calling fail() if the pointer is NULL.
*
* @param[in] pointer The pointer to evaluate.
*
@@ -1698,8 +1699,8 @@ static inline void _unit_test_dummy(void **state) {
*/
#define cmocka_unit_test_prestate_setup_teardown(f, setup, teardown, state) { #f, f, setup, teardown, state }
-#define run_tests(tests) _run_tests(tests, sizeof(tests) / sizeof(tests)[0])
-#define run_group_tests(tests) _run_group_tests(tests, sizeof(tests) / sizeof(tests)[0])
+#define run_tests(tests) _run_tests(tests, sizeof(tests) / sizeof((tests)[0]))
+#define run_group_tests(tests) _run_group_tests(tests, sizeof(tests) / sizeof((tests)[0]))
#ifdef DOXYGEN
/**
@@ -1763,7 +1764,7 @@ int cmocka_run_group_tests(const struct CMUnitTest group_tests[],
CMFixtureFunction group_teardown);
#else
# define cmocka_run_group_tests(group_tests, group_setup, group_teardown) \
- _cmocka_run_group_tests(#group_tests, group_tests, sizeof(group_tests) / sizeof(group_tests)[0], group_setup, group_teardown)
+ _cmocka_run_group_tests(#group_tests, group_tests, sizeof(group_tests) / sizeof((group_tests)[0]), group_setup, group_teardown)
#endif
#ifdef DOXYGEN
@@ -1832,7 +1833,7 @@ int cmocka_run_group_tests_name(const char *group_name,
CMFixtureFunction group_teardown);
#else
# define cmocka_run_group_tests_name(group_name, group_tests, group_setup, group_teardown) \
- _cmocka_run_group_tests(group_name, group_tests, sizeof(group_tests) / sizeof(group_tests)[0], group_setup, group_teardown)
+ _cmocka_run_group_tests(group_name, group_tests, sizeof(group_tests) / sizeof((group_tests)[0]), group_setup, group_teardown)
#endif
/** @} */
@@ -2279,6 +2280,19 @@ enum cm_message_output {
*/
void cmocka_set_message_output(enum cm_message_output output);
+
+/**
+ * @brief Set a pattern to only run the test matching the pattern.
+ *
+ * This allows to filter tests and only run the ones matching the pattern. Thep
+ * pattern can include two wildards. The first is '*', a wildcard that matches
+ * zero or more characters, or ‘?’, a wildcard that matches exactly one
+ * character.
+ *
+ * @param[in] pattern The pattern to match, e.g. "test_wurst*"
+ */
+void cmocka_set_test_filter(const char *pattern);
+
/** @} */
#endif /* CMOCKA_H_ */
diff --git a/src/CMakeLists.txt b/src/CMakeLists.txt
index b5a3c7d..5732232 100644
--- a/src/CMakeLists.txt
+++ b/src/CMakeLists.txt
@@ -3,13 +3,13 @@ project(cmocka-library C)
set(CMOCKA_PLATFORM_INCLUDE CACHE PATH "Path to include directory for cmocka_platform.h")
set(CMOCKA_PUBLIC_INCLUDE_DIRS
- ${CMAKE_SOURCE_DIR}/include
+ ${cmocka_SOURCE_DIR}/include
${CMOCKA_PLATFORM_INCLUDE}
CACHE INTERNAL "cmocka public include directories"
)
set(CMOCKA_PRIVATE_INCLUDE_DIRS
- ${CMAKE_BINARY_DIR}
+ ${cmocka_BINARY_DIR}
)
set(CMOCKA_SHARED_LIBRARY
@@ -51,7 +51,7 @@ if (CMOCKA_PLATFORM_INCLUDE)
endif()
add_library(${CMOCKA_SHARED_LIBRARY} SHARED ${cmocka_SRCS})
-
+target_compile_options(${CMOCKA_SHARED_LIBRARY} PRIVATE ${DEFAULT_C_COMPILE_FLAGS})
target_link_libraries(${CMOCKA_SHARED_LIBRARY} ${CMOCKA_LINK_LIBRARIES})
set_target_properties(
${CMOCKA_SHARED_LIBRARY}
@@ -83,6 +83,7 @@ install(
if (WITH_STATIC_LIB)
add_library(${CMOCKA_STATIC_LIBRARY} STATIC ${cmocka_SRCS})
+ target_compile_options(${CMOCKA_STATIC_LIBRARY} PRIVATE ${DEFAULT_C_COMPILE_FLAGS})
set_target_properties(
${CMOCKA_STATIC_LIBRARY}
@@ -95,6 +96,15 @@ if (WITH_STATIC_LIB)
cmocka
)
+ if (NOT WIN32)
+ set_target_properties(
+ ${CMOCKA_STATIC_LIBRARY}
+ PROPERTIES
+ OUTPUT_NAME
+ cmocka
+ )
+ endif()
+
install(
TARGETS ${CMOCKA_STATIC_LIBRARY}
DESTINATION ${LIB_INSTALL_DIR}
@@ -102,17 +112,19 @@ if (WITH_STATIC_LIB)
)
endif (WITH_STATIC_LIB)
-if (POLICY CMP0026)
- cmake_policy(SET CMP0026 OLD)
-endif()
+if (WIN32)
+ if (POLICY CMP0026)
+ cmake_policy(SET CMP0026 OLD)
+ endif()
#
# In order to run tests we will need to set the approriate environment
# variable so that the test program can locate its dependent DLL's. First
# we want to know what directory our dependent DLL was installed into:
#
-get_target_property(_cmocka_dir cmocka_shared LOCATION_${CMOCKA_BUILD_TYPE})
-get_filename_component(_cmocka_path "${_cmocka_dir}" PATH)
-file(TO_NATIVE_PATH "${_cmocka_path}" _cmocka_path_native)
+ get_target_property(_cmocka_dir cmocka_shared LOCATION_${CMOCKA_BUILD_TYPE})
+ get_filename_component(_cmocka_path "${_cmocka_dir}" PATH)
+ file(TO_NATIVE_PATH "${_cmocka_path}" _cmocka_path_native)
-set(CMOCKA_DLL_PATH "${_cmocka_path_native}" PARENT_SCOPE)
+ set(CMOCKA_DLL_PATH "${_cmocka_path_native}" PARENT_SCOPE)
+endif()
diff --git a/src/cmocka.c b/src/cmocka.c
index f02e412..7a68fd8 100644
--- a/src/cmocka.c
+++ b/src/cmocka.c
@@ -1,6 +1,6 @@
/*
* Copyright 2008 Google Inc.
- * Copyright 2014-2015 Andreas Schneider <asn@cryptomilk.org>
+ * Copyright 2014-2018 Andreas Schneider <asn@cryptomilk.org>
* Copyright 2015 Jakub Hrozek <jakub.hrozek@posteo.se>
*
* Licensed under the Apache License, Version 2.0 (the "License");
@@ -148,12 +148,17 @@ typedef struct ListNode {
} ListNode;
/* Debug information for malloc(). */
-typedef struct MallocBlockInfo {
+struct MallocBlockInfoData {
void* block; /* Address of the block returned by malloc(). */
size_t allocated_size; /* Total size of the allocated block. */
size_t size; /* Request block size. */
SourceLocation location; /* Where the block was allocated. */
ListNode node; /* Node within list of all allocated blocks. */
+};
+
+typedef union {
+ struct MallocBlockInfoData *data;
+ char *ptr;
} MallocBlockInfo;
/* State of each test. */
@@ -244,10 +249,10 @@ static void free_symbol_map_value(
static void remove_always_return_values(ListNode * const map_head,
const size_t number_of_symbol_names);
-static int check_for_leftover_values_list(const ListNode * head,
- const char * const error_message);
+static size_t check_for_leftover_values_list(const ListNode * head,
+ const char * const error_message);
-static int check_for_leftover_values(
+static size_t check_for_leftover_values(
const ListNode * const map_head, const char * const error_message,
const size_t number_of_symbol_names);
@@ -305,6 +310,8 @@ static CMOCKA_THREAD ListNode global_allocated_blocks;
static enum cm_message_output global_msg_output = CM_OUTPUT_STDOUT;
+static const char *global_test_filter_pattern;
+
#ifndef _WIN32
/* Signals caught by exception_handler(). */
static const int exception_signals[] = {
@@ -453,7 +460,7 @@ static int c_strreplace(char *src,
memmove(src + of + rl, src + of + pl, l - of - pl + 1);
}
- strncpy(src + of, repl, rl);
+ memcpy(src + of, repl, rl);
if (str_replaced != NULL) {
*str_replaced = 1;
@@ -464,6 +471,64 @@ static int c_strreplace(char *src,
return 0;
}
+static int c_strmatch(const char *str, const char *pattern)
+{
+ int ok;
+
+ if (str == NULL || pattern == NULL) {
+ return 0;
+ }
+
+ for (;;) {
+ /* Check if pattern is done */
+ if (*pattern == '\0') {
+ /* If string is at the end, we're good */
+ if (*str == '\0') {
+ return 1;
+ }
+
+ return 0;
+ }
+
+ if (*pattern == '*') {
+ /* Move on */
+ pattern++;
+
+ /* If we are at the end, everything is fine */
+ if (*pattern == '\0') {
+ return 1;
+ }
+
+ /* Try to match each position */
+ for (; *str != '\0'; str++) {
+ ok = c_strmatch(str, pattern);
+ if (ok) {
+ return 1;
+ }
+ }
+
+ /* No match */
+ return 0;
+ }
+
+ /* If we are at the end, leave */
+ if (*str == '\0') {
+ return 0;
+ }
+
+ /* Check if we have a single wildcard or matching char */
+ if (*pattern != '?' && *str != *pattern) {
+ return 0;
+ }
+
+ /* Move string and pattern */
+ str++;
+ pattern++;
+ }
+
+ return 0;
+}
+
/* Create function results and expected parameter lists. */
void initialize_testing(const char *test_name) {
(void)test_name;
@@ -489,7 +554,8 @@ static void fail_if_leftover_values(const char *test_name) {
remove_always_return_values(&global_function_parameter_map_head, 2);
if (check_for_leftover_values(
&global_function_parameter_map_head,
- "%s parameter still has values that haven't been checked.\n", 2)) {
+ "'%s' parameter still has values that haven't been checked.\n",
+ 2)) {
error_occurred = 1;
}
@@ -811,11 +877,11 @@ static void remove_always_return_values(ListNode * const map_head,
}
}
-static int check_for_leftover_values_list(const ListNode * head,
- const char * const error_message)
+static size_t check_for_leftover_values_list(const ListNode * head,
+ const char * const error_message)
{
ListNode *child_node;
- int leftover_count = 0;
+ size_t leftover_count = 0;
if (!list_empty(head))
{
for (child_node = head->next; child_node != head;
@@ -835,11 +901,11 @@ static int check_for_leftover_values_list(const ListNode * head,
* Checks if there are any leftover values set up by the test that were never
* retrieved through execution, and fail the test if that is the case.
*/
-static int check_for_leftover_values(
+static size_t check_for_leftover_values(
const ListNode * const map_head, const char * const error_message,
const size_t number_of_symbol_names) {
const ListNode *current;
- int symbols_with_leftover_values = 0;
+ size_t symbols_with_leftover_values = 0;
assert_non_null(map_head);
assert_true(number_of_symbol_names);
@@ -865,7 +931,7 @@ static int check_for_leftover_values(
location->file, location->line);
}
} else {
- cm_print_error("%s.", value->symbol_name);
+ cm_print_error("%s: ", value->symbol_name);
check_for_leftover_values(child_list, error_message,
number_of_symbol_names - 1);
}
@@ -1187,19 +1253,24 @@ static int string_not_equal_display_error(
*/
static int memory_equal_display_error(const char* const a, const char* const b,
const size_t size) {
- int differences = 0;
+ size_t differences = 0;
size_t i;
for (i = 0; i < size; i++) {
const char l = a[i];
const char r = b[i];
if (l != r) {
- cm_print_error("difference at offset %" PRIdS " 0x%02x 0x%02x\n",
- i, l, r);
+ if (differences < 16) {
+ cm_print_error("difference at offset %" PRIdS " 0x%02x 0x%02x\n",
+ i, l, r);
+ }
differences ++;
}
}
- if (differences) {
- cm_print_error("%d bytes of %p and %p differ\n",
+ if (differences > 0) {
+ if (differences >= 16) {
+ cm_print_error("...\n");
+ }
+ cm_print_error("%"PRIdS " bytes of %p and %p differ\n",
differences, (void *)a, (void *)b);
return 0;
}
@@ -1819,16 +1890,22 @@ static void vcm_free_error(char *err_msg)
/* Use the real malloc in this function. */
#undef malloc
void* _test_malloc(const size_t size, const char* file, const int line) {
- char* ptr;
- MallocBlockInfo *block_info;
+ char *ptr = NULL;
+ MallocBlockInfo block_info;
ListNode * const block_list = get_allocated_blocks_list();
- const size_t allocate_size = size + (MALLOC_GUARD_SIZE * 2) +
- sizeof(*block_info) + MALLOC_ALIGNMENT;
- char* const block = (char*)malloc(allocate_size);
+ size_t allocate_size;
+ char *block = NULL;
+
+ allocate_size = size + (MALLOC_GUARD_SIZE * 2) +
+ sizeof(struct MallocBlockInfoData) + MALLOC_ALIGNMENT;
+ assert_true(allocate_size > size);
+
+ block = (char *)malloc(allocate_size);
assert_non_null(block);
/* Calculate the returned address. */
- ptr = (char*)(((size_t)block + MALLOC_GUARD_SIZE + sizeof(*block_info) +
+ ptr = (char*)(((size_t)block + MALLOC_GUARD_SIZE +
+ sizeof(struct MallocBlockInfoData) +
MALLOC_ALIGNMENT) & ~(MALLOC_ALIGNMENT - 1));
/* Initialize the guard blocks. */
@@ -1836,14 +1913,14 @@ void* _test_malloc(const size_t size, const char* file, const int line) {
memset(ptr + size, MALLOC_GUARD_PATTERN, MALLOC_GUARD_SIZE);
memset(ptr, MALLOC_ALLOC_PATTERN, size);
- block_info = (MallocBlockInfo*)(ptr - (MALLOC_GUARD_SIZE +
- sizeof(*block_info)));
- set_source_location(&block_info->location, file, line);
- block_info->allocated_size = allocate_size;
- block_info->size = size;
- block_info->block = block;
- block_info->node.value = block_info;
- list_add(block_list, &block_info->node);
+ block_info.ptr = ptr - (MALLOC_GUARD_SIZE +
+ sizeof(struct MallocBlockInfoData));
+ set_source_location(&block_info.data->location, file, line);
+ block_info.data->allocated_size = allocate_size;
+ block_info.data->size = size;
+ block_info.data->block = block;
+ block_info.data->node.value = block_info.ptr;
+ list_add(block_list, &block_info.data->node);
return ptr;
}
#define malloc test_malloc
@@ -1864,19 +1941,19 @@ void* _test_calloc(const size_t number_of_elements, const size_t size,
void _test_free(void* const ptr, const char* file, const int line) {
unsigned int i;
char *block = discard_const_p(char, ptr);
- MallocBlockInfo *block_info;
+ MallocBlockInfo block_info;
if (ptr == NULL) {
return;
}
_assert_true(cast_ptr_to_largest_integral_type(ptr), "ptr", file, line);
- block_info = (MallocBlockInfo*)(block - (MALLOC_GUARD_SIZE +
- sizeof(*block_info)));
+ block_info.ptr = block - (MALLOC_GUARD_SIZE +
+ sizeof(struct MallocBlockInfoData));
/* Check the guard blocks. */
{
char *guards[2] = {block - MALLOC_GUARD_SIZE,
- block + block_info->size};
+ block + block_info.data->size};
for (i = 0; i < ARRAY_SIZE(guards); i++) {
unsigned int j;
char * const guard = guards[i];
@@ -1886,19 +1963,22 @@ void _test_free(void* const ptr, const char* file, const int line) {
cm_print_error(SOURCE_LOCATION_FORMAT
": error: Guard block of %p size=%lu is corrupt\n"
SOURCE_LOCATION_FORMAT ": note: allocated here at %p\n",
- file, line,
- ptr, (unsigned long)block_info->size,
- block_info->location.file, block_info->location.line,
+ file,
+ line,
+ ptr,
+ (unsigned long)block_info.data->size,
+ block_info.data->location.file,
+ block_info.data->location.line,
(void *)&guard[j]);
_fail(file, line);
}
}
}
}
- list_remove(&block_info->node, NULL, NULL);
+ list_remove(&block_info.data->node, NULL, NULL);
- block = discard_const_p(char, block_info->block);
- memset(block, MALLOC_FREE_PATTERN, block_info->allocated_size);
+ block = discard_const_p(char, block_info.data->block);
+ memset(block, MALLOC_FREE_PATTERN, block_info.data->allocated_size);
free(block);
}
#define free test_free
@@ -1909,7 +1989,7 @@ void *_test_realloc(void *ptr,
const char *file,
const int line)
{
- MallocBlockInfo *block_info;
+ MallocBlockInfo block_info;
char *block = ptr;
size_t block_size = size;
void *new_block;
@@ -1923,16 +2003,16 @@ void *_test_realloc(void *ptr,
return NULL;
}
- block_info = (MallocBlockInfo*)(block - (MALLOC_GUARD_SIZE +
- sizeof(*block_info)));
+ block_info.ptr = block - (MALLOC_GUARD_SIZE +
+ sizeof(struct MallocBlockInfoData));
new_block = _test_malloc(size, file, line);
if (new_block == NULL) {
return NULL;
}
- if (block_info->size < size) {
- block_size = block_info->size;
+ if (block_info.data->size < size) {
+ block_size = block_info.data->size;
}
memcpy(new_block, ptr, block_size);
@@ -1952,26 +2032,27 @@ static const ListNode* check_point_allocated_blocks(void) {
/* Display the blocks allocated after the specified check point. This
* function returns the number of blocks displayed. */
-static int display_allocated_blocks(const ListNode * const check_point) {
+static size_t display_allocated_blocks(const ListNode * const check_point) {
const ListNode * const head = get_allocated_blocks_list();
const ListNode *node;
- int allocated_blocks = 0;
+ size_t allocated_blocks = 0;
assert_non_null(check_point);
assert_non_null(check_point->next);
for (node = check_point->next; node != head; node = node->next) {
- const MallocBlockInfo * const block_info =
- (const MallocBlockInfo*)node->value;
- assert_non_null(block_info);
+ const MallocBlockInfo block_info = {
+ .ptr = discard_const(node->value),
+ };
+ assert_non_null(block_info.ptr);
- if (!allocated_blocks) {
+ if (allocated_blocks == 0) {
cm_print_error("Blocks allocated...\n");
}
cm_print_error(SOURCE_LOCATION_FORMAT ": note: block %p allocated here\n",
- block_info->location.file,
- block_info->location.line,
- block_info->block);
- allocated_blocks ++;
+ block_info.data->location.file,
+ block_info.data->location.line,
+ block_info.data->block);
+ allocated_blocks++;
}
return allocated_blocks;
}
@@ -1987,9 +2068,13 @@ static void free_allocated_blocks(const ListNode * const check_point) {
assert_non_null(node);
while (node != head) {
- MallocBlockInfo * const block_info = (MallocBlockInfo*)node->value;
+ const MallocBlockInfo block_info = {
+ .ptr = discard_const(node->value),
+ };
node = node->next;
- free(discard_const_p(char, block_info) + sizeof(*block_info) + MALLOC_GUARD_SIZE);
+ free(discard_const_p(char, block_info.data) +
+ sizeof(struct MallocBlockInfoData) +
+ MALLOC_GUARD_SIZE);
}
}
@@ -1997,10 +2082,10 @@ static void free_allocated_blocks(const ListNode * const check_point) {
/* Fail if any any blocks are allocated after the specified check point. */
static void fail_if_blocks_allocated(const ListNode * const check_point,
const char * const test_name) {
- const int allocated_blocks = display_allocated_blocks(check_point);
- if (allocated_blocks) {
+ const size_t allocated_blocks = display_allocated_blocks(check_point);
+ if (allocated_blocks > 0) {
free_allocated_blocks(check_point);
- cm_print_error("ERROR: %s leaked %d block(s)\n", test_name,
+ cm_print_error("ERROR: %s leaked %zu block(s)\n", test_name,
allocated_blocks);
exit_test(1);
}
@@ -2515,6 +2600,11 @@ void cmocka_set_message_output(enum cm_message_output output)
global_msg_output = output;
}
+void cmocka_set_test_filter(const char *pattern)
+{
+ global_test_filter_pattern = pattern;
+}
+
/****************************************************************************
* TIME CALCULATIONS
****************************************************************************/
@@ -2800,7 +2890,15 @@ int _cmocka_run_group_tests(const char *group_name,
(tests[i].test_func != NULL
|| tests[i].setup_func != NULL
|| tests[i].teardown_func != NULL)) {
- cm_tests[i] = (struct CMUnitTestState) {
+ if (global_test_filter_pattern != NULL) {
+ int ok;
+
+ ok = c_strmatch(tests[i].name, global_test_filter_pattern);
+ if (!ok) {
+ continue;
+ }
+ }
+ cm_tests[total_tests] = (struct CMUnitTestState) {
.test = &tests[i],
.status = CM_TEST_NOT_STARTED,
.state = NULL,
@@ -2871,10 +2969,16 @@ int _cmocka_run_group_tests(const char *group_name,
break;
}
} else {
+ char err_msg[2048] = {0};
+
+ snprintf(err_msg, sizeof(err_msg),
+ "Could not run test: %s",
+ cmtest->error_message);
+
cmprintf(PRINTF_TEST_ERROR,
test_number,
cmtest->test->name,
- "Could not run the test - check test fixtures");
+ err_msg);
total_errors++;
}
}
@@ -3178,11 +3282,20 @@ int _run_group_tests(const UnitTest * const tests, const size_t number_of_tests)
size_t total_failed = 0;
/* Check point of the heap state. */
const ListNode * const check_point = check_point_allocated_blocks();
- const char** failed_names = (const char**)malloc(number_of_tests *
- sizeof(*failed_names));
+ const char **failed_names = NULL;
void **current_state = NULL;
TestState group_state;
+ if (number_of_tests == 0) {
+ return -1;
+ }
+
+ failed_names = (const char **)malloc(number_of_tests *
+ sizeof(*failed_names));
+ if (failed_names == NULL) {
+ return -2;
+ }
+
/* Find setup and teardown function */
for (i = 0; i < number_of_tests; i++) {
const UnitTest * const test = &tests[i];
diff --git a/src/cmocka.def b/src/cmocka.def
index 43228c4..393c6da 100644
--- a/src/cmocka.def
+++ b/src/cmocka.def
@@ -38,7 +38,9 @@ EXPORTS
_test_malloc
_test_realloc
_will_return
+ cm_print_error
cmocka_set_message_output
+ cmocka_set_test_filter
global_expect_assert_env
global_expecting_assert
global_last_failed_assert
diff --git a/tests/CMakeLists.txt b/tests/CMakeLists.txt
index b1380de..2833c9f 100644
--- a/tests/CMakeLists.txt
+++ b/tests/CMakeLists.txt
@@ -3,7 +3,7 @@ project(tests C)
include_directories(
${CMAKE_BINARY_DIR}
${CMAKE_CURRENT_SOURCE_DIR}
- ${CMAKE_SOURCE_DIR}/include
+ ${cmocka-headers_SOURCE_DIR}
)
set(CMOCKA_TESTS
@@ -18,14 +18,17 @@ set(CMOCKA_TESTS
test_exception_handler
test_basics
test_skip
+ test_strmatch
test_setup_fail
test_ordering
test_ordering_fail
test_returns
- test_returns_fail)
+ test_returns_fail
+ test_wildcard)
foreach(_CMOCKA_TEST ${CMOCKA_TESTS})
add_cmocka_test(${_CMOCKA_TEST} ${_CMOCKA_TEST}.c ${CMOCKA_STATIC_LIBRARY})
+ target_compile_options(${_CMOCKA_TEST} PRIVATE ${DEFAULT_C_COMPILE_FLAGS})
endforeach()
### Special Cases
@@ -33,6 +36,7 @@ if (${CMAKE_C_COMPILER_ID} MATCHES "(GNU|Clang)")
set_source_files_properties(test_cmockery.c PROPERTIES COMPILE_FLAGS "-Wno-deprecated-declarations")
endif()
add_cmocka_test(test_cmockery test_cmockery.c ${CMOCKA_STATIC_LIBRARY})
+target_compile_options(test_cmockery PRIVATE ${DEFAULT_C_COMPILE_FLAGS})
### Exceptions
@@ -80,7 +84,7 @@ else()
test_exception_handler
PROPERTIES
PASS_REGULAR_EXPRESSION
- "Test failed with exception: (Segmentation fault|Segmentation Fault|11)"
+ "Test failed with exception: (Segmentation fault|Segmentation Fault|11|Illegal instruction)"
)
endif (WIN32)
@@ -171,7 +175,7 @@ set(test_groups_tap_out
set(test_skip_tap_out
"not ok 1 # SKIP")
set(test_setup_fail_tap_out
- "not ok 1 - int_test_ignored Could not run the test - check test fixtures")
+ "not ok 1 - int_test_ignored Could not run test: Test setup failed")
set(test_basics_subunit_out
"^test: null_test_success"
@@ -185,7 +189,7 @@ set(test_skip_subunit_out
"^test: test_check_skip"
"skip: test_check_skip")
set(test_setup_fail_subunit_out
- "error: int_test_ignored \\[ Could not run the test - check test fixtures \\]")
+ "error: int_test_ignored \\[ Could not run test: Test setup failed \\]")
set(test_basics_xml_out
"<testsuite name=\"tests\" time=\"[0-9.]+\" tests=\"2\" failures=\"0\" errors=\"0\" skipped=\"0\" >"
diff --git a/tests/cmocka_test.cmake b/tests/cmocka_test.cmake
new file mode 100644
index 0000000..53ffcca
--- /dev/null
+++ b/tests/cmocka_test.cmake
@@ -0,0 +1,229 @@
+#
+# CTEST SCRIPT FOR CMOCKA TESTING
+#
+
+#
+# Running this script:
+#
+# ctest -S tests/cmocka_test.cmake \
+# -DCTEST_MODEL="Nightly"
+# -DCTEST_SITE="host.cmocka.org" \
+# -DCTEST_TARGET_SYSTEM="Linux-openSUSE_Tumbleweed-x86_64"
+#
+# The Target system describes the target OS, version, architecture, etc. This
+# parameter allows the testing script to choose appropriate configuration for
+# CMake and build tools.
+#
+# The set of supported targets is defined by the project.
+#
+# The generic format for the Target system is <KIND>[-<NAME>][-<ARCH>], where
+#
+# <KIND> is one of Linux, Windows, MacOS, Android.
+# <NAME> is an optional OS name and version, for example Fedora-28, Win10.
+# <ARCH> is an optional architecture description, for example x86_64, ARM, ARM-Tegra5.
+#
+# To enable coverage, set:
+# -DCTEST_WITH_COVERAGE=TRUE
+#
+# To enable dynamic analysis, set:
+# -DCTEST_WITH_DYNAMIC_ANALYSIS=TRUE
+#
+
+#
+# 0. Set defaults
+#
+set(PROJECT_NAME "cmocka")
+set(PROJECT_GIT_URL "https://git.cryptomilk.org/projects/cmocka.git")
+
+#
+# 1. Include CText Ext module
+#
+if(NOT CTEST_EXT_INCLUDED)
+ function(download_ctest_ext)
+ message("Download latest version of CTest Extension module")
+
+ find_package(Git QUIET)
+
+ set(repo_url "https://github.com/jet47/ctest-ext.git")
+ set(repo_dir "${CMAKE_CURRENT_LIST_DIR}/ctest-ext")
+ set(tmp_dir "${CMAKE_CURRENT_LIST_DIR}/ctest-ext-tmp")
+
+ if(NOT EXISTS "${repo_dir}")
+ set(CTEST_CHECKOUT_COMMAND "${GIT_EXECUTABLE} clone ${repo_url} ${repo_dir}")
+ endif()
+ set(CTEST_UPDATE_COMMAND "${GIT_EXECUTABLE}")
+
+ ctest_start("CTestExt" "${repo_dir}" "${tmp_dir}")
+ ctest_update(SOURCE "${repo_dir}")
+
+ file(REMOVE_RECURSE "${tmp_dir}")
+
+ set(CTEST_EXT_MODULE_PATH "${repo_dir}" PARENT_SCOPE)
+ endfunction()
+
+ if(NOT DEFINED CTEST_EXT_MODULE_PATH)
+ if(DEFINED ENV{CTEST_EXT_MODULE_PATH} AND EXISTS "$ENV{CTEST_EXT_MODULE_PATH}/ctest_ext.cmake")
+ set(CTEST_EXT_MODULE_PATH "$ENV{CTEST_EXT_MODULE_PATH}")
+ elseif(EXISTS "${CMAKE_CURRENT_LIST_DIR}/ctest-ext/ctest_ext.cmake")
+ set(CTEST_EXT_MODULE_PATH "${CMAKE_CURRENT_LIST_DIR}/ctest-ext")
+ else()
+ download_ctest_ext()
+ endif()
+ endif()
+
+ include("${CTEST_EXT_MODULE_PATH}/ctest_ext.cmake")
+endif()
+
+#
+# 2. Initialize CTest Ext module
+#
+set_ifndef(CTEST_PROJECT_NAME ${PROJECT_NAME})
+
+set_ifndef(CTEST_PROJECT_GIT_URL ${PROJECT_GIT_URL})
+set_ifndef(CTEST_WITH_UPDATE TRUE)
+
+ctest_ext_init()
+
+#
+# 3. Configure project for testing
+#
+
+# Check supported targets and models
+check_if_matches(CTEST_TARGET_SYSTEM "^Linux" "^Windows")
+check_if_matches(CTEST_MODEL "^Experimental$" "^Nightly$" "^Continuous$" "^Release$" "^Documentation$")
+
+# Checks for Continuous model
+set(IS_CONTINUOUS FALSE)
+if(CTEST_MODEL MATCHES "Continuous")
+ set(IS_CONTINUOUS TRUE)
+endif()
+
+set(IS_BINARY_EMPTY FALSE)
+if(NOT EXISTS "${CTEST_BINARY_DIRECTORY}/CMakeCache.txt")
+ set(IS_BINARY_EMPTY TRUE)
+endif()
+
+if(IS_CONTINUOUS AND NOT IS_BINARY_EMPTY AND NOT HAVE_UPDATES)
+ ctest_ext_info("Continuous model : no updates")
+ return()
+endif()
+
+# Configure the testing model
+set_ifndef(CTEST_WITH_SUBMIT TRUE)
+
+if(CTEST_MODEL MATCHES "Documentation")
+ set_ifndef(CTEST_WITH_TESTS FALSE)
+else()
+ set_ifndef(CTEST_WITH_TESTS TRUE)
+endif()
+
+
+set_ifndef(CTEST_WITH_COVERAGE FALSE)
+if (CTEST_WITH_COVERAGE)
+ set_ifndef(CTEST_COVERAGE_TOOL "CDASH")
+endif()
+
+set_ifndef(CTEST_WITH_DYNAMIC_ANALYSIS FALSE)
+if (CTEST_WITH_DYNAMIC_ANALYSIS)
+ set_ifndef(CTEST_DYNAMIC_ANALYSIS_TOOL "CDASH")
+endif()
+
+
+if(CTEST_MODEL MATCHES "Continuous")
+ set_ifndef(CTEST_EMPTY_BINARY_DIRECTORY FALSE)
+else()
+ set_ifndef(CTEST_EMPTY_BINARY_DIRECTORY TRUE)
+endif()
+
+# Set CMake options
+if(CTEST_TARGET_SYSTEM MATCHES "Windows")
+ if(CTEST_TARGET_SYSTEM MATCHES "64")
+ set_ifndef(CTEST_CMAKE_GENERATOR "Visual Studio 13 Win64")
+ else()
+ set_ifndef(CTEST_CMAKE_GENERATOR "Visual Studio 13")
+ endif()
+else()
+ set_ifndef(CTEST_CMAKE_GENERATOR "Unix Makefiles")
+endif()
+
+if(CTEST_MODEL MATCHES "(Release|Continuous)")
+ set_ifndef(CTEST_CONFIGURATION_TYPE "Release")
+else()
+ set_ifndef(CTEST_CONFIGURATION_TYPE "Debug")
+endif()
+
+### Add project default build options here !!!
+
+add_cmake_cache_entry(UNIT_TESTING ON)
+add_cmake_cache_entry(WITH_CMOCKERY_SUPPORT ON)
+
+### Add project default build options here ^^^
+
+add_cmake_cache_entry("ENABLE_CTEST" TYPE "BOOL" "ON")
+
+if(CTEST_WITH_COVERAGE)
+ add_cmake_cache_entry("ENABLE_COVERAGE" TYPE "BOOL" "ON")
+else()
+ add_cmake_cache_entry("ENABLE_COVERAGE" TYPE "BOOL" "OFF")
+endif()
+
+if(CTEST_MODEL MATCHES "Documentation")
+ add_cmake_cache_entry("BUILD_DOCS" TYPE "BOOL" "ON")
+endif()
+
+if(CTEST_MODEL MATCHES "Release")
+ if(CTEST_TARGET_SYSTEM MATCHES "Windows")
+ add_cmake_cache_entry("CPACK_GENERATOR" TYPE "STRING" "ZIP")
+ else()
+ add_cmake_cache_entry("CPACK_GENERATOR" TYPE "STRING" "TGZ")
+ endif()
+endif()
+
+#
+# 4. Start testing, configure and build project
+#
+ctest_ext_start()
+
+ctest_ext_configure()
+
+if(CTEST_MODEL MATCHES "Release")
+ ctest_ext_build(TARGETS "ALL" "package")
+elseif(CTEST_MODEL MATCHES "Documentation")
+ ctest_ext_build(TARGET "docs")
+else()
+ ctest_ext_build()
+endif()
+
+#
+# 5. Run tests
+#
+if(CTEST_MODEL MATCHES "Nightly")
+ ctest_ext_test(INCLUDE_LABEL "Full")
+else()
+ ctest_ext_test(EXCLUDE_LABEL "Light")
+endif()
+
+ctest_ext_coverage(
+ CDASH
+ LABELS "Module"
+)
+
+ctest_ext_dynamic_analysis(
+ CDASH
+ INCLUDE_LABEL "Light"
+)
+
+#
+# 6. Submit results to remote server
+#
+if(CTEST_MODEL MATCHES "Release")
+ if(CTEST_TARGET_SYSTEM MATCHES "Windows")
+ file(GLOB packages "${CTEST_BINARY_DIRECTORY}/*.zip")
+ else()
+ file(GLOB packages "${CTEST_BINARY_DIRECTORY}/*.tar.gz")
+ endif()
+
+ list(APPEND CTEST_UPLOAD_FILES ${packages})
+endif()
+
+ctest_ext_submit()
diff --git a/tests/test_exception_handler.c b/tests/test_exception_handler.c
index 3f7c181..5652095 100644
--- a/tests/test_exception_handler.c
+++ b/tests/test_exception_handler.c
@@ -19,11 +19,26 @@ static void test_segfault_recovery(void **state)
s->x = 1;
}
+static void test_segfault_recovery1(void **state)
+{
+ test_segfault_recovery(state);
+}
+
+static void test_segfault_recovery2(void **state)
+{
+ test_segfault_recovery(state);
+}
+
+static void test_segfault_recovery3(void **state)
+{
+ test_segfault_recovery(state);
+}
+
int main(void) {
const struct CMUnitTest tests[] = {
- cmocka_unit_test(test_segfault_recovery),
- cmocka_unit_test(test_segfault_recovery),
- cmocka_unit_test(test_segfault_recovery),
+ cmocka_unit_test(test_segfault_recovery1),
+ cmocka_unit_test(test_segfault_recovery2),
+ cmocka_unit_test(test_segfault_recovery3),
};
return cmocka_run_group_tests(tests, NULL, NULL);
diff --git a/tests/test_strmatch.c b/tests/test_strmatch.c
new file mode 100644
index 0000000..f2d966b
--- /dev/null
+++ b/tests/test_strmatch.c
@@ -0,0 +1,99 @@
+/*
+ * Copyright 2018 Andreas Schneider <asn@cryptomilk.org>
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+#include "config.h"
+
+#include <stdarg.h>
+#include <stddef.h>
+#include <setjmp.h>
+#include <cmocka.h>
+
+#include "../src/cmocka.c"
+
+static void test_strmatch_null(void **state)
+{
+ int rc;
+
+ (void)state;
+
+ rc = c_strmatch(NULL, NULL);
+ assert_int_equal(rc, 0);
+
+ rc = c_strmatch("", NULL);
+ assert_int_equal(rc, 0);
+
+ rc = c_strmatch(NULL, "");
+ assert_int_equal(rc, 0);
+}
+
+static void test_strmatch_empty(void **state)
+{
+ int rc;
+
+ (void)state;
+
+ rc = c_strmatch("", "");
+ assert_int_equal(rc, 1);
+
+ rc = c_strmatch("wurst", "");
+ assert_int_equal(rc, 0);
+
+ rc = c_strmatch("", "wurst");
+ assert_int_equal(rc, 0);
+}
+
+static void test_strmatch_single(void **state)
+{
+ int rc;
+
+ (void)state;
+
+ rc = c_strmatch("wurst", "wurs?");
+ assert_int_equal(rc, 1);
+
+ rc = c_strmatch("wurst", "w?rs?");
+ assert_int_equal(rc, 1);
+
+ rc = c_strmatch("wurst", "wur?");
+ assert_int_equal(rc, 0);
+}
+
+static void test_strmatch_wildcard(void **state)
+{
+ int rc;
+
+ (void)state;
+
+ rc = c_strmatch("wurst", "wurst*");
+ assert_int_equal(rc, 1);
+
+ rc = c_strmatch("wurstbrot", "wurst*");
+ assert_int_equal(rc, 1);
+
+ rc = c_strmatch("wurstbrot", "w*t");
+ assert_int_equal(rc, 1);
+}
+
+int main(void) {
+ const struct CMUnitTest tests[] = {
+ cmocka_unit_test(test_strmatch_null),
+ cmocka_unit_test(test_strmatch_empty),
+ cmocka_unit_test(test_strmatch_single),
+ cmocka_unit_test(test_strmatch_wildcard),
+ };
+
+ return cmocka_run_group_tests(tests, NULL, NULL);
+}
diff --git a/tests/test_wildcard.c b/tests/test_wildcard.c
new file mode 100644
index 0000000..10ee195
--- /dev/null
+++ b/tests/test_wildcard.c
@@ -0,0 +1,53 @@
+/*
+ * Copyright 2018 Andreas Schneider <asn@cryptomilk.org>
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+#include <stdarg.h>
+#include <stddef.h>
+#include <setjmp.h>
+#include <cmocka.h>
+
+static void test_ok1(void **state)
+{
+ (void)state;
+
+ assert_true(1);
+}
+
+static void test_ok2(void **state)
+{
+ (void)state;
+
+ assert_true(1);
+}
+
+static void test_fail(void **state)
+{
+ (void)state;
+
+ assert_false(1);
+}
+
+int main(void) {
+ const struct CMUnitTest tests[] = {
+ cmocka_unit_test(test_ok1),
+ cmocka_unit_test(test_ok2),
+ cmocka_unit_test(test_fail),
+ };
+
+ cmocka_set_test_filter("test_ok*");
+
+ return cmocka_run_group_tests(tests, NULL, NULL);
+}