parker's emotion chip
parent
6700161699
commit
b20cc2513a
|
@ -27,7 +27,7 @@ macro(compile_options target_name)
|
||||||
sanitizers(${target_name})
|
sanitizers(${target_name})
|
||||||
endmacro()
|
endmacro()
|
||||||
|
|
||||||
project(blt-gp VERSION 0.5.23)
|
project(blt-gp VERSION 0.5.24)
|
||||||
|
|
||||||
include(CTest)
|
include(CTest)
|
||||||
|
|
||||||
|
|
|
@ -176,6 +176,24 @@ namespace blt::gp
|
||||||
std::vector<swap_index_t> p1_to_p2_transfer_types;
|
std::vector<swap_index_t> p1_to_p2_transfer_types;
|
||||||
std::vector<swap_index_t> p2_to_p1_transfer_types;
|
std::vector<swap_index_t> p2_to_p1_transfer_types;
|
||||||
|
|
||||||
|
void print_missing_types()
|
||||||
|
{
|
||||||
|
for (const auto& [id, v] : missing_p1_types)
|
||||||
|
{
|
||||||
|
BLT_INFO("(P1) For type {} missing indexes:", id);
|
||||||
|
for (const auto idx : v)
|
||||||
|
BLT_INFO("\t{}", idx);
|
||||||
|
BLT_INFO("----");
|
||||||
|
}
|
||||||
|
for (const auto& [id, v] : missing_p2_types)
|
||||||
|
{
|
||||||
|
BLT_INFO("(P2) For type {} missing indexes:", id);
|
||||||
|
for (const auto idx : v)
|
||||||
|
BLT_INFO("\t{}", idx);
|
||||||
|
BLT_INFO("----");
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
std::optional<size_t> get_p1_index(const type_id& id)
|
std::optional<size_t> get_p1_index(const type_id& id)
|
||||||
{
|
{
|
||||||
if (!missing_p1_types.contains(id))
|
if (!missing_p1_types.contains(id))
|
||||||
|
@ -228,8 +246,10 @@ namespace blt::gp
|
||||||
} resolver;
|
} resolver;
|
||||||
resolver.clear();
|
resolver.clear();
|
||||||
|
|
||||||
|
auto min_size = std::min(p1_info.argument_types.size(), p2_info.argument_types.size());
|
||||||
|
|
||||||
// resolve type information
|
// resolve type information
|
||||||
for (size_t i = 0; i < std::min(p1_info.argument_types.size(), p2_info.argument_types.size()); i++)
|
for (size_t i = 0; i < min_size; i++)
|
||||||
{
|
{
|
||||||
if (p1_info.argument_types[i] != p2_info.argument_types[i])
|
if (p1_info.argument_types[i] != p2_info.argument_types[i])
|
||||||
{
|
{
|
||||||
|
@ -239,6 +259,12 @@ namespace blt::gp
|
||||||
resolver.correct_types.insert(i);
|
resolver.correct_types.insert(i);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
for (size_t i = min_size; i < p1_info.argument_types.size(); i++)
|
||||||
|
resolver.missing_p1_types[p1_info.argument_types[i].id].push_back(i);
|
||||||
|
|
||||||
|
for (size_t i = min_size; i < p2_info.argument_types.size(); i++)
|
||||||
|
resolver.missing_p2_types[p2_info.argument_types[i].id].push_back(i);
|
||||||
|
|
||||||
// if swaping p1 -> p2 and p2 -> p1, we may already have the types we need just in a different order
|
// if swaping p1 -> p2 and p2 -> p1, we may already have the types we need just in a different order
|
||||||
|
|
||||||
// first, make a list of types which can simply be reordered
|
// first, make a list of types which can simply be reordered
|
||||||
|
@ -252,6 +278,7 @@ namespace blt::gp
|
||||||
resolver.p2_correct_types.insert(i);
|
resolver.p2_correct_types.insert(i);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
for (size_t i = 0; i < p2_info.argument_types.size(); i++)
|
for (size_t i = 0; i < p2_info.argument_types.size(); i++)
|
||||||
{
|
{
|
||||||
if (resolver.correct_types.contains(i))
|
if (resolver.correct_types.contains(i))
|
||||||
|
@ -262,6 +289,7 @@ namespace blt::gp
|
||||||
resolver.p1_correct_types.insert(i);
|
resolver.p1_correct_types.insert(i);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
// next we need to figure out which types need to be swapped
|
// next we need to figure out which types need to be swapped
|
||||||
for (size_t i = 0; i < p1_info.argument_types.size(); i++)
|
for (size_t i = 0; i < p1_info.argument_types.size(); i++)
|
||||||
{
|
{
|
||||||
|
@ -269,27 +297,17 @@ namespace blt::gp
|
||||||
continue;
|
continue;
|
||||||
if (auto index = resolver.get_p1_index(p1_info.argument_types[i].id))
|
if (auto index = resolver.get_p1_index(p1_info.argument_types[i].id))
|
||||||
resolver.swap_types.push_back({*index, i});
|
resolver.swap_types.push_back({*index, i});
|
||||||
else
|
|
||||||
{
|
|
||||||
BLT_WARN("Unable to process type {} in p1", p1_info.argument_types[i].id);
|
|
||||||
return false;
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|
||||||
for (size_t i = 0; i < p2_info.argument_types.size(); i++)
|
for (size_t i = 0; i < p2_info.argument_types.size(); i++)
|
||||||
{
|
{
|
||||||
if (resolver.handled_p1(i))
|
if (resolver.handled_p1(i))
|
||||||
continue;
|
continue;
|
||||||
if (auto index = resolver.get_p2_index(p2_info.argument_types[i].id))
|
if (auto index = resolver.get_p2_index(p2_info.argument_types[i].id))
|
||||||
resolver.swap_types.push_back({i, *index});
|
resolver.swap_types.push_back({i, *index});
|
||||||
else
|
|
||||||
{
|
|
||||||
BLT_WARN("Unable to process type {} in p2", p2_info.argument_types[i].id);
|
|
||||||
return false;
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|
||||||
// now we do the swap
|
// now we do the swap
|
||||||
|
|
||||||
p1.find_child_extends(resolver.children_data_p1, point1.pos, p1_info.argument_types.size());
|
p1.find_child_extends(resolver.children_data_p1, point1.pos, p1_info.argument_types.size());
|
||||||
p2.find_child_extends(resolver.children_data_p2, point2.pos, p2_info.argument_types.size());
|
p2.find_child_extends(resolver.children_data_p2, point2.pos, p2_info.argument_types.size());
|
||||||
|
|
||||||
|
|
Loading…
Reference in New Issue