Skip to content

Commit 30877f5

Browse files
Add static_cast (#884)
Signed-off-by: Michael Carlstrom <[email protected]>
1 parent 4094371 commit 30877f5

File tree

2 files changed

+50
-45
lines changed

2 files changed

+50
-45
lines changed

rosidl_generator_cpp/resource/msg__struct.hpp.em

Lines changed: 2 additions & 42 deletions
Original file line numberDiff line numberDiff line change
@@ -5,6 +5,8 @@ from rosidl_generator_cpp import escape_string
55
from rosidl_generator_cpp import escape_wstring
66
from rosidl_generator_cpp import msg_type_to_cpp
77
from rosidl_generator_cpp import MSG_TYPE_TO_CPP
8+
from rosidl_generator_cpp import generate_zero_string
9+
from rosidl_generator_cpp import generate_default_string
810
from rosidl_parser.definition import AbstractNestedType
911
from rosidl_parser.definition import AbstractString
1012
from rosidl_parser.definition import AbstractWString
@@ -108,48 +110,6 @@ struct @(message.structure.namespaced_type.name)_
108110
# http://design.ros2.org/articles/generated_interfaces_cpp.html#constructors
109111
# for a detailed explanation of the different _init parameters.
110112
init_list, alloc_list, member_list = create_init_alloc_and_member_lists(message)
111-
112-
def generate_default_string(membset):
113-
from rosidl_generator_cpp import msg_type_only_to_cpp
114-
from rosidl_generator_cpp import msg_type_to_cpp
115-
strlist = []
116-
for member in membset.members:
117-
if member.default_value is not None:
118-
if member.num_prealloc > 0:
119-
strlist.append('this->%s.resize(%d);' % (member.name, member.num_prealloc))
120-
if isinstance(member.default_value, list):
121-
if all(v == member.default_value[0] for v in member.default_value):
122-
# Specifying type for std::fill because of MSVC 14.12 warning about casting 'const int' to smaller types (C4244)
123-
# For more info, see https://github.com/ros2/rosidl/issues/309
124-
# TODO(jacobperron): Investigate reason for build warnings on Windows
125-
# TODO(jacobperron): Write test case for this path of execution
126-
strlist.append('std::fill<typename %s::iterator, %s>(this->%s.begin(), this->%s.end(), %s);' % (msg_type_to_cpp(member.type), msg_type_only_to_cpp(member.type), member.name, member.name, member.default_value[0]))
127-
else:
128-
for index, val in enumerate(member.default_value):
129-
strlist.append('this->%s[%d] = %s;' % (member.name, index, val))
130-
else:
131-
strlist.append('this->%s = %s;' % (member.name, member.default_value))
132-
133-
return strlist
134-
135-
def generate_zero_string(membset, fill_args):
136-
from rosidl_generator_cpp import msg_type_only_to_cpp
137-
from rosidl_generator_cpp import msg_type_to_cpp
138-
strlist = []
139-
for member in membset.members:
140-
if isinstance(member.zero_value, list):
141-
if member.num_prealloc > 0:
142-
strlist.append('this->%s.resize(%d);' % (member.name, member.num_prealloc))
143-
if member.zero_need_array_override:
144-
strlist.append('this->%s.fill(%s{%s});' % (member.name, msg_type_only_to_cpp(member.type), fill_args))
145-
else:
146-
# Specifying type for std::fill because of MSVC 14.12 warning about casting 'const int' to smaller types (C4244)
147-
# For more info, see https://github.com/ros2/rosidl/issues/309
148-
# TODO(jacobperron): Investigate reason for build warnings on Windows
149-
strlist.append('std::fill<typename %s::iterator, %s>(this->%s.begin(), this->%s.end(), %s);' % (msg_type_to_cpp(member.type), msg_type_only_to_cpp(member.type), member.name, member.name, member.zero_value[0]))
150-
else:
151-
strlist.append('this->%s = %s;' % (member.name, member.zero_value))
152-
return strlist
153113
}@
154114
explicit @(message.structure.namespaced_type.name)_(rosidl_runtime_cpp::MessageInitialization _init = rosidl_runtime_cpp::MessageInitialization::ALL)
155115
@[if init_list]@

rosidl_generator_cpp/rosidl_generator_cpp/__init__.py

Lines changed: 48 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -56,7 +56,7 @@ def prefix_with_bom_if_necessary(content: str) -> str:
5656
MSG_TYPE_TO_CPP = {
5757
'boolean': 'bool',
5858
'octet': 'unsigned char', # TODO change to std::byte with C++17
59-
'char': 'unsigned char',
59+
'char': 'unsigned char', # TODO change to char8_t with C++20
6060
'wchar': 'char16_t',
6161
'float': 'float',
6262
'double': 'double',
@@ -196,11 +196,15 @@ def primitive_value_to_cpp(type_, value):
196196
if type_.typename == 'boolean':
197197
return 'true' if value else 'false'
198198

199+
if type_.typename in [
200+
'char', 'octet'
201+
]:
202+
return f'static_cast<unsigned char>({value})'
203+
199204
if type_.typename in [
200205
'short', 'unsigned short',
201-
'char', 'wchar',
206+
'wchar',
202207
'double', 'long double',
203-
'octet',
204208
'int8', 'uint8',
205209
'int16', 'uint16',
206210
]:
@@ -343,3 +347,44 @@ def add_member(self, member):
343347
member_list.append(commonset)
344348

345349
return init_list, alloc_list, member_list
350+
351+
352+
def generate_default_string(membset: list) -> list[str]:
353+
strlist: list[str] = []
354+
for member in membset.members:
355+
if member.default_value is not None:
356+
if member.num_prealloc > 0:
357+
strlist.append('this->%s.resize(%d);' % (member.name, member.num_prealloc))
358+
if isinstance(member.default_value, list):
359+
if all(v == member.default_value[0] for v in member.default_value):
360+
strlist.append(
361+
'std::fill(this->%s.begin(), this->%s.end(), %s);' % (
362+
member.name,
363+
member.name,
364+
member.default_value[0]
365+
)
366+
)
367+
else:
368+
for index, val in enumerate(member.default_value):
369+
strlist.append('this->%s[%d] = %s;' % (member.name, index, val))
370+
else:
371+
strlist.append('this->%s = %s;' % (member.name, member.default_value))
372+
373+
return strlist
374+
375+
376+
def generate_zero_string(membset: list, fill_args: str) -> list[str]:
377+
strlist: list[str] = []
378+
for member in membset.members:
379+
if isinstance(member.zero_value, list):
380+
if member.num_prealloc > 0:
381+
strlist.append('this->%s.resize(%d);' % (member.name, member.num_prealloc))
382+
if member.zero_need_array_override:
383+
strlist.append('this->%s.fill(%s{%s});' % (
384+
member.name, msg_type_only_to_cpp(member.type), fill_args))
385+
else:
386+
strlist.append('std::fill(this->%s.begin(), this->%s.end(), %s);' % (
387+
member.name, member.name, member.zero_value[0]))
388+
else:
389+
strlist.append('this->%s = %s;' % (member.name, member.zero_value))
390+
return strlist

0 commit comments

Comments
 (0)