]> git.lyx.org Git - lyx.git/blobdiff - lib/doc/Development.lyx
One more nullptr
[lyx.git] / lib / doc / Development.lyx
index 598034023c19a497cdd59c8ca10d18896e2a47b5..1ce4be3b470f025109891e62ea8d01e7f1e89180 100644 (file)
@@ -1,20 +1,20 @@
-#LyX 2.2 created this file. For more info see http://www.lyx.org/
-\lyxformat 507
+#LyX 2.4 created this file. For more info see https://www.lyx.org/
+\lyxformat 599
 \begin_document
 \begin_header
 \save_transient_properties true
 \origin /systemlyxdir/doc/
-\textclass scrartcl
+\textclass scrbook
 \options BCOR8mm,captions=tableheading
 \use_default_options false
 \begin_modules
 logicalmkup
 \end_modules
-\maintain_unincluded_children false
+\maintain_unincluded_children no
 \language english
 \language_package default
-\inputencoding auto
-\fontencoding global
+\inputencoding utf8
+\fontencoding auto
 \font_roman "lmodern" "default"
 \font_sans "lmss" "default"
 \font_typewriter "lmtt" "default"
@@ -22,14 +22,20 @@ logicalmkup
 \font_default_family default
 \use_non_tex_fonts false
 \font_sc false
-\font_osf false
+\font_roman_osf false
+\font_sans_osf false
+\font_typewriter_osf false
 \font_sf_scale 100 100
 \font_tt_scale 100 100
+\use_microtype false
+\use_dash_ligatures true
 \graphics default
 \default_output_format pdf2
 \output_sync 1
 \bibtex_command default
 \index_command default
+\float_placement class
+\float_alignment class
 \paperfontsize 12
 \spacing single
 \use_hyperref true
@@ -47,18 +53,18 @@ logicalmkup
 \pdf_backref false
 \pdf_pdfusetitle false
 \pdf_quoted_options "linkcolor=black, citecolor=black, urlcolor=blue, filecolor=blue, pdfpagelayout=OneColumn, pdfnewwindow=true, pdfstartview=XYZ, plainpages=false"
-\papersize a4paper
+\papersize a4
 \use_geometry false
 \use_package amsmath 1
 \use_package amssymb 1
-\use_package cancel 0
-\use_package esint 0
+\use_package cancel 1
+\use_package esint 1
 \use_package mathdots 1
-\use_package mathtools 0
+\use_package mathtools 1
 \use_package mhchem 1
-\use_package stackrel 0
-\use_package stmaryrd 0
-\use_package undertilde 0
+\use_package stackrel 1
+\use_package stmaryrd 1
+\use_package undertilde 1
 \cite_engine basic
 \cite_engine_type default
 \biblio_style plain
@@ -68,24 +74,33 @@ logicalmkup
 \suppress_date false
 \justification true
 \use_refstyle 0
+\use_minted 0
+\use_lineno 0
 \notefontcolor #0000ff
 \index Index
 \shortcut idx
 \color #008000
 \end_index
 \secnumdepth 4
-\tocdepth 4
+\tocdepth 2
 \paragraph_separation indent
 \paragraph_indentation default
-\quotes_language english
+\is_math_indent 0
+\math_numbering_side default
+\quotes_style english
+\dynamic_quotes 0
 \papercolumns 1
 \papersides 2
 \paperpagestyle headings
+\tablestyle default
 \tracking_changes false
 \output_changes false
+\change_bars false
+\postpone_fragile_content false
 \html_math_output 0
 \html_css_as_file 0
 \html_be_strict true
+\docbook_table_output 0
 \end_header
 
 \begin_body
@@ -96,7 +111,7 @@ Developing \SpecialChar LyX
 \end_layout
 
 \begin_layout Subtitle
-Version 2.2.x
+Version 2.4.x
 \end_layout
 
 \begin_layout Author
@@ -106,21 +121,18 @@ by the \SpecialChar LyX
 status collapsed
 
 \begin_layout Plain Layout
-\noindent
-If you have comments or error corrections, please send them to the \SpecialChar LyX
- Documentatio
-n mailing list, 
-\begin_inset Flex Code
-status collapsed
-
-\begin_layout Plain Layout
-\noindent
-<lyx-docs@lists.lyx.org>
-\end_layout
+If you have comments on or error corrections to this documentation, please
+ send them to the \SpecialChar LyX
+ Documentation mailing list: 
+\begin_inset CommandInset href
+LatexCommand href
+target "lyx-docs@lists.lyx.org"
+type "mailto:"
+literal "false"
 
 \end_inset
 
-.
+
 \end_layout
 
 \end_inset
@@ -137,7 +149,7 @@ LatexCommand tableofcontents
 
 \end_layout
 
-\begin_layout Section
+\begin_layout Chapter
 Introduction
 \end_layout
 
@@ -170,7 +182,7 @@ development
  here.
 \end_layout
 
-\begin_layout Section
+\begin_layout Chapter
 File formats
 \end_layout
 
@@ -182,11 +194,11 @@ File formats
 tion.
 \end_layout
 
-\begin_layout Subsection
+\begin_layout Section
 File Format Numbers
 \end_layout
 
-\begin_layout Subsection
+\begin_layout Section
 When is an update of the .lyx file format number needed?
 \begin_inset CommandInset label
 LatexCommand label
@@ -201,33 +213,17 @@ name "sec:When-is-an"
 When you are working on a new feature you may ask yourself whether it needs
  an update of the .lyx file format number.
  Whether an update is needed or not is not always obvious.
+ Rule of thumb: 
 \end_layout
 
-\begin_layout Description
-Rule
-\begin_inset space ~
-\end_inset
-
-of
-\begin_inset space ~
-\end_inset
-
-thumb:
-\end_layout
-
-\begin_deeper
-\begin_layout Standard
+\begin_layout Quote
 Whenever there is the danger that a previous version of LyX cannot open
  a file using the new feature, a file format update is needed.
 \end_layout
 
 \begin_layout Standard
 The file format change allows lyx2lyx rules to implement backwards compatibility.
-\end_layout
-
-\end_deeper
-\begin_layout Standard
-Below you can find a list of reasons for file format updates with explanations:
+ Below you can find a list of reasons for file format updates with explanations:
 \end_layout
 
 \begin_layout Description
@@ -340,20 +336,11 @@ language
 
 .
  
-\begin_inset Foot
-status open
+\begin_inset Note Note
+status collapsed
 
 \begin_layout Plain Layout
-TODO: Discuss if this is really required or whether new languages can be
- treated similar to new layouts (cf.
-\begin_inset CommandInset ref
-LatexCommand ref
-reference "subsec:New-layouts"
-
-\end_inset
-
-).
+This requirement is under discussion.
 \end_layout
 
 \end_inset
@@ -371,24 +358,7 @@ inset Of course a new inset requires a file format update.
 \end_layout
 
 \begin_layout Description
-Modified
-\begin_inset space ~
-\end_inset
-
-layouts
-\begin_inset space ~
-\end_inset
-
-and
-\begin_inset space ~
-\end_inset
-
-modules with a
-\end_layout
-
-\begin_deeper
-\begin_layout Description
-new
+New
 \begin_inset space ~
 \end_inset
 
@@ -409,7 +379,7 @@ reference "subsec:Backporting-new-styles"
 \end_layout
 
 \begin_layout Description
-removed
+Removed
 \begin_inset space ~
 \end_inset
 
@@ -427,32 +397,22 @@ new
 \series bold
 not
 \series default
- require a file format update.
-\begin_inset Foot
-status collapsed
-
-\begin_layout Plain Layout
-Changed 03/16, see 
+ require a file format update (changed 03/16, see 
 \begin_inset CommandInset ref
 LatexCommand ref
 reference "subsec:New-layouts"
 
 \end_inset
 
- for the rationale.
-\end_layout
-
-\end_inset
-
+).
  
 \end_layout
 
-\end_deeper
 \begin_layout Standard
 If you are still unsure, please ask on the development list.
 \end_layout
 
-\begin_layout Subsection
+\begin_layout Section
 \begin_inset CommandInset label
 LatexCommand label
 name "subsec:update_lyx_files"
@@ -510,30 +470,6 @@ src/version.h
 .
 \end_layout
 
-\begin_layout Enumerate
-Update the range of file formats in the array 
-\begin_inset Flex Code
-status collapsed
-
-\begin_layout Plain Layout
-format_relation
-\end_layout
-
-\end_inset
-
- in 
-\begin_inset Flex Code
-status collapsed
-
-\begin_layout Plain Layout
-lib/lyx2lyx/LyX.py
-\end_layout
-
-\end_inset
-
-.
-\end_layout
-
 \begin_layout Enumerate
 \begin_inset CommandInset label
 LatexCommand label
@@ -550,7 +486,7 @@ Add an entry to both format lists (for conversion and reversion) in
 status collapsed
 
 \begin_layout Plain Layout
-lib/lyx2lyx/lyx_2_3.py
+lib/lyx2lyx/lyx_2_4.py
 \end_layout
 
 \end_inset
@@ -653,8 +589,11 @@ src/tex2lyx/TODO.txt
 It would be nice if you could create a .lyx test file which contains instances
  of all changed or added features.
  This could then be used to test lyx2lyx and tex2lyx.
- Unfortunately, it has not yet been decided how to collect such examples,
- so please ask on the development list if you want to create one.
+ Test samples are collected under the corresponding subdirectories of 
+\family typewriter
+/autotests
+\family default
+.
 \end_layout
 
 \begin_layout Enumerate
@@ -664,7 +603,8 @@ name "enu:updatefiles"
 
 \end_inset
 
-Update LyX's .lyx documentation files to the new format.
+Test your lyx2lyx code by updating LyX's .lyx documentation files to the
+ new format.
  The developer who makes the change knows best what changes to expect when
  inspecting the resulting diff.
  Because of this, you might be able to catch a bug in the lyx2lyx code that
@@ -738,7 +678,52 @@ gen_lfuns.py
 \end_inset
 
  before being converted to the latest format.
- Finally, commit using 
+\begin_inset Newline newline
+\end_inset
+
+
+\begin_inset Note Greyedout
+status open
+
+\begin_layout Plain Layout
+
+\series bold
+Note:
+\series default
+ Only commit file format changes in the doc files if these files are using
+ the new feature of the new file format.
+ The reason is rule
+\begin_inset space ~
+\end_inset
+
+
+\begin_inset CommandInset ref
+LatexCommand ref
+reference "enu:The-fileformat-of"
+
+\end_inset
+
+ of the documentation policies described in sec.
+\begin_inset space ~
+\end_inset
+
+
+\begin_inset CommandInset ref
+LatexCommand ref
+reference "sec:Documentation-policies"
+
+\end_inset
+
+.
+\end_layout
+
+\end_inset
+
+
+\end_layout
+
+\begin_layout Enumerate
+Finally, commit using 
 \begin_inset Flex Code
 status collapsed
 
@@ -751,7 +736,7 @@ git commit -a
 .
 \end_layout
 
-\begin_layout Subsection
+\begin_layout Section
 Updating the file format number of layout files
 \end_layout
 
@@ -795,7 +780,7 @@ updatedocs.py
 \end_layout
 
 \begin_layout Standard
-Note that we do not automatically any local layout used in the 
+Note that we do not automatically update any local layout used in the 
 \begin_inset Flex Code
 status collapsed
 
@@ -826,7 +811,7 @@ status collapsed
  file format.
 \end_layout
 
-\begin_layout Subsection
+\begin_layout Section
 Updating the file format number of bind/ui files
 \end_layout
 
@@ -883,7 +868,7 @@ status open
 
 \begin_layout Plain Layout
 
-http://www.lyx.org/trac/ticket/9794
+https://www.lyx.org/trac/ticket/9794
 \end_layout
 
 \end_inset
@@ -1053,7 +1038,7 @@ lib/lyx2lyx/lyx2lyx_tools.py
  
 \end_layout
 
-\begin_layout Subsection
+\begin_layout Section
 Backporting new styles to the stable version
 \begin_inset CommandInset label
 LatexCommand label
@@ -1150,42 +1135,11 @@ lyx2lyx
  version.
 \end_layout
 
-\begin_layout Section
+\begin_layout Chapter
 New layouts and modules
 \end_layout
 
-\begin_layout Standard
-\begin_inset Note Greyedout
-status open
-
-\begin_layout Description
-Note: This section is currently only a proposal under discussion.
- Please correct/amend as suited.
- Remove this note once a consensus is found.
-\end_layout
-
-\begin_layout Plain Layout
-See the thread 
-\begin_inset Quotes eld
-\end_inset
-
-Proposal for a guide on updating layouts
-\begin_inset Quotes erd
-\end_inset
-
- for details and background
-\end_layout
-
-\begin_layout Plain Layout
-http://permalink.gmane.org/gmane.editors.lyx.devel/161126 
-\end_layout
-
-\end_inset
-
-
-\end_layout
-
-\begin_layout Subsection
+\begin_layout Section
 \begin_inset CommandInset label
 LatexCommand label
 name "subsec:New-layouts"
@@ -1217,6 +1171,7 @@ officially supported
 \begin_inset CommandInset href
 LatexCommand href
 target "https://wiki.lyx.org/Layouts/Layouts"
+literal "false"
 
 \end_inset
 
@@ -1226,7 +1181,7 @@ target "https://wiki.lyx.org/Layouts/Layouts"
 \begin_layout Standard
 In older versions of this document, it was stated that new layout files
  require a file format change.
- After some discussion it was decided that this is not needed.
+ After some discussion, it was decided that this is not needed.
 \begin_inset Foot
 status open
 
@@ -1236,6 +1191,7 @@ See
 LatexCommand href
 name "the thread “Proposal for a guide on updating layouts”"
 target "http://permalink.gmane.org/gmane.editors.lyx.devel/161202"
+literal "false"
 
 \end_inset
 
@@ -1446,7 +1402,7 @@ reference "par:when-to-run-an-export-test"
 ).
 \end_layout
 
-\begin_layout Subsection
+\begin_layout Section
 New modules
 \end_layout
 
@@ -1473,7 +1429,6 @@ lib/doc/LaTeXConfig.lyx
 status collapsed
 
 \begin_layout Plain Layout
-\paragraph_spacing single
 info-insert package <name>
 \end_layout
 
