OILS / vendor / souffle / utility / VisitorFwd.h View on Github | oilshell.org

43 lines, 19 significant
1/*
2 * Souffle - A Datalog Compiler
3 * Copyright (c) 2021, The Souffle Developers. All rights reserved
4 * Licensed under the Universal Permissive License v 1.0 as shown at:
5 * - https://opensource.org/licenses/UPL
6 * - <souffle root>/licenses/SOUFFLE-UPL.txt
7 */
8
9/************************************************************************
10 *
11 * @file VisitorFwd.h
12 *
13 * Defines the bare minimum for declaring a visitable root type.
14 * Separate header to avoid dragging in everything used by `Visitor.h`.
15 *
16 ***********************************************************************/
17
18#pragma once
19
20#include "souffle/utility/Types.h"
21#include <type_traits>
22
23#define SOUFFLE_DECLARE_VISITABLE_ROOT_TYPE(ty) \
24 template <typename A> \
25 struct souffle::detail::VisitRootType_t<A, \
26 std::enable_if_t<std::is_base_of_v<ty, ::souffle::remove_cvref_t<A>>>> \
27 : souffle::detail::VisitRootType_t<A, ty> {};
28
29namespace souffle::detail {
30template <typename A, typename R = void>
31struct VisitRootType_t {
32 using type = R;
33};
34
35template <typename A>
36using visit_root_type_or_void = typename VisitRootType_t<remove_cvref_t<A>>::type;
37
38template <typename A>
39constexpr bool is_visitable_node = !std::is_same_v<void, visit_root_type_or_void<A>>;
40
41template <typename A>
42using visit_root_type = std::enable_if_t<is_visitable_node<A>, visit_root_type_or_void<A>>;
43} // namespace souffle::detail