From 61edf7f41d58c7b22ac4e3676a910833b7667893 Mon Sep 17 00:00:00 2001 From: Alexandre Duret-Lutz Date: Tue, 9 Dec 2014 16:20:12 +0100 Subject: [PATCH] tgba: simplify usage of named properties * src/tgba/tgba.hh, src/tgba/tgba.cc (set_named_prop): Add a template version. (get_named_prop): Hide the old version, and supply a template version that casts. * src/bin/ltlcross.cc, src/hoaparse/hoaparse.yy, src/tgbaalgos/hoa.cc, src/tgbaalgos/product.cc: Adjust usage. --- src/bin/ltlcross.cc | 3 +-- src/hoaparse/hoaparse.yy | 4 +--- src/tgba/tgba.cc | 2 +- src/tgba/tgba.hh | 18 +++++++++++++++++- src/tgbaalgos/hoa.cc | 4 ++-- src/tgbaalgos/product.cc | 4 +--- 6 files changed, 23 insertions(+), 12 deletions(-) diff --git a/src/bin/ltlcross.cc b/src/bin/ltlcross.cc index 4cf875149..03ade57c9 100644 --- a/src/bin/ltlcross.cc +++ b/src/bin/ltlcross.cc @@ -1244,8 +1244,7 @@ namespace state_set& s) { auto aut = m->get_aut(); - auto ps = static_cast - (aut->get_named_prop("product-states")); + auto ps = aut->get_named_prop("product-states"); unsigned c = m->scc_count(); for (unsigned n = 0; n < c; ++n) if (m->is_accepting_scc(n) || m->is_trivial(n)) diff --git a/src/hoaparse/hoaparse.yy b/src/hoaparse/hoaparse.yy index 09c14f2e2..7b6b2c5cc 100644 --- a/src/hoaparse/hoaparse.yy +++ b/src/hoaparse/hoaparse.yy @@ -359,9 +359,7 @@ header-item: "States:" INT } | "name:" STRING { - res.h->aut->set_named_prop("automaton-name", $2, [](void* name) { - delete static_cast(name); - }); + res.h->aut->set_named_prop("automaton-name", $2); } | "properties:" properties | HEADERNAME header-spec diff --git a/src/tgba/tgba.cc b/src/tgba/tgba.cc index 6511f8c4c..f917aa35b 100644 --- a/src/tgba/tgba.cc +++ b/src/tgba/tgba.cc @@ -98,7 +98,7 @@ namespace spot } void* - tgba::get_named_prop(std::string s) const + tgba::get_named_prop_(std::string s) const { auto i = named_prop_.find(s); if (i == named_prop_.end()) diff --git a/src/tgba/tgba.hh b/src/tgba/tgba.hh index 72091ab18..1532adea3 100644 --- a/src/tgba/tgba.hh +++ b/src/tgba/tgba.hh @@ -665,12 +665,28 @@ namespace spot std::pair>> named_prop_; #endif + void* get_named_prop_(std::string s) const; + public: #ifndef SWIG void set_named_prop(std::string s, void* val, std::function destructor); - void* get_named_prop(std::string s) const; + + template + void set_named_prop(std::string s, T* val) + { + set_named_prop(s, val, [](void *p) { delete static_cast(p); }); + } + + template + T* get_named_prop(std::string s) const + { + void* p = get_named_prop_(s); + if (!p) + return nullptr; + return static_cast(p); + } #endif bool has_single_acc_set() const diff --git a/src/tgbaalgos/hoa.cc b/src/tgbaalgos/hoa.cc index b8a9e6772..fae67c3aa 100644 --- a/src/tgbaalgos/hoa.cc +++ b/src/tgbaalgos/hoa.cc @@ -250,9 +250,9 @@ namespace spot const char nl = newline ? '\n' : ' '; os << "HOA: v1" << nl; - auto* n = aut->get_named_prop("automaton-name"); + auto n = aut->get_named_prop("automaton-name"); if (n) - escape_str(os << "name: \"", *static_cast(n)) << '"' << nl; + escape_str(os << "name: \"", *n) << '"' << nl; else if (f) escape_str(os << "name: \"", to_string(f)) << '"' << nl; os << "States: " << num_states << nl diff --git a/src/tgbaalgos/product.cc b/src/tgbaalgos/product.cc index eba2f18a4..3f6f21f24 100644 --- a/src/tgbaalgos/product.cc +++ b/src/tgbaalgos/product.cc @@ -56,9 +56,7 @@ namespace spot + right->acc().num_sets()); auto v = new product_states; - res->set_named_prop("product-states", v, [](void* vv) { - delete static_cast(vv); - }); + res->set_named_prop("product-states", v); auto new_state = [&](unsigned left_state, unsigned right_state) -> unsigned