File: expr_query.h

package info (click to toggle)
cbmc 6.6.0-4
  • links: PTS
  • area: main
  • in suites: forky, sid, trixie
  • size: 153,852 kB
  • sloc: cpp: 386,459; ansic: 114,466; java: 28,405; python: 6,003; yacc: 4,552; makefile: 4,041; lex: 2,487; xml: 2,388; sh: 2,050; perl: 557; pascal: 184; javascript: 163; ada: 36
file content (62 lines) | stat: -rw-r--r-- 1,372 bytes parent folder | download
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
/*******************************************************************\

Module: Unit test utilities

Author: Romain Brenguier, romain.brenguier@diffblue.com

\*******************************************************************/

/// \file
/// Helper class for querying expressions
/// Throw CATCH exceptions when the query fails.

#ifndef CPROVER_TESTING_UTILS_EXPR_QUERY_H
#define CPROVER_TESTING_UTILS_EXPR_QUERY_H

#include <testing-utils/use_catch.h>

#include <util/expr_cast.h>

/// Wrapper for std::optional<exprt> with useful method for queries to be used
/// in unit tests.
template <typename T = exprt>
class expr_queryt
{
  static_assert(
    std::is_base_of<exprt, T>::value,
    "T should inherit from exprt");

public:
  explicit expr_queryt(T e) : value(std::move(e))
  {
  }

  template <typename targett>
  expr_queryt<targett> as() const
  {
    auto result = expr_try_dynamic_cast<targett>(static_cast<exprt>(value));
    REQUIRE(result);
    return expr_queryt<targett>(*result);
  }

  expr_queryt<exprt> operator[](const std::size_t i) const
  {
    REQUIRE(value.operands().size() > i);
    return expr_queryt<exprt>(value.operands()[i]);
  }

  T get() const
  {
    return value;
  }

private:
  T value;
};

inline expr_queryt<exprt> make_query(exprt e)
{
  return expr_queryt<exprt>(std::move(e));
}

#endif // CPROVER_TESTING_UTILS_EXPR_QUERY_H