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