virtual ~FixpointIterator()

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()");
  }