Coverage Report

Created: 2023-12-11 06:17

/proc/self/cwd/src/ir/datalog/value.h
Line
Count
Source (jump to first uncovered line)
1
//-----------------------------------------------------------------------------
2
// Copyright 2022 Google LLC
3
//
4
// Licensed under the Apache License, Version 2.0 (the "License");
5
// you may not use this file except in compliance with the License.
6
// You may obtain a copy of the License at
7
//
8
//     https://www.apache.org/licenses/LICENSE-2.0
9
//
10
// Unless required by applicable law or agreed to in writing, software
11
// distributed under the License is distributed on an "AS IS" BASIS,
12
// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13
// See the License for the specific language governing permissions and
14
// limitations under the License.
15
//----------------------------------------------------------------------------
16
17
#ifndef SRC_IR_DATALOG_VALUE_H_
18
#define SRC_IR_DATALOG_VALUE_H_
19
20
#include <string>
21
#include <tuple>
22
#include <variant>
23
24
#include "absl/strings/str_format.h"
25
#include "absl/strings/str_join.h"
26
#include "absl/strings/string_view.h"
27
28
namespace raksha::ir::datalog {
29
30
// The common supertype of any "fully fledged" Souffle value type. Anything
31
// descending form `Value` should be able to be used in a `.type` declaration.
32
// By this logic, `number`, `symbol`, any record, and any ADT are `Value`s, but
33
// individual branches of an ADT are not.
34
class Value {
35
 public:
36
  virtual std::string ToDatalogString() const = 0;
37
14.6k
  virtual ~Value() {}
38
};
39
40
// Corresponds to Souffle's `float` type.
41
class Float : public Value {
42
 public:
43
0
  explicit Float(double value) : float_value_(value) {}
44
45
0
  std::string ToDatalogString() const override {
46
0
    return absl::StrFormat(R"(%lg)", float_value_);
47
0
  }
48
49
 private:
50
  double float_value_;
51
};
52
53
// Corresponds to Souffle's `number` type.
54
class Number : public Value {
55
 public:
56
2.65k
  explicit Number(int64_t value) : number_value_(value) {}
57
58
2.57k
  std::string ToDatalogString() const override {
59
2.57k
    return std::to_string(number_value_);
60
2.57k
  }
61
62
 private:
63
  int64_t number_value_;
64
};
65
66
// Corresponds to Souffle's `symbol` type.
67
class Symbol : public Value {
68
 public:
69
2.48k
  explicit Symbol(absl::string_view value) : symbol_value_(value) {}
70
71
2.48k
  std::string ToDatalogString() const override {
72
2.48k
    return absl::StrFormat(R"("%s")", symbol_value_);
73
2.48k
  }
74
75
 private:
76
  std::string symbol_value_;
77
};
78
79
// A Record is, in fact, a value pointing to a tuple of values that
80
// constitutes a record. This is necessary because Souffle conflates references
81
// and the objects to which those references point. In the case that a type has
82
// a recursive definition (common with linked lists), trying to implement this
83
// without a pointer would cause layout issues.
84
template <class... RecordFieldValueTypes>
85
class Record : public Value {
86
 public:
87
24
  explicit Record() : record_arguments_() {}
Unexecuted instantiation: raksha::ir::datalog::Record<raksha::ir::datalog::Record<raksha::ir::datalog::Symbol, raksha::ir::datalog::Number> >::Record()
value_test.cc:raksha::ir::datalog::Record<raksha::ir::datalog::Number, raksha::ir::datalog::(anonymous namespace)::NumList>::Record()
Line
Count
Source
87
24
  explicit Record() : record_arguments_() {}
88
  explicit Record(RecordFieldValueTypes &&...args)
89
      : record_arguments_(
90
            std::make_unique<std::tuple<RecordFieldValueTypes...>>(
91
3.13k
                std::forward<RecordFieldValueTypes>(args)...)) {}
raksha::ir::datalog::Record<raksha::ir::datalog::Symbol, raksha::ir::datalog::Number>::Record(raksha::ir::datalog::Symbol&&, raksha::ir::datalog::Number&&)
Line
Count
Source
91
734
                std::forward<RecordFieldValueTypes>(args)...)) {}
value_test.cc:raksha::ir::datalog::Record<raksha::ir::datalog::Number, raksha::ir::datalog::(anonymous namespace)::NumList>::Record(raksha::ir::datalog::Number&&, raksha::ir::datalog::(anonymous namespace)::NumList&&)
Line
Count
Source
91
24
                std::forward<RecordFieldValueTypes>(args)...)) {}
raksha::ir::datalog::Record<raksha::ir::datalog::Number, raksha::ir::datalog::Symbol>::Record(raksha::ir::datalog::Number&&, raksha::ir::datalog::Symbol&&)
Line
Count
Source
91
1.58k
                std::forward<RecordFieldValueTypes>(args)...)) {}
raksha::ir::datalog::Record<raksha::ir::datalog::Record<raksha::ir::datalog::Number, raksha::ir::datalog::Symbol>, raksha::ir::datalog::Record<raksha::ir::datalog::Number, raksha::ir::datalog::Symbol> >::Record(raksha::ir::datalog::Record<raksha::ir::datalog::Number, raksha::ir::datalog::Symbol>&&, raksha::ir::datalog::Record<raksha::ir::datalog::Number, raksha::ir::datalog::Symbol>&&)
Line
Count
Source
91
792
                std::forward<RecordFieldValueTypes>(args)...)) {}
92
93
3.11k
  std::string ToDatalogString() const override {
94
3.11k
    if (!record_arguments_) return "nil";
95
3.11k
    return absl::StrFormat(
96
3.11k
        "[%s]", absl::StrJoin(*record_arguments_, ", ",
97
6.22k
                              [](std::string *out, const auto &arg) {
98
6.22k
                                absl::StrAppend(out, arg.ToDatalogString());
99
6.22k
                              }));
Unexecuted instantiation: auto raksha::ir::datalog::Record<raksha::ir::datalog::Record<raksha::ir::datalog::Symbol, raksha::ir::datalog::Number> >::ToDatalogString() const::{lambda(std::__1::basic_string<char, std::__1::char_traits<char>, std::__1::allocator<char> >*, auto:1 const&)#1}::operator()<raksha::ir::datalog::Record<raksha::ir::datalog::Symbol, raksha::ir::datalog::Number> >(std::__1::basic_string<char, std::__1::char_traits<char>, std::__1::allocator<char> >*, raksha::ir::datalog::Record<raksha::ir::datalog::Symbol, raksha::ir::datalog::Number> const&) const
auto raksha::ir::datalog::Record<raksha::ir::datalog::Symbol, raksha::ir::datalog::Number>::ToDatalogString() const::{lambda(std::__1::basic_string<char, std::__1::char_traits<char>, std::__1::allocator<char> >*, auto:1 const&)#1}::operator()<raksha::ir::datalog::Symbol>(std::__1::basic_string<char, std::__1::char_traits<char>, std::__1::allocator<char> >*, raksha::ir::datalog::Symbol const&) const
Line
Count
Source
97
734
                              [](std::string *out, const auto &arg) {
98
734
                                absl::StrAppend(out, arg.ToDatalogString());
99
734
                              }));
auto raksha::ir::datalog::Record<raksha::ir::datalog::Symbol, raksha::ir::datalog::Number>::ToDatalogString() const::{lambda(std::__1::basic_string<char, std::__1::char_traits<char>, std::__1::allocator<char> >*, auto:1 const&)#1}::operator()<raksha::ir::datalog::Number>(std::__1::basic_string<char, std::__1::char_traits<char>, std::__1::allocator<char> >*, raksha::ir::datalog::Number const&) const
Line
Count
Source
97
734
                              [](std::string *out, const auto &arg) {
98
734
                                absl::StrAppend(out, arg.ToDatalogString());
99
734
                              }));
Unexecuted instantiation: value_test.cc:auto raksha::ir::datalog::Record<raksha::ir::datalog::Number, raksha::ir::datalog::(anonymous namespace)::NumList>::ToDatalogString() const::{lambda(std::__1::basic_string<char, std::__1::char_traits<char>, std::__1::allocator<char> >*, auto:1 const&)#1}::operator()<raksha::ir::datalog::Number>(std::__1::basic_string<char, std::__1::char_traits<char>, std::__1::allocator<char> >*, raksha::ir::datalog::Number const&) const
Unexecuted instantiation: value_test.cc:auto raksha::ir::datalog::Record<raksha::ir::datalog::Number, raksha::ir::datalog::(anonymous namespace)::NumList>::ToDatalogString() const::{lambda(std::__1::basic_string<char, std::__1::char_traits<char>, std::__1::allocator<char> >*, auto:1 const&)#1}::operator()<raksha::ir::datalog::(anonymous namespace)::NumList>(std::__1::basic_string<char, std::__1::char_traits<char>, std::__1::allocator<char> >*, raksha::ir::datalog::(anonymous namespace)::NumList const&) const
auto raksha::ir::datalog::Record<raksha::ir::datalog::Number, raksha::ir::datalog::Symbol>::ToDatalogString() const::{lambda(std::__1::basic_string<char, std::__1::char_traits<char>, std::__1::allocator<char> >*, auto:1 const&)#1}::operator()<raksha::ir::datalog::Number>(std::__1::basic_string<char, std::__1::char_traits<char>, std::__1::allocator<char> >*, raksha::ir::datalog::Number const&) const
Line
Count
Source
97
1.58k
                              [](std::string *out, const auto &arg) {
98
1.58k
                                absl::StrAppend(out, arg.ToDatalogString());
99
1.58k
                              }));
auto raksha::ir::datalog::Record<raksha::ir::datalog::Number, raksha::ir::datalog::Symbol>::ToDatalogString() const::{lambda(std::__1::basic_string<char, std::__1::char_traits<char>, std::__1::allocator<char> >*, auto:1 const&)#1}::operator()<raksha::ir::datalog::Symbol>(std::__1::basic_string<char, std::__1::char_traits<char>, std::__1::allocator<char> >*, raksha::ir::datalog::Symbol const&) const
Line
Count
Source
97
1.58k
                              [](std::string *out, const auto &arg) {
98
1.58k
                                absl::StrAppend(out, arg.ToDatalogString());
99
1.58k
                              }));
