Fixed message chain equality comparison
This commit is contained in:
@@ -285,11 +285,11 @@ common::model::diagram_element::id_t diagram::get_from_activity_id(
|
||||
return from_activity;
|
||||
}
|
||||
|
||||
std::unordered_set<message_chain_t> diagram::get_all_from_to_message_chains(
|
||||
std::vector<message_chain_t> diagram::get_all_from_to_message_chains(
|
||||
const common::model::diagram_element::id_t from_activity,
|
||||
const common::model::diagram_element::id_t to_activity) const
|
||||
{
|
||||
std::unordered_set<message_chain_t> message_chains_unique{};
|
||||
std::vector<message_chain_t> message_chains_unique{};
|
||||
|
||||
// Message (call) chains matching the specified from_to condition
|
||||
std::vector<message_chain_t> message_chains;
|
||||
@@ -382,15 +382,31 @@ std::unordered_set<message_chain_t> diagram::get_all_from_to_message_chains(
|
||||
|
||||
// Reverse the message chains order (they were added starting from
|
||||
// the destination activity)
|
||||
for (auto &mc : message_chains)
|
||||
for (auto &mc : message_chains) {
|
||||
std::reverse(mc.begin(), mc.end());
|
||||
|
||||
std::copy_if(message_chains.begin(), message_chains.end(),
|
||||
std::inserter(message_chains_unique, message_chains_unique.begin()),
|
||||
[from_activity](const message_chain_t &mc) {
|
||||
return !mc.empty() &&
|
||||
(from_activity == 0 || (mc.front().from() == from_activity));
|
||||
});
|
||||
if (mc.empty())
|
||||
continue;
|
||||
|
||||
if (std::find(message_chains_unique.begin(),
|
||||
message_chains_unique.end(), mc) != message_chains_unique.end())
|
||||
continue;
|
||||
|
||||
if (from_activity == 0 || (mc.front().from() == from_activity)) {
|
||||
message_chains_unique.push_back(mc);
|
||||
}
|
||||
}
|
||||
|
||||
LOG_TRACE("Message chains unique", iter++);
|
||||
int message_chain_index{};
|
||||
for (const auto &mc : message_chains_unique) {
|
||||
LOG_TRACE("\t{}: {}", message_chain_index++,
|
||||
fmt::join(util::map<std::string>(mc,
|
||||
[](const model::message &m) -> std::string {
|
||||
return m.message_name();
|
||||
}),
|
||||
"->"));
|
||||
}
|
||||
|
||||
return message_chains_unique;
|
||||
}
|
||||
|
||||
@@ -255,7 +255,7 @@ public:
|
||||
* @param to_activity Target activity for from_to message chain
|
||||
* @return List of message chains
|
||||
*/
|
||||
std::unordered_set<message_chain_t> get_all_from_to_message_chains(
|
||||
std::vector<message_chain_t> get_all_from_to_message_chains(
|
||||
common::model::diagram_element::id_t from_activity,
|
||||
common::model::diagram_element::id_t to_activity) const;
|
||||
|
||||
|
||||
@@ -27,6 +27,14 @@ message::message(
|
||||
{
|
||||
}
|
||||
|
||||
bool message::operator==(const message &other) const noexcept
|
||||
{
|
||||
return from_ == other.from_ && to_ == other.to_ && type_ == other.type_ &&
|
||||
scope_ == other.scope_ && message_name_ == other.message_name_ &&
|
||||
return_type_ == other.return_type_ &&
|
||||
condition_text_ == other.condition_text_;
|
||||
}
|
||||
|
||||
void message::set_type(common::model::message_t t) { type_ = t; }
|
||||
|
||||
common::model::message_t message::type() const { return type_; }
|
||||
|
||||
@@ -41,6 +41,14 @@ public:
|
||||
message(common::model::message_t type,
|
||||
common::model::diagram_element::id_t from);
|
||||
|
||||
/**
|
||||
* @brief Equality operator
|
||||
*
|
||||
* @param other Compare this to other message
|
||||
* @return True, if 2 messages are equal
|
||||
*/
|
||||
bool operator==(const message &other) const noexcept;
|
||||
|
||||
/**
|
||||
* @brief Set message type
|
||||
*
|
||||
@@ -162,33 +170,3 @@ private:
|
||||
};
|
||||
|
||||
} // namespace clanguml::sequence_diagram::model
|
||||
|
||||
namespace std {
|
||||
|
||||
template <> struct hash<clanguml::sequence_diagram::model::message> {
|
||||
std::size_t operator()(
|
||||
const clanguml::sequence_diagram::model::message &m) const
|
||||
{
|
||||
std::size_t seed = clanguml::util::hash_seed(m.from());
|
||||
seed ^= m.to();
|
||||
seed += std::hash<std::string>{}(m.full_name(true));
|
||||
|
||||
return seed;
|
||||
}
|
||||
};
|
||||
|
||||
template <>
|
||||
struct hash<std::vector<clanguml::sequence_diagram::model::message>> {
|
||||
std::size_t operator()(
|
||||
const std::vector<clanguml::sequence_diagram::model::message> &msgs)
|
||||
const
|
||||
{
|
||||
std::size_t seed = clanguml::util::hash_seed(msgs.size());
|
||||
for (const auto &m : msgs) {
|
||||
seed ^= std::hash<clanguml::sequence_diagram::model::message>{}(m);
|
||||
}
|
||||
return seed;
|
||||
}
|
||||
};
|
||||
|
||||
} // namespace std
|
||||
|
||||
@@ -139,9 +139,12 @@ TEST_CASE("t00014", "[test-case][class]")
|
||||
REQUIRE_THAT(puml,
|
||||
IsAggregation(_A("R<T>"),
|
||||
_A("A<float,std::unique_ptr<std::string>>"), "-floatstring"));
|
||||
#if !defined(__APPLE__)
|
||||
// TODO(#176)
|
||||
REQUIRE_THAT(puml, IsDependency(_A("R<T>"), _A("A<char,std::string>")));
|
||||
REQUIRE_THAT(
|
||||
puml, IsDependency(_A("R<T>"), _A("A<wchar_t,std::string>")));
|
||||
#endif
|
||||
|
||||
save_puml(
|
||||
config.output_directory() + "/" + diagram->name + ".puml", puml);
|
||||
|
||||
Reference in New Issue
Block a user