this repo has no description
1/* -*- mode: C++; c-basic-offset: 2; indent-tabs-mode: nil -*- */
2
3/*
4 * Main authors:
5 * Jip J. Dekker <jip.dekker@monash.edu>
6 * Guido Tack <guido.tack@monash.edu>
7 */
8
9/* This Source Code Form is subject to the terms of the Mozilla Public
10 * License, v. 2.0. If a copy of the MPL was not distributed with this
11 * file, You can obtain one at http://mozilla.org/MPL/2.0/. */
12
13#include <minizinc/interpreter.hh>
14#include <minizinc/interpreter/constraint.hh>
15#include <minizinc/interpreter/primitives.hh>
16
17namespace MiniZinc {
18
19Constraint::Constraint(Interpreter* interpreter, int pred, char mode, arg_iter arg_start,
20 arg_iter arg_end, size_t nargs, Val ann, Val defines, bool delayed)
21 : _pred(pred), _mode(mode), _size(nargs), _scheduled(0), _delayed(delayed) {
22 _ann.addRef(interpreter);
23 int i = 0;
24 for (auto it = arg_start; it != arg_end; ++it) {
25 new (&_args[i]) Val(*it);
26 _args[i].addRef(interpreter);
27 if (!_delayed && pred > PrimitiveMap::MAX_LIN) {
28 _args[i].finalizeLin(interpreter);
29 }
30 ++i;
31 }
32 assert(i == nargs);
33}
34
35Constraint::Constraint(Interpreter* interpreter, int pred, char mode, const std::vector<Val>& args,
36 Val ann, Val defines, bool delayed)
37 : _pred(pred), _mode(mode), _size(args.size()), _scheduled(0), _delayed(delayed) {
38 _ann.addRef(interpreter);
39 for (unsigned int i = 0; i < args.size(); i++) {
40 new (&_args[i]) Val(args[i]);
41 _args[i].addRef(interpreter);
42 if (!_delayed && pred > PrimitiveMap::MAX_LIN) {
43 _args[i].finalizeLin(interpreter);
44 }
45 }
46}
47
48std::pair<Constraint*, bool> Constraint::a(Interpreter* interpreter, int pred, char mode,
49 arg_iter arg_start, arg_iter arg_end, size_t nargs,
50 Val defines, Val ann, bool delayed) {
51 Constraint* c = static_cast<Constraint*>(
52 ::malloc(sizeof(Constraint) + sizeof(Val) * (std::max(0, static_cast<int>(nargs) - 1))));
53 c = new (c) Constraint(interpreter, pred, mode, arg_start, arg_end, nargs, ann, defines, delayed);
54 PropStatus ps = interpreter->subscribe(c);
55 if (ps == PS_ENTAILED || ps == PS_FAILED) {
56 interpreter->unsubscribe(c);
57 c->destroy(interpreter);
58 ::free(c);
59 return {nullptr, ps == PS_ENTAILED};
60 }
61 return {c, true};
62}
63
64std::pair<Constraint*, bool> Constraint::a(Interpreter* interpreter, int pred, char mode,
65 const std::vector<Val>& args, Val defines, Val ann,
66 bool delayed) {
67 Constraint* c = static_cast<Constraint*>(::malloc(
68 sizeof(Constraint) + sizeof(Val) * (std::max(0, static_cast<int>(args.size()) - 1))));
69 c = new (c) Constraint(interpreter, pred, mode, args, ann, defines, delayed);
70 PropStatus ps = interpreter->subscribe(c);
71 if (ps == PS_ENTAILED || ps == PS_FAILED) {
72 interpreter->unsubscribe(c);
73 c->destroy(interpreter);
74 ::free(c);
75 return {nullptr, ps == PS_ENTAILED};
76 }
77 return {c, true};
78}
79
80void Constraint::destroy(Interpreter* interpreter) {
81 for (unsigned int i = 0; i < _size; i++) {
82 _args[i].rmRef(interpreter);
83 }
84 if (delayed()) {
85 interpreter->remove_delayed(this);
86 }
87}
88
89void Constraint::reconstruct(Interpreter* interpreter) {
90 for (unsigned int i = 0; i < _size; i++) {
91 _args[i].addRef(interpreter);
92 }
93}
94
95} // namespace MiniZinc