auto raksha::ir::datalog::Record<raksha::ir::datalog::Record<raksha::ir::datalog::Number, raksha::ir::datalog::Symbol>, raksha::ir::datalog::Record<raksha::ir::datalog::Number, raksha::ir::datalog::Symbol> >::ToDatalogString() const::{lambda(std::__1::basic_string<char, std::__1::char_traits<char>, std::__1::allocator<char> >*, auto:1 const&)#1}::operator()<raksha::ir::datalog::Record<raksha::ir::datalog::Number, raksha::ir::datalog::Symbol> >(std::__1::basic_string<char, std::__1::char_traits<char>, std::__1::allocator<char> >*, raksha::ir::datalog::Record<raksha::ir::datalog::Number, raksha::ir::datalog::Symbol> const&) const
Line
Count
Source
97
1.58k
                              [](std::string *out, const auto &arg) {
98
1.58k
                                absl::StrAppend(out, arg.ToDatalogString());
99
1.58k
                              }));
100
3.11k
  }
Unexecuted instantiation: raksha::ir::datalog::Record<raksha::ir::datalog::Record<raksha::ir::datalog::Symbol, raksha::ir::datalog::Number> >::ToDatalogString() const
raksha::ir::datalog::Record<raksha::ir::datalog::Symbol, raksha::ir::datalog::Number>::ToDatalogString() const
Line
Count
Source
93
734
  std::string ToDatalogString() const override {
94
734
    if (!record_arguments_) return "nil";
95
734
    return absl::StrFormat(
96
734
        "[%s]", absl::StrJoin(*record_arguments_, ", ",
97
734
                              [](std::string *out, const auto &arg) {
98
734
                                absl::StrAppend(out, arg.ToDatalogString());
99
734
                              }));
100
734
  }
Unexecuted instantiation: value_test.cc:raksha::ir::datalog::Record<raksha::ir::datalog::Number, raksha::ir::datalog::(anonymous namespace)::NumList>::ToDatalogString() const
raksha::ir::datalog::Record<raksha::ir::datalog::Number, raksha::ir::datalog::Symbol>::ToDatalogString() const
Line
Count
Source
93
1.58k
  std::string ToDatalogString() const override {
94
1.58k
    if (!record_arguments_) return "nil";
95
1.58k
    return absl::StrFormat(
96
1.58k
        "[%s]", absl::StrJoin(*record_arguments_, ", ",
97
1.58k
                              [](std::string *out, const auto &arg) {
98
1.58k
                                absl::StrAppend(out, arg.ToDatalogString());
99
1.58k
                              }));
100
1.58k
  }
raksha::ir::datalog::Record<raksha::ir::datalog::Record<raksha::ir::datalog::Number, raksha::ir::datalog::Symbol>, raksha::ir::datalog::Record<raksha::ir::datalog::Number, raksha::ir::datalog::Symbol> >::ToDatalogString() const
Line
Count
Source
93
792
  std::string ToDatalogString() const override {
94
792
    if (!record_arguments_) return "nil";
95
792
    return absl::StrFormat(
96
792
        "[%s]", absl::StrJoin(*record_arguments_, ", ",
97
792
                              [](std::string *out, const auto &arg) {
98
792
                                absl::StrAppend(out, arg.ToDatalogString());
99
792
                              }));
100
792
  }
101
102
 private:
103
  std::unique_ptr<std::tuple<RecordFieldValueTypes...>> record_arguments_;
104
};
105
106
class Adt : public Value {
107
 public:
108
88
  explicit Adt(absl::string_view branch_name) : branch_name_(branch_name) {}
109
110
0
  std::string ToDatalogString() const {
111
0
    return absl::StrFormat(
112
0
        "$%s(%s)", branch_name_,
113
0
        absl::StrJoin(arguments_, ", ", [](std::string *str, const auto &arg) {
114
0
          absl::StrAppend(str, arg->ToDatalogString());
115
0
        }));
116
0
  }
117
118
 protected:
119
  std::vector<std::unique_ptr<Value>> arguments_;
120
121
 private:
122
  absl::string_view branch_name_;
123
};
124
125
}  // namespace raksha::ir::datalog
126
127
#endif  // SRC_IR_DATALOG_VALUE_H_