From 6822a9e2fb3ec2a6380eb899fb97c9617680adae Mon Sep 17 00:00:00 2001 From: Ichthyostega Date: Fri, 25 Oct 2013 06:34:38 +0200 Subject: [PATCH] DOC: reorganise the Doxygen configuration and structure - upgrade the configuration to a current version - provide a frontpage with cross-links to other documentation - define a set of modules; relevant classes and files can be added to these, to create a exploration path for new readers - fix a lot of errors in documentation comments - use a custom configuration for the documentation pages - tweak the navigation, the sections and further arrangements --- .gitignore | 1 + admin/scons/BuilderDoxygen.py | 48 +- admin/scons/IconSvgRenderer.py | 0 doc/SConscript | 1 - doc/devel/Doxyfile | 218 +++----- doc/devel/DoxygenLayout.xml | 190 +++++++ doc/devel/draw/LumiLogo.svg | 145 +++-- doc/index.txt | 9 +- src/backend/engine/scheduler-frontend.hpp | 2 + src/backend/resourcecollector.h | 3 +- src/doxygen.dox | 101 ++++ .../timeline/timeline-layout-helper.hpp | 2 +- src/include/play-facade.h | 2 + src/lib/depend.hpp | 6 +- src/lib/iter-adapter.hpp | 6 +- src/lib/lockerror.c | 6 +- src/lib/opaque-holder.hpp | 4 +- src/lib/ppmpl.h | 8 +- src/lib/query-util.cpp | 3 +- src/lib/sync.hpp | 9 +- src/lib/tree.hpp | 497 +++++++++--------- src/lib/variant.hpp | 2 +- src/lib/visitor.hpp | 2 +- src/proc/asset.hpp | 3 +- src/proc/asset/media.hpp | 9 +- src/proc/asset/meta.hpp | 1 + src/proc/asset/proc.hpp | 3 + src/proc/asset/struct.hpp | 1 + src/proc/common.hpp | 21 - src/proc/engine/engine-service.hpp | 3 + src/proc/mobject/mobject.hpp | 1 + src/proc/mobject/session.hpp | 4 +- src/proc/mobject/session/element-query.hpp | 2 +- src/proc/mobject/session/session.cpp | 2 +- src/proc/play/timings.hpp | 2 +- tests/library/opaque-holder-test.cpp | 2 +- wiki/draw/LumiLogo-small.png | Bin 0 -> 1644 bytes wiki/draw/LumiLogo.png | Bin 0 -> 28375 bytes 38 files changed, 772 insertions(+), 547 deletions(-) mode change 100755 => 100644 admin/scons/IconSvgRenderer.py create mode 100644 doc/devel/DoxygenLayout.xml create mode 100644 src/doxygen.dox create mode 100644 wiki/draw/LumiLogo-small.png create mode 100644 wiki/draw/LumiLogo.png diff --git a/.gitignore b/.gitignore index 5c6dc182c..9cfd32598 100644 --- a/.gitignore +++ b/.gitignore @@ -23,4 +23,5 @@ semantic.cache wiki/backups/* doc/devel/draw/*.png doc/devel/uml/fig128309.png +doc/devel/lumiera.tag m4/* diff --git a/admin/scons/BuilderDoxygen.py b/admin/scons/BuilderDoxygen.py index 7c9514f2c..6c336372b 100644 --- a/admin/scons/BuilderDoxygen.py +++ b/admin/scons/BuilderDoxygen.py @@ -59,30 +59,30 @@ def DoxyfileParse(file_contents): data[key][-1] += token while token: - if token in ['\n']: - if last_token not in ['\\']: - key_token = True - elif token in ['\\']: - pass - elif key_token: - key = token - key_token = False - else: - if token == "+=": - if not data.has_key(key): - data[key] = list() - elif token == "=": - data[key] = list() - else: - append_data( data, key, new_data, token ) - new_data = True - - last_token = token - token = lex.get_token() - - if last_token == '\\' and token != '\n': - new_data = False - append_data( data, key, new_data, '\\' ) + if token in ['\n']: + if last_token not in ['\\']: + key_token = True + elif token in ['\\']: + pass + elif key_token: + key = token + key_token = False + else: + if token == "+=": + if not data.has_key(key): + data[key] = list() + elif token == "=": + data[key] = list() + else: + append_data(data, key, new_data, token) + new_data = True + + last_token = token + token = lex.get_token() + + if last_token == '\\' and token != '\n': + new_data = False + append_data(data, key, new_data, '\\') # compress lists of len 1 into single strings for (k, v) in data.items(): diff --git a/admin/scons/IconSvgRenderer.py b/admin/scons/IconSvgRenderer.py old mode 100755 new mode 100644 diff --git a/doc/SConscript b/doc/SConscript index 60c0964ab..e20bb4eb0 100644 --- a/doc/SConscript +++ b/doc/SConscript @@ -3,7 +3,6 @@ ## SConscript - SCons buildscript for Documentation ## -from Buildhelper import scanSubtree Import('env') diff --git a/doc/devel/Doxyfile b/doc/devel/Doxyfile index 52c2f2d1a..8a3182c79 100644 --- a/doc/devel/Doxyfile +++ b/doc/devel/Doxyfile @@ -1,4 +1,4 @@ -# Doxyfile 1.5.6 +# Doxyfile 1.8.1.2 #--------------------------------------------------------------------------- # Project related configuration options @@ -6,7 +6,9 @@ DOXYFILE_ENCODING = UTF-8 PROJECT_NAME = Lumiera PROJECT_NUMBER = 0.1+pre -OUTPUT_DIRECTORY = +PROJECT_BRIEF = +PROJECT_LOGO = draw/rendered/LumiLogo-small.png +OUTPUT_DIRECTORY = CREATE_SUBDIRS = NO OUTPUT_LANGUAGE = English BRIEF_MEMBER_DESC = YES @@ -24,63 +26,62 @@ ABBREVIATE_BRIEF = "The $name class" \ the ALWAYS_DETAILED_SEC = YES INLINE_INHERITED_MEMB = NO -FULL_PATH_NAMES = YES +FULL_PATH_NAMES = NO STRIP_FROM_PATH = ../../src/ \ ../../tests/ -STRIP_FROM_INC_PATH = +STRIP_FROM_INC_PATH = ../../src/ SHORT_NAMES = NO JAVADOC_AUTOBRIEF = YES QT_AUTOBRIEF = NO MULTILINE_CPP_IS_BRIEF = NO -DETAILS_AT_TOP = YES INHERIT_DOCS = YES SEPARATE_MEMBER_PAGES = NO TAB_SIZE = 4 -ALIASES = -OPTIMIZE_OUTPUT_FOR_C = NO -OPTIMIZE_OUTPUT_JAVA = NO -OPTIMIZE_FOR_FORTRAN = NO -OPTIMIZE_OUTPUT_VHDL = NO +ALIASES = +EXTENSION_MAPPING = +MARKDOWN_SUPPORT = YES BUILTIN_STL_SUPPORT = YES -CPP_CLI_SUPPORT = NO -SIP_SUPPORT = NO -IDL_PROPERTY_SUPPORT = YES DISTRIBUTE_GROUP_DOC = NO SUBGROUPING = YES -TYPEDEF_HIDES_STRUCT = NO +INLINE_GROUPED_CLASSES = NO +INLINE_SIMPLE_STRUCTS = YES +TYPEDEF_HIDES_STRUCT = YES #--------------------------------------------------------------------------- # Build related configuration options #--------------------------------------------------------------------------- EXTRACT_ALL = NO EXTRACT_PRIVATE = YES +EXTRACT_PACKAGE = NO EXTRACT_STATIC = YES EXTRACT_LOCAL_CLASSES = YES -EXTRACT_LOCAL_METHODS = NO -EXTRACT_ANON_NSPACES = YES +EXTRACT_ANON_NSPACES = NO HIDE_UNDOC_MEMBERS = NO HIDE_UNDOC_CLASSES = NO HIDE_FRIEND_COMPOUNDS = NO HIDE_IN_BODY_DOCS = NO INTERNAL_DOCS = YES CASE_SENSE_NAMES = YES -HIDE_SCOPE_NAMES = NO +HIDE_SCOPE_NAMES = YES SHOW_INCLUDE_FILES = YES +FORCE_LOCAL_INCLUDES = YES INLINE_INFO = YES SORT_MEMBER_DOCS = NO SORT_BRIEF_DOCS = YES +SORT_MEMBERS_CTORS_1ST = YES SORT_GROUP_NAMES = NO SORT_BY_SCOPE_NAME = NO -GENERATE_TODOLIST = NO -GENERATE_TESTLIST = NO +STRICT_PROTO_MATCHING = NO +GENERATE_TODOLIST = YES +GENERATE_TESTLIST = YES GENERATE_BUGLIST = NO GENERATE_DEPRECATEDLIST= NO -ENABLED_SECTIONS = -MAX_INITIALIZER_LINES = 30 +ENABLED_SECTIONS = +MAX_INITIALIZER_LINES = 0 SHOW_USED_FILES = YES -SHOW_DIRECTORIES = NO SHOW_FILES = YES SHOW_NAMESPACES = YES -FILE_VERSION_FILTER = +FILE_VERSION_FILTER = +LAYOUT_FILE = #--------------------------------------------------------------------------- # configuration options related to warning and progress messages #--------------------------------------------------------------------------- @@ -88,67 +89,38 @@ QUIET = NO WARNINGS = YES WARN_IF_UNDOCUMENTED = NO WARN_IF_DOC_ERROR = YES -WARN_NO_PARAMDOC = YES +WARN_NO_PARAMDOC = NO WARN_FORMAT = "$file:$line: $text" -WARN_LOGFILE = warnings.txt +WARN_LOGFILE = html/doxygen-warnings.txt #--------------------------------------------------------------------------- # configuration options related to the input files #--------------------------------------------------------------------------- -INPUT = ../../src/ INPUT_ENCODING = UTF-8 +INPUT = ../../src/ \ + ../../tests \ + ../../admin/scons FILE_PATTERNS = *.c \ *.cc \ - *.cxx \ *.cpp \ - *.c++ \ - *.d \ - *.java \ - *.ii \ - *.ixx \ - *.ipp \ - *.i++ \ - *.inl \ *.h \ *.hh \ - *.hxx \ *.hpp \ - *.h++ \ - *.idl \ - *.odl \ - *.cs \ - *.php \ - *.php3 \ *.inc \ - *.m \ - *.mm \ *.dox \ - *.py \ - *.C \ - *.CC \ - *.C++ \ - *.II \ - *.I++ \ - *.H \ - *.HH \ - *.H++ \ - *.CS \ - *.PHP \ - *.PHP3 \ - *.M \ - *.MM \ - *.PY + *.py RECURSIVE = YES -EXCLUDE = +EXCLUDE = EXCLUDE_SYMLINKS = YES -EXCLUDE_PATTERNS = -EXCLUDE_SYMBOLS = -EXAMPLE_PATH = -EXAMPLE_PATTERNS = * +EXCLUDE_PATTERNS = +EXCLUDE_SYMBOLS = +EXAMPLE_PATH = +EXAMPLE_PATTERNS = EXAMPLE_RECURSIVE = NO -IMAGE_PATH = -INPUT_FILTER = -FILTER_PATTERNS = +IMAGE_PATH = +INPUT_FILTER = +FILTER_PATTERNS = FILTER_SOURCE_FILES = NO +FILTER_SOURCE_PATTERNS = #--------------------------------------------------------------------------- # configuration options related to source browsing #--------------------------------------------------------------------------- @@ -157,14 +129,14 @@ INLINE_SOURCES = NO STRIP_CODE_COMMENTS = YES REFERENCED_BY_RELATION = YES REFERENCES_RELATION = YES -REFERENCES_LINK_SOURCE = YES +REFERENCES_LINK_SOURCE = NO USE_HTAGS = NO VERBATIM_HEADERS = YES #--------------------------------------------------------------------------- # configuration options related to the alphabetical class index #--------------------------------------------------------------------------- ALPHABETICAL_INDEX = YES -COLS_IN_ALPHA_INDEX = 5 +COLS_IN_ALPHA_INDEX = 1 IGNORE_PREFIX = lumiera:: \ lumiera_ \ lumi_ \ @@ -175,26 +147,27 @@ IGNORE_PREFIX = lumiera:: \ GENERATE_HTML = YES HTML_OUTPUT = html HTML_FILE_EXTENSION = .html -HTML_HEADER = -HTML_FOOTER = -HTML_STYLESHEET = -HTML_ALIGN_MEMBERS = YES +HTML_HEADER = +HTML_FOOTER = +HTML_STYLESHEET = +HTML_EXTRA_FILES = +HTML_COLORSTYLE_HUE = 344 +HTML_COLORSTYLE_SAT = 68 +HTML_COLORSTYLE_GAMMA = 80 +HTML_TIMESTAMP = YES +HTML_DYNAMIC_SECTIONS = YES +HTML_INDEX_NUM_ENTRIES = 100 GENERATE_HTMLHELP = NO -GENERATE_DOCSET = NO -DOCSET_FEEDNAME = "Lumiera Doxygen docs" -DOCSET_BUNDLE_ID = org.doxygen.Project -HTML_DYNAMIC_SECTIONS = NO -CHM_FILE = -HHC_LOCATION = -GENERATE_CHI = NO -CHM_INDEX_ENCODING = -BINARY_TOC = NO -TOC_EXPAND = NO +GENERATE_ECLIPSEHELP = NO +TOC_EXPAND = YES DISABLE_INDEX = NO -ENUM_VALUES_PER_LINE = 4 GENERATE_TREEVIEW = YES -TREEVIEW_WIDTH = 250 -FORMULA_FONTSIZE = 10 +TREEVIEW_WIDTH = 200 +ENUM_VALUES_PER_LINE = 1 +FORMULA_FONTSIZE = 9 +FORMULA_TRANSPARENT = YES +SEARCHENGINE = YES +SERVER_BASED_SEARCH = NO #--------------------------------------------------------------------------- # configuration options related to the LaTeX output #--------------------------------------------------------------------------- @@ -204,80 +177,58 @@ LATEX_CMD_NAME = latex MAKEINDEX_CMD_NAME = makeindex COMPACT_LATEX = YES PAPER_TYPE = a4wide -EXTRA_PACKAGES = -LATEX_HEADER = +EXTRA_PACKAGES = +LATEX_HEADER = +LATEX_FOOTER = PDF_HYPERLINKS = YES USE_PDFLATEX = YES LATEX_BATCHMODE = YES LATEX_HIDE_INDICES = NO +LATEX_SOURCE_CODE = NO +LATEX_BIB_STYLE = plain #--------------------------------------------------------------------------- -# configuration options related to the RTF output +# configuration options related to other output formats #--------------------------------------------------------------------------- GENERATE_RTF = NO -RTF_OUTPUT = rtf -COMPACT_RTF = NO -RTF_HYPERLINKS = NO -RTF_STYLESHEET_FILE = -RTF_EXTENSIONS_FILE = -#--------------------------------------------------------------------------- -# configuration options related to the man page output -#--------------------------------------------------------------------------- GENERATE_MAN = NO -MAN_OUTPUT = man -MAN_EXTENSION = .3 -MAN_LINKS = NO -#--------------------------------------------------------------------------- -# configuration options related to the XML output -#--------------------------------------------------------------------------- GENERATE_XML = NO -XML_OUTPUT = xml -XML_SCHEMA = -XML_DTD = -XML_PROGRAMLISTING = YES -#--------------------------------------------------------------------------- -# configuration options for the AutoGen Definitions output -#--------------------------------------------------------------------------- GENERATE_AUTOGEN_DEF = NO -#--------------------------------------------------------------------------- -# configuration options related to the Perl module output -#--------------------------------------------------------------------------- GENERATE_PERLMOD = NO -PERLMOD_LATEX = NO -PERLMOD_PRETTY = YES -PERLMOD_MAKEVAR_PREFIX = #--------------------------------------------------------------------------- -# Configuration options related to the preprocessor +# Configuration options related to the preprocessor #--------------------------------------------------------------------------- ENABLE_PREPROCESSING = YES MACRO_EXPANSION = NO EXPAND_ONLY_PREDEF = NO SEARCH_INCLUDES = YES -INCLUDE_PATH = -INCLUDE_FILE_PATTERNS = -PREDEFINED = -EXPAND_AS_DEFINED = +INCLUDE_PATH = +INCLUDE_FILE_PATTERNS = +PREDEFINED = +EXPAND_AS_DEFINED = SKIP_FUNCTION_MACROS = YES #--------------------------------------------------------------------------- -# Configuration::additions related to external references +# Configuration::additions related to external references #--------------------------------------------------------------------------- -TAGFILES = -GENERATE_TAGFILE = +TAGFILES = +GENERATE_TAGFILE = lumiera.tag ALLEXTERNALS = NO EXTERNAL_GROUPS = YES PERL_PATH = /usr/bin/perl #--------------------------------------------------------------------------- -# Configuration options related to the dot tool +# Configuration options related to the dot tool #--------------------------------------------------------------------------- CLASS_DIAGRAMS = YES -MSCGEN_PATH = +MSCGEN_PATH = HIDE_UNDOC_RELATIONS = YES HAVE_DOT = YES DOT_FONTNAME = FreeSans -DOT_FONTPATH = +DOT_FONTSIZE = 8 +DOT_FONTPATH = CLASS_GRAPH = YES COLLABORATION_GRAPH = YES GROUP_GRAPHS = YES UML_LOOK = YES +UML_LIMIT_NUM_FIELDS = 8 TEMPLATE_RELATIONS = YES INCLUDE_GRAPH = NO INCLUDED_BY_GRAPH = NO @@ -285,16 +236,11 @@ CALL_GRAPH = YES CALLER_GRAPH = YES GRAPHICAL_HIERARCHY = NO DIRECTORY_GRAPH = YES -DOT_IMAGE_FORMAT = png -DOT_PATH = -DOTFILE_DIRS = -DOT_GRAPH_MAX_NODES = 50 +DOT_IMAGE_FORMAT = svg +INTERACTIVE_SVG = YES +DOT_GRAPH_MAX_NODES = 80 MAX_DOT_GRAPH_DEPTH = 1000 -DOT_TRANSPARENT = NO +DOT_TRANSPARENT = YES DOT_MULTI_TARGETS = YES GENERATE_LEGEND = YES DOT_CLEANUP = YES -#--------------------------------------------------------------------------- -# Configuration::additions related to the search engine -#--------------------------------------------------------------------------- -SEARCHENGINE = NO diff --git a/doc/devel/DoxygenLayout.xml b/doc/devel/DoxygenLayout.xml new file mode 100644 index 000000000..60ce05bbe --- /dev/null +++ b/doc/devel/DoxygenLayout.xml @@ -0,0 +1,190 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/doc/devel/draw/LumiLogo.svg b/doc/devel/draw/LumiLogo.svg index a4d60254d..2b52ea366 100644 --- a/doc/devel/draw/LumiLogo.svg +++ b/doc/devel/draw/LumiLogo.svg @@ -1,118 +1,97 @@ + - - - - - - - - + inkscape:export-filename="/Werk/devel/lumi/doc/devel/draw/rendered/LumiLogo.png" + inkscape:export-xdpi="130.048" + inkscape:export-ydpi="130.048"> + Lumiera Video Editor + id="metadata59"> image/svg+xml - Lumiera Logo - 8/2008 + Lumiera Video Editor + + 2009 - Lumiera.org + Lumiera.org project - + Logo of the Lumiera.org project + rdf:about="http://creativecommons.org/licenses/by-sa/3.0/"> + rdf:resource="http://creativecommons.org/ns#Reproduction" /> + rdf:resource="http://creativecommons.org/ns#Distribution" /> + rdf:resource="http://creativecommons.org/ns#Notice" /> + rdf:resource="http://creativecommons.org/ns#Attribution" /> + rdf:resource="http://creativecommons.org/ns#DerivativeWorks" /> + rdf:resource="http://creativecommons.org/ns#ShareAlike" /> - + + + + + diff --git a/doc/index.txt b/doc/index.txt index 4063cb80b..e0d807089 100644 --- a/doc/index.txt +++ b/doc/index.txt @@ -1,5 +1,7 @@ +Documentation +============= -= Documentation = +// Menu : append child 'doxy' This documentation section contains documentation for both users and developers. @@ -32,6 +34,11 @@ moved over to the documentation section(s) of the Lumiera website. -> access the Proc-Layer link:http://lumiera.org/wiki/renderengine.html[TiddlyWiki online here] +=== API Documentation === +We use the link:http://www.doxygen.org/index.html[Doxygen] tool to extract +code comments and generate code level API and reference documentation. + +-> link:http://lumiera.org/doxy/index.html[Doxygen generated documentation] == Media and Presentations == diff --git a/src/backend/engine/scheduler-frontend.hpp b/src/backend/engine/scheduler-frontend.hpp index c0452c681..1b0b23cce 100644 --- a/src/backend/engine/scheduler-frontend.hpp +++ b/src/backend/engine/scheduler-frontend.hpp @@ -44,6 +44,8 @@ namespace engine { * handed over to the scheduler for time-bound or bandwidth-controlled * execution * + * @ingroup engine + * @ingroup scheduler * @todo this is planned to become the frontend * to the render node network, which can be considered * at the lower end of the middle layer; the actual diff --git a/src/backend/resourcecollector.h b/src/backend/resourcecollector.h index 6a90ddb7a..770b6769a 100644 --- a/src/backend/resourcecollector.h +++ b/src/backend/resourcecollector.h @@ -126,13 +126,14 @@ lumiera_resourcecollector_destroy (void); * (to find out about the device) for STORAGE and CACHE resources * @return either returns 1 or calls _exit() * - * @example + * @code * void* data; * size_t size = 1000; * enum lumiera_resource_try iteration = LUMIERA_RESOURCE_ONE; * do { * data = malloc (size); * } while (!data && lumiera_resourcecollector_run (LUMIERA_RESOURCE_MEMORY, &iteration, &size)); + * @endcode */ int lumiera_resourcecollector_run (enum lumiera_resource which, enum lumiera_resource_try* iteration, void* context); diff --git a/src/doxygen.dox b/src/doxygen.dox new file mode 100644 index 000000000..fe06eac9b --- /dev/null +++ b/src/doxygen.dox @@ -0,0 +1,101 @@ +/* + DOXYGEN.dox - font page for the Doxygen API documentation + + + Copyright (C) Lumiera.org + 2013, Hermann Vosseler + Christian Thaeter + + This program is free software; you can redistribute it and/or + modify it under the terms of the GNU General Public License as + published by the Free Software Foundation; either version 2 of + the License, or (at your option) any later version. + + This program is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + You should have received a copy of the GNU General Public License + along with this program; if not, write to the Free Software + Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. + +*/ + + +/** @mainpage Lumiera API Documentation + +This section contains the API and reference documentation +of the Lumiera code base. It is generated automatically from the +source code comments. + +Lumiera Documentation Structure +=============================== +Lumiera comes with extensive documentation, which is organised into several tiers or layers, +according to the target audience, the degree of detail and the level of technicality. +Mostly, the sources of the documentation are kept in-tree; documentation pages are generated +with the *ASCIIDOC* tool and published at the [Lumiera website](http://Lumiera.org/documentation) + +- as a general introduction, you should read the [»outer space« document](http://Lumiera.org/documentation/user/intro/intro.html) +- further user documentation -- mostly tutorials -- is available in the [user section](http://Lumiera.org/documentation/user/) +- Architecture and specification documents can be found in the [design section](http://www.lumiera.org/documentation/design/) +- fundamental discussions and decisions are documented in the form of [RfC entries](http://www.lumiera.org/documentation/devel/design_process.html) +- as entrance to the *technical level*, developers should read the [»inner core«](http://www.lumiera.org/documentation/technical/overview.html) document +- from there, various pages in the [technical documentation](http://www.lumiera.org/documentation/technical) detail specific aspects + of implementation and technology. They treat some topics in a coherent fashion and introduce the concepts and abstractions + necessary to understand the actual code +- right now, you are looking at the **API Documentation**, which is the entrance point to the actual code +- on your exploration path down to the internal details, you might want to follow the overview given + + by the [Layer and Subsystem](modules.html) overview + + the file level comments of relevant interfaces + +*/ + +/* ==== Layers ==== */ + +/** @defgroup backend Backend-Layer +*/ + +/** @defgroup proc Proc-Layer +*/ + +/** @defgroup gui Graphical User Interface +*/ + +/* ==== Subsystems ==== */ + +/** @defgroup asset Asset Management + @ingroup proc +*/ + +/** @defgroup session Session + @ingroup proc +*/ + +/** @defgroup player Playback and Render Control + @ingroup proc +*/ + +/** @defgroup engine Render Engine + @ingroup proc +*/ + +/** @defgroup scheduler Scheduler + @ingroup backend +*/ + + +/* ==== Global Namespaces ==== */ + +/** @namespace lumiera +Lumiera public interface. +Global interfaces and facilities accessible from plugins and scripts. +It's probably a good idea to pull it in explicitly and to avoid nesting +implementation namespaces within \c lumiera:: +*/ + + +/** @namespace lib +Implementation namespace for support and library code. +*/ + diff --git a/src/gui/widgets/timeline/timeline-layout-helper.hpp b/src/gui/widgets/timeline/timeline-layout-helper.hpp index 2c2cca44a..b6ce64e44 100644 --- a/src/gui/widgets/timeline/timeline-layout-helper.hpp +++ b/src/gui/widgets/timeline/timeline-layout-helper.hpp @@ -59,7 +59,7 @@ public: /** * Definition of the layout track tree type. */ - typedef lumiera::tree< std::tr1::shared_ptr > TrackTree; + typedef lib::Tree< std::tr1::shared_ptr > TrackTree; public: /** diff --git a/src/include/play-facade.h b/src/include/play-facade.h index 7b281518d..2981c5ea0 100644 --- a/src/include/play-facade.h +++ b/src/include/play-facade.h @@ -64,6 +64,7 @@ namespace lumiera { * Global access point for starting playback and render processes, * calculating media data by running the render engine. * + * @ingroup player * @todo WIP-WIP-WIP 6/2011 * @note Lumiera is not yet able actually to deliver rendered data. * @todo there should be an accompanying CL Interface defined for @@ -90,6 +91,7 @@ namespace lumiera { * through this handle (by ref count). Client code is supposed to use the * API on this handle to navigate and control the playback mode. * + * @ingroup player * @see handle.hpp * @see player-service.cpp implementation */ diff --git a/src/lib/depend.hpp b/src/lib/depend.hpp index 8fbfd77d2..a12c998e5 100644 --- a/src/lib/depend.hpp +++ b/src/lib/depend.hpp @@ -67,8 +67,8 @@ This code is heavily inspired by ** work besides releasing references, and we acknowledge that singletons can be released ** in \em arbitrary order. ** - ** @see Depend - ** @see DependencyFactory + ** @see lib::Depend + ** @see lib::DependencyFactory ** @see lib::test::Depend4Test ** @see singleton-test.cpp ** @see dependency-factory-test.cpp @@ -99,8 +99,6 @@ namespace lib { * To my understanding, the answer is yes. See * [POSIX](http://www.opengroup.org/onlinepubs/000095399/basedefs/xbd_chap04.html#tag_04_10) * @param SI the class of the Singleton instance - * @param Create policy defining how to create/destroy the instance - * @param Life policy defining how to manage Singleton Lifecycle */ template class Depend diff --git a/src/lib/iter-adapter.hpp b/src/lib/iter-adapter.hpp index 0177eab3c..d5e2bfbc7 100644 --- a/src/lib/iter-adapter.hpp +++ b/src/lib/iter-adapter.hpp @@ -617,9 +617,9 @@ namespace lib { /** explicit builder to allow creating a const variant from the basic srcIter type. * Again, the reason necessitating this "backdoor" is that we want to swallow one level - * of indirection. Generally speaking \code const T ** \endcode is not the same as - * \code T * const * \endcode, but in our specific case the API ensures that a - * PtrDerefIter only exposes const elements. + * of indirection. Generally speaking `const T **` is not the same as `T * const *`, + * but in our specific case the API ensures that a `PtrDerefIter` + * only exposes const elements. */ static PtrDerefIter build_by_cast (WrappedIterType const& srcIter) diff --git a/src/lib/lockerror.c b/src/lib/lockerror.c index d115f8d7f..3295eff52 100644 --- a/src/lib/lockerror.c +++ b/src/lib/lockerror.c @@ -17,7 +17,9 @@ You should have received a copy of the GNU General Public License along with this program; if not, write to the Free Software Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. -*/ + +* *****************************************************/ + #include "lib/lockerror.h" @@ -29,7 +31,7 @@ LUMIERA_ERROR_DEFINE (LOCK_RELEASE, "unlocking failed"); LUMIERA_ERROR_DEFINE (LOCK_DESTROY, "lock destroy failed"); /* runtime errors */ -LUMIERA_ERROR_DEFINE (LOCK_INVAL, "lock initialization error"); +LUMIERA_ERROR_DEFINE (LOCK_INVAL, "lock initialisation error"); LUMIERA_ERROR_DEFINE (LOCK_BUSY, "already locked"); LUMIERA_ERROR_DEFINE (LOCK_DEADLK, "already locked by this thread"); LUMIERA_ERROR_DEFINE (LOCK_PERM, "not locked by this thread"); diff --git a/src/lib/opaque-holder.hpp b/src/lib/opaque-holder.hpp index 555e49a22..ce0cd6bd1 100644 --- a/src/lib/opaque-holder.hpp +++ b/src/lib/opaque-holder.hpp @@ -196,8 +196,8 @@ namespace lib { * or cleared afterwards, and this #empty() state may be detected * at runtime. In a similar vein, when the stored object has a * \c bool validity check, this can be accessed though #isValid(). - * Moreover \code !empty() && isValid() \endcode may be tested - * as by \bool conversion of the Holder object. The whole compound + * Moreover `!empty() && isValid()` may be tested as by `bool` + * conversion of the Holder object. The whole compound * is copyable if and only if the contained object is copyable. * * @note assertion failure when trying to place an instance not diff --git a/src/lib/ppmpl.h b/src/lib/ppmpl.h index db47b9920..f86d0fe00 100644 --- a/src/lib/ppmpl.h +++ b/src/lib/ppmpl.h @@ -37,18 +37,18 @@ * * This user defined macro shall be undefed after use. * - * @example + * @code * #define PPMPL_FOREACH_P1_FOO(arg) arg, * * {PPMPL_FOREACH(P1, FOO(1), FOO(2), FOO(3)), -1} * * #undef PPMPL_FOREACH_P1_FOO + * @endcode * - * Would expand to the sequence: - * {1, 2, 3, -1} + * This definition would be expanded to the sequence `{1, 2, 3, -1}` * * One can not recursively nest preprocessor macros. To allow this we define PPMPL_FOREACH_L1 - * to PPMPL_FOREACH_L2 with the same semantics as PPMPL_FOREACH, This allowes to nest the + * to PPMPL_FOREACH_L2 with the same semantics as PPMPL_FOREACH, This allows to nest the * FOREACH loop up to three nesting levels. */ #define PPMPL_FOREACH(p, ...) PPMPL_FOREACH0(p, __VA_ARGS__, PPMPL_FOREACH_NIL)) diff --git a/src/lib/query-util.cpp b/src/lib/query-util.cpp index 20dedb0fd..b6fdc6421 100644 --- a/src/lib/query-util.cpp +++ b/src/lib/query-util.cpp @@ -89,8 +89,7 @@ namespace lib { /** (preliminary) helper: instead of really parsing and evaluating the terms, * just do a regular expression match to extract the literal argument * behind the given predicate symbol. e.g calling - * \code extractID ("stream", "id(abc), stream(mpeg)") \endcode - * yields \c "mpeg" + * `extractID ("stream", "id(abc), stream(mpeg)")` yields \c "mpeg" */ string extractID (Symbol sym, const string& termString) diff --git a/src/lib/sync.hpp b/src/lib/sync.hpp index 332817ccf..f80f236bb 100644 --- a/src/lib/sync.hpp +++ b/src/lib/sync.hpp @@ -59,8 +59,8 @@ ** @see mutex.h ** @see sync-locking-test.cpp ** @see sync-waiting-test.cpp - ** @see asset::AssetManager::reg() usage example - ** @see subsystemrunner.hpp usage example + ** @see \ref asset::AssetManager::reg() "usage example: asset registration" + ** @see \ref subsystem-runner.hpp "usage example: subsystem start/shutdown" */ @@ -74,6 +74,7 @@ extern "C" { #include "lib/lockerror.h" } +#include #include #include #include @@ -421,7 +422,11 @@ namespace lib { public: + /*****************************************//** + * scoped object to control the actual locking. + */ class Lock + : boost::noncopyable { Monitor& mon_; diff --git a/src/lib/tree.hpp b/src/lib/tree.hpp index be7ff8e52..204a37072 100644 --- a/src/lib/tree.hpp +++ b/src/lib/tree.hpp @@ -1,48 +1,54 @@ -/* - - $Id: tree.hpp,v 1.151 2008/05/07 15:46:14 peekas Exp $ - - STL-like templated tree class. - Copyright (C) 2001-2006 Kasper Peeters . - Copyright (C) 2009 Joel Holdsworth . - -*/ - /* - The tree.hpp code is free software; you can redistribute it and/or modify - it under the terms of the GNU General Public License as published by - the Free Software Foundation; version 2 or 3. - - This program is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - GNU General Public License for more details. - - You should have received a copy of the GNU General Public License - along with this program; if not, write to the Free Software - Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA + TREE.hpp - STL-style tree implementation + + Copyright (C) Lumiera.org + 2001-2006, Kasper Peeters . + 2009, Joel Holdsworth . + + This program is free software; you can redistribute it and/or + modify it under the terms of the GNU General Public License as + published by the Free Software Foundation; either version 2 of + the License, or (at your option) any later version. + + This program is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + You should have received a copy of the GNU General Public License + along with this program; if not, write to the Free Software + Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. + */ -/** \todo - - New-style move members are not completely finished yet. - - It would be good to have an iterator which can iterate over all - nodes below a given node. Something similar to the leaf iterator - we have right now, but not restricted to the leaves. - - If a range uses const iter_base& as end iterator, things will - inevitably go wrong, because upcast from iter_base to a non-sibling_iter - is incorrect. This upcast should be removed (and then all illegal uses - as previously in 'equal' will be flagged by the compiler). This requires - new copy constructors though. - - There's a bug in replace(sibling_iterator, ...) when the ranges - sit next to each other. Turned up in append_child(iter,iter) - but has been avoided now. - - "std::operator<" does not work correctly on our iterators, and for some - reason a globally defined template operator< did not get picked up. - Using a comparison class now, but this should be investigated. -*/ +/** @file tree.hpp + ** A tree implementation class in STL style. + ** The tree class provides an STL-like container class for n-ary trees, + ** templated over the data stored at the nodes. + ** + ** @todo + ** - New-style move members are not completely finished yet. + ** - It would be good to have an iterator which can iterate over all + ** nodes below a given node. Something similar to the leaf iterator + ** we have right now, but not restricted to the leaves. + ** - If a range uses const iter_base& as end iterator, things will + ** inevitably go wrong, because upcast from iter_base to a non-sibling_iter + ** is incorrect. This upcast should be removed (and then all illegal uses + ** as previously in 'equal' will be flagged by the compiler). This requires + ** new copy constructors though. + ** - There's a bug in `replace(sibling_iterator, ...)` when the ranges + ** sit next to each other. Turned up in append_child(iter,iter) + ** but has been avoided now. + ** - `std::operator<` does not work correctly on our iterators, and for some + ** reason a globally defined template operator< did not get picked up. + ** Using a comparison class now, but this should be investigated. + ** + ** @see timeline-layout-helper.cpp + */ -#ifndef tree_hh_ -#define tree_hh_ + +#ifndef LIB_TREE_HPP +#define LIB_TREE_HPP #include #include @@ -55,7 +61,7 @@ // HP-style construct/destroy have gone from the standard, // so here is a copy. -namespace lumiera { +namespace lib { template void constructor(T1* p, T2& val) @@ -87,7 +93,7 @@ class tree_node_ { // size: 5*4=20 bytes (on 32 bit arch), can be reduced by 8. /** * A STL-like tree implementation class - * @remarks The tree class provides an STL-like container + * @remarks The Tree class provides an STL-like container * class for n-ary trees, templated over the data stored at the * nodes. Various types of iterators are provided (post-order, * pre-order, and others). Where possible the access methods are @@ -95,7 +101,7 @@ class tree_node_ { // size: 5*4=20 bytes (on 32 bit arch), can be reduced by 8. * available. */ template > > -class tree { +class Tree { protected: typedef tree_node_ tree_node; public: @@ -108,12 +114,12 @@ class tree { class sibling_iterator; class leaf_iterator; - tree(); - tree(const T&); - tree(const iterator_base&); - tree(const tree&); - ~tree(); - void operator=(const tree&); + Tree(); + Tree(const T&); + Tree(const iterator_base&); + Tree(const Tree&); + ~Tree(); + void operator=(const Tree&); /// Base class for iterators, only pointers stored, no traversal logic. #ifdef __SGI_STL_PORT @@ -390,8 +396,8 @@ class tree { template bool equal_subtree(const iter& one, const iter& two, BinaryPredicate) const; /// Extract a new tree formed by the range of siblings plus all their children. - tree subtree(sibling_iterator from, sibling_iterator to) const; - void subtree(tree&, sibling_iterator from, sibling_iterator to) const; + Tree subtree(sibling_iterator from, sibling_iterator to) const; + void subtree(Tree&, sibling_iterator from, sibling_iterator to) const; /// Exchange the node (plus subtree) with its sibling node (do nothing if no sibling present). void swap(sibling_iterator it); /// Exchange two nodes (plus subtrees) @@ -428,8 +434,8 @@ class tree { /// Comparator class for iterators (compares pointer values; why doesn't this work automatically?) class iterator_base_less { public: - bool operator()(const typename tree::iterator_base& one, - const typename tree::iterator_base& two) const + bool operator()(const typename Tree::iterator_base& one, + const typename Tree::iterator_base& two) const { return one.node < two.node; } @@ -438,7 +444,7 @@ class tree { private: tree_node_allocator alloc_; void head_initialise_(); - void copy_(const tree& other); + void copy_(const Tree& other); /// Comparator class for two nodes of a tree (used for sorting and searching). template @@ -459,8 +465,8 @@ class tree { //template //class iterator_base_less { // public: -// bool operator()(const typename tree::iterator_base& one, -// const typename tree::iterator_base& two) const +// bool operator()(const typename Tree::iterator_base& one, +// const typename Tree::iterator_base& two) const // { // txtout << "operatorclass<" << one.node < two.node << std::endl; // return one.node < two.node; @@ -468,8 +474,8 @@ class tree { //}; // template -// bool operator<(const typename tree::iterator& one, -// const typename tree::iterator& two) +// bool operator<(const typename Tree::iterator& one, +// const typename Tree::iterator& two) // { // txtout << "operator< " << one.node < two.node << std::endl; // if(one.node < two.node) return true; @@ -477,8 +483,8 @@ class tree { // } // // template -// bool operator==(const typename tree::iterator& one, -// const typename tree::iterator& two) +// bool operator==(const typename Tree::iterator& one, +// const typename Tree::iterator& two) // { // txtout << "operator== " << one.node == two.node << std::endl; // if(one.node == two.node) return true; @@ -486,8 +492,8 @@ class tree { // } // // template -// bool operator>(const typename tree::iterator_base& one, -// const typename tree::iterator_base& two) +// bool operator>(const typename Tree::iterator_base& one, +// const typename Tree::iterator_base& two) // { // txtout << "operator> " << one.node < two.node << std::endl; // if(one.node > two.node) return true; @@ -499,20 +505,20 @@ class tree { // Tree template -tree::tree() +Tree::Tree() { head_initialise_(); } template -tree::tree(const T& x) +Tree::Tree(const T& x) { head_initialise_(); set_head(x); } template -tree::tree(const iterator_base& other) +Tree::Tree(const iterator_base& other) { head_initialise_(); set_head((*other)); @@ -520,7 +526,7 @@ tree::tree(const iterator_base& other) } template -tree::~tree() +Tree::~Tree() { clear(); alloc_.deallocate(head,1); @@ -528,7 +534,7 @@ tree::~tree() } template -void tree::head_initialise_() +void Tree::head_initialise_() { head = alloc_.allocate(1,0); // MSVC does not have default second argument feet = alloc_.allocate(1,0); @@ -547,20 +553,20 @@ void tree::head_initialise_() } template -void tree::operator=(const tree& other) +void Tree::operator=(const Tree& other) { copy_(other); } template -tree::tree(const tree& other) +Tree::Tree(const Tree& other) { head_initialise_(); copy_(other); } template -void tree::copy_(const tree& other) +void Tree::copy_(const Tree& other) { clear(); pre_order_iterator it=other.begin(), to=begin(); @@ -581,7 +587,7 @@ void tree::copy_(const tree& oth } template -void tree::clear() +void Tree::clear() { if(head) while(head->next_sibling!=feet) @@ -589,7 +595,7 @@ void tree::clear() } template -void tree::erase_children(const iterator_base& it) +void Tree::erase_children(const iterator_base& it) { // std::cout << "erase_children " << it.node << std::endl; if(it.node==0) return; @@ -601,7 +607,7 @@ void tree::erase_children(const iterator_base& it) prev=cur; cur=cur->next_sibling; erase_children(pre_order_iterator(prev)); - lumiera::destructor(&prev->data); + lib::destructor(&prev->data); alloc_.deallocate(prev,1); } it.node->first_child=0; @@ -611,7 +617,7 @@ void tree::erase_children(const iterator_base& it) template template -iter tree::erase(iter it) +iter Tree::erase(iter it) { tree_node *cur=it.node; assert(cur!=head); @@ -632,37 +638,37 @@ iter tree::erase(iter it) cur->next_sibling->prev_sibling=cur->prev_sibling; } - lumiera::destructor(&cur->data); + lib::destructor(&cur->data); alloc_.deallocate(cur,1); return ret; } template -typename tree::pre_order_iterator tree::begin() const +typename Tree::pre_order_iterator Tree::begin() const { return pre_order_iterator(head->next_sibling); } template -typename tree::pre_order_iterator tree::end() const +typename Tree::pre_order_iterator Tree::end() const { return pre_order_iterator(feet); } template -typename tree::breadth_first_queued_iterator tree::begin_breadth_first() const +typename Tree::breadth_first_queued_iterator Tree::begin_breadth_first() const { return breadth_first_queued_iterator(head->next_sibling); } template -typename tree::breadth_first_queued_iterator tree::end_breadth_first() const +typename Tree::breadth_first_queued_iterator Tree::end_breadth_first() const { return breadth_first_queued_iterator(); } template -typename tree::post_order_iterator tree::begin_post() const +typename Tree::post_order_iterator Tree::begin_post() const { tree_node *tmp=head->next_sibling; if(tmp!=feet) { @@ -673,15 +679,15 @@ typename tree::post_order_iterator tree -typename tree::post_order_iterator tree::end_post() const +typename Tree::post_order_iterator Tree::end_post() const { return post_order_iterator(feet); } template -typename tree::fixed_depth_iterator tree::begin_fixed(const iterator_base& pos, unsigned int dp) const +typename Tree::fixed_depth_iterator Tree::begin_fixed(const iterator_base& pos, unsigned int dp) const { - typename tree::fixed_depth_iterator ret; + typename Tree::fixed_depth_iterator ret; ret.top_node=pos.node; tree_node *tmp=pos.node; @@ -710,7 +716,7 @@ typename tree::fixed_depth_iterator tree -typename tree::fixed_depth_iterator tree::end_fixed(const iterator_base& pos, unsigned int dp) const +typename Tree::fixed_depth_iterator Tree::end_fixed(const iterator_base& pos, unsigned int dp) const { assert(1==0); // FIXME: not correct yet: use is_valid() as a temporary workaround tree_node *tmp=pos.node; @@ -728,7 +734,7 @@ typename tree::fixed_depth_iterator tree -typename tree::sibling_iterator tree::begin(const iterator_base& pos) const +typename Tree::sibling_iterator Tree::begin(const iterator_base& pos) const { assert(pos.node!=0); if(pos.node->first_child==0) { @@ -738,7 +744,7 @@ typename tree::sibling_iterator tree -typename tree::sibling_iterator tree::end(const iterator_base& pos) const +typename Tree::sibling_iterator Tree::end(const iterator_base& pos) const { sibling_iterator ret(0); ret.parent_=pos.node; @@ -746,7 +752,7 @@ typename tree::sibling_iterator tree -typename tree::leaf_iterator tree::begin_leaf() const +typename Tree::leaf_iterator Tree::begin_leaf() const { tree_node *tmp=head->next_sibling; if(tmp!=feet) { @@ -757,13 +763,13 @@ typename tree::leaf_iterator tree -typename tree::leaf_iterator tree::end_leaf() const +typename Tree::leaf_iterator Tree::end_leaf() const { return leaf_iterator(feet); } template -typename tree::leaf_iterator tree::begin_leaf(const iterator_base& top) const +typename Tree::leaf_iterator Tree::begin_leaf(const iterator_base& top) const { tree_node *tmp=top.node; while(tmp->first_child) @@ -772,14 +778,14 @@ typename tree::leaf_iterator tree -typename tree::leaf_iterator tree::end_leaf(const iterator_base& top) const +typename Tree::leaf_iterator Tree::end_leaf(const iterator_base& top) const { return leaf_iterator(top.node, top.node); } template template -iter tree::parent(iter position) +iter Tree::parent(iter position) { assert(position.node!=0); return iter(position.node->parent); @@ -787,7 +793,7 @@ iter tree::parent(iter position) template template -iter tree::previous_sibling(iter position) const +iter Tree::previous_sibling(iter position) const { assert(position.node!=0); iter ret(position); @@ -797,7 +803,7 @@ iter tree::previous_sibling(iter position) const template template -iter tree::next_sibling(iter position) const +iter Tree::next_sibling(iter position) const { assert(position.node!=0); iter ret(position); @@ -807,11 +813,11 @@ iter tree::next_sibling(iter position) const template template -iter tree::next_at_same_depth(iter position) const +iter Tree::next_at_same_depth(iter position) const { // We make use of a temporary fixed_depth iterator to implement this. - typename tree::fixed_depth_iterator tmp(position.node); + typename Tree::fixed_depth_iterator tmp(position.node); ++tmp; return iter(tmp); @@ -852,13 +858,13 @@ iter tree::next_at_same_depth(iter position) const template template -iter tree::append_child(iter position) +iter Tree::append_child(iter position) { assert(position.node!=head); assert(position.node); tree_node *tmp=alloc_.allocate(1,0); - lumiera::constructor(&tmp->data); + lib::constructor(&tmp->data); tmp->first_child=0; tmp->last_child=0; @@ -877,13 +883,13 @@ iter tree::append_child(iter position) template template -iter tree::prepend_child(iter position) +iter Tree::prepend_child(iter position) { assert(position.node!=head); assert(position.node); tree_node *tmp=alloc_.allocate(1,0); - lumiera::constructor(&tmp->data); + lib::constructor(&tmp->data); tmp->first_child=0; tmp->last_child=0; @@ -902,7 +908,7 @@ iter tree::prepend_child(iter position) template template -iter tree::append_child(iter position, const T& x) +iter Tree::append_child(iter position, const T& x) { // If your program fails here you probably used 'append_child' to add the top // node to an empty tree. From version 1.45 the top element should be added @@ -912,7 +918,7 @@ iter tree::append_child(iter position, const T& x) assert(position.node); tree_node* tmp = alloc_.allocate(1,0); - lumiera::constructor(&tmp->data, x); + lib::constructor(&tmp->data, x); tmp->first_child=0; tmp->last_child=0; @@ -931,13 +937,13 @@ iter tree::append_child(iter position, const T& x) template template -iter tree::prepend_child(iter position, const T& x) +iter Tree::prepend_child(iter position, const T& x) { assert(position.node!=head); assert(position.node); tree_node* tmp = alloc_.allocate(1,0); - lumiera::constructor(&tmp->data, x); + lib::constructor(&tmp->data, x); tmp->first_child=0; tmp->last_child=0; @@ -956,7 +962,7 @@ iter tree::prepend_child(iter position, const T& x) template template -iter tree::append_child(iter position, iter other) +iter Tree::append_child(iter position, iter other) { assert(position.node!=head); assert(position.node); @@ -967,7 +973,7 @@ iter tree::append_child(iter position, iter other) template template -iter tree::prepend_child(iter position, iter other) +iter Tree::prepend_child(iter position, iter other) { assert(position.node!=head); assert(position.node); @@ -978,7 +984,7 @@ iter tree::prepend_child(iter position, iter other) template template -iter tree::append_children(iter position, sibling_iterator from, sibling_iterator to) +iter Tree::append_children(iter position, sibling_iterator from, sibling_iterator to) { assert(position.node!=head); assert(position.node); @@ -994,7 +1000,7 @@ iter tree::append_children(iter position, sibling_iterat template template -iter tree::prepend_children(iter position, sibling_iterator from, sibling_iterator to) +iter Tree::prepend_children(iter position, sibling_iterator from, sibling_iterator to) { assert(position.node!=head); assert(position.node); @@ -1009,7 +1015,7 @@ iter tree::prepend_children(iter position, sibling_itera } template -typename tree::pre_order_iterator tree::set_head(const T& x) +typename Tree::pre_order_iterator Tree::set_head(const T& x) { assert(head->next_sibling==feet); return insert(iterator(feet), x); @@ -1017,14 +1023,14 @@ typename tree::pre_order_iterator tree template -iter tree::insert(iter position, const T& x) +iter Tree::insert(iter position, const T& x) { if(position.node==0) { position.node=feet; // Backward compatibility: when calling insert on a null node, // insert before the feet. } tree_node* tmp = alloc_.allocate(1,0); - lumiera::constructor(&tmp->data, x); + lib::constructor(&tmp->data, x); tmp->first_child=0; tmp->last_child=0; @@ -1043,10 +1049,10 @@ iter tree::insert(iter position, const T& x) } template -typename tree::sibling_iterator tree::insert(sibling_iterator position, const T& x) +typename Tree::sibling_iterator Tree::insert(sibling_iterator position, const T& x) { tree_node* tmp = alloc_.allocate(1,0); - lumiera::constructor(&tmp->data, x); + lib::constructor(&tmp->data, x); tmp->first_child=0; tmp->last_child=0; @@ -1073,10 +1079,10 @@ typename tree::sibling_iterator tree template -iter tree::insert_after(iter position, const T& x) +iter Tree::insert_after(iter position, const T& x) { tree_node* tmp = alloc_.allocate(1,0); - lumiera::constructor(&tmp->data, x); + lib::constructor(&tmp->data, x); tmp->first_child=0; tmp->last_child=0; @@ -1097,7 +1103,7 @@ iter tree::insert_after(iter position, const T& x) template template -iter tree::insert_subtree(iter position, const iterator_base& subtree) +iter Tree::insert_subtree(iter position, const iterator_base& subtree) { // insert dummy iter it=insert(position, value_type()); @@ -1107,7 +1113,7 @@ iter tree::insert_subtree(iter position, const iterator_ template template -iter tree::insert_subtree_after(iter position, const iterator_base& subtree) +iter Tree::insert_subtree_after(iter position, const iterator_base& subtree) { // insert dummy iter it=insert_after(position, value_type()); @@ -1117,7 +1123,7 @@ iter tree::insert_subtree_after(iter position, const ite // template // template -// iter tree::insert_subtree(sibling_iterator position, iter subtree) +// iter Tree::insert_subtree(sibling_iterator position, iter subtree) // { // // insert dummy // iter it(insert(position, value_type())); @@ -1127,16 +1133,16 @@ iter tree::insert_subtree_after(iter position, const ite template template -iter tree::replace(iter position, const T& x) +iter Tree::replace(iter position, const T& x) { - lumiera::destructor(&position.node->data); - lumiera::constructor(&position.node->data, x); + lib::destructor(&position.node->data); + lib::constructor(&position.node->data, x); return position; } template template -iter tree::replace(iter position, const iterator_base& from) +iter Tree::replace(iter position, const iterator_base& from) { assert(position.node!=head); tree_node *current_from=from.node; @@ -1148,7 +1154,7 @@ iter tree::replace(iter position, const iterator_base& f erase_children(position); // std::cout << "no warning!" << std::endl; tree_node* tmp = alloc_.allocate(1,0); - lumiera::constructor(&tmp->data, (*from)); + lib::constructor(&tmp->data, (*from)); tmp->first_child=0; tmp->last_child=0; if(current_to->prev_sibling==0) { @@ -1168,7 +1174,7 @@ iter tree::replace(iter position, const iterator_base& f } tmp->next_sibling=current_to->next_sibling; tmp->parent=current_to->parent; - lumiera::destructor(¤t_to->data); + lib::destructor(¤t_to->data); alloc_.deallocate(current_to,1); current_to=tmp; @@ -1200,7 +1206,7 @@ iter tree::replace(iter position, const iterator_base& f } template -typename tree::sibling_iterator tree::replace( +typename Tree::sibling_iterator Tree::replace( sibling_iterator orig_begin, sibling_iterator orig_end, sibling_iterator new_begin, @@ -1246,7 +1252,7 @@ typename tree::sibling_iterator tree template -iter tree::flatten(iter position) +iter Tree::flatten(iter position) { if(position.node->first_child==0) return position; @@ -1274,7 +1280,7 @@ iter tree::flatten(iter position) template template -iter tree::reparent(iter position, sibling_iterator begin, sibling_iterator end) +iter Tree::reparent(iter position, sibling_iterator begin, sibling_iterator end) { tree_node *first=begin.node; tree_node *last=first; @@ -1322,14 +1328,14 @@ iter tree::reparent(iter position, sibling_iterator begi } template -template iter tree::reparent(iter position, iter from) +template iter Tree::reparent(iter position, iter from) { if(from.node->first_child==0) return position; return reparent(position, from.node->first_child, end(from)); } template -template iter tree::wrap(iter position, const T& x) +template iter Tree::wrap(iter position, const T& x) { assert(position.node!=0); sibling_iterator fr=position, to=position; @@ -1340,7 +1346,7 @@ template iter tree::wrap(iter position, } template -template iter tree::move_after(iter target, iter source) +template iter Tree::move_after(iter target, iter source) { tree_node *dst=target.node; tree_node *src=source.node; @@ -1369,7 +1375,7 @@ template iter tree::move_after(iter targ } template -template iter tree::move_before(iter target, iter source) +template iter Tree::move_before(iter target, iter source) { tree_node *dst=target.node; tree_node *src=source.node; @@ -1399,7 +1405,7 @@ template iter tree::move_before(iter tar // specialisation for sibling_iterators template -typename tree::sibling_iterator tree::move_before(sibling_iterator target, +typename Tree::sibling_iterator Tree::move_before(sibling_iterator target, sibling_iterator source) { tree_node *dst=target.node; @@ -1436,7 +1442,7 @@ typename tree::sibling_iterator tree -template iter tree::move_ontop(iter target, iter source) +template iter Tree::move_ontop(iter target, iter source) { tree_node *dst=target.node; tree_node *src=source.node; @@ -1471,7 +1477,7 @@ template iter tree::move_ontop(iter targ } template -void tree::merge(sibling_iterator to1, sibling_iterator to2, +void Tree::merge(sibling_iterator to1, sibling_iterator to2, sibling_iterator from1, sibling_iterator from2, bool duplicate_leaves) { @@ -1495,7 +1501,7 @@ void tree::merge(sibling_iterator to1, sibling_iterato template -void tree::sort(sibling_iterator from, sibling_iterator to, bool deep) +void Tree::sort(sibling_iterator from, sibling_iterator to, bool deep) { std::less comp; sort(from, to, comp, deep); @@ -1503,7 +1509,7 @@ void tree::sort(sibling_iterator from, sibling_iterator template template -void tree::sort(sibling_iterator from, sibling_iterator to, +void Tree::sort(sibling_iterator from, sibling_iterator to, StrictWeakOrdering comp, bool deep) { if(from==to) return; @@ -1563,7 +1569,7 @@ void tree::sort(sibling_iterator from, sibling_iterator template template -bool tree::equal(const iter& one_, const iter& two, const iter& three_) const +bool Tree::equal(const iter& one_, const iter& two, const iter& three_) const { std::equal_to comp; return equal(one_, two, three_, comp); @@ -1571,7 +1577,7 @@ bool tree::equal(const iter& one_, const iter& two, cons template template -bool tree::equal_subtree(const iter& one_, const iter& two_) const +bool Tree::equal_subtree(const iter& one_, const iter& two_) const { std::equal_to comp; return equal_subtree(one_, two_, comp); @@ -1579,7 +1585,7 @@ bool tree::equal_subtree(const iter& one_, const iter& t template template -bool tree::equal(const iter& one_, const iter& two, const iter& three_, BinaryPredicate fun) const +bool Tree::equal(const iter& one_, const iter& two, const iter& three_, BinaryPredicate fun) const { pre_order_iterator one(one_), three(three_); @@ -1598,7 +1604,7 @@ bool tree::equal(const iter& one_, const iter& two, cons template template -bool tree::equal_subtree(const iter& one_, const iter& two_, BinaryPredicate fun) const +bool Tree::equal_subtree(const iter& one_, const iter& two_, BinaryPredicate fun) const { pre_order_iterator one(one_), two(two_); @@ -1608,23 +1614,23 @@ bool tree::equal_subtree(const iter& one_, const iter& t } template -tree tree::subtree(sibling_iterator from, sibling_iterator to) const +Tree Tree::subtree(sibling_iterator from, sibling_iterator to) const { - tree tmp; + Tree tmp; tmp.set_head(value_type()); tmp.replace(tmp.begin(), tmp.end(), from, to); return tmp; } template -void tree::subtree(tree& tmp, sibling_iterator from, sibling_iterator to) const +void Tree::subtree(Tree& tmp, sibling_iterator from, sibling_iterator to) const { tmp.set_head(value_type()); tmp.replace(tmp.begin(), tmp.end(), from, to); } template -size_t tree::size() const +size_t Tree::size() const { size_t i=0; pre_order_iterator it=begin(), eit=end(); @@ -1636,7 +1642,7 @@ size_t tree::size() const } template -size_t tree::size(const iterator_base& top) const +size_t Tree::size(const iterator_base& top) const { size_t i=0; pre_order_iterator it=top, eit=top; @@ -1650,14 +1656,14 @@ size_t tree::size(const iterator_base& top) const } template -bool tree::empty() const +bool Tree::empty() const { pre_order_iterator it=begin(), eit=end(); return (it==eit); } template -int tree::depth(const iterator_base& it) +int Tree::depth(const iterator_base& it) { tree_node* pos=it.node; assert(pos!=0); @@ -1670,7 +1676,7 @@ int tree::depth(const iterator_base& it) } template -int tree::depth(const iterator_base& it, const iterator_base& root) +int Tree::depth(const iterator_base& it, const iterator_base& root) { tree_node* pos=it.node; assert(pos!=0); @@ -1683,7 +1689,7 @@ int tree::depth(const iterator_base& it, const iterator_ } template -int tree::max_depth() const +int Tree::max_depth() const { int maxd=-1; for(tree_node *it = head->next_sibling; it!=feet; it=it->next_sibling) @@ -1694,7 +1700,7 @@ int tree::max_depth() const template -int tree::max_depth(const iterator_base& pos) const +int Tree::max_depth(const iterator_base& pos) const { tree_node *tmp=pos.node; @@ -1722,7 +1728,7 @@ int tree::max_depth(const iterator_base& pos) const } template -unsigned int tree::number_of_children(const iterator_base& it) +unsigned int Tree::number_of_children(const iterator_base& it) { tree_node *pos=it.node->first_child; if(pos==0) return 0; @@ -1738,7 +1744,7 @@ unsigned int tree::number_of_children(const iterator_bas } template -unsigned int tree::number_of_siblings(const iterator_base& it) const +unsigned int Tree::number_of_siblings(const iterator_base& it) const { tree_node *pos=it.node; unsigned int ret=0; @@ -1762,7 +1768,7 @@ unsigned int tree::number_of_siblings(const iterator_bas } template -void tree::swap(sibling_iterator it) +void Tree::swap(sibling_iterator it) { tree_node *nxt=it.node->next_sibling; if(nxt) { @@ -1783,7 +1789,7 @@ void tree::swap(sibling_iterator it) } template -void tree::swap(iterator one, iterator two) +void Tree::swap(iterator one, iterator two) { // if one and two are adjacent siblings, use the sibling swap if(one.node->next_sibling==two.node) swap(one); @@ -1816,7 +1822,7 @@ void tree::swap(iterator one, iterator two) } // template -// tree::iterator tree::find_subtree( +// Tree::iterator Tree::find_subtree( // sibling_iterator subfrom, sibling_iterator subto, iterator from, iterator to, // BinaryPredicate fun) const // { @@ -1830,7 +1836,7 @@ void tree::swap(iterator one, iterator two) // } template -bool tree::is_in_subtree(const iterator_base& it, const iterator_base& begin, +bool Tree::is_in_subtree(const iterator_base& it, const iterator_base& begin, const iterator_base& end) const { // FIXME: this should be optimised. @@ -1843,14 +1849,14 @@ bool tree::is_in_subtree(const iterator_base& it, const } template -bool tree::is_valid(const iterator_base& it) const +bool Tree::is_valid(const iterator_base& it) const { if(it.node==0 || it.node==feet || it.node==head) return false; else return true; } template -unsigned int tree::index(sibling_iterator it) const +unsigned int Tree::index(sibling_iterator it) const { unsigned int ind=0; if(it.node->parent==0) { @@ -1870,7 +1876,7 @@ unsigned int tree::index(sibling_iterator it) const template -typename tree::sibling_iterator tree::child(const iterator_base& it, unsigned int num) +typename Tree::sibling_iterator Tree::child(const iterator_base& it, unsigned int num) { tree_node *tmp=it.node->first_child; while(num--) { @@ -1886,87 +1892,87 @@ typename tree::sibling_iterator tree -tree::iterator_base::iterator_base() +Tree::iterator_base::iterator_base() : node(0), skip_current_children_(false) { } template -tree::iterator_base::iterator_base(tree_node *tn) +Tree::iterator_base::iterator_base(tree_node *tn) : node(tn), skip_current_children_(false) { } template -T& tree::iterator_base::operator*() const +T& Tree::iterator_base::operator*() const { return node->data; } template -T* tree::iterator_base::operator->() const +T* Tree::iterator_base::operator->() const { return &(node->data); } template -bool tree::post_order_iterator::operator!=(const post_order_iterator& other) const +bool Tree::post_order_iterator::operator!=(const post_order_iterator& other) const { if(other.node!=this->node) return true; else return false; } template -bool tree::post_order_iterator::operator==(const post_order_iterator& other) const +bool Tree::post_order_iterator::operator==(const post_order_iterator& other) const { if(other.node==this->node) return true; else return false; } template -bool tree::pre_order_iterator::operator!=(const pre_order_iterator& other) const +bool Tree::pre_order_iterator::operator!=(const pre_order_iterator& other) const { if(other.node!=this->node) return true; else return false; } template -bool tree::pre_order_iterator::operator==(const pre_order_iterator& other) const +bool Tree::pre_order_iterator::operator==(const pre_order_iterator& other) const { if(other.node==this->node) return true; else return false; } template -bool tree::sibling_iterator::operator!=(const sibling_iterator& other) const +bool Tree::sibling_iterator::operator!=(const sibling_iterator& other) const { if(other.node!=this->node) return true; else return false; } template -bool tree::sibling_iterator::operator==(const sibling_iterator& other) const +bool Tree::sibling_iterator::operator==(const sibling_iterator& other) const { if(other.node==this->node) return true; else return false; } template -bool tree::leaf_iterator::operator!=(const leaf_iterator& other) const +bool Tree::leaf_iterator::operator!=(const leaf_iterator& other) const { if(other.node!=this->node) return true; else return false; } template -bool tree::leaf_iterator::operator==(const leaf_iterator& other) const +bool Tree::leaf_iterator::operator==(const leaf_iterator& other) const { if(other.node==this->node && other.top_node==this->top_node) return true; else return false; } template -typename tree::sibling_iterator tree::iterator_base::begin() const +typename Tree::sibling_iterator Tree::iterator_base::begin() const { if(node->first_child==0) return end(); @@ -1977,7 +1983,7 @@ typename tree::sibling_iterator tree -typename tree::sibling_iterator tree::iterator_base::end() const +typename Tree::sibling_iterator Tree::iterator_base::end() const { sibling_iterator ret(0); ret.parent_=node; @@ -1985,13 +1991,13 @@ typename tree::sibling_iterator tree -void tree::iterator_base::skip_children() +void Tree::iterator_base::skip_children() { skip_current_children_=true; } template -unsigned int tree::iterator_base::number_of_children() const +unsigned int Tree::iterator_base::number_of_children() const { tree_node *pos=node->first_child; if(pos==0) return 0; @@ -2005,7 +2011,7 @@ unsigned int tree::iterator_base::number_of_children() c } template -bool tree::iterator_base::is_descendant_of(iterator_base parent) const +bool Tree::iterator_base::is_descendant_of(iterator_base parent) const { const tree_node *node = this->node; while(node != NULL) { @@ -2020,25 +2026,25 @@ bool tree::iterator_base::is_descendant_of(iterator_base // Pre-order iterator template -tree::pre_order_iterator::pre_order_iterator() +Tree::pre_order_iterator::pre_order_iterator() : iterator_base(0) { } template -tree::pre_order_iterator::pre_order_iterator(tree_node *tn) +Tree::pre_order_iterator::pre_order_iterator(tree_node *tn) : iterator_base(tn) { } template -tree::pre_order_iterator::pre_order_iterator(const iterator_base &other) +Tree::pre_order_iterator::pre_order_iterator(const iterator_base &other) : iterator_base(other.node) { } template -tree::pre_order_iterator::pre_order_iterator(const sibling_iterator& other) +Tree::pre_order_iterator::pre_order_iterator(const sibling_iterator& other) : iterator_base(other.node) { if(this->node==0) { @@ -2052,7 +2058,7 @@ tree::pre_order_iterator::pre_order_iterator(const sibli } template -typename tree::pre_order_iterator& tree::pre_order_iterator::operator++() +typename Tree::pre_order_iterator& Tree::pre_order_iterator::operator++() { assert(this->node!=0); if(!this->skip_current_children_ && this->node->first_child != 0) { @@ -2071,7 +2077,7 @@ typename tree::pre_order_iterator& tree -typename tree::pre_order_iterator& tree::pre_order_iterator::operator--() +typename Tree::pre_order_iterator& Tree::pre_order_iterator::operator--() { assert(this->node!=0); if(this->node->prev_sibling) { @@ -2088,7 +2094,7 @@ typename tree::pre_order_iterator& tree -typename tree::pre_order_iterator tree::pre_order_iterator::operator++(int) +typename Tree::pre_order_iterator Tree::pre_order_iterator::operator++(int) { pre_order_iterator copy = *this; ++(*this); @@ -2096,7 +2102,7 @@ typename tree::pre_order_iterator tree -typename tree::pre_order_iterator tree::pre_order_iterator::operator--(int) +typename Tree::pre_order_iterator Tree::pre_order_iterator::operator--(int) { pre_order_iterator copy = *this; --(*this); @@ -2104,7 +2110,7 @@ typename tree::pre_order_iterator tree -typename tree::pre_order_iterator& tree::pre_order_iterator::operator+=(unsigned int num) +typename Tree::pre_order_iterator& Tree::pre_order_iterator::operator+=(unsigned int num) { while(num>0) { ++(*this); @@ -2114,7 +2120,7 @@ typename tree::pre_order_iterator& tree -typename tree::pre_order_iterator& tree::pre_order_iterator::operator-=(unsigned int num) +typename Tree::pre_order_iterator& Tree::pre_order_iterator::operator-=(unsigned int num) { while(num>0) { --(*this); @@ -2128,25 +2134,25 @@ typename tree::pre_order_iterator& tree -tree::post_order_iterator::post_order_iterator() +Tree::post_order_iterator::post_order_iterator() : iterator_base(0) { } template -tree::post_order_iterator::post_order_iterator(tree_node *tn) +Tree::post_order_iterator::post_order_iterator(tree_node *tn) : iterator_base(tn) { } template -tree::post_order_iterator::post_order_iterator(const iterator_base &other) +Tree::post_order_iterator::post_order_iterator(const iterator_base &other) : iterator_base(other.node) { } template -tree::post_order_iterator::post_order_iterator(const sibling_iterator& other) +Tree::post_order_iterator::post_order_iterator(const sibling_iterator& other) : iterator_base(other.node) { if(this->node==0) { @@ -2160,7 +2166,7 @@ tree::post_order_iterator::post_order_iterator(const sib } template -typename tree::post_order_iterator& tree::post_order_iterator::operator++() +typename Tree::post_order_iterator& Tree::post_order_iterator::operator++() { assert(this->node!=0); if(this->node->next_sibling==0) { @@ -2181,7 +2187,7 @@ typename tree::post_order_iterator& tree -typename tree::post_order_iterator& tree::post_order_iterator::operator--() +typename Tree::post_order_iterator& Tree::post_order_iterator::operator--() { assert(this->node!=0); if(this->skip_current_children_ || this->node->last_child==0) { @@ -2197,7 +2203,7 @@ typename tree::post_order_iterator& tree -typename tree::post_order_iterator tree::post_order_iterator::operator++(int) +typename Tree::post_order_iterator Tree::post_order_iterator::operator++(int) { post_order_iterator copy = *this; ++(*this); @@ -2205,7 +2211,7 @@ typename tree::post_order_iterator tree -typename tree::post_order_iterator tree::post_order_iterator::operator--(int) +typename Tree::post_order_iterator Tree::post_order_iterator::operator--(int) { post_order_iterator copy = *this; --(*this); @@ -2214,7 +2220,7 @@ typename tree::post_order_iterator tree -typename tree::post_order_iterator& tree::post_order_iterator::operator+=(unsigned int num) +typename Tree::post_order_iterator& Tree::post_order_iterator::operator+=(unsigned int num) { while(num>0) { ++(*this); @@ -2224,7 +2230,7 @@ typename tree::post_order_iterator& tree -typename tree::post_order_iterator& tree::post_order_iterator::operator-=(unsigned int num) +typename Tree::post_order_iterator& Tree::post_order_iterator::operator-=(unsigned int num) { while(num>0) { --(*this); @@ -2234,7 +2240,7 @@ typename tree::post_order_iterator& tree -void tree::post_order_iterator::descend_all() +void Tree::post_order_iterator::descend_all() { assert(this->node!=0); while(this->node->first_child) @@ -2245,41 +2251,41 @@ void tree::post_order_iterator::descend_all() // Breadth-first iterator template -tree::breadth_first_queued_iterator::breadth_first_queued_iterator() +Tree::breadth_first_queued_iterator::breadth_first_queued_iterator() : iterator_base() { } template -tree::breadth_first_queued_iterator::breadth_first_queued_iterator(tree_node *tn) +Tree::breadth_first_queued_iterator::breadth_first_queued_iterator(tree_node *tn) : iterator_base(tn) { traversal_queue.push(tn); } template -tree::breadth_first_queued_iterator::breadth_first_queued_iterator(const iterator_base& other) +Tree::breadth_first_queued_iterator::breadth_first_queued_iterator(const iterator_base& other) : iterator_base(other.node) { traversal_queue.push(other.node); } template -bool tree::breadth_first_queued_iterator::operator!=(const breadth_first_queued_iterator& other) const +bool Tree::breadth_first_queued_iterator::operator!=(const breadth_first_queued_iterator& other) const { if(other.node!=this->node) return true; else return false; } template -bool tree::breadth_first_queued_iterator::operator==(const breadth_first_queued_iterator& other) const +bool Tree::breadth_first_queued_iterator::operator==(const breadth_first_queued_iterator& other) const { if(other.node==this->node) return true; else return false; } template -typename tree::breadth_first_queued_iterator& tree::breadth_first_queued_iterator::operator++() +typename Tree::breadth_first_queued_iterator& Tree::breadth_first_queued_iterator::operator++() { assert(this->node!=0); @@ -2298,7 +2304,7 @@ typename tree::breadth_first_queued_iterator& tree -typename tree::breadth_first_queued_iterator tree::breadth_first_queued_iterator::operator++(int) +typename Tree::breadth_first_queued_iterator Tree::breadth_first_queued_iterator::operator++(int) { breadth_first_queued_iterator copy = *this; ++(*this); @@ -2306,7 +2312,7 @@ typename tree::breadth_first_queued_iterator tree -typename tree::breadth_first_queued_iterator& tree::breadth_first_queued_iterator::operator+=(unsigned int num) +typename Tree::breadth_first_queued_iterator& Tree::breadth_first_queued_iterator::operator+=(unsigned int num) { while(num>0) { ++(*this); @@ -2320,51 +2326,51 @@ typename tree::breadth_first_queued_iterator& tree -tree::fixed_depth_iterator::fixed_depth_iterator() +Tree::fixed_depth_iterator::fixed_depth_iterator() : iterator_base() { } template -tree::fixed_depth_iterator::fixed_depth_iterator(tree_node *tn) +Tree::fixed_depth_iterator::fixed_depth_iterator(tree_node *tn) : iterator_base(tn), top_node(0) { } template -tree::fixed_depth_iterator::fixed_depth_iterator(const iterator_base& other) +Tree::fixed_depth_iterator::fixed_depth_iterator(const iterator_base& other) : iterator_base(other.node), top_node(0) { } template -tree::fixed_depth_iterator::fixed_depth_iterator(const sibling_iterator& other) +Tree::fixed_depth_iterator::fixed_depth_iterator(const sibling_iterator& other) : iterator_base(other.node), top_node(0) { } template -tree::fixed_depth_iterator::fixed_depth_iterator(const fixed_depth_iterator& other) +Tree::fixed_depth_iterator::fixed_depth_iterator(const fixed_depth_iterator& other) : iterator_base(other.node), top_node(other.top_node) { } template -bool tree::fixed_depth_iterator::operator==(const fixed_depth_iterator& other) const +bool Tree::fixed_depth_iterator::operator==(const fixed_depth_iterator& other) const { if(other.node==this->node && other.top_node==top_node) return true; else return false; } template -bool tree::fixed_depth_iterator::operator!=(const fixed_depth_iterator& other) const +bool Tree::fixed_depth_iterator::operator!=(const fixed_depth_iterator& other) const { if(other.node!=this->node || other.top_node!=top_node) return true; else return false; } template -typename tree::fixed_depth_iterator& tree::fixed_depth_iterator::operator++() +typename Tree::fixed_depth_iterator& Tree::fixed_depth_iterator::operator++() { assert(this->node!=0); @@ -2404,7 +2410,7 @@ typename tree::fixed_depth_iterator& tree -typename tree::fixed_depth_iterator& tree::fixed_depth_iterator::operator--() +typename Tree::fixed_depth_iterator& Tree::fixed_depth_iterator::operator--() { assert(this->node!=0); @@ -2466,7 +2472,7 @@ typename tree::fixed_depth_iterator& tree -typename tree::fixed_depth_iterator tree::fixed_depth_iterator::operator++(int) +typename Tree::fixed_depth_iterator Tree::fixed_depth_iterator::operator++(int) { fixed_depth_iterator copy = *this; ++(*this); @@ -2474,7 +2480,7 @@ typename tree::fixed_depth_iterator tree -typename tree::fixed_depth_iterator tree::fixed_depth_iterator::operator--(int) +typename Tree::fixed_depth_iterator Tree::fixed_depth_iterator::operator--(int) { fixed_depth_iterator copy = *this; --(*this); @@ -2482,7 +2488,7 @@ typename tree::fixed_depth_iterator tree -typename tree::fixed_depth_iterator& tree::fixed_depth_iterator::operator-=(unsigned int num) +typename Tree::fixed_depth_iterator& Tree::fixed_depth_iterator::operator-=(unsigned int num) { while(num>0) { --(*this); @@ -2492,7 +2498,7 @@ typename tree::fixed_depth_iterator& tree -typename tree::fixed_depth_iterator& tree::fixed_depth_iterator::operator+=(unsigned int num) +typename Tree::fixed_depth_iterator& Tree::fixed_depth_iterator::operator+=(unsigned int num) { while(num>0) { ++(*this); @@ -2505,34 +2511,34 @@ typename tree::fixed_depth_iterator& tree -tree::sibling_iterator::sibling_iterator() +Tree::sibling_iterator::sibling_iterator() : iterator_base() { set_parent_(); } template -tree::sibling_iterator::sibling_iterator(tree_node *tn) +Tree::sibling_iterator::sibling_iterator(tree_node *tn) : iterator_base(tn) { set_parent_(); } template -tree::sibling_iterator::sibling_iterator(const iterator_base& other) +Tree::sibling_iterator::sibling_iterator(const iterator_base& other) : iterator_base(other.node) { set_parent_(); } template -tree::sibling_iterator::sibling_iterator(const sibling_iterator& other) +Tree::sibling_iterator::sibling_iterator(const sibling_iterator& other) : iterator_base(other), parent_(other.parent_) { } template -void tree::sibling_iterator::set_parent_() +void Tree::sibling_iterator::set_parent_() { parent_=0; if(this->node==0) return; @@ -2541,7 +2547,7 @@ void tree::sibling_iterator::set_parent_() } template -typename tree::sibling_iterator& tree::sibling_iterator::operator++() +typename Tree::sibling_iterator& Tree::sibling_iterator::operator++() { if(this->node) this->node=this->node->next_sibling; @@ -2549,7 +2555,7 @@ typename tree::sibling_iterator& tree -typename tree::sibling_iterator& tree::sibling_iterator::operator--() +typename Tree::sibling_iterator& Tree::sibling_iterator::operator--() { if(this->node) this->node=this->node->prev_sibling; else { @@ -2560,7 +2566,7 @@ typename tree::sibling_iterator& tree -typename tree::sibling_iterator tree::sibling_iterator::operator++(int) +typename Tree::sibling_iterator Tree::sibling_iterator::operator++(int) { sibling_iterator copy = *this; ++(*this); @@ -2568,7 +2574,7 @@ typename tree::sibling_iterator tree -typename tree::sibling_iterator tree::sibling_iterator::operator--(int) +typename Tree::sibling_iterator Tree::sibling_iterator::operator--(int) { sibling_iterator copy = *this; --(*this); @@ -2576,7 +2582,7 @@ typename tree::sibling_iterator tree -typename tree::sibling_iterator& tree::sibling_iterator::operator+=(unsigned int num) +typename Tree::sibling_iterator& Tree::sibling_iterator::operator+=(unsigned int num) { while(num>0) { ++(*this); @@ -2586,7 +2592,7 @@ typename tree::sibling_iterator& tree -typename tree::sibling_iterator& tree::sibling_iterator::operator-=(unsigned int num) +typename Tree::sibling_iterator& Tree::sibling_iterator::operator-=(unsigned int num) { while(num>0) { --(*this); @@ -2596,14 +2602,14 @@ typename tree::sibling_iterator& tree -typename tree::tree_node *tree::sibling_iterator::range_first() const +typename Tree::tree_node *Tree::sibling_iterator::range_first() const { tree_node *tmp=parent_->first_child; return tmp; } template -typename tree::tree_node *tree::sibling_iterator::range_last() const +typename Tree::tree_node *Tree::sibling_iterator::range_last() const { return parent_->last_child; } @@ -2611,25 +2617,25 @@ typename tree::tree_node *tree:: // Leaf iterator template -tree::leaf_iterator::leaf_iterator() +Tree::leaf_iterator::leaf_iterator() : iterator_base(0), top_node(0) { } template -tree::leaf_iterator::leaf_iterator(tree_node *tn, tree_node *top) +Tree::leaf_iterator::leaf_iterator(tree_node *tn, tree_node *top) : iterator_base(tn), top_node(top) { } template -tree::leaf_iterator::leaf_iterator(const iterator_base &other) +Tree::leaf_iterator::leaf_iterator(const iterator_base &other) : iterator_base(other.node), top_node(0) { } template -tree::leaf_iterator::leaf_iterator(const sibling_iterator& other) +Tree::leaf_iterator::leaf_iterator(const sibling_iterator& other) : iterator_base(other.node), top_node(0) { if(this->node==0) { @@ -2642,7 +2648,7 @@ tree::leaf_iterator::leaf_iterator(const sibling_iterato } template -typename tree::leaf_iterator& tree::leaf_iterator::operator++() +typename Tree::leaf_iterator& Tree::leaf_iterator::operator++() { assert(this->node!=0); if(this->node->first_child!=0) { // current node is no longer leaf (children got added) @@ -2663,7 +2669,7 @@ typename tree::leaf_iterator& tree -typename tree::leaf_iterator& tree::leaf_iterator::operator--() +typename Tree::leaf_iterator& Tree::leaf_iterator::operator--() { assert(this->node!=0); while (this->node->prev_sibling==0) { @@ -2678,7 +2684,7 @@ typename tree::leaf_iterator& tree -typename tree::leaf_iterator tree::leaf_iterator::operator++(int) +typename Tree::leaf_iterator Tree::leaf_iterator::operator++(int) { leaf_iterator copy = *this; ++(*this); @@ -2686,7 +2692,7 @@ typename tree::leaf_iterator tree -typename tree::leaf_iterator tree::leaf_iterator::operator--(int) +typename Tree::leaf_iterator Tree::leaf_iterator::operator--(int) { leaf_iterator copy = *this; --(*this); @@ -2695,7 +2701,7 @@ typename tree::leaf_iterator tree -typename tree::leaf_iterator& tree::leaf_iterator::operator+=(unsigned int num) +typename Tree::leaf_iterator& Tree::leaf_iterator::operator+=(unsigned int num) { while(num>0) { ++(*this); @@ -2705,7 +2711,7 @@ typename tree::leaf_iterator& tree -typename tree::leaf_iterator& tree::leaf_iterator::operator-=(unsigned int num) +typename Tree::leaf_iterator& Tree::leaf_iterator::operator-=(unsigned int num) { while(num>0) { --(*this); @@ -2714,10 +2720,5 @@ typename tree::leaf_iterator& tree ** ** @todo the instance handling for the accessor seems somewhat diff --git a/src/lib/visitor.hpp b/src/lib/visitor.hpp index 29fefeb65..08b3a8abc 100644 --- a/src/lib/visitor.hpp +++ b/src/lib/visitor.hpp @@ -59,7 +59,7 @@ Credits for many further implementation ideas go to ** on some treat(VisitableInterface&) function. **
  • any concrete Visitable subclass wanting to be treated by some concrete tool ** needs to use the DECLARE_PROCESSABLE_BY(TOOLBASE) macro. By this, it gets an - ** virtual \code apply(TOOLBASE&) function. Otherwise, it will be treated by the + ** virtual `apply(TOOLBASE&)` function. Otherwise, it will be treated by the ** interface of the next base class using this macro.
  • ** ** For design questions and more detailed implementation notes, see the Proc Layer Tiddly Wiki. diff --git a/src/proc/asset.hpp b/src/proc/asset.hpp index 10e505d05..8b7e3990e 100644 --- a/src/proc/asset.hpp +++ b/src/proc/asset.hpp @@ -21,6 +21,7 @@ */ /** @file asset.hpp + ** @ingroup asset ** Proc-Layer Interface: Assets. ** Declares the Asset top level Interface, the Asset::Ident identification tuple ** and the asset::ID primary key wrapper. Normally, Assets should be handled @@ -45,7 +46,7 @@ ** (Implementation detail: as g++ is not able to handle member function template ** instantiations completely automatic, we need to trigger some template instantiations ** at the end of assetmanager.cpp ) - ** + ** ** @see assetmanager.hpp ** @see media.hpp */ diff --git a/src/proc/asset/media.hpp b/src/proc/asset/media.hpp index 73c5b3329..ed0a42071 100644 --- a/src/proc/asset/media.hpp +++ b/src/proc/asset/media.hpp @@ -23,10 +23,11 @@ /** @file media.hpp ** Media data is a specific kind of Asset. - ** For the different kinds of Assets, we use sub-intefaces inheriting + ** For the different kinds of Assets, we use sub-interfaces inheriting ** from the general Asset interface. To be able to get asset::Media instances - ** directly from the AssetManager, we define a specialization of the Asset ID. - ** + ** directly from the AssetManager, we define a specialisation of the Asset ID. + ** + ** @ingroup asset ** @see asset.hpp for explanation ** @see MediaFactory creating concrete asset::Media instances ** @@ -119,7 +120,7 @@ namespace asset { /** predicate to decide if this asset::Media * is part of a compound (multichannel) media. - * @return pointer to parent, or \code null + * @return pointer to parent, or `null` */ virtual PMedia checkCompound () const; friend class proc::asset::Clip; ////////////////////////TODO better interface!!! diff --git a/src/proc/asset/meta.hpp b/src/proc/asset/meta.hpp index 24b56c81a..4b719e6e1 100644 --- a/src/proc/asset/meta.hpp +++ b/src/proc/asset/meta.hpp @@ -50,6 +50,7 @@ ** or changed metadata entry, finally \em committing this builder to yield a new ** asset::Meta (which, in case of a mutation, might supersede an existing one). ** + ** @ingroup asset ** @see asset.hpp explanation of assets in general ** @see MetaFactory creating concrete asset::Meta instances ** diff --git a/src/proc/asset/proc.hpp b/src/proc/asset/proc.hpp index 60486da19..13dfa8439 100644 --- a/src/proc/asset/proc.hpp +++ b/src/proc/asset/proc.hpp @@ -27,6 +27,7 @@ ** from the general Asset interface. To be able to get asset::Proc instances ** directly from the AssetManager, we define a specialisation of the Asset ID. ** + ** @ingroup asset ** @see asset.hpp for explanation ** @see ProcFactory creating concrete asset::Proc instances ** @@ -66,6 +67,8 @@ namespace asset { /** * key abstraction: data processing asset * @todo just a stub, have to figure out what a asset::Proc is + * @ingroup asset + * @ingroup session */ class Proc : public Asset { diff --git a/src/proc/asset/struct.hpp b/src/proc/asset/struct.hpp index 64b7ce616..6ee1e3cd7 100644 --- a/src/proc/asset/struct.hpp +++ b/src/proc/asset/struct.hpp @@ -48,6 +48,7 @@ ** all placements referring to this track, which could be sub tracks, clips, ** effects, automation or labels. ** + ** @ingroup asset ** @see asset.hpp for explanation regarding asset IDs ** @see StructFactory creating concrete asset::Struct instances ** diff --git a/src/proc/common.hpp b/src/proc/common.hpp index 6e6e2e491..df2d1ef7e 100644 --- a/src/proc/common.hpp +++ b/src/proc/common.hpp @@ -50,27 +50,6 @@ #include "lib/error.hpp" // pulls in NoBug via loggging.h -/** - * Lumiera public interface. - * Global interfaces and facilities accessible from plugins and scripts. - * It's probably a good idea to pull it in explicitly and to avoid nesting - * implementation namespaces within \c lumiera:: - */ -namespace lumiera { - - /* additional global configuration goes here... */ - - -} // namespace lumiera - - -/** - * Implementation namespace for support and library code. - */ -namespace lib { - -} - /** * Proc-Layer implementation namespace root. diff --git a/src/proc/engine/engine-service.hpp b/src/proc/engine/engine-service.hpp index 1bc4a3f55..6ec05f06f 100644 --- a/src/proc/engine/engine-service.hpp +++ b/src/proc/engine/engine-service.hpp @@ -38,6 +38,7 @@ ** switch and continuation; under the hood, there is a mechanism to discard resources ** tied to the original CalcStream, once the switch to the new definition is complete. ** + ** @ingroup engine ** @see EngineInterface_test ** @see CalcStream_test ** @see proc::play::PlayerService @@ -94,6 +95,8 @@ namespace engine{ * backend layer. The implementation of this service is * responsible for creating the right job entries in the * correct order and to enqueue these into the scheduler. + * @ingroup engine + * @ingroup player */ class EngineService : boost::noncopyable diff --git a/src/proc/mobject/mobject.hpp b/src/proc/mobject/mobject.hpp index c860c52a0..5929d31e5 100644 --- a/src/proc/mobject/mobject.hpp +++ b/src/proc/mobject/mobject.hpp @@ -61,6 +61,7 @@ namespace mobject { * All the contents and elements that can be placed and * manipulated and finally rendered within Lumiera's * high-level model and Session are MObjects. + * @ingroup session */ class MObject : public Buildable, diff --git a/src/proc/mobject/session.hpp b/src/proc/mobject/session.hpp index b0155b134..8d1ac1e5a 100644 --- a/src/proc/mobject/session.hpp +++ b/src/proc/mobject/session.hpp @@ -22,6 +22,7 @@ /** @file session.hpp + ** @ingroup session ** Primary Interface to the current Session. ** The session interface can be used to discover session's contents. ** Mostly, these objects within the session are MObject subclasses, but they @@ -101,7 +102,8 @@ namespace mobject { * a reference to the SessManager and is accessible as the static * field Session::current). Clients shouldn't try to get a direct * pointer or reference to the Session object. - * + * @ingroup session + * */ class Session : boost::noncopyable diff --git a/src/proc/mobject/session/element-query.hpp b/src/proc/mobject/session/element-query.hpp index d99b9669f..8f902ccb3 100644 --- a/src/proc/mobject/session/element-query.hpp +++ b/src/proc/mobject/session/element-query.hpp @@ -102,7 +102,7 @@ namespace session { * @return MObject ref to the fist suitable element. Might be an empty MObjectRef. * @note the embedded MObject subtype (MO) causes an additional filtering * on that specific kind of MObject (e.g. considering just Clips) - * @warning be sure the passed predicate actually takes a \code Placement const& \endcode + * @warning be sure the passed predicate actually takes a `Placement const&` * with XX being the correct type. Note the \c const& -- Failing to do so shows up as * compiler error "no suitable function pick(.....)" */ diff --git a/src/proc/mobject/session/session.cpp b/src/proc/mobject/session/session.cpp index cf5c7b758..b8a1bcc23 100644 --- a/src/proc/mobject/session/session.cpp +++ b/src/proc/mobject/session/session.cpp @@ -64,7 +64,7 @@ namespace mobject { * * Consequently, if you want to talk to the session manager, * you use dot-notation, while you access the session object - * via arrow notation (e.g. \code Session::current->getFixture() ) + * via arrow notation (e.g. `Session::current->getFixture()` ) */ SessManager& Session::current = lib::Depend()(); diff --git a/src/proc/play/timings.hpp b/src/proc/play/timings.hpp index b8bf55390..0a406e53b 100644 --- a/src/proc/play/timings.hpp +++ b/src/proc/play/timings.hpp @@ -140,7 +140,7 @@ namespace play { /** real time deadline for the given frame, without any latency. * This value is provided in case of scheduled time of delivery, - * which is signalled by \code playbackUrgency == TIMEBOUND \endcode + * which is signalled by `playbackUrgency == TIMEBOUND` * @return wall clock time to expect delivery of data * corresponding to a frame specified relative * to \link #getOrigin time axis origin \endlink diff --git a/tests/library/opaque-holder-test.cpp b/tests/library/opaque-holder-test.cpp index 95a69d968..017f215a2 100644 --- a/tests/library/opaque-holder-test.cpp +++ b/tests/library/opaque-holder-test.cpp @@ -111,7 +111,7 @@ namespace test{ * or a custom allocator. * * @todo this test doesn't cover automatic conversions and conversions using RTTI - * from the target objects, while \code OpaqueHolder.template get() \endcode + * from the target objects, while `OpaqueHolder.template get()` * would allow for such conversions. This is similar to Ticket #141, and * actually based on the same code as variant.hpp (access-casted.hpp) */ diff --git a/wiki/draw/LumiLogo-small.png b/wiki/draw/LumiLogo-small.png new file mode 100644 index 0000000000000000000000000000000000000000..59c9e3b2fe59cc29d1697da4e2fdcf7edf11758e GIT binary patch literal 1644 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 O$Zbvio5eTmp8XpPkkX6* literal 0 HcmV?d00001