Skip to content

Commit

Permalink
Fix complex member printing for DynamicDataHelper (#2957)
Browse files Browse the repository at this point in the history
* DynamicDataHelper::print can print Sequences as well as Arrays
Signed-off-by: Will Stott <[email protected]>

* Fix complex member printing

Signed-off-by: methylDragon <[email protected]>

* Clean up prints

Signed-off-by: methylDragon <[email protected]>

* Fix FastDDS windows CI error

Signed-off-by: methylDragon <[email protected]>

Signed-off-by: methylDragon <[email protected]>
Co-authored-by: Will Stott <[email protected]>
  • Loading branch information
methylDragon and willstott101 authored Sep 22, 2022
1 parent 02c410c commit 78473a0
Showing 1 changed file with 68 additions and 30 deletions.
98 changes: 68 additions & 30 deletions src/cpp/dynamic-types/DynamicDataHelper.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -251,33 +251,71 @@ void DynamicDataHelper::aux_index_position(
void DynamicDataHelper::print_basic_collection(
DynamicData* data)
{
const std::vector<uint32_t>& bounds = data->type_->descriptor_->bound_;
if (data->type_->get_kind() == TK_SEQUENCE)
{
auto count = data->get_item_count();
std::cout << "[";
for (uint32_t i = 0; i < count; ++i)
{
print_basic_element(data, i, data->type_->get_element_type()->get_kind());
std::cout << (i == count - 1 ? "]" : ", ");
}
if (count == 0)
{
std::cout << "]";
}
}
else
{
const std::vector<uint32_t>& bounds = data->type_->descriptor_->bound_;

std::vector<std::vector<uint32_t>> positions;
fill_array_positions(bounds, positions);
std::vector<std::vector<uint32_t>> positions;
fill_array_positions(bounds, positions);

std::cout << "[";
for (size_t i = 0; i < positions.size(); ++i)
{
print_basic_element(data, data->get_array_index(positions[i]), data->type_->get_element_type()->get_kind());
std::cout << (i == positions.size() - 1 ? "]" : ", ");
std::cout << "[";
for (size_t i = 0; i < positions.size(); ++i)
{
print_basic_element(data, data->get_array_index(positions[i]), data->type_->get_element_type()->get_kind());
std::cout << (i == positions.size() - 1 ? "]" : ", ");
}
}
std::cout << std::endl;
}

void DynamicDataHelper::print_complex_collection(
DynamicData* data,
const std::string& tabs)
{
const std::vector<uint32_t>& bounds = data->type_->descriptor_->bound_;
std::cout << std::endl;
if (data->type_->get_kind() == TK_SEQUENCE)
{
auto count = data->get_item_count();

std::vector<std::vector<uint32_t>> positions;
fill_array_positions(bounds, positions);
for (uint32_t i = 0; i < count; ++i)
{
std::cout << tabs << "[" << i << "] = ";
print_complex_element(data, i, tabs);
std::cout << std::endl;
}

for (size_t i = 0; i < positions.size(); ++i)
if (count == 0)
{
std::cout << "[]";
}
}
else
{
std::cout << tabs << "[" << i << "] = ";
print_complex_element(data, data->get_array_index(positions[i]), tabs);
std::cout << std::endl;
const std::vector<uint32_t>& bounds = data->type_->descriptor_->bound_;

std::vector<std::vector<uint32_t>> positions;
fill_array_positions(bounds, positions);

for (size_t i = 0; i < positions.size(); ++i)
{
std::cout << tabs << "[" << i << "] = ";
print_complex_element(data, data->get_array_index(positions[i]), tabs);
std::cout << std::endl;
}
}
}

Expand All @@ -286,61 +324,58 @@ void DynamicDataHelper::print_complex_element(
MemberId id,
const std::string& tabs)
{
const TypeDescriptor* desc = data->type_->get_type_descriptor();
DynamicData* st_data = data->loan_value(id);
const TypeDescriptor* desc = st_data->type_->get_type_descriptor();
switch (desc->get_kind())
{
case TK_STRUCTURE:
case TK_BITSET:
{
DynamicData* st_data = data->loan_value(id);
std::cout << "<struct/bitset>" << std::endl;
std::map<types::MemberId, types::DynamicTypeMember*> members;
data->type_->get_all_members(members);
st_data->type_->get_all_members(members);
for (auto it : members)
{
print_member(st_data, it.second, tabs + "\t");
}
data->return_loaned_value(st_data);
break;
}
case TK_UNION:
{
DynamicData* st_data = data->loan_value(id);
std::cout << "<union>" << std::endl;
DynamicTypeMember member;
data->type_->get_member(member, data->union_id_);
st_data->type_->get_member(member, st_data->union_id_);
print_member(st_data, &member, tabs + "\t");
break;
}
case TK_SEQUENCE:
case TK_ARRAY:
{
DynamicData* st_data = data->loan_value(id);
print_collection(st_data, tabs + "\t");
data->return_loaned_value(st_data);
break;
}
case TK_MAP:
{
DynamicData* st_data = data->loan_value(id);
std::cout << "<map>" << std::endl;
std::map<types::MemberId, types::DynamicTypeMember*> members;
data->type_->get_all_members(members);
size_t size = data->get_item_count();
st_data->type_->get_all_members(members);
size_t size = st_data->get_item_count();
for (size_t i = 0; i < size; ++i)
{
size_t index = i * 2;
MemberId member_id = data->get_member_id_at_index(static_cast<uint32_t>(index));
MemberId member_id = st_data->get_member_id_at_index(static_cast<uint32_t>(index));
std::cout << "Key: ";
print_member(st_data, members[member_id], tabs + "\t");
member_id = data->get_member_id_at_index(static_cast<uint32_t>(index + 1));
std::cout << "Value: ";
print_member(st_data, members[member_id], tabs + "\t");
}
data->return_loaned_value(st_data);
break;
}
default:
break;
}
std::cout << std::endl;
data->return_loaned_value(st_data);
}

void DynamicDataHelper::print_member(
Expand Down Expand Up @@ -372,12 +407,14 @@ void DynamicDataHelper::print_member(
case TK_BITMASK:
{
print_basic_element(data, type->get_id(), desc->get_kind());
std::cout << std::endl;
break;
}
case TK_STRUCTURE:
case TK_BITSET:
{
DynamicData* st_data = data->loan_value(type->get_id());
std::cout << "<struct/bitset>" << std::endl;
std::map<types::MemberId, types::DynamicTypeMember*> members;
desc->get_type()->get_all_members(members);
for (auto it : members)
Expand All @@ -389,6 +426,7 @@ void DynamicDataHelper::print_member(
}
case TK_UNION:
{
std::cout << "<union>" << std::endl;
DynamicData* st_data = data->loan_value(type->get_id());
DynamicTypeMember member;
desc->get_type()->get_member(member, data->union_id_);
Expand All @@ -405,6 +443,7 @@ void DynamicDataHelper::print_member(
}
case TK_MAP:
{
std::cout << "<map>" << std::endl;
DynamicData* st_data = data->loan_value(type->get_id());
std::map<types::MemberId, types::DynamicTypeMember*> members;
desc->get_type()->get_all_members(members);
Expand All @@ -425,5 +464,4 @@ void DynamicDataHelper::print_member(
default:
break;
}
std::cout << std::endl;
}

0 comments on commit 78473a0

Please sign in to comment.