this repo has no description
at develop 3.4 kB view raw
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