HALDLS
common.h
Go to the documentation of this file.
1 #pragma once
2 
3 #include <type_traits>
4 #include <utility>
5 
6 namespace haldls {
7 namespace vx {
8 
9 namespace detail {
10 
15 template <class ContainerT>
17 {
18  static_assert(
19  ContainerT::is_leaf_node::value,
20  "visit_preorder needs to be specialized for non-leaf-node container");
21 
24  template <typename ContainerU, typename VisitorT>
25  static void call(
26  ContainerU& config, typename ContainerT::coordinate_type const& coord, VisitorT&& visitor)
27  {
28  visitor(coord, config);
29  }
30 }; // VisitPreorderImpl
31 
32 } // namespace detail
33 
36 template <class ContainerT, class CoordinateT, class VisitorT>
37 void visit_preorder(ContainerT& config, CoordinateT const& coord, VisitorT&& visitor)
38 {
39  static_assert(
40  std::is_same<typename ContainerT::coordinate_type, CoordinateT>::value,
41  "coordinate type does not match container type");
43  config, coord, std::forward<VisitorT>(visitor));
44 }
45 
46 } // namespace vx
47 } // namespace haldls
void visit_preorder(ContainerT &config, CoordinateT const &coord, VisitorT &&visitor)
Apply the specified visitor to all containers in a hierarchy by doing a pre-order tree traversal.
Definition: common.h:37
Implementation detail of the visit_preorder() free function (q.v.).
Definition: common.h:17
static void call(ContainerU &config, typename ContainerT::coordinate_type const &coord, VisitorT &&visitor)
Definition: common.h:25