45 template<std::size_t...>
48 template<std::size_t N, std::size_t... I>
49 struct make_sequence : make_sequence<N - 1, N - 1, I...> {};
51 template<std::size_t... I>
52 struct make_sequence<0, I...> {
57 template<std::size_t... I>
60 template<
typename... Ts>
61 using index_sequence_for =
typename detail::make_sequence<
sizeof...(Ts)>::type;
69 template<
typename... Args>
77 template<std::size_t... I>
78 void apply(Home, BoolVar,
IntPropLevel, cxx14::index_sequence<I...>);
82 std::tuple<Args...> _args;
86 template<
typename... Args>
87 class DomArgs<IntVar, Args...> {
90 DomArgs(IntVar, Args...);
94 template<std::size_t... I>
95 void apply(Home, BoolVar,
IntPropLevel, cxx14::index_sequence<I...>);
99 std::tuple<IntVar, Args...> _args;
106 template<
typename... Args>
107 DomArgs<Args...>::DomArgs(Args... args)
108 : _args(std::forward<Args>(args)...) {}
110 template<
typename... Args>
111 template<std::size_t... I>
114 cxx14::index_sequence<I...>) {
115 dom(home, std::get<I>(_args)..., b);
118 template<
typename... Args>
119 DomArgs<IntVar, Args...>::DomArgs(IntVar
x, Args... args)
120 : _args (x, std::forward<Args>(args)...) {}
122 template<
typename... Args>
123 template<std::size_t... I>
125 DomArgs<IntVar, Args...>::apply(Home home, BoolVar b,
IntPropLevel ipl,
126 cxx14::index_sequence<I...>) {
127 dom(home, std::get<I>(_args)..., b, ipl);
132 template<
typename... Args>
133 class DomExpr :
public DomArgs<Args...>,
public BoolExpr::Misc
136 using DomArgs<Args...>::DomArgs;
141 virtual ~DomExpr() =
default;
144 template<
typename... Args>
148 DomArgs<Args...>::apply(home, neg ? (!b).
expr (home, ipl) : b, ipl,
149 cxx14::index_sequence_for<Args...>{});
160 return BoolExpr(
new DomExpr<IntVar, int>(x, n));
165 return BoolExpr(
new DomExpr<IntVar, int, int>(x, l, u));
170 return BoolExpr(
new DomExpr<IntVar, IntSet>(x, s));
173 #ifdef GECODE_HAS_SET_VARS 176 return BoolExpr(
new DomExpr<SetVar, SetRelType, int>(x, rt, i));
181 return BoolExpr(
new DomExpr<SetVar, SetRelType, int, int>(x, rt, i, j));
186 return BoolExpr(
new DomExpr<SetVar, SetRelType, IntSet>(x, rt, s));
190 #ifdef GECODE_HAS_FLOAT_VARS 193 return BoolExpr(
new DomExpr<FloatVar, FloatVal>(x, n));
198 return BoolExpr(
new DomExpr<FloatVar, FloatNum, FloatNum>(x, l, u));
void dom(Home home, const SetVarArgs &x, const SetVarArgs &d)
Constrain domain of according to domain of for all .
SetRelType
Common relation types for sets.
void post(Home home, Term *t, int n, FloatRelType frt, FloatVal c)
Post propagator for linear constraint over floats.
void sequence(Home home, const IntVarArgs &x, const IntSet &s, int q, int l, int u, IntPropLevel)
Post propagator for .
Gecode::IntArgs i(4, 1, 2, 3, 4)
int n
Number of negative literals for node type.
union Gecode::@585::NNF::@62 u
Union depending on nodetype t.
BoolVar expr(Home home, const BoolExpr &e, IntPropLevel ipl)
Post Boolean expression and return its value.
IntPropLevel
Propagation levels for integer propagators.
struct Gecode::@585::NNF::@62::@63 b
For binary nodes (and, or, eqv)
Node * x
Pointer to corresponding Boolean expression node.
Gecode toplevel namespace
double FloatNum
Floating point number base type.
bool neg
Is atomic formula negative.