in include/FixpointIterator.h [52:93]
virtual ~FixpointIterator() {
static_assert(std::is_base_of<AbstractDomain<Domain>, Domain>::value,
"Domain does not inherit from AbstractDomain");
// Check that GraphInterface has the necessary methods.
// We specify it here instead of putting the static asserts in the
// destructor of a CRTP-style base class because the destructor may not be
// instantiated when we don't create any instances of the GraphInterface
// class.
// The graph is specified by its root node together with the successors,
// predecessors, and edge source/target functions.
static_assert(
std::is_same<decltype(GraphInterface::entry(std::declval<Graph>())),
NodeId>::value,
"No implementation of entry()");
static_assert(
!std::is_same<
typename std::iterator_traits<typename std::remove_reference<
decltype(GraphInterface::predecessors(
std::declval<Graph>(),
std::declval<NodeId>()))>::type::iterator>::value_type,
void>::value,
"No implementation of predecessors() that returns an iterable type");
static_assert(
!std::is_same<
typename std::iterator_traits<typename std::remove_reference<
decltype(GraphInterface::successors(
std::declval<Graph>(),
std::declval<NodeId>()))>::type::iterator>::value_type,
void>::value,
"No implementation of successors() that returns an iterable type");
static_assert(
std::is_same<decltype(GraphInterface::source(std::declval<Graph>(),
std::declval<EdgeId>())),
NodeId>::value,
"No implementation of source()");
static_assert(
std::is_same<decltype(GraphInterface::target(std::declval<Graph>(),
std::declval<EdgeId>())),
NodeId>::value,
"No implementation of target()");
}