@@ -1487,10 +1442,41 @@ Modules do not need a template, only an example, which is strongly encouraged
  but not necessarily required.
 \end_layout
 
-\begin_layout Subsection
+\begin_layout Section
 Layouts for document classes with incompatible versions
 \end_layout
 
+\begin_layout Standard
+\begin_inset Note Greyedout
+status open
+
+\begin_layout Description
+Note: This section is currently only a proposal under discussion.
+ Please correct/amend as suited.
+ Remove this note once a consensus is found.
+\end_layout
+
+\begin_layout Plain Layout
+See the thread 
+\begin_inset Quotes eld
+\end_inset
+
+Proposal for a guide on updating layouts
+\begin_inset Quotes erd
+\end_inset
+
+ for details and background
+\end_layout
+
+\begin_layout Plain Layout
+http://permalink.gmane.org/gmane.editors.lyx.devel/161126 
+\end_layout
+
+\end_inset
+
+
+\end_layout
+
 \begin_layout Standard
 Every now and then, there are changes to LaTeX document classes that break
  backwards compatibility.
@@ -1757,7 +1743,7 @@ This way, new documents based on the template or example will use the up-to-date
 
 \end_layout
 
-\begin_layout Section
+\begin_layout Chapter
 Tests
 \end_layout
 
@@ -1771,7 +1757,7 @@ Automated tests are an important tool to detect bugs and regressions in
  easily, and some tests of this kind exist.
 \end_layout
 
-\begin_layout Subsection
+\begin_layout Section
 unit tests
 \end_layout
 
@@ -1783,7 +1769,7 @@ There are attempts to set up a suite of unit tests for LyX.
 TODO: describe what is done and what is still to do.
 \end_layout
 
-\begin_layout Subsection
+\begin_layout Section
 tex2lyx tests
 \end_layout
 
@@ -1852,7 +1838,7 @@ status collapsed
  This may be useful for roundtrip comparisons.
 \end_layout
 
-\begin_layout Subsubsection
+\begin_layout Subsection
 Running the tests
 \end_layout
 
@@ -1950,7 +1936,7 @@ cmplyx
  are output in unified diff format.
 \end_layout
 
-\begin_layout Subsubsection
+\begin_layout Subsection
 Updating test references
 \begin_inset CommandInset label
 LatexCommand label
@@ -2057,13 +2043,26 @@ src/tex2lyx/test
 \end_layout
 
 \begin_layout Itemize
-In the appearing MSVC program right-click on the project 
+In the appearing MSVC program assure that you build the 
+\emph on
+Release
+\emph default
+ version, then right-click on the project 
 \family sans
 updatetex2lyxtests
 \family default
- in the project explorer and chose 
+ in the project explorer and choose then 
 \family sans
-Create
+Project
+\begin_inset space ~
+\end_inset
+
+Only\SpecialChar menuseparator
+Rebuild
+\begin_inset space ~
+\end_inset
+
+only
 \family default
 .
 \end_layout
@@ -2102,7 +2101,7 @@ do not
  regarding insignificant whitespace and line breaks.
 \end_layout
 
-\begin_layout Subsubsection
+\begin_layout Subsection
 Adding a new test
 \end_layout
 
@@ -2177,7 +2176,7 @@ Commit the changes to the repository, or send a patch to the development
  list and ask for committing if you do not have commit rights.
 \end_layout
 
-\begin_layout Subsection
+\begin_layout Section
 ctest automatic tests
 \end_layout
 
@@ -2274,7 +2273,7 @@ build directory.
  
 \end_layout
 
-\begin_layout Subsubsection
+\begin_layout Subsection
 Export tests 
 \end_layout
 
@@ -2323,7 +2322,7 @@ status collapsed
  (However, error-free export is no guarantee for an error-free output document.)
 \end_layout
 
-\begin_layout Paragraph
+\begin_layout Subsubsection
 \begin_inset CommandInset label
 LatexCommand label
 name "par:when-to-run-an-export-test"
@@ -2460,7 +2459,7 @@ reference "subsec:Interpreting-export-tests"
 .
 \end_layout
 
-\begin_layout Paragraph
+\begin_layout Subsubsection
 \begin_inset CommandInset label
 LatexCommand label
 name "par:export-test-output-formats"
@@ -2673,7 +2672,7 @@ wordhtml
 \end_layout
 
 \end_deeper
-\begin_layout Paragraph
+\begin_layout Subsubsection
 \begin_inset CommandInset label
 LatexCommand label
 name "par:Configuring-ctests"
@@ -2724,7 +2723,7 @@ reference "subsec:Interpreting-export-tests"
 ).
 \end_layout
 
-\begin_layout Paragraph
+\begin_layout Subsubsection
 \begin_inset CommandInset label
 LatexCommand label
 name "par:ctest-options"
@@ -2983,7 +2982,6 @@ Note that some tests cannot be run in parallel.
 status collapsed
 
 \begin_layout Plain Layout
-\noindent
 RUN_SERIAL ON
 \end_layout
 
@@ -3055,7 +3053,7 @@ man ctest
 ) the full list of command line options.
 \end_layout
 
-\begin_layout Paragraph
+\begin_layout Subsubsection
 Examples
 \end_layout
 
@@ -3117,7 +3115,7 @@ ctest -L export -E "_(texF|dvi3|pdf3?)"
 
 \end_layout
 
-\begin_layout Paragraph
+\begin_layout Subsubsection
 \begin_inset CommandInset label
 LatexCommand label
 name "subsec:Interpreting-export-tests"
@@ -3245,7 +3243,7 @@ status collapsed
 status collapsed
 
 \begin_layout Plain Layout
-development/autotests/suspiciousTests
+development/autotests/invertedTests
 \end_layout
 
 \end_inset
@@ -3340,7 +3338,7 @@ CTestCostData.txt
  file lists the times that it took to run the tests.
 \end_layout
 
-\begin_layout Paragraph
+\begin_layout Subsubsection
 What action should you take if a test fails?
 \end_layout
 
@@ -3381,19 +3379,21 @@ If an
 \emph on
 inverted
 \emph default
- test case fails because the export now works, 
+ test case fails because the export now works, first confirm that the output
+ of the corresponding export looks good (e.g., not garbled text).
+ Then, 
 \emph on
 uninvert
 \emph default
- the test by removing the labeling pattern from 
+ the test by removing the pattern from the 
 \begin_inset Quotes eld
 \end_inset
 
-suspiciousTests
+invertedTests
 \begin_inset Quotes erd
 \end_inset
 
-) (see 
+ file (see 
 \begin_inset CommandInset ref
 LatexCommand ref
 reference "par:Inverted-tests"
@@ -3405,11 +3405,15 @@ reference "par:Inverted-tests"
 
 \begin_layout Itemize
 If the export did not fail previously but led to wrong output (PDF, say),
- it is in fact an improvement when the test now fails, label it as 
+\begin_inset Foot
+status collapsed
+
+\begin_layout Plain Layout
+Non-failing test with wrong output should be labeled as 
 \begin_inset Quotes eld
 \end_inset
 
-unreliable:wrong:output
+unreliable:wrong_output
 \begin_inset Quotes erd
 \end_inset
 
@@ -3423,21 +3427,46 @@ reference "par:Unreliable-tests"
 ).
 \end_layout
 
-\begin_layout Itemize
-In case of tests failing due to missing requirements (when only a subset
- of TeXLive is installed or a test labeled 
-\begin_inset Quotes eld
 \end_inset
 
-unreliable:nonstandard
+ it is in fact an improvement when the test now fails.
+\emph on
+Invert
+\emph default
+ the failing test case (see 
+\begin_inset CommandInset ref
+LatexCommand ref
+reference "par:Inverted-tests"
+
+\end_inset
+
+).
+\end_layout
+
+\begin_layout Itemize
+In case of tests failing due to missing requirements (tests labeled 
+\begin_inset Quotes eld
+\end_inset
+
+unreliable:nonstandard
 \begin_inset Quotes erd
 \end_inset
 
- fails), ignore the failure, ask for someone else to run the test, or install
- the missing ressources and try again.
+ or testing on a system with only a subset of TeXLive installed), ignore
+ the failure, ask for someone else to run the test, or install the missing
+ resources and try again.
 \end_layout
 
-\begin_layout Paragraph
+\begin_layout Itemize
+Check the log file Testing/Temporary/LastTest.log.
+ In case of latex-errors rerun the failing test with environment variable
+ 'LYX_DEBUG_LATEX' set to '1'.
+ This will include latex messages in LastTest.log, so it should be easier
+ to interpret the fail-reason.
+\end_layout
+
+\begin_layout Subsubsection
 \begin_inset CommandInset label
 LatexCommand label
 name "par:Inverted-tests"
@@ -3453,7 +3482,7 @@ Test cases whose name matches a pattern in the file
 status collapsed
 
 \begin_layout Plain Layout
-development/autotests/suspiciousTests
+development/autotests/invertedTests
 \end_layout
 
 \end_inset
@@ -3508,7 +3537,7 @@ The following sublabels are currently present in
 status collapsed
 
 \begin_layout Plain Layout
-suspiciousTests
+invertedTests
 \end_layout
 
 \end_inset
@@ -3574,12 +3603,20 @@ otherwise, add a pattern here.
 
 \end_deeper
 \begin_layout Description
-attic Documents in the attic.
- (Kept for reference and format conversion test.)
+attic Documents in the attic (kept for reference and format conversion test).
+ Usually 
+\begin_inset Quotes eld
+\end_inset
+
+Wontfix
+\begin_inset Quotes erd
+\end_inset
+
+.
 \end_layout
 
-\begin_layout Subparagraph
-suspended 
+\begin_layout Paragraph
+suspended tests
 \end_layout
 
 \begin_layout Standard
@@ -3683,7 +3720,7 @@ reference "par:ctest-options"
 ).
 \end_layout
 
-\begin_layout Paragraph
+\begin_layout Subsubsection
 \begin_inset CommandInset label
 LatexCommand label
 name "par:Unreliable-tests"
@@ -3754,43 +3791,45 @@ status collapsed
 
 \end_layout
 
-\begin_layout Description
-nonstandard Documents with additional requirements, e.g.
- a class or package file not in TeXLive.
-\begin_inset Note Note
-status open
+\begin_layout Standard
+The following sublabels are currently present in 
+\begin_inset Flex Code
+status collapsed
 
 \begin_layout Plain Layout
-TODO: rename to "extra"?
+unreliableTests
 \end_layout
 
 \end_inset
 
-
-\end_layout
-
-\begin_deeper
-\begin_layout Standard
-These tests are labeled as 
-\family typewriter
-'nonstandard'.
+:
 \end_layout
 
-\end_deeper
 \begin_layout Description
-erratic Tests depending on local configuration, OS, TeX distribution, package
versions, or the phase of the moon.
+nonstandard Documents with additional requirements, e.g.
a class or package file not in TeXLive.
  
 \begin_inset Note Note
 status open
 
 \begin_layout Plain Layout
-TODO: use 
-\emph on
-erratic
-\emph default
- only for the phase-of-moon dependency?
+TODO: rename to 
+\begin_inset Quotes eld
+\end_inset
+
+extra
+\begin_inset Quotes erd
+\end_inset
+
+ or 
+\begin_inset Quotes eld
+\end_inset
+
+exotic
+\begin_inset Quotes erd
+\end_inset
+
+?
 \end_layout
 
 \end_inset
@@ -3798,20 +3837,25 @@ erratic
 
 \end_layout
 
-\begin_deeper
-\begin_layout Standard
-These tests are labeled as 
-\family typewriter
-'erratic'.
+\begin_layout Description
+erratic Tests depending on local configuration or the phase of the moon.
+\end_layout
+
+\begin_layout Description
+varying_versions Tests depending on e.g.
+ OS or version of a non-TeX-Live dependency.
+ Note that a full, up-to-date TeX Live installation is required so this
+ sublabel is about versions of other dependencies.
 \end_layout
 
-\end_deeper
 \begin_layout Description
 wrong
 \begin_inset space ~
 \end_inset
 
-output Export does not fail but the resulting document has errors.
+output Export does not fail but the resulting document has (undetected)
+ errors.
 \end_layout
 
 \begin_deeper
@@ -3822,11 +3866,7 @@ status open
 
 \begin_layout Plain Layout
 \paragraph_spacing single
-These tests are actually not 
-\emph on
-unreliable
-\emph default
- but 
+These tests are in a strict sense not unreliable but 
 \emph on
 invalid
 \emph default
@@ -3839,7 +3879,7 @@ invalid
 \end_layout
 
 \end_deeper
-\begin_layout Paragraph
+\begin_layout Subsubsection
 \begin_inset CommandInset label
 LatexCommand label
 name "par:Export-test-filtering"
@@ -3883,8 +3923,8 @@ Output Stop if tests not selected here
 
 \end_deeper
 \begin_layout Description
-unreliableTests: Tests selected either pass or fail, but that is dependent
on the system where the test is run.
+unreliableTests: Tests selected pass or fail dependent on the system where
+ the test is run.
  Selected tests gain the label 'unreliable'.
 \end_layout
 
@@ -3896,12 +3936,12 @@ Input Each test which passed 'ignoredTests'
 
 \begin_layout Labeling
 \labelwidthstring 00.00.0000
-Output Stop if test selected, gain label 'unreliable'.
+Output Gain label 'unreliable', proceed with checking for 'inverted'.
 \end_layout
 
 \end_deeper
 \begin_layout Description
-suspiciousTests 
+invertedTests 
 \begin_inset space \space{}
 \end_inset
 
@@ -3911,17 +3951,18 @@ suspiciousTests
 \begin_deeper
 \begin_layout Labeling
 \labelwidthstring 00.00.0000
-Input Each test which passed 'unreliableTests'
+Input Each test which passed 'ignoredTests'
 \end_layout
 
 \begin_layout Labeling
 \labelwidthstring 00.00.0000
-Output Stop if not selected.
+Output Stop if not selected, gain test-property 'WILL_FAIL' (i.e.
+ tests are reported as failing if the export works without error.) If no
+ subselection applies, gain labels 'export' and 'inverted'.
 \end_layout
 
 \begin_layout Standard
-The following file is meant as subselections of 'suspiciousTests'.
- If neither subselection applies, test gains labels 'export' and 'inverted'
+The following filter perfoms a subselection of 'invertedTests':
 \end_layout
 
 \begin_layout Description
