graph: Add a test close to the tgba_explicit_string setup.
* src/graph/graph.hh (boxed_label): If State_Data==void, inherit from std::tuple<> and implement a data() method. (digraph::state_data): Return by reference. * src/graphtest/ngraph.cc, src/graphtest/ngraph.test: Test the case where State_Data implements the spot::state interface.
This commit is contained in:
parent
a8fd188d5e
commit
c793d3f13a
3 changed files with 102 additions and 7 deletions
|
|
@ -42,6 +42,7 @@ namespace spot
|
||||||
template <typename Data, bool boxed = !std::is_class<Data>::value>
|
template <typename Data, bool boxed = !std::is_class<Data>::value>
|
||||||
struct boxed_label
|
struct boxed_label
|
||||||
{
|
{
|
||||||
|
typedef Data data_t;
|
||||||
Data label;
|
Data label;
|
||||||
|
|
||||||
template <typename... Args>
|
template <typename... Args>
|
||||||
|
|
@ -68,13 +69,26 @@ namespace spot
|
||||||
};
|
};
|
||||||
|
|
||||||
template <>
|
template <>
|
||||||
struct boxed_label<void, true>
|
struct boxed_label<void, true>: public std::tuple<>
|
||||||
{
|
{
|
||||||
|
typedef std::tuple<> data_t;
|
||||||
|
std::tuple<>& data()
|
||||||
|
{
|
||||||
|
return *this;
|
||||||
|
}
|
||||||
|
|
||||||
|
const std::tuple<>& data() const
|
||||||
|
{
|
||||||
|
return *this;
|
||||||
|
}
|
||||||
|
|
||||||
};
|
};
|
||||||
|
|
||||||
template <typename Data>
|
template <typename Data>
|
||||||
struct boxed_label<Data, false>: public Data
|
struct boxed_label<Data, false>: public Data
|
||||||
{
|
{
|
||||||
|
typedef Data data_t;
|
||||||
|
|
||||||
template <typename... Args>
|
template <typename... Args>
|
||||||
boxed_label(Args&&... args):
|
boxed_label(Args&&... args):
|
||||||
Data{std::forward<Args>(args)...}
|
Data{std::forward<Args>(args)...}
|
||||||
|
|
@ -302,15 +316,16 @@ namespace spot
|
||||||
return s;
|
return s;
|
||||||
}
|
}
|
||||||
|
|
||||||
// May not be called on states with no data.
|
// Do not use State_Data& as return type, because State_Data might
|
||||||
State_Data
|
// be void.
|
||||||
|
typename state_storage_t::data_t&
|
||||||
state_data(state s)
|
state_data(state s)
|
||||||
{
|
{
|
||||||
return states_[s].data();
|
return states_[s].data();
|
||||||
}
|
}
|
||||||
|
|
||||||
// May not be called on states with no data.
|
// May not be called on states with no data.
|
||||||
State_Data
|
const typename state_storage_t::data_t&
|
||||||
state_data(state s) const
|
state_data(state s) const
|
||||||
{
|
{
|
||||||
return states_[s].data();
|
return states_[s].data();
|
||||||
|
|
|
||||||
|
|
@ -20,6 +20,7 @@
|
||||||
|
|
||||||
#include <iostream>
|
#include <iostream>
|
||||||
#include "graph/ngraph.hh"
|
#include "graph/ngraph.hh"
|
||||||
|
#include "tgba/state.hh"
|
||||||
|
|
||||||
template <typename SL, typename TL>
|
template <typename SL, typename TL>
|
||||||
void
|
void
|
||||||
|
|
@ -339,6 +340,74 @@ bool f8()
|
||||||
return f == 69;
|
return f == 69;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
struct my_state: public spot::state
|
||||||
|
{
|
||||||
|
public:
|
||||||
|
virtual ~my_state() noexcept
|
||||||
|
{
|
||||||
|
}
|
||||||
|
|
||||||
|
virtual int compare(const spot::state* other) const
|
||||||
|
{
|
||||||
|
auto o = down_cast<const my_state*>(other);
|
||||||
|
assert(o);
|
||||||
|
|
||||||
|
// Do not simply return "other - this", it might not fit in an int.
|
||||||
|
if (o < this)
|
||||||
|
return -1;
|
||||||
|
if (o > this)
|
||||||
|
return 1;
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
virtual size_t hash() const
|
||||||
|
{
|
||||||
|
return
|
||||||
|
reinterpret_cast<const char*>(this) - static_cast<const char*>(nullptr);
|
||||||
|
}
|
||||||
|
|
||||||
|
virtual my_state*
|
||||||
|
clone() const
|
||||||
|
{
|
||||||
|
return const_cast<my_state*>(this);
|
||||||
|
}
|
||||||
|
|
||||||
|
virtual void destroy() const
|
||||||
|
{
|
||||||
|
}
|
||||||
|
|
||||||
|
friend std::ostream& operator<<(std::ostream& os, const my_state&)
|
||||||
|
{
|
||||||
|
return os;
|
||||||
|
}
|
||||||
|
};
|
||||||
|
|
||||||
|
bool f9()
|
||||||
|
{
|
||||||
|
typedef spot::digraph<my_state, int_pair> graph_t;
|
||||||
|
graph_t g(3);
|
||||||
|
spot::named_graph<graph_t, std::string> gg(g);
|
||||||
|
auto s1 = gg.new_state("s1");
|
||||||
|
gg.new_state("s2");
|
||||||
|
gg.new_state("s3");
|
||||||
|
gg.new_transition("s1", "s2", 1, 3);
|
||||||
|
gg.new_transition("s1", "s3", 2, 5);
|
||||||
|
gg.new_transition("s2", "s3", 3, 7);
|
||||||
|
gg.new_transition("s3", "s2", 4, 9);
|
||||||
|
|
||||||
|
dot(std::cout, gg);
|
||||||
|
|
||||||
|
int f = 0;
|
||||||
|
for (auto& t: g.out(s1))
|
||||||
|
{
|
||||||
|
f += t.one + t.two;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
return (f == 11) &&
|
||||||
|
g.state_data(s1).compare(&g.state_data(gg.get_state("s1"))) == 0 &&
|
||||||
|
g.state_data(s1).compare(&g.state_data(gg.get_state("s2"))) != 0;
|
||||||
|
}
|
||||||
|
|
||||||
int main()
|
int main()
|
||||||
{
|
{
|
||||||
|
|
@ -350,6 +419,7 @@ int main()
|
||||||
bool a6 = f6();
|
bool a6 = f6();
|
||||||
bool a7 = f7();
|
bool a7 = f7();
|
||||||
bool a8 = f8();
|
bool a8 = f8();
|
||||||
|
bool a9 = f9();
|
||||||
std::cout << a1 << ' '
|
std::cout << a1 << ' '
|
||||||
<< a2 << ' '
|
<< a2 << ' '
|
||||||
<< a3 << ' '
|
<< a3 << ' '
|
||||||
|
|
@ -357,6 +427,7 @@ int main()
|
||||||
<< a5 << ' '
|
<< a5 << ' '
|
||||||
<< a6 << ' '
|
<< a6 << ' '
|
||||||
<< a7 << ' '
|
<< a7 << ' '
|
||||||
<< a8 << '\n';
|
<< a8 << ' '
|
||||||
return !(a1 && a2 && a3 && a4 && a5 && a6 && a7 && a8);
|
<< a9 << '\n';
|
||||||
|
return !(a1 && a2 && a3 && a4 && a5 && a6 && a7 && a8 && a9);
|
||||||
}
|
}
|
||||||
|
|
|
||||||
|
|
@ -80,7 +80,16 @@ digraph {
|
||||||
2 [label="s3\n(4,8)"]
|
2 [label="s3\n(4,8)"]
|
||||||
2 -> 1 [label="(4,9)"]
|
2 -> 1 [label="(4,9)"]
|
||||||
}
|
}
|
||||||
1 1 1 1 1 1 1 1
|
digraph {
|
||||||
|
0 [label="s1\n"]
|
||||||
|
0 -> 1 [label="(1,3)"]
|
||||||
|
0 -> 2 [label="(2,5)"]
|
||||||
|
1 [label="s2\n"]
|
||||||
|
1 -> 2 [label="(3,7)"]
|
||||||
|
2 [label="s3\n"]
|
||||||
|
2 -> 1 [label="(4,9)"]
|
||||||
|
}
|
||||||
|
1 1 1 1 1 1 1 1 1
|
||||||
EOF
|
EOF
|
||||||
|
|
||||||
diff stdout expected
|
diff stdout expected
|
||||||
|
|
|
||||||
Loading…
Add table
Add a link
Reference in a new issue