Skip to content

Commit

Permalink
Support of optional members in python (#245)
Browse files Browse the repository at this point in the history
* Refs #19659. Add optional support

Signed-off-by: Ricardo González Moreno <ricardo@richiware.dev>

* Refs #19659. Remove namespace from generated python's container

Signed-off-by: Ricardo González Moreno <ricardo@richiware.dev>

* Refs #19659. Support container of enum

Signed-off-by: Ricardo González Moreno <ricardo@richiware.dev>

* Refs #19659. Improve Swig Cmake

Signed-off-by: Ricardo González Moreno <ricardo@richiware.dev>

---------

Signed-off-by: Ricardo González Moreno <ricardo@richiware.dev>
  • Loading branch information
richiware committed Oct 24, 2023
1 parent 7df0be7 commit e1de642
Show file tree
Hide file tree
Showing 2 changed files with 50 additions and 17 deletions.
Original file line number Diff line number Diff line change
Expand Up @@ -43,10 +43,23 @@ $ctx.directIncludeDependencies : {include | %include "$include$.i"}; separator="
#include <fastdds/dds/core/LoanableSequence.hpp>
%}

%import(module="fastdds") "fastcdr/xcdr/optional.hpp"
%import(module="fastdds") "fastdds/dds/core/LoanableCollection.hpp"
%import(module="fastdds") "fastdds/dds/core/LoanableTypedCollection.hpp"
%import(module="fastdds") "fastdds/dds/core/LoanableSequence.hpp"

