diff --git a/src/CMakeLists.txt b/src/CMakeLists.txt index 7bbac43e6aadc040886f8d4ffdcb9b5a023c3e19..61dc6b9cfcc919f6062ba4270931005dc8a6f9d0 100644 --- a/src/CMakeLists.txt +++ b/src/CMakeLists.txt @@ -416,7 +416,6 @@ IF (vision_utils_FOUND) capture_image.h feature_point_image.h landmark_AHP.h - landmark_point_3D.h processor_params_image.h processor_tracker_feature_image.h processor_tracker_landmark_image.h @@ -425,7 +424,6 @@ IF (vision_utils_FOUND) capture_image.cpp feature_point_image.cpp landmark_AHP.cpp - landmark_point_3D.cpp processor_tracker_feature_image.cpp processor_tracker_landmark_image.cpp ) @@ -440,10 +438,13 @@ ADD_SUBDIRECTORY(constraints) # Add the features sub-directory ADD_SUBDIRECTORY(features) -# Add the processor sub-directory +# Add the landmarks sub-directory +ADD_SUBDIRECTORY(landmarks) + +# Add the processors sub-directory ADD_SUBDIRECTORY(processors) -# Add the sensor sub-directory +# Add the sensors sub-directory ADD_SUBDIRECTORY(sensors) # Add the hello_wolf sub-directory diff --git a/src/captures/CMakeLists.txt b/src/captures/CMakeLists.txt index 008619d7b78511d7deb0bbd1d9133845b667a140..57f34f813a42268bc2600eb53e65ba7b7f73f2ca 100644 --- a/src/captures/CMakeLists.txt +++ b/src/captures/CMakeLists.txt @@ -1,6 +1,14 @@ INCLUDE_DIRECTORIES(${CMAKE_CURRENT_SOURCE_DIR}) -# Forward var to parent scope +#========================================= +#========================================= +# Add in this section the CONDITIONAL CLUES [IF/ELSE] +# for external libraries and move inside them the respective lines from above. + + + +#========================================= +#========================================= SET(HDRS_CAPTURE ${HDRS_CAPTURE} ${CMAKE_CURRENT_SOURCE_DIR}/capture_velocity.h @@ -12,11 +20,7 @@ SET(SRCS_CAPTURE ${SRCS_CAPTURE} ${CMAKE_CURRENT_SOURCE_DIR}/capture_wheel_joint_position.cpp ) - - - - - +# Forward var to parent scope # These lines always at the end SET(HDRS_CAPTURE ${HDRS_CAPTURE} PARENT_SCOPE) SET(SRCS_CAPTURE ${SRCS_CAPTURE} PARENT_SCOPE) diff --git a/src/constraints/CMakeLists.txt b/src/constraints/CMakeLists.txt index 587c9b9d99a1f12f6a6f3035801d7657defa33f7..8d9661d2c7d598c4ae26ea543ac1f3b573db5bbf 100644 --- a/src/constraints/CMakeLists.txt +++ b/src/constraints/CMakeLists.txt @@ -1,6 +1,14 @@ INCLUDE_DIRECTORIES(${CMAKE_CURRENT_SOURCE_DIR}) -# Forward var to parent scope +#========================================= +#========================================= +# Add in this section the CONDITIONAL CLUES [IF/ELSE] +# for external libraries and move inside them the respective lines from above. + + + +#========================================= +#========================================= SET(HDRS_CONSTRAINT ${HDRS_CONSTRAINT} ${CMAKE_CURRENT_SOURCE_DIR}/constraint_autodiff_distance_3D.h @@ -11,7 +19,7 @@ SET(HDRS_CONSTRAINT ${HDRS_CONSTRAINT} SET(SRCS_CONSTRAINT ${SRCS_CONSTRAINT} ) - +# Forward var to parent scope # These lines always at the end SET(HDRS_CONSTRAINT ${HDRS_CONSTRAINT} PARENT_SCOPE) SET(SRCS_CONSTRAINT ${SRCS_CONSTRAINT} PARENT_SCOPE) diff --git a/src/features/CMakeLists.txt b/src/features/CMakeLists.txt index dd0b75aa447b2bd2a09c127e8b7a4abc0064ee58..316731a39f5dd8e3721e70d6b23ceec4186e523e 100644 --- a/src/features/CMakeLists.txt +++ b/src/features/CMakeLists.txt @@ -1,7 +1,15 @@ INCLUDE_DIRECTORIES(${CMAKE_CURRENT_SOURCE_DIR}) -# Forward var to parent scope +#========================================= +#========================================= +# Add in this section the CONDITIONAL CLUES [IF/ELSE] +# for external libraries and move inside them the respective lines from above. + + +#========================================= +#========================================= + SET(HDRS_FEATURE ${HDRS_FEATURE} ${CMAKE_CURRENT_SOURCE_DIR}/feature_diff_drive.h ) @@ -9,9 +17,8 @@ SET(HDRS_FEATURE ${HDRS_FEATURE} SET(SRCS_FEATURE ${SRCS_FEATURE} ${CMAKE_CURRENT_SOURCE_DIR}/feature_diff_drive.cpp ) - - +# Forward var to parent scope # These lines always at the end SET(HDRS_FEATURE ${HDRS_FEATURE} PARENT_SCOPE) SET(SRCS_FEATURE ${SRCS_FEATURE} PARENT_SCOPE) diff --git a/src/landmarks/CMakeLists.txt b/src/landmarks/CMakeLists.txt new file mode 100644 index 0000000000000000000000000000000000000000..bdfe8f65b174218926f12aa3d3c8211f4e069569 --- /dev/null +++ b/src/landmarks/CMakeLists.txt @@ -0,0 +1,24 @@ +INCLUDE_DIRECTORIES(${CMAKE_CURRENT_SOURCE_DIR}) + +#========================================= +#========================================= +# Add in this section the CONDITIONAL CLUES [IF/ELSE] +# for external libraries and move inside them the respective lines from above. + + + +#========================================= +#========================================= + +SET(HDRS_LANDMARK ${HDRS_LANDMARK} + ${CMAKE_CURRENT_SOURCE_DIR}/landmark_point_3D.h + ) + +SET(SRCS_LANDMARK ${SRCS_LANDMARK} + ${CMAKE_CURRENT_SOURCE_DIR}/landmark_point_3D.cpp + ) + +# Forward var to parent scope +# These lines always at the end +SET(HDRS_LANDMARK ${HDRS_LANDMARK} PARENT_SCOPE) +SET(SRCS_LANDMARK ${SRCS_LANDMARK} PARENT_SCOPE) \ No newline at end of file diff --git a/src/landmark_point_3D.cpp b/src/landmarks/landmark_point_3D.cpp similarity index 91% rename from src/landmark_point_3D.cpp rename to src/landmarks/landmark_point_3D.cpp index 7a83341ecdf1ed2afc441ffb766e2b8006e71dfd..0deed3861479174eb87e5e2bb2ee4d1d0b6fa714 100644 --- a/src/landmark_point_3D.cpp +++ b/src/landmarks/landmark_point_3D.cpp @@ -1,4 +1,4 @@ -#include "landmark_point_3D.h" +#include "landmarks/landmark_point_3D.h" namespace wolf { diff --git a/src/landmark_point_3D.h b/src/landmarks/landmark_point_3D.h similarity index 100% rename from src/landmark_point_3D.h rename to src/landmarks/landmark_point_3D.h diff --git a/src/processors/CMakeLists.txt b/src/processors/CMakeLists.txt index c5902ad9c399c4055ad41fd8a5ac20fe29186933..5c223e4f28ff54f4c62267f980124d62f3d6ccda 100644 --- a/src/processors/CMakeLists.txt +++ b/src/processors/CMakeLists.txt @@ -1,14 +1,9 @@ INCLUDE_DIRECTORIES(${CMAKE_CURRENT_SOURCE_DIR}) -# Forward var to parent scope - -SET(HDRS_PROCESSOR ${HDRS_PROCESSOR} - ${CMAKE_CURRENT_SOURCE_DIR}/processor_diff_drive.h - ) - -SET(SRCS_PROCESSOR ${SRCS_PROCESSOR} - ${CMAKE_CURRENT_SOURCE_DIR}/processor_diff_drive.cpp - ) +#========================================= +#========================================= +# Add in this section the CONDITIONAL CLUES [IF/ELSE] +# for external libraries and move inside them the respective lines from above. IF (vision_utils_FOUND) SET(HDRS_PROCESSOR ${HDRS_PROCESSOR} @@ -20,8 +15,19 @@ SET(SRCS_PROCESSOR ${SRCS_PROCESSOR} ) ENDIF (vision_utils_FOUND) +#========================================= +#========================================= + + +SET(HDRS_PROCESSOR ${HDRS_PROCESSOR} + ${CMAKE_CURRENT_SOURCE_DIR}/processor_diff_drive.h + ) +SET(SRCS_PROCESSOR ${SRCS_PROCESSOR} + ${CMAKE_CURRENT_SOURCE_DIR}/processor_diff_drive.cpp + ) +# Forward var to parent scope # These lines always at the end SET(HDRS_PROCESSOR ${HDRS_PROCESSOR} PARENT_SCOPE) SET(SRCS_PROCESSOR ${SRCS_PROCESSOR} PARENT_SCOPE) diff --git a/src/sensors/CMakeLists.txt b/src/sensors/CMakeLists.txt index 48a27e6003eeba7d9bff033c682a187057d61789..661731d27c433e5b0d9e3c14a81d6c0dd0ac6737 100644 --- a/src/sensors/CMakeLists.txt +++ b/src/sensors/CMakeLists.txt @@ -1,7 +1,15 @@ INCLUDE_DIRECTORIES(${CMAKE_CURRENT_SOURCE_DIR}) -# Forward var to parent scope +#========================================= +#========================================= +# Add in this section the CONDITIONAL CLUES [IF/ELSE] +# for external libraries and move inside them the respective lines from above. + + +#========================================= +#========================================= + SET(HDRS_SENSOR ${HDRS_SENSOR} ${CMAKE_CURRENT_SOURCE_DIR}/diff_drive_tools.h ${CMAKE_CURRENT_SOURCE_DIR}/diff_drive_tools.hpp @@ -12,8 +20,7 @@ SET(SRCS_SENSOR ${SRCS_SENSOR} ${CMAKE_CURRENT_SOURCE_DIR}/sensor_diff_drive.cpp ) - - +# Forward var to parent scope # These lines always at the end SET(HDRS_SENSOR ${HDRS_SENSOR} PARENT_SCOPE) SET(SRCS_SENSOR ${SRCS_SENSOR} PARENT_SCOPE) diff --git a/src/test/CMakeLists.txt b/src/test/CMakeLists.txt index 985471013c0f232b742259fa2c66af823a5968a1..4827de183a9a53fbb22bcc72d553aefbf2e6a33a 100644 --- a/src/test/CMakeLists.txt +++ b/src/test/CMakeLists.txt @@ -68,10 +68,6 @@ target_link_libraries(gtest_frame_base ${PROJECT_NAME}) wolf_add_gtest(gtest_IMU_tools gtest_IMU_tools.cpp) # target_link_libraries(gtest_IMU_tools ${PROJECT_NAME}) // WOLF library not needed -# IMU tools test -wolf_add_gtest(gtest_pack_KF_buffer gtest_pack_KF_buffer.cpp) -target_link_libraries(gtest_pack_KF_buffer ${PROJECT_NAME}) - # LocalParametrizationXxx classes test wolf_add_gtest(gtest_local_param gtest_local_param.cpp) target_link_libraries(gtest_local_param ${PROJECT_NAME}) @@ -80,6 +76,10 @@ target_link_libraries(gtest_local_param ${PROJECT_NAME}) wolf_add_gtest(gtest_motion_buffer gtest_motion_buffer.cpp) target_link_libraries(gtest_motion_buffer ${PROJECT_NAME}) +# PackKFBuffer +wolf_add_gtest(gtest_pack_KF_buffer gtest_pack_KF_buffer.cpp) +target_link_libraries(gtest_pack_KF_buffer ${PROJECT_NAME}) + # Problem class test wolf_add_gtest(gtest_problem gtest_problem.cpp) target_link_libraries(gtest_problem ${PROJECT_NAME}) @@ -179,7 +179,7 @@ wolf_add_gtest(gtest_processor_IMU_jacobians gtest_processor_IMU_jacobians.cpp) target_link_libraries(gtest_processor_IMU_jacobians ${PROJECT_NAME}) IF(vision_utils_FOUND) -# ProcessorIMUJacobians test +# ProcessorFeatureTrifocal test wolf_add_gtest(gtest_processor_tracker_feature_trifocal gtest_processor_tracker_feature_trifocal.cpp) target_link_libraries(gtest_processor_tracker_feature_trifocal ${PROJECT_NAME}) ENDIF(vision_utils_FOUND) diff --git a/wolf_scripts/ReadMe.md b/wolf_scripts/ReadMe.md index 566576017536936977047203faada2a75db09a1a..72cadef66612e9f8603e6ada687848e3d8a30686 100644 --- a/wolf_scripts/ReadMe.md +++ b/wolf_scripts/ReadMe.md @@ -77,17 +77,18 @@ Helpful scripts to create WOLF tree elements (e.g. processors) #### SCRIPTS installation - * Move to the scripts folder + * Move to the WOLF scripts folder - ``` - cd $WOLF_ROOT/wolf_scripts - ``` + ..*`cd <WOLF_DIRECTORY>/wolf_scripts` - * Run the following line to set your `bashrc`. This will allow you to execute the scripts from any console path. + * Run the following lines to set your `bashrc`. This will allow you to execute the scripts from any console path. - ``` - echo "source $WOLF_ROOT/wolf_scripts/setup.bash" >> ~/.bashrc - ``` + ..*`echo "export WOLF_ROOT=$PWD/../." >> ~/.bashrc` + ..*`echo "source $PWD/setup.bash" >> ~/.bashrc` + + * Source your `bashrc`. + + ..*`source ~/.bashrc` ## Usage @@ -111,6 +112,9 @@ Creates the main structure including .cpp and .h files, and a gtest for the new and modify the `CMakeLists.txt` files in the directories `src/processors/` and `src/test/`. * Options: - - t: Type. Any of the following "[ capture | constraint | feature | processor | sensor ]" + - t: Type. Any of the following [ capture | constraint | feature | landmark | processor | sensor ]" - n: Name - - b: Base class (inherited from this class) \ No newline at end of file + - b: Base class (inherited from this class) + + *__[WARNING]__: If you are using external libraries, you will have to manually modify some files. Please check the yellow [WARN] messages shown after executing the script. + \ No newline at end of file diff --git a/wolf_scripts/generic_func/functions.sh b/wolf_scripts/generic_func/functions.sh index e043f05cb249a06fa2cc5d9addb8fa5d9566e019..f5bd5c20f9d2996538c3f9ebc03575ebb2df77ac 100755 --- a/wolf_scripts/generic_func/functions.sh +++ b/wolf_scripts/generic_func/functions.sh @@ -12,66 +12,66 @@ NC=$(tput sgr 0) # No Color askIfGitBranch() { - read -p "${CYAN}Do you want to create a new git branch (y/n)? ${NC}" ANSWER - DOIT=${ANSWER:-y} - OK=0 + read -p "${CYAN}Do you want to create a new git branch (y/n)? ${NC}" ANSWER + DOIT=${ANSWER:-y} + OK=0 - while [ $OK -eq 0 ]; - do - case "$ANSWER" in - "y" | "Y") - DOIT="y" - OK=1 - ;; - "n" | "N") - DOIT="n" - OK=1 - ;; - *) - OK=0 - echo "${RED} [ERROR]: Incorrect answer.${NC} Please type y or n" - exit - ;; - esac -done - -if [ "$DOIT" == "y" ]; -then - if [ -z "$1" ] - then - echo "${RED} [ERROR]: No argument supplied.${NC}" - fi - cd $WOLF_ROOT - git checkout -b $1 - echo "${GREEN} \--> Created git branch $1${NC}" -fi -echo "" + while [ $OK -eq 0 ]; + do + case "$ANSWER" in + "y" | "Y") + DOIT="y" + OK=1 + ;; + "n" | "N") + DOIT="n" + OK=1 + ;; + *) + OK=0 + echo "${RED} [ERROR]: Incorrect answer.${NC} Please type y or n" + exit + ;; + esac + done + + if [ "$DOIT" == "y" ]; + then + if [ -z "$1" ] + then + echo "${RED} [ERROR]: No argument supplied.${NC}" + fi + cd $WOLF_ROOT + git checkout -b $1 + echo "${GREEN} \--> Created git branch $1${NC}" + fi + echo "" } getEnvVariable() { - local var=`echo "${!1}"` - if [ -z "${var}" ] - then - echo "${RED} [ERROR]: The environment variable ${1} has not been defined.${NC} Please see the wiki documentation for instructions on how to create it." >&2 - exit - fi - echo $var + local var=`echo "${!1}"` + if [ -z "${var}" ] + then + echo "${RED} [ERROR]: The environment variable ${1} has not been defined.${NC} Please see the wiki documentation for instructions on how to create it." >&2 + exit + fi + echo $var } showHelp() { - echo "******************************************" - echo "${BLUE}Script to generate a WOLF $1 class${NC}" - echo "******************************************" - echo " Required parameters:" - echo " -${CYAN}t${NC}: type. Any of the following [ ${CYAN}capture${NC} | ${CYAN}constraint${NC} | ${CYAN}feature${NC} | ${CYAN}processor${NC} | ${CYAN}sensor${NC}]" - echo " -${CYAN}n${NC}: name" - echo " -${CYAN}b${NC}: base class (inheritance)" - echo "" - echo "Example of usage:" - echo "wolf_create.sh -t processor -n processor_example -b processor_tracker" - echo "" + echo "******************************************" + echo "${BLUE}Script to generate a WOLF $1 class${NC}" + echo "******************************************" + echo " Required parameters:" + echo " -${CYAN}t${NC}: type. Any of the following [ ${CYAN}capture${NC} | ${CYAN}constraint${NC} | ${CYAN}feature${NC} | ${CYAN}landmark${NC} | ${CYAN}processor${NC} | ${CYAN}sensor${NC}]" + echo " -${CYAN}n${NC}: name" + echo " -${CYAN}b${NC}: base class (inheritance)" + echo "" + echo "Example of usage:" + echo "wolf_create.sh -t processor -n processor_example -b processor_tracker" + echo "" } LowerCase() @@ -98,429 +98,448 @@ UpperCase() UpperCaseFirstLetter() { - echo "$(echo "$1" | sed 's/.*/\u&/')" + echo "$(echo "$1" | sed 's/.*/\u&/')" } capitalizeDiminutives() { - RES=$1 - if [[ $1 =~ .*"2d"*. ]] ; - then - RES=$(echo "${1/2d/2D}") - fi - if [[ $1 =~ .*"3d"*. ]] ; - then - RES=$(echo "${RES/3d/3D}") - fi - if [[ $1 =~ .*"gps"*. ]] ; - then - RES=$(echo "${RES/gps/GPS}") - fi - if [[ $1 =~ .*"imu"*. ]] ; - then - RES=$(echo "${RES/imu/IMU}") - fi - echo $RES + RES=$1 + if [[ $1 =~ .*"2d"*. ]] ; + then + RES=$(echo "${1/2d/2D}") + fi + if [[ $1 =~ .*"3d"*. ]] ; + then + RES=$(echo "${RES/3d/3D}") + fi + if [[ $1 =~ .*"gps"*. ]] ; + then + RES=$(echo "${RES/gps/GPS}") + fi + if [[ $1 =~ .*"imu"*. ]] ; + then + RES=$(echo "${RES/imu/IMU}") + fi + echo $RES } getFilePath() { - if find $WOLF_ROOT -name "${1}" -print -quit | grep -q '^'; - then - echo "$(find "$WOLF_ROOT/src" -name ${1} )" - else - echo "" - fi + if find $WOLF_ROOT -name "${1}" -print -quit | grep -q '^'; + then + echo "$(find "$WOLF_ROOT/src" -name ${1} )" + else + echo "" + fi } fillWithBaseConstructorParameters() { - # Header: class constructor with base class parameters - H_TXT=$(cat $BASE_H_PATH) - H_TXT="${H_TXT#*class $BASECLASSNAME :}" - BASECLASS_TXT="${H_TXT%%\n\};*}" - PARAMS="${BASECLASS_TXT#*$BASECLASSNAME(}" - - BASE_DERIVES_FROM_AUTODIFF="" - if [[ $PARAMS =~ .*ConstraintAutodiff*. ]] && ! [[ $BASECLASSNAME =~ .*ConstraintAutodiff*. ]] ; - then - BASE_DERIVES_FROM_AUTODIFF="TRUE" - fi - - PARAMS="${PARAMS%%\) :*}" # in case of inheritance - PARAMS="${PARAMS%%\);*}" - - if [[ "$PARAMS" == *"const std::string& _type"* ]] ; - then - PARAMS="${PARAMS#*_type,}" - NAME_STR="${NAME#${TYPE}_}" - NAME_STR=$(UpperCase $NAME_STR) - fi - - OLD=" class_name();" - NEW="\ \ \ \ \ \ \ \ ${CLASSNAME}(${PARAMS});" - NEW=${NEW//$'\n'/} # Remove all newlines. - NEW=${NEW%$'\n'} # Remove a trailing newline. - NEW=$(echo $NEW | sed 's/^ *//g' | sed 's/ *$//g') # remove extra whitespaces - sed '/'"${OLD}"'/c'"${NEW}"'' "${TEMPLATES_PATH}"/class_template.h > "${TEMPLATES_PATH}"/tmp.h - - # CPP: class constructor with base class parameters - PARAMS="$PARAMS," # add , at the end to ease things - PARAMS=$(echo "$PARAMS" | sed 's/\ =.*,\ /,\ /g') - PARAMS=$(echo "$PARAMS" | sed 's/\ =.*,/,/g') - PARAMS="${PARAMS::-1}" # remove , from the end - - OLD="class_name::class_name() :" - NEW="class_name::class_name(${PARAMS}) :" - NEW=${NEW//$'\n'/} # Remove all newlines. - NEW=${NEW%$'\n'} # Remove a trailing newline. - NEW=$(echo $NEW | sed 's/^ *//g' | sed 's/ *$//g') # remove extra whitespaces - sed '/'"${OLD}"'/c'"${NEW}"'' "${TEMPLATES_PATH}"/class_template.cpp > "${TEMPLATES_PATH}"/tmp.cpp - - # get only the variable names - PARAMS_CLEAN=$(echo $PARAMS | sed -r 's/'","'/ /g') - ar=($PARAMS_CLEAN) - PARAMS_OBJ= - for el in "${ar[@]}"; do - if [[ $el == _* ]] - then - PARAMS_OBJ+=", ${el}" - fi - done - PARAMS_OBJ=${PARAMS_OBJ#","} - if ! [[ -z $NAME_STR ]] ; - then - PARAMS_OBJ="\"$NAME_STR\", $PARAMS_OBJ" - fi - OLD="\ base_class()" - NEW="\ base_class(${PARAMS_OBJ} )" - sed '/'"${OLD}"'/c'"${NEW}"'' "${TEMPLATES_PATH}"/tmp.cpp > "${TEMPLATES_PATH}"/tmp2.cpp - rm "${TEMPLATES_PATH}"/tmp.cpp - mv "${TEMPLATES_PATH}"/tmp2.cpp "${TEMPLATES_PATH}"/tmp.cpp + # Header: class constructor with base class parameters + H_TXT=$(cat $BASE_H_PATH) + H_TXT="${H_TXT#*class $BASECLASSNAME :}" + BASECLASS_TXT="${H_TXT%%\n\};*}" + PARAMS="${BASECLASS_TXT#*$BASECLASSNAME(}" + + BASE_DERIVES_FROM_AUTODIFF="" + if [[ $PARAMS =~ .*ConstraintAutodiff*. ]] && ! [[ $BASECLASSNAME =~ .*ConstraintAutodiff*. ]] ; + then + BASE_DERIVES_FROM_AUTODIFF="TRUE" + fi + + PARAMS="${PARAMS%%\) :*}" # in case of inheritance + PARAMS="${PARAMS%%\);*}" + + if [[ "$PARAMS" == *"const std::string& _type"* ]] ; + then + PARAMS="${PARAMS#*_type,}" + NAME_STR="${NAME#${TYPE}_}" + NAME_STR=$(UpperCase $NAME_STR) + fi + + if [[ $BASECLASSNAME =~ .*ConstraintAutodiff*. ]] ; + then + PARAMS="${PARAMS::-530}" # remove , from the end + fi + + OLD=" class_name();" + NEW="\ \ \ \ \ \ \ \ ${CLASSNAME}(${PARAMS});" + NEW=${NEW//$'\n'/} # Remove all newlines. + NEW=${NEW%$'\n'} # Remove a trailing newline. + NEW=$(echo $NEW | sed 's/^ *//g' | sed 's/ *$//g') # remove extra whitespaces + sed '/'"${OLD}"'/c'"${NEW}"'' "${TEMPLATES_PATH}"/class_template.h > "${TEMPLATES_PATH}"/tmp.h + + # CPP: class constructor with base class parameters + PARAMS="$PARAMS," # add , at the end to ease things + PARAMS=$(echo "$PARAMS" | sed 's/\ =.*,\ /,\ /g') + PARAMS=$(echo "$PARAMS" | sed 's/\ =.*,/,/g') + PARAMS="${PARAMS::-1}" # remove , from the end + + OLD="class_name::class_name() :" + NEW="class_name::class_name(${PARAMS}) :" + NEW=${NEW//$'\n'/} # Remove all newlines. + NEW=${NEW%$'\n'} # Remove a trailing newline. + NEW=$(echo $NEW | sed 's/^ *//g' | sed 's/ *$//g') # remove extra whitespaces + sed '/'"${OLD}"'/c'"${NEW}"'' "${TEMPLATES_PATH}"/class_template.cpp > "${TEMPLATES_PATH}"/tmp.cpp + + # get only the variable names + PARAMS_CLEAN=$(echo $PARAMS | sed -r 's/'","'/ /g') + ar=($PARAMS_CLEAN) + PARAMS_OBJ= + for el in "${ar[@]}"; do + if [[ $el == _* ]] + then + PARAMS_OBJ+=", ${el}" + fi + done + PARAMS_OBJ=${PARAMS_OBJ#","} + if ! [[ -z $NAME_STR ]] ; + then + PARAMS_OBJ="\"$NAME_STR\", $PARAMS_OBJ" + fi + OLD="\ base_class()" + NEW="\ base_class(${PARAMS_OBJ} )" + sed '/'"${OLD}"'/c'"${NEW}"'' "${TEMPLATES_PATH}"/tmp.cpp > "${TEMPLATES_PATH}"/tmp2.cpp + rm "${TEMPLATES_PATH}"/tmp.cpp + mv "${TEMPLATES_PATH}"/tmp2.cpp "${TEMPLATES_PATH}"/tmp.cpp } createHCPPFromTemplates() { - # Templates path - TEMPLATES_PATH=${WOLF_SCRIPTS_PATH}/templates - - # ===== Create HEADER and CPP files ===== - - # Pick initialization parameters from base class - fillWithBaseConstructorParameters - - # CPP only for non-autodiff - if ! [[ $BASECLASSNAME =~ .*ConstraintAutodiff*. ]] ; - then - #Set the TYPE and class names on the template files - sed 's/header_file/'"${NAME}.h"'/g' "${TEMPLATES_PATH}"/tmp.cpp > "${TEMPLATES_PATH}"/tmp2.cpp - sed 's/class_name/'"${CLASSNAME}"'/g' "${TEMPLATES_PATH}"/tmp2.cpp > "${TEMPLATES_PATH}"/tmp3.cpp - sed 's/base_class/'"${BASECLASSNAME}"'/g' "${TEMPLATES_PATH}"/tmp3.cpp > "${TEMPLATES_PATH}"/tmp4.cpp - rm "${TEMPLATES_PATH}"/tmp.cpp - rm "${TEMPLATES_PATH}"/tmp2.cpp - rm "${TEMPLATES_PATH}"/tmp3.cpp - # Rename and move files - NAME_CPP_PATH="$WOLF_ROOT"/src/"$TYPE"s/"$NAME".cpp - mv "${TEMPLATES_PATH}"/tmp4.cpp "$NAME_CPP_PATH" - fi + # Templates path + TEMPLATES_PATH=${WOLF_SCRIPTS_PATH}/templates + + # ===== Create HEADER and CPP files ===== + + # Pick initialization parameters from base class + fillWithBaseConstructorParameters + + # CPP only for non-autodiff + if ! [[ $BASECLASSNAME =~ .*ConstraintAutodiff*. ]] ; + then + #Set the TYPE and class names on the template files + sed 's/header_file/'"${NAME}.h"'/g' "${TEMPLATES_PATH}"/tmp.cpp > "${TEMPLATES_PATH}"/tmp2.cpp + sed 's/class_name/'"${CLASSNAME}"'/g' "${TEMPLATES_PATH}"/tmp2.cpp > "${TEMPLATES_PATH}"/tmp3.cpp + sed 's/base_class/'"${BASECLASSNAME}"'/g' "${TEMPLATES_PATH}"/tmp3.cpp > "${TEMPLATES_PATH}"/tmp4.cpp + rm "${TEMPLATES_PATH}"/tmp.cpp + rm "${TEMPLATES_PATH}"/tmp2.cpp + rm "${TEMPLATES_PATH}"/tmp3.cpp + # Rename and move files + NAME_CPP_PATH="$WOLF_ROOT"/src/"$TYPE"s/"$NAME".cpp + mv "${TEMPLATES_PATH}"/tmp4.cpp "$NAME_CPP_PATH" + fi - sed 's/base_header_file/'"${BASE}.h"'/g' "${TEMPLATES_PATH}"/tmp.h > "${TEMPLATES_PATH}"/tmp2.h - sed 's/name_cap/'"${TYPE_CAP}_${BASE_CAP}_${NAME_CAP}"'/g' "${TEMPLATES_PATH}"/tmp2.h > "${TEMPLATES_PATH}"/tmp3.h - sed 's/class_name/'"${CLASSNAME}"'/g' "${TEMPLATES_PATH}"/tmp3.h > "${TEMPLATES_PATH}"/tmp4.h - sed 's/base_class/'"${BASECLASSNAME}"'/g' "${TEMPLATES_PATH}"/tmp4.h > "${TEMPLATES_PATH}"/tmp5.h - rm "${TEMPLATES_PATH}"/tmp.h - rm "${TEMPLATES_PATH}"/tmp2.h - rm "${TEMPLATES_PATH}"/tmp3.h - rm "${TEMPLATES_PATH}"/tmp4.h + sed 's/base_header_file/'"${BASE}.h"'/g' "${TEMPLATES_PATH}"/tmp.h > "${TEMPLATES_PATH}"/tmp2.h + sed 's/name_cap/'"${TYPE_CAP}_${BASE_CAP}_${NAME_CAP}"'/g' "${TEMPLATES_PATH}"/tmp2.h > "${TEMPLATES_PATH}"/tmp3.h + sed 's/class_name/'"${CLASSNAME}"'/g' "${TEMPLATES_PATH}"/tmp3.h > "${TEMPLATES_PATH}"/tmp4.h + sed 's/base_class/'"${BASECLASSNAME}"'/g' "${TEMPLATES_PATH}"/tmp4.h > "${TEMPLATES_PATH}"/tmp5.h + rm "${TEMPLATES_PATH}"/tmp.h + rm "${TEMPLATES_PATH}"/tmp2.h + rm "${TEMPLATES_PATH}"/tmp3.h + rm "${TEMPLATES_PATH}"/tmp4.h - # Rename and move files - NAME_H_PATH="$WOLF_ROOT"/src/"$TYPE"s/"$NAME".h - mv "${TEMPLATES_PATH}"/tmp5.h "$NAME_H_PATH" + # Rename and move files + NAME_H_PATH="$WOLF_ROOT"/src/"$TYPE"s/"$NAME".h + mv "${TEMPLATES_PATH}"/tmp5.h "$NAME_H_PATH" } addAutodiffSpecifics() { - # Number of parameters - echo "" - echo "${CYAN}To create the class $CLASSNAME, you have to provide some info:${NC}" - echo "" - - PROMPT="${CYAN}- What is the size (dimensions) of the residual?${NC} (1 integer, followed by [ENTER]):" - read -p "${PROMPT}" RESIDUAL_DIM; - if ! [[ "$RESIDUAL_DIM" =~ ^[0-9]+$ ]] ; - then - echo "${RED} [ERROR]: Invalid input.${NC} Expecting a numeric value. Aborting..." - exit 1. - fi - echo -en "\033[1A\033[2K" - echo -en "\033[1A\033[2K" - echo "${GREEN} \--> Setting residual size to $RESIDUAL_DIM.${NC}" - echo "" - PROMPT="${CYAN}- How many state blocks are going to be considered in the constraint?${NC} (1 integer, followed by [ENTER]):" - read -p "${PROMPT}" NUM_STATES; - if ! [[ "$NUM_STATES" =~ ^[0-9]+$ ]] ; - then - echo "${RED} [ERROR]: Invalid input.${NC} Expecting a numeric value. Aborting..." - exit 1. - fi - echo -en "\033[1A\033[2K" - echo -en "\033[1A\033[2K" - echo "${GREEN} \--> Setting $NUM_STATES state blocks.${NC}" - echo "" + # Number of parameters + echo "" + echo "${CYAN}To create the class $CLASSNAME, you have to provide some info:${NC}" + echo "" + + PROMPT="${CYAN}- What is the size (dimensions) of the residual?${NC} (1 integer, followed by [ENTER]):" + read -p "${PROMPT}" RESIDUAL_DIM; + if ! [[ "$RESIDUAL_DIM" =~ ^[0-9]+$ ]] ; + then + echo "${RED} [ERROR]: Invalid input.${NC} Expecting a numeric value. Aborting..." + exit 1. + fi + echo -en "\033[1A\033[2K" + echo -en "\033[1A\033[2K" + echo "${GREEN} \--> Setting residual size to $RESIDUAL_DIM.${NC}" + echo "" + PROMPT="${CYAN}- How many state blocks are going to be considered in the constraint?${NC} (1 integer, followed by [ENTER]):" + read -p "${PROMPT}" NUM_STATES; + if ! [[ "$NUM_STATES" =~ ^[0-9]+$ ]] ; + then + echo "${RED} [ERROR]: Invalid input.${NC} Expecting a numeric value. Aborting..." + exit 1. + fi + echo -en "\033[1A\033[2K" + echo -en "\033[1A\033[2K" + echo "${GREEN} \--> Setting $NUM_STATES state blocks.${NC}" + echo "" - for (( idx = 0; idx < $NUM_STATES; idx++ )); do - PROMPT="${CYAN}- Name of state $((idx+1))?${NC} (1 string, followed by [ENTER]):" - read -p "${PROMPT}" STATENAME; - PROMPT="${CYAN}- Size (dimensions) of state $((idx+1)) (${STATENAME})?${NC} (1 integer, followed by [ENTER]:" - read -p "${PROMPT}" STATESIZE; - if ! [[ "$STATESIZE" =~ ^[0-9]+$ ]] ; - then - echo "${RED} [ERROR]: Invalid input.${NC} Expecting a numeric value. Aborting..." - exit 1. - fi - echo -en "\033[1A\033[2K" - echo -en "\033[1A\033[2K" - NAMES+=( "${STATENAME}" ) - SIZES+=( "${STATESIZE}" ) - done - - echo -en "\033[1A\033[2K" - echo -n "${GREEN} \--> Setting state blocks: ${NC}" - PARAMS= - for (( idx = 0; idx < ${#NAMES[@]}; idx++ )); do - echo -n "${GREEN}${NAMES[$idx]}(${SIZES[$idx]}) ${NC}" - PARAMS+=( "const T* const _${NAMES[idx]},") - PARAM_NUMS+=( "${SIZES[idx]},") - done - echo "" + for (( idx = 0; idx < $NUM_STATES; idx++ )); do + PROMPT="${CYAN}- Name of state $((idx+1))?${NC} (1 string, followed by [ENTER]):" + read -p "${PROMPT}" STATENAME; + PROMPT="${CYAN}- Size (dimensions) of state $((idx+1)) (${STATENAME})?${NC} (1 integer, followed by [ENTER]:" + read -p "${PROMPT}" STATESIZE; + if ! [[ "$STATESIZE" =~ ^[0-9]+$ ]] ; + then + echo "${RED} [ERROR]: Invalid input.${NC} Expecting a numeric value. Aborting..." + exit 1. + fi + echo -en "\033[1A\033[2K" + echo -en "\033[1A\033[2K" + NAMES+=( "${STATENAME}" ) + SIZES+=( "${STATESIZE}" ) + done + + echo -en "\033[1A\033[2K" + echo -n "${GREEN} \--> Setting state blocks: ${NC}" + PARAMS= + for (( idx = 0; idx < ${#NAMES[@]}; idx++ )); do + echo -n "${GREEN}${NAMES[$idx]}(${SIZES[$idx]}) ${NC}" + PARAMS+=( "const T* const _${NAMES[idx]},") + PARAM_NUMS+=( "${SIZES[idx]},") + done + echo "" - PARAMS[-1]=${PARAMS[-1]%?} - PARAM_NUMS[-1]=${PARAM_NUMS[-1]%?} + PARAMS[-1]=${PARAMS[-1]%?} + PARAM_NUMS[-1]=${PARAM_NUMS[-1]%?} - sed -i "s/public $BASECLASSNAME/public $BASECLASSNAME<$CLASSNAME, $RESIDUAL_DIM, ${PARAM_NUMS[*]}>/g" "$NAME_H_PATH" - sed -i "/virtual \~$CLASSNAME/a\ \n\ \/\*\* \brief : compute the residual from the state blocks being iterated by the solver.\n \ \*\*\/\n\ template<typename T>\n\ bool operator ()(${PARAMS[*]}, T* _residuals) const;\n" "$NAME_H_PATH" - sed -i "/\} \/\/ namespace wolf/a\ \n\/\/ Include here all headers for this class\n\/\/\#include <YOUR_HEADERS.h>\n\nnamespace wolf\n\{\n\ntemplate<typename T> bool $CLASSNAME::operator ()(${PARAMS[*]}, T* _residuals) const\n\{\n std::cout << \"\\033[1;33m [WARN]:\\033[0m ${CLASSNAME}::operator () is empty.\" << std::endl;\n \/\/ TODO: Implement\n return true;\n\}\n\n\} \/\/ namespace wolf" "$NAME_H_PATH" + sed -i "s/public $BASECLASSNAME/public $BASECLASSNAME<$CLASSNAME, $RESIDUAL_DIM, ${PARAM_NUMS[*]}>/g" "$NAME_H_PATH" + sed -i "/virtual \~$CLASSNAME/a\ \n\ \/\*\* \brief : compute the residual from the state blocks being iterated by the solver.\n \ \*\*\/\n\ template<typename T>\n\ bool operator ()(${PARAMS[*]}, T* _residuals) const;\n" "$NAME_H_PATH" + sed -i "/\} \/\/ namespace wolf/a\ \n\/\/ Include here all headers for this class\n\/\/\#include <YOUR_HEADERS.h>\n\nnamespace wolf\n\{\n\ntemplate<typename T> bool $CLASSNAME::operator ()(${PARAMS[*]}, T* _residuals) const\n\{\n std::cout << \"\\033[1;33m [WARN]:\\033[0m ${CLASSNAME}::operator () is empty.\" << std::endl;\n \/\/ TODO: Implement\n return true;\n\}\n\n\} \/\/ namespace wolf" "$NAME_H_PATH" } fillWithBaseVirtualMethods() { - if ! [ -z $BASE_DERIVES_FROM_AUTODIFF ] ; - then - echo "${YELLOW} [ WARN]: Base class $BASECLASSNAME derives from AUTODIFF template. New .h and .cpp files are left without inherited functions." - else - - if [[ $BASECLASSNAME =~ .*ConstraintAutodiff*. ]] ; - then - addAutodiffSpecifics - else - # Get base class - H_TXT=$(cat $BASE_H_PATH) - H_TXT="${H_TXT##*class $BASECLASSNAME :}" - BASECLASS_TXT="${H_TXT%%\n\};*}" - - echo "class $BASECLASSNAME :$BASECLASS_TXT };" > "${WOLF_SCRIPTS_PATH}"/class.h - - # H file Get Virtual function declarations with help - sed -e '/./{H;$!d;}' -e 'x;/ = 0;/!d;' "${WOLF_SCRIPTS_PATH}"/class.h > "${WOLF_SCRIPTS_PATH}"/tmp.h - sed -r 's/'" = 0"'//g' "${WOLF_SCRIPTS_PATH}"/tmp.h > "${WOLF_SCRIPTS_PATH}"/tmp2.h - sed -i -e "/virtual \~$CLASSNAME/r ${WOLF_SCRIPTS_PATH}/tmp2.h" "$NAME_H_PATH" - rm "${WOLF_SCRIPTS_PATH}"/tmp.h - rm ${WOLF_SCRIPTS_PATH}/tmp2.h + if ! [ -z $BASE_DERIVES_FROM_AUTODIFF ] ; + then + echo "${YELLOW} [ WARN]: Base class $BASECLASSNAME derives from AUTODIFF template. New .h and .cpp files are left without inherited functions." + else + if [[ $BASECLASSNAME =~ .*ConstraintAutodiff*. ]] ; + then + addAutodiffSpecifics + else + # Get base class + H_TXT=$(cat $BASE_H_PATH) + H_TXT="${H_TXT##*class $BASECLASSNAME :}" + BASECLASS_TXT="${H_TXT%%\n\};*}" + + echo "class $BASECLASSNAME :$BASECLASS_TXT };" > "${WOLF_SCRIPTS_PATH}"/class.h + + # H file Get Virtual function declarations with help + sed -e '/./{H;$!d;}' -e 'x;/ = 0;/!d;' "${WOLF_SCRIPTS_PATH}"/class.h > "${WOLF_SCRIPTS_PATH}"/tmp.h + sed -r 's/'" = 0"'//g' "${WOLF_SCRIPTS_PATH}"/tmp.h > "${WOLF_SCRIPTS_PATH}"/tmp2.h + sed -i -e "/virtual \~$CLASSNAME/r ${WOLF_SCRIPTS_PATH}/tmp2.h" "$NAME_H_PATH" + rm "${WOLF_SCRIPTS_PATH}"/tmp.h + rm ${WOLF_SCRIPTS_PATH}/tmp2.h - # CPP file - FuncInBase=$(grep -e " = 0;" -e "=0;" "${WOLF_SCRIPTS_PATH}/class.h") - rm "${WOLF_SCRIPTS_PATH}"/class.h + # CPP file + FuncInBase=$(grep -e " = 0;" -e "=0;" "${WOLF_SCRIPTS_PATH}/class.h") + rm "${WOLF_SCRIPTS_PATH}"/class.h - D=";" #Multi Character Delimiter - FuncList=($(echo $FuncInBase | sed -e 's/'"$D"'/\n/g' | while read line; do echo $line | sed 's/[\t ]/'"$D"'/g'; done)) - - for (( idx = $((${#FuncList[@]}-1)); idx > -1; idx-- )); do - TMP=$(echo ${FuncList[idx]} | sed -r 's/'"$D"'/ /g') - TMP=$(echo $TMP | sed -r 's/'"virtual"'/ /g') - TMP=$(echo $TMP | sed -r 's/'"=0"'/ /g') - TMP=$(echo $TMP | sed -r 's/'" = 0"'/ /g') - TXTH=${TMP%$TMP##*[![:space:]]} - TXTCPP_3=$(echo $TXTH | sed 's/.*(//g') - TXTCPP_2=$(echo $TXTH | sed 's/(.*//g' | sed 's/.* //g') - TXTCPP_1=$(echo $TXTH | sed 's/'"$TXTCPP_2"'.*//g') + D=";" #Multi Character Delimiter + FuncList=($(echo $FuncInBase | sed -e 's/'"$D"'/\n/g' | while read line; do echo $line | sed 's/[\t ]/'"$D"'/g'; done)) + + for (( idx = $((${#FuncList[@]}-1)); idx > -1; idx-- )); do + TMP=$(echo ${FuncList[idx]} | sed -r 's/'"$D"'/ /g') + TMP=$(echo $TMP | sed -r 's/'"virtual"'/ /g') + TMP=$(echo $TMP | sed -r 's/'"=0"'/ /g') + TMP=$(echo $TMP | sed -r 's/'" = 0"'/ /g') + TXTH=${TMP%$TMP##*[![:space:]]} + TXTCPP_3=$(echo $TXTH | sed 's/.*(//g') + TXTCPP_2=$(echo $TXTH | sed 's/(.*//g' | sed 's/.* //g') + TXTCPP_1=$(echo $TXTH | sed 's/'"$TXTCPP_2"'.*//g') - # CPP file - TXTCPP_3=$(echo "$TXTCPP_3" | sed -r 's/\*\*+/XXXX/g') ## remove ** - TXTCPP_3=$(echo "$TXTCPP_3" | sed -r 's/\*+/YYYY/g') ## remove * - sed -i "/\} \/\/ namespace wolf/i ${TXTCPP_1}${CLASSNAME}::${TXTCPP_2}(${TXTCPP_3}" "$NAME_CPP_PATH" - if ! [[ $TXTCPP_1 =~ .*void*. ]] - then - sed -i "/${CLASSNAME}::${TXTCPP_2}(${TXTCPP_3}/a \{\n std::cout << \"\\033[1;33m [WARN]:\\033[0m ${CLASSNAME}::${TXTCPP_2} is empty.\" << std::endl;\n ${TXTCPP_1}return_var\{\}; \/\/TODO: fill this variable\n return return_var;\n\}\n" "$NAME_CPP_PATH" - else - sed -i "/${CLASSNAME}::${TXTCPP_2}(${TXTCPP_3}/a \{\n std::cout << \"\\033[1;33m [WARN]:\\033[0m ${CLASSNAME}::${TXTCPP_2} is empty.\" << std::endl;\n\}\n" "$NAME_CPP_PATH" - fi - sed -i -r 's/'"XXXX"'/'"**"'/g' "$NAME_CPP_PATH" # add again ** - sed -i -r 's/'"YYYY"'/'"*"'/g' "$NAME_CPP_PATH" # add again * - done - fi - fi + # CPP file + if ! [[ ${TXTCPP_2:0:1} == "_" ]] ## Avoid considering lines where its just a part of the declaration with initial input params _aa" + then + TXTCPP_3=$(echo "$TXTCPP_3" | sed -r 's/\*\*+/XXXX/g') ## remove ** + TXTCPP_3=$(echo "$TXTCPP_3" | sed -r 's/\*+/YYYY/g') ## remove * + sed -i "/\} \/\/ namespace wolf/i ${TXTCPP_1}${CLASSNAME}::${TXTCPP_2}(${TXTCPP_3}" "$NAME_CPP_PATH" + if ! [[ $TXTCPP_1 =~ .*void*. ]] + then + sed -i "/${CLASSNAME}::${TXTCPP_2}(${TXTCPP_3}/a \{\n std::cout << \"\\033[1;33m [WARN]:\\033[0m ${CLASSNAME}::${TXTCPP_2} is empty.\" << std::endl;\n ${TXTCPP_1}return_var\{\}; \/\/TODO: fill this variable\n return return_var;\n\}\n" "$NAME_CPP_PATH" + else + sed -i "/${CLASSNAME}::${TXTCPP_2}(${TXTCPP_3}/a \{\n std::cout << \"\\033[1;33m [WARN]:\\033[0m ${CLASSNAME}::${TXTCPP_2} is empty.\" << std::endl;\n\}\n" "$NAME_CPP_PATH" + fi + sed -i -r 's/'"XXXX"'/'"**"'/g' "$NAME_CPP_PATH" # add again ** + sed -i -r 's/'"YYYY"'/'"*"'/g' "$NAME_CPP_PATH" # add again * + fi + done + fi + fi } updateCMakeLists() { - CML_PATH="${WOLF_ROOT}/src/${TYPE}s/CMakeLists.txt" + CML_PATH="${WOLF_ROOT}/src/${TYPE}s/CMakeLists.txt" - # Add Header source - Hsources=( $(grep -e ".h" "${CML_PATH}") ) - NewH="\${CMAKE_CURRENT_SOURCE_DIR}/$NAME.h" - - # Check if already exists - EXISTS=0 - for (( idx = 0; idx < ${#Hsources[@]}; idx++ )); do - if [ "${Hsources[idx]}" == "\${CMAKE_CURRENT_SOURCE_DIR}/"$NAME".h" ] ; - then - EXISTS=1 - fi - done - - if [ $EXISTS == 0 ] ; - then - Hsources=( "${Hsources[@]}" $NewH ) - IFS=$'\n' - sorted=($(sort <<<"${Hsources[*]}")) - unset IFS - SET_AFTER_POS=-2 + # Add Header source + NewH="\${CMAKE_CURRENT_SOURCE_DIR}/$NAME.h" + + # get file names after conditionals ENDIF is the match + sed '1,/ENDIF/d' "${CML_PATH}" > "${WOLF_SCRIPTS_PATH}"/tmp.h + Hsources=( $(grep -e "\.h" "${WOLF_SCRIPTS_PATH}"/tmp.h) ) + rm "${WOLF_SCRIPTS_PATH}"/tmp.h + + # Check if already exists + EXISTS=0 + for (( idx = 0; idx < ${#Hsources[@]}; idx++ )); do + if [ "${Hsources[idx]}" == "\${CMAKE_CURRENT_SOURCE_DIR}/"$NAME".h" ] ; + then + EXISTS=1 + fi + done + + if [ $EXISTS == 0 ] ; + then + Hsources=( "${Hsources[@]}" $NewH ) + IFS=$'\n' + sorted=($(sort <<<"${Hsources[*]}")) + unset IFS + SET_AFTER_POS=-2 - for (( idx = 0; idx < ${#sorted[@]}; idx++ )); do - if [ "${sorted[idx]}" == "\${CMAKE_CURRENT_SOURCE_DIR}/"$NAME".h" ] ; - then - SET_AFTER_POS=$(( idx-1 )) - if [ $SET_AFTER_POS == -1 ] ; - then - if [ ${#sorted[@]} == 1 ] ; - then - sed -i "\%HDRS_CONSTRAINT%a \ \${CMAKE_CURRENT_SOURCE_DIR}/$NAME.h" "$CML_PATH" - else - sed -i "\%${sorted[1]}%i \ \${CMAKE_CURRENT_SOURCE_DIR}/$NAME.h" "$CML_PATH" - fi - else - sed -i "\%${sorted[$SET_AFTER_POS]}%a \ \${CMAKE_CURRENT_SOURCE_DIR}/$NAME.h" "$CML_PATH" - fi - fi - done + for (( idx = 0; idx < ${#sorted[@]}; idx++ )); do + if [ "${sorted[idx]}" == "\${CMAKE_CURRENT_SOURCE_DIR}/"$NAME".h" ] ; + then + SET_AFTER_POS=$(( idx-1 )) + if [ $SET_AFTER_POS == -1 ] ; + then + if [ ${#sorted[@]} == 1 ] ; + then + sed -i "\%HDRS_CONSTRAINT%a \ \${CMAKE_CURRENT_SOURCE_DIR}/$NAME.h" "$CML_PATH" + else + sed -i "\%${sorted[1]}%i \ \${CMAKE_CURRENT_SOURCE_DIR}/$NAME.h" "$CML_PATH" + fi + else + sed -i "\%${sorted[$SET_AFTER_POS]}%a \ \${CMAKE_CURRENT_SOURCE_DIR}/$NAME.h" "$CML_PATH" + fi + fi + done - if ! [[ $BASECLASSNAME =~ .*ConstraintAutodiff*. ]] ; - then - # Add CPP source - Hsources=( $(grep -e ".cpp" "${CML_PATH}") ) - NewCPP="\${CMAKE_CURRENT_SOURCE_DIR}/$NAME.cpp" - Hsources=( "${Hsources[@]}" $NewCPP ) - IFS=$'\n' - sorted=($(sort <<<"${Hsources[*]}")) - unset IFS - SET_AFTER_POS=-2 + if ! [[ $BASECLASSNAME =~ .*ConstraintAutodiff*. ]] ; + then + # Add CPP source + NewCPP="\${CMAKE_CURRENT_SOURCE_DIR}/$NAME.cpp" - for (( idx = 0; idx < ${#sorted[@]}; idx++ )); do - if [ "${sorted[idx]}" == "\${CMAKE_CURRENT_SOURCE_DIR}/"$NAME".cpp" ] ; - then - SET_AFTER_POS=$(( idx-1 )) - if [ $SET_AFTER_POS == -1 ] ; - then - if [ ${#sorted[@]} == 1 ] ; - then - sed -i "\%SRCS_CONSTRAINT%a \ \${CMAKE_CURRENT_SOURCE_DIR}/$NAME.cpp" "$CML_PATH" - else - sed -i "\%${sorted[1]}%i \ \${CMAKE_CURRENT_SOURCE_DIR}/$NAME.cpp" "$CML_PATH" - fi - else - sed -i "\%${sorted[$SET_AFTER_POS]}%a \ \${CMAKE_CURRENT_SOURCE_DIR}/$NAME.cpp" "$CML_PATH" - fi - fi - done - fi - echo "$CML_PATH" - else - echo "" - fi + # get file names after conditionals ENDIF is the match + sed '1,/ENDIF/d' "${CML_PATH}" > "${WOLF_SCRIPTS_PATH}"/tmp.h + Hsources=( $(grep -e "\.cpp" "${WOLF_SCRIPTS_PATH}"/tmp.h) ) + rm "${WOLF_SCRIPTS_PATH}"/tmp.h + Hsources=( "${Hsources[@]}" $NewCPP ) + + IFS=$'\n' + sorted=($(sort <<<"${Hsources[*]}")) + unset IFS + SET_AFTER_POS=-2 + + for (( idx = 0; idx < ${#sorted[@]}; idx++ )); do + if [ "${sorted[idx]}" == "\${CMAKE_CURRENT_SOURCE_DIR}/"$NAME".cpp" ] ; + then + SET_AFTER_POS=$(( idx-1 )) + if [ $SET_AFTER_POS == -1 ] ; + then + if [ ${#sorted[@]} == 1 ] ; + then + sed -i "\%SRCS_CONSTRAINT%a \ \${CMAKE_CURRENT_SOURCE_DIR}/$NAME.cpp" "$CML_PATH" + else + sed -i "\%${sorted[1]}%i \ \${CMAKE_CURRENT_SOURCE_DIR}/$NAME.cpp" "$CML_PATH" + fi + else + sed -i "\%${sorted[$SET_AFTER_POS]}%a \ \${CMAKE_CURRENT_SOURCE_DIR}/$NAME.cpp" "$CML_PATH" + fi + fi + done + fi + echo "$CML_PATH" + else + echo "" + fi } createGtest() { - # ===== Create gtest file ===== - # Templates path - TEMPLATES_PATH=${WOLF_SCRIPTS_PATH}/templates - - # Set the include and class names on the template files - sed 's/header_file/'"${TYPE}s\/${NAME}.h"'/g' "${TEMPLATES_PATH}"/gtest_template.cpp > "${TEMPLATES_PATH}"/tmp.cpp - sed 's/class_name/'"${CLASSNAME}"'/g' "${TEMPLATES_PATH}"/tmp.cpp > "${TEMPLATES_PATH}"/tmp2.cpp - rm "${TEMPLATES_PATH}"/tmp.cpp - - FUNC_NAMES= - # Insert dummy tests for all methods - for (( idx = $((${#FuncList[@]}-1)); idx > -1; idx-- )); do - TMP=$(echo ${FuncList[idx]} | sed -r 's/'"$D"'/ /g') - TMP=$(echo $TMP | sed -r 's/'"virtual"'/ /g') - TMP=$(echo $TMP | sed -r 's/'"=0"'/ /g') - TMP=$(echo $TMP | sed -r 's/'" = 0"'/ /g') - TMP=${TMP%$TMP##*[![:space:]]} - TMP=$(echo $TMP | sed 's/(.*//g' | sed 's/.* //g') - if ! grep -q "$TMP" "${TEMPLATES_PATH}"/tmp2.cpp - then - sed -i "/\[Class methods\]/a TEST($CLASSNAME, $TMP)\n\{\n std::cout << \"\\033[1;33m [WARN]:\\033[0m gtest for ${CLASSNAME} ${TMP} is empty.\" << std::endl;\n\}\n" "${TEMPLATES_PATH}"/tmp2.cpp - fi - done - - GTEST_PATH="${WOLF_ROOT}"/src/test/gtest_${NAME}.cpp - mv "${TEMPLATES_PATH}"/tmp2.cpp $GTEST_PATH + # ===== Create gtest file ===== + # Templates path + TEMPLATES_PATH=${WOLF_SCRIPTS_PATH}/templates + + # Set the include and class names on the template files + sed 's/header_file/'"${TYPE}s\/${NAME}.h"'/g' "${TEMPLATES_PATH}"/gtest_template.cpp > "${TEMPLATES_PATH}"/tmp.cpp + sed 's/class_name/'"${CLASSNAME}"'/g' "${TEMPLATES_PATH}"/tmp.cpp > "${TEMPLATES_PATH}"/tmp2.cpp + rm "${TEMPLATES_PATH}"/tmp.cpp + + FUNC_NAMES= + # Insert dummy tests for all methods + for (( idx = $((${#FuncList[@]}-1)); idx > -1; idx-- )); do + TMP=$(echo ${FuncList[idx]} | sed -r 's/'"$D"'/ /g') + TMP=$(echo $TMP | sed -r 's/'"virtual"'/ /g') + TMP=$(echo $TMP | sed -r 's/'"=0"'/ /g') + TMP=$(echo $TMP | sed -r 's/'" = 0"'/ /g') + TMP=${TMP%$TMP##*[![:space:]]} + TMP=$(echo $TMP | sed 's/(.*//g' | sed 's/.* //g') + if ! grep -q "$TMP" "${TEMPLATES_PATH}"/tmp2.cpp + then + if ! [[ ${TMP:0:1} == "_" ]] ## Avoid considering lines where its just a part of the declaration with initial input params _aa" + then + sed -i "/\[Class methods\]/a TEST($CLASSNAME, $TMP)\n\{\n std::cout << \"\\033[1;33m [WARN]:\\033[0m gtest for ${CLASSNAME} ${TMP} is empty.\" << std::endl;\n\}\n" "${TEMPLATES_PATH}"/tmp2.cpp + fi + fi + done + + GTEST_PATH="${WOLF_ROOT}"/src/test/gtest_${NAME}.cpp + mv "${TEMPLATES_PATH}"/tmp2.cpp $GTEST_PATH } updateCMakeListsGTest() { - CML_GTEST_PATH="${WOLF_ROOT}/src/test/CMakeLists.txt" - - DERIVED_TXT=$(cat $CML_GTEST_PATH | sed '/^#/!d') - DERIVED_TXT="${DERIVED_TXT##*\# ------- Now Derived classes ----------}" - DERIVED_TXT="${DERIVED_TXT%%\# ------- Now Core classes Serialization ----------*}" - DERIVED_TXT=$(echo "$DERIVED_TXT" | sed '/^\s*$/d') - IFS=$'\n' - DERIVED_TXT=($(echo "$DERIVED_TXT" | sed -r 's/'"#\s"'/ /g')) - for (( idx = 0; idx < ${#DERIVED_TXT[@]}; idx++ )); do - DERIVED_TXT[idx]=${DERIVED_TXT[idx]#" "} - DERIVED_TXT[idx]=$(echo ${DERIVED_TXT[idx]} | sed 's/ .*//') - done - - New="${CLASSNAME}" - - # Check if already exists - EXISTS=0 - for (( idx = 0; idx < ${#DERIVED_TXT[@]}; idx++ )); do - if [ "${DERIVED_TXT[idx]}" == "$New" ] ; - then - EXISTS=1 - fi - done + CML_GTEST_PATH="${WOLF_ROOT}/src/test/CMakeLists.txt" + + DERIVED_TXT=$(cat $CML_GTEST_PATH | sed '/^#/!d') + DERIVED_TXT="${DERIVED_TXT##*\# ------- Now Derived classes ----------}" + DERIVED_TXT="${DERIVED_TXT%%\# ------- Now Core classes Serialization ----------*}" + DERIVED_TXT=$(echo "$DERIVED_TXT" | sed '/^\s*$/d') + IFS=$'\n' + DERIVED_TXT=($(echo "$DERIVED_TXT" | sed -r 's/'"#\s"'/ /g')) + for (( idx = 0; idx < ${#DERIVED_TXT[@]}; idx++ )); do + DERIVED_TXT[idx]=${DERIVED_TXT[idx]#" "} + DERIVED_TXT[idx]=$(echo ${DERIVED_TXT[idx]} | sed 's/ .*//') + done + + New="${CLASSNAME}" + + # Check if already exists + EXISTS=0 + for (( idx = 0; idx < ${#DERIVED_TXT[@]}; idx++ )); do + if [ "${DERIVED_TXT[idx]}" == "$New" ] ; + then + EXISTS=1 + fi + done - if [ $EXISTS == 0 ] ; - then - DERIVED_TXT=( "${DERIVED_TXT[@]}" $New ) - IFS=$'\n' - sorted=($(sort <<<"${DERIVED_TXT[*]}")) - unset IFS - SET_BEFORE_POS=-2 - for (( idx = 0; idx < ${#sorted[@]}; idx++ )); do - if [ "${sorted[idx]}" == "$New" ] ; - then - SET_BEFORE_POS=$(( idx+1 )) - if [ $SET_BEFORE_POS == ${#sorted[@]} ] ; - then - SET_BEFORE_POS=$(( idx )) - fi - fi - done - if [[ $SET_BEFORE_POS = $(( ${#sorted[@]}-1 )) ]] ; - then - sed -i "\%------- Now Core classes Serialization ----------%i # $New test\nwolf_add_gtest(gtest_$NAME gtest_$NAME.cpp)\ntarget_link_libraries(gtest_$NAME \$\{PROJECT_NAME\})\n" "${CML_GTEST_PATH}" - else - sed -i "\%${sorted[$SET_BEFORE_POS]}%i # $New test\nwolf_add_gtest(gtest_$NAME gtest_$NAME.cpp)\ntarget_link_libraries(gtest_$NAME \$\{PROJECT_NAME\})\n" "${CML_GTEST_PATH}" - fi - echo "$CML_GTEST_PATH" - else - echo "" + if [ $EXISTS == 0 ] ; + then + DERIVED_TXT=( "${DERIVED_TXT[@]}" $New ) + IFS=$'\n' + sorted=($(sort <<<"${DERIVED_TXT[*]}")) + unset IFS + SET_BEFORE_POS=-2 + for (( idx = 0; idx < ${#sorted[@]}; idx++ )); do + if [ "${sorted[idx]}" == "$New" ] ; + then + SET_BEFORE_POS=$(( idx+1 )) + if [ $SET_BEFORE_POS == ${#sorted[@]} ] ; + then + SET_BEFORE_POS=$(( idx )) + fi + fi + done + if [[ $SET_BEFORE_POS = $(( ${#sorted[@]}-1 )) ]] ; + then + sed -i "\%------- Now Core classes Serialization ----------%i # $New test\nwolf_add_gtest(gtest_$NAME gtest_$NAME.cpp)\ntarget_link_libraries(gtest_$NAME \$\{PROJECT_NAME\})\n" "${CML_GTEST_PATH}" + else + sed -i "\%${sorted[$SET_BEFORE_POS]}%i # $New test\nwolf_add_gtest(gtest_$NAME gtest_$NAME.cpp)\ntarget_link_libraries(gtest_$NAME \$\{PROJECT_NAME\})\n" "${CML_GTEST_PATH}" + fi + echo "$CML_GTEST_PATH" + else + echo "" fi } diff --git a/wolf_scripts/generic_func/user_menu.sh b/wolf_scripts/generic_func/user_menu.sh index f873d755b7fcbcd8ede51d52af06d0ceefc22dda..11c74a27a2b432efbdc91701e53354ed270d8e32 100755 --- a/wolf_scripts/generic_func/user_menu.sh +++ b/wolf_scripts/generic_func/user_menu.sh @@ -3,60 +3,60 @@ BASE= TYPE= while getopts ":t:n:b:" OPTION do - case ${OPTION} in - t) - TYPE=${OPTARG} - ;; - n) - NAME=${OPTARG} - ;; - b) - BASE=${OPTARG} - ;; - *) - showHelp - exit - ;; - esac + case ${OPTION} in + t) + TYPE=${OPTARG} + ;; + n) + NAME=${OPTARG} + ;; + b) + BASE=${OPTARG} + ;; + *) + showHelp + exit + ;; + esac done if [ -z "$TYPE" ] && [ -z "$NAME" ] && [ -z "$BASE" ] then - showHelp - exit + showHelp + exit fi if [ -z "$TYPE" ] ; then - echo "" - echo "${RED} [ERROR]: Missing TYPE value (-t).${NC}" - echo "" - showHelp - exit + echo "" + echo "${RED} [ERROR]: Missing TYPE value (-t).${NC}" + echo "" + showHelp + exit fi if [ -z "$NAME" ] ; then - echo "" - echo "${RED} [ERROR]: Missing NAME value (-n).${NC}" - echo "" - showHelp - exit + echo "" + echo "${RED} [ERROR]: Missing NAME value (-n).${NC}" + echo "" + showHelp + exit fi if [ -z "$BASE" ] ; then - echo "" - echo "${RED} [ERROR]: Missing BASE value (-b).${NC}" - echo "" - showHelp - exit + echo "" + echo "${RED} [ERROR]: Missing BASE value (-b).${NC}" + echo "" + showHelp + exit fi -if ! [ "$TYPE" == "capture" ] && ! [ "$TYPE" == "constraint" ] && ! [ "$TYPE" == "feature" ] && ! [ "$TYPE" == "processor" ] && ! [ "$TYPE" == "sensor" ] +if ! [ "$TYPE" == "capture" ] && ! [ "$TYPE" == "constraint" ] && ! [ "$TYPE" == "feature" ] && ! [ "$TYPE" == "landmark" ] && ! [ "$TYPE" == "processor" ] && ! [ "$TYPE" == "sensor" ] then - echo "" - echo "${RED} --> Incorrect type \"$TYPE\". Please check the following instructions: ${NC}" - echo "" - showHelp - exit 1 + echo "" + echo "${RED} --> Incorrect type \"$TYPE\". Please check the following instructions: ${NC}" + echo "" + showHelp + exit 1 fi NAME=$(LowerCase $NAME) @@ -81,12 +81,12 @@ BASECLASSNAME=$TYPE_CAP1$(echo "$(echo "$BASECLASSNAME" | sed 's/.*/\u&/')") if ! [[ $NAME =~ $TYPE ]] ; then - if [[ $BASE =~ .*base*. ]] ; - then - NAME="$TYPE"_"$NAME"; - else - NAME="$TYPE"_"$BASE"_"$NAME"; - fi + if [[ $BASE =~ .*base*. ]] ; + then + NAME="$TYPE"_"$NAME"; + else + NAME="$TYPE"_"$BASE"_"$NAME"; + fi fi if ! [[ $BASE =~ $TYPE ]] ; then diff --git a/wolf_scripts/wolf_create.sh b/wolf_scripts/wolf_create.sh index caa95ec03ee55f33da3409daef37a1598b498db1..e5f4184f686a012009a81a6724811847ff353cb3 100755 --- a/wolf_scripts/wolf_create.sh +++ b/wolf_scripts/wolf_create.sh @@ -33,10 +33,10 @@ echo "- Generating CPP and H files." BASE_H_PATH=$(getFilePath $BASE.h) if [ -z "$BASE_H_PATH" ] then - echo "" - echo "${RED} [ERROR]: Cannot find header file for base class ${BASE}.${NC}" - echo "" - exit + echo "" + echo "${RED} [ERROR]: Cannot find header file for base class ${BASE}.${NC}" + echo "" + exit fi # Create Header and CPP files @@ -56,9 +56,10 @@ echo "- Modifying CMakeLists.txt to include CPP and H files." DONE=$(updateCMakeLists) if [ -z "$DONE" ] then - echo "${YELLOW} \--x [WARN]: Not necessary. File entries already existing in CMakeLists.txt.${NC}" + echo "${YELLOW} \--x [WARN]: Not necessary. File entries already existing in CMakeLists.txt.${NC}" else - echo "${GREEN} \--> Updated ${DONE} file.${NC}" + echo "${GREEN} \--> Updated ${DONE} file.${NC}" + echo "${YELLOW} \--> [WARN] Consider adding conditional clues [IF/ELSE] in the CMakeLists.txt if you use external dependencies, hence avoiding compilation if you don't have them installed${NC}" fi # ===== Create gtest ===== @@ -79,9 +80,10 @@ echo "- Modifying CMakeLists.txt to include gtest files." DONE=$(updateCMakeListsGTest) if [ -z "$DONE" ] then - echo "${YELLOW} \--x [WARN]: Not necessary. gtest file entry already existing in CMakeLists.txt.${NC}" + echo "${YELLOW} \--x [WARN]: Not necessary. gtest file entry already existing in CMakeLists.txt.${NC}" else - echo "${GREEN} \--> Updated ${DONE} file.${NC}" + echo "${GREEN} \--> Updated ${DONE} file.${NC}" + echo "${YELLOW} \--> [WARN] Consider adding conditional clues [IF/ELSE] in the CMakeLists.txt if you use external dependencies, hence avoiding compilation if you don't have them installed${NC}" fi #============================================