@@ -3933,7 +3974,7 @@ suspendedTests Tests selected here gain the label 'suspended' but _not_
 \begin_deeper
 \begin_layout Labeling
 \labelwidthstring 00.00.0000
-Input Each test selected by 'suspiciousTests' 
+Input Each test selected by 'invertedTests' 
 \end_layout
 
 \begin_layout Labeling
@@ -3949,17 +3990,18 @@ The following table may clarify label assignement
 \end_layout
 
 \begin_layout Standard
+\begin_inset space \hspace{}
+\length -3cm
+\end_inset
+
+
 \begin_inset Tabular
-<lyxtabular version="3" rows="7" columns="12">
+<lyxtabular version="3" rows="6" columns="8">
 <features tabularvalignment="middle">
-<column alignment="left" valignment="top" width="0pt">
-<column alignment="left" valignment="top" width="0pt">
-<column alignment="left" valignment="top" width="0pt">
-<column alignment="left" valignment="top" width="0pt">
-<column alignment="center" valignment="top">
-<column alignment="center" valignment="top">
-<column alignment="center" valignment="top">
-<column alignment="center" valignment="top">
+<column alignment="left" valignment="top" width="2cm">
+<column alignment="left" valignment="top" width="2.5cm">
+<column alignment="left" valignment="top" width="2cm">
+<column alignment="center" valignment="top" width="2.5cm">
 <column alignment="center" valignment="top">
 <column alignment="center" valignment="top">
 <column alignment="center" valignment="top">
@@ -3969,7 +4011,7 @@ The following table may clarify label assignement
 \begin_inset Text
 
 \begin_layout Plain Layout
-Test found in file:
+Test matching pattern in file:
 \end_layout
 
 \end_inset
@@ -4001,16 +4043,16 @@ Test found in file:
 
 \end_inset
 </cell>
-<cell multicolumn="1" alignment="center" valignment="top" topline="true" leftline="true" rightline="true" usebox="none">
+<cell multicolumn="1" alignment="center" valignment="top" topline="true" leftline="true" usebox="none">
 \begin_inset Text
 
 \begin_layout Plain Layout
-Marked in ctest, Assigned label
+Assigned label
 \end_layout
 
 \end_inset
 </cell>
-<cell multicolumn="2" alignment="center" valignment="top" usebox="none">
+<cell multicolumn="2" alignment="center" valignment="top" topline="true" leftline="true" usebox="none">
 \begin_inset Text
 
 \begin_layout Plain Layout
@@ -4019,7 +4061,7 @@ Marked in ctest, Assigned label
 
 \end_inset
 </cell>
-<cell multicolumn="2" alignment="center" valignment="top" topline="true" leftline="true" usebox="none">
+<cell multicolumn="2" alignment="center" valignment="top" topline="true" rightline="true" usebox="none">
 \begin_inset Text
 
 \begin_layout Plain Layout
@@ -4028,153 +4070,159 @@ Marked in ctest, Assigned label
 
 \end_inset
 </cell>
-<cell multicolumn="2" alignment="center" valignment="top" topline="true" leftline="true" usebox="none">
+<cell alignment="center" valignment="top" topline="true" leftline="true" rightline="true" usebox="none">
 \begin_inset Text
 
 \begin_layout Plain Layout
-
+test property
 \end_layout
 
 \end_inset
 </cell>
-<cell multicolumn="2" alignment="center" valignment="top" topline="true" leftline="true" usebox="none">
+</row>
+<row>
+<cell alignment="left" valignment="top" topline="true" bottomline="true" leftline="true" usebox="none">
 \begin_inset Text
 
 \begin_layout Plain Layout
-
+ignored\SpecialChar softhyphen
+Tests
 \end_layout
 
 \end_inset
 </cell>
-<cell multicolumn="2" alignment="center" valignment="top" topline="true" leftline="true" usebox="none">
+<cell alignment="left" valignment="top" topline="true" bottomline="true" leftline="true" usebox="none">
 \begin_inset Text
 
 \begin_layout Plain Layout
-
+unreliable\SpecialChar softhyphen
+Tests
 \end_layout
 
 \end_inset
 </cell>
-<cell multicolumn="2" alignment="center" valignment="top" topline="true" leftline="true" rightline="true" usebox="none">
+<cell alignment="left" valignment="top" topline="true" bottomline="true" leftline="true" usebox="none">
 \begin_inset Text
 
 \begin_layout Plain Layout
-
+inverted\SpecialChar softhyphen
+Tests
 \end_layout
 
 \end_inset
 </cell>
-<cell multicolumn="2" alignment="center" valignment="top" topline="true" rightline="true" usebox="none">
+<cell alignment="center" valignment="top" topline="true" bottomline="true" leftline="true" usebox="none">
 \begin_inset Text
 
 \begin_layout Plain Layout
-
+suspended\SpecialChar softhyphen
+Tests
 \end_layout
 
 \end_inset
 </cell>
-</row>
-<row>
-<cell alignment="left" valignment="top" topline="true" bottomline="true" leftline="true" usebox="none">
+<cell alignment="center" valignment="top" topline="true" leftline="true" usebox="none">
 \begin_inset Text
 
 \begin_layout Plain Layout
-Ignored
+export
 \end_layout
 
 \end_inset
 </cell>
-<cell alignment="left" valignment="top" topline="true" bottomline="true" leftline="true" usebox="none">
+<cell alignment="center" valignment="top" topline="true" usebox="none">
 \begin_inset Text
 
 \begin_layout Plain Layout
-Unreliable
+inverted
 \end_layout
 
 \end_inset
 </cell>
-<cell alignment="left" valignment="top" topline="true" bottomline="true" leftline="true" usebox="none">
+<cell alignment="center" valignment="top" topline="true" usebox="none">
 \begin_inset Text
 
 \begin_layout Plain Layout
-Suspicious
+suspended
 \end_layout
 
 \end_inset
 </cell>
-<cell alignment="left" valignment="top" topline="true" bottomline="true" leftline="true" usebox="none">
+<cell alignment="center" valignment="top" topline="true" leftline="true" rightline="true" usebox="none">
 \begin_inset Text
 
 \begin_layout Plain Layout
-Suspended
+
 \end_layout
 
 \end_inset
 </cell>
-<cell multicolumn="1" alignment="center" valignment="top" topline="true" leftline="true" usebox="none">
+</row>
+<row>
+<cell alignment="left" valignment="top" topline="true" bottomline="true" leftline="true" usebox="none">
 \begin_inset Text
 
 \begin_layout Plain Layout
-export
+Yes
 \end_layout
 
 \end_inset
 </cell>
-<cell multicolumn="2" alignment="center" valignment="top" topline="true" usebox="none">
+<cell alignment="left" valignment="top" topline="true" bottomline="true" leftline="true" usebox="none">
 \begin_inset Text
 
 \begin_layout Plain Layout
-
+-
 \end_layout
 
 \end_inset
 </cell>
-<cell multicolumn="1" alignment="center" valignment="top" topline="true" leftline="true" usebox="none">
+<cell alignment="left" valignment="top" topline="true" bottomline="true" leftline="true" usebox="none">
 \begin_inset Text
 
 \begin_layout Plain Layout
-unreliable
+-
 \end_layout
 
 \end_inset
 </cell>
-<cell multicolumn="2" alignment="center" valignment="top" topline="true" usebox="none">
+<cell alignment="center" valignment="top" topline="true" bottomline="true" leftline="true" usebox="none">
 \begin_inset Text
 
 \begin_layout Plain Layout
-
+-
 \end_layout
 
 \end_inset
 </cell>
-<cell multicolumn="1" alignment="center" valignment="top" topline="true" leftline="true" usebox="none">
+<cell alignment="center" valignment="top" topline="true" leftline="true" usebox="none">
 \begin_inset Text
 
 \begin_layout Plain Layout
-inverted
+-
 \end_layout
 
 \end_inset
 </cell>
-<cell multicolumn="2" alignment="center" valignment="top" topline="true" usebox="none">
+<cell alignment="center" valignment="top" topline="true" usebox="none">
 \begin_inset Text
 
 \begin_layout Plain Layout
-
+-
 \end_layout
 
 \end_inset
 </cell>
-<cell multicolumn="1" alignment="center" valignment="top" topline="true" leftline="true" rightline="true" usebox="none">
+<cell alignment="center" valignment="top" topline="true" rightline="true" usebox="none">
 \begin_inset Text
 
 \begin_layout Plain Layout
-suspended
+-
 \end_layout
 
 \end_inset
 </cell>
-<cell multicolumn="2" alignment="center" valignment="top" topline="true" rightline="true" usebox="none">
+<cell alignment="center" valignment="top" topline="true" rightline="true" usebox="none">
 \begin_inset Text
 
 \begin_layout Plain Layout
@@ -4185,52 +4233,51 @@ suspended
 </cell>
 </row>
 <row>
-<cell alignment="left" valignment="top" topline="true" bottomline="true" leftline="true" usebox="none">
+<cell multirow="3" alignment="left" valignment="top" topline="true" bottomline="true" leftline="true" usebox="none">
 \begin_inset Text
 
 \begin_layout Plain Layout
-Yes
+No
 \end_layout
 
 \end_inset
 </cell>
-<cell alignment="left" valignment="top" topline="true" bottomline="true" leftline="true" usebox="none">
+<cell multirow="3" alignment="left" valignment="top" topline="true" bottomline="true" leftline="true" usebox="none">
 \begin_inset Text
 
 \begin_layout Plain Layout
--
-\end_layout
+If Yes,
+\begin_inset Newline newline
+\end_inset
 
+add label
+\begin_inset Newline newline
 \end_inset
-</cell>
-<cell alignment="left" valignment="top" topline="true" bottomline="true" leftline="true" usebox="none">
-\begin_inset Text
 
-\begin_layout Plain Layout
--
+'unreliable'
 \end_layout
 
 \end_inset
 </cell>
-<cell alignment="left" valignment="top" topline="true" bottomline="true" leftline="true" usebox="none">
+<cell multirow="3" alignment="left" valignment="middle" topline="true" bottomline="true" leftline="true" usebox="none">
 \begin_inset Text
 
 \begin_layout Plain Layout
--
+Yes
 \end_layout
 
 \end_inset
 </cell>
-<cell alignment="center" valignment="top" topline="true" leftline="true" usebox="none">
+<cell alignment="center" valignment="top" topline="true" bottomline="true" leftline="true" usebox="none">
 \begin_inset Text
 
 \begin_layout Plain Layout
--
+Yes
 \end_layout
 
 \end_inset
 </cell>
-<cell alignment="center" valignment="top" topline="true" usebox="none">
+<cell alignment="center" valignment="top" topline="true" leftline="true" usebox="none">
 \begin_inset Text
 
 \begin_layout Plain Layout
@@ -4239,7 +4286,7 @@ Yes
 
 \end_inset
 </cell>
-<cell alignment="center" valignment="top" topline="true" leftline="true" usebox="none">
+<cell alignment="center" valignment="top" topline="true" usebox="none">
 \begin_inset Text
 
 \begin_layout Plain Layout
@@ -4248,54 +4295,54 @@ Yes
 
 \end_inset
 </cell>
-<cell alignment="center" valignment="top" topline="true" usebox="none">
+<cell alignment="center" valignment="top" topline="true" rightline="true" usebox="none">
 \begin_inset Text
 
 \begin_layout Plain Layout
-
++
 \end_layout
 
 \end_inset
 </cell>
-<cell alignment="center" valignment="top" topline="true" leftline="true" usebox="none">
+<cell alignment="center" valignment="top" topline="true" rightline="true" usebox="none">
 \begin_inset Text
 
 \begin_layout Plain Layout
--
+WILL_FAIL
 \end_layout
 
 \end_inset
 </cell>
-<cell alignment="center" valignment="top" topline="true" usebox="none">
+</row>
+<row>
+<cell multirow="4" alignment="left" valignment="top" topline="true" leftline="true" usebox="none">
 \begin_inset Text
 
 \begin_layout Plain Layout
--
+
 \end_layout
 
 \end_inset
 </cell>
-<cell alignment="center" valignment="top" topline="true" leftline="true" usebox="none">
+<cell multirow="4" alignment="left" valignment="top" topline="true" leftline="true" usebox="none">
 \begin_inset Text
 
 \begin_layout Plain Layout
--
+
 \end_layout
 
 \end_inset
 </cell>
-<cell alignment="center" valignment="top" topline="true" rightline="true" usebox="none">
+<cell multirow="4" alignment="left" valignment="top" topline="true" bottomline="true" leftline="true" usebox="none">
 \begin_inset Text
 
 \begin_layout Plain Layout
--
+
 \end_layout
 
 \end_inset
 </cell>
-</row>
-<row>
-<cell multirow="3" alignment="left" valignment="top" topline="true" bottomline="true" leftline="true" usebox="none">
+<cell alignment="center" valignment="top" topline="true" bottomline="true" leftline="true" usebox="none">
 \begin_inset Text
 
 \begin_layout Plain Layout
@@ -4304,25 +4351,25 @@ No
 
 \end_inset
 </cell>
-<cell alignment="left" valignment="top" topline="true" bottomline="true" leftline="true" usebox="none">
+<cell alignment="center" valignment="top" topline="true" leftline="true" usebox="none">
 \begin_inset Text
 
 \begin_layout Plain Layout
-Yes
++
 \end_layout
 
 \end_inset
 </cell>
-<cell alignment="left" valignment="top" topline="true" bottomline="true" leftline="true" usebox="none">
+<cell alignment="center" valignment="top" topline="true" usebox="none">
 \begin_inset Text
 
 \begin_layout Plain Layout
--
++
 \end_layout
 
 \end_inset
 </cell>
-<cell alignment="left" valignment="top" topline="true" bottomline="true" leftline="true" usebox="none">
+<cell alignment="center" valignment="top" topline="true" rightline="true" usebox="none">
 \begin_inset Text
 
 \begin_layout Plain Layout
@@ -4331,43 +4378,45 @@ Yes
 
 \end_inset
 </cell>
-<cell alignment="center" valignment="top" topline="true" leftline="true" usebox="none">
+<cell alignment="center" valignment="top" topline="true" rightline="true" usebox="none">
 \begin_inset Text
 
 \begin_layout Plain Layout