%define %traits_penumn(Type...)
%fragment(SWIG_Traits_frag(Type),"header",
fragment="StdTraits") {
namespace swig {
template <> struct traits< Type > {
typedef value_category category;
static const char* type_name() { return #Type; }
};
}
}
%enddef

$definitions; separator="\n"$

// Include the class interfaces
Expand Down Expand Up @@ -103,13 +116,13 @@ $struct.members : { member | $member_getters(struct_name=struct.scopedname, memb

>>

template_sequence_name(typecode) ::= <<
template_sequence_name(typecode) ::= <%
$if(typecode.isSequenceType)$
$template_sequence_name(typecode.contentTypeCode)$_vector
$else$
$typecode.formatedCppTypename$_vector
$typecode.noScopedCppTypename$_vector
$endif$
>>
%>

template_sequence(typecode) ::= <<
$if(typecode.contentTypeCode.isSequenceType)$
Expand All @@ -126,10 +139,25 @@ $if(!typecode.contentTypeCode.isType_7)$
$endif$
$endif$

%template($template_sequence_name(typecode.contentTypeCode)$) std::vector<$typecode.contentTypeCode.cppTypename$>;
%template($template_sequence_name(typecode.contentTypeCode)$) std::vector<$if(typecode.contentTypeCode.isEnumType)$enum $endif$$typecode.contentTypeCode.cppTypename$>;
>>

member_getters(struct_name, member) ::= <<
$if(member.annotationOptional)$
%ignore eprosima::fastcdr::optional::value;
%ignore eprosima::fastcdr::optional::reset;
%template($member.typecode.noScopedCppTypename$Opt) eprosima::fastcdr::optional<$member.typecode.cppTypename$>;
%extend eprosima::fastcdr::optional<$member.typecode.cppTypename$> {
$member.typecode.cppTypename$ get_value() const {
return \$self->value();
}

void set_value(const $member.typecode.cppTypename$& value) {
*\$self = value;
}
}
$endif$

%ignore $struct_name$::$member.name$($member.typecode.cppTypename$&&);

// Overloaded getter methods shadow each other and are equivalent in python
Expand All @@ -140,14 +168,14 @@ $if(member.typecode.isSequenceType)$
$template_sequence(member.typecode)$
$elseif(member.typecode.isMapType)$
%ignore $struct_name$::$member.name$() const;
%template($member.typecode.keyTypeCode.name$_$member.typecode.valueTypeCode.cppTypename$_map) std::map<$member.typecode.keyTypeCode.cppTypename$,$member.typecode.valueTypeCode.cppTypename$>;
%template($member.typecode.keyTypeCode.name$_$member.typecode.valueTypeCode.cppTypename$_map) std::map<$if(member.typecode.keyTypeCode.isEnumType)$enum $endif$$member.typecode.keyTypeCode.cppTypename$,$if(member.typecode.valueTypeCode.isEnumType)$enum $endif$$member.typecode.valueTypeCode.cppTypename$>;
$elseif(member.typecode.isType_f)$
%ignore $struct_name$::$member.name$() const;
%template($member.typecode.contentTypeCode.formatedCppTypename$_$member.typecode.dimensions$_array) std::array<$member.typecode.contentTypeCode.cppTypename$,$member.typecode.dimensions$>;
%template($member.typecode.contentTypeCode.noScopedCppTypename$_$member.typecode.dimensions$_array) std::array<$if(member.typecode.contentTypeCode.isEnumType)$enum $endif$$member.typecode.contentTypeCode.cppTypename$,$member.typecode.dimensions$>;
$if(member.typecode.contentTypeCode.primitive)$
%extend std::array<$member.typecode.contentTypeCode.cppTypename$, $member.typecode.dimensions$>
%extend std::array<$if(member.typecode.contentTypeCode.isEnumType)$enum $endif$$member.typecode.contentTypeCode.cppTypename$, $member.typecode.dimensions$>
{
const $member.typecode.contentTypeCode.cppTypename$* get_buffer() const
const $if(member.typecode.contentTypeCode.isEnumType)$enum $endif$$member.typecode.contentTypeCode.cppTypename$* get_buffer() const
{
return self->data();
}
Expand Down Expand Up @@ -189,7 +217,9 @@ bitset_type(ctx, parent, bitset, extensions) ::= <<
>>

// Enums are ported as constants in the target language
enum_type(ctx, parent, enum) ::= <<>>
enum_type(ctx, parent, enum) ::= <<
%traits_penumn(enum $enum.cppTypename$);
>>

// bitmasks are implemented as enums. Therefore, are ported as constants in the target language
bitmask_type(ctx, parent, bitmask) ::= <<>>
Expand Down
19 changes: 11 additions & 8 deletions src/main/java/com/eprosima/fastdds/idl/templates/SwigCMake.stg
Original file line number Diff line number Diff line change
Expand Up @@ -53,16 +53,23 @@ set(\${PROJECT_NAME}_FILES
$project.name$PubSubTypes.cxx
)

include_directories()

set(CMAKE_POSITION_INDEPENDENT_CODE ON)

#Create library for C++ types
add_library(\${PROJECT_NAME} SHARED \${\${PROJECT_NAME}_FILES})
if(WIN32)
target_compile_definitions(\${PROJECT_NAME} PRIVATE EPROSIMA_USER_DLL_EXPORT)
endif(WIN32)
target_link_libraries(\${PROJECT_NAME} PUBLIC fastcdr fastrtps)
set_property(TARGET \${PROJECT_NAME} PROPERTY CXX_STANDARD 11)
target_include_directories(\${PROJECT_NAME} PUBLIC
\${PROJECT_SOURCE_DIR}
)
target_link_libraries(\${PROJECT_NAME}
PUBLIC
fastcdr
fastrtps
$project.dependencies : { dep | $dep$}; separator=" "$
)

###############################################################################
# Python bindings for type
Expand Down Expand Up @@ -92,17 +99,14 @@ SET_SOURCE_FILES_PROPERTIES(
USE_TARGET_INCLUDE_DIRECTORIES TRUE
)

include_directories(
\${PROJECT_SOURCE_DIR}
)

set_property(SOURCE \${PROJECT_NAME}.i PROPERTY OUTPUT_DIR "\${CMAKE_CURRENT_BINARY_DIR}/$project.context.lastStructure.typeCode.namespaces : { ns | $ns$}; separator="/"$")

SWIG_ADD_LIBRARY(\${\${PROJECT_NAME}_MODULE}
TYPE SHARED
LANGUAGE python
SOURCES \${\${PROJECT_NAME}_MODULE_FILES})

set_property(TARGET \${\${PROJECT_NAME}_MODULE} PROPERTY CXX_STANDARD 11)
if(UNIX AND CMAKE_SIZEOF_VOID_P EQUAL 8)
set_property(TARGET \${\${PROJECT_NAME}_MODULE} PROPERTY SWIG_COMPILE_DEFINITIONS SWIGWORDSIZE64)
endif()
Expand All @@ -111,7 +115,6 @@ target_link_libraries(\${\${PROJECT_NAME}_MODULE}
Python3::Module
fastrtps
\${PROJECT_NAME}
$project.dependencies : { dep | $dep$}; separator=" "$
)

set_target_properties(\${\${PROJECT_NAME}_MODULE}
Expand Down

0 comments on commit e1de642

Please sign in to comment.