1 /* -*- mode: C++; c-basic-offset: 2; indent-tabs-mode: nil -*- */ 2 /* 3 * Main authors: 4 * Christian Schulte <schulte@gecode.org> 5 * 6 * Copyright: 7 * Christian Schulte, 2016 8 * 9 * This file is part of Gecode, the generic constraint 10 * development environment: 11 * http://www.gecode.org 12 * 13 * Permission is hereby granted, free of charge, to any person obtaining 14 * a copy of this software and associated documentation files (the 15 * "Software"), to deal in the Software without restriction, including 16 * without limitation the rights to use, copy, modify, merge, publish, 17 * distribute, sublicense, and/or sell copies of the Software, and to 18 * permit persons to whom the Software is furnished to do so, subject to 19 * the following conditions: 20 * 21 * The above copyright notice and this permission notice shall be 22 * included in all copies or substantial portions of the Software. 23 * 24 * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, 25 * EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF 26 * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND 27 * NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE 28 * LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION 29 * OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION 30 * WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. 31 * 32 */ 33 34 namespace Gecode { namespace Set { 35 36 /// Duplicate of a set view 37 class SetTraceView { 38 protected: 39 /// Copy of the greatest lower bound 40 RangeList* _glb; 41 /// Copy of the least upper bound 42 RangeList* _lub; 43 public: 44 /// Default constructor (initializes with no view) 45 SetTraceView(void); 46 /// Duplicate view \a x 47 SetTraceView(Space& home, SetView x); 48 /// Return range list for greatest lower bound 49 RangeList* glb(void) const; 50 /// Return range list for leat upper bound 51 RangeList* lub(void) const; 52 /// Update duplicated view from view \a y and delta \a d 53 void prune(Space& home, SetView y, const Delta& d); 54 /// Update during cloning 55 void update(Space& home, SetTraceView x); 56 /// Return slack for \a x 57 static unsigned long long int slack(SetView x); 58 }; 59 60 forceinline SetTraceView(void)61 SetTraceView::SetTraceView(void) {} 62 forceinline SetTraceView(Space & home,SetView x)63 SetTraceView::SetTraceView(Space& home, SetView x) { 64 GlbRanges<SetView> glbi(x); 65 RangeList::copy(home,_glb,glbi); 66 LubRanges<SetView> lubi(x); 67 RangeList::copy(home,_lub,lubi); 68 } 69 forceinline RangeList* glb(void) const70 SetTraceView::glb(void) const { 71 return _glb; 72 } 73 forceinline RangeList* lub(void) const74 SetTraceView::lub(void) const { 75 return _lub; 76 } 77 forceinline void prune(Space & home,SetView x,const Delta &)78 SetTraceView::prune(Space& home, SetView x, const Delta&) { 79 GlbRanges<SetView> glbi(x); 80 RangeList::overwrite(home,_glb,glbi); 81 LubRanges<SetView> lubi(x); 82 RangeList::overwrite(home,_lub,lubi); 83 } 84 forceinline void update(Space & home,SetTraceView x)85 SetTraceView::update(Space& home, SetTraceView x) { 86 Iter::Ranges::RangeList glbi(x._glb); 87 RangeList::copy(home,_glb,glbi); 88 Iter::Ranges::RangeList lubi(x._lub); 89 RangeList::copy(home,_lub,lubi); 90 } 91 92 forceinline unsigned long long int slack(SetView x)93 SetTraceView::slack(SetView x) { 94 return x.unknownSize(); 95 } 96 97 }} 98 99 // STATISTICS: set-trace 100