Squashed 'third_party/ct/' content from commit 0048d02
Change-Id: Ia7e5360cbb414f92ce4f118bd9613ea23597db52
git-subtree-dir: third_party/ct
git-subtree-split: 0048d027531b6cf1ea730da17b68a0b7ef9070b1
diff --git a/ct_doc/doc/developer_info.dox b/ct_doc/doc/developer_info.dox
new file mode 100644
index 0000000..d5a4e63
--- /dev/null
+++ b/ct_doc/doc/developer_info.dox
@@ -0,0 +1,95 @@
+/*!
+
+\page developer Developer Guidelines
+@tableofcontents
+
+We very much welcome external developers. Small changes and contributions can be made via pull requests.
+If you have a larger enhancement, bug fix or other contribution in mind, feel free to first create an issue
+to align the development with ongoing activities.
+
+\section Code Formatting
+We support clang-format and provide a style template to automatically format the source code.
+Please refer to the clang-format style sheet in the package root directory for our conventions.
+Or simply rely on clang-format to do the formatting for you.
+
+Note for developers using the *Eclipse IDE*: you can conveniently integrate clang-format (and our .clang-format
+configuration file) in your project using the "CppStyle" plugin (see http://www.cppstyle.com/ for
+detailed information). To automatically format the code according to ct-style, just mark the source-code
+and press *Ctrl+Shift+f*.
+
+
+Example command for running clang-tidy:
+\code
+$ catkin build --no-deps <package_name> -v --make-args clang-tidy
+\endcode
+
+For clang-format it's just the same:
+\code
+$ catkin build --no-deps <package_name> -v --make-args clang-format
+\endcode
+
+\section Explicit Template Instantiation
+
+CT relies on explicit template instantiation, that means precompilation of the library for
+user-specified state and control dimensions.
+While CT handles things slightly different, please see [this post](https://anteru.net/blog/2008/11/19/318/index.html)
+to learn more about the subject.
+The basic idea is that for all templated class there is
+- a header (.h) that defines the class and its methods
+- an (header) implementation (-impl.h) that implements all methods
+- a cpp template file (.cpp.in) that instantiates the template
+
+The template file has the following placeholders
+
+Placeholder | Description
+-------------- | -------------
+STATE_DIM_PRESPEC | The state dimension
+CONTROL_DIM_PRESPEC | The control dimension
+SCALAR_PRESPEC | The scalar type
+DOUBLE_OR_FLOAT | "true" if the scalar type is double or float
+POS_DIM_PRESPEC | Position dimension for symplectic integrator (default: 0)
+VEL_DIM_PRESPEC | Velocity dimension for symplectic integrator (default: 0)
+
+You can use these placeholders in the code
+\code{.cpp}
+ #if \@DOUBLE_OR_FLOAT\@
+ template class ct::coreMyClass<\@STATE_DIM_PRESPEC\@, \@CONTROL_DIM_PRESPEC\@>;
+ #endif
+\endcode
+
+The parser in the CMakeLists.txt would then create the following code out of this
+(for STATE_DIM=3, CONTROL_DIM=2, SCALAR=double)
+
+\code{.cpp}
+ #if 1
+ template class ct::coreMyClass<3, 2>;
+ #endif
+\endcode
+
+\note The parameter DOUBLE_OR_FLOAT is optional but can be used if your class does not compile for Auto-Diff types
+which is often the case if no special care is taken.
+
+
+\section other_guidelines Other guidelines
+
+ - Headerguards:
+please use
+\code
+#pragma once
+\endcode
+as header guards, rather than
+\code
+#ifndef
+#define
+/*...*/
+#endif
+\endcode
+
+ - never use **std::make_shared** and **std::allocate_shared** within the CT. They cause aligment issues,
+compare the following bugreport: http://eigen.tuxfamily.org/bz/show_bug.cgi?id=1049
+Currently, the best option is to declare and define shared pointers using CT types as in the following example
+\code{.cpp}
+std::shared_ptr<ct::core::ControlledSystem<state_dim, control_dim>> nonlinearSystem( new SomeClass(...));
+\endcode
+
+*/