--
+WILL_FAIL
 \end_layout
 
 \end_inset
 </cell>
-<cell alignment="center" valignment="top" topline="true" usebox="none">
+</row>
+<row>
+<cell multirow="4" alignment="left" valignment="top" topline="true" bottomline="true" leftline="true" usebox="none">
 \begin_inset Text
 
 \begin_layout Plain Layout
--
+
 \end_layout
 
 \end_inset
 </cell>
-<cell alignment="center" valignment="top" topline="true" leftline="true" usebox="none">
+<cell multirow="4" alignment="left" valignment="top" topline="true" bottomline="true" leftline="true" usebox="none">
 \begin_inset Text
 
 \begin_layout Plain Layout
--
+
 \end_layout
 
 \end_inset
 </cell>
-<cell alignment="center" valignment="top" topline="true" usebox="none">
+<cell alignment="left" valignment="top" topline="true" bottomline="true" leftline="true" usebox="none">
 \begin_inset Text
 
 \begin_layout Plain Layout
-+
+No
 \end_layout
 
 \end_inset
 </cell>
-<cell alignment="center" valignment="top" topline="true" leftline="true" usebox="none">
+<cell alignment="center" valignment="top" topline="true" bottomline="true" leftline="true" usebox="none">
 \begin_inset Text
 
 \begin_layout Plain Layout
@@ -4376,16 +4425,16 @@ Yes
 
 \end_inset
 </cell>
-<cell alignment="center" valignment="top" topline="true" usebox="none">
+<cell alignment="center" valignment="top" topline="true" bottomline="true" leftline="true" usebox="none">
 \begin_inset Text
 
 \begin_layout Plain Layout
--
++
 \end_layout
 
 \end_inset
 </cell>
-<cell alignment="center" valignment="top" topline="true" leftline="true" usebox="none">
+<cell alignment="center" valignment="top" topline="true" bottomline="true" usebox="none">
 \begin_inset Text
 
 \begin_layout Plain Layout
@@ -4394,7 +4443,7 @@ Yes
 
 \end_inset
 </cell>
-<cell alignment="center" valignment="top" topline="true" rightline="true" usebox="none">
+<cell alignment="center" valignment="top" topline="true" bottomline="true" rightline="true" usebox="none">
 \begin_inset Text
 
 \begin_layout Plain Layout
@@ -4403,9 +4452,7 @@ Yes
 
 \end_inset
 </cell>
-</row>
-<row>
-<cell multirow="4" alignment="left" valignment="middle" topline="true" leftline="true" usebox="none">
+<cell alignment="center" valignment="top" topline="true" bottomline="true" rightline="true" usebox="none">
 \begin_inset Text
 
 \begin_layout Plain Layout
@@ -4414,117 +4461,162 @@ Yes
 
 \end_inset
 </cell>
-<cell multirow="3" alignment="left" valignment="top" topline="true" bottomline="true" leftline="true" usebox="none">
+</row>
+</lyxtabular>
+
+\end_inset
+
+
+\end_layout
+
+\begin_layout Standard
+\begin_inset Note Note
+status open
+
+\begin_layout Plain Layout
+Without the 
+\begin_inset Quotes eld
+\end_inset
+
+suspendedTests
+\begin_inset Quotes erd
+\end_inset
+
+ filter, this would be far less complicated:
+\end_layout
+
+\begin_layout Plain Layout
+\begin_inset Tabular
+<lyxtabular version="3" rows="6" columns="7">
+<features tabularvalignment="middle">
+<column alignment="left" valignment="top" width="0pt">
+<column alignment="left" valignment="top" width="0pt">
+<column alignment="left" valignment="top" width="0pt">
+<column alignment="center" valignment="top">
+<column alignment="center" valignment="top">
+<column alignment="center" valignment="top">
+<column alignment="center" valignment="top">
+<row>
+<cell multicolumn="1" alignment="left" valignment="top" topline="true" leftline="true" usebox="none">
 \begin_inset Text
 
 \begin_layout Plain Layout
-No
+Test matching pattern in file:
 \end_layout
 
 \end_inset
 </cell>
-<cell multirow="3" alignment="left" valignment="middle" topline="true" bottomline="true" leftline="true" usebox="none">
+<cell multicolumn="2" alignment="left" valignment="top" topline="true" leftline="true" usebox="none">
 \begin_inset Text
 
 \begin_layout Plain Layout
-Yes
+
 \end_layout
 
 \end_inset
 </cell>
-<cell alignment="left" valignment="top" topline="true" bottomline="true" leftline="true" usebox="none">
+<cell multicolumn="2" alignment="left" valignment="top" topline="true" leftline="true" usebox="none">
 \begin_inset Text
 
 \begin_layout Plain Layout
-Yes
+
 \end_layout
 
 \end_inset
 </cell>
-<cell alignment="center" valignment="top" topline="true" leftline="true" usebox="none">
+<cell multicolumn="1" alignment="center" valignment="top" topline="true" leftline="true" usebox="none">
 \begin_inset Text
 
 \begin_layout Plain Layout
--
+Label
 \end_layout
 
 \end_inset
 </cell>
-<cell alignment="center" valignment="top" topline="true" usebox="none">
+<cell multicolumn="2" alignment="center" valignment="top" topline="true" leftline="true" usebox="none">
 \begin_inset Text
 
 \begin_layout Plain Layout
--
+
 \end_layout
 
 \end_inset
 </cell>
-<cell alignment="center" valignment="top" topline="true" leftline="true" usebox="none">
+<cell multicolumn="2" alignment="center" valignment="top" topline="true" leftline="true" usebox="none">
 \begin_inset Text
 
 \begin_layout Plain Layout
--
+
 \end_layout
 
 \end_inset
 </cell>
-<cell alignment="center" valignment="top" topline="true" usebox="none">
+<cell alignment="center" valignment="top" topline="true" leftline="true" rightline="true" usebox="none">
 \begin_inset Text
 
 \begin_layout Plain Layout
--
+test property
 \end_layout
 
 \end_inset
 </cell>
-<cell alignment="center" valignment="top" topline="true" leftline="true" usebox="none">
+</row>
+<row>
+<cell alignment="left" valignment="top" topline="true" bottomline="true" leftline="true" usebox="none">
 \begin_inset Text
 
 \begin_layout Plain Layout
-+
+ignoredTests
 \end_layout
 
 \end_inset
 </cell>
-<cell alignment="center" valignment="top" topline="true" usebox="none">
+<cell alignment="left" valignment="top" topline="true" bottomline="true" leftline="true" usebox="none">
 \begin_inset Text
 
 \begin_layout Plain Layout
--
+unreliableTests
 \end_layout
 
 \end_inset
 </cell>
-<cell alignment="center" valignment="top" topline="true" leftline="true" usebox="none">
+<cell alignment="left" valignment="top" topline="true" bottomline="true" leftline="true" usebox="none">
 \begin_inset Text
 
 \begin_layout Plain Layout
--
+invertedTests
 \end_layout
 
 \end_inset
 </cell>
-<cell alignment="center" valignment="top" topline="true" rightline="true" usebox="none">
+<cell alignment="center" valignment="top" topline="true" leftline="true" usebox="none">
 \begin_inset Text
 
 \begin_layout Plain Layout
-+
+export
 \end_layout
 
 \end_inset
 </cell>
-</row>
-<row>
-<cell multirow="4" alignment="left" valignment="top" topline="true" leftline="true" usebox="none">
+<cell alignment="center" valignment="top" topline="true" usebox="none">
 \begin_inset Text
 
 \begin_layout Plain Layout
+unreliable
+\end_layout
+
+\end_inset
+</cell>
+<cell alignment="center" valignment="top" topline="true" usebox="none">
+\begin_inset Text
 
+\begin_layout Plain Layout
+inverted
 \end_layout
 
 \end_inset
 </cell>
-<cell multirow="4" alignment="left" valignment="top" topline="true" leftline="true" usebox="none">
+<cell alignment="center" valignment="top" topline="true" leftline="true" rightline="true" usebox="none">
 \begin_inset Text
 
 \begin_layout Plain Layout
@@ -4533,11 +4625,22 @@ Yes
 
 \end_inset
 </cell>
-<cell multirow="4" alignment="left" valignment="top" topline="true" bottomline="true" leftline="true" usebox="none">
+</row>
+<row>
+<cell alignment="left" valignment="top" topline="true" bottomline="true" leftline="true" usebox="none">
 \begin_inset Text
 
 \begin_layout Plain Layout
+Yes
+\end_layout
+
+\end_inset
+</cell>
+<cell alignment="left" valignment="top" topline="true" bottomline="true" leftline="true" usebox="none">
+\begin_inset Text
 
+\begin_layout Plain Layout
+-
 \end_layout
 
 \end_inset
@@ -4546,7 +4649,7 @@ Yes
 \begin_inset Text
 
 \begin_layout Plain Layout
-No
+-
 \end_layout
 
 \end_inset
@@ -4564,12 +4667,12 @@ No
 \begin_inset Text
 
 \begin_layout Plain Layout
-+
+
 \end_layout
 
 \end_inset
 </cell>
-<cell alignment="center" valignment="top" topline="true" leftline="true" usebox="none">
+<cell alignment="center" valignment="top" topline="true" rightline="true" usebox="none">
 \begin_inset Text
 
 \begin_layout Plain Layout
@@ -4578,7 +4681,36 @@ No
 
 \end_inset
 </cell>
-<cell alignment="center" valignment="top" topline="true" usebox="none">
+<cell alignment="center" valignment="top" topline="true" rightline="true" usebox="none">
+\begin_inset Text
+
+\begin_layout Plain Layout
+
+\end_layout
+
+\end_inset
+</cell>
+</row>
+<row>
+<cell multirow="3" alignment="left" valignment="middle" topline="true" bottomline="true" leftline="true" usebox="none">
+\begin_inset Text
+
+\begin_layout Plain Layout
+No
+\end_layout
+
+\end_inset
+</cell>
+<cell alignment="left" valignment="top" topline="true" bottomline="true" leftline="true" usebox="none">
+\begin_inset Text
+
+\begin_layout Plain Layout
+Yes
+\end_layout
+
+\end_inset
+</cell>
+<cell alignment="left" valignment="top" topline="true" bottomline="true" leftline="true" usebox="none">
 \begin_inset Text
 
 \begin_layout Plain Layout
@@ -4591,7 +4723,7 @@ No
 \begin_inset Text
 
 \begin_layout Plain Layout
-+
+-
 \end_layout
 
 \end_inset
@@ -4605,7 +4737,7 @@ No
 
 \end_inset
 </cell>
-<cell alignment="center" valignment="top" topline="true" leftline="true" usebox="none">
+<cell alignment="center" valignment="top" topline="true" rightline="true" usebox="none">
 \begin_inset Text
 
 \begin_layout Plain Layout
@@ -4618,14 +4750,14 @@ No
 \begin_inset Text
 
 \begin_layout Plain Layout
--
+
 \end_layout
 
 \end_inset
 </cell>
 </row>
 <row>
-<cell multirow="4" alignment="left" valignment="top" topline="true" bottomline="true" leftline="true" usebox="none">
+<cell multirow="4" alignment="left" valignment="middle" topline="true" leftline="true" usebox="none">
 \begin_inset Text
 
 \begin_layout Plain Layout
@@ -4634,34 +4766,34 @@ No
 
 \end_inset
 </cell>
-<cell multirow="4" alignment="left" valignment="top" topline="true" bottomline="true" leftline="true" usebox="none">
+<cell multirow="3" alignment="left" valignment="middle" topline="true" bottomline="true" leftline="true" usebox="none">
 \begin_inset Text
 
 \begin_layout Plain Layout
-
+No
 \end_layout
 
 \end_inset
 </cell>
-<cell alignment="left" valignment="top" topline="true" bottomline="true" leftline="true" usebox="none">
+<cell alignment="center" valignment="top" topline="true" bottomline="true" leftline="true" usebox="none">
 \begin_inset Text
 
 \begin_layout Plain Layout
-No
+Yes
 \end_layout
 
 \end_inset
 </cell>
-<cell alignment="left" valignment="top" topline="true" bottomline="true" leftline="true" usebox="none">
+<cell alignment="center" valignment="top" topline="true" leftline="true" usebox="none">
 \begin_inset Text
 
 \begin_layout Plain Layout
--
++
 \end_layout
 
 \end_inset
 </cell>
-<cell alignment="center" valignment="top" topline="true" bottomline="true" leftline="true" usebox="none">
+<cell alignment="center" valignment="top" topline="true" usebox="none">
 \begin_inset Text
 
 \begin_layout Plain Layout
@@ -4670,7 +4802,7 @@ No
 
 \end_inset
 </cell>
-<cell alignment="center" valignment="top" topline="true" bottomline="true" usebox="none">
+<cell alignment="center" valignment="top" topline="true" rightline="true" usebox="none">
 \begin_inset Text
 
 \begin_layout Plain Layout
@@ -4679,20 +4811,40 @@ No
 
 \end_inset
 </cell>
-<cell alignment="center" valignment="top" topline="true" bottomline="true" leftline="true" usebox="none">
+<cell alignment="center" valignment="top" topline="true" rightline="true" usebox="none">
 \begin_inset Text
 
 \begin_layout Plain Layout
--
+WILL_FAIL
 \end_layout
 
 \end_inset
 </cell>
-<cell alignment="center" valignment="top" topline="true" bottomline="true" usebox="none">
+</row>
+<row>
+<cell multirow="4" alignment="left" valignment="top" topline="true" bottomline="true" leftline="true" usebox="none">
 \begin_inset Text
 
 \begin_layout Plain Layout
--
+
+\end_layout
+
+\end_inset
+</cell>
+<cell multirow="4" alignment="left" valignment="top" topline="true" bottomline="true" leftline="true" usebox="none">
+\begin_inset Text
+
+\begin_layout Plain Layout
+
+\end_layout
+
+\end_inset
+</cell>
+<cell alignment="left" valignment="top" topline="true" bottomline="true" leftline="true" usebox="none">
+\begin_inset Text
+
+\begin_layout Plain Layout
+No
 \end_layout
 
 \end_inset
@@ -4701,7 +4853,7 @@ No
 \begin_inset Text
 
 \begin_layout Plain Layout
--
++
 \end_layout
 
 \end_inset
