8000 prettify · Z80coder/datalog-cpp@59bcf6c · GitHub
[go: up one dir, main page]

Skip to content

Commit 59bcf6c

Browse files
committed
prettify
1 parent 18941d0 commit 59bcf6c

File tree

2 files changed

+45
-39
lines changed

2 files changed

+45
-39
lines changed

src/Datalog.h

Lines changed: 13 additions & 19 deletions
Original file line numberDiff line numberDiff line change
@@ -20,6 +20,7 @@ using namespace std;
2020
template <typename T>
2121
struct Symbol : optional<T>
2222
{
23+
//typedef shared_ptr<Symbol> Type;
2324

2425
void bind(const T &value)
2526
{
@@ -43,23 +44,17 @@ struct Symbol : optional<T>
4344
}
4445
};
4546

46-
template<typename T>
47-
shared_ptr<Symbol<T>> symbol() {
48-
return make_shared<Symbol<T>>();
49-
}
50-
5147
template <typename T>
52-
struct SymbolOrValue : public variant<T, shared_ptr<Symbol<T>>>
48+
struct SymbolOrValue : public variant<T, Symbol<T>*>
5349
{
54-
55-
typedef shared_ptr<Symbol<T>> SymbolType;
50+
typedef Symbol<T>* SymbolType;
5651

5752
bool isSym() const
5853
{
5954
return holds_alternative<SymbolType>(*this);
6055
}
6156

62-
const shared_ptr<Symbol<T>> &
57+
const SymbolType
6358
getSym() const
6459
{
6560
return get<SymbolType>(*this);
@@ -72,6 +67,11 @@ struct SymbolOrValue : public variant<T, shared_ptr<Symbol<T>>>
7267
}
7368
};
7469

70+
template <typename T>
71+
static SymbolOrValue<T> sym(Symbol<T>& symbol) {
72+
return SymbolOrValue<T>{ &symbol };
73+
}
74+
7575
template <typename T>
7676
static ostream &
7777
operator<<(ostream &out, const SymbolOrValue<T> &s)
@@ -135,7 +135,7 @@ bool bind(SymbolOrValue<VALUE_TYPE> &s, const VALUE_TYPE &v)
135135
{
136136
if (s.isSym())
137137
{
138-
Symbol<VALUE_TYPE> &symbol = *s.getSym().get();
138+
Symbol<VALUE_TYPE> &symbol = *s.getSym();
139139
// has the symbol already been bound?
140140
if (symbol.isBound())
141141
{
@@ -209,20 +209,14 @@ static RELATION_TYPE bind(
209209
template <typename HEAD_RELATION, typename... BODY_RELATIONs>
210210
struct Rule
211211
{
212-
const typename HEAD_RELATION::Atom head;
212+
typedef Rule Define;
213+
typedef typename HEAD_RELATION::Atom HeadType;
214+
const HeadType head;
213215
typedef tuple<BODY_RELATIONs...> BodyRelations;
214216
typedef tuple<typename BODY_RELATIONs::Atom...> BodyType;
215217
const BodyType body;
216218
};
217219

218-
#if 0
219-
template <typename HEAD_RELATION, typename... BODY_RELATIONs>
220-
static Rule<HEAD_RELATION, BODY_RELATIONs...> rule(const typename HEAD_RELATION::Atom &head, const tuple<typename BODY_RELATIONs::Atom...> &body)
221-
{
222-
return Rule<HEAD_RELATION, BODY_RELATIONs...>{head, body};
223-
}
224-
#endif
225-
226220
template <typename... RELATIONs>
227221
struct State
228222
{

tests/types_test.cpp

Lines changed: 32 additions & 20 deletions
Original file line numberDiff line numberDiff line change
@@ -31,12 +31,12 @@ int main()
3131
#endif
3232
}
3333
{
34-
auto a = symbol<int>();
35-
auto b = symbol<int>();
36-
Int_Int::Atom r1{{1}, {a}};
37-
String_Int::Atom r2{{"world"}, {b}};
38-
auto c = symbol<string>();
39-
String_Int_String::Atom r3{{"hello"}, {1}, {c}};
34+
Symbol<int> a;
35+
Symbol<int> b;
36+
Int_Int::Atom r1{{1}, sym(a)};
37+
String_Int::Atom r2{{"world"}, sym(b)};
38+
Symbol<string> c;
39+
String_Int_String::Atom r3{{"hello"}, {1}, sym(c)};
4040
}
4141

4242
{
@@ -49,26 +49,38 @@ int main()
4949
{
5050
};
5151

52-
auto x = symbol<string>();
53-
auto y = symbol<string>();
54-
auto z = symbol<string>();
52+
Symbol<string> x;
53+
Symbol<string> y;
54+
Symbol<string> z;
5555

5656
// Rule1
57-
Adviser::Atom clause1{{x}, {y}};
58-
auto rule11 = Rule<AcademicAncestor, Adviser>{
59-
{{x}, {y}},
57+
Adviser::Atom clause1{sym(x), sym(y)};
58+
auto rule1 = Rule<AcademicAncestor, Adviser>{
59+
{sym(x), sym(y)},
6060
{
61-
{{x}, {y}}
61+
{sym(x), sym(y)}
6262
}
6363
};
6464

65+
// Rule1 alternative
66+
struct AdviserIsAnAcademicAncestor : Rule<AcademicAncestor, Adviser> {
67+
Symbol<string> x, y, z;
68+
69+
AdviserIsAnAcademicAncestor() : Define{
70+
AcademicAncestor::Atom{sym(x), sym(y)},
71+
{
72+
Adviser::Atom{sym(x), sym(y)}
73+
}
74+
} {};
75+
};
76+
6577
// Rule2
6678
typedef Rule<AcademicAncestor, Adviser, AcademicAncestor> Rule2Type;
6779
auto rule2 = Rule2Type{
68-
{{x}, {z}},
80+
AcademicAncestor::Atom{sym(x), sym(z)},
6981
{
70-
{{x}, {y}},
71-
{{y}, {z}}
82+
Adviser::Atom{sym(x), sym(y)},
83+
AcademicAncestor::Atom{sym(y), sym(z)}
7284
}
7385
};
7486

@@ -78,10 +90,10 @@ int main()
7890
};
7991

8092
auto query1 = Rule<Query1, AcademicAncestor, AcademicAncestor>{
81-
{{x}},
93+
{sym(x)},
8294
{
83-
{{"Robin Milner"}, {x}},
84-
{{x}, {"Mistral Contrastin"}}
95+
{{"Robin Milner"}, sym(x)},
96+
{sym(x), {"Mistral Contrastin"}}
8597
}
8698
};
8799

@@ -97,7 +109,7 @@ int main()
97109
}
98110

99111
// Bind 1 atom with 1 fact
100-
Adviser::Atom dummyClause{{x}, {x}};
112+
Adviser::Atom dummyClause{sym(x), sym(x)};
101113
if (bind<Adviser>(dummyClause, fact1))
102114
{
103115
cout << "successful bind" << endl;

0 commit comments

Comments
 (0)
0