implement safer align_ function (#141)
avoids unnecessary casts to pointer and pointer manipulation by reference
This commit is contained in:
parent
a9e8784c04
commit
21dd7c4570
1 changed files with 15 additions and 9 deletions
|
@ -120,12 +120,20 @@ void TypeSupport<MembersType>::setName(const std::string & name)
|
||||||
this->name = std::string(name);
|
this->name = std::string(name);
|
||||||
}
|
}
|
||||||
|
|
||||||
static inline void *
|
template<typename T>
|
||||||
align_(size_t __align, void * & __ptr) noexcept
|
static inline T
|
||||||
|
align_int_(size_t __align, T __int) noexcept
|
||||||
|
{
|
||||||
|
return (__int - 1u + __align) & ~(__align - 1);
|
||||||
|
}
|
||||||
|
|
||||||
|
template<typename T>
|
||||||
|
static inline T *
|
||||||
|
align_ptr_(size_t __align, T * __ptr) noexcept
|
||||||
{
|
{
|
||||||
const auto __intptr = reinterpret_cast<uintptr_t>(__ptr);
|
const auto __intptr = reinterpret_cast<uintptr_t>(__ptr);
|
||||||
const auto __aligned = (__intptr - 1u + __align) & ~(__align - 1);
|
const auto __aligned = align_int_(__align, __intptr);
|
||||||
return __ptr = reinterpret_cast<void *>(__aligned);
|
return reinterpret_cast<T *>(__aligned);
|
||||||
}
|
}
|
||||||
|
|
||||||
template<typename MembersType>
|
template<typename MembersType>
|
||||||
|
@ -213,8 +221,7 @@ size_t get_array_size_and_assign_field(
|
||||||
size_t max_align)
|
size_t max_align)
|
||||||
{
|
{
|
||||||
auto vector = reinterpret_cast<std::vector<unsigned char> *>(field);
|
auto vector = reinterpret_cast<std::vector<unsigned char> *>(field);
|
||||||
void * ptr = reinterpret_cast<void *>(sub_members_size);
|
size_t vsize = vector->size() / align_int_(max_align, sub_members_size);
|
||||||
size_t vsize = vector->size() / reinterpret_cast<size_t>(align_(max_align, ptr));
|
|
||||||
if (member->is_upper_bound_ && vsize > member->array_size_) {
|
if (member->is_upper_bound_ && vsize > member->array_size_) {
|
||||||
throw std::runtime_error("vector overcomes the maximum length");
|
throw std::runtime_error("vector overcomes the maximum length");
|
||||||
}
|
}
|
||||||
|
@ -435,8 +442,7 @@ inline size_t get_submessage_array_deserialize(
|
||||||
if (call_new) {
|
if (call_new) {
|
||||||
new(vector) std::vector<unsigned char>;
|
new(vector) std::vector<unsigned char>;
|
||||||
}
|
}
|
||||||
void * ptr = reinterpret_cast<void *>(sub_members_size);
|
vector->resize(vsize * align_int_(max_align, sub_members_size));
|
||||||
vector->resize(vsize * (size_t)align_(max_align, ptr));
|
|
||||||
subros_message = reinterpret_cast<void *>(vector->data());
|
subros_message = reinterpret_cast<void *>(vector->data());
|
||||||
return vsize;
|
return vsize;
|
||||||
}
|
}
|
||||||
|
@ -535,7 +541,7 @@ bool TypeSupport<MembersType>::deserializeROSmessage(
|
||||||
for (size_t index = 0; index < array_size; ++index) {
|
for (size_t index = 0; index < array_size; ++index) {
|
||||||
deserializeROSmessage(deser, sub_members, subros_message, recall_new);
|
deserializeROSmessage(deser, sub_members, subros_message, recall_new);
|
||||||
subros_message = static_cast<char *>(subros_message) + sub_members_size;
|
subros_message = static_cast<char *>(subros_message) + sub_members_size;
|
||||||
subros_message = align_(max_align, subros_message);
|
subros_message = align_ptr_(max_align, subros_message);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
Loading…
Add table
Add a link
Reference in a new issue