Skip to content

Commit

Permalink
traits
Browse files Browse the repository at this point in the history
  • Loading branch information
dirk-thomas committed Nov 25, 2018
1 parent 84ee0a9 commit 6f7dc95
Show file tree
Hide file tree
Showing 3 changed files with 61 additions and 6 deletions.
27 changes: 22 additions & 5 deletions rosidl_generator_cpp/resource/idl__traits.hpp.em
Original file line number Diff line number Diff line change
Expand Up @@ -17,6 +17,8 @@ include_parts = [package_name] + list(interface_path.parents[0].parts) + \
include_base = '/'.join(include_parts)
header_guard_variable = '__'.join([x.upper() for x in include_parts]) + \
'__TRAITS_HPP_'

include_directives = set()
}@

#ifndef @(header_guard_variable)
Expand All @@ -37,7 +39,8 @@ from rosidl_parser.definition import Message
@{
TEMPLATE(
'msg__traits.hpp.em',
package_name=package_name, interface_path=interface_path, message=message)
package_name=package_name, interface_path=interface_path, message=message,
include_directives=include_directives)
}@

@[end for]@
Expand All @@ -49,6 +52,20 @@ TEMPLATE(
from rosidl_parser.definition import Service
}@
@[for service in content.get_elements_of_type(Service)]@
@{
TEMPLATE(
'msg__traits.hpp.em',
package_name=package_name, interface_path=interface_path,
message=service.request_message, include_directives=include_directives)
}@

@{
TEMPLATE(
'msg__traits.hpp.em',
package_name=package_name, interface_path=interface_path,
message=service.response_message, include_directives=include_directives)
}@

@{
TEMPLATE(
'srv__traits.hpp.em',
Expand All @@ -68,21 +85,21 @@ from rosidl_parser.definition import Action
TEMPLATE(
'msg__traits.hpp.em',
package_name=package_name, interface_path=interface_path,
message=action.goal_request)
message=action.goal_request, include_directives=include_directives)
}@

@{
TEMPLATE(
'msg__traits.hpp.em',
package_name=package_name, interface_path=interface_path,
message=action.result_response)
message=action.result_response, include_directives=include_directives)
}@

@{
TEMPLATE(
'msg__traits.hpp.em',
package_name=package_name, interface_path=interface_path,
message=action.feedback)
message=action.feedback, include_directives=include_directives)
}@

@{
Expand All @@ -103,7 +120,7 @@ TEMPLATE(
TEMPLATE(
'msg__traits.hpp.em',
package_name=package_name, interface_path=interface_path,
message=action.feedback_message)
message=action.feedback_message, include_directives=include_directives)
}@

@[end for]@
Expand Down
1 change: 0 additions & 1 deletion rosidl_generator_cpp/resource/msg__struct.hpp.em
Original file line number Diff line number Diff line change
Expand Up @@ -25,7 +25,6 @@ from collections import OrderedDict
from rosidl_cmake import convert_camel_case_to_lower_case_underscore
includes = OrderedDict()
for member in message.structure.members:
print('// member:', member.name)
type_ = member.type
if isinstance(type_, NestedType):
type_ = type_.basetype
Expand Down
39 changes: 39 additions & 0 deletions rosidl_generator_cpp/resource/msg__traits.hpp.em
Original file line number Diff line number Diff line change
Expand Up @@ -9,6 +9,45 @@ from rosidl_parser.definition import UnboundedSequence
message_typename = '::'.join(message.structure.type.namespaces + [message.structure.type.name])
}@
@
@#<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<
@# Collect necessary include directives for all members
@{
from collections import OrderedDict
from rosidl_cmake import convert_camel_case_to_lower_case_underscore
includes = OrderedDict()
for member in message.structure.members:
type_ = member.type
if isinstance(type_, Array):
type_ = type_.basetype
if isinstance(type_, NamespacedType):
filename_prefix = convert_camel_case_to_lower_case_underscore(type_.name)
if filename_prefix.endswith('__feedback'):
filename_prefix = filename_prefix[:-10]
member_names = includes.setdefault(
'/'.join((type_.namespaces + [filename_prefix])) + '__traits.hpp', [])
member_names.append(member.name)
}@
@#>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
@
@#<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<
@[if includes]@
// Include directives for member types
@[ for header_file, member_names in includes.items()]@
@[ for member_name in member_names]@
// Member '@(member_name)'
@[ end for]@
@[ if header_file in include_directives]@
// already included above
// @
@[ else]@
@{include_directives.add(header_file)}@
@[ end if]@
#include "@(header_file)"
@[ end for]@

@[end if]@
@#>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
@
namespace rosidl_generator_traits
{

Expand Down

0 comments on commit 6f7dc95

Please sign in to comment.