GCC Code Coverage Report
Directory: . Exec Total Coverage
File: src/theory/rewriter_attributes.h Lines: 30 30 100.0 %
Date: 2021-05-24 Branches: 616 1404 43.9 %

Line Exec Source
1
/******************************************************************************
2
 * Top contributors (to current version):
3
 *   Dejan Jovanovic, Tim King, Morgan Deters
4
 *
5
 * This file is part of the cvc5 project.
6
 *
7
 * Copyright (c) 2009-2021 by the authors listed in the file AUTHORS
8
 * in the top-level source directory and their institutional affiliations.
9
 * All rights reserved.  See the file COPYING in the top-level source
10
 * directory for licensing information.
11
 * ****************************************************************************
12
 *
13
 * Rewriter attributes.
14
 */
15
16
#include "cvc5_private.h"
17
18
#pragma once
19
20
#include "expr/attribute.h"
21
22
namespace cvc5 {
23
namespace theory {
24
25
template <bool pre, theory::TheoryId theoryId>
26
struct RewriteCacheTag {};
27
28
template <theory::TheoryId theoryId>
29
struct RewriteAttibute {
30
31
  typedef expr::Attribute< RewriteCacheTag<true, theoryId>, Node> pre_rewrite;
32
  typedef expr::Attribute< RewriteCacheTag<false, theoryId>, Node> post_rewrite;
33
34
  /**
35
   * Get the value of the pre-rewrite cache.
36
   */
37
38056839
  static Node getPreRewriteCache(TNode node)
38
  {
39
76113678
    Node cache;
40
38056839
    if (node.hasAttribute(pre_rewrite())) {
41
26883992
      node.getAttribute(pre_rewrite(), cache);
42
    } else {
43
11172847
      return Node::null();
44
    }
45
26883992
    if (cache.isNull()) {
46
22993061
      return node;
47
    } else {
48
3890931
      return cache;
49
    }
50
  }
51
52
  /**
53
   * Set the value of the pre-rewrite cache.
54
   */
55
11578795
  static void setPreRewriteCache(TNode node, TNode cache)
56
  {
57
11578795
    Trace("rewriter") << "setting pre-rewrite of " << node << " to " << cache << std::endl;
58
11578795
    Assert(!cache.isNull());
59
11578795
    if (node == cache) {
60
9714680
      node.setAttribute(pre_rewrite(), Node::null());
61
    } else {
62
1864115
      node.setAttribute(pre_rewrite(), cache);
63
    }
64
11578795
  }
65
66
  /**
67
   * Get the value of the post-rewrite cache.
68
   * none).
69
   */
70
99138551
  static Node getPostRewriteCache(TNode node)
71
  {
72
198277102
    Node cache;
73
99138551
    if (node.hasAttribute(post_rewrite())) {
74
51298975
      node.getAttribute(post_rewrite(), cache);
75
    } else {
76
47839576
      return Node::null();
77
    }
78
51298975
    if (cache.isNull()) {
79
42660949
      return node;
80
    } else {
81
8638026
      return cache;
82
    }
83
  }
84
85
  /**
86
   * Set the value of the post-rewrite cache.  v cannot be a null Node.
87
   */
88
10984709
  static void setPostRewriteCache(TNode node, TNode cache)
89
  {
90
10984709
    Assert(!cache.isNull());
91
10984709
    Trace("rewriter") << "setting rewrite of " << node << " to " << cache << std::endl;
92
10984709
    if (node == cache) {
93
5687308
      node.setAttribute(post_rewrite(), Node::null());
94
    } else {
95
5297401
      node.setAttribute(post_rewrite(), cache);
96
    }
97
10984709
  }
98
};/* struct RewriteAttribute */
99
100
}  // namespace theory
101
}  // namespace cvc5