@@ -4715,7 +4867,7 @@ No
 
 \end_inset
 </cell>
-<cell alignment="center" valignment="top" topline="true" bottomline="true" leftline="true" usebox="none">
+<cell alignment="center" valignment="top" topline="true" bottomline="true" rightline="true" usebox="none">
 \begin_inset Text
 
 \begin_layout Plain Layout
@@ -4728,7 +4880,7 @@ No
 \begin_inset Text
 
 \begin_layout Plain Layout
--
+
 \end_layout
 
 \end_inset
@@ -4741,7 +4893,12 @@ No
 
 \end_layout
 
-\begin_layout Subsubsection
+\end_inset
+
+
+\end_layout
+
+\begin_layout Subsection
 check_load tests
 \end_layout
 
@@ -4779,12 +4936,23 @@ development/autotests/filterCheckWarnings
 Under cmake, the tests are labeled as 'load'.
 \end_layout
 
-\begin_layout Subsubsection
+\begin_layout Subsection
 Keytests
 \end_layout
 
 \begin_layout Standard
-Automated tests based on the "MonKey Testing" keytest program.
+Automated tests based on the "MonKey Testing" keytest program are enabled
+ if the necessary dependencies are found and if the CMake flag 
+\begin_inset Flex Code
+status collapsed
+
+\begin_layout Plain Layout
+-DLYX_ENABLE_KEYTESTS=ON
+\end_layout
+
+\end_inset
+
+ is used.
  They are documented in the README document in 
 \begin_inset Flex Code
 status collapsed
@@ -4797,10 +4965,9 @@ development/autotests
 
  subfolder of the \SpecialChar LyX
  source code distribution.
- T
 \end_layout
 
-\begin_layout Subsubsection
+\begin_layout Subsection
 lyx21 tests
 \end_layout
 
@@ -4809,7 +4976,7 @@ These tests combine lyx2lyx tests with check_load tests.
  They fail if either fails.
 \end_layout
 
-\begin_layout Subsubsection
+\begin_layout Subsection
 URL tests
 \end_layout
 
@@ -4846,7 +5013,7 @@ LastTest.log
 'url'.
 \end_layout
 
-\begin_layout Paragraph
+\begin_layout Subsubsection
 Running URL tests
 \end_layout
 
@@ -4891,7 +5058,7 @@ Associated test results can be examined in ctest-log directory in files
  of the form 'LastFailed.*URLS.log'
 \end_layout
 
-\begin_layout Section
+\begin_layout Chapter
 Development policies
 \end_layout
 
@@ -4916,7 +5083,7 @@ reference "sec:When-is-an"
 .
 \end_layout
 
-\begin_layout Subsection
+\begin_layout Section
 When to set a fixed milestone?
 \end_layout
 
@@ -4939,7 +5106,7 @@ If a bug is important, but nobody is working on it, and it is no showstopper,
  For all other bugs, do not set a milestone at all.
 \end_layout
 
-\begin_layout Subsection
+\begin_layout Section
 Can we add rc entries in stable branch?
 \end_layout
 
@@ -4948,42 +5115,131 @@ No.
  We are supposed to increase the prefs2prefs version number with such things.
 \end_layout
 
-\begin_layout Section
+\begin_layout Chapter
+\begin_inset CommandInset label
+LatexCommand label
+name "sec:Documentation-policies"
+
+\end_inset
+
 Documentation policies
 \end_layout
 
-\begin_layout Standard
-The main documentation consists of these files:
+\begin_layout Section
+Rules
 \end_layout
 
-\begin_layout Description
-splash.lyx it is the first file you see after an installation.
- We assume that a new user sees this.
- It is therefore designed to be as simple as possible.
- Therefore please don't add any new formatting, only fix typos etc.
- Splash.lyx is up to date for \SpecialChar LyX
- 2.1.x, currently maintained by Uwe Stöhr.
-\end_layout
+\begin_layout Standard
+There are 6
+\begin_inset space ~
+\end_inset
 
-\begin_layout Description
-Intro.lyx This is the manual new users will read to learn \SpecialChar LyX
-.
- It therefore uses a limited set of formatting.
- For example a standard document class.
- Since new users will first learn about the formatting possibilities of
- \SpecialChar LyX
- please keep this file that simple.
- Intro.lyx is up to date for \SpecialChar LyX
- 2.1.x, currently maintained by Uwe Stöhr.
+rules in editing the docs:
 \end_layout
 
-\begin_layout Description
-Tutorial.lyx our tutorial.
- It must be always up to date.
- Normally there is nothing to add since we don't want to overwhelm new users
- with too much details.
- The will learn these details while using \SpecialChar LyX
- and we have special manuals.
+\begin_layout Enumerate
+\begin_inset CommandInset label
+LatexCommand label
+name "enu:If-you-are"
+
+\end_inset
+
+If you are not the maintainer of a doc file or a chapter/section, you MUST
+ use change tracking so that the maintainer could review your changes
+\end_layout
+
+\begin_layout Enumerate
+Respect the formatting of the document.
+ The different files use different formatting styles.
+ That is OK and has historic reasons nobody fully knows ;-).
+ But it is important to be consistent within one file.
+\end_layout
+
+\begin_layout Enumerate
+All changes you make to a file in one language MUST also go the file in
+ the other actively maintained languages.
+ Normally the maintainer does this for you, if you are the maintainer, you
+ must do this by copying or changing the changed or added text to the other
+ files so that the translators sees the blue underlined text and know what
+ they have to translate and what was changed.
+\end_layout
+
+\begin_layout Enumerate
+You MUST assure that the document is compilable as 
+\begin_inset Quotes eld
+\end_inset
+
+PDF (pdflatex)
+\begin_inset Quotes erd
+\end_inset
+
+ or the document's default output format after your changes.
+\end_layout
+
+\begin_layout Enumerate
+All fixes (typos, compilation fixes, updates info etc.) go at first into
+ the current GIT branch because the user should benefit from all fixes with
+ every minor release.
+ Feel free to commit directly to branch as long as you follow rule
+\begin_inset space ~
+\end_inset
+
+
+\begin_inset CommandInset ref
+LatexCommand ref
+reference "enu:If-you-are"
+
+\end_inset
+
+.
+ You can immediately commit to master as well.
+\end_layout
+
+\begin_layout Enumerate
+\begin_inset CommandInset label
+LatexCommand label
+name "enu:The-fileformat-of"
+
+\end_inset
+
+The fileformat of a file must not be changed unless you document a new feature
+ in LyX that requires a new fileformat.
+ The reason for this rule is to keep it easy for the doc maintainers to
+ port/backport changes to from master/branch.
+\end_layout
+
+\begin_layout Standard
+The main documentation consists of these files:
+\end_layout
+
+\begin_layout Description
+Welcome.lyx it is the first file you see after an installation.
+ We assume that a new user sees this.
+ It is therefore designed to be as simple as possible.
+ Therefore please don't add any new formatting, only fix typos etc.
+ Welcome.lyx is up to date for \SpecialChar LyX
+ 2.1.x, currently maintained by Uwe Stöhr.
+\end_layout
+
+\begin_layout Description
+Intro.lyx This is the manual new users will read to learn \SpecialChar LyX
+.
+ It therefore uses a limited set of formatting.
+ For example a standard document class.
+ Since new users will first learn about the formatting possibilities of
+ \SpecialChar LyX
+ please keep this file that simple.
+ Intro.lyx is up to date for \SpecialChar LyX
+ 2.1.x, currently maintained by Uwe Stöhr.
+\end_layout
+
+\begin_layout Description
+Tutorial.lyx our tutorial.
+ It must be always up to date.
+ Normally there is nothing to add since we don't want to overwhelm new users
+ with too much details.
+ The will learn these details while using \SpecialChar LyX
+ and we have special manuals.
  Tutorial.lyx is up to date for \SpecialChar LyX
  2.1.x, currently maintained by Uwe Stöhr.
 \end_layout
@@ -5046,45 +5302,2342 @@ Customization.lyx this manual covers information how to customize \SpecialChar L
  distributions (meaning be as objective as possible).
 \end_layout
 
+\begin_layout Chapter
+Coding rules
+\end_layout
+
+\begin_layout Standard
+The aim of this chapter is to serve as a guide for the developers, to aid
+ us to get clean and uniform code.
+ It is incomplete.
+ We really like to have new developers joining the \SpecialChar LyX
+ Project.
+ However, we have had problems in the past with developers leaving the project
+ and their contributed code in a far from perfect state.
+ Most of this happened before we really became aware of these issues, but
+ still, we don't want it to happen again.
+ So we have put together some guidelines and rules for the developers.
+\end_layout
+
+\begin_layout Section
+General
+\end_layout
+
 \begin_layout Standard
-There are only 4
+These guidelines should save us a lot of work while cleaning up the code
+ and help us to have quality code.
+ \SpecialChar LyX
+ has been haunted by problems coming from unfinished projects by people
+ who have left the team.
+ Those problems will hopefully disappear if the code is easy to hand over
+ to somebody else.
+ In general, if you want to contribute to the main source, we expect at
+ least that you:
+\end_layout
+
+\begin_layout Itemize
+The most important rule first: KISS (Keep It Simple Stupid), always use
+ a simple implementation in favor of a more complicated one.
+ This eases maintenance a lot.
+\end_layout
+
+\begin_layout Itemize
+Write good C++ code: readable, well commented, and taking advantage of the
+ OO model.
+ Follow the formatting guidelines.
+ See sec.
 \begin_inset space ~
 \end_inset
 
-rules in editing the docs:
+
+\begin_inset CommandInset ref
+LatexCommand ref
+reference "sec:Formatting"
+plural "false"
+caps "false"
+noprefix "false"
+
+\end_inset
+
+.
 \end_layout
 
-\begin_layout Enumerate
-If you are not the maintainer of a doc file or a chapter/section, you MUST
- use change tracking so that the maintainer could review your changes
+\begin_layout Itemize
+As of LyX 2.4.0, you can use features of C++11.
+ Accordingly you have to use C++11 standard conforming compiler, e.
+\begin_inset space \thinspace{}
+\end_inset
+
+g.
+ not too dated version of GCC or Clang.
 \end_layout
 
-\begin_layout Enumerate
-Respect the formatting of the document.
- The different files use different formatting styles.
- That is OK and has historic reasons nobody fully know ;-).
But it is important to be consistent within one file.
+\begin_layout Itemize
+Adapt the code to the structures already existing in \SpecialChar LyX
+, or in the case that
+ you have better ideas, discuss them on the developer's list before writing
the code.
 \end_layout
 
-\begin_layout Enumerate
-All changes you make to a file in one language MUST also go the file in
- the other actively maintained languages.
- Normally the maintainer does this for you, if you are the maintainer, you
- must do this by copying or changing the changed or added text to the other
- files so that the translators sees the blue underlined text and know what
- they have to translate and what was changed.
+\begin_layout Itemize
+Take advantage of the C++ standard library.
+ Especially don't use custom containers when a standard container is usable;
+ learn to use the algorithms and functors in the standard library.
 \end_layout
 
-\begin_layout Enumerate
-You MUST assure that the document is compilable as 
+\begin_layout Itemize
+Be aware of exceptions and write exception safe code.
+ See sec.
+\begin_inset space ~
+\end_inset
+
+
+\begin_inset CommandInset ref
+LatexCommand ref
+reference "sec:Exceptions"
+plural "false"
+caps "false"
+noprefix "false"
+
+\end_inset
+
+.
+\end_layout
+
+\begin_layout Itemize
+Document all variables, methods, functions, classes etc.
+ We are using the source documentation program doxygen, a program that handles
+ javadoc syntax, to document sources.
+ You can download doxygen from: 
+\begin_inset Flex URL
+status open
+
+\begin_layout Plain Layout
+
+http://www.stack.nl/~dimitri/doxygen/
+\end_layout
+
+\end_inset
+
+
+\end_layout
+
+\begin_layout Itemize
+We have certain code constructs that we try to follow.
+ See sec.
+\begin_inset space ~
+\end_inset
+
+
+\begin_inset CommandInset ref
+LatexCommand ref
+reference "sec:Code-constructs"
+plural "false"
+caps "false"
+noprefix "false"
+
+\end_inset
+
+.
+\end_layout
+
+\begin_layout Section
+Submitting code
+\end_layout
+
+\begin_layout Standard
+It is implicitly understood that all patches contributed to The \SpecialChar LyX
+ Project
+ is under the Gnu General Public License, version 2 or later.
+ If you have a problem with that, don't contribute code.
+ Also please don't just pop up out of the blue with a huge patch (or small)
+ that changes something substantial in \SpecialChar LyX
+.
+ Always discuss your ideas with the developers on the developer's mailing
+ list.
+ When you create the patch, please use 
 \begin_inset Quotes eld
 \end_inset
 
-PDF (pdflatex)
+
+\family typewriter
+diff -up
+\family default
+
+\begin_inset Quotes erd
+\end_inset
+
+ since we find that a lot easier to read than the other diff formats.
+ Also please do not send patches that implements or fixes several different
+ things; several patches is a much better option.
+ We also require you to provide a commit message entry with every patch,
+ this describes in detail what the patch is doing.
+\end_layout
+
+\begin_layout Section
+Code constructs
+\begin_inset CommandInset label
+LatexCommand label
+name "sec:Code-constructs"
+
+\end_inset
+
+
+\end_layout
+
+\begin_layout Standard
+We have several guidelines on code constructs, some of these exist to make
+ the code faster, others to make the code clearer.
+ Yet others exist to allow us to take advantage of the strong type checking
+ in C++.
+\end_layout
+
+\begin_layout Itemize
+Declaration of variables should wait as long as possible.
+ The rule is: 
+\begin_inset Quotes eld
+\end_inset
+
+Don't declare it until you need it.
 \begin_inset Quotes erd
 \end_inset
 
- after your changes.
+ In C++ there are a lot of user defined types, and these can very often
+ be expensive to initialize.
+ This rule connects to the next rule too.
+\end_layout
+
+\begin_layout Itemize
+Declare the variable as 
+\begin_inset Flex Code
+status collapsed
+
+\begin_layout Plain Layout
+const
+\end_layout
+
+\end_inset
+
+ if you don't need to change it.
+ This applies to POD types like 
+\begin_inset Flex Code
+status collapsed
+
+\begin_layout Plain Layout
+int
+\end_layout
+
+\end_inset
+
+ as well as classes.
+\end_layout
+
+\begin_layout Itemize
+Make the scope of a variable as small as possible.
+\end_layout
+
+\begin_layout Itemize
+Make good use of namespaces.
+ Prefer anonymous namespaces to declaring 
+\begin_inset Flex Code
+status collapsed
+
+\begin_layout Plain Layout
+static
+\end_layout
+
+\end_inset
+
+ for file scope.
+\end_layout
+
+\begin_layout Itemize
+Prefer preincrement to postincrement whenever possible.
+\end_layout
+
+\begin_layout Itemize
+Preincrement has potential of being faster than postincrement.
+ Just think about the obvious implementations of pre/post-increment.
+ This rule applies to decrement too.
+\end_layout
+
+\begin_layout Itemize
+Use:
+\begin_inset Separator latexpar
+\end_inset
+
+
+\end_layout
+
+\begin_deeper
+\begin_layout Standard
+\begin_inset listings
+lstparams "basicstyle={\ttfamily},showstringspaces=false,tabsize=4"
+inline false
+status open
+
+\begin_layout Plain Layout
+
+++T;
+\end_layout
+
+\begin_layout Plain Layout
+
+--U;
+\end_layout
+
+\end_inset
+
+
+\end_layout
+
+\begin_layout Standard
+Do not use:
+\end_layout
+
+\begin_layout Standard
+\begin_inset listings
+lstparams "basicstyle={\ttfamily},showstringspaces=false,tabsize=4"
+inline false
+status open
+
+\begin_layout Plain Layout
+
+T++; // not used in LyX
+\end_layout
+
+\begin_layout Plain Layout
+
+U--; // not used in LyX
+\end_layout
+
+\end_inset
+
+
+\end_layout
+
+\end_deeper
+\begin_layout Itemize
+Try to minimize evaluation of the same code over and over.
+ This is aimed especially at loops.
+\begin_inset Newline newline
+\end_inset
+
+Use:
+\begin_inset Separator latexpar
+\end_inset
+
+
+\end_layout
+
+\begin_deeper
+\begin_layout Standard
+\begin_inset listings
+lstparams "basicstyle={\ttfamily},showstringspaces=false,tabsize=4"
+inline false
+status open
+
+\begin_layout Plain Layout
+
+Container::iterator end = large.end();
+\end_layout
+
+\begin_layout Plain Layout
+
+for (Container::iterator it = large.begin(); it != end; ++it) {
+\end_layout
+
+\begin_layout Plain Layout
+
+       ...;
+\end_layout
+
+\begin_layout Plain Layout
+
+}
+\end_layout
+
+\end_inset
+
+
+\end_layout
+
+\begin_layout Standard
+Or better (C++11):
+\end_layout
+
+\begin_layout Standard
+\begin_inset listings
+lstparams "basicstyle={\ttfamily},showstringspaces=false,tabsize=4"
+inline false
+status open
+
+\begin_layout Plain Layout
+
+for (auto const & it : large) {
+\end_layout
+
+\begin_layout Plain Layout
+
+       ...;
+\end_layout
+
+\begin_layout Plain Layout
+
+}
+\end_layout
+
+\end_inset
+
+
+\end_layout
+
+\begin_layout Standard
+Do not use:
+\end_layout
+
+\begin_layout Standard
+\begin_inset listings
+lstparams "basicstyle={\ttfamily},showstringspaces=false,tabsize=4"
+inline false
+status open
+
+\begin_layout Plain Layout
+
+for (Container::iterator it = large.begin(); it != large.end(); ++it) {
+\end_layout
+
+\begin_layout Plain Layout
+
+       ...;
+\end_layout
+
+\begin_layout Plain Layout
+
+}
+\end_layout
+
+\end_inset
+
+
+\end_layout
+
+\end_deeper
+\begin_layout Itemize
+For functions and methods that return a non-POD type
+\begin_inset Foot
+status open
+
+\begin_layout Plain Layout
+Plain Ol' Data type
+\end_layout
+
+\end_inset
+
+\begin_inset Flex Code
+status collapsed
+
+\begin_layout Plain Layout
+T
+\end_layout
+
+\end_inset
+
+, return 
+\begin_inset Flex Code
+status collapsed
+
+\begin_layout Plain Layout
+T const
+\end_layout
+
+\end_inset
+
+ instead.
+ This gives better type checking, and will give a compiler warning when
+ temporaries are used wrongly.
+\begin_inset Separator latexpar
+\end_inset
+
+
+\end_layout
+
+\begin_deeper
+\begin_layout Standard
+Use:
+\end_layout
+
+\begin_layout Standard
+\begin_inset listings
+lstparams "basicstyle={\ttfamily},showstringspaces=false,tabsize=4"
+inline false
+status open
+
+\begin_layout Plain Layout
+
+T const add(...);
+\end_layout
+
+\end_inset
+
+
+\end_layout
+
+\begin_layout Standard
+Do not use:
+\end_layout
+
+\begin_layout Standard
+\begin_inset listings
+lstparams "basicstyle={\ttfamily},showstringspaces=false,tabsize=4"
+inline false
+status open
+
+\begin_layout Plain Layout
+
+T add(...);
+\end_layout
+
+\end_inset
+
+
+\end_layout
+
+\end_deeper
+\begin_layout Itemize
+Avoid using the default cases in switch statements unless you have too.
+ Use the correct type for the switch expression and let the compiler ensure
+ that all cases are exhausted.
+\end_layout
+
+\begin_layout Itemize
+\begin_inset listings
+lstparams "basicstyle={\ttfamily},showstringspaces=false,tabsize=4"
+inline false
+status open
+
+\begin_layout Plain Layout
+
+enum Foo {
+\end_layout
+
+\begin_layout Plain Layout
+
+       FOO_BAR1,
+\end_layout
+
+\begin_layout Plain Layout
+
+       FOO_BAR2
+\end_layout
+
+\begin_layout Plain Layout
+
+};
+\end_layout
+
+\begin_layout Plain Layout
+
+\end_layout
+
+\begin_layout Plain Layout
+
+Foo f = ...;
+\end_layout
+
+\begin_layout Plain Layout
+
+\end_layout
+
+\begin_layout Plain Layout
+
+switch (f) {
+\end_layout
+
+\begin_layout Plain Layout
+
+case FOO_BAR1: ...; 
+\end_layout
+
+\begin_layout Plain Layout
+
+       break;
+\end_layout
+
+\begin_layout Plain Layout
+
+case FOO_BAR2: ...; 
+\end_layout
+
+\begin_layout Plain Layout
+
+       break;
+\end_layout
+
+\begin_layout Plain Layout
+
+default: ...; 
+\end_layout
+
+\begin_layout Plain Layout
+
+       // not needed and would shadow a wrong use of Foo
+\end_layout
+
+\begin_layout Plain Layout
+
+       break; 
+\end_layout
+
+\begin_layout Plain Layout
+
+}
+\end_layout
+
+\end_inset
+
+
+\end_layout
+
+\begin_layout Section
+Exceptions
+\begin_inset CommandInset label
+LatexCommand label
+name "sec:Exceptions"
+
+\end_inset
+
+
+\end_layout
+
+\begin_layout Standard
+Be aware of the presence of exceptions.
+ One important thing to realize is that you often do not have to use throw,
+ try or catch to be exception safe.
+ Let's look at the different types of exceptions safety (these are taken
+ from Herb Sutter's book 
+\begin_inset CommandInset citation
+LatexCommand cite
+key "sutter"
+literal "false"
+
+\end_inset
+
+):
+\end_layout
+
+\begin_layout Enumerate
+Basic guarantee: Even in the presence of exceptions thrown by T or other
+ exceptions, Stack objects don't leak resources.
+ Note that this also implies that the container will be destructible and
+ usable even if an exception is thrown while performing some container operation.
+ However, if an exception is thrown, the container will be in a consistent,
+ but not necessarily predictable, state.
+ Containers that support the basic guarantee can work safely in some settings.
+\end_layout
+
+\begin_layout Enumerate
+Strong guarantee: If an operation terminates because of an exception, program
+ state will remain unchanged.
+ This always implies commit-or-rollback semantics, including that no references
+ or iterators into the container be invalidated if an operation fails.
+ For example, if a Stack client calls Top and then attempts a Push that
+ fails because of an exception, then the state of the Stack object must
+ be unchanged and the reference returned from the prior call to Top must
+ still be valid.
+ For more information on these guarantees, see Dave Abrahams's documentation
+ of the SGI exception-safe standard library adaption at: 
+\begin_inset Flex URL
+status open
+
+\begin_layout Plain Layout
+
+http://www.stlport.org/doc/exception_safety.html
+\end_layout
+
+\end_inset
+
+ Probably the most interesting point here is that when you implement the
+ basic guarantee, the strong guarantee often comes for free.
+ For example, in our Stack implementation, almost everything we did was
+ needed to satisfy just the basic guarantee – and what's presented above
+ very nearly satisfies the strong guarantee, with little or no extra work.
+ Not half bad, considering all the trouble we went to.
+ In addition to these two guarantees, there is one more guarantee that certain
+ functions must provide in order to make overall exception safety possible:
+\end_layout
+
+\begin_layout Enumerate
+No throw guarantee: The function will not emit an exception under any circumstan
+ces.
+ Overall exception safety isn't possible unless certain functions are guaranteed
+ not to throw.
+ In particular, we've seen that this is true for destructors; later in this
+ miniseries, we'll see that it's also needed in certain helper functions,
+ such as 
+\family typewriter
+Swap()
+\family default
+.
+\end_layout
+
+\begin_layout Standard
+For all cases where we might be able to write exception safe functions without
+ using try, throw or catch we should do so.
+ In particular we should look over all destructors to ensure that they are
+ as exception safe as possible.
+\end_layout
+
+\begin_layout Section
+Formatting
+\begin_inset CommandInset label
+LatexCommand label
+name "sec:Formatting"
+
+\end_inset
+
+
+\end_layout
+
+\begin_layout Itemize
+Only one declaration on each line.
+\begin_inset Separator latexpar
+\end_inset
+
+
+\end_layout
+
+\begin_deeper
+\begin_layout Standard
+Use:
+\end_layout
+
+\begin_layout Standard
+\begin_inset listings
+lstparams "basicstyle={\ttfamily},showstringspaces=false,tabsize=4"
+inline false
+status open
+
+\begin_layout Plain Layout
+
+int a;
+\end_layout
+
+\begin_layout Plain Layout
+
+int b;
+\end_layout
+
+\end_inset
+
+
+\end_layout
+
+\begin_layout Standard
+Do not use:
+\end_layout
+
+\begin_layout Standard
+\begin_inset listings
+lstparams "basicstyle={\ttfamily},showstringspaces=false,tabsize=4"
+inline false
+status open
+
+\begin_layout Plain Layout
+
+int a, b; // not used in LyX
+\end_layout
+
+\end_inset
+
+
+\end_layout
+
+\begin_layout Standard
+This is especially important when initialization is done at the same time:
+\end_layout
+
+\begin_layout Standard
+Use:
+\end_layout
+
+\begin_layout Standard
+\begin_inset listings
+lstparams "basicstyle={\ttfamily},showstringspaces=false,tabsize=4"
+inline false
+status open
+
+\begin_layout Plain Layout
+
+string a = "Lars";
+\end_layout
+
+\begin_layout Plain Layout
+
+string b = "Gullik";
+\end_layout
+
+\end_inset
+
+
+\end_layout
+
+\begin_layout Standard
+Do not use:
+\end_layout
+
+\begin_layout Standard
+\begin_inset listings
+lstparams "basicstyle={\ttfamily},showstringspaces=false,tabsize=4"
+inline false
+status open
+
+\begin_layout Plain Layout
+
+string a = "Lars", b = "Gullik"; // not used in LyX
+\end_layout
+
+\end_inset
+
+
+\end_layout
+
+\begin_layout Standard
+[Note that 
+\begin_inset Flex Code
+status collapsed
+
+\begin_layout Plain Layout
+string a = "Lars"
+\end_layout
+
+\end_inset
+
+ is formally calling a copy constructor on a temporary constructed from
+ a string literal and therefore has the potential of being more expensive
+ then direct construction by 
+\begin_inset Flex Code
+status collapsed
+
+\begin_layout Plain Layout
+string a("Lars")
+\end_layout
+
+\end_inset
+
+.
+ However the compiler is allowed to elide the copy (even if it had side
+ effects), and modern compilers typically do so.
+ Given these equal costs, \SpecialChar LyX
+ code favours the '=' idiom as it is in line with
+ the traditional C-style initialization, 
+\emph on
+and
+\emph default
+ cannot be mistaken as function declaration, 
+\emph on
+and
+\emph default
+ reduces the level of nested parentheses in more initializations.]
+\end_layout
+
+\end_deeper
+\begin_layout Itemize
+Pointers and references:
+\begin_inset Separator latexpar
+\end_inset
+
+
+\end_layout
+
+\begin_deeper
+\begin_layout Standard
+Use:
+\end_layout
+
+\begin_layout Standard
+\begin_inset listings
+lstparams "basicstyle={\ttfamily},showstringspaces=false,tabsize=4"
+inline false
+status open
+
+\begin_layout Plain Layout
+
+char * p = "flop";
+\end_layout
+
+\begin_layout Plain Layout
+
+char & c = *p;
+\end_layout
+
+\end_inset
+
+
+\end_layout
+
+\begin_layout Standard
+Do not use:
+\end_layout
+
+\begin_layout Standard
+\begin_inset listings
+lstparams "basicstyle={\ttfamily},showstringspaces=false,tabsize=4"
+inline false
+status open
+
+\begin_layout Plain Layout
+
+char *p = "flop"; // not used in LyX
+\end_layout
+
+\begin_layout Plain Layout
+
+char &c = *p; // not used in LyX
+\end_layout
+
+\end_inset
+
+
+\end_layout
+
+\begin_layout Standard
+Some time ago we had a huge discussion on this subject and after convincing
+ argumentation from Asger this is what we decided.
+ Also note that we will have:
+\end_layout
+
+\begin_layout Standard
+\begin_inset listings
+lstparams "basicstyle={\ttfamily},showstringspaces=false,tabsize=4"
+inline false
+status open
+
+\begin_layout Plain Layout
+
+char const * p;
+\end_layout
+
+\end_inset
+
+
+\end_layout
+
+\begin_layout Standard
+and not
+\end_layout
+
+\begin_layout Standard
+\begin_inset listings
+lstparams "basicstyle={\ttfamily},showstringspaces=false,tabsize=4"
+inline false
+status open
+
+\begin_layout Plain Layout
+
+const char * p; // not used in LyX
+\end_layout
+
+\end_inset
+
+
+\end_layout
+
+\end_deeper
+\begin_layout Itemize
+Operator names and parentheses
+\begin_inset Separator latexpar
+\end_inset
+
+
+\end_layout
+
+\begin_deeper
+\begin_layout Standard
+\begin_inset listings
+lstparams "basicstyle={\ttfamily},showstringspaces=false,tabsize=4"
+inline false
+status open
+
+\begin_layout Plain Layout
+
+operator==(type)
+\end_layout
+
+\end_inset
+
+
+\end_layout
+
+\begin_layout Standard
+and not
+\end_layout
+
+\begin_layout Standard
+\begin_inset listings
+lstparams "basicstyle={\ttfamily},showstringspaces=false,tabsize=4"
+inline false
+status open
+
+\begin_layout Plain Layout
+
+operator == (type) // not used in LyX
+\end_layout
+
+\end_inset
+
+
+\end_layout
+
+\begin_layout Standard
+The == is part of the function name, separating it makes the declaration
+ look like an expression.
+\end_layout
+
+\end_deeper
+\begin_layout Itemize
+Function names and parentheses
+\begin_inset Separator latexpar
+\end_inset
+
+
+\end_layout
+
+\begin_deeper
+\begin_layout Standard
+\begin_inset listings
+lstparams "basicstyle={\ttfamily},showstringspaces=false,tabsize=4"
+inline false
+status open
+
+\begin_layout Plain Layout
+
+void mangle()
+\end_layout
+
+\end_inset
+
+
+\end_layout
+
+\begin_layout Standard
+and not
+\end_layout
+
+\begin_layout Standard
+\begin_inset listings
+lstparams "basicstyle={\ttfamily},showstringspaces=false,tabsize=4"
+inline false
+status open
+
+\begin_layout Plain Layout
+
+void mangle () // not used in LyX
+\end_layout
+
+\end_inset
+
+
+\end_layout
+
+\end_deeper
+\begin_layout Itemize
+Enumerators
+\begin_inset Separator latexpar
+\end_inset
+
+
+\end_layout
+
+\begin_deeper
+\begin_layout Standard
+\begin_inset listings
+lstparams "basicstyle={\ttfamily},showstringspaces=false,tabsize=4"
+inline false
+status open
+
+\begin_layout Plain Layout
+
+enum Foo {
+\end_layout
+
+\begin_layout Plain Layout
+
+       FOO_ONE = 1,
+\end_layout
+
+\begin_layout Plain Layout
+
+       FOO_TWO = 2,
+\end_layout
+
+\begin_layout Plain Layout
+
+       FOO_THREE = 3
+\end_layout
+
+\begin_layout Plain Layout
+
+};
+\end_layout
+
+\end_inset
+
+
+\end_layout
+
+\begin_layout Standard
+and not
+\end_layout
+
+\begin_layout Standard
+\begin_inset listings
+lstparams "basicstyle={\ttfamily},showstringspaces=false,tabsize=4"
+inline false
+status open
+
+\begin_layout Plain Layout
+
+enum { one = 1, two = 2, three 3 }; // not used in LyX
+\end_layout
+
+\end_inset
+
+
+\end_layout
+
+\begin_layout Standard
+and not
+\end_layout
+
+\begin_layout Standard
+\begin_inset listings
+lstparams "basicstyle={\ttfamily},showstringspaces=false,tabsize=4"
+inline false
+status open
+
+\begin_layout Plain Layout
+
+enum {
+\end_layout
+
+\begin_layout Plain Layout
+
+One = 1,
+\end_layout
+
+\begin_layout Plain Layout
+
+Two = 2,
+\end_layout
+
+\begin_layout Plain Layout
+
+Three = 3
+\end_layout
+
+\begin_layout Plain Layout
+
+};
+\end_layout
+
+\end_inset
+
+
+\end_layout
+
+\end_deeper
+\begin_layout Itemize
+Null pointers
+\begin_inset Separator latexpar
+\end_inset
+
+
+\end_layout
+
+\begin_deeper
+\begin_layout Standard
+Use nullptr (C++11):
+\end_layout
+
+\begin_layout Standard
+\begin_inset listings
+lstparams "basicstyle={\ttfamily},showstringspaces=false,tabsize=4"
+inline false
+status open
+
+\begin_layout Plain Layout
+
+void * p = nullptr;
+\end_layout
+
+\end_inset
+
+
+\end_layout
+
+\begin_layout Standard
+and not
+\end_layout
+
+\begin_layout Standard
+\begin_inset listings
+lstparams "basicstyle={\ttfamily},showstringspaces=false,tabsize=4"
+inline false
+status open
+
+\begin_layout Plain Layout
+
+void * p = NULL; // not used in LyX
+\end_layout
+
+\end_inset
+
+
+\end_layout
+
+\begin_layout Standard
+and not
+\end_layout
+
+\begin_layout Standard
+\begin_inset listings
+lstparams "basicstyle={\ttfamily},showstringspaces=false,tabsize=4"
+inline false
+status open
+
+\begin_layout Plain Layout
+
+void * p = '
+\backslash
+0'; // not used in LyX
+\end_layout
+
+\end_inset
+
+
+\end_layout
+
+\begin_layout Standard
+and not
+\end_layout
+
+\begin_layout Standard
+\begin_inset listings
+lstparams "basicstyle={\ttfamily},showstringspaces=false,tabsize=4"
+inline false
+status open
+
+\begin_layout Plain Layout
+
+void * p = 42 - 7 * 6; // not used in LyX
+\end_layout
+
+\end_inset
+
+
+\end_layout
+
+\begin_layout Standard
+Note: As an exception, imported third party code as well as code interfacing
+ the 
+\begin_inset Quotes eld
+\end_inset
+
+native
+\begin_inset Quotes erd
+\end_inset
+
+ APIs (
+\begin_inset Flex Code
+status collapsed
+
+\begin_layout Plain Layout
+src/support/os_*
+\end_layout
+
+\end_inset
+
+) can use NULL.
+\end_layout
+
+\end_deeper
+\begin_layout Itemize
+Naming rules for classes
+\begin_inset Separator latexpar
+\end_inset
+
+
+\end_layout
+
+\begin_deeper
+\begin_layout Itemize
+Use descriptive but simple and short names.
+ Do not abbreviate.
+\end_layout
+
+\begin_layout Itemize
+Class names are usually capitalized, and function names lowercased.
+\end_layout
+
+\begin_layout Itemize
+Enums are named like Classes, values are usually in lower-case.
+\end_layout
+
+\begin_layout Itemize
+Public API functions are camel-case (
+\begin_inset Flex Code
+status collapsed
+
+\begin_layout Plain Layout
+void setAFlagToAValue(bool)
+\end_layout
+
+\end_inset
+
+).
+\end_layout
+
+\begin_layout Itemize
+Member variables are underscored (
+\begin_inset Flex Code
+status collapsed
+
+\begin_layout Plain Layout
+enable_this_feature_flag_
+\end_layout
+
+\end_inset
+
+) with a final 
+\begin_inset Quotes eld
+\end_inset
+
+_
+\begin_inset Quotes erd
+\end_inset
+
+.
+\end_layout
+
+\begin_layout Itemize
+Private/protected functions are also camel-case.
+\end_layout
+
+\begin_layout Itemize
+New types are capitalized, so this goes for typedefs, classes, structs and
+ enums.
+\end_layout
+
+\end_deeper
+\begin_layout Itemize
+Formatting
+\begin_inset Separator latexpar
+\end_inset
+
+
+\end_layout
+
+\begin_deeper
+\begin_layout Itemize
+Adapt the formatting of your code to the one used in the other parts of
+ \SpecialChar LyX
+.
+ In case there is different formatting for the same construct, use the one
+ used more often.
+\end_layout
+
+\end_deeper
+\begin_layout Itemize
+Use existing structures
+\begin_inset Separator latexpar
+\end_inset
+
+
+\end_layout
+
+\begin_deeper
+\begin_layout Itemize
+\begin_inset CommandInset label
+LatexCommand label
+name "Use-string-wherever"
+
+\end_inset
+
+Use 
+\begin_inset Flex Code
+status collapsed
+
+\begin_layout Plain Layout
+string
+\end_layout
+
+\end_inset
+
+ wherever possible.
+ Unicode strings should prefer using 
+\begin_inset Flex Code
+status collapsed
+
+\begin_layout Plain Layout
+docstring
+\end_layout
+
+\end_inset
+
+ instead of UTF-8 encoded 
+\begin_inset Flex Code
+status collapsed
+
+\begin_layout Plain Layout
+std::string
+\end_layout
+
+\end_inset
+
+.
+\end_layout
+
+\begin_layout Itemize
+Check out the filename and path tools in 
+\begin_inset Flex Code
+status collapsed
+
+\begin_layout Plain Layout
+filetools.h
+\end_layout
+
+\end_inset
+
+
+\end_layout
+
+\begin_layout Itemize
+Check out the string tools in 
+\begin_inset Flex Code
+status collapsed
+
+\begin_layout Plain Layout
+lstring.h
+\end_layout
+
+\end_inset
+
+.
+\end_layout
+
+\begin_layout Itemize
+Use the \SpecialChar LyX
+Err class to report errors and messages using the lyxerr instantiation.
+ [add description of other existing structures]
+\end_layout
+
+\end_deeper
+\begin_layout Itemize
+Declarations
+\begin_inset Separator latexpar
+\end_inset
+
+
+\end_layout
+
+\begin_deeper
+\begin_layout Itemize
+Use this order for the access sections of your class: public, protected,
+ private.
+ The public section is interesting for every user of the class.
+ The private section is only of interest for the implementors of the class
+ (you).
+ [Obviously not true since this is for developers, and we do not want one
+ developer only to be able to read and understand the implementation of
+ class internals.
+ Lgb]
+\end_layout
+
+\begin_layout Itemize
+Avoid declaring global objects in the declaration file of the class.
+ If the same variable is used for all objects, use a static member.
+\end_layout
+
+\begin_layout Itemize
+Avoid global or static variables.
+\end_layout
+
+\end_deeper
+\begin_layout Itemize
+File headers
+\begin_inset Separator latexpar
+\end_inset
+
+
+\end_layout
+
+\begin_deeper
+\begin_layout Standard
+If you create a new file, the top of the file should look something like
+ this :
+\end_layout
+
+\begin_layout Standard
+\begin_inset listings
+lstparams "basicstyle={\ttfamily},showstringspaces=false,tabsize=4"
+inline false
+status open
+
+\begin_layout Plain Layout
+
+/**
+\end_layout
+
+\begin_layout Plain Layout
+
+* 
+\backslash
+file NewFile.cpp
+\end_layout
+
+\begin_layout Plain Layout
+
+* This file is part of LyX, the document processor.
+\end_layout
+
+\begin_layout Plain Layout
+
+* Licence details can be found in the file COPYING.
+\end_layout
+
+\begin_layout Plain Layout
+
+*
+\end_layout
+
+\begin_layout Plain Layout
+
+* 
+\backslash
+author Kaiser Sose
+\end_layout
+
+\begin_layout Plain Layout
+
+*
+\end_layout
+
+\begin_layout Plain Layout
+
+* Full author contact details are available
+\end_layout
+
+\begin_layout Plain Layout
+
+* in file CREDITS.
+\end_layout
+
+\begin_layout Plain Layout
+
+*/
+\end_layout
+
+\end_inset
+
+
+\end_layout
+
+\end_deeper
+\begin_layout Itemize
+Documentation
+\begin_inset Separator latexpar
+\end_inset
+
+
+\end_layout
+
+\begin_deeper
+\begin_layout Itemize
+The documentation is generated from the header files.
+\end_layout
+
+\begin_layout Itemize
+You document for the other developers, not for yourself.
+\end_layout
+
+\begin_layout Itemize
+You should document what the function does, not the implementation.
+\begin_inset Separator latexpar
+\end_inset
+
+
+\end_layout
+
+\begin_deeper
+\begin_layout Itemize
+in the .cpp files you document the implementation.
+\end_layout
+
+\end_deeper
+\begin_layout Itemize
+Single line description (
+\begin_inset Flex Code
+status collapsed
+
+\begin_layout Plain Layout
+///
+\end_layout
+
+\end_inset
+
+), multiple lines description (
+\begin_inset Flex Code
+status collapsed
+
+\begin_layout Plain Layout
+/** ...
+ */
+\end_layout
+
+\end_inset
+
+), see the doxygen webpage referenced above.
+\end_layout
+
+\end_deeper
+\begin_layout Section
+Naming rules for \SpecialChar LyX
+ User Functions (LFUNs)
+\end_layout
+
+\begin_layout Standard
+Here is the set of rules to apply when a new command name is introduced:
+\end_layout
+
+\begin_layout Enumerate
+Use the object.event order.
+ That is, use `word-forward' instead of `forward-word'.
+\end_layout
+
+\begin_layout Enumerate
+Don't introduce an alias for an already named object.
+ Same for events.
+\end_layout
+
+\begin_layout Enumerate
+Forward movement or focus is called `forward' (not `right').
+\end_layout
+
+\begin_layout Enumerate
+Backward movement or focus is called `backward' (not `left').
+\end_layout
+
+\begin_layout Enumerate
+Upward movement of focus is called `up'.
+\end_layout
+
+\begin_layout Enumerate
+Downward movement is called `down'.
+\end_layout
+
+\begin_layout Enumerate
+The begin of an object is called `begin' (not `start').
+\end_layout
+
+\begin_layout Enumerate
+The end of an object is called `end'.
+\end_layout
+
+\begin_layout Section
+How to create class interfaces
+\end_layout
+
+\begin_layout Standard
+(a.k.a How Non-Member Functions Improve Encapsulation)
+\end_layout
+
+\begin_layout Standard
+I recently read an article by Scott Meyers, where he makes a strong case
+ on how non-member functions makes classes more encapsulated, not less.
+ Just skipping to the core of this provides us with the following algorithm
+ for deciding what kind of function to add to a class interface:
+\end_layout
+
+\begin_layout Itemize
+We need to add a function f to the class C's API.
+\begin_inset Separator latexpar
+\end_inset
+
+
+\end_layout
+
+\begin_deeper
+\begin_layout Standard
+\begin_inset listings
+lstparams "basicstyle={\ttfamily},showstringspaces=false,tabsize=4"
+inline false
+status open
+
+\begin_layout Plain Layout
+
+if (f needs to be virtual)
+\end_layout
+
+\begin_layout Plain Layout
+
+       make f a member function of C;
+\end_layout
+
+\begin_layout Plain Layout
+
+else if (f is operator>> or operator<<) {
+\end_layout
+
+\begin_layout Plain Layout
+
+       make f a non-member function;
+\end_layout
+
+\begin_layout Plain Layout
+
+       if (f needs access to non-public members of C)
+\end_layout
+
+\begin_layout Plain Layout
+
+               make f a friend of C;
+\end_layout
+
+\begin_layout Plain Layout
+
+} else if (f needs type conversions on its left-most argument) {
+\end_layout
+
+\begin_layout Plain Layout
+
+       make f a non-member function;
+\end_layout
+
+\begin_layout Plain Layout
+
+       if (f needs access to non-public members of C)
+\end_layout
+
+\begin_layout Plain Layout
+
+               make f a friend of C;
+\end_layout
+
+\begin_layout Plain Layout
+
+} else if (f can be implemented via C's public interface)
+\end_layout
+
+\begin_layout Plain Layout
+
+       make f a non-member function;
+\end_layout
+
+\begin_layout Plain Layout
+
+else
+\end_layout
+
+\begin_layout Plain Layout
+
+       make f a member function of C;
+\end_layout
+
+\end_inset
+
+
+\end_layout
+
+\end_deeper
+\begin_layout Chapter
+Coding recommendations
+\end_layout
+
+\begin_layout Standard
+These are some rules for effective C++ programming.
+ These are taken from Scott Meyers 
+\begin_inset CommandInset citation
+LatexCommand cite
+key "journal"
+literal "true"
+
+\end_inset
+
+, and are presented in their short form.
+ These are not all the rules Meyers presents, only the most important of
+ them.
+ \SpecialChar LyX
+ does not yet follow these rules, but they should be the goal.
+\end_layout
+
+\begin_layout Itemize
+use 
+\family typewriter
+const
+\family default
+ and 
+\family typewriter
+inline
+\family default
+ instead of 
+\family typewriter
+#define
+\end_layout
+
+\begin_layout Itemize
+use the same form in corresponding calls to new and delete, i.e.
+ write 
+\begin_inset Flex Code
+status collapsed
+
+\begin_layout Plain Layout
+delete[] obj;
+\end_layout
+
+\end_inset
+
+ if 
+\begin_inset Flex Code
+status collapsed
+
+\begin_layout Plain Layout
+new obj[n];
+\end_layout
+
+\end_inset
+
+ was used to create the object and write 
+\begin_inset Flex Code
+status collapsed
+
+\begin_layout Plain Layout
+delete obj;
+\end_layout
+
+\end_inset
+
+ if you wrote 
+\begin_inset Flex Code
+status collapsed
+
+\begin_layout Plain Layout
+new obj;
+\end_layout
+
+\end_inset
+
+ Notice strings should be 
+\begin_inset Flex Code
+status collapsed
+
+\begin_layout Plain Layout
+std::string
+\end_layout
+
+\end_inset
+
+'s instead of 
+\begin_inset Flex Code
+status collapsed
+
+\begin_layout Plain Layout
+char *
+\end_layout
+
+\end_inset
+
+'s.
+ (this contradicts to 
+\begin_inset CommandInset ref
+LatexCommand ref
+reference "Use-string-wherever"
+
+\end_inset
+
+ )
+\end_layout
+
+\begin_layout Itemize
+define a default constructor, copy constructor and an assignment operator
+ for all classes with dynamically allocated memory that are not made noncopyable
+\end_layout
+
+\begin_layout Itemize
+do not define default constructor, copy constructor and an assignment operator
+ if the compiler generated one would do the same
+\end_layout
+
+\begin_layout Itemize
+make destructors virtual in base classes and only there 
+\end_layout
+
+\begin_layout Itemize
+assign to all data members in operator=()
+\end_layout
+
+\begin_layout Itemize
+strive for class interfaces that are complete and minimal
+\end_layout
+
+\begin_layout Itemize
+differentiate among member functions, global functions and friend functions
+\end_layout
+
+\begin_layout Itemize
+avoid data members in the public interface
+\end_layout
+
+\begin_layout Itemize
+use const whenever possible
+\end_layout
+
+\begin_layout Itemize
+pass and return objects by reference instead of by value
+\end_layout
+
+\begin_layout Itemize
+choose carefully between function overloading and parameter defaulting
+\end_layout
+
+\begin_layout Itemize
+never return a reference to a local object or a dereferenced pointer initialized
+ by new within the function
+\end_layout
+
+\begin_layout Itemize
+use enums for integral constants
+\end_layout
+
+\begin_layout Itemize
+minimize compilation dependencies between files
+\end_layout
+
+\begin_layout Itemize
+pay attention to compiler warnings
+\end_layout
+
+\begin_layout Itemize
+differentiate between inheritance of interface and inheritance of implementation
+\end_layout
+
+\begin_layout Itemize
+differentiate between inheritance and templates
+\end_layout
+
+\begin_layout Itemize
+ensure that global objects are initialized before they are used
+\end_layout
+
+\begin_layout Itemize
+avoid conditions to 
+\begin_inset Flex Code
+status collapsed
+
+\begin_layout Plain Layout
+if
+\end_layout
+
+\end_inset
+
+ and 
+\begin_inset Flex Code
+status collapsed
+
+\begin_layout Plain Layout
+while
+\end_layout
+
+\end_inset
+
+ that span more than a line
+\end_layout
+
+\begin_layout Chapter
+\start_of_appendix
+Notes
+\end_layout
+
+\begin_layout Itemize
+And one of mine: (Lgb)
+\begin_inset Separator latexpar
+\end_inset
+
+
+\end_layout
+
+\begin_deeper
+\begin_layout Itemize
+when switching on enums, refrain from using "default:" if possible
+\end_layout
+
+\end_deeper
+\begin_layout Itemize
+And one of mine: (Andre')
+\begin_inset Separator latexpar
+\end_inset
+
+
+\end_layout
+
+\begin_deeper
+\begin_layout Itemize
+try to implement your class in a way that the automatically generated copy
+ constructor and copy assignment work out-of-the box
+\end_layout
+
+\begin_layout Itemize
+I don't have problems with using boost in the implementation _if and only
+ if_ it provides actual benefits over less intrusive alternatives.
+ I do have a problem with needlessly sprinkling 'boost::' over interfaces,
+ especially if it does not add any value.
+\begin_inset Separator latexpar
+\end_inset
+
+
+\end_layout
+
+\begin_deeper
+\begin_layout Standard
+Given that there seems to be an unconditional "typedef unsigned int quint32;"
+ in qglobal.h I don't think there's any platform supported by current \SpecialChar LyX
+ that
+ could not use 'unsigned int' (and an static assert in some implementation
+ file for the unlikely case some ILP64 zombie raises its ugly head again.
+ And if that happens, using <cstdint> would still be a better choice...)
+\end_layout
+
+\begin_layout Standard
+The idea is to create something that's not compilable as soon as the condition
+ is violated.
+ There are lots of possibilities to achieve this, some examples follow:
+\end_layout
+
+\begin_layout Standard
+In C++11 there's a "built-in":
+\end_layout
+
+\begin_layout Standard
+\begin_inset listings
+lstparams "basicstyle={\ttfamily},showstringspaces=false,tabsize=4"
+inline false
+status open
+
+\begin_layout Plain Layout
+
+static_assert(sizeof(int) == 4, "Funny platform")
+\end_layout
+
+\end_inset
+
+
+\end_layout
+
+\begin_layout Standard
+until then on namespace scope: 
+\end_layout
+
+\begin_layout Standard
+\begin_inset listings
+lstparams "basicstyle={\ttfamily},showstringspaces=false,tabsize=4"
+inline false
+status open
+
+\begin_layout Plain Layout
+
+#include <boost/static_assert.hpp>
+\end_layout
+
+\begin_layout Plain Layout
+
+BOOST_STATIC_ASSERT(sizeof(int) == 4)
+\end_layout
+
+\end_inset
+
+
+\end_layout
+
+\begin_layout Standard
+or without boost:
+\end_layout
+
+\begin_layout Standard
+\begin_inset listings
+lstparams "basicstyle={\ttfamily},showstringspaces=false,tabsize=4"
+inline false
+status open
+
+\begin_layout Plain Layout
+
+template<bool Condition>
+\end_layout
+
+\begin_layout Plain Layout
+
+struct static_assert_helper;
+\end_layout
+
+\begin_layout Plain Layout
+
+template <>
+\end_layout
+
+\begin_layout Plain Layout
+
+struct static_assert_helper<true> {}; 
+\end_layout
+
+\begin_layout Plain Layout
+
+enum {
+\end_layout
+
+\begin_layout Plain Layout
+
+       dummy = sizeof(static_assert_helper<sizeof(int) == 4>)
+\end_layout
+
+\begin_layout Plain Layout
+
+};
+\end_layout
+
+\end_inset
+
+
+\end_layout
+
+\begin_layout Standard
+or somewhat brutish without templates, in any function:
+\end_layout
+
+\begin_layout Standard
+\begin_inset listings
+lstparams "basicstyle={\ttfamily},showstringspaces=false,tabsize=4"
+inline false
+status open
+
+\begin_layout Plain Layout
+
+const int d = sizeof(int) - 4;
+\end_layout
+
+\begin_layout Plain Layout
+
+switch (0) { 
+\end_layout
+
+\begin_layout Plain Layout
+
+case 0: 
+\end_layout
+
+\begin_layout Plain Layout
+
+case !(d*d): 
+\end_layout
+
+\begin_layout Plain Layout
+
+       break; 
+\end_layout
+
+\begin_layout Plain Layout
+
+}
+\end_layout
+
+\end_inset
+
+
+\end_layout
+
+\begin_layout Standard
+Any of them in a .cpp file will break compilation as soon as 
+\begin_inset Flex Code
+status collapsed
+
+\begin_layout Plain Layout
+sizeof(int)
+\end_layout
+
+\end_inset
+
+ is not equal 4.
+ Personally I prefer something like the third version (or the first, if
+ using C++11 is allowed).
+\end_layout
+
+\end_deeper
+\end_deeper
+\begin_layout Itemize
+And one of mine: (vfr)
+\begin_inset Separator latexpar
+\end_inset
+
+
+\end_layout
+
+\begin_deeper
+\begin_layout Itemize
+On dynamics_casts 
+\begin_inset Flex URL
+status open
+
+\begin_layout Plain Layout
+
+http://www.lyx.org/trac/changeset/35855
+\end_layout
+
+\end_inset
+
+:
+\begin_inset Separator latexpar
+\end_inset
+
+
+\end_layout
+
+\begin_deeper
+\begin_layout Standard
+A dynamic_cast is necessary when:
+\end_layout
+
+\begin_layout Itemize
+the object to be casted is from an external library because we can't add
+ Qxxx::asXxxx() to Qt e.g.:
+\begin_inset Separator latexpar
+\end_inset
+
+
+\end_layout
+
+\begin_deeper
+\begin_layout Itemize
+QAbstractListModel to GuiIdListModel,
+\end_layout
+
+\begin_layout Itemize
+QValidator to PathValidator,
+\end_layout
+
+\begin_layout Itemize
+QWidget to TabWorkArea,
+\end_layout
+
+\begin_layout Itemize
+QWidget to GuiWorkArea;
+\end_layout
+
+\end_deeper
+\begin_layout Itemize
+the object is to be casted from an interface to the implementing class,
+ because the Interface does not know by whom it is implemented:
+\begin_inset Separator latexpar
+\end_inset
+
+
+\end_layout
+
+\begin_deeper
+\begin_layout Itemize
+ProgressInterface to GuiProgress,
+\end_layout
+
+\begin_layout Itemize
+Application to GuiApplication.
+\end_layout
+
+\end_deeper
+\begin_layout Standard
+A dynamic_cast can be replaced by:
+\end_layout
+
+\begin_layout Itemize
+already existing as***Inset() functions, e.g.:
+\begin_inset Separator latexpar
+\end_inset
+
+
+\end_layout
+
+\begin_deeper
+\begin_layout Itemize
+asHullInset(),
+\end_layout
+
+\begin_layout Itemize
+asInsetMath()->asMacro(),
+\end_layout
+
+\begin_layout Itemize
+asInsetText();
+\end_layout
+
+\end_deeper
+\begin_layout Itemize
+A static_cast when we are sure this can't go wrong, e.g.:
+\begin_inset Separator latexpar
+\end_inset
+
+
+\end_layout
+
+\begin_deeper
+\begin_layout Itemize
+we are sure that CellData::inset->clone() is an InsetTableCell,
+\end_layout
+
+\begin_layout Itemize
+in cases where we explicitly check it->lyxCode().
+\end_layout
+
+\end_deeper
+\end_deeper
+\end_deeper
+\begin_layout Bibliography
+\begin_inset CommandInset bibitem
+LatexCommand bibitem
+key "meyers"
+literal "true"
+
+\end_inset
+
+Meyers, Scott.
+ Effective C++: 50 Specific Ways to Improve Your Programs and Design.
+ Addison-Wesley, 1992.
+\end_layout
+
+\begin_layout Bibliography
+\begin_inset CommandInset bibitem
+LatexCommand bibitem
+key "sutter"
+literal "true"
+
+\end_inset
+
+Sutter, Herb.
+ Exceptional C++: 47 engineering puzzles, programming problems, and solutions.
+ ISBN 0-201-61562-2.
+\end_layout
+
+\begin_layout Bibliography
+\begin_inset CommandInset bibitem
+LatexCommand bibitem
+key "journal"
+literal "true"
+
+\end_inset
+
+Meyers, Scott.
+ C/C++ User's Journal (Vol.18, No.2).
 \end_layout
 
 \end_body