Commit 067f32f5 authored by Jordan Lack's avatar Jordan Lack

Merge branch 'release/3.2.0'

parents 16324e03 c24f1115
Pipeline #60902284 passed with stages
in 47 minutes and 56 seconds
image: registry.gitlab.com/jlack/rdl
image: registry.gitlab.com/jlack/rdl:ci-docker-melodic
variables:
WS_NAME: "rdl_ws"
......@@ -15,6 +15,7 @@ stages:
build_and_test:
stage: test
retry: 1
script:
- echo $CI_PROJECT_NAME
- mkdir -p $WS_NAME/src && cd $WS_NAME/src
......@@ -35,21 +36,6 @@ build_and_test:
- $WS_NAME/
expire_in: 1 day
coverage_rdl_dynamics:
stage: analyze
dependencies:
- build_and_test
script:
- cd $WS_NAME && rosdep install --from-paths src -i -y --as-root apt:false
- catkin build
- catkin run_tests --no-deps rdl_dynamics -DCMAKE_BUILD_TYPE=Coverage --make-args run_coverage_rdl_dynamics
- gcovr -r .
- mv build/rdl_dynamics/coverage $CI_PROJECT_DIR/rdl_dynamics_coverage
artifacts:
name: rdl_dynamics_coverage
paths:
- $CI_PROJECT_DIR/rdl_dynamics_coverage/
coverage_rdl_urdfreader:
stage: analyze
dependencies:
......@@ -80,6 +66,21 @@ coverage_rdl_ros_tools:
paths:
- $CI_PROJECT_DIR/rdl_ros_tools_coverage/
coverage_rdl_dynamics:
stage: analyze
dependencies:
- build_and_test
script:
- cd $WS_NAME && rosdep install --from-paths src -i -y --as-root apt:false
- catkin build
- catkin run_tests --no-deps rdl_dynamics -DCMAKE_BUILD_TYPE=Coverage --make-args run_coverage_rdl_dynamics
- gcovr -r .
- mv build/rdl_dynamics/coverage $CI_PROJECT_DIR/rdl_dynamics_coverage
artifacts:
name: rdl_dynamics_coverage
paths:
- $CI_PROJECT_DIR/rdl_dynamics_coverage/
pages:
stage: pages
dependencies:
......
......@@ -29,5 +29,25 @@ fixed frame. Added bugfix here to account for that
--- 01-17-2019 ---
Fix bug with FrameOriention where operation was incorrect when calling changeFrame
--- 03-07/2019 ---
--- 03-07-2019 ---
Add rdl_ros_tools package and rdl_msgs for the beginning of a set of ROS tools
--- 03-17-2019 ---
Fix issues making rdl incompatible with melodic
--- 04-05-2019 ---
Removed a bunch of deprecated functions
--- 04-06-2019 ---
Reworked FrameOrientation inheritance so it inherits from Quaternion instead of having a Quaternion
--- 04-07-2019 ---
Added Model::mass variable where you can get the mass of the model
--- 05-11-2019 ---
Remove the use of raw pointers and replace them with typedef'd std::shared_ptr's
Remove ReferenceFrameHolder
Minor rework to ReferenceFrame internal functionality to improve efficiency
--- 05-11-2019 ---
Create types.hpp file that auto generates shared_ptr typedef's
\ No newline at end of file
......@@ -38,7 +38,7 @@ namespace RobotDynamics
* // only motivation for using a pointer instead of an instance directly.
*
* // Upon construction, a body for world and a world frame are created, but no more bodies/frames exist until we add them.
* std::shared_ptr<RobotDynamics::Model> model(new RobotDynamics::Model());
* RobotDynamics::ModelPtr model(new RobotDynamics::Model());
*
* // Create body 1
* RobotDynamics::Body body1(1.0, Math::Vector3d(0.,0.,-0.1), Math::Vector3d(0.1,0.1,0.1);
......@@ -53,25 +53,25 @@ namespace RobotDynamics
* unsigned int body2_id = model->appendBody(Math::SpatialTransform(RobotDynamics::Math::Xtrans(RobotDynamics::Math::Vector3d(0.,0.,-1.0))), JointTypeRevoluteX,body2,"body2");
*
* // Each time a body is added, a reference frame is created for the body. These frames can be accessed by,
* std::shared_ptr<RobotDynamics::ReferenceFrame> body1_frame = model->bodyFrames[body1_id];
* std::shared_ptr<RobotDynamics::ReferenceFrame> body2_frame = model->bodyFrames[body2_id];
* RobotDynamics::ReferenceFramePtr body1_frame = model->bodyFrames[body1_id];
* RobotDynamics::ReferenceFramePtr body2_frame = model->bodyFrames[body2_id];
*
* // Frames are alse created at the body's center of mass. These frames can be accessed by,
* std::shared_ptr<RobotDynamics::ReferenceFrame> body1_com_frame = model->bodyCenteredFrames[body1_id];
* std::shared_ptr<RobotDynamics::ReferenceFrame> body2_com_frame = model->bodyCenteredFrames[body2_id];
* RobotDynamics::ReferenceFramePtr body1_com_frame = model->bodyCenteredFrames[body1_id];
* RobotDynamics::ReferenceFramePtr body2_com_frame = model->bodyCenteredFrames[body2_id];
*
* // Now update kinematics(see the available functions from the kinematics module or look in Kinematics.h)
* void updateKinematics(model, Q, QDot, QDDot) // Q,QDot, and QDDot here are vectors of joint positions, velocities, and accelerations
* void updateKinematics(*model, Q, QDot, QDDot) // Q,QDot, and QDDot here are vectors of joint positions, velocities, and accelerations
* // Until kinematics have been updated, the transforms stored in each reference frame will not necessarily be correct.
* // Also, you should be sure to update the kinematics each control tick.
*
* // Now some examples of some simple things you can do utilizing the reference frames
* // Create a point at the origin of body2_frame
* FramePoint body2_origin(body2_frame.get(), 0.,0.,0.);
* FramePoint body2_origin(body2_frame, 0.,0.,0.);
*
* // Now lets express that point in body1_frame
* body2_origin.changeFrame(body1_frame.get()) // body2_origin will now be expressed in the reference frame attached to body1
* body2_origin.changeFrame(body1_frame) // body2_origin will now be expressed in the reference frame attached to body1
*
* // To express the frame point(or any geometric quantity that has a frame) in world frame, this con be done by,
* body2_origin.changeFrame(model->worldFrame); // Now it's in world frame
......
<?xml version="1.0"?>
<package format="2">
<name>rdl</name>
<version>1.1.0</version>
<version>3.2.0</version>
<description>The rdl meta-package</description>
<maintainer email="jlack1987@gmail.com">jordan</maintainer>
......
CMAKE_MINIMUM_REQUIRED(VERSION 3.4)
PROJECT (rdl_benchmark)
find_package(catkin REQUIRED COMPONENTS rdl_cmake rdl_dynamics rdl_urdfreader)
set(CMAKE_CXX_STANDARD 14)
set(CMAKE_CXX_STANDARD_REQUIRED ON)
set(CMAKE_CXX_EXTENSIONS OFF)
# check c++11 / c++0x
include(CheckCXXCompilerFlag)
CHECK_CXX_COMPILER_FLAG("-std=c++0x" COMPILER_SUPPORTS_CXX0X)
if(COMPILER_SUPPORTS_CXX0X)
set(CMAKE_CXX_FLAGS "-std=c++0x")
else()
message(FATAL_ERROR "The compiler ${CMAKE_CXX_COMPILER} has no C++11 support. Please use a different C++ compiler.")
endif()
find_package(catkin REQUIRED COMPONENTS rdl_cmake rdl_dynamics rdl_urdfreader)
set(INCLUDES_DIR include)
......
#ifndef _HUMAN36MODEL_H
#define _HUMAN36MODEL_H
#include "rdl_dynamics/types.hpp"
namespace RobotDynamics
{
class Model;
}
void generate_human36model(RobotDynamics::Model *model);
void generate_human36model(RobotDynamics::ModelPtr model);
/* _HUMAN36MODEL_H */
#endif
#ifndef _SAMPLE_DATA_H
#define _SAMPLE_DATA_H
#ifndef _RDL_BENCHMARK_SAMPLE_DATA_H__
#define _RDL_BENCHMARK_SAMPLE_DATA_H__
#include "rdl_dynamics/rdl_eigenmath.h"
struct SampleData
{
......
#ifndef _MODEL_GENERATOR_H
#define _MODEL_GENERATOR_H
#include "rdl_dynamics/types.hpp"
namespace RobotDynamics
{
class Model;
}
void generate_planar_tree(RobotDynamics::Model *model, int depth);
void generate_planar_tree(RobotDynamics::ModelPtr model, int depth);
/* _MODEL_GENERATOR_H */
#endif
<?xml version="1.0"?>
<package format="2">
<name>rdl_benchmark</name>
<version>1.1.0</version>
<version>3.2.0</version>
<description>The rdl_benchmark package</description>
<maintainer email="jlack1987@gmail.com">jordan</maintainer>
......
......@@ -27,7 +27,7 @@ Body create_body(SegmentName segment)
return RobotDynamics::Body(SegmentMass[segment], RobotDynamics::Math::Vector3d(SegmentCOM[segment][0], SegmentCOM[segment][1], SegmentCOM[segment][2]), inertia_C);
}
void generate_human36model(RobotDynamics::Model *model)
void generate_human36model(RobotDynamics::ModelPtr model)
{
Body pelvis_body = create_body(SegmentPelvis);
Body thigh_body = create_body(SegmentThigh);
......
......@@ -7,13 +7,14 @@
#include <iomanip>
#include <sstream>
#include "rdl_dynamics/Contacts.h"
#include "rdl_dynamics/Dynamics.h"
#include "rdl_dynamics/Model.h"
#include "rdl_benchmark/model_generator.h"
#include "rdl_benchmark/Human36Model.h"
#include "rdl_benchmark/SampleData.h"
#include "rdl_benchmark/Timer.h"
#include "rdl_dynamics/Contacts.h"
#include "rdl_dynamics/Dynamics.h"
#include "rdl_dynamics/Model.h"
#include "rdl_dynamics/types.hpp"
#include "rdl_urdfreader/urdfreader.h"
bool have_urdfreader = true;
......@@ -41,7 +42,7 @@ enum ContactsMethod
ContactsMethodLagrangian = 0, ContactsMethodRangeSpaceSparse, ContactsMethodNullSpace, ContactsMethodKokkevis
};
double run_forward_dynamics_ABA_benchmark(Model *model, int sample_count)
double run_forward_dynamics_ABA_benchmark(ModelPtr model, int sample_count)
{
SampleData sample_data;
sample_data.fillRandom(model->dof_count, sample_count);
......@@ -61,7 +62,7 @@ double run_forward_dynamics_ABA_benchmark(Model *model, int sample_count)
return duration;
}
double run_forward_dynamics_lagrangian_benchmark(Model *model, int sample_count)
double run_forward_dynamics_lagrangian_benchmark(ModelPtr model, int sample_count)
{
SampleData sample_data;
sample_data.fillRandom(model->dof_count, sample_count);
......@@ -74,7 +75,7 @@ double run_forward_dynamics_lagrangian_benchmark(Model *model, int sample_count)
for(int i = 0; i < sample_count; i++)
{
forwardDynamicsLagrangian(*model, sample_data.q[i], sample_data.qdot[i], sample_data.tau[i], sample_data.qddot[i], Math::LinearSolverPartialPivLU, NULL, &H, &C);
forwardDynamicsLagrangian(*model, sample_data.q[i], sample_data.qdot[i], sample_data.tau[i], sample_data.qddot[i], H, C, Math::LinearSolverPartialPivLU, NULL);
}
double duration = timer_stop(&tinfo);
......@@ -84,7 +85,7 @@ double run_forward_dynamics_lagrangian_benchmark(Model *model, int sample_count)
return duration;
}
double run_inverse_dynamics_RNEA_benchmark(Model *model, int sample_count)
double run_inverse_dynamics_RNEA_benchmark(ModelPtr model, int sample_count)
{
SampleData sample_data;
sample_data.fillRandom(model->dof_count, sample_count);
......@@ -104,7 +105,7 @@ double run_inverse_dynamics_RNEA_benchmark(Model *model, int sample_count)
return duration;
}
double run_CRBA_benchmark(Model *model, int sample_count)
double run_CRBA_benchmark(ModelPtr model, int sample_count)
{
SampleData sample_data;
sample_data.fillRandom(model->dof_count, sample_count);
......@@ -128,7 +129,7 @@ double run_CRBA_benchmark(Model *model, int sample_count)
return duration;
}
double run_nle_benchmark(Model *model, int sample_count)
double run_nle_benchmark(ModelPtr model, int sample_count)
{
SampleData sample_data;
sample_data.fillRandom(model->dof_count, sample_count);
......@@ -148,7 +149,7 @@ double run_nle_benchmark(Model *model, int sample_count)
return duration;
}
double run_calc_minv_times_tau_benchmark(Model *model, int sample_count)
double run_calc_minv_times_tau_benchmark(ModelPtr model, int sample_count)
{
SampleData sample_data;
sample_data.fillRandom(model->dof_count, sample_count);
......@@ -170,7 +171,7 @@ double run_calc_minv_times_tau_benchmark(Model *model, int sample_count)
return duration;
}
double run_contacts_lagrangian_benchmark(Model *model, ConstraintSet *constraint_set, int sample_count)
double run_contacts_lagrangian_benchmark(ModelPtr model, ConstraintSet *constraint_set, int sample_count)
{
SampleData sample_data;
sample_data.fillRandom(model->dof_count, sample_count);
......@@ -188,7 +189,7 @@ double run_contacts_lagrangian_benchmark(Model *model, ConstraintSet *constraint
return duration;
}
double run_contacts_lagrangian_sparse_benchmark(Model *model, ConstraintSet *constraint_set, int sample_count)
double run_contacts_lagrangian_sparse_benchmark(ModelPtr model, ConstraintSet *constraint_set, int sample_count)
{
SampleData sample_data;
sample_data.fillRandom(model->dof_count, sample_count);
......@@ -206,7 +207,7 @@ double run_contacts_lagrangian_sparse_benchmark(Model *model, ConstraintSet *con
return duration;
}
double run_contacts_null_space(Model *model, ConstraintSet *constraint_set, int sample_count)
double run_contacts_null_space(ModelPtr model, ConstraintSet *constraint_set, int sample_count)
{
SampleData sample_data;
sample_data.fillRandom(model->dof_count, sample_count);
......@@ -224,7 +225,7 @@ double run_contacts_null_space(Model *model, ConstraintSet *constraint_set, int
return duration;
}
double run_contacts_kokkevis_benchmark(Model *model, ConstraintSet *constraint_set, int sample_count)
double run_contacts_kokkevis_benchmark(ModelPtr model, ConstraintSet *constraint_set, int sample_count)
{
SampleData sample_data;
sample_data.fillRandom(model->dof_count, sample_count);
......@@ -245,7 +246,7 @@ double run_contacts_kokkevis_benchmark(Model *model, ConstraintSet *constraint_s
double contacts_benchmark(int sample_count, ContactsMethod contacts_method)
{
// initialize the human model
Model *model = new Model();
ModelPtr model(new Model());
generate_human36model(model);
// initialize the constraint sets
......@@ -459,8 +460,6 @@ double contacts_benchmark(int sample_count, ContactsMethod contacts_method)
cout << "ConstraintSet: 4 Bodies 4 Constraints: " << " duration = " << setw(10) << duration << "(s)" << " (~" << setw(10) << duration / sample_count << "(s) per call)" << endl;
delete model;
return duration;
}
......@@ -599,9 +598,7 @@ int main(int argc, char *argv[])
{
parse_args(argc, argv);
Model *model = NULL;
model = new Model();
ModelPtr model(new Model());
if(model_file != "")
{
......@@ -637,8 +634,6 @@ int main(int argc, char *argv[])
run_nle_benchmark(model, benchmark_sample_count);
}
delete model;
return 0;
}
......@@ -649,14 +644,12 @@ int main(int argc, char *argv[])
cout << "= Forward Dynamics: ABA =" << endl;
for(int depth = 1; depth <= benchmark_model_max_depth; depth++)
{
model = new Model();
model.reset(new Model());
model->gravity = SpatialVector(0., 0., 0., 0., -9.81, 0.);
generate_planar_tree(model, depth);
run_forward_dynamics_ABA_benchmark(model, benchmark_sample_count);
delete model;
}
cout << endl;
}
......@@ -666,14 +659,12 @@ int main(int argc, char *argv[])
cout << "= Forward Dynamics: Lagrangian (Piv. LU decomposition) =" << endl;
for(int depth = 1; depth <= benchmark_model_max_depth; depth++)
{
model = new Model();
model.reset(new Model());
model->gravity = SpatialVector(0., 0., 0., 0., -9.81, 0.);
generate_planar_tree(model, depth);
run_forward_dynamics_lagrangian_benchmark(model, benchmark_sample_count);
delete model;
}
cout << endl;
}
......@@ -683,14 +674,12 @@ int main(int argc, char *argv[])
cout << "= Inverse Dynamics: RNEA =" << endl;
for(int depth = 1; depth <= benchmark_model_max_depth; depth++)
{
model = new Model();
model.reset(new Model());
model->gravity = SpatialVector(0., 0., 0., 0., -9.81, 0.);
generate_planar_tree(model, depth);
run_inverse_dynamics_RNEA_benchmark(model, benchmark_sample_count);
delete model;
}
cout << endl;
}
......@@ -700,14 +689,12 @@ int main(int argc, char *argv[])
cout << "= Joint Space Inertia Matrix: CRBA =" << endl;
for(int depth = 1; depth <= benchmark_model_max_depth; depth++)
{
model = new Model();
model.reset(new Model());
model->gravity = SpatialVector(0., 0., 0., 0., -9.81, 0.);
generate_planar_tree(model, depth);
run_CRBA_benchmark(model, benchmark_sample_count);
delete model;
}
cout << endl;
}
......@@ -717,14 +704,12 @@ int main(int argc, char *argv[])
cout << "= Nonlinear Effects =" << endl;
for(int depth = 1; depth <= benchmark_model_max_depth; depth++)
{
model = new Model();
model.reset(new Model());
model->gravity = SpatialVector(0., 0., 0., 0., -9.81, 0.);
generate_planar_tree(model, depth);
run_nle_benchmark(model, benchmark_sample_count);
delete model;
}
cout << endl;
}
......@@ -734,14 +719,12 @@ int main(int argc, char *argv[])
cout << "= CalcMInvTimesTau =" << endl;
for(int depth = 1; depth <= benchmark_model_max_depth; depth++)
{
model = new Model();
model.reset(new Model());
model->gravity = SpatialVector(0., 0., 0., 0., -9.81, 0.);
generate_planar_tree(model, depth);
run_calc_minv_times_tau_benchmark(model, benchmark_sample_count);
delete model;
}
cout << endl;
}
......
#include "rdl_benchmark/model_generator.h"
#include "rdl_dynamics/Model.h"
#include "rdl_dynamics/types.hpp"
using namespace RobotDynamics;
using namespace RobotDynamics::Math;
void generate_planar_tree_recursive(Model *model, unsigned int parent_body_id, int depth, double length)
void generate_planar_tree_recursive(ModelPtr model, unsigned int parent_body_id, int depth, double length)
{
if(depth == 0)
{
......@@ -26,7 +27,7 @@ void generate_planar_tree_recursive(Model *model, unsigned int parent_body_id, i
generate_planar_tree_recursive(model, child_right, depth - 1, length * 0.4);
}
void generate_planar_tree(Model *model, int depth)
void generate_planar_tree(ModelPtr model, int depth)
{
// we first add a single body that is hanging straight down from
// (0, 0, 0). After that we generate the tree recursively such that each
......
cmake_minimum_required(VERSION 3.4)
project(rdl_cmake)
set(CMAKE_CXX_STANDARD 14)
set(CMAKE_CXX_STANDARD_REQUIRED ON)
set(CMAKE_CXX_EXTENSIONS OFF)
find_package(catkin REQUIRED)
catkin_package(CFG_EXTRAS rdl_cmake-extras.cmake)
......
......@@ -68,7 +68,7 @@ function(lint_cpp)
# CANNOT pass in a CMake string variable (aka ${LINT_CPP_CMD}). If you do
# it will insert quotes with the command is excuted.
add_custom_target(lint_cpp_${PROJECT_NAME}
COMMAND ${CPPCHECK_PATH} ${lint_cpp_OPTS} --platform=unix64 --xml-version=2 --std=c11 ${cppcheck_include_dirs} ${lint_cpp_SRCS} 2> ${CPPCHECK_OUTPUT_FILE} VERBATIM
COMMAND ${CPPCHECK_PATH} ${lint_cpp_OPTS} --platform=unix64 --xml-version=2 --std=c++11 --language=c++ ${cppcheck_include_dirs} ${lint_cpp_SRCS} 2> ${CPPCHECK_OUTPUT_FILE} VERBATIM
DEPENDS lint_output_dir_${PROJECT_NAME}
WORKING_DIRECTORY ${PROJECT_SOURCE_DIR})
add_dependencies(lint_${PROJECT_NAME} lint_cpp_${PROJECT_NAME})
......
<?xml version="1.0"?>
<package format="2">
<name>rdl_cmake</name>
<version>1.1.0</version>
<version>3.2.0</version>
<description>The rdl_cmake package</description>
<maintainer email="jlack1987@gmail.com">jordan</maintainer>
......
CMAKE_MINIMUM_REQUIRED(VERSION 3.4)
PROJECT (rdl_dynamics)
# check c++11 / c++0x
include(CheckCXXCompilerFlag)
CHECK_CXX_COMPILER_FLAG("-std=c++0x" COMPILER_SUPPORTS_CXX0X)
if(COMPILER_SUPPORTS_CXX0X)
set(CMAKE_CXX_FLAGS "-std=c++0x")
else()
message(FATAL_ERROR "The compiler ${CMAKE_CXX_COMPILER} has no C++11 support. Please use a different C++ compiler.")
endif()
set(CMAKE_CXX_STANDARD 14)
set(CMAKE_CXX_STANDARD_REQUIRED ON)
set(CMAKE_CXX_EXTENSIONS OFF)
find_package(catkin REQUIRED rdl_cmake)
find_package(Eigen3 REQUIRED)
......@@ -26,10 +21,9 @@ SET ( RDL_SOURCES
src/ReferenceFrame.cpp
src/SpatialMotion.cpp
src/SpatialAcceleration.cpp
src/TransformableGeometricObject.cpp
src/MotionVector.cpp
src/FrameObject.cpp
src/RigidBodyInertia.cpp
)
src/RigidBodyInertia.cpp)
include_directories( ${INCLUDES_DIR} ${EIGEN3_INCLUDE_DIR})
......
indent_align_string=true
indent_braces=false
indent_braces_no_func=false
indent_brace_parent=false
indent_namespace=true
indent_extern=false
indent_class=true
indent_class_colon=true
indent_else_if=false
indent_func_call_param=false
indent_func_def_param=false
indent_func_proto_param=false
indent_func_class_param=false
indent_func_ctor_var_param=false
indent_template_param=false
indent_func_param_double=false
indent_relative_single_line_comments=false
indent_col1_comment=true
indent_access_spec_body=false
indent_paren_nl=false
indent_comma_paren=false
indent_bool_paren=false
indent_square_nl=false
indent_preserve_sql=false
indent_align_assign=true
sp_balance_nested_parens=false
align_keep_tabs=false
align_with_tabs=false
align_on_tabstop=false
align_number_left=true
align_func_params=true
# version 0.59 which is 16.04 default, if the following line is true it will segfault on a list of files
align_same_func_call_params=false
align_var_def_colon=true
align_var_def_attribute=true
align_var_def_inline=true
align_right_cmt_mix=false
align_on_operator=true
align_mix_var_proto=false
align_single_line_func=true
align_single_line_brace=true
align_nl_cont=true
align_left_shift=true
nl_collapse_empty_body=true
nl_assign_leave_one_liners=false
nl_class_leave_one_liners=false
nl_enum_leave_one_liners=false
nl_getset_leave_one_liners=false
nl_func_leave_one_liners=false
nl_if_leave_one_liners=false
nl_multi_line_cond=false
nl_multi_line_define=false
nl_before_case=true
nl_after_case=false
nl_after_return=true
nl_after_semicolon=false
nl_after_brace_open=false
nl_after_brace_open_cmt=false
nl_after_vbrace_open=false
nl_after_brace_close=false
nl_define_macro=true
nl_squeeze_ifdef=false
nl_ds_struct_enum_cmt=true
nl_ds_struct_enum_close_brace=true
nl_create_if_one_liner=true
nl_create_for_one_liner=true
nl_create_while_one_liner=true
ls_for_split_full=false
ls_func_split_full=true
nl_after_multiline_comment=true
eat_blanks_after_open_brace=true
eat_blanks_before_close_brace=true
mod_pawn_semicolon=false
mod_full_paren_if_bool=true
mod_remove_extra_semicolon=true
mod_sort_import=false
mod_sort_using=false
mod_sort_include=false
mod_move_case_break=true
mod_remove_empty_return=true
cmt_indent_multi=true
cmt_c_group=false
cmt_c_nl_start=false
cmt_c_nl_end=false
cmt_cpp_group=false
cmt_cpp_nl_start=false
cmt_cpp_nl_end=false
cmt_cpp_to_c=false
cmt_star_cont=false
cmt_multi_check_last=true
cmt_insert_before_preproc=false
pp_indent_at_level=false
pp_region_indent_code=false
pp_if_indent_code=false
pp_define_at_level=false
indent_columns=4
align_var_def_span=1
align_var_def_star_style=2
align_var_def_amp_style=2
align_var_def_thresh=3
align_var_def_gap=1
align_assign_span=1
align_enum_equ_span=1
align_var_struct_span=1
align_struct_init_span=1
align_typedef_span=1
align_typedef_star_style=2
align_typedef_amp_style=2
align_right_cmt_span=4
align_right_cmt_at_col=1
align_func_proto_span=3
nl_end_of_file_min=1
nl_func_var_def_blk=1
code_width=128
nl_max=3
nl_after_func_proto=0
nl_after_func_body=2
nl_after_func_body_one_liner=2
nl_before_block_comment=2
nl_before_c_comment=2
nl_before_cpp_comment=2
nl_before_access_spec=2
nl_after_access_spec=2
nl_comment_func_def=1
nl_after_try_catch_finally=1
mod_full_brace_nl=1
mod_add_long_ifdef_endif_comment=1
mod_add_long_ifdef_else_comment=1
cmt_width=128
newlines=auto
indent_with_tabs=0
sp_arith=add
sp_assign=add
sp_enum_assign=add
sp_pp_concat=add
sp_pp_stringify=add
sp_bool=add
sp_compare=add
sp_inside_paren=remove
sp_paren_paren=remove
sp_paren_brace=add
sp_before_ptr_star=add
sp_before_unnamed_ptr_star=add
sp_between_ptr_star=remove
sp_after_ptr_star=remove
sp_after_ptr_star_func=add
sp_before_ptr_star_func=remove
sp_before_byref=remove
sp_before_unnamed_byref=remove
sp_after_byref=add
sp_after_byref_func=add
sp_before_byref_func=remove
sp_after_type=add
sp_before_angle=remove
sp_inside_angle=remove
sp_after_angle=remove
sp_angle_paren=remove
sp_angle_word=remove