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);
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
static inline void *
 | 
			
		||||
align_(size_t __align, void * & __ptr) noexcept
 | 
			
		||||
template<typename T>
 | 
			
		||||
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 __aligned = (__intptr - 1u + __align) & ~(__align - 1);
 | 
			
		||||
  return __ptr = reinterpret_cast<void *>(__aligned);
 | 
			
		||||
  const auto __aligned = align_int_(__align, __intptr);
 | 
			
		||||
  return reinterpret_cast<T *>(__aligned);
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
template<typename MembersType>
 | 
			
		||||
| 
						 | 
				
			
			@ -213,8 +221,7 @@ size_t get_array_size_and_assign_field(
 | 
			
		|||
  size_t max_align)
 | 
			
		||||
{
 | 
			
		||||
  auto vector = reinterpret_cast<std::vector<unsigned char> *>(field);
 | 
			
		||||
  void * ptr = reinterpret_cast<void *>(sub_members_size);
 | 
			
		||||
  size_t vsize = vector->size() / reinterpret_cast<size_t>(align_(max_align, ptr));
 | 
			
		||||
  size_t vsize = vector->size() / align_int_(max_align, sub_members_size);
 | 
			
		||||
  if (member->is_upper_bound_ && vsize > member->array_size_) {
 | 
			
		||||
    throw std::runtime_error("vector overcomes the maximum length");
 | 
			
		||||
  }
 | 
			
		||||
| 
						 | 
				
			
			@ -435,8 +442,7 @@ inline size_t get_submessage_array_deserialize(
 | 
			
		|||
  if (call_new) {
 | 
			
		||||
    new(vector) std::vector<unsigned char>;
 | 
			
		||||
  }
 | 
			
		||||
  void * ptr = reinterpret_cast<void *>(sub_members_size);
 | 
			
		||||
  vector->resize(vsize * (size_t)align_(max_align, ptr));
 | 
			
		||||
  vector->resize(vsize * align_int_(max_align, sub_members_size));
 | 
			
		||||
  subros_message = reinterpret_cast<void *>(vector->data());
 | 
			
		||||
  return vsize;
 | 
			
		||||
}
 | 
			
		||||
| 
						 | 
				
			
			@ -535,7 +541,7 @@ bool TypeSupport<MembersType>::deserializeROSmessage(
 | 
			
		|||
            for (size_t index = 0; index < array_size; ++index) {
 | 
			
		||||
              deserializeROSmessage(deser, sub_members, subros_message, recall_new);
 | 
			
		||||
              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