fix for C++17, requires at least C+17

This commit is contained in:
Marc Wäckerlin
2018-11-21 22:23:14 +00:00
parent 99b12cb4d9
commit b7b5c2d3ff
11 changed files with 1761 additions and 619 deletions

View File

@@ -1,3 +1,70 @@
2018-10-23 21:21
* [r126] build-in-docker.sh, mac-create-app-bundle.sh,
resolve-rpmbuilddeps.sh:
update buildsystem
2018-09-19 11:22
* [r125] build-in-docker.sh:
fixed for build with centos / yum
2018-09-19 08:21
* [r124] build-in-docker.sh:
fixed for build with opensuse tumbleweed and leap - and fedora,
centos, mageia
2018-09-18 14:50
* [r123] build-in-docker.conf, build-in-docker.sh:
fixed for build with opensuse tumbleweed and leap
2018-09-17 13:08
* [r122] INSTALL, build-in-docker.sh:
support opensuse tumbleweed
2018-09-11 10:12
* [r121] INSTALL, ax_init_standard_project.m4, build-in-docker.sh:
fix installation check after package build
2018-09-10 21:28
* [r120] ax_init_standard_project.m4, build-in-docker.sh:
add check whether built package can be installed
2018-09-10 11:26
* [r119] ax_check_qt.m4, ax_init_standard_project.m4, bootstrap.sh,
build-in-docker.sh, debian/control.in, mac-create-app-bundle.sh:
fixed dependency-bug in ubuntu cosmic and stretch
2018-07-16 13:53
* [r118] INSTALL, ax_check_qt.m4, ax_init_standard_project.m4,
build-in-docker.sh, mac-create-app-bundle.sh:
fix build for buster
2018-07-05 08:26
* [r117] INSTALL, bootstrap.sh, build-in-docker.sh,
libxml-cxx.spec.in:
fixed rpm build for all distros
2018-06-22 14:45
* [r116] bootstrap.sh, libxml-cxx.spec.in, resolve-rpmbuilddeps.sh:
fixed rpm build
2018-06-20 13:05
* [r115] ChangeLog, ax_init_standard_project.m4,
build-in-docker.sh, mac-create-app-bundle.sh,
resolve-debbuilddeps.sh:
fixed build for mageia
2018-04-04 19:45 2018-04-04 19:45
* [r114] ChangeLog, bootstrap.sh, build-in-docker.sh: * [r114] ChangeLog, bootstrap.sh, build-in-docker.sh:

3
NEWS
View File

@@ -0,0 +1,3 @@
2018-11-21
Updated for use in C++17 compiler. This breaks compatibility to older C++.

948
ax_cxx_compile_stdcxx.m4 Normal file
View File

@@ -0,0 +1,948 @@
# ===========================================================================
# https://www.gnu.org/software/autoconf-archive/ax_cxx_compile_stdcxx.html
# ===========================================================================
#
# SYNOPSIS
#
# AX_CXX_COMPILE_STDCXX(VERSION, [ext|noext], [mandatory|optional])
#
# DESCRIPTION
#
# Check for baseline language coverage in the compiler for the specified
# version of the C++ standard. If necessary, add switches to CXX and
# CXXCPP to enable support. VERSION may be '11' (for the C++11 standard)
# or '14' (for the C++14 standard).
#
# The second argument, if specified, indicates whether you insist on an
# extended mode (e.g. -std=gnu++11) or a strict conformance mode (e.g.
# -std=c++11). If neither is specified, you get whatever works, with
# preference for an extended mode.
#
# The third argument, if specified 'mandatory' or if left unspecified,
# indicates that baseline support for the specified C++ standard is
# required and that the macro should error out if no mode with that
# support is found. If specified 'optional', then configuration proceeds
# regardless, after defining HAVE_CXX${VERSION} if and only if a
# supporting mode is found.
#
# LICENSE
#
# Copyright (c) 2008 Benjamin Kosnik <bkoz@redhat.com>
# Copyright (c) 2012 Zack Weinberg <zackw@panix.com>
# Copyright (c) 2013 Roy Stogner <roystgnr@ices.utexas.edu>
# Copyright (c) 2014, 2015 Google Inc.; contributed by Alexey Sokolov <sokolov@google.com>
# Copyright (c) 2015 Paul Norman <penorman@mac.com>
# Copyright (c) 2015 Moritz Klammler <moritz@klammler.eu>
# Copyright (c) 2016, 2018 Krzesimir Nowak <qdlacz@gmail.com>
#
# Copying and distribution of this file, with or without modification, are
# permitted in any medium without royalty provided the copyright notice
# and this notice are preserved. This file is offered as-is, without any
# warranty.
#serial 10
dnl This macro is based on the code from the AX_CXX_COMPILE_STDCXX_11 macro
dnl (serial version number 13).
AC_DEFUN([AX_CXX_COMPILE_STDCXX], [dnl
m4_if([$1], [11], [ax_cxx_compile_alternatives="11 0x"],
[$1], [14], [ax_cxx_compile_alternatives="14 1y"],
[$1], [17], [ax_cxx_compile_alternatives="17 1z"],
[m4_fatal([invalid first argument `$1' to AX_CXX_COMPILE_STDCXX])])dnl
m4_if([$2], [], [],
[$2], [ext], [],
[$2], [noext], [],
[m4_fatal([invalid second argument `$2' to AX_CXX_COMPILE_STDCXX])])dnl
m4_if([$3], [], [ax_cxx_compile_cxx$1_required=true],
[$3], [mandatory], [ax_cxx_compile_cxx$1_required=true],
[$3], [optional], [ax_cxx_compile_cxx$1_required=false],
[m4_fatal([invalid third argument `$3' to AX_CXX_COMPILE_STDCXX])])
AC_LANG_PUSH([C++])dnl
ac_success=no
m4_if([$2], [noext], [], [dnl
if test x$ac_success = xno; then
for alternative in ${ax_cxx_compile_alternatives}; do
switch="-std=gnu++${alternative}"
cachevar=AS_TR_SH([ax_cv_cxx_compile_cxx$1_$switch])
AC_CACHE_CHECK(whether $CXX supports C++$1 features with $switch,
$cachevar,
[ac_save_CXX="$CXX"
CXX="$CXX $switch"
AC_COMPILE_IFELSE([AC_LANG_SOURCE([_AX_CXX_COMPILE_STDCXX_testbody_$1])],
[eval $cachevar=yes],
[eval $cachevar=no])
CXX="$ac_save_CXX"])
if eval test x\$$cachevar = xyes; then
CXX="$CXX $switch"
if test -n "$CXXCPP" ; then
CXXCPP="$CXXCPP $switch"
fi
ac_success=yes
break
fi
done
fi])
m4_if([$2], [ext], [], [dnl
if test x$ac_success = xno; then
dnl HP's aCC needs +std=c++11 according to:
dnl http://h21007.www2.hp.com/portal/download/files/unprot/aCxx/PDF_Release_Notes/769149-001.pdf
dnl Cray's crayCC needs "-h std=c++11"
for alternative in ${ax_cxx_compile_alternatives}; do
for switch in -std=c++${alternative} +std=c++${alternative} "-h std=c++${alternative}"; do
cachevar=AS_TR_SH([ax_cv_cxx_compile_cxx$1_$switch])
AC_CACHE_CHECK(whether $CXX supports C++$1 features with $switch,
$cachevar,
[ac_save_CXX="$CXX"
CXX="$CXX $switch"
AC_COMPILE_IFELSE([AC_LANG_SOURCE([_AX_CXX_COMPILE_STDCXX_testbody_$1])],
[eval $cachevar=yes],
[eval $cachevar=no])
CXX="$ac_save_CXX"])
if eval test x\$$cachevar = xyes; then
CXX="$CXX $switch"
if test -n "$CXXCPP" ; then
CXXCPP="$CXXCPP $switch"
fi
ac_success=yes
break
fi
done
if test x$ac_success = xyes; then
break
fi
done
fi])
AC_LANG_POP([C++])
if test x$ax_cxx_compile_cxx$1_required = xtrue; then
if test x$ac_success = xno; then
AC_MSG_ERROR([*** A compiler with support for C++$1 language features is required.])
fi
fi
if test x$ac_success = xno; then
HAVE_CXX$1=0
AC_MSG_NOTICE([No compiler with C++$1 support was found])
else
HAVE_CXX$1=1
AC_DEFINE(HAVE_CXX$1,1,
[define if the compiler supports basic C++$1 syntax])
fi
AC_SUBST(HAVE_CXX$1)
])
dnl Test body for checking C++11 support
m4_define([_AX_CXX_COMPILE_STDCXX_testbody_11],
_AX_CXX_COMPILE_STDCXX_testbody_new_in_11
)
dnl Test body for checking C++14 support
m4_define([_AX_CXX_COMPILE_STDCXX_testbody_14],
_AX_CXX_COMPILE_STDCXX_testbody_new_in_11
_AX_CXX_COMPILE_STDCXX_testbody_new_in_14
)
m4_define([_AX_CXX_COMPILE_STDCXX_testbody_17],
_AX_CXX_COMPILE_STDCXX_testbody_new_in_11
_AX_CXX_COMPILE_STDCXX_testbody_new_in_14
_AX_CXX_COMPILE_STDCXX_testbody_new_in_17
)
dnl Tests for new features in C++11
m4_define([_AX_CXX_COMPILE_STDCXX_testbody_new_in_11], [[
// If the compiler admits that it is not ready for C++11, why torture it?
// Hopefully, this will speed up the test.
#ifndef __cplusplus
#error "This is not a C++ compiler"
#elif __cplusplus < 201103L
#error "This is not a C++11 compiler"
#else
namespace cxx11
{
namespace test_static_assert
{
template <typename T>
struct check
{
static_assert(sizeof(int) <= sizeof(T), "not big enough");
};
}
namespace test_final_override
{
struct Base
{
virtual void f() {}
};
struct Derived : public Base
{
virtual void f() override {}
};
}
namespace test_double_right_angle_brackets
{
template < typename T >
struct check {};
typedef check<void> single_type;
typedef check<check<void>> double_type;
typedef check<check<check<void>>> triple_type;
typedef check<check<check<check<void>>>> quadruple_type;
}
namespace test_decltype
{
int
f()
{
int a = 1;
decltype(a) b = 2;
return a + b;
}
}
namespace test_type_deduction
{
template < typename T1, typename T2 >
struct is_same
{
static const bool value = false;
};
template < typename T >
struct is_same<T, T>
{
static const bool value = true;
};
template < typename T1, typename T2 >
auto
add(T1 a1, T2 a2) -> decltype(a1 + a2)
{
return a1 + a2;
}
int
test(const int c, volatile int v)
{
static_assert(is_same<int, decltype(0)>::value == true, "");
static_assert(is_same<int, decltype(c)>::value == false, "");
static_assert(is_same<int, decltype(v)>::value == false, "");
auto ac = c;
auto av = v;
auto sumi = ac + av + 'x';
auto sumf = ac + av + 1.0;
static_assert(is_same<int, decltype(ac)>::value == true, "");
static_assert(is_same<int, decltype(av)>::value == true, "");
static_assert(is_same<int, decltype(sumi)>::value == true, "");
static_assert(is_same<int, decltype(sumf)>::value == false, "");
static_assert(is_same<int, decltype(add(c, v))>::value == true, "");
return (sumf > 0.0) ? sumi : add(c, v);
}
}
namespace test_noexcept
{
int f() { return 0; }
int g() noexcept { return 0; }
static_assert(noexcept(f()) == false, "");
static_assert(noexcept(g()) == true, "");
}
namespace test_constexpr
{
template < typename CharT >
unsigned long constexpr
strlen_c_r(const CharT *const s, const unsigned long acc) noexcept
{
return *s ? strlen_c_r(s + 1, acc + 1) : acc;
}
template < typename CharT >
unsigned long constexpr
strlen_c(const CharT *const s) noexcept
{
return strlen_c_r(s, 0UL);
}
static_assert(strlen_c("") == 0UL, "");
static_assert(strlen_c("1") == 1UL, "");
static_assert(strlen_c("example") == 7UL, "");
static_assert(strlen_c("another\0example") == 7UL, "");
}
namespace test_rvalue_references
{
template < int N >
struct answer
{
static constexpr int value = N;
};
answer<1> f(int&) { return answer<1>(); }
answer<2> f(const int&) { return answer<2>(); }
answer<3> f(int&&) { return answer<3>(); }
void
test()
{
int i = 0;
const int c = 0;
static_assert(decltype(f(i))::value == 1, "");
static_assert(decltype(f(c))::value == 2, "");
static_assert(decltype(f(0))::value == 3, "");
}
}
namespace test_uniform_initialization
{
struct test
{
static const int zero {};
static const int one {1};
};
static_assert(test::zero == 0, "");
static_assert(test::one == 1, "");
}
namespace test_lambdas
{
void
test1()
{
auto lambda1 = [](){};
auto lambda2 = lambda1;
lambda1();
lambda2();
}
int
test2()
{
auto a = [](int i, int j){ return i + j; }(1, 2);
auto b = []() -> int { return '0'; }();
auto c = [=](){ return a + b; }();
auto d = [&](){ return c; }();
auto e = [a, &b](int x) mutable {
const auto identity = [](int y){ return y; };
for (auto i = 0; i < a; ++i)
a += b--;
return x + identity(a + b);
}(0);
return a + b + c + d + e;
}
int
test3()
{
const auto nullary = [](){ return 0; };
const auto unary = [](int x){ return x; };
using nullary_t = decltype(nullary);
using unary_t = decltype(unary);
const auto higher1st = [](nullary_t f){ return f(); };
const auto higher2nd = [unary](nullary_t f1){
return [unary, f1](unary_t f2){ return f2(unary(f1())); };
};
return higher1st(nullary) + higher2nd(nullary)(unary);
}
}
namespace test_variadic_templates
{
template <int...>
struct sum;
template <int N0, int... N1toN>
struct sum<N0, N1toN...>
{
static constexpr auto value = N0 + sum<N1toN...>::value;
};
template <>
struct sum<>
{
static constexpr auto value = 0;
};
static_assert(sum<>::value == 0, "");
static_assert(sum<1>::value == 1, "");
static_assert(sum<23>::value == 23, "");
static_assert(sum<1, 2>::value == 3, "");
static_assert(sum<5, 5, 11>::value == 21, "");
static_assert(sum<2, 3, 5, 7, 11, 13>::value == 41, "");
}
// http://stackoverflow.com/questions/13728184/template-aliases-and-sfinae
// Clang 3.1 fails with headers of libstd++ 4.8.3 when using std::function
// because of this.
namespace test_template_alias_sfinae
{
struct foo {};
template<typename T>
using member = typename T::member_type;
template<typename T>
void func(...) {}
template<typename T>
void func(member<T>*) {}
void test();
void test() { func<foo>(0); }
}
} // namespace cxx11
#endif // __cplusplus >= 201103L
]])
dnl Tests for new features in C++14
m4_define([_AX_CXX_COMPILE_STDCXX_testbody_new_in_14], [[
// If the compiler admits that it is not ready for C++14, why torture it?
// Hopefully, this will speed up the test.
#ifndef __cplusplus
#error "This is not a C++ compiler"
#elif __cplusplus < 201402L
#error "This is not a C++14 compiler"
#else
namespace cxx14
{
namespace test_polymorphic_lambdas
{
int
test()
{
const auto lambda = [](auto&&... args){
const auto istiny = [](auto x){
return (sizeof(x) == 1UL) ? 1 : 0;
};
const int aretiny[] = { istiny(args)... };
return aretiny[0];
};
return lambda(1, 1L, 1.0f, '1');
}
}
namespace test_binary_literals
{
constexpr auto ivii = 0b0000000000101010;
static_assert(ivii == 42, "wrong value");
}
namespace test_generalized_constexpr
{
template < typename CharT >
constexpr unsigned long
strlen_c(const CharT *const s) noexcept
{
auto length = 0UL;
for (auto p = s; *p; ++p)
++length;
return length;
}
static_assert(strlen_c("") == 0UL, "");
static_assert(strlen_c("x") == 1UL, "");
static_assert(strlen_c("test") == 4UL, "");
static_assert(strlen_c("another\0test") == 7UL, "");
}
namespace test_lambda_init_capture
{
int
test()
{
auto x = 0;
const auto lambda1 = [a = x](int b){ return a + b; };
const auto lambda2 = [a = lambda1(x)](){ return a; };
return lambda2();
}
}
namespace test_digit_separators
{
constexpr auto ten_million = 100'000'000;
static_assert(ten_million == 100000000, "");
}
namespace test_return_type_deduction
{
auto f(int& x) { return x; }
decltype(auto) g(int& x) { return x; }
template < typename T1, typename T2 >
struct is_same
{
static constexpr auto value = false;
};
template < typename T >
struct is_same<T, T>
{
static constexpr auto value = true;
};
int
test()
{
auto x = 0;
static_assert(is_same<int, decltype(f(x))>::value, "");
static_assert(is_same<int&, decltype(g(x))>::value, "");
return x;
}
}
} // namespace cxx14
#endif // __cplusplus >= 201402L
]])
dnl Tests for new features in C++17
m4_define([_AX_CXX_COMPILE_STDCXX_testbody_new_in_17], [[
// If the compiler admits that it is not ready for C++17, why torture it?
// Hopefully, this will speed up the test.
#ifndef __cplusplus
#error "This is not a C++ compiler"
#elif __cplusplus < 201703L
#error "This is not a C++17 compiler"
#else
#include <initializer_list>
#include <utility>
#include <type_traits>
namespace cxx17
{
namespace test_constexpr_lambdas
{
constexpr int foo = [](){return 42;}();
}
namespace test::nested_namespace::definitions
{
}
namespace test_fold_expression
{
template<typename... Args>
int multiply(Args... args)
{
return (args * ... * 1);
}
template<typename... Args>
bool all(Args... args)
{
return (args && ...);
}
}
namespace test_extended_static_assert
{
static_assert (true);
}
namespace test_auto_brace_init_list
{
auto foo = {5};
auto bar {5};
static_assert(std::is_same<std::initializer_list<int>, decltype(foo)>::value);
static_assert(std::is_same<int, decltype(bar)>::value);
}
namespace test_typename_in_template_template_parameter
{
template<template<typename> typename X> struct D;
}
namespace test_fallthrough_nodiscard_maybe_unused_attributes
{
int f1()
{
return 42;
}
[[nodiscard]] int f2()
{
[[maybe_unused]] auto unused = f1();
switch (f1())
{
case 17:
f1();
[[fallthrough]];
case 42:
f1();
}
return f1();
}
}
namespace test_extended_aggregate_initialization
{
struct base1
{
int b1, b2 = 42;
};
struct base2
{
base2() {
b3 = 42;
}
int b3;
};
struct derived : base1, base2
{
int d;
};
derived d1 {{1, 2}, {}, 4}; // full initialization
derived d2 {{}, {}, 4}; // value-initialized bases
}
namespace test_general_range_based_for_loop
{
struct iter
{
int i;
int& operator* ()
{
return i;
}
const int& operator* () const
{
return i;
}
iter& operator++()
{
++i;
return *this;
}
};
struct sentinel
{
int i;
};
bool operator== (const iter& i, const sentinel& s)
{
return i.i == s.i;
}
bool operator!= (const iter& i, const sentinel& s)
{
return !(i == s);
}
struct range
{
iter begin() const
{
return {0};
}
sentinel end() const
{
return {5};
}
};
void f()
{
range r {};
for (auto i : r)
{
[[maybe_unused]] auto v = i;
}
}
}
namespace test_lambda_capture_asterisk_this_by_value
{
struct t
{
int i;
int foo()
{
return [*this]()
{
return i;
}();
}
};
}
namespace test_enum_class_construction
{
enum class byte : unsigned char
{};
byte foo {42};
}
namespace test_constexpr_if
{
template <bool cond>
int f ()
{
if constexpr(cond)
{
return 13;
}
else
{
return 42;
}
}
}
namespace test_selection_statement_with_initializer
{
int f()
{
return 13;
}
int f2()
{
if (auto i = f(); i > 0)
{
return 3;
}
switch (auto i = f(); i + 4)
{
case 17:
return 2;
default:
return 1;
}
}
}
namespace test_template_argument_deduction_for_class_templates
{
template <typename T1, typename T2>
struct pair
{
pair (T1 p1, T2 p2)
: m1 {p1},
m2 {p2}
{}
T1 m1;
T2 m2;
};
void f()
{
[[maybe_unused]] auto p = pair{13, 42u};
}
}
namespace test_non_type_auto_template_parameters
{
template <auto n>
struct B
{};
B<5> b1;
B<'a'> b2;
}
namespace test_structured_bindings
{
int arr[2] = { 1, 2 };
std::pair<int, int> pr = { 1, 2 };
auto f1() -> int(&)[2]
{
return arr;
}
auto f2() -> std::pair<int, int>&
{
return pr;
}
struct S
{
int x1 : 2;
volatile double y1;
};
S f3()
{
return {};
}
auto [ x1, y1 ] = f1();
auto& [ xr1, yr1 ] = f1();
auto [ x2, y2 ] = f2();
auto& [ xr2, yr2 ] = f2();
const auto [ x3, y3 ] = f3();
}
namespace test_exception_spec_type_system
{
struct Good {};
struct Bad {};
void g1() noexcept;
void g2();
template<typename T>
Bad
f(T*, T*);
template<typename T1, typename T2>
Good
f(T1*, T2*);
static_assert (std::is_same_v<Good, decltype(f(g1, g2))>);
}
namespace test_inline_variables
{
template<class T> void f(T)
{}
template<class T> inline T g(T)
{
return T{};
}
template<> inline void f<>(int)
{}
template<> int g<>(int)
{
return 5;
}
}
} // namespace cxx17
#endif // __cplusplus < 201703L
]])

View File

@@ -170,9 +170,11 @@ AC_DEFUN([AX_INIT_STANDARD_PROJECT], [
AX_SUBST(NUMBERS) AX_SUBST(NUMBERS)
AX_SUBST(HOME) AX_SUBST(HOME)
if test -f README.md; then if test -f README.md; then
README_FILE=README.md
README=$(tail -n +3 README.md) README=$(tail -n +3 README.md)
DESCRIPTION=$(head -1 README.md | sed 's,^#\+ *,,;s, *#\+$,,') DESCRIPTION=$(head -1 README.md | sed 's,^#\+ *,,;s, *#\+$,,')
else else
README_FILE=README
README=$(tail -n +3 README) README=$(tail -n +3 README)
DESCRIPTION=$(head -1 README) DESCRIPTION=$(head -1 README)
fi fi
@@ -182,6 +184,7 @@ AC_DEFUN([AX_INIT_STANDARD_PROJECT], [
else else
README_HTML="${README}" README_HTML="${README}"
fi fi
AX_SUBST(README_FILE)
AX_SUBST(README) AX_SUBST(README)
_AM_SUBST_NOTMAKE([README]) _AM_SUBST_NOTMAKE([README])
AX_SUBST(README_ESCAPED) AX_SUBST(README_ESCAPED)
@@ -329,7 +332,7 @@ AC_DEFUN([AX_INIT_STANDARD_PROJECT], [
AX_ADD_MAKEFILE_TARGET_DEP([maintainer-clean-am], [maintainer-clean-standard-project-targets], [makefile.in]) AX_ADD_MAKEFILE_TARGET_DEP([maintainer-clean-am], [maintainer-clean-standard-project-targets], [makefile.in])
test -f makefile.in && cat >> makefile.in <<EOF test -f makefile.in && cat >> makefile.in <<EOF
#### Begin: Appended by $0 #### Begin: Appended by $0
EXTRA_DIST += bootstrap.sh ax_init_standard_project.m4 ax_cxx_compile_stdcxx_11.m4 \ EXTRA_DIST += bootstrap.sh ax_init_standard_project.m4 ax_cxx_compile_stdcxx.m4 \
ax_check_qt.m4 resolve-debbuilddeps.sh resolve-rpmbuilddeps.sh \ ax_check_qt.m4 resolve-debbuilddeps.sh resolve-rpmbuilddeps.sh \
build-resource-file.sh mac-create-app-bundle.sh build-resource-file.sh mac-create-app-bundle.sh
@@ -347,9 +350,9 @@ EOF
# use this in configure.ac to support C++ # use this in configure.ac to support C++
AC_DEFUN([AX_USE_CXX], [ AC_DEFUN([AX_USE_CXX], [
m4_include(ax_cxx_compile_stdcxx_11.m4) m4_include(ax_cxx_compile_stdcxx.m4)
AC_LANG(C++) AC_LANG(C++)
AX_CXX_COMPILE_STDCXX_14(noext, optional) AX_CXX_COMPILE_STDCXX([17], [noext], [optional])
AC_PROG_CXX AC_PROG_CXX
AC_PROG_CPP AC_PROG_CPP

View File

@@ -129,7 +129,7 @@ GENERATED FILES
* ${MY_NAME} * ${MY_NAME}
* autogen.sh - just the basics to initialize auto tools and create configure * autogen.sh - just the basics to initialize auto tools and create configure
* ax_init_standard_project.m4 - auxiliary macro definition file * ax_init_standard_project.m4 - auxiliary macro definition file
* ax_cxx_compile_stdcxx_11.m4 - auxiliary macro definition file * ax_cxx_compile_stdcxx.m4 - auxiliary macro definition file
* ax_check_qt.m4 - auxiliary macro definition file * ax_check_qt.m4 - auxiliary macro definition file
* makefile_test.inc.am - makefile to be included in tests * makefile_test.inc.am - makefile to be included in tests
* resolve-debbuilddeps.sh - script to install debian package dependencies * resolve-debbuilddeps.sh - script to install debian package dependencies
@@ -274,7 +274,7 @@ FILES
* Enable C++ testing using CppUnit: AX_USE_CPPUNIT * Enable C++ testing using CppUnit: AX_USE_CPPUNIT
* Enable other tests: AX_BUILD_TEST * Enable other tests: AX_BUILD_TEST
* Enable C++ examples, i.e. for libraries: AX_BUILD_EXAMPLES * Enable C++ examples, i.e. for libraries: AX_BUILD_EXAMPLES
* Check for C++11 support: AX_CXX_COMPILE_STDCXX_11 (see ax_cxx_compile_stdcxx_11.m4) * Require C++17 support: AX_CXX_COMPILE_STDCXX([17], [noext], [mandatory]) (see ax_cxx_compile_stdcxx.m4)
* Require a QT module: AX_REQUIRE_QT (see ax_check_qt.m4) * Require a QT module: AX_REQUIRE_QT (see ax_check_qt.m4)
* Optionally use a QT module: AX_CHECK_QT (see ax_check_qt.m4) * Optionally use a QT module: AX_CHECK_QT (see ax_check_qt.m4)
* Require a module: AX_PKG_REQUIRE (see ax_init_standard_project.m4) * Require a module: AX_PKG_REQUIRE (see ax_init_standard_project.m4)
@@ -591,7 +591,7 @@ fi
# Initialize the environment: # Initialize the environment:
copy ${MY_NAME} copy ${MY_NAME}
copy ax_init_standard_project.m4 copy ax_init_standard_project.m4
copy ax_cxx_compile_stdcxx_11.m4 copy ax_cxx_compile_stdcxx.m4
copy ax_check_qt.m4 copy ax_check_qt.m4
copy makefile_test.inc.am copy makefile_test.inc.am
copy resolve-debbuilddeps.sh copy resolve-debbuilddeps.sh
@@ -1505,6 +1505,7 @@ if testtag AX_USE_DOXYGEN; then
if ! checkfile doc/doxyfile.in || \ if ! checkfile doc/doxyfile.in || \
contains doc/doxyfile.in "${rebuildfiles[@]}"; then contains doc/doxyfile.in "${rebuildfiles[@]}"; then
run doxygen -g doc/doxyfile.in run doxygen -g doc/doxyfile.in
sed -i ':a;/\\$/{s///;N;s/ *\n */ /g;ba}' doc/doxyfile.in
if test $exists -eq 0; then if test $exists -eq 0; then
if test -n "${VCS}" -a $novcs -eq 0 && ! contains "doc/doxyfile" "${excludevcs[@]}"; then if test -n "${VCS}" -a $novcs -eq 0 && ! contains "doc/doxyfile" "${excludevcs[@]}"; then
run ${VCS} add doc/doxyfile.in run ${VCS} add doc/doxyfile.in
@@ -1548,6 +1549,7 @@ if testtag AX_USE_DOXYGEN; then
doxyreplace WARN_IF_UNDOCUMENTED NO doxyreplace WARN_IF_UNDOCUMENTED NO
doxyreplace WARN_LOGFILE doxygen.errors doxyreplace WARN_LOGFILE doxygen.errors
doxyreplace INPUT "@top_srcdir@/src" doxyreplace INPUT "@top_srcdir@/src"
doxyadd INPUT "@top_srcdir@/@README_FILE@"
if testtag AX_USE_SCRIPTS; then if testtag AX_USE_SCRIPTS; then
doxyadd INPUT "@top_srcdir@/scripts" doxyadd INPUT "@top_srcdir@/scripts"
fi fi
@@ -1562,6 +1564,7 @@ if testtag AX_USE_DOXYGEN; then
doxyadd EXCLUDE "@top_srcdir@/nodejs/node_modules" doxyadd EXCLUDE "@top_srcdir@/nodejs/node_modules"
doxyadd EXCLUDE "@top_srcdir@/nodejs/public/javascripts/ext" doxyadd EXCLUDE "@top_srcdir@/nodejs/public/javascripts/ext"
fi fi
doxyreplace USE_MDFILE_AS_MAINPAGE "@top_srcdir@/@README_FILE@"
doxyreplace FILE_PATTERNS '*.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 *.f90 *.f *.for *.tcl *.vhd *.vhdl *.ucf *.qsf *.as *.js *.wt *.sql' doxyreplace FILE_PATTERNS '*.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 *.f90 *.f *.for *.tcl *.vhd *.vhdl *.ucf *.qsf *.as *.js *.wt *.sql'
doxyreplace RECURSIVE YES doxyreplace RECURSIVE YES
doxyreplace EXCLUDE_PATTERNS "moc_* uic_* qrc_* version.[ch]xx" doxyreplace EXCLUDE_PATTERNS "moc_* uic_* qrc_* version.[ch]xx"
@@ -1571,9 +1574,7 @@ if testtag AX_USE_DOXYGEN; then
doxyreplace HTML_DYNAMIC_SECTIONS YES doxyreplace HTML_DYNAMIC_SECTIONS YES
doxyreplace DISABLE_INDEX NO doxyreplace DISABLE_INDEX NO
doxyreplace GENERATE_TREEVIEW YES doxyreplace GENERATE_TREEVIEW YES
if testtag AX_BUILD_EXAMPLES; then doxyreplace EXAMPLE_PATH @top_srcdir@
doxyreplace EXAMPLE_PATH @top_srcdir@/examples
fi
doxyreplace EXAMPLE_RECURSIVE YES doxyreplace EXAMPLE_RECURSIVE YES
doxyreplace FILTER_PATTERNS '*.wt=doxygen-webtester.sed *.sql=@top_srcdir@/sql-to-dot.sed' doxyreplace FILTER_PATTERNS '*.wt=doxygen-webtester.sed *.sql=@top_srcdir@/sql-to-dot.sed'
doxyreplace SOURCE_BROWSER YES doxyreplace SOURCE_BROWSER YES
@@ -1874,7 +1875,7 @@ desktop_DATA = @PACKAGE_DESKTOP@
dist_pkgdata_DATA = @PACKAGE_ICON@ dist_pkgdata_DATA = @PACKAGE_ICON@
dist_noinst_DATA = ax_check_qt.m4 bootstrap.sh \\ dist_noinst_DATA = ax_check_qt.m4 bootstrap.sh \\
resolve-rpmbuilddeps.sh autogen.sh \\ resolve-rpmbuilddeps.sh autogen.sh \\
ax_cxx_compile_stdcxx_11.m4 build-in-docker.sh \\ ax_cxx_compile_stdcxx.m4 build-in-docker.sh \\
build-resource-file.sh \\ build-resource-file.sh \\
ax_init_standard_project.m4 \\ ax_init_standard_project.m4 \\
mac-create-app-bundle.sh resolve-debbuilddeps.sh \\ mac-create-app-bundle.sh resolve-debbuilddeps.sh \\

View File

@@ -7,8 +7,9 @@
## 45678901234567890123456789012345678901234567890123456789012345678901234567890 ## 45678901234567890123456789012345678901234567890123456789012345678901234567890
m4_define(x_package_name, libxml-cxx) # project's name m4_define(x_package_name, libxml-cxx) # project's name
m4_define(x_major, 1) # project's major version m4_define(x_major, 2) # project's major version
m4_define(x_minor, 2) # project's minor version m4_define(x_minor, 0) # project's minor version
m4_define(x_least_diff, 126)
m4_include(ax_init_standard_project.m4) m4_include(ax_init_standard_project.m4)
AC_INIT(x_package_name, x_version, x_package_name) AC_INIT(x_package_name, x_version, x_package_name)
AM_INIT_AUTOMAKE([1.9 tar-pax]) AM_INIT_AUTOMAKE([1.9 tar-pax])

View File

@@ -1,4 +1,4 @@
# Doxyfile 1.8.6 # Doxyfile 1.8.13
# This file describes the settings to be used by the documentation system # This file describes the settings to be used by the documentation system
# doxygen (www.doxygen.org) for a project. # doxygen (www.doxygen.org) for a project.
@@ -46,12 +46,12 @@ PROJECT_NUMBER = @PACKAGE_VERSION@
PROJECT_BRIEF = @DESCRIPTION@ PROJECT_BRIEF = @DESCRIPTION@
# With the PROJECT_LOGO tag one can specify an logo or icon that is included in # With the PROJECT_LOGO tag one can specify a logo or an icon that is included
# the documentation. The maximum height of the logo should not exceed 55 pixels # in the documentation. The maximum height of the logo should not exceed 55
# and the maximum width should not exceed 200 pixels. Doxygen will copy the logo # pixels and the maximum width should not exceed 200 pixels. Doxygen will copy
# to the output directory. # the logo to the output directory.
PROJECT_LOGO = @PROJECT_LOGO@ PROJECT_LOGO = @top_srcdir@/@PACKAGE_LOGO@
# The OUTPUT_DIRECTORY tag is used to specify the (relative or absolute) path # 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 # into which the generated documentation will be written. If a relative path is
@@ -60,7 +60,7 @@ PROJECT_LOGO = @PROJECT_LOGO@
OUTPUT_DIRECTORY = OUTPUT_DIRECTORY =
# If the CREATE_SUBDIRS tag is set to YES, then doxygen will create 4096 sub- # 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 # directories (in 2 levels) under the output directory of each output format and
# will distribute the generated files over these directories. Enabling this # will distribute the generated files over these directories. Enabling this
# option can be useful when feeding doxygen a huge amount of source files, where # option can be useful when feeding doxygen a huge amount of source files, where
@@ -70,6 +70,14 @@ OUTPUT_DIRECTORY =
CREATE_SUBDIRS = 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 # The OUTPUT_LANGUAGE tag is used to specify the language in which all
# documentation generated by doxygen is written. Doxygen will use this # documentation generated by doxygen is written. Doxygen will use this
# information to generate all constant output in the proper language. # information to generate all constant output in the proper language.
@@ -85,14 +93,14 @@ CREATE_SUBDIRS = NO
OUTPUT_LANGUAGE = English OUTPUT_LANGUAGE = English
# If the BRIEF_MEMBER_DESC tag is set to YES doxygen will include brief member # 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 # descriptions after the members that are listed in the file and class
# documentation (similar to Javadoc). Set to NO to disable this. # documentation (similar to Javadoc). Set to NO to disable this.
# The default value is: YES. # The default value is: YES.
BRIEF_MEMBER_DESC = YES BRIEF_MEMBER_DESC = YES
# If the REPEAT_BRIEF tag is set to YES doxygen will prepend the brief # If the REPEAT_BRIEF tag is set to YES, doxygen will prepend the brief
# description of a member or function before the detailed description # 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 # Note: If both HIDE_UNDOC_MEMBERS and BRIEF_MEMBER_DESC are set to NO, the
@@ -110,7 +118,7 @@ REPEAT_BRIEF = YES
# the entity):The $name class, The $name widget, The $name file, is, provides, # the entity):The $name class, The $name widget, The $name file, is, provides,
# specifies, contains, represents, a, an and the. # specifies, contains, represents, a, an and the.
ABBREVIATE_BRIEF = 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 # 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 # doxygen will generate a detailed section even if there is only a brief
@@ -127,7 +135,7 @@ ALWAYS_DETAILED_SEC = NO
INLINE_INHERITED_MEMB = YES INLINE_INHERITED_MEMB = YES
# If the FULL_PATH_NAMES tag is set to YES doxygen will prepend the full path # 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 # 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 # shortest path that makes the file name unique will be used
# The default value is: YES. # The default value is: YES.
@@ -197,9 +205,9 @@ MULTILINE_CPP_IS_BRIEF = YES
INHERIT_DOCS = YES INHERIT_DOCS = YES
# If the SEPARATE_MEMBER_PAGES tag is set to YES, then doxygen will produce a # If the SEPARATE_MEMBER_PAGES tag is set to YES then doxygen will produce a new
# new page for each member. If set to NO, the documentation of a member will be # page for each member. If set to NO, the documentation of a member will be part
# part of the file/class/namespace that contains it. # of the file/class/namespace that contains it.
# The default value is: NO. # The default value is: NO.
SEPARATE_MEMBER_PAGES = NO SEPARATE_MEMBER_PAGES = NO
@@ -221,11 +229,15 @@ TAB_SIZE = 2
# newlines. # newlines.
ALIASES = "id=\par File-ID\n" ALIASES = "id=\par File-ID\n"
ALIASES += "author=<a href="@AUTHOR_URL@" target="_blank">@AUTHOR_NAME@</a>"
ALIASES += "readme=@README_HTML@"
ALIASES += "description=@DESCRIPTION@"
ALIASES += "api=\xrefitem api \"API Call\" \"\""
ALIASES += "mutex=\par Reentrant:\nAccess is locked with mutex @c " ALIASES += "mutex=\par Reentrant:\nAccess is locked with mutex @c "
ALIASES += "instancemutex=\par Reentrant:\nAccess is locked with per instance mutex @c " ALIASES += "instancemutex=\par Reentrant:\nAccess is locked with per instance mutex @c "
ALIASES += "classmutex=\par Reentrant:\nAccess is locked with class static mutex @c " ALIASES += "classmutex=\par Reentrant:\nAccess is locked with class static mutex @c "
ALIASES += "license=\par License\n" ALIASES += "license=\par License\n"
ALIASES += "copy=\par Copyright\n" ALIASES += "copy=\par Copyright by <a href="@AUTHOR_URL@" target="_blank">@AUTHOR_NAME@</a>\n"
# This tag can be used to specify a number of word-keyword mappings (TCL only). # 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" # A mapping has the form "name=value". For example adding "class=itcl::class"
@@ -266,11 +278,14 @@ OPTIMIZE_OUTPUT_VHDL = NO
# extension. Doxygen has a built-in mapping, but you can override or extend it # 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 # 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, # language is one of the parsers supported by doxygen: IDL, Java, Javascript,
# C#, C, C++, D, PHP, Objective-C, Python, Fortran, VHDL. For instance to make # C#, C, C++, D, PHP, Objective-C, Python, Fortran (fixed format Fortran:
# doxygen treat .inc files as Fortran files (default is PHP), and .f files as C # FortranFixed, free formatted Fortran: FortranFree, unknown formatted Fortran:
# (default is Fortran), use: inc=Fortran f=C. # 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: 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 # Note that for custom extensions you also need to set FILE_PATTERNS otherwise
# the files are not read by doxygen. # the files are not read by doxygen.
@@ -287,10 +302,19 @@ EXTENSION_MAPPING =
MARKDOWN_SUPPORT = 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 # When enabled doxygen tries to link words that correspond to documented
# classes, or namespaces to their corresponding documentation. Such a link can # classes, or namespaces to their corresponding documentation. Such a link can
# be prevented in individual cases by by putting a % sign in front of the word # be prevented in individual cases by putting a % sign in front of the word or
# or globally by setting AUTOLINK_SUPPORT to NO. # globally by setting AUTOLINK_SUPPORT to NO.
# The default value is: YES. # The default value is: YES.
AUTOLINK_SUPPORT = YES AUTOLINK_SUPPORT = YES
@@ -330,13 +354,20 @@ SIP_SUPPORT = NO
IDL_PROPERTY_SUPPORT = YES IDL_PROPERTY_SUPPORT = YES
# If member grouping is used in the documentation and the DISTRIBUTE_GROUP_DOC # 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 # 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 # member in the group (if any) for the other members of the group. By default
# all members of a group must be documented explicitly. # all members of a group must be documented explicitly.
# The default value is: NO. # The default value is: NO.
DISTRIBUTE_GROUP_DOC = YES DISTRIBUTE_GROUP_DOC = YES
# 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 # 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 # (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 # type (e.g. under the Public Functions section). Set it to NO to prevent
@@ -395,7 +426,7 @@ LOOKUP_CACHE_SIZE = 0
# Build related configuration options # Build related configuration options
#--------------------------------------------------------------------------- #---------------------------------------------------------------------------
# If the EXTRACT_ALL tag is set to YES doxygen will assume all entities in # 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 # documentation are documented, even if no documentation was available. Private
# class members and static file members will be hidden unless the # class members and static file members will be hidden unless the
# EXTRACT_PRIVATE respectively EXTRACT_STATIC tags are set to YES. # EXTRACT_PRIVATE respectively EXTRACT_STATIC tags are set to YES.
@@ -405,35 +436,35 @@ LOOKUP_CACHE_SIZE = 0
EXTRACT_ALL = YES EXTRACT_ALL = YES
# If the EXTRACT_PRIVATE tag is set to YES all private members of a class will # If the EXTRACT_PRIVATE tag is set to YES, all private members of a class will
# be included in the documentation. # be included in the documentation.
# The default value is: NO. # The default value is: NO.
EXTRACT_PRIVATE = YES EXTRACT_PRIVATE = YES
# If the EXTRACT_PACKAGE tag is set to YES all members with package or internal # If the EXTRACT_PACKAGE tag is set to YES, all members with package or internal
# scope will be included in the documentation. # scope will be included in the documentation.
# The default value is: NO. # The default value is: NO.
EXTRACT_PACKAGE = YES EXTRACT_PACKAGE = YES
# If the EXTRACT_STATIC tag is set to YES all static members of a file will be # If the EXTRACT_STATIC tag is set to YES, all static members of a file will be
# included in the documentation. # included in the documentation.
# The default value is: NO. # The default value is: NO.
EXTRACT_STATIC = YES EXTRACT_STATIC = YES
# If the EXTRACT_LOCAL_CLASSES tag is set to YES classes (and structs) defined # 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 # 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 # only classes defined in header files are included. Does not have any effect
# for Java sources. # for Java sources.
# The default value is: YES. # The default value is: YES.
EXTRACT_LOCAL_CLASSES = YES EXTRACT_LOCAL_CLASSES = YES
# This flag is only useful for Objective-C code. When set to YES local methods, # 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 # 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 in the documentation. If set to NO, only methods in the interface are
# included. # included.
# The default value is: NO. # The default value is: NO.
@@ -458,21 +489,21 @@ HIDE_UNDOC_MEMBERS = NO
# If the HIDE_UNDOC_CLASSES tag is set to YES, doxygen will hide all # 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 # 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 # to NO, these classes will be included in the various overviews. This option
# no effect if EXTRACT_ALL is enabled. # has no effect if EXTRACT_ALL is enabled.
# The default value is: NO. # The default value is: NO.
HIDE_UNDOC_CLASSES = NO HIDE_UNDOC_CLASSES = NO
# If the HIDE_FRIEND_COMPOUNDS tag is set to YES, doxygen will hide all friend # 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 # (class|struct|union) declarations. If set to NO, these declarations will be
# included in the documentation. # included in the documentation.
# The default value is: NO. # The default value is: NO.
HIDE_FRIEND_COMPOUNDS = NO HIDE_FRIEND_COMPOUNDS = NO
# If the HIDE_IN_BODY_DOCS tag is set to YES, doxygen will hide any # 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 # 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. # blocks will be appended to the function's detailed documentation block.
# The default value is: NO. # The default value is: NO.
@@ -486,7 +517,7 @@ HIDE_IN_BODY_DOCS = NO
INTERNAL_DOCS = NO INTERNAL_DOCS = NO
# If the CASE_SENSE_NAMES tag is set to NO then doxygen will only generate file # 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 # 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 # 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 # in case and if your file system supports case sensitive file names. Windows
# and Mac users are advised to set this option to NO. # and Mac users are advised to set this option to NO.
@@ -495,12 +526,19 @@ INTERNAL_DOCS = NO
CASE_SENSE_NAMES = YES CASE_SENSE_NAMES = YES
# If the HIDE_SCOPE_NAMES tag is set to NO then doxygen will show members with # 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 # their full class and namespace scopes in the documentation. If set to YES, the
# scope will be hidden. # scope will be hidden.
# The default value is: NO. # The default value is: NO.
HIDE_SCOPE_NAMES = 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 # 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 files that are included by a file in the documentation of that file.
# The default value is: YES. # The default value is: YES.
@@ -528,14 +566,14 @@ INLINE_INFO = YES
# If the SORT_MEMBER_DOCS tag is set to YES then doxygen will sort the # 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 # (detailed) documentation of file and class members alphabetically by member
# name. If set to NO the members will appear in declaration order. # name. If set to NO, the members will appear in declaration order.
# The default value is: YES. # The default value is: YES.
SORT_MEMBER_DOCS = YES SORT_MEMBER_DOCS = YES
# If the SORT_BRIEF_DOCS tag is set to YES then doxygen will sort the brief # 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 # descriptions of file, namespace and class members alphabetically by member
# name. If set to NO the members will appear in declaration order. Note that # 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. # this will also influence the order of the classes in the class list.
# The default value is: NO. # The default value is: NO.
@@ -580,27 +618,25 @@ SORT_BY_SCOPE_NAME = NO
STRICT_PROTO_MATCHING = NO STRICT_PROTO_MATCHING = NO
# The GENERATE_TODOLIST tag can be used to enable ( YES) or disable ( NO) the # The GENERATE_TODOLIST tag can be used to enable (YES) or disable (NO) the todo
# todo list. This list is created by putting \todo commands in the # list. This list is created by putting \todo commands in the documentation.
# documentation.
# The default value is: YES. # The default value is: YES.
GENERATE_TODOLIST = YES GENERATE_TODOLIST = YES
# The GENERATE_TESTLIST tag can be used to enable ( YES) or disable ( NO) the # The GENERATE_TESTLIST tag can be used to enable (YES) or disable (NO) the test
# test list. This list is created by putting \test commands in the # list. This list is created by putting \test commands in the documentation.
# documentation.
# The default value is: YES. # The default value is: YES.
GENERATE_TESTLIST = YES GENERATE_TESTLIST = YES
# The GENERATE_BUGLIST tag can be used to enable ( YES) or disable ( NO) the bug # 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. # list. This list is created by putting \bug commands in the documentation.
# The default value is: YES. # The default value is: YES.
GENERATE_BUGLIST = YES GENERATE_BUGLIST = YES
# The GENERATE_DEPRECATEDLIST tag can be used to enable ( YES) or disable ( NO) # 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 deprecated list. This list is created by putting \deprecated commands in
# the documentation. # the documentation.
# The default value is: YES. # The default value is: YES.
@@ -625,8 +661,8 @@ ENABLED_SECTIONS =
MAX_INITIALIZER_LINES = 30 MAX_INITIALIZER_LINES = 30
# Set the SHOW_USED_FILES tag to NO to disable the list of files generated at # 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 # the bottom of the documentation of classes and structs. If set to YES, the
# will mention the files that were used to generate the documentation. # list will mention the files that were used to generate the documentation.
# The default value is: YES. # The default value is: YES.
SHOW_USED_FILES = YES SHOW_USED_FILES = YES
@@ -674,8 +710,7 @@ LAYOUT_FILE =
# to be installed. See also http://en.wikipedia.org/wiki/BibTeX for more info. # 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 # 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 # LATEX_BIB_STYLE. To use this feature you need bibtex and perl available in the
# search path. Do not use file names with spaces, bibtex cannot handle them. See # search path. See also \cite for info how to create references.
# also \cite for info how to create references.
CITE_BIB_FILES = CITE_BIB_FILES =
@@ -691,7 +726,7 @@ CITE_BIB_FILES =
QUIET = NO QUIET = NO
# The WARNINGS tag can be used to turn on/off the warning messages that are # 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 # generated to standard error (stderr) by doxygen. If WARNINGS is set to YES
# this implies that the warnings are on. # this implies that the warnings are on.
# #
# Tip: Turn warnings on while writing the documentation. # Tip: Turn warnings on while writing the documentation.
@@ -699,7 +734,7 @@ QUIET = NO
WARNINGS = YES WARNINGS = YES
# If the WARN_IF_UNDOCUMENTED tag is set to YES, then doxygen will generate # 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 # warnings for undocumented members. If EXTRACT_ALL is set to YES then this flag
# will automatically be disabled. # will automatically be disabled.
# The default value is: YES. # The default value is: YES.
@@ -716,12 +751,18 @@ WARN_IF_DOC_ERROR = YES
# This WARN_NO_PARAMDOC option can be enabled to get warnings for functions that # 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 # 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 # value. If set to NO, doxygen will only warn about wrong or incomplete
# documentation, but not about the absence of documentation. # parameter documentation, but not about the absence of documentation.
# The default value is: NO. # The default value is: NO.
WARN_NO_PARAMDOC = 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 # 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 # 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 # will be replaced by the file and line number from which the warning originated
@@ -745,11 +786,12 @@ WARN_LOGFILE = doxygen.errors
# The INPUT tag is used to specify the files and/or directories that contain # 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 # documented source files. You may enter file names like myfile.cpp or
# directories like /usr/src/myproject. Separate the files or directories with # directories like /usr/src/myproject. Separate the files or directories with
# spaces. # spaces. See also FILE_PATTERNS and EXTENSION_MAPPING
# Note: If this tag is empty the current directory is searched. # Note: If this tag is empty the current directory is searched.
INPUT = @top_srcdir@/src INPUT = @top_srcdir@/src
INPUT += @top_srcdir@/test INPUT += @top_srcdir@/test
INPUT += @top_srcdir@/@README_FILE@
# This tag can be used to specify the character encoding of the source files # 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 # that doxygen parses. Internally doxygen uses the UTF-8 encoding. Doxygen uses
@@ -762,15 +804,19 @@ INPUT_ENCODING = UTF-8
# If the value of the INPUT tag contains directories, you can use the # 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 # FILE_PATTERNS tag to specify one or more wildcard patterns (like *.cpp and
# *.h) to filter out the source-files in the directories. If left blank the # *.h) to filter out the source-files in the directories.
# following patterns are tested:*.c, *.cc, *.cxx, *.cpp, *.c++, *.java, *.ii, #
# *.ixx, *.ipp, *.i++, *.inl, *.idl, *.ddl, *.odl, *.h, *.hh, *.hxx, *.hpp, # Note that for custom extensions or not directly supported extensions you also
# *.h++, *.cs, *.d, *.php, *.php4, *.php5, *.phtml, *.inc, *.m, *.markdown, # need to set EXTENSION_MAPPING for the extension otherwise the files are not
# *.md, *.mm, *.dox, *.py, *.f90, *.f, *.for, *.tcl, *.vhd, *.vhdl, *.ucf, # read by doxygen.
# *.qsf, *.as and *.js. #
# 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 = *.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 *.f90 *.f *.for *.tcl *.vhd *.vhdl *.ucf *.qsf *.as *.js FILE_PATTERNS = *.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 *.f90 *.f *.for *.tcl *.vhd *.vhdl *.ucf *.qsf *.as *.js *.wt *.sql
FILE_PATTERNS += *.wt
# The RECURSIVE tag can be used to specify whether or not subdirectories should # The RECURSIVE tag can be used to specify whether or not subdirectories should
# be searched for input files as well. # be searched for input files as well.
@@ -801,7 +847,7 @@ EXCLUDE_SYMLINKS = NO
# Note that the wildcards are matched against the file with absolute path, so to # 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 all test directories for example use the pattern */test/*
EXCLUDE_PATTERNS = moc_* uic_* qrc_* EXCLUDE_PATTERNS = moc_* uic_* qrc_* version.[ch]xx
# The EXCLUDE_SYMBOLS tag can be used to specify one or more symbol names # The EXCLUDE_SYMBOLS tag can be used to specify one or more symbol names
# (namespaces, classes, functions, etc.) that should be excluded from the # (namespaces, classes, functions, etc.) that should be excluded from the
@@ -818,14 +864,14 @@ EXCLUDE_SYMBOLS =
# that contain example code fragments that are included (see the \include # that contain example code fragments that are included (see the \include
# command). # command).
EXAMPLE_PATH = @top_srcdir@/examples EXAMPLE_PATH = @top_srcdir@
# If the value of the EXAMPLE_PATH tag contains directories, you can use the # 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 # 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 # *.h) to filter out the source-files in the directories. If left blank all
# files are included. # files are included.
EXAMPLE_PATTERNS = EXAMPLE_PATTERNS = *
# If the EXAMPLE_RECURSIVE tag is set to YES then subdirectories will be # 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 # searched for input files to be used with the \include or \dontinclude commands
@@ -854,6 +900,10 @@ IMAGE_PATH =
# Note that the filter must not add or remove lines; it is applied before the # 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 # code is scanned, but not when the output code is generated. If lines are added
# or removed, the anchors will not be placed correctly. # 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 = INPUT_FILTER =
@@ -863,11 +913,15 @@ INPUT_FILTER =
# (like *.cpp=my_cpp_filter). See INPUT_FILTER for further information on how # (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 # filters are used. If the FILTER_PATTERNS tag is empty or if none of the
# patterns match the file name, INPUT_FILTER is applied. # 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 = *.wt=doxygen-webtester.sed FILTER_PATTERNS = *.wt=doxygen-webtester.sed *.sql=@top_srcdir@/sql-to-dot.sed
# If the FILTER_SOURCE_FILES tag is set to YES, the input filter (if set using # 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 # 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). # producing the source files to browse (i.e. when SOURCE_BROWSER is set to YES).
# The default value is: NO. # The default value is: NO.
@@ -886,7 +940,7 @@ FILTER_SOURCE_PATTERNS =
# (index.html). This can be useful if you have a project on for instance GitHub # (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. # and want to reuse the introduction page also for the doxygen output.
USE_MDFILE_AS_MAINPAGE = USE_MDFILE_AS_MAINPAGE = @top_srcdir@/@README_FILE@
#--------------------------------------------------------------------------- #---------------------------------------------------------------------------
# Configuration options related to source browsing # Configuration options related to source browsing
@@ -927,7 +981,7 @@ REFERENCED_BY_RELATION = NO
REFERENCES_RELATION = NO REFERENCES_RELATION = NO
# If the REFERENCES_LINK_SOURCE tag is set to YES and SOURCE_BROWSER tag is set # 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 # to YES then the hyperlinks from functions in REFERENCES_RELATION and
# REFERENCED_BY_RELATION lists will link to the source code. Otherwise they will # REFERENCED_BY_RELATION lists will link to the source code. Otherwise they will
# link to the documentation. # link to the documentation.
# The default value is: YES. # The default value is: YES.
@@ -974,6 +1028,25 @@ USE_HTAGS = NO
VERBATIM_HEADERS = YES VERBATIM_HEADERS = YES
# If the CLANG_ASSISTED_PARSING tag is set to YES then doxygen will use the
# clang parser (see: http://clang.llvm.org/) for more accurate parsing at the
# cost of reduced performance. This can be particularly helpful with template
# rich C++ code for which doxygen's built-in parser lacks the necessary type
# information.
# Note: The availability of this option depends on whether or not doxygen was
# generated with the -Duse-libclang=ON option for CMake.
# The default value is: NO.
CLANG_ASSISTED_PARSING = NO
# If clang assisted parsing is enabled you can provide the compiler with command
# line options that you would normally use when invoking the compiler. Note that
# the include paths will already be set by doxygen for the files and directories
# specified with INPUT and INCLUDE_PATH.
# This tag requires that the tag CLANG_ASSISTED_PARSING is set to YES.
CLANG_OPTIONS =
#--------------------------------------------------------------------------- #---------------------------------------------------------------------------
# Configuration options related to the alphabetical class index # Configuration options related to the alphabetical class index
#--------------------------------------------------------------------------- #---------------------------------------------------------------------------
@@ -1004,7 +1077,7 @@ IGNORE_PREFIX =
# Configuration options related to the HTML output # Configuration options related to the HTML output
#--------------------------------------------------------------------------- #---------------------------------------------------------------------------
# If the GENERATE_HTML tag is set to YES doxygen will generate HTML output # If the GENERATE_HTML tag is set to YES, doxygen will generate HTML output
# The default value is: YES. # The default value is: YES.
GENERATE_HTML = YES GENERATE_HTML = YES
@@ -1042,7 +1115,7 @@ HTML_FILE_EXTENSION = .html
# of the possible markers and block names see the documentation. # of the possible markers and block names see the documentation.
# This tag requires that the tag GENERATE_HTML is set to YES. # This tag requires that the tag GENERATE_HTML is set to YES.
HTML_HEADER = HTML_HEADER = header.html
# The HTML_FOOTER tag can be used to specify a user-defined HTML footer for each # 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 # generated HTML page. If the tag is left blank doxygen will generate a standard
@@ -1052,7 +1125,7 @@ HTML_HEADER =
# that doxygen normally uses. # that doxygen normally uses.
# This tag requires that the tag GENERATE_HTML is set to YES. # This tag requires that the tag GENERATE_HTML is set to YES.
HTML_FOOTER = HTML_FOOTER = footer.html
# The HTML_STYLESHEET tag can be used to specify a user-defined cascading style # 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 # sheet that is used by each HTML page. It can be used to fine-tune the look of
@@ -1066,16 +1139,18 @@ HTML_FOOTER =
HTML_STYLESHEET = HTML_STYLESHEET =
# The HTML_EXTRA_STYLESHEET tag can be used to specify an additional user- # The HTML_EXTRA_STYLESHEET tag can be used to specify additional user-defined
# defined cascading style sheet that is included after the standard style sheets # cascading style sheets that are included after the standard style sheets
# created by doxygen. Using this option one can overrule certain style aspects. # 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 # This is preferred over using HTML_STYLESHEET since it does not replace the
# standard style sheet and is therefor more robust against future updates. # standard style sheet and is therefore more robust against future updates.
# Doxygen will copy the style sheet file to the output directory. For an example # Doxygen will copy the style sheet files to the output directory.
# see the documentation. # 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. # This tag requires that the tag GENERATE_HTML is set to YES.
HTML_EXTRA_STYLESHEET = HTML_EXTRA_STYLESHEET = style.css
# The HTML_EXTRA_FILES tag can be used to specify one or more extra images or # 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 # other source files which should be copied to the HTML output directory. Note
@@ -1088,7 +1163,7 @@ HTML_EXTRA_STYLESHEET =
HTML_EXTRA_FILES = HTML_EXTRA_FILES =
# The HTML_COLORSTYLE_HUE tag controls the color of the HTML output. Doxygen # The HTML_COLORSTYLE_HUE tag controls the color of the HTML output. Doxygen
# will adjust the colors in the stylesheet and background images according to # 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 # 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 # 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 # 0 represents red, 60 is yellow, 120 is green, 180 is cyan, 240 is blue, 300
@@ -1119,11 +1194,12 @@ HTML_COLORSTYLE_GAMMA = 80
# If the HTML_TIMESTAMP tag is set to YES then the footer of each generated HTML # 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 # 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. # to YES can help to show when doxygen was last run and thus if the
# The default value is: YES. # documentation is up to date.
# The default value is: NO.
# This tag requires that the tag GENERATE_HTML is set to YES. # This tag requires that the tag GENERATE_HTML is set to YES.
HTML_TIMESTAMP = YES HTML_TIMESTAMP = NO
# If the HTML_DYNAMIC_SECTIONS tag is set to YES then the generated HTML # 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 # documentation will contain sections that can be hidden and shown after the
@@ -1131,7 +1207,7 @@ HTML_TIMESTAMP = YES
# The default value is: NO. # The default value is: NO.
# This tag requires that the tag GENERATE_HTML is set to YES. # This tag requires that the tag GENERATE_HTML is set to YES.
HTML_DYNAMIC_SECTIONS = NO HTML_DYNAMIC_SECTIONS = YES
# With HTML_INDEX_NUM_ENTRIES one can control the preferred number of entries # 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 # shown in the various tree structured indices initially; the user can expand
@@ -1216,28 +1292,29 @@ GENERATE_HTMLHELP = NO
CHM_FILE = CHM_FILE =
# The HHC_LOCATION tag can be used to specify the location (absolute path # 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 # 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. # doxygen will try to run the HTML help compiler on the generated index.hhp.
# The file has to be specified with full path. # The file has to be specified with full path.
# This tag requires that the tag GENERATE_HTMLHELP is set to YES. # This tag requires that the tag GENERATE_HTMLHELP is set to YES.
HHC_LOCATION = HHC_LOCATION =
# The GENERATE_CHI flag controls if a separate .chi index file is generated ( # 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). # (YES) or that it should be included in the master .chm file (NO).
# The default value is: NO. # The default value is: NO.
# This tag requires that the tag GENERATE_HTMLHELP is set to YES. # This tag requires that the tag GENERATE_HTMLHELP is set to YES.
GENERATE_CHI = NO GENERATE_CHI = NO
# The CHM_INDEX_ENCODING is used to encode HtmlHelp index ( hhk), content ( hhc) # The CHM_INDEX_ENCODING is used to encode HtmlHelp index (hhk), content (hhc)
# and project file content. # and project file content.
# This tag requires that the tag GENERATE_HTMLHELP is set to YES. # This tag requires that the tag GENERATE_HTMLHELP is set to YES.
CHM_INDEX_ENCODING = CHM_INDEX_ENCODING =
# The BINARY_TOC flag controls whether a binary table of contents is generated ( # 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. # (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. # The default value is: NO.
# This tag requires that the tag GENERATE_HTMLHELP is set to YES. # This tag requires that the tag GENERATE_HTMLHELP is set to YES.
@@ -1350,7 +1427,7 @@ DISABLE_INDEX = NO
# index structure (just like the one that is generated for HTML Help). For this # 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 # 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 # (i.e. any modern browser). Windows users are probably better off using the
# HTML help feature. Via custom stylesheets (see HTML_EXTRA_STYLESHEET) one can # 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 # 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 # 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 root of the tree instead of the PROJECT_NAME. Since the tree basically has
@@ -1359,7 +1436,7 @@ DISABLE_INDEX = NO
# The default value is: NO. # The default value is: NO.
# This tag requires that the tag GENERATE_HTML is set to YES. # This tag requires that the tag GENERATE_HTML is set to YES.
GENERATE_TREEVIEW = NO GENERATE_TREEVIEW = YES
# The ENUM_VALUES_PER_LINE tag can be used to set the number of enum values that # 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. # doxygen will group on one line in the generated HTML documentation.
@@ -1378,7 +1455,7 @@ ENUM_VALUES_PER_LINE = 4
TREEVIEW_WIDTH = 250 TREEVIEW_WIDTH = 250
# When the EXT_LINKS_IN_WINDOW option is set to YES doxygen will open links to # 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. # external symbols imported via tag files in a separate window.
# The default value is: NO. # The default value is: NO.
# This tag requires that the tag GENERATE_HTML is set to YES. # This tag requires that the tag GENERATE_HTML is set to YES.
@@ -1407,7 +1484,7 @@ FORMULA_TRANSPARENT = YES
# Enable the USE_MATHJAX option to render LaTeX formulas using MathJax (see # Enable the USE_MATHJAX option to render LaTeX formulas using MathJax (see
# http://www.mathjax.org) which uses client side Javascript for the rendering # http://www.mathjax.org) which uses client side Javascript for the rendering
# instead of using prerendered bitmaps. Use this if you do not have LaTeX # 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 # 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 # enabled you may also need to install MathJax separately and configure the path
# to it using the MATHJAX_RELPATH option. # to it using the MATHJAX_RELPATH option.
@@ -1473,15 +1550,15 @@ MATHJAX_CODEFILE =
# The default value is: YES. # The default value is: YES.
# This tag requires that the tag GENERATE_HTML is set to YES. # This tag requires that the tag GENERATE_HTML is set to YES.
SEARCHENGINE = YES SEARCHENGINE = NO
# When the SERVER_BASED_SEARCH tag is enabled the search engine will be # 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 # implemented using a web server instead of a web client using Javascript. There
# are two flavours of web server based searching depending on the # are two flavors of web server based searching depending on the EXTERNAL_SEARCH
# EXTERNAL_SEARCH setting. When disabled, doxygen will generate a PHP script for # setting. When disabled, doxygen will generate a PHP script for searching and
# searching and an index file used by the script. When EXTERNAL_SEARCH is # an index file used by the script. When EXTERNAL_SEARCH is enabled the indexing
# enabled the indexing and searching needs to be provided by external tools. See # and searching needs to be provided by external tools. See the section
# the section "External Indexing and Searching" for details. # "External Indexing and Searching" for details.
# The default value is: NO. # The default value is: NO.
# This tag requires that the tag SEARCHENGINE is set to YES. # This tag requires that the tag SEARCHENGINE is set to YES.
@@ -1493,7 +1570,7 @@ SERVER_BASED_SEARCH = NO
# external search engine pointed to by the SEARCHENGINE_URL option to obtain the # external search engine pointed to by the SEARCHENGINE_URL option to obtain the
# search results. # search results.
# #
# Doxygen ships with an example indexer ( doxyindexer) and search engine # Doxygen ships with an example indexer (doxyindexer) and search engine
# (doxysearch.cgi) which are based on the open source search engine library # (doxysearch.cgi) which are based on the open source search engine library
# Xapian (see: http://xapian.org/). # Xapian (see: http://xapian.org/).
# #
@@ -1506,7 +1583,7 @@ EXTERNAL_SEARCH = NO
# The SEARCHENGINE_URL should point to a search engine hosted by a web server # 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. # which will return the search results when EXTERNAL_SEARCH is enabled.
# #
# Doxygen ships with an example indexer ( doxyindexer) and search engine # Doxygen ships with an example indexer (doxyindexer) and search engine
# (doxysearch.cgi) which are based on the open source search engine library # (doxysearch.cgi) which are based on the open source search engine library
# Xapian (see: http://xapian.org/). See the section "External Indexing and # Xapian (see: http://xapian.org/). See the section "External Indexing and
# Searching" for details. # Searching" for details.
@@ -1544,7 +1621,7 @@ EXTRA_SEARCH_MAPPINGS =
# Configuration options related to the LaTeX output # Configuration options related to the LaTeX output
#--------------------------------------------------------------------------- #---------------------------------------------------------------------------
# If the GENERATE_LATEX tag is set to YES doxygen will generate LaTeX output. # If the GENERATE_LATEX tag is set to YES, doxygen will generate LaTeX output.
# The default value is: YES. # The default value is: YES.
GENERATE_LATEX = NO GENERATE_LATEX = NO
@@ -1575,7 +1652,7 @@ LATEX_CMD_NAME = latex
MAKEINDEX_CMD_NAME = makeindex MAKEINDEX_CMD_NAME = makeindex
# If the COMPACT_LATEX tag is set to YES doxygen generates more compact LaTeX # 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 # documents. This may be useful for small projects and may help to save some
# trees in general. # trees in general.
# The default value is: NO. # The default value is: NO.
@@ -1593,9 +1670,12 @@ COMPACT_LATEX = NO
PAPER_TYPE = a4 PAPER_TYPE = a4
# The EXTRA_PACKAGES tag can be used to specify one or more LaTeX package names # The EXTRA_PACKAGES tag can be used to specify one or more LaTeX package names
# that should be included in the LaTeX output. To get the times font for # that should be included in the LaTeX output. The package can be specified just
# instance you can specify # by its name or with the correct syntax as to be used with the LaTeX
# EXTRA_PACKAGES=times # \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. # If left blank no extra packages will be included.
# This tag requires that the tag GENERATE_LATEX is set to YES. # This tag requires that the tag GENERATE_LATEX is set to YES.
@@ -1609,23 +1689,36 @@ EXTRA_PACKAGES =
# #
# Note: Only use a user-defined header if you know what you are doing! The # 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, # following commands have a special meaning inside the header: $title,
# $datetime, $date, $doxygenversion, $projectname, $projectnumber. Doxygen will # $datetime, $date, $doxygenversion, $projectname, $projectnumber,
# replace them by respectively the title of the page, the current date and time, # $projectbrief, $projectlogo. Doxygen will replace $title with the empty
# only the current date, the version number of doxygen, the project name (see # string, for the replacement values of the other commands the user is referred
# PROJECT_NAME), or the project number (see PROJECT_NUMBER). # to HTML_HEADER.
# This tag requires that the tag GENERATE_LATEX is set to YES. # This tag requires that the tag GENERATE_LATEX is set to YES.
LATEX_HEADER = LATEX_HEADER =
# The LATEX_FOOTER tag can be used to specify a personal LaTeX footer for the # 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 # generated LaTeX document. The footer should contain everything after the last
# chapter. If it is left blank doxygen will generate a standard footer. # 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! # 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. # This tag requires that the tag GENERATE_LATEX is set to YES.
LATEX_FOOTER = 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 # 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 # 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 # directory. Note that the files will be copied as-is; there are no commands or
@@ -1643,8 +1736,8 @@ LATEX_EXTRA_FILES =
PDF_HYPERLINKS = YES PDF_HYPERLINKS = YES
# If the LATEX_PDFLATEX tag is set to YES, doxygen will use pdflatex to generate # 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 # the PDF file directly from the LaTeX files. Set this option to YES, to get a
# higher quality PDF documentation. # higher quality PDF documentation.
# The default value is: YES. # The default value is: YES.
# This tag requires that the tag GENERATE_LATEX is set to YES. # This tag requires that the tag GENERATE_LATEX is set to YES.
@@ -1685,11 +1778,19 @@ LATEX_SOURCE_CODE = NO
LATEX_BIB_STYLE = plain 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 # Configuration options related to the RTF output
#--------------------------------------------------------------------------- #---------------------------------------------------------------------------
# If the GENERATE_RTF tag is set to YES doxygen will generate RTF output. The # 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 # RTF output is optimized for Word 97 and may not look too pretty with other RTF
# readers/editors. # readers/editors.
# The default value is: NO. # The default value is: NO.
@@ -1704,7 +1805,7 @@ GENERATE_RTF = NO
RTF_OUTPUT = rtf RTF_OUTPUT = rtf
# If the COMPACT_RTF tag is set to YES doxygen generates more compact 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 # documents. This may be useful for small projects and may help to save some
# trees in general. # trees in general.
# The default value is: NO. # The default value is: NO.
@@ -1741,11 +1842,21 @@ RTF_STYLESHEET_FILE =
RTF_EXTENSIONS_FILE = 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 # Configuration options related to the man page output
#--------------------------------------------------------------------------- #---------------------------------------------------------------------------
# If the GENERATE_MAN tag is set to YES doxygen will generate man pages for # If the GENERATE_MAN tag is set to YES, doxygen will generate man pages for
# classes and files. # classes and files.
# The default value is: NO. # The default value is: NO.
@@ -1769,6 +1880,13 @@ MAN_OUTPUT = man
MAN_EXTENSION = .3 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 # 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 # 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 # man page(s). These additional files only source the real man page, but without
@@ -1782,7 +1900,7 @@ MAN_LINKS = NO
# Configuration options related to the XML output # Configuration options related to the XML output
#--------------------------------------------------------------------------- #---------------------------------------------------------------------------
# If the GENERATE_XML tag is set to YES doxygen will generate an XML file that # 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. # captures the structure of the code including all documentation.
# The default value is: NO. # The default value is: NO.
@@ -1796,19 +1914,7 @@ GENERATE_XML = NO
XML_OUTPUT = xml XML_OUTPUT = xml
# The XML_SCHEMA tag can be used to specify a XML schema, which can be used by a # If the XML_PROGRAMLISTING tag is set to YES, doxygen will dump the program
# validating XML parser to check the syntax of the XML files.
# This tag requires that the tag GENERATE_XML is set to YES.
XML_SCHEMA =
# The XML_DTD tag can be used to specify a XML DTD, which can be used by a
# validating XML parser to check the syntax of the XML files.
# This tag requires that the tag GENERATE_XML is set to YES.
XML_DTD =
# If the XML_PROGRAMLISTING tag is set to YES doxygen will dump the program
# listings (including syntax highlighting and cross-referencing information) to # listings (including syntax highlighting and cross-referencing information) to
# the XML output. Note that enabling this will significantly increase the size # the XML output. Note that enabling this will significantly increase the size
# of the XML output. # of the XML output.
@@ -1821,7 +1927,7 @@ XML_PROGRAMLISTING = YES
# Configuration options related to the DOCBOOK output # Configuration options related to the DOCBOOK output
#--------------------------------------------------------------------------- #---------------------------------------------------------------------------
# If the GENERATE_DOCBOOK tag is set to YES doxygen will generate Docbook files # If the GENERATE_DOCBOOK tag is set to YES, doxygen will generate Docbook files
# that can be used to generate PDF. # that can be used to generate PDF.
# The default value is: NO. # The default value is: NO.
@@ -1835,14 +1941,23 @@ GENERATE_DOCBOOK = NO
DOCBOOK_OUTPUT = docbook 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 # Configuration options for the AutoGen Definitions output
#--------------------------------------------------------------------------- #---------------------------------------------------------------------------
# If the GENERATE_AUTOGEN_DEF tag is set to YES doxygen will generate an AutoGen # If the GENERATE_AUTOGEN_DEF tag is set to YES, doxygen will generate an
# Definitions (see http://autogen.sf.net) file that captures the structure of # AutoGen Definitions (see http://autogen.sf.net) file that captures the
# the code including all documentation. Note that this feature is still # structure of the code including all documentation. Note that this feature is
# experimental and incomplete at the moment. # still experimental and incomplete at the moment.
# The default value is: NO. # The default value is: NO.
GENERATE_AUTOGEN_DEF = NO GENERATE_AUTOGEN_DEF = NO
@@ -1851,7 +1966,7 @@ GENERATE_AUTOGEN_DEF = NO
# Configuration options related to the Perl module output # Configuration options related to the Perl module output
#--------------------------------------------------------------------------- #---------------------------------------------------------------------------
# If the GENERATE_PERLMOD tag is set to YES doxygen will generate a Perl module # 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. # file that captures the structure of the code including all documentation.
# #
# Note that this feature is still experimental and incomplete at the moment. # Note that this feature is still experimental and incomplete at the moment.
@@ -1859,7 +1974,7 @@ GENERATE_AUTOGEN_DEF = NO
GENERATE_PERLMOD = NO GENERATE_PERLMOD = NO
# If the PERLMOD_LATEX tag is set to YES doxygen will generate the necessary # 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 # Makefile rules, Perl scripts and LaTeX code to be able to generate PDF and DVI
# output from the Perl module output. # output from the Perl module output.
# The default value is: NO. # The default value is: NO.
@@ -1867,9 +1982,9 @@ GENERATE_PERLMOD = NO
PERLMOD_LATEX = NO PERLMOD_LATEX = NO
# If the PERLMOD_PRETTY tag is set to YES the Perl module output will be nicely # 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 # 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 # 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 # size of the Perl module output will be much smaller and Perl will parse it
# just the same. # just the same.
# The default value is: YES. # The default value is: YES.
@@ -1889,14 +2004,14 @@ PERLMOD_MAKEVAR_PREFIX =
# Configuration options related to the preprocessor # Configuration options related to the preprocessor
#--------------------------------------------------------------------------- #---------------------------------------------------------------------------
# If the ENABLE_PREPROCESSING tag is set to YES doxygen will evaluate all # If the ENABLE_PREPROCESSING tag is set to YES, doxygen will evaluate all
# C-preprocessor directives found in the sources and include files. # C-preprocessor directives found in the sources and include files.
# The default value is: YES. # The default value is: YES.
ENABLE_PREPROCESSING = YES ENABLE_PREPROCESSING = YES
# If the MACRO_EXPANSION tag is set to YES doxygen will expand all macro names # 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 # 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 # performed. Macro expansion can be done in a controlled way by setting
# EXPAND_ONLY_PREDEF to YES. # EXPAND_ONLY_PREDEF to YES.
# The default value is: NO. # The default value is: NO.
@@ -1912,7 +2027,7 @@ MACRO_EXPANSION = YES
EXPAND_ONLY_PREDEF = NO EXPAND_ONLY_PREDEF = NO
# If the SEARCH_INCLUDES tag is set to YES the includes files in the # If the SEARCH_INCLUDES tag is set to YES, the include files in the
# INCLUDE_PATH will be searched if a #include is found. # INCLUDE_PATH will be searched if a #include is found.
# The default value is: YES. # The default value is: YES.
# This tag requires that the tag ENABLE_PREPROCESSING is set to YES. # This tag requires that the tag ENABLE_PREPROCESSING is set to YES.
@@ -1955,9 +2070,9 @@ PREDEFINED += "NAMESPACE=@PACKAGE_NAME@"
EXPAND_AS_DEFINED = EXPAND_AS_DEFINED =
# If the SKIP_FUNCTION_MACROS tag is set to YES then doxygen's preprocessor will # If the SKIP_FUNCTION_MACROS tag is set to YES then doxygen's preprocessor will
# remove all refrences to function-like macros that are alone on a line, have an # remove all references to function-like macros that are alone on a line, have
# all uppercase name, and do not end with a semicolon. Such function macros are # an all uppercase name, and do not end with a semicolon. Such function macros
# typically used for boiler-plate code, and will confuse the parser if not # are typically used for boiler-plate code, and will confuse the parser if not
# removed. # removed.
# The default value is: YES. # The default value is: YES.
# This tag requires that the tag ENABLE_PREPROCESSING is set to YES. # This tag requires that the tag ENABLE_PREPROCESSING is set to YES.
@@ -1977,7 +2092,7 @@ SKIP_FUNCTION_MACROS = YES
# where loc1 and loc2 can be relative or absolute paths or URLs. See the # 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 # section "Linking to external documentation" for more information about the use
# of tag files. # of tag files.
# Note: Each tag file must have an unique name (where the name does NOT include # 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 # 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. # run, you must also specify the path to the tagfile here.
@@ -1989,20 +2104,21 @@ TAGFILES =
GENERATE_TAGFILE = @PACKAGE_NAME@.doxytag GENERATE_TAGFILE = @PACKAGE_NAME@.doxytag
# If the ALLEXTERNALS tag is set to YES all external class will be listed in the # If the ALLEXTERNALS tag is set to YES, all external class will be listed in
# class index. If set to NO only the inherited external classes will be listed. # the class index. If set to NO, only the inherited external classes will be
# listed.
# The default value is: NO. # The default value is: NO.
ALLEXTERNALS = NO ALLEXTERNALS = NO
# If the EXTERNAL_GROUPS tag is set to YES all external groups will be listed in # If the EXTERNAL_GROUPS tag is set to YES, all external groups will be listed
# the modules index. If set to NO, only the current project's groups will be # in the modules index. If set to NO, only the current project's groups will be
# listed. # listed.
# The default value is: YES. # The default value is: YES.
EXTERNAL_GROUPS = YES EXTERNAL_GROUPS = YES
# If the EXTERNAL_PAGES tag is set to YES all external pages will be listed in # 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 # the related pages index. If set to NO, only the current project's pages will
# be listed. # be listed.
# The default value is: YES. # The default value is: YES.
@@ -2019,7 +2135,7 @@ PERL_PATH = /usr/bin/perl
# Configuration options related to the dot tool # Configuration options related to the dot tool
#--------------------------------------------------------------------------- #---------------------------------------------------------------------------
# If the CLASS_DIAGRAMS tag is set to YES doxygen will generate a class diagram # 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 # (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 # 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 # disabled, but it is recommended to install and use dot, since it yields more
@@ -2044,7 +2160,7 @@ MSCGEN_PATH =
DIA_PATH = DIA_PATH =
# If set to YES, the inheritance and collaboration graphs will hide inheritance # 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. # and usage relations if the target is undocumented or is not a class.
# The default value is: YES. # The default value is: YES.
@@ -2055,7 +2171,7 @@ HIDE_UNDOC_RELATIONS = NO
# http://www.graphviz.org/), a graph visualization toolkit from AT&T and Lucent # 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 # Bell Labs. The other options in this section have no effect if this option is
# set to NO # set to NO
# The default value is: NO. # The default value is: YES.
HAVE_DOT = YES HAVE_DOT = YES
@@ -2069,7 +2185,7 @@ HAVE_DOT = YES
DOT_NUM_THREADS = 0 DOT_NUM_THREADS = 0
# When you want a differently looking font n the dot files that doxygen # 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 # 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 # 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 # standard location or by setting the DOTFONTPATH environment variable or by
@@ -2117,7 +2233,7 @@ COLLABORATION_GRAPH = YES
GROUP_GRAPHS = YES GROUP_GRAPHS = YES
# If the UML_LOOK tag is set to YES doxygen will generate inheritance and # 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 # collaboration diagrams in a style similar to the OMG's Unified Modeling
# Language. # Language.
# The default value is: NO. # The default value is: NO.
@@ -2169,7 +2285,8 @@ INCLUDED_BY_GRAPH = YES
# #
# Note that enabling this option will significantly increase the time of a run. # 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 # So in most cases it will be better to enable call graphs for selected
# functions only using the \callgraph command. # functions only using the \callgraph command. Disabling a call graph can be
# accomplished by means of the command \hidecallgraph.
# The default value is: NO. # The default value is: NO.
# This tag requires that the tag HAVE_DOT is set to YES. # This tag requires that the tag HAVE_DOT is set to YES.
@@ -2180,7 +2297,8 @@ CALL_GRAPH = NO
# #
# Note that enabling this option will significantly increase the time of a run. # 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 # So in most cases it will be better to enable caller graphs for selected
# functions only using the \callergraph command. # functions only using the \callergraph command. Disabling a caller graph can be
# accomplished by means of the command \hidecallergraph.
# The default value is: NO. # The default value is: NO.
# This tag requires that the tag HAVE_DOT is set to YES. # This tag requires that the tag HAVE_DOT is set to YES.
@@ -2203,11 +2321,17 @@ GRAPHICAL_HIERARCHY = YES
DIRECTORY_GRAPH = YES DIRECTORY_GRAPH = YES
# The DOT_IMAGE_FORMAT tag can be used to set the image format of the images # The DOT_IMAGE_FORMAT tag can be used to set the image format of the images
# generated by dot. # 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 # 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 # to make the SVG files visible in IE 9+ (other browsers do not have this
# requirement). # requirement).
# Possible values are: png, jpg, gif and svg. # Possible values are: png, png:cairo, png:cairo:cairo, png:cairo:gd, png:gd,
# png:gd:gd, jpg, jpg:cairo, jpg:cairo:gd, jpg:gd, jpg:gd:gd, gif, gif:cairo,
# gif:cairo:gd, gif:gd, gif:gd:gd, 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. # The default value is: png.
# This tag requires that the tag HAVE_DOT is set to YES. # This tag requires that the tag HAVE_DOT is set to YES.
@@ -2250,6 +2374,24 @@ MSCFILE_DIRS =
DIAFILE_DIRS = 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 = "@top_srcdir@/doc/plantuml.jar"
# When using plantuml, the PLANTUML_CFG_FILE tag can be used to specify a
# configuration file for plantuml.
PLANTUML_CFG_FILE =
# 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 # 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 # 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 # larger than this value, doxygen will truncate the graph, which is visualized
@@ -2286,14 +2428,14 @@ MAX_DOT_GRAPH_DEPTH = 0
DOT_TRANSPARENT = YES DOT_TRANSPARENT = YES
# Set the DOT_MULTI_TARGETS tag to YES allow dot to generate multiple output # 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 # 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 # makes dot run faster, but since only newer versions of dot (>1.8.10) support
# this, this feature is disabled by default. # this, this feature is disabled by default.
# The default value is: NO. # The default value is: NO.
# This tag requires that the tag HAVE_DOT is set to YES. # This tag requires that the tag HAVE_DOT is set to YES.
DOT_MULTI_TARGETS = YES DOT_MULTI_TARGETS = NO
# If the GENERATE_LEGEND tag is set to YES doxygen will generate a legend page # 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 # explaining the meaning of the various boxes and arrows in the dot generated
@@ -2303,7 +2445,7 @@ DOT_MULTI_TARGETS = YES
GENERATE_LEGEND = YES GENERATE_LEGEND = YES
# If the DOT_CLEANUP tag is set to YES doxygen will remove the intermediate dot # If the DOT_CLEANUP tag is set to YES, doxygen will remove the intermediate dot
# files that are used to generate the various graphs. # files that are used to generate the various graphs.
# The default value is: YES. # The default value is: YES.
# This tag requires that the tag HAVE_DOT is set to YES. # This tag requires that the tag HAVE_DOT is set to YES.

View File

@@ -1,8 +1,10 @@
## @id $Id$ ## @id $Id$
# ##
# This file has been added by bootstrap.sh on Mon, 13 July 2015 14:22:13 +0200 ## This file has been added:
# Feel free to change it or even remove and rebuild it, up to your needs ## - by bootstrap.sh
# ## - on Wed, 21 November 2018 21:41:32 +0100
## Feel free to change it or even remove and rebuild it, up to your needs
##
## 1 2 3 4 5 6 7 8 ## 1 2 3 4 5 6 7 8
## 45678901234567890123456789012345678901234567890123456789012345678901234567890 ## 45678901234567890123456789012345678901234567890123456789012345678901234567890

View File

@@ -1,13 +1,26 @@
## @id $Id$ ## @id $Id$
# ##
# This file has been added by bootstrap.sh on Fri, 31 July 2015 08:57:51 +0200 ## This file has been added:
# Feel free to change it or even remove and rebuild it, up to your needs ## - by bootstrap.sh
# ## - on Wed, 21 November 2018 16:27:35 +0100
## Feel free to change it or even remove and rebuild it, up to your needs
##
## 1 2 3 4 5 6 7 8 ## 1 2 3 4 5 6 7 8
## 45678901234567890123456789012345678901234567890123456789012345678901234567890 ## 45678901234567890123456789012345678901234567890123456789012345678901234567890
SUBDIRS = src test doc examples SUBDIRS = src test doc examples
doc_DATA = AUTHORS NEWS README COPYING INSTALL ChangeLog desktopdir = ${datadir}/applications
desktop_DATA = @PACKAGE_DESKTOP@
dist_pkgdata_DATA = @PACKAGE_ICON@
dist_noinst_DATA = ax_check_qt.m4 bootstrap.sh \
resolve-rpmbuilddeps.sh autogen.sh \
ax_cxx_compile_stdcxx.m4 build-in-docker.sh \
build-resource-file.sh \
ax_init_standard_project.m4 \
mac-create-app-bundle.sh resolve-debbuilddeps.sh \
dependency-graph.sh template.sh \
sql-to-dot.sed
dist_doc_DATA = AUTHORS NEWS README COPYING INSTALL ChangeLog
MAINTAINERCLEANFILES = makefile.in MAINTAINERCLEANFILES = makefile.in

View File

@@ -23,16 +23,17 @@
#include <cassert> #include <cassert>
#include <iostream> #include <iostream>
#include <iomanip> #include <iomanip>
class MethodTrace { namespace xml {
class MethodTrace {
public: public:
MethodTrace(const void* addr, const std::string& name) throw(): MethodTrace(const void* addr, const std::string& name) noexcept:
_addr(addr), _name(name) { _addr(addr), _name(name) {
std::clog<<std::hex<<std::setw(15)<<_addr<<": " std::clog<<std::hex<<std::setw(15)<<_addr<<": "
<<std::dec<<std::setw(2+_level) <<std::dec<<std::setw(2+_level)
<<std::setfill(' ')<<"\\ "<<_name<<std::endl; <<std::setfill(' ')<<"\\ "<<_name<<std::endl;
++_level; ++_level;
} }
~MethodTrace() throw() { ~MethodTrace() noexcept {
--_level; --_level;
std::clog<<std::hex<<std::setw(15)<<_addr<<": "<<std::dec std::clog<<std::hex<<std::setw(15)<<_addr<<": "<<std::dec
<<std::setw(2+_level)<<std::setfill(' ') <<std::setw(2+_level)<<std::setfill(' ')
@@ -42,7 +43,7 @@ class MethodTrace {
const void* _addr; const void* _addr;
const std::string _name; const std::string _name;
static unsigned int _level; static unsigned int _level;
}; };
#define TRACE MethodTrace XXX_METHOD(this, __PRETTY_FUNCTION__) #define TRACE MethodTrace XXX_METHOD(this, __PRETTY_FUNCTION__)
#define LOG(X) std::clog<<__PRETTY_FUNCTION__<<"\t**** "<<X<<std::endl #define LOG(X) std::clog<<__PRETTY_FUNCTION__<<"\t**** "<<X<<std::endl
#define ASSERT(X, Y) { \ #define ASSERT(X, Y) { \
@@ -50,8 +51,9 @@ class MethodTrace {
LOG(X); \ LOG(X); \
} \ } \
assert(Y); \ assert(Y); \
}
//! @endcond
} }
//! @endcond
/*! @mainpage /*! @mainpage
@@ -495,11 +497,11 @@ namespace xml {
//---------------------------------------------------------------------------- //----------------------------------------------------------------------------
class exception: public std::exception { class exception: public std::exception {
public: public:
exception(std::string reason) throw(); exception(std::string reason) noexcept;
exception(std::string reason, const Node& t) throw(); exception(std::string reason, const Node& t) noexcept;
~exception() throw(); ~exception() noexcept;
void line(unsigned long line) throw(); void line(unsigned long line) noexcept;
const char* what() const throw(); const char* what() const noexcept;
private: private:
std::string _what; std::string _what;
Node* _node; Node* _node;
@@ -518,7 +520,7 @@ namespace xml {
//---------------------------------------------------------------------------- //----------------------------------------------------------------------------
class empty_attribute_list: public exception { class empty_attribute_list: public exception {
public: public:
empty_attribute_list(const std::string& name) throw(): empty_attribute_list(const std::string& name) noexcept:
exception("list of attribute is empty access to first element failed" exception("list of attribute is empty access to first element failed"
"\nattribute: "+name) { "\nattribute: "+name) {
} }
@@ -526,60 +528,60 @@ namespace xml {
//---------------------------------------------------------------------------- //----------------------------------------------------------------------------
class factory_not_valid: public exception { class factory_not_valid: public exception {
public: public:
factory_not_valid() throw(): factory_not_valid() noexcept:
exception("a factory must be given a template node") { exception("a factory must be given a template node") {
} }
}; };
//---------------------------------------------------------------------------- //----------------------------------------------------------------------------
class no_parent: public exception { class no_parent: public exception {
public: public:
no_parent(const Node& t) throw(): exception("node has no parent", t) {} no_parent(const Node& t) noexcept: exception("node has no parent", t) {}
}; };
//---------------------------------------------------------------------------- //----------------------------------------------------------------------------
class tag_expected: public exception { class tag_expected: public exception {
public: public:
tag_expected(const Node& t, const std::string& txt) throw(): tag_expected(const Node& t, const std::string& txt) noexcept:
exception("tag ('<') expected, text not allowed\ntext: "+txt, t) {} exception("tag ('<') expected, text not allowed\ntext: "+txt, t) {}
}; };
//---------------------------------------------------------------------------- //----------------------------------------------------------------------------
class type_mismatch: public exception { class type_mismatch: public exception {
public: public:
type_mismatch(const Node& t, const std::string& txt, type_mismatch(const Node& t, const std::string& txt,
const std::string& comment) throw(): const std::string& comment) noexcept:
exception("wrong type, text contains mismatching character\n"+comment exception("wrong type, text contains mismatching character\n"+comment
+"\ntext: "+txt, t) {} +"\ntext: "+txt, t) {}
}; };
//---------------------------------------------------------------------------- //----------------------------------------------------------------------------
class access_error: public exception { class access_error: public exception {
public: public:
access_error(const Node& t, const std::string& name) throw(); access_error(const Node& t, const std::string& name) noexcept;
~access_error() throw() {} ~access_error() noexcept {}
const char* what() const throw(); const char* what() const noexcept;
private: private:
std::string _name; std::string _name;
}; };
//---------------------------------------------------------------------------- //----------------------------------------------------------------------------
class out_of_range: public exception { class out_of_range: public exception {
public: public:
out_of_range(const Node& t, size_t pos) throw(); out_of_range(const Node& t, size_t pos) noexcept;
~out_of_range() throw() {} ~out_of_range() noexcept {}
const char* what() const throw(); const char* what() const noexcept;
private: private:
size_t _pos; size_t _pos;
}; };
//---------------------------------------------------------------------------- //----------------------------------------------------------------------------
class cannot_have_children: public exception { class cannot_have_children: public exception {
public: public:
cannot_have_children(const Node& parent, const Node& child) throw(); cannot_have_children(const Node& parent, const Node& child) noexcept;
~cannot_have_children() throw(); ~cannot_have_children() noexcept;
const char* what() const throw(); const char* what() const noexcept;
private: private:
Node* _child; Node* _child;
}; };
//---------------------------------------------------------------------------- //----------------------------------------------------------------------------
class attribute_not_available: public exception { class attribute_not_available: public exception {
public: public:
attribute_not_available(const Node& t, const std::string& attr) throw(): attribute_not_available(const Node& t, const std::string& attr) noexcept:
exception("attribute \""+attr+"\" not set", t) { exception("attribute \""+attr+"\" not set", t) {
} }
}; };
@@ -587,11 +589,11 @@ namespace xml {
class stream_error: public exception { class stream_error: public exception {
public: public:
stream_error(const std::string& reason, const Node& t, stream_error(const std::string& reason, const Node& t,
std::istream& is, const Tag& tag, char c=0) throw(); std::istream& is, const Tag& tag, char c=0) noexcept;
stream_error(const std::string& reason, const Node& t, stream_error(const std::string& reason, const Node& t,
std::istream& is) throw(); std::istream& is) noexcept;
~stream_error() throw(); ~stream_error() noexcept;
const char* what() const throw(); const char* what() const noexcept;
private: private:
std::istream::streampos _pos; std::istream::streampos _pos;
Tag* _tag; Tag* _tag;
@@ -601,7 +603,7 @@ namespace xml {
class wrong_end_tag: public stream_error { class wrong_end_tag: public stream_error {
public: public:
wrong_end_tag(const Node& t, std::istream& is, const Tag& tag, char c=0) wrong_end_tag(const Node& t, std::istream& is, const Tag& tag, char c=0)
throw(): noexcept:
stream_error("mismatching end tag", t, is, tag, c) { stream_error("mismatching end tag", t, is, tag, c) {
} }
}; };
@@ -609,7 +611,7 @@ namespace xml {
class missing_end_tag: public stream_error { class missing_end_tag: public stream_error {
public: public:
missing_end_tag(const Node& t, std::istream& is, const Tag& tag, char c=0) missing_end_tag(const Node& t, std::istream& is, const Tag& tag, char c=0)
throw(): noexcept:
stream_error("missing end tag, end of file reached", t, is, tag, c) { stream_error("missing end tag, end of file reached", t, is, tag, c) {
} }
}; };
@@ -617,7 +619,7 @@ namespace xml {
class wrong_start_tag: public stream_error { class wrong_start_tag: public stream_error {
public: public:
wrong_start_tag(const Node& t, std::istream& is, const Tag& tag, char c=0) wrong_start_tag(const Node& t, std::istream& is, const Tag& tag, char c=0)
throw(): noexcept:
stream_error("start tag does not match expected tag", t, is, tag, c) { stream_error("start tag does not match expected tag", t, is, tag, c) {
} }
}; };
@@ -626,7 +628,7 @@ namespace xml {
public: public:
second_slash_in_tag(const Node& t, std::istream& is, const Tag& tag, second_slash_in_tag(const Node& t, std::istream& is, const Tag& tag,
char c=0) char c=0)
throw(): noexcept:
stream_error("a tag may have no more than one slash", t, is, tag, c) { stream_error("a tag may have no more than one slash", t, is, tag, c) {
} }
}; };
@@ -635,7 +637,7 @@ namespace xml {
public: public:
character_after_slash(const Node& t, std::istream& is, const Tag& tag, character_after_slash(const Node& t, std::istream& is, const Tag& tag,
char c=0) char c=0)
throw(): noexcept:
stream_error("unexpected character after empty-slash", stream_error("unexpected character after empty-slash",
t, is, tag, c) { t, is, tag, c) {
} }
@@ -644,7 +646,7 @@ namespace xml {
class attributes_in_end_tag: public stream_error { class attributes_in_end_tag: public stream_error {
public: public:
attributes_in_end_tag(const Node& t, std::istream& is, const Tag& tag) attributes_in_end_tag(const Node& t, std::istream& is, const Tag& tag)
throw(): noexcept:
stream_error("attributes are not allowed in end tags",t, is, tag) { stream_error("attributes are not allowed in end tags",t, is, tag) {
} }
}; };
@@ -653,7 +655,7 @@ namespace xml {
public: public:
attribute_value_not_quoted(const Node& t, std::istream& is, attribute_value_not_quoted(const Node& t, std::istream& is,
const Tag& tag, const Tag& tag,
char c, std::string attr) throw(): char c, std::string attr) noexcept:
stream_error("attribute values must be quoted (\")\nattribute: "+attr, stream_error("attribute values must be quoted (\")\nattribute: "+attr,
t, is, tag, c) { t, is, tag, c) {
} }
@@ -662,7 +664,7 @@ namespace xml {
class duplicate_attribute: public stream_error { class duplicate_attribute: public stream_error {
public: public:
duplicate_attribute(const Node& t, std::istream& is, const Tag& tag, duplicate_attribute(const Node& t, std::istream& is, const Tag& tag,
std::string attr) throw(): std::string attr) noexcept:
stream_error("attribute duplicated\nattribute: "+attr, stream_error("attribute duplicated\nattribute: "+attr,
t, is, tag, 0) { t, is, tag, 0) {
} }
@@ -671,7 +673,7 @@ namespace xml {
class illegal_attribute: public stream_error { class illegal_attribute: public stream_error {
public: public:
illegal_attribute(const Node& t, std::istream& is, const Tag& tag, illegal_attribute(const Node& t, std::istream& is, const Tag& tag,
std::string attr) throw(): std::string attr) noexcept:
stream_error("illegal attribute found\nattribute: "+attr, stream_error("illegal attribute found\nattribute: "+attr,
t, is, tag, 0) { t, is, tag, 0) {
} }
@@ -680,7 +682,7 @@ namespace xml {
class mandatory_attribute_missing: public stream_error { class mandatory_attribute_missing: public stream_error {
public: public:
mandatory_attribute_missing(const Node& t, std::istream& is, mandatory_attribute_missing(const Node& t, std::istream& is,
const Tag& tag, std::string attr) throw(): const Tag& tag, std::string attr) noexcept:
stream_error("mandatory attribute missing\nattribute: "+attr, stream_error("mandatory attribute missing\nattribute: "+attr,
t, is, tag, 0) { t, is, tag, 0) {
} }
@@ -691,14 +693,14 @@ namespace xml {
wrong_node_number(const Node& t, std::istream& is, wrong_node_number(const Node& t, std::istream& is,
const std::string& name, const std::string& name,
unsigned long num, unsigned long num,
unsigned long min, unsigned long max) throw(): unsigned long min, unsigned long max) noexcept:
stream_error("wrong number of child nodes\nname of child: "+name stream_error("wrong number of child nodes\nname of child: "+name
+"\nnumber of nodes: "+conv(num) +"\nnumber of nodes: "+conv(num)
+"\nminimuml number: "+conv(min) +"\nminimuml number: "+conv(min)
+"\nmaximum number: "+conv(max), t, is) { +"\nmaximum number: "+conv(max), t, is) {
} }
private: private:
static std::string conv(unsigned long i) throw() { static std::string conv(unsigned long i) noexcept {
std::stringstream ss; std::stringstream ss;
ss<<i; ss<<i;
return ss.str(); return ss.str();
@@ -730,29 +732,28 @@ namespace xml {
@note Simply use xml::Attr instead of xml::Attributes::Value. */ @note Simply use xml::Attr instead of xml::Attributes::Value. */
class Value: public value_type { class Value: public value_type {
public: public:
Value(const value_type& o) throw(); Value(const value_type& o) noexcept;
Value(const std::string& name) throw(); Value(const std::string& name) noexcept;
Value(const std::string& name, const std::string& namevalue) throw(); Value(const std::string& name, const std::string& namevalue) noexcept;
Value& operator=(const std::string& value) throw(); Value& operator=(const std::string& value) noexcept;
const std::string& name() const throw(); const std::string& name() const noexcept;
const std::string& value() const throw(); const std::string& value() const noexcept;
std::string& value() throw(); std::string& value() noexcept;
operator bool() const throw(); operator bool() const noexcept;
bool toBool() const throw(); bool toBool() const noexcept;
operator unsigned long() const throw(); operator unsigned long() const noexcept;
unsigned long toNumber() const throw(); unsigned long toNumber() const noexcept;
operator List() const throw(); operator List() const noexcept;
List toList(const std::string& separators=" \t\n\r") const throw(); List toList(const std::string& separators=" \t\n\r") const noexcept;
std::string front(const std::string& separators=" \t\n\r") const std::string front(const std::string& separators=" \t\n\r") const;
throw(empty_attribute_list);
private: private:
Value(); // not implemented, key must always be given Value(); // not implemented, key must always be given
}; };
Attributes() throw(); Attributes() noexcept;
Attributes(const std::string& empty) throw(); Attributes(const std::string& empty) noexcept;
Attributes(const std::string& key, const std::string& value) throw(); Attributes(const std::string& key, const std::string& value) noexcept;
Attributes& operator<<(const Value& v) throw(); Attributes& operator<<(const Value& v) noexcept;
Attributes& operator<<(const std::string& key) throw(); Attributes& operator<<(const std::string& key) noexcept;
}; };
//! Simplification: Use xml::Attr instead of xml::Attributes::Value. //! Simplification: Use xml::Attr instead of xml::Attributes::Value.
typedef Attributes::Value Attr; typedef Attributes::Value Attr;
@@ -780,63 +781,59 @@ namespace xml {
public: public:
typedef Contents::size_type size_type; typedef Contents::size_type size_type;
typedef std::vector<Node*> List; typedef std::vector<Node*> List;
Node(std::string name, size_type min=0, size_type max=0) throw(); Node(std::string name, size_type min=0, size_type max=0) noexcept;
Node(const Node& o) throw(); Node(const Node& o) noexcept;
virtual ~Node() throw(); virtual ~Node() noexcept;
virtual Node& operator=(const Node& o) throw(); virtual Node& operator=(const Node& o) noexcept;
virtual std::unique_ptr<Node> clone() const throw(); virtual std::unique_ptr<Node> clone() const noexcept;
virtual std::ostream& out(std::ostream& o, unsigned int level=0) const virtual std::ostream& out(std::ostream& o, unsigned int level=0) const
throw(); noexcept;
virtual std::string text() const throw(); virtual std::string text() const noexcept;
virtual Node& text(const std::string& txt) throw(tag_expected, virtual Node& text(const std::string& txt);
type_mismatch); virtual Node& append(const Node& o);
virtual Node& append(const Node& o) throw(cannot_have_children); virtual Node& remove(Node& n);
virtual Node& remove(Node& n) throw(access_error); virtual Node& remove(const std::string& n);
virtual Node& remove(const std::string& n) throw(access_error); virtual Node& remove(size_type n);
virtual Node& remove(size_type n) throw(out_of_range); virtual Node& set(const Attributes& o) noexcept;
virtual Node& set(const Attributes& o) throw();
Node& clear() throw (); Node& clear() throw ();
std::string name() const throw(); std::string name() const noexcept;
Node& name(const std::string& n) throw(); Node& name(const std::string& n) noexcept;
Node& min(size_type m) throw(); Node& min(size_type m) noexcept;
size_type min() const throw(); size_type min() const noexcept;
Node& max(size_type m) throw(); Node& max(size_type m) noexcept;
size_type max() const throw(); size_type max() const noexcept;
bool isChild() const throw(); bool isChild() const noexcept;
Node& parent() const throw(no_parent); Node& parent() const;
bool hasAttr(const std::string& name) const throw(); bool hasAttr(const std::string& name) const noexcept;
Node& attr(const std::string& name, bool mandatory) throw(); Node& attr(const std::string& name, bool mandatory) noexcept;
Node& attr(const std::string& name, const std::string& deflt) throw(); Node& attr(const std::string& name, const std::string& deflt) noexcept;
std::string attr(const std::string& name) const throw(); std::string attr(const std::string& name) const noexcept;
std::string& attr(const std::string& name) throw(); std::string& attr(const std::string& name) noexcept;
const Attributes::Value attribute(const std::string& name) const Attributes::Value attribute(const std::string& name) const;
const throw(attribute_not_available); const Attributes& attributes() const noexcept;
const Attributes& attributes() const throw(); Attributes& attributes() noexcept;
Attributes& attributes() throw(); const Node& first() const;
const Node& first() const throw(out_of_range); Node& first();
Node& first() throw(out_of_range); const Node& last() const;
const Node& last() const throw(out_of_range); Node& last();
Node& last() throw(out_of_range); Node& limits(size_type min=0, size_type max=0) noexcept;
Node& limits(size_type min=0, size_type max=0) throw(); List list(const std::string& name) const noexcept;
List list(const std::string& name) const throw(); bool operator()(const std::string& child) const noexcept;
bool operator()(const std::string& child) const throw(); Node& operator<<(const Node& o);
Node& operator<<(const Node& o) throw(cannot_have_children); Node& operator<<(const Attributes& o) noexcept;
Node& operator<<(const Attributes& o) throw(); size_type children() const noexcept;
size_type children() const throw(); const Node& operator[](size_type child) const;
const Node& operator[](size_type child) const throw(out_of_range); Node& operator[](size_type child);
Node& operator[](size_type child) throw(out_of_range); const Node& operator[](const std::string& child) const;
const Node& operator[](const std::string& child) const Node& operator[](const std::string& child);
throw(access_error); std::string operator*() const noexcept;
Node& operator[](const std::string& child) throw(access_error); Node& operator=(const std::string& contents);
std::string operator*() const throw(); friend std::ostream& operator<<(std::ostream& o, const Node& t) noexcept;
Node& operator=(const std::string& contents) throw(tag_expected,
type_mismatch);
friend std::ostream& operator<<(std::ostream& o, const Node& t) throw();
protected: protected:
Attributes _attributes; Attributes _attributes;
private: private:
Node* find(const std::string& child) const throw(); Node* find(const std::string& child) const noexcept;
virtual std::unique_ptr<Node> clone(Node* p) const throw(); virtual std::unique_ptr<Node> clone(Node* p) const noexcept;
Node(); // not implemented Node(); // not implemented
Contents _contents; Contents _contents;
std::string _name; std::string _name;
@@ -850,31 +847,30 @@ namespace xml {
class String: public Node { class String: public Node {
public: public:
String(std::string name, String(std::string name,
Node::size_type min=0, Node::size_type max=0) throw(); Node::size_type min=0, Node::size_type max=0) noexcept;
String(std::string name, const std::string& text, String(std::string name, const std::string& text,
Node::size_type min=0, Node::size_type max=0) throw(); Node::size_type min=0, Node::size_type max=0) noexcept;
virtual ~String() throw() {} virtual ~String() noexcept {}
virtual std::unique_ptr<Node> clone() const throw(); virtual std::unique_ptr<Node> clone() const noexcept;
virtual std::string text() const throw(); virtual std::string text() const noexcept;
virtual String& text(const std::string& txt) throw(tag_expected, virtual String& text(const std::string& txt);
type_mismatch);
virtual std::ostream& out(std::ostream& o, unsigned int level=0) const virtual std::ostream& out(std::ostream& o, unsigned int level=0) const
throw(); noexcept;
virtual String& append(const Node& o) throw(cannot_have_children); virtual String& append(const Node& o);
Node& operator=(const std::string& contents) throw(); Node& operator=(const std::string& contents) noexcept;
operator std::string() const throw(); operator std::string() const noexcept;
operator bool() const throw(); operator bool() const noexcept;
operator char() const throw(); operator char() const noexcept;
operator signed char() const throw(); operator signed char() const noexcept;
operator unsigned char() const throw(); operator unsigned char() const noexcept;
operator signed short() const throw(); operator signed short() const noexcept;
operator unsigned short() const throw(); operator unsigned short() const noexcept;
operator signed int() const throw(); operator signed int() const noexcept;
operator unsigned int() const throw(); operator unsigned int() const noexcept;
operator signed long() const throw(); operator signed long() const noexcept;
operator unsigned long() const throw(); operator unsigned long() const noexcept;
operator float() const throw(); operator float() const noexcept;
operator double() const throw(); operator double() const noexcept;
protected: protected:
std::string _text; std::string _text;
}; };
@@ -884,13 +880,12 @@ namespace xml {
class UnsignedInteger: public String { class UnsignedInteger: public String {
public: public:
UnsignedInteger(std::string name, unsigned long i=0, UnsignedInteger(std::string name, unsigned long i=0,
size_type min=0, size_type max=0) throw(); size_type min=0, size_type max=0) noexcept;
virtual std::unique_ptr<Node> clone() const throw(); virtual std::unique_ptr<Node> clone() const noexcept;
virtual ~UnsignedInteger() throw() {} virtual ~UnsignedInteger() noexcept {}
virtual UnsignedInteger& text(const std::string& txt) virtual UnsignedInteger& text(const std::string& txt);
throw(tag_expected, type_mismatch); unsigned long number() const noexcept;
unsigned long number() const throw(); static unsigned long number(const Node& node) noexcept;
static unsigned long number(const Node& node) throw();
}; };
//---------------------------------------------------------------------------- //----------------------------------------------------------------------------
@@ -942,26 +937,19 @@ namespace xml {
@endverbatim */ @endverbatim */
class Factory { class Factory {
public: public:
Factory(const Node& t) throw(); Factory(const Node& t) noexcept;
Factory() throw(); Factory() noexcept;
Factory& operator=(const Node& t) throw(); Factory& operator=(const Node& t) noexcept;
Factory& append(const Node& node) throw(); Factory& append(const Node& node) noexcept;
const Node& operator*() const throw(factory_not_valid); const Node& operator*() const;
const Node*const operator->() const throw(factory_not_valid); const Node* operator->() const;
operator bool() const throw(); operator bool() const noexcept;
friend std::ostream& operator<<(std::ostream& os, friend std::ostream& operator<<(std::ostream& os,
const Factory& factory) const Factory& factory);
throw(factory_not_valid);
static std::ostream& print(std::ostream& os, const Node& node, static std::ostream& print(std::ostream& os, const Node& node,
unsigned int level=0) throw(); unsigned int level=0) noexcept;
std::unique_ptr<Node> read(std::istream& is) std::unique_ptr<Node> read(std::istream& is);
throw(wrong_end_tag, wrong_start_tag, tag_expected, type_mismatch, void reset() noexcept;
second_slash_in_tag, character_after_slash,
missing_end_tag, attribute_value_not_quoted, access_error,
duplicate_attribute, attributes_in_end_tag,
illegal_attribute, mandatory_attribute_missing,
wrong_node_number, factory_not_valid);
void reset() throw();
private: private:
friend class stream_error; friend class stream_error;
friend class Serialize; friend class Serialize;
@@ -969,33 +957,21 @@ namespace xml {
template<class T> friend class Container; template<class T> friend class Container;
template<class T> friend class AssociativeContainer; template<class T> friend class AssociativeContainer;
template<class T> friend class AssociativeMap; template<class T> friend class AssociativeMap;
Node& operator*() throw(factory_not_valid); Node& operator*();
Node*const operator->() throw(factory_not_valid); Node* operator->();
bool ws(char c) throw(); bool ws(char c) noexcept;
std::unique_ptr<Node> read(std::istream& is, const Node& position) std::unique_ptr<Node> read(std::istream& is, const Node& position);
throw(wrong_end_tag, wrong_start_tag, tag_expected, type_mismatch,
second_slash_in_tag, character_after_slash,
missing_end_tag,
attribute_value_not_quoted, access_error, duplicate_attribute,
attributes_in_end_tag,
illegal_attribute, mandatory_attribute_missing,
wrong_node_number);
std::unique_ptr<Node> checkChildren(const xml::Node& tpl, std::unique_ptr<Node> checkChildren(const xml::Node& tpl,
std::unique_ptr<Node> node, std::unique_ptr<Node> node,
std::istream& is) const std::istream& is) const;
throw(wrong_node_number); Tag tag(std::istream& is, const Node& position);
Tag tag(std::istream& is, const Node& position)
throw(second_slash_in_tag, wrong_start_tag, character_after_slash,
missing_end_tag, attributes_in_end_tag, tag_expected,
attribute_value_not_quoted, access_error, duplicate_attribute,
illegal_attribute, mandatory_attribute_missing);
Node _template; Node _template;
unsigned long _line; unsigned long _line;
long _open; long _open;
}; };
//@} //@}
/*! @defgroup serialization Class Serialization /*! @defgroup groupserialization Class Serialization
@section serIntro Introduction @section serIntro Introduction
@@ -1096,7 +1072,7 @@ namespace xml {
- ... the child does not inherit xml::Serialize, but a child of it - ... the child does not inherit xml::Serialize, but a child of it
- ... the child must first call xml::Serialize::initXmlMembers of - ... the child must first call xml::Serialize::initXmlMembers of
the parent in it's own xml::Serialize::initXmlMembers */ the parent in it's own xml::Serialize::initXmlMembers */
//! @addtogroup serialization //! @addtogroup groupserialization
//@{ //@{
class Serialize { class Serialize {
@@ -1105,50 +1081,50 @@ namespace xml {
typedef bool(*ToNodeFunc)(const Any, xml::Node&); typedef bool(*ToNodeFunc)(const Any, xml::Node&);
typedef bool(*ClearFunc)(Any); typedef bool(*ClearFunc)(Any);
//! You must call Serialize::className() if you use this constructor! //! You must call Serialize::className() if you use this constructor!
Serialize() throw(); Serialize() noexcept;
Serialize(const std::string& className) throw(); Serialize(const std::string& className) noexcept;
Serialize(const Serialize& other) throw(); Serialize(const Serialize& other) noexcept;
virtual ~Serialize(); virtual ~Serialize();
Serialize& operator=(const Serialize& other) throw(); Serialize& operator=(const Serialize& other) noexcept;
virtual Serialize& className(const std::string& name) throw(); virtual Serialize& className(const std::string& name) noexcept;
Serialize& persist(Serialize& member, Serialize& persist(Serialize& member,
const std::string& name) throw(); const std::string& name) noexcept;
Serialize& persist(bool& member, Serialize& persist(bool& member,
const std::string& name) throw(); const std::string& name) noexcept;
Serialize& persist(char& member, Serialize& persist(char& member,
const std::string& name) throw(); const std::string& name) noexcept;
Serialize& persist(unsigned char& member, Serialize& persist(unsigned char& member,
const std::string& name) throw(); const std::string& name) noexcept;
Serialize& persist(signed char& member, Serialize& persist(signed char& member,
const std::string& name) throw(); const std::string& name) noexcept;
Serialize& persist(unsigned short& member, Serialize& persist(unsigned short& member,
const std::string& name) throw(); const std::string& name) noexcept;
Serialize& persist(signed short& member, Serialize& persist(signed short& member,
const std::string& name) throw(); const std::string& name) noexcept;
Serialize& persist(unsigned int& member, Serialize& persist(unsigned int& member,
const std::string& name) throw(); const std::string& name) noexcept;
Serialize& persist(signed int& member, Serialize& persist(signed int& member,
const std::string& name) throw(); const std::string& name) noexcept;
Serialize& persist(unsigned long& member, Serialize& persist(unsigned long& member,
const std::string& name) throw(); const std::string& name) noexcept;
Serialize& persist(signed long& member, Serialize& persist(signed long& member,
const std::string& name) throw(); const std::string& name) noexcept;
Serialize& persist(float& member, Serialize& persist(float& member,
const std::string& name) throw(); const std::string& name) noexcept;
Serialize& persist(double& member, Serialize& persist(double& member,
const std::string& name) throw(); const std::string& name) noexcept;
Serialize& persist(std::string& member, Serialize& persist(std::string& member,
const std::string& name) throw(); const std::string& name) noexcept;
virtual std::ostream& saveXml(std::ostream& os, virtual std::ostream& saveXml(std::ostream& os,
const std::string& name = std::string()) const std::string& name = std::string())
const throw(); const noexcept;
virtual std::istream& loadXml(std::istream& is, virtual std::istream& loadXml(std::istream& is,
const std::string& name = std::string()); const std::string& name = std::string());
std::string schema() const throw(); std::string schema() const noexcept;
static void registerFromNode(FromNodeFunc fromNodeFunc); static void registerFromNode(FromNodeFunc fromNodeFunc);
static void registerToNode(ToNodeFunc toNodeFunc); static void registerToNode(ToNodeFunc toNodeFunc);
static void registerClear(ClearFunc clearFunc); static void registerClear(ClearFunc clearFunc);
virtual void clear() throw(); virtual void clear();
protected: protected:
virtual void initXmlMembers(); virtual void initXmlMembers();
void checkInit(const Serialize* const ser=0) const { void checkInit(const Serialize* const ser=0) const {
@@ -1166,13 +1142,13 @@ namespace xml {
const xml::Node& node); const xml::Node& node);
template<typename TYPE> friend bool assigntoNode(Any member, template<typename TYPE> friend bool assigntoNode(Any member,
const xml::Node& node); const xml::Node& node);
virtual bool optional() const throw(); virtual bool optional() const noexcept;
void clear(Any member) throw(); void clear(Any member);
void reset() throw(); void reset() noexcept;
void copy(const Serialize& o) throw(); void copy(const Serialize& o) noexcept;
template<typename TYPE> template<typename TYPE>
Serialize& persistSimpleType(TYPE& member, Serialize& persistSimpleType(TYPE& member,
const std::string& name) throw() { const std::string& name) noexcept {
_xmlNames[name] = &member; _xmlNames[name] = &member;
xml::Node schema(*_xmlFactory); xml::Node schema(*_xmlFactory);
schema<<xml::String(name).limits(1,1); schema<<xml::String(name).limits(1,1);
@@ -1191,43 +1167,43 @@ namespace xml {
template <class TYPE> class Optional: public Serialize { template <class TYPE> class Optional: public Serialize {
public: public:
Optional() throw(): _valid(false) {} Optional() noexcept: _valid(false) {}
Optional(const Optional& o) throw(): Optional(const Optional& o) noexcept:
_member(o._member), _valid(o.valid) { _member(o._member), _valid(o.valid) {
} }
Optional(const TYPE& mem) throw(): Optional(const TYPE& mem) noexcept:
_member(mem), _valid(true) { _member(mem), _valid(true) {
} }
virtual ~Optional() throw() {} virtual ~Optional() noexcept {}
Optional& operator=(const Optional& o) throw() { Optional& operator=(const Optional& o) noexcept {
_member = o._member; _member = o._member;
_valid = o._valid; _valid = o._valid;
return *this; return *this;
} }
Optional& operator=(const TYPE& mem) throw() { Optional& operator=(const TYPE& mem) noexcept {
_member = mem; _member = mem;
_valid = true; _valid = true;
return *this; return *this;
} }
operator bool() const throw() { operator bool() const noexcept {
return _valid; return _valid;
} }
const TYPE& operator*() const throw() { const TYPE& operator*() const noexcept {
return _member; return _member;
} }
TYPE& operator*() throw() { TYPE& operator*() noexcept {
return _member; return _member;
} }
const TYPE*const operator->() const throw() { const TYPE* operator->() const noexcept {
return &_member; return &_member;
} }
TYPE*const operator->() throw() { TYPE* operator->() noexcept {
return &_member; return &_member;
} }
virtual void clear() throw() { virtual void clear() noexcept {
_valid = false; _valid = false;
} }
virtual Optional& className(const std::string& name) throw() { virtual Optional& className(const std::string& name) noexcept {
if (!_xmlFactory) { if (!_xmlFactory) {
Serialize::className(name); Serialize::className(name);
persist(_member, name); persist(_member, name);
@@ -1238,7 +1214,7 @@ namespace xml {
return *this; return *this;
} }
protected: protected:
virtual bool optional() const throw() { virtual bool optional() const noexcept {
return true; return true;
} }
virtual void fromNode(Any member, const xml::Node& node) { virtual void fromNode(Any member, const xml::Node& node) {
@@ -1258,7 +1234,7 @@ namespace xml {
bool _valid; bool _valid;
}; };
//! @addtogroup serialization //! @addtogroup groupserialization
//@{ //@{
/*! @defgroup serContainer Serialization of Container /*! @defgroup serContainer Serialization of Container
@@ -1295,7 +1271,7 @@ namespace xml {
public: public:
Container() {} Container() {}
Container(const Container& o): CONTAINER_TYPE(o), Serialize(o) {} Container(const Container& o): CONTAINER_TYPE(o), Serialize(o) {}
Container(const std::string& className) throw(): Serialize(className) {} Container(const std::string& className) noexcept: Serialize(className) {}
virtual ~Container() {} virtual ~Container() {}
virtual std::istream& loadXml(std::istream& is, virtual std::istream& loadXml(std::istream& is,
const std::string& name = std::string()) { const std::string& name = std::string()) {
@@ -1313,7 +1289,7 @@ namespace xml {
} }
virtual std::ostream& saveXml(std::ostream& os, virtual std::ostream& saveXml(std::ostream& os,
const std::string& name = std::string()) const std::string& name = std::string())
const throw() { const noexcept {
checkInit(); checkInit();
xml::Node node(*_xmlFactory); xml::Node node(*_xmlFactory);
if (name.size()) node.name(name); if (name.size()) node.name(name);
@@ -1344,7 +1320,7 @@ namespace xml {
persist(tmp, itemName); // add as child of dummyroot persist(tmp, itemName); // add as child of dummyroot
(*_xmlFactory)[0].limits(0, 0); // any number of children possible (*_xmlFactory)[0].limits(0, 0); // any number of children possible
} }
virtual void clear() throw() { virtual void clear() noexcept {
CONTAINER_TYPE::clear(); CONTAINER_TYPE::clear();
} }
}; };
@@ -1357,7 +1333,7 @@ namespace xml {
AssociativeContainer(const AssociativeContainer& o): AssociativeContainer(const AssociativeContainer& o):
CONTAINER_TYPE(o), Serialize(o) { CONTAINER_TYPE(o), Serialize(o) {
} }
AssociativeContainer(const std::string& className) throw(): AssociativeContainer(const std::string& className) noexcept:
Serialize(className) { Serialize(className) {
} }
virtual ~AssociativeContainer() {} virtual ~AssociativeContainer() {}
@@ -1377,7 +1353,7 @@ namespace xml {
} }
virtual std::ostream& saveXml(std::ostream& os, virtual std::ostream& saveXml(std::ostream& os,
const std::string& name = std::string()) const std::string& name = std::string())
const throw() { const noexcept {
checkInit(); checkInit();
xml::Node node(*_xmlFactory); xml::Node node(*_xmlFactory);
if (name.size()) node.name(name); if (name.size()) node.name(name);
@@ -1411,7 +1387,7 @@ namespace xml {
persist(tmp, itemName); // add as child of dummyroot persist(tmp, itemName); // add as child of dummyroot
(*_xmlFactory)[0].limits(0, 0); // any number of children possible (*_xmlFactory)[0].limits(0, 0); // any number of children possible
} }
virtual void clear() throw() { virtual void clear() noexcept {
CONTAINER_TYPE::clear(); CONTAINER_TYPE::clear();
} }
}; };
@@ -1424,7 +1400,7 @@ namespace xml {
AssociativeMap(const AssociativeMap& o): AssociativeMap(const AssociativeMap& o):
CONTAINER_TYPE(o), Serialize(o) { CONTAINER_TYPE(o), Serialize(o) {
} }
AssociativeMap(const std::string& className) throw(): AssociativeMap(const std::string& className) noexcept:
Serialize(className) { Serialize(className) {
} }
virtual ~AssociativeMap() {} virtual ~AssociativeMap() {}
@@ -1446,7 +1422,7 @@ namespace xml {
} }
virtual std::ostream& saveXml(std::ostream& os, virtual std::ostream& saveXml(std::ostream& os,
const std::string& name = std::string()) const std::string& name = std::string())
const throw() { const noexcept {
checkInit(); checkInit();
xml::Node node(*_xmlFactory); xml::Node node(*_xmlFactory);
if (name.size()) node.name(name); if (name.size()) node.name(name);
@@ -1492,7 +1468,7 @@ namespace xml {
(*_xmlFactory)[0].limits(0, 0); // any number of children possible (*_xmlFactory)[0].limits(0, 0); // any number of children possible
(*_xmlFactory)[1].limits(0, 0); // any number of children possible (*_xmlFactory)[1].limits(0, 0); // any number of children possible
} }
virtual void clear() throw() { virtual void clear() noexcept {
CONTAINER_TYPE::clear(); CONTAINER_TYPE::clear();
} }
}; };
@@ -1516,18 +1492,18 @@ namespace xml {
CONTAINER(const CONTAINER& o): \ CONTAINER(const CONTAINER& o): \
Container<STD_CONTAINER<TYPE, ALLOC> >(o) { \ Container<STD_CONTAINER<TYPE, ALLOC> >(o) { \
} \ } \
CONTAINER(const std::string& className) throw(): \ CONTAINER(const std::string& className) noexcept: \
Container<STD_CONTAINER<TYPE, ALLOC> >(className) { \ Container<STD_CONTAINER<TYPE, ALLOC> >(className) { \
} \ } \
virtual ~CONTAINER() {} \ virtual ~CONTAINER() {} \
}; \ }; \
} }
# include <list> # include <list>
__XML_CXX_DECLARE_CONTAINER_CLASS__(List, std::list); __XML_CXX_DECLARE_CONTAINER_CLASS__(List, std::list)
# include <vector> # include <vector>
__XML_CXX_DECLARE_CONTAINER_CLASS__(Vector, std::vector); __XML_CXX_DECLARE_CONTAINER_CLASS__(Vector, std::vector)
# include <deque> # include <deque>
__XML_CXX_DECLARE_CONTAINER_CLASS__(Deque, std::deque); __XML_CXX_DECLARE_CONTAINER_CLASS__(Deque, std::deque)
# undef __XML_CXX_DECLARE_CONTAINER_CLASS__ # undef __XML_CXX_DECLARE_CONTAINER_CLASS__
# define __XML_CXX_DECLARE_CONTAINER_CLASS__(CONTAINER, STD_CONTAINER) \ # define __XML_CXX_DECLARE_CONTAINER_CLASS__(CONTAINER, STD_CONTAINER) \
namespace xml { \ namespace xml { \
@@ -1541,7 +1517,7 @@ __XML_CXX_DECLARE_CONTAINER_CLASS__(Deque, std::deque);
AssociativeContainer \ AssociativeContainer \
<STD_CONTAINER<TYPE, CONT> >(o) { \ <STD_CONTAINER<TYPE, CONT> >(o) { \
} \ } \
CONTAINER(const std::string& className) throw(): \ CONTAINER(const std::string& className) noexcept: \
AssociativeContainer \ AssociativeContainer \
<STD_CONTAINER<TYPE, CONT> > \ <STD_CONTAINER<TYPE, CONT> > \
(className) { \ (className) { \
@@ -1550,9 +1526,9 @@ __XML_CXX_DECLARE_CONTAINER_CLASS__(Deque, std::deque);
}; \ }; \
} }
# include <stack> # include <stack>
__XML_CXX_DECLARE_CONTAINER_CLASS__(Stack, std::stack); __XML_CXX_DECLARE_CONTAINER_CLASS__(Stack, std::stack)
# include <queue> # include <queue>
__XML_CXX_DECLARE_CONTAINER_CLASS__(Queue, std::queue); __XML_CXX_DECLARE_CONTAINER_CLASS__(Queue, std::queue)
# undef __XML_CXX_DECLARE_CONTAINER_CLASS__ # undef __XML_CXX_DECLARE_CONTAINER_CLASS__
# define __XML_CXX_DECLARE_CONTAINER_CLASS__(CONTAINER, STD_CONTAINER) \ # define __XML_CXX_DECLARE_CONTAINER_CLASS__(CONTAINER, STD_CONTAINER) \
namespace xml { \ namespace xml { \
@@ -1569,7 +1545,7 @@ __XML_CXX_DECLARE_CONTAINER_CLASS__(Queue, std::queue);
AssociativeContainer \ AssociativeContainer \
<STD_CONTAINER<TYPE, COMPARE, ALLOC> >(o) { \ <STD_CONTAINER<TYPE, COMPARE, ALLOC> >(o) { \
} \ } \
CONTAINER(const std::string& className) throw(): \ CONTAINER(const std::string& className) noexcept: \
AssociativeContainer \ AssociativeContainer \
<STD_CONTAINER<TYPE, COMPARE, ALLOC> > \ <STD_CONTAINER<TYPE, COMPARE, ALLOC> > \
(className) { \ (className) { \
@@ -1577,7 +1553,7 @@ __XML_CXX_DECLARE_CONTAINER_CLASS__(Queue, std::queue);
virtual ~CONTAINER() {} \ virtual ~CONTAINER() {} \
}; \ }; \
} }
__XML_CXX_DECLARE_CONTAINER_CLASS__(PriorityQueue, std::priority_queue); __XML_CXX_DECLARE_CONTAINER_CLASS__(PriorityQueue, std::priority_queue)
# undef __XML_CXX_DECLARE_CONTAINER_CLASS__ # undef __XML_CXX_DECLARE_CONTAINER_CLASS__
# define __XML_CXX_DECLARE_CONTAINER_CLASS__(CONTAINER, STD_CONTAINER) \ # define __XML_CXX_DECLARE_CONTAINER_CLASS__(CONTAINER, STD_CONTAINER) \
namespace xml { \ namespace xml { \
@@ -1592,7 +1568,7 @@ __XML_CXX_DECLARE_CONTAINER_CLASS__(PriorityQueue, std::priority_queue);
AssociativeContainer \ AssociativeContainer \
<STD_CONTAINER<TYPE, COMPARE, ALLOC> >(o) { \ <STD_CONTAINER<TYPE, COMPARE, ALLOC> >(o) { \
} \ } \
CONTAINER(const std::string& className) throw(): \ CONTAINER(const std::string& className) noexcept: \
AssociativeContainer \ AssociativeContainer \
<STD_CONTAINER<TYPE, COMPARE, ALLOC> > \ <STD_CONTAINER<TYPE, COMPARE, ALLOC> > \
(className) { \ (className) { \
@@ -1601,8 +1577,8 @@ __XML_CXX_DECLARE_CONTAINER_CLASS__(PriorityQueue, std::priority_queue);
}; \ }; \
} }
# include <set> # include <set>
__XML_CXX_DECLARE_CONTAINER_CLASS__(Set, std::set); __XML_CXX_DECLARE_CONTAINER_CLASS__(Set, std::set)
__XML_CXX_DECLARE_CONTAINER_CLASS__(MultiSet, std::multiset); __XML_CXX_DECLARE_CONTAINER_CLASS__(MultiSet, std::multiset)
# undef __XML_CXX_DECLARE_CONTAINER_CLASS__ # undef __XML_CXX_DECLARE_CONTAINER_CLASS__
# define __XML_CXX_DECLARE_CONTAINER_CLASS__(CONTAINER, STD_CONTAINER) \ # define __XML_CXX_DECLARE_CONTAINER_CLASS__(CONTAINER, STD_CONTAINER) \
namespace xml { \ namespace xml { \
@@ -1616,7 +1592,7 @@ __XML_CXX_DECLARE_CONTAINER_CLASS__(MultiSet, std::multiset);
AssociativeMap \ AssociativeMap \
<STD_CONTAINER<KEY, VALUE, COMPARE, ALLOC> >(o) { \ <STD_CONTAINER<KEY, VALUE, COMPARE, ALLOC> >(o) { \
} \ } \
CONTAINER(const std::string& className) throw(): \ CONTAINER(const std::string& className) noexcept: \
AssociativeMap \ AssociativeMap \
<STD_CONTAINER<KEY, VALUE, COMPARE, ALLOC> > \ <STD_CONTAINER<KEY, VALUE, COMPARE, ALLOC> > \
(className) { \ (className) { \
@@ -1625,8 +1601,8 @@ __XML_CXX_DECLARE_CONTAINER_CLASS__(MultiSet, std::multiset);
}; \ }; \
} }
# include <map> # include <map>
__XML_CXX_DECLARE_CONTAINER_CLASS__(Map, std::map); __XML_CXX_DECLARE_CONTAINER_CLASS__(Map, std::map)
__XML_CXX_DECLARE_CONTAINER_CLASS__(MultiMap, std::multimap); __XML_CXX_DECLARE_CONTAINER_CLASS__(MultiMap, std::multimap)
# undef __XML_CXX_DECLARE_CONTAINER_CLASS__ # undef __XML_CXX_DECLARE_CONTAINER_CLASS__
//@} //@}
//! @endcond //! @endcond

View File

@@ -12,28 +12,29 @@
#include <cstdlib> #include <cstdlib>
#include <algorithm> #include <algorithm>
unsigned int MethodTrace::_level(0);
namespace xml { namespace xml {
unsigned int MethodTrace::_level(0);
//================================================================= EXCEPTIONS //================================================================= EXCEPTIONS
//---------------------------------------------------------------------------- //----------------------------------------------------------------------------
exception::exception(std::string reason) throw(): exception::exception(std::string reason) noexcept:
_what(reason), _node(0) { _what(reason), _node(0) {
} }
exception::exception(std::string reason, const Node& t) throw(): exception::exception(std::string reason, const Node& t) noexcept:
_what(reason), _node(t.clone().release()) { _what(reason), _node(t.clone().release()) {
} }
exception::~exception() throw() { exception::~exception() noexcept {
delete _node; delete _node;
} }
void exception::line(unsigned long line) throw() { void exception::line(unsigned long line) noexcept {
std::stringstream ss; std::stringstream ss;
ss<<line; ss<<line;
_what += "\nat line: "+ss.str(); _what += "\nat line: "+ss.str();
} }
const char* exception::what() const throw() { const char* exception::what() const noexcept {
static std::string w; static std::string w;
if (!w.size()) { if (!w.size()) {
if (_node) if (_node)
@@ -47,33 +48,33 @@ namespace xml {
return w.c_str(); return w.c_str();
} }
//---------------------------------------------------------------------------- //----------------------------------------------------------------------------
access_error::access_error(const Node& t, const std::string& name) throw(): access_error::access_error(const Node& t, const std::string& name) noexcept:
exception("child not available", t), _name(name) { exception("child not available", t), _name(name) {
} }
const char* access_error::what() const throw() { const char* access_error::what() const noexcept {
static std::string w; static std::string w;
if (!w.size()) w = std::string(exception::what())+"\nchild name: "+_name; if (!w.size()) w = std::string(exception::what())+"\nchild name: "+_name;
return w.c_str(); return w.c_str();
} }
//---------------------------------------------------------------------------- //----------------------------------------------------------------------------
out_of_range::out_of_range(const Node& t, size_t pos) throw(): out_of_range::out_of_range(const Node& t, size_t pos) noexcept:
exception("child not available", t), _pos(pos) { exception("child not available", t), _pos(pos) {
} }
const char* out_of_range::what() const throw() { const char* out_of_range::what() const noexcept {
static std::stringstream w; static std::stringstream w;
if (!w.str().size()) w<<exception::what()<<"\nchild number: "<<_pos; if (!w.str().size()) w<<exception::what()<<"\nchild number: "<<_pos;
return w.str().c_str(); return w.str().c_str();
} }
//---------------------------------------------------------------------------- //----------------------------------------------------------------------------
cannot_have_children::cannot_have_children(const Node& parent, cannot_have_children::cannot_have_children(const Node& parent,
const Node& child) throw(): const Node& child) noexcept:
exception("node does not accept child nodes", parent), exception("node does not accept child nodes", parent),
_child(child.clone().release()) { _child(child.clone().release()) {
} }
cannot_have_children::~cannot_have_children() throw() { cannot_have_children::~cannot_have_children() noexcept {
delete _child; delete _child;
} }
const char* cannot_have_children::what() const throw() { const char* cannot_have_children::what() const noexcept {
static std::string w; static std::string w;
if (!w.size()) if (!w.size())
w = std::string(exception::what())+"\nchild name: "+_child->name(); w = std::string(exception::what())+"\nchild name: "+_child->name();
@@ -81,17 +82,17 @@ namespace xml {
} }
//---------------------------------------------------------------------------- //----------------------------------------------------------------------------
stream_error::stream_error(const std::string& reason, const Node& t, stream_error::stream_error(const std::string& reason, const Node& t,
std::istream& is, const Tag& tag, char c) throw(): std::istream& is, const Tag& tag, char c) noexcept:
exception(reason, t), _pos(is.tellg()), _tag(new Tag(tag)), _char(c) { exception(reason, t), _pos(is.tellg()), _tag(new Tag(tag)), _char(c) {
} }
stream_error::stream_error(const std::string& reason, const Node& t, stream_error::stream_error(const std::string& reason, const Node& t,
std::istream& is) throw(): std::istream& is) noexcept:
exception(reason, t), _pos(is.tellg()), _tag(0), _char(0) { exception(reason, t), _pos(is.tellg()), _tag(0), _char(0) {
} }
stream_error::~stream_error() throw() { stream_error::~stream_error() noexcept {
delete _tag; delete _tag;
} }
const char* stream_error::what() const throw() { const char* stream_error::what() const noexcept {
static std::string w; static std::string w;
if (!w.size()) { if (!w.size()) {
std::stringstream ss; std::stringstream ss;
@@ -117,67 +118,67 @@ namespace xml {
//---------------------------------------------------------------------------- //----------------------------------------------------------------------------
//! Copy an attribute. //! Copy an attribute.
Attributes::Value::Value(const value_type& o) throw(): Attributes::Value::Value(const value_type& o) noexcept:
Attributes::value_type(o) { Attributes::value_type(o) {
} }
//! Construct an empty attribute. //! Construct an empty attribute.
Attributes::Value::Value(const std::string& name) throw(): Attributes::Value::Value(const std::string& name) noexcept:
Attributes::value_type(name, std::string()) { Attributes::value_type(name, std::string()) {
} }
//! Construct an attribute with name an value. //! Construct an attribute with name an value.
Attributes::Value::Value(const std::string& name, Attributes::Value::Value(const std::string& name,
const std::string& value) throw(): const std::string& value) noexcept:
Attributes::value_type(name, value) { Attributes::value_type(name, value) {
} }
//! Assign a value. //! Assign a value.
Attributes::Value& Attributes::Value::operator=(const std::string& value) Attributes::Value& Attributes::Value::operator=(const std::string& value)
throw() { noexcept {
second = value; second = value;
return *this; return *this;
} }
//! Get the attribute name. //! Get the attribute name.
const std::string& Attributes::Value::name() const throw() { const std::string& Attributes::Value::name() const noexcept {
return first; return first;
} }
//! Get the attribute value. //! Get the attribute value.
const std::string& Attributes::Value::value() const throw() { const std::string& Attributes::Value::value() const noexcept {
return second; return second;
} }
//! Get the attribute value. //! Get the attribute value.
std::string& Attributes::Value::value() throw() { std::string& Attributes::Value::value() noexcept {
return second; return second;
} }
//! Convert the attribute to a boolean. //! Convert the attribute to a boolean.
/*! @return @c true if the value is set and not equal to one of: /*! @return @c true if the value is set and not equal to one of:
@c false @c no @c 0. */ @c false @c no @c 0. */
Attributes::Value::operator bool() const throw() { Attributes::Value::operator bool() const noexcept {
return bool(); return bool();
} }
//! Convert the attribute to a boolean. //! Convert the attribute to a boolean.
/*! @return @c true if the value is set and not equal to one of: /*! @return @c true if the value is set and not equal to one of:
@c false @c no @c 0. */ @c false @c no @c 0. */
bool Attributes::Value::toBool() const throw() { bool Attributes::Value::toBool() const noexcept {
return !(!second.size()||second=="false"||second=="no"||second=="0"); return !(!second.size()||second=="false"||second=="no"||second=="0");
} }
//! Convert the attribute to a number. //! Convert the attribute to a number.
Attributes::Value::operator unsigned long() const throw() { Attributes::Value::operator unsigned long() const noexcept {
return toNumber(); return toNumber();
} }
//! Convert the attribute to a number. //! Convert the attribute to a number.
unsigned long Attributes::Value::toNumber() const throw() { unsigned long Attributes::Value::toNumber() const noexcept {
std::stringstream ss(second); std::stringstream ss(second);
int i(0); int i(0);
ss>>i; ss>>i;
return i; return i;
} }
//! Convert the attribute to a space separated list. //! Convert the attribute to a space separated list.
Attributes::Value::operator List() const throw() { Attributes::Value::operator List() const noexcept {
return toList(); return toList();
} }
//! Convert the attribute to list. //! Convert the attribute to list.
/*! @param separators a string containing a list of valid separators */ /*! @param separators a string containing a list of valid separators */
Attributes::List Attributes::Value::toList(const std::string& separators) Attributes::List Attributes::Value::toList(const std::string& separators)
const throw() { const noexcept {
List l; List l;
for (std::string::size_type it(0), pos(0); for (std::string::size_type it(0), pos(0);
it!=std::string::npos && it!=std::string::npos &&
@@ -193,30 +194,30 @@ namespace xml {
/*! @copydoc xml::Attributes::Value::toList /*! @copydoc xml::Attributes::Value::toList
@return the first element of the list. */ @return the first element of the list. */
std::string Attributes::Value::front(const std::string& separators) const std::string Attributes::Value::front(const std::string& separators) const
throw(empty_attribute_list) { {
List l(toList(separators)); List l(toList(separators));
if (!l.size()) throw empty_attribute_list(first); if (!l.size()) throw empty_attribute_list(first);
return l.front(); return l.front();
} }
//---------------------------------------------------------------------------- //----------------------------------------------------------------------------
//! Empty attribute list //! Empty attribute list
Attributes::Attributes() throw() {} Attributes::Attributes() noexcept {}
//! Attribute list with first one empty attribute given. //! Attribute list with first one empty attribute given.
Attributes::Attributes(const std::string& empty) throw() { Attributes::Attributes(const std::string& empty) noexcept {
insert(Value(empty)); insert(Value(empty));
} }
//! Attribute list with first attribute given. //! Attribute list with first attribute given.
Attributes::Attributes(const std::string& key, Attributes::Attributes(const std::string& key,
const std::string& value) throw() { const std::string& value) noexcept {
insert(Value(key, value)); insert(Value(key, value));
} }
//! Add a new key-value pair to the attribute list. //! Add a new key-value pair to the attribute list.
Attributes& Attributes::operator<<(const Attributes::Value& v) throw() { Attributes& Attributes::operator<<(const Attributes::Value& v) noexcept {
insert(v); insert(v);
return *this; return *this;
} }
//! Add a new empty key to the attribute list. //! Add a new empty key to the attribute list.
Attributes& Attributes::operator<<(const std::string& key) throw() { Attributes& Attributes::operator<<(const std::string& key) noexcept {
insert(Value(key)); insert(Value(key));
return *this; return *this;
} }
@@ -226,28 +227,28 @@ namespace xml {
constructor. constructor.
@copydoc xml::Node::limits */ @copydoc xml::Node::limits */
Node::Node(std::string name, Node::Node(std::string name,
Node::size_type min, Node::size_type max) throw(): Node::size_type min, Node::size_type max) noexcept:
_name(name), _parent(0), _min(min), _max(max) { _name(name), _parent(0), _min(min), _max(max) {
} }
//! Copy node, reset parent. //! Copy node, reset parent.
/*! The parent is reset, the node does not belong to the same parent /*! The parent is reset, the node does not belong to the same parent
as the source of the copy. as the source of the copy.
@see xml::Node::clone() for more information on the parenting. */ @see xml::Node::clone() for more information on the parenting. */
Node::Node(const Node& o) throw(): Node::Node(const Node& o) noexcept:
_attributes(o._attributes), _name(o.name()), _parent(0), _attributes(o._attributes), _name(o.name()), _parent(0),
_min(o._min), _max(o._max) { _min(o._min), _max(o._max) {
for (Contents::const_iterator it(o._contents.begin()); for (Contents::const_iterator it(o._contents.begin());
it!=o._contents.end(); ++it) it!=o._contents.end(); ++it)
_contents.push_back((*it)->clone(this).release()); _contents.push_back((*it)->clone(this).release());
} }
Node::~Node() throw() { Node::~Node() noexcept {
clear(); clear();
} }
//! Assign new node, keep parent. //! Assign new node, keep parent.
/*! The parent remains unchanged, the node does not belong to the /*! The parent remains unchanged, the node does not belong to the
same parent as the source of the copy. same parent as the source of the copy.
@see xml::Node::clone() for more information on the parenting. */ @see xml::Node::clone() for more information on the parenting. */
Node& Node::operator=(const Node& o) throw() { Node& Node::operator=(const Node& o) noexcept {
clear(); clear();
_attributes=o._attributes; _attributes=o._attributes;
_name = o.name(); _name = o.name();
@@ -272,7 +273,7 @@ namespace xml {
The user of this library doesn't have to and is not able to care The user of this library doesn't have to and is not able to care
about the parenting. */ about the parenting. */
std::unique_ptr<Node> Node::clone() const throw() { std::unique_ptr<Node> Node::clone() const noexcept {
std::unique_ptr<Node> res(new Node(*this)); std::unique_ptr<Node> res(new Node(*this));
res->_parent = 0; res->_parent = 0;
return res; return res;
@@ -281,7 +282,7 @@ namespace xml {
/*! Streams the node including all attributes and children. It is /*! Streams the node including all attributes and children. It is
formatted with new-lines and tabulator indentation for human formatted with new-lines and tabulator indentation for human
readability. */ readability. */
std::ostream& Node::out(std::ostream& o, unsigned int level) const throw() { std::ostream& Node::out(std::ostream& o, unsigned int level) const noexcept {
if (_contents.size()) { if (_contents.size()) {
o<<std::string(level, '\t')<<'<'<<name(); o<<std::string(level, '\t')<<'<'<<name();
for (Attributes::const_iterator it(_attributes.begin()); for (Attributes::const_iterator it(_attributes.begin());
@@ -303,7 +304,7 @@ namespace xml {
} }
//! Get the textual contents of a node. //! Get the textual contents of a node.
/*! By default this is the concatenation of all child nodes' texts. */ /*! By default this is the concatenation of all child nodes' texts. */
std::string Node::text() const throw() { std::string Node::text() const noexcept {
std::string s; std::string s;
for (Contents::const_iterator it(_contents.begin()); for (Contents::const_iterator it(_contents.begin());
it!=_contents.end(); ++it) it!=_contents.end(); ++it)
@@ -315,36 +316,36 @@ namespace xml {
reimplemented. In xml::Node, the parent of all nodes, it throws reimplemented. In xml::Node, the parent of all nodes, it throws
xml::tag_expected, since a xml::Node may only contain sub-nodes xml::tag_expected, since a xml::Node may only contain sub-nodes
(formatted as xml-tags) and no plain text. */ (formatted as xml-tags) and no plain text. */
Node& Node::text(const std::string& txt) throw(tag_expected, type_mismatch) { Node& Node::text(const std::string& txt) {
throw tag_expected(*this, txt); throw tag_expected(*this, txt);
} }
//! Appends a new node at the end of all children. //! Appends a new node at the end of all children.
Node& Node::append(const Node& o) throw(cannot_have_children) { Node& Node::append(const Node& o) {
_contents.push_back(o.clone(this).release()); _contents.push_back(o.clone(this).release());
return *this; return *this;
} }
//! Removes a given child node. //! Removes a given child node.
Node& Node::remove(Node& n) throw(access_error) { Node& Node::remove(Node& n) {
Contents::iterator it(std::find(_contents.begin(), _contents.end(), &n)); Contents::iterator it(std::find(_contents.begin(), _contents.end(), &n));
if (it==_contents.end()) throw access_error(*this, n.name()); if (it==_contents.end()) throw access_error(*this, n.name());
_contents.erase(it); _contents.erase(it);
return *this; return *this;
} }
//! Removes the first child node of a given name. //! Removes the first child node of a given name.
Node& Node::remove(const std::string& n) throw(access_error) { Node& Node::remove(const std::string& n) {
Node* t(find(n)); Node* t(find(n));
if (!t) throw access_error(*this, n); if (!t) throw access_error(*this, n);
return remove(*t); return remove(*t);
} }
//! Removes the child node of a given position. //! Removes the child node of a given position.
Node& Node::remove(size_type n) throw(out_of_range) { Node& Node::remove(size_type n) {
if (n>=children()) throw out_of_range(*this, n); if (n>=children()) throw out_of_range(*this, n);
_contents.erase(_contents.begin()+n); _contents.erase(_contents.begin()+n);
return *this; return *this;
} }
//! Set a list of attributes. //! Set a list of attributes.
/*! Existing attributes with the same name are overwritten. */ /*! Existing attributes with the same name are overwritten. */
Node& Node::set(const Attributes& o) throw() { Node& Node::set(const Attributes& o) noexcept {
_attributes.clear(); _attributes.clear();
_attributes.insert(o.begin(), o.end()); _attributes.insert(o.begin(), o.end());
return *this; return *this;
@@ -359,47 +360,47 @@ namespace xml {
return *this; return *this;
} }
//! Get the node's tag name. //! Get the node's tag name.
std::string Node::name() const throw() { std::string Node::name() const noexcept {
return _name; return _name;
} }
//! Set a new node's tag name. //! Set a new node's tag name.
Node& Node::name(const std::string& n) throw() { Node& Node::name(const std::string& n) noexcept {
_name = n; _name = n;
return *this; return *this;
} }
//! Set minimum number of instances (in a xml::Factory). //! Set minimum number of instances (in a xml::Factory).
/*! @copydoc limits */ /*! @copydoc limits */
Node& Node::min(Node::size_type m) throw() { Node& Node::min(Node::size_type m) noexcept {
_min = m; _min = m;
return *this; return *this;
} }
//! Get minimum number of instances (in a xml::Factory). //! Get minimum number of instances (in a xml::Factory).
/*! @copydoc limits */ /*! @copydoc limits */
Node::size_type Node::min() const throw() { Node::size_type Node::min() const noexcept {
return _min; return _min;
} }
//! Set maximum number of instances (in a xml::Factory). //! Set maximum number of instances (in a xml::Factory).
/*! @copydoc limits */ /*! @copydoc limits */
Node& Node::max(Node::size_type m) throw() { Node& Node::max(Node::size_type m) noexcept {
_max = m; _max = m;
return *this; return *this;
} }
//! Get maximum number of instances (in a xml::Factory). //! Get maximum number of instances (in a xml::Factory).
/*! @copydoc limits */ /*! @copydoc limits */
Node::size_type Node::max() const throw() { Node::size_type Node::max() const noexcept {
return _max; return _max;
} }
//! @c true if node has a parent. //! @c true if node has a parent.
bool Node::isChild() const throw() { bool Node::isChild() const noexcept {
return _parent; return _parent;
} }
//! Get the parent node. //! Get the parent node.
Node& Node::parent() const throw(no_parent) { Node& Node::parent() const {
if (!_parent) throw no_parent(*this); if (!_parent) throw no_parent(*this);
return *_parent; return *_parent;
} }
//! Check if a specific attribute is set or not. //! Check if a specific attribute is set or not.
bool Node::hasAttr(const std::string& name) const throw() { bool Node::hasAttr(const std::string& name) const noexcept {
return _attributes.find(name)!=_attributes.end(); return _attributes.find(name)!=_attributes.end();
} }
//! Declare an attribute template and specify whether it is mandatory //! Declare an attribute template and specify whether it is mandatory
@@ -410,8 +411,8 @@ namespace xml {
If a factory reads from a stream, it verifies that only optional If a factory reads from a stream, it verifies that only optional
or mandatory attributes are given and that mandatory attributes or mandatory attributes are given and that mandatory attributes
are specified. Otherwise reading throws an exception. */ are specified. Otherwise reading throws an exception. */
Node& Node::attr(const std::string& name, bool mandatory) throw() { Node& Node::attr(const std::string& name, bool m) noexcept {
_attributes[name] = mandatory?"xml::mandatory":"xml::optional"; _attributes[name] = m?"xml::mandatory":"xml::optional";
return *this; return *this;
} }
//! Declare an attribute with given value. //! Declare an attribute with given value.
@@ -422,20 +423,20 @@ namespace xml {
@endcode @endcode
If a factory reads from a stream and the specified attribute is If a factory reads from a stream and the specified attribute is
not given, it is set to @c deflt. */ not given, it is set to @c deflt. */
Node& Node::attr(const std::string& name, const std::string& deflt) throw() { Node& Node::attr(const std::string& name, const std::string& deflt) noexcept {
_attributes[name] = deflt; _attributes[name] = deflt;
return *this; return *this;
} }
//! Get an attribute. //! Get an attribute.
/*! Returns the attribute's value (empty if the attribute is not set) */ /*! Returns the attribute's value (empty if the attribute is not set) */
std::string Node::attr(const std::string& name) const throw() { std::string Node::attr(const std::string& name) const noexcept {
Attributes::const_iterator it(_attributes.find(name)); Attributes::const_iterator it(_attributes.find(name));
if (it!=_attributes.end()) return it->second; if (it!=_attributes.end()) return it->second;
return std::string(); return std::string();
} }
//! Get an attribute. //! Get an attribute.
/*! Returns the attribute's value (empty if the attribute is not set) */ /*! Returns the attribute's value (empty if the attribute is not set) */
std::string& Node::attr(const std::string& name) throw() { std::string& Node::attr(const std::string& name) noexcept {
return _attributes[name]; return _attributes[name];
} }
//! Get an attribute. //! Get an attribute.
@@ -444,23 +445,23 @@ namespace xml {
conversions or other methods as specified in conversions or other methods as specified in
xml::Attributes::Value. */ xml::Attributes::Value. */
const Attributes::Value Node::attribute(const std::string& name) const Attributes::Value Node::attribute(const std::string& name)
const throw(attribute_not_available) { const {
Attributes::const_iterator it(_attributes.find(name)); Attributes::const_iterator it(_attributes.find(name));
if (it!=_attributes.end()) return *it; if (it!=_attributes.end()) return *it;
throw attribute_not_available(*this, name); throw attribute_not_available(*this, name);
} }
//! Get the list of attributes. //! Get the list of attributes.
const Attributes& Node::attributes() const throw() { const Attributes& Node::attributes() const noexcept {
return _attributes; return _attributes;
} }
//! Get the list of attributes. //! Get the list of attributes.
Attributes& Node::attributes() throw() { Attributes& Node::attributes() noexcept {
return _attributes; return _attributes;
} }
//! Get the first child node //! Get the first child node
/*! Returns the first child node or throws an exception, if there are /*! Returns the first child node or throws an exception, if there are
no children. */ no children. */
Node& Node::first() throw(out_of_range) { Node& Node::first() {
Contents::iterator it(_contents.begin()); Contents::iterator it(_contents.begin());
if (it==_contents.end()) throw out_of_range(*this, 0); if (it==_contents.end()) throw out_of_range(*this, 0);
return **it; return **it;
@@ -468,7 +469,7 @@ namespace xml {
//! Get the first child node //! Get the first child node
/*! Returns the first child node or throws an exception, if there are /*! Returns the first child node or throws an exception, if there are
no children. */ no children. */
const Node& Node::first() const throw(out_of_range) { const Node& Node::first() const {
Contents::const_iterator it(_contents.begin()); Contents::const_iterator it(_contents.begin());
if (it==_contents.end()) throw out_of_range(*this, 0); if (it==_contents.end()) throw out_of_range(*this, 0);
return **it; return **it;
@@ -476,7 +477,7 @@ namespace xml {
//! Get the last child node //! Get the last child node
/*! Returns the last child node or throws an exception, if there are /*! Returns the last child node or throws an exception, if there are
no children. */ no children. */
const Node& Node::last() const throw(out_of_range) { const Node& Node::last() const {
Contents::const_reverse_iterator it(_contents.rbegin()); Contents::const_reverse_iterator it(_contents.rbegin());
if (it==_contents.rend()) throw out_of_range(*this, 0); if (it==_contents.rend()) throw out_of_range(*this, 0);
return **it; return **it;
@@ -484,7 +485,7 @@ namespace xml {
//! Get the last child node //! Get the last child node
/*! Returns the last child node or throws an exception, if there are /*! Returns the last child node or throws an exception, if there are
no children. */ no children. */
Node& Node::last() throw(out_of_range) { Node& Node::last() {
Contents::reverse_iterator it(_contents.rbegin()); Contents::reverse_iterator it(_contents.rbegin());
if (it==_contents.rend()) throw out_of_range(*this, 0); if (it==_contents.rend()) throw out_of_range(*this, 0);
return **it; return **it;
@@ -513,13 +514,13 @@ namespace xml {
Default is no limits: <code>0..n</code>, Default is no limits: <code>0..n</code>,
which means that the node is optional and may be instatiated which means that the node is optional and may be instatiated
multiple (infinite, unlimited) times. */ multiple (infinite, unlimited) times. */
Node& Node::limits(size_type min, size_type max) throw() { Node& Node::limits(size_type min, size_type max) noexcept {
_min = min; _min = min;
_max = max; _max = max;
return *this; return *this;
} }
//! Get all immediate children of a given node name. //! Get all immediate children of a given node name.
Node::List Node::list(const std::string& name) const throw() { Node::List Node::list(const std::string& name) const noexcept {
List res; List res;
for (Contents::const_iterator it(_contents.begin()); for (Contents::const_iterator it(_contents.begin());
it!=_contents.end(); ++it) it!=_contents.end(); ++it)
@@ -527,34 +528,34 @@ namespace xml {
return res; return res;
} }
//! Check if at least one child node of a given name exists. //! Check if at least one child node of a given name exists.
bool Node::operator()(const std::string& child) const throw() { bool Node::operator()(const std::string& child) const noexcept {
return find(child); return find(child);
} }
//! Append a child at the end. //! Append a child at the end.
/*! @copydoc xml::Node::append */ /*! @copydoc xml::Node::append */
Node& Node::operator<<(const Node& o) throw(cannot_have_children) { Node& Node::operator<<(const Node& o) {
return append(o); return append(o);
} }
//! Add an empty attribute. //! Add an empty attribute.
/*! @copydoc xml::Node::set */ /*! @copydoc xml::Node::set */
Node& Node::operator<<(const Attributes& o) throw() { Node& Node::operator<<(const Attributes& o) noexcept {
return set(o); return set(o);
} }
//! Get the number of children. //! Get the number of children.
Node::size_type Node::children() const throw() { Node::size_type Node::children() const noexcept {
return _contents.size(); return _contents.size();
} }
//! Get a child by child-number (the n-th child). //! Get a child by child-number (the n-th child).
/*! @param child number of the child to return: <code>child&gt;=0</code> and /*! @param child number of the child to return: <code>child&gt;=0</code> and
<code>child&lt;xml::Node::children()</code> */ <code>child&lt;xml::Node::children()</code> */
const Node& Node::operator[](Node::size_type child) const const Node& Node::operator[](Node::size_type child) const
throw(out_of_range) try { try {
return *_contents.at(child); return *_contents.at(child);
} catch (...) { } catch (...) {
throw out_of_range(*this, child); throw out_of_range(*this, child);
} }
/*! @copydoc xml::Node::operator[](Node::size_type child) const */ /*! @copydoc xml::Node::operator[](Node::size_type child) const */
Node& Node::operator[](Node::size_type child) throw(out_of_range) try { Node& Node::operator[](Node::size_type child) try {
return *_contents.at(child); return *_contents.at(child);
} catch (...) { } catch (...) {
throw out_of_range(*this, child); throw out_of_range(*this, child);
@@ -562,37 +563,36 @@ namespace xml {
//! Get the first child of a given node name. //! Get the first child of a given node name.
/*! @return the first child with matching node name */ /*! @return the first child with matching node name */
const Node& Node::operator[](const std::string& child) const const Node& Node::operator[](const std::string& child) const
throw(access_error) { {
const Node* const t(find(child)); const Node* const t(find(child));
if (!t) throw access_error(*this, child); if (!t) throw access_error(*this, child);
return *t; return *t;
} }
/*! @copydoc xml::Node::operator[](const std::string& child) const */ /*! @copydoc xml::Node::operator[](const std::string& child) const */
Node& Node::operator[](const std::string& child) throw(access_error) { Node& Node::operator[](const std::string& child) {
Node* const t(find(child)); Node* const t(find(child));
if (!t) throw access_error(*this, child); if (!t) throw access_error(*this, child);
return *t; return *t;
} }
//! Get the textual contents of a node. //! Get the textual contents of a node.
/*! @copydoc xml::Node::text() */ /*! @copydoc xml::Node::text() */
std::string Node::operator*() const throw() { std::string Node::operator*() const noexcept {
return text(); return text();
} }
//! Set a text (forbidden in xml::Node) //! Set a text (forbidden in xml::Node)
/*! @copydoc xml::Node::text(const std::string& txt) */ /*! @copydoc xml::Node::text(const std::string& txt) */
Node& Node::operator=(const std::string& contents) throw(tag_expected, Node& Node::operator=(const std::string& contents) {
type_mismatch) {
return text(contents); return text(contents);
} }
//! Write node in XML format to a stream. //! Write node in XML format to a stream.
/*! @copydoc xml::Node::out */ /*! @copydoc xml::Node::out */
std::ostream& operator<<(std::ostream& o, const Node& t) throw() { std::ostream& operator<<(std::ostream& o, const Node& t) noexcept {
return t.out(o); return t.out(o);
} }
//! Get a pointer to the first child of a given node name. //! Get a pointer to the first child of a given node name.
/*! This method does not throw an exception if the element does not /*! This method does not throw an exception if the element does not
exist, but returns @c 0. */ exist, but returns @c 0. */
Node* Node::find(const std::string& child) const throw() { Node* Node::find(const std::string& child) const noexcept {
for (Contents::const_iterator it(_contents.begin()); for (Contents::const_iterator it(_contents.begin());
it!=_contents.end(); ++it) { it!=_contents.end(); ++it) {
if ((*it)->name()==child) return *it; if ((*it)->name()==child) return *it;
@@ -600,7 +600,7 @@ namespace xml {
return 0; return 0;
} }
//! Clone a node, but assign a new parent. //! Clone a node, but assign a new parent.
std::unique_ptr<Node> Node::clone(Node* p) const throw() { std::unique_ptr<Node> Node::clone(Node* p) const noexcept {
std::unique_ptr<Node> c(clone()); std::unique_ptr<Node> c(clone());
c->_parent = p; c->_parent = p;
return c; return c;
@@ -610,30 +610,29 @@ namespace xml {
/*! @copydoc Node::Node(std::string name, /*! @copydoc Node::Node(std::string name,
Node::size_type min, Node::size_type max) */ Node::size_type min, Node::size_type max) */
String::String(std::string name, String::String(std::string name,
Node::size_type min, Node::size_type max) throw(): Node::size_type min, Node::size_type max) noexcept:
Node(name, min, max) { Node(name, min, max) {
} }
//! Pass the text in the node. //! Pass the text in the node.
/*! @copydoc Node::Node(std::string name, /*! @copydoc Node::Node(std::string name,
Node::size_type min, Node::size_type max) */ Node::size_type min, Node::size_type max) */
String::String(std::string name, const std::string& text, String::String(std::string name, const std::string& text,
Node::size_type min, Node::size_type max) throw(): Node::size_type min, Node::size_type max) noexcept:
Node(name, min, max), _text(text) { Node(name, min, max), _text(text) {
} }
std::unique_ptr<Node> String::clone() const throw() { std::unique_ptr<Node> String::clone() const noexcept {
return std::unique_ptr<Node>(new String(*this)); return std::unique_ptr<Node>(new String(*this));
} }
std::string String::text() const throw() { std::string String::text() const noexcept {
return _text; return _text;
} }
//! An xml::String contains text: Set the text. //! An xml::String contains text: Set the text.
/*! Never throws an exception. */ /*! Never throws an exception. */
String& String::text(const std::string& txt) throw(tag_expected, String& String::text(const std::string& txt) {
type_mismatch) {
_text = txt; _text = txt;
return *this; return *this;
} }
std::ostream& String::out(std::ostream& o, unsigned int level) const throw() { std::ostream& String::out(std::ostream& o, unsigned int level) const noexcept {
if (_text.size()) { if (_text.size()) {
o<<std::string(level, '\t')<<'<'<<name(); o<<std::string(level, '\t')<<'<'<<name();
for (Attributes::const_iterator it(_attributes.begin()); for (Attributes::const_iterator it(_attributes.begin());
@@ -650,83 +649,83 @@ namespace xml {
return o; return o;
} }
//! An xml::String has no child nodes: Always throws an exception. //! An xml::String has no child nodes: Always throws an exception.
String& String::append(const Node& o) throw(cannot_have_children) { String& String::append(const Node& o) {
throw cannot_have_children(*this, o); throw cannot_have_children(*this, o);
} }
//! An xml::String contains text: Set the text. //! An xml::String contains text: Set the text.
Node& String::operator=(const std::string& contents) throw() { Node& String::operator=(const std::string& contents) noexcept {
return text(contents); return text(contents);
} }
String::operator std::string() const throw() { String::operator std::string() const noexcept {
return text(); return text();
} }
String::operator bool() const throw() { String::operator bool() const noexcept {
bool res; bool res;
std::stringstream ss(text()); std::stringstream ss(text());
ss>>res; ss>>res;
return res; return res;
} }
String::operator char() const throw() { String::operator char() const noexcept {
char res; char res;
std::stringstream ss(text()); std::stringstream ss(text());
ss>>res; ss>>res;
return res; return res;
} }
String::operator signed char() const throw() { String::operator signed char() const noexcept {
signed char res; signed char res;
std::stringstream ss(text()); std::stringstream ss(text());
ss>>res; ss>>res;
return res; return res;
} }
String::operator unsigned char() const throw() { String::operator unsigned char() const noexcept {
unsigned char res; unsigned char res;
std::stringstream ss(text()); std::stringstream ss(text());
ss>>res; ss>>res;
return res; return res;
} }
String::operator signed short() const throw() { String::operator signed short() const noexcept {
signed short res; signed short res;
std::stringstream ss(text()); std::stringstream ss(text());
ss>>res; ss>>res;
return res; return res;
} }
String::operator unsigned short() const throw() { String::operator unsigned short() const noexcept {
unsigned short res; unsigned short res;
std::stringstream ss(text()); std::stringstream ss(text());
ss>>res; ss>>res;
return res; return res;
} }
String::operator signed int() const throw() { String::operator signed int() const noexcept {
signed int res; signed int res;
std::stringstream ss(text()); std::stringstream ss(text());
ss>>res; ss>>res;
return res; return res;
} }
String::operator unsigned int() const throw() { String::operator unsigned int() const noexcept {
unsigned int res; unsigned int res;
std::stringstream ss(text()); std::stringstream ss(text());
ss>>res; ss>>res;
return res; return res;
} }
String::operator signed long() const throw() { String::operator signed long() const noexcept {
signed long res; signed long res;
std::stringstream ss(text()); std::stringstream ss(text());
ss>>res; ss>>res;
return res; return res;
} }
String::operator unsigned long() const throw() { String::operator unsigned long() const noexcept {
unsigned long res; unsigned long res;
std::stringstream ss(text()); std::stringstream ss(text());
ss>>res; ss>>res;
return res; return res;
} }
String::operator float() const throw() { String::operator float() const noexcept {
float res; float res;
std::stringstream ss(text()); std::stringstream ss(text());
ss>>res; ss>>res;
return res; return res;
} }
String::operator double() const throw() { String::operator double() const noexcept {
double res; double res;
std::stringstream ss(text()); std::stringstream ss(text());
ss>>res; ss>>res;
@@ -737,16 +736,16 @@ namespace xml {
/*! @copydoc Node::Node(std::string name, /*! @copydoc Node::Node(std::string name,
Node::size_type min, Node::size_type max) */ Node::size_type min, Node::size_type max) */
UnsignedInteger::UnsignedInteger(std::string name, unsigned long i, UnsignedInteger::UnsignedInteger(std::string name, unsigned long i,
size_type min, size_type max) throw(): size_type min, size_type max) noexcept:
String(name, mrw::string(i), min, max) { String(name, mrw::string(i), min, max) {
} }
std::unique_ptr<Node> UnsignedInteger::clone() const throw() { std::unique_ptr<Node> UnsignedInteger::clone() const noexcept {
return std::unique_ptr<Node>(new UnsignedInteger(*this)); return std::unique_ptr<Node>(new UnsignedInteger(*this));
} }
//! An xml::UnsignedInteger must only contain an number. //! An xml::UnsignedInteger must only contain an number.
/*! En exception is thrown, if the contents does not match a number. */ /*! En exception is thrown, if the contents does not match a number. */
UnsignedInteger& UnsignedInteger::text(const std::string& txt) UnsignedInteger& UnsignedInteger::text(const std::string& txt)
throw(tag_expected, type_mismatch) { {
std::string::size_type std::string::size_type
start(txt.find_first_not_of(" \t\n\r")), start(txt.find_first_not_of(" \t\n\r")),
last(txt.find_last_not_of(" \t\n\r")); last(txt.find_last_not_of(" \t\n\r"));
@@ -766,11 +765,11 @@ namespace xml {
return *this; return *this;
} }
//! Returns the contents as number. //! Returns the contents as number.
unsigned long UnsignedInteger::number() const throw() { unsigned long UnsignedInteger::number() const noexcept {
return number(*this); return number(*this);
} }
//! Returns the contents as number. //! Returns the contents as number.
unsigned long UnsignedInteger::number(const Node& node) throw() { unsigned long UnsignedInteger::number(const Node& node) noexcept {
unsigned long i(0); unsigned long i(0);
std::stringstream ss(node.text()); std::stringstream ss(node.text());
ss>>i; ss>>i;
@@ -779,50 +778,51 @@ namespace xml {
//---------------------------------------------------------------------------- //----------------------------------------------------------------------------
//! To instanciate a factory, a template must be given. //! To instanciate a factory, a template must be given.
Factory::Factory(const Node& t) throw(): Factory::Factory(const Node& t) noexcept:
_template(xml::Node("<xml::start>")<<t), _line(0) { _template(xml::Node("<xml::start>")<<t), _line(0) {
_template[0].min(1); _template[0].min(1);
_template[0].max(1); _template[0].max(1);
} }
//! Instanciates an invalid factory. A template must be assigned later. //! Instanciates an invalid factory. A template must be assigned later.
Factory::Factory() throw(): Factory::Factory() noexcept:
_template(xml::Node("<xml::start>")), _line(0) { _template(xml::Node("<xml::start>")), _line(0) {
} }
//! Assign a template. //! Assign a template.
/*! If you don't pass a template at instanciation, you must call /*! If you don't pass a template at instanciation, you must call
this method later, or you will get xml::factory_not_valid this method later, or you will get xml::factory_not_valid
exceptions when you try to use the factory. */ exceptions when you try to use the factory. */
Factory& Factory::operator=(const Node& t) throw() { Factory& Factory::operator=(const Node& t) noexcept {
_template = xml::Node("<xml::start>")<<t; _template = xml::Node("<xml::start>")<<t;
_template[0].min(1); _template[0].min(1);
_template[0].max(1); _template[0].max(1);
return *this;
} }
//! Get the template. //! Get the template.
const Node& Factory::operator*() const throw(factory_not_valid) try { const Node& Factory::operator*() const try {
return _template[0]; return _template[0];
} catch (...) { } catch (...) {
throw factory_not_valid(); throw factory_not_valid();
} }
//! Access the (root node of the) template. //! Access the (root node of the) template.
const Node*const Factory::operator->() const throw(factory_not_valid) try { const Node* Factory::operator->() const try {
return &_template[0]; return &_template[0];
} catch (...) { } catch (...) {
throw factory_not_valid(); throw factory_not_valid();
} }
//! Check whether the factory has been given a valid template. //! Check whether the factory has been given a valid template.
Factory::operator bool() const throw() { Factory::operator bool() const noexcept {
return _template.children()>0; return _template.children()>0;
} }
//! Print the factory template's schema in human readable format. //! Print the factory template's schema in human readable format.
/*! Calls xml::Factory::print */ /*! Calls xml::Factory::print */
std::ostream& operator<<(std::ostream& os, const Factory& factory) std::ostream& operator<<(std::ostream& os, const Factory& factory)
throw(factory_not_valid) { {
return factory.print(os, *factory); return factory.print(os, *factory);
} }
//! Print a node's schema description in human readable format. //! Print a node's schema description in human readable format.
/*! @todo May be changed to a XML Schema output later. */ /*! @todo May be changed to a XML Schema output later. */
std::ostream& Factory::print(std::ostream& os, const Node& node, std::ostream& Factory::print(std::ostream& os, const Node& node,
unsigned int level) throw() { unsigned int level) noexcept {
if (node.children()) { if (node.children()) {
os<<std::string(level, '\t')<<'<'<<node.name(); os<<std::string(level, '\t')<<'<'<<node.name();
for (Attributes::const_iterator it(node.attributes().begin()); for (Attributes::const_iterator it(node.attributes().begin());
@@ -876,14 +876,7 @@ namespace xml {
return os; return os;
} }
//! Restore a xml::Node tree from a stream, according to the given schema. //! Restore a xml::Node tree from a stream, according to the given schema.
std::unique_ptr<Node> Factory::read(std::istream& is) std::unique_ptr<Node> Factory::read(std::istream& is) {
throw(wrong_end_tag, wrong_start_tag, tag_expected, type_mismatch,
second_slash_in_tag,
character_after_slash, missing_end_tag, attribute_value_not_quoted,
access_error, duplicate_attribute,
attributes_in_end_tag,
illegal_attribute, mandatory_attribute_missing,
wrong_node_number, factory_not_valid) {
if (_template.children()==0) throw factory_not_valid(); if (_template.children()==0) throw factory_not_valid();
try { try {
_line=1; _line=1;
@@ -898,34 +891,28 @@ namespace xml {
throw; throw;
} }
} }
void Factory::reset() throw() { void Factory::reset() noexcept {
_line = 0; _line = 0;
_open = 0; _open = 0;
_template = xml::Node("<xml::start>"); _template = xml::Node("<xml::start>");
} }
Node& Factory::operator*() throw(factory_not_valid) try { Node& Factory::operator*() try {
return _template[0]; return _template[0];
} catch (...) { } catch (...) {
throw factory_not_valid(); throw factory_not_valid();
} }
Node*const Factory::operator->() throw(factory_not_valid) try { Node* Factory::operator->() try {
return &_template[0]; return &_template[0];
} catch (...) { } catch (...) {
throw factory_not_valid(); throw factory_not_valid();
} }
bool Factory::ws(char c) throw() { bool Factory::ws(char c) noexcept {
static char last(0); static char last(0);
if ((c=='\n'||c=='\r')&&last!='\n'&&last!='\r') ++_line; if ((c=='\n'||c=='\r')&&last!='\n'&&last!='\r') ++_line;
last = c; last = c;
return c==' '||c=='\t'||c=='\n'||c=='\r'; return c==' '||c=='\t'||c=='\n'||c=='\r';
} }
std::unique_ptr<Node> Factory::read(std::istream& is, const Node& node) std::unique_ptr<Node> Factory::read(std::istream& is, const Node& node) {
throw(wrong_end_tag, wrong_start_tag, tag_expected, type_mismatch,
second_slash_in_tag,
character_after_slash, missing_end_tag, attribute_value_not_quoted,
access_error, duplicate_attribute, attributes_in_end_tag,
illegal_attribute, mandatory_attribute_missing,
wrong_node_number) {
std::unique_ptr<Node> result(node.clone()); std::unique_ptr<Node> result(node.clone());
result->clear(); result->clear();
while (true) { while (true) {
@@ -955,7 +942,7 @@ namespace xml {
std::unique_ptr<Node> Factory::checkChildren(const xml::Node& tpl, std::unique_ptr<Node> Factory::checkChildren(const xml::Node& tpl,
std::unique_ptr<Node> node, std::unique_ptr<Node> node,
std::istream& is) const std::istream& is) const
throw(wrong_node_number) { {
for (Node::size_type i(0); i<tpl.children(); ++i) for (Node::size_type i(0); i<tpl.children(); ++i)
if ((tpl[i].min()>0 && node->list(tpl[i].name()).size()<tpl[i].min()) if ((tpl[i].min()>0 && node->list(tpl[i].name()).size()<tpl[i].min())
|| (0<tpl[i].max() && tpl[i].max()<node->list(tpl[i].name()).size())) || (0<tpl[i].max() && tpl[i].max()<node->list(tpl[i].name()).size()))
@@ -964,14 +951,9 @@ namespace xml {
tpl[i].min(), tpl[i].max()); tpl[i].min(), tpl[i].max());
return std::move(node); return std::move(node);
} }
Tag Factory::tag(std::istream& is, const Node& position) Tag Factory::tag(std::istream& is, const Node& position) {
throw(second_slash_in_tag, character_after_slash, tag_expected,
missing_end_tag, attribute_value_not_quoted,
access_error, duplicate_attribute, attributes_in_end_tag,
illegal_attribute, mandatory_attribute_missing,
wrong_start_tag) {
char c(0); char c(0);
Tag tag((Tag){"", START, "", Attributes(), "", false}); Tag tag{"", START, "", Attributes(), "", false};
while (is && is.get(c) && ws(c)); // skip ws while (is && is.get(c) && ws(c)); // skip ws
if (is.eof()) { if (is.eof()) {
if (_open>0) if (_open>0)
@@ -985,6 +967,8 @@ namespace xml {
for (char last(c); is && is.get(c) && c!='>'; last=c) switch (c) { for (char last(c); is && is.get(c) && c!='>'; last=c) switch (c) {
case '\n': case '\r': case '\n': case '\r':
if (last!='\n'&&last!='\r') ++_line; if (last!='\n'&&last!='\r') ++_line;
// no break; fall through to non line breaking white spaces
[[fallthrough]];
case ' ': case '\t': case ' ': case '\t':
if (!nameRead && tag.name.size()) nameRead=true; if (!nameRead && tag.name.size()) nameRead=true;
break; break;
@@ -1000,6 +984,8 @@ namespace xml {
tag.type=SPECIAL; tag.type=SPECIAL;
return tag; return tag;
} }
// no break; not matched, fall through to error handling
[[fallthrough]];
default: default:
if (tag.type==EMPTY) throw character_after_slash(position, is, tag, c); if (tag.type==EMPTY) throw character_after_slash(position, is, tag, c);
if (nameRead) { // read attribute if (nameRead) { // read attribute
@@ -1056,21 +1042,21 @@ namespace xml {
//---------------------------------------------------------------------------- //----------------------------------------------------------------------------
Serialize::Serialize() throw() {} Serialize::Serialize() noexcept {}
Serialize::Serialize(const std::string& className) throw(): Serialize::Serialize(const std::string& className) noexcept:
_xmlFactory(xml::Node(xml::String(className).limits(1,1))) { _xmlFactory(xml::Node(xml::String(className).limits(1,1))) {
} }
Serialize::Serialize(const Serialize& other) throw() { Serialize::Serialize(const Serialize& other) noexcept {
copy(other); copy(other);
} }
Serialize::~Serialize() { Serialize::~Serialize() {
reset(); reset();
} }
Serialize& Serialize::operator=(const Serialize& other) throw() { Serialize& Serialize::operator=(const Serialize& other) noexcept {
copy(other); copy(other);
return *this; return *this;
} }
Serialize& Serialize::className(const std::string& name) throw() { Serialize& Serialize::className(const std::string& name) noexcept {
xml::Node node(xml::Node(xml::String(name).limits(1,1))); xml::Node node(xml::Node(xml::String(name).limits(1,1)));
if (_xmlFactory) { if (_xmlFactory) {
for (xml::Node::size_type i(0); i<_xmlFactory->children(); ++i) for (xml::Node::size_type i(0); i<_xmlFactory->children(); ++i)
@@ -1080,7 +1066,7 @@ namespace xml {
return *this; return *this;
} }
Serialize& Serialize::persist(Serialize& ser, Serialize& Serialize::persist(Serialize& ser,
const std::string& name) throw() { const std::string& name) noexcept {
if (ser.optional()) { if (ser.optional()) {
_xmlNames[name] = &ser; _xmlNames[name] = &ser;
ser.className(name); ser.className(name);
@@ -1099,59 +1085,59 @@ namespace xml {
return *this; return *this;
} }
Serialize& Serialize::persist(bool& member, Serialize& Serialize::persist(bool& member,
const std::string& name) throw() { const std::string& name) noexcept {
return persistSimpleType(member, name); return persistSimpleType(member, name);
} }
Serialize& Serialize::persist(char& member, Serialize& Serialize::persist(char& member,
const std::string& name) throw() { const std::string& name) noexcept {
return persistSimpleType(member, name); return persistSimpleType(member, name);
} }
Serialize& Serialize::persist(unsigned char& member, Serialize& Serialize::persist(unsigned char& member,
const std::string& name) throw() { const std::string& name) noexcept {
return persistSimpleType(member, name); return persistSimpleType(member, name);
} }
Serialize& Serialize::persist(signed char& member, Serialize& Serialize::persist(signed char& member,
const std::string& name) throw() { const std::string& name) noexcept {
return persistSimpleType(member, name); return persistSimpleType(member, name);
} }
Serialize& Serialize::persist(unsigned short& member, Serialize& Serialize::persist(unsigned short& member,
const std::string& name) throw() { const std::string& name) noexcept {
return persistSimpleType(member, name); return persistSimpleType(member, name);
} }
Serialize& Serialize::persist(signed short& member, Serialize& Serialize::persist(signed short& member,
const std::string& name) throw() { const std::string& name) noexcept {
return persistSimpleType(member, name); return persistSimpleType(member, name);
} }
Serialize& Serialize::persist(unsigned int& member, Serialize& Serialize::persist(unsigned int& member,
const std::string& name) throw() { const std::string& name) noexcept {
return persistSimpleType(member, name); return persistSimpleType(member, name);
} }
Serialize& Serialize::persist(signed int& member, Serialize& Serialize::persist(signed int& member,
const std::string& name) throw() { const std::string& name) noexcept {
return persistSimpleType(member, name); return persistSimpleType(member, name);
} }
Serialize& Serialize::persist(unsigned long& member, Serialize& Serialize::persist(unsigned long& member,
const std::string& name) throw() { const std::string& name) noexcept {
return persistSimpleType(member, name); return persistSimpleType(member, name);
} }
Serialize& Serialize::persist(signed long& member, Serialize& Serialize::persist(signed long& member,
const std::string& name) throw() { const std::string& name) noexcept {
return persistSimpleType(member, name); return persistSimpleType(member, name);
} }
Serialize& Serialize::persist(float& member, Serialize& Serialize::persist(float& member,
const std::string& name) throw() { const std::string& name) noexcept {
return persistSimpleType(member, name); return persistSimpleType(member, name);
} }
Serialize& Serialize::persist(double& member, Serialize& Serialize::persist(double& member,
const std::string& name) throw() { const std::string& name) noexcept {
return persistSimpleType(member, name); return persistSimpleType(member, name);
} }
Serialize& Serialize::persist(std::string& member, Serialize& Serialize::persist(std::string& member,
const std::string& name) throw() { const std::string& name) noexcept {
return persistSimpleType(member, name); return persistSimpleType(member, name);
} }
std::ostream& Serialize::saveXml(std::ostream& os, std::ostream& Serialize::saveXml(std::ostream& os,
const std::string& name) const throw() { const std::string& name) const noexcept {
checkInit(); checkInit();
xml::Node node(*_xmlFactory); xml::Node node(*_xmlFactory);
if (name.size()) node.name(name); if (name.size()) node.name(name);
@@ -1176,7 +1162,7 @@ namespace xml {
clear(it->second); clear(it->second);
return is; return is;
} }
std::string Serialize::schema() const throw() { std::string Serialize::schema() const noexcept {
checkInit(); checkInit();
std::stringstream ss; std::stringstream ss;
ss<<*_xmlFactory; ss<<*_xmlFactory;
@@ -1193,17 +1179,17 @@ namespace xml {
_clear.insert(clearFunc); _clear.insert(clearFunc);
} }
void Serialize::initXmlMembers() {} void Serialize::initXmlMembers() {}
void Serialize::clear() throw() { void Serialize::clear() {
for (std::map<std::string, Any>::const_iterator for (std::map<std::string, Any>::const_iterator
it(_xmlNames.begin()); it(_xmlNames.begin());
it!=_xmlNames.end(); ++it) it!=_xmlNames.end(); ++it)
clear(it->second); clear(it->second);
} }
void Serialize::reset() throw() { void Serialize::reset() noexcept {
_xmlFactory.reset(); _xmlFactory.reset();
_xmlNames.clear(); _xmlNames.clear();
} }
void Serialize::copy(const Serialize& o) throw() { void Serialize::copy(const Serialize&) noexcept {
reset(); reset();
initXmlMembers(); initXmlMembers();
} }
@@ -1219,13 +1205,13 @@ namespace xml {
if ((**it)(member, node)) return; // found match if ((**it)(member, node)) return; // found match
throw type_not_registered(member.type().name(), node.name(), node); throw type_not_registered(member.type().name(), node.name(), node);
} }
void Serialize::clear(Any member) throw() { void Serialize::clear(Any member) {
for (std::set<ClearFunc>::const_iterator it(_clear.begin()); for (std::set<ClearFunc>::const_iterator it(_clear.begin());
it!=_clear.end(); ++it) it!=_clear.end(); ++it)
if ((**it)(member)) return; // found match if ((**it)(member)) return; // found match
throw type_not_registered(member.type().name()); throw type_not_registered(member.type().name());
} }
bool Serialize::optional() const throw() { bool Serialize::optional() const noexcept {
return false; return false;
} }