Skip to content
Snippets Groups Projects
Commit 0b64f392 authored by Joan Solà Ortega's avatar Joan Solà Ortega
Browse files

Merge branch 'update_scripts' into 'master'

Update scripts

See merge request mobile_robotics/wolf!225
parents 27cf6fc1 01f36d02
No related branches found
No related tags found
1 merge request!225Update scripts
......@@ -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
......
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)
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)
......
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)
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
#include "landmark_point_3D.h"
#include "landmarks/landmark_point_3D.h"
namespace wolf {
......
File moved
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)
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)
......@@ -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)
......
......@@ -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
......@@ -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
}
......
......@@ -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
......
......@@ -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
#============================================
......
0% Loading or .
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment