49 template<std::size_t...>
52 template<std::size_t N, std::size_t... I>
53 struct make_sequence : make_sequence<N - 1, N - 1, I...> {};
55 template<std::size_t... I>
56 struct make_sequence<0, I...> {
61 template<std::size_t... I>
64 template<
typename... Ts>
65 using index_sequence_for =
typename detail::make_sequence<
sizeof...(Ts)>::type;
73 template<
typename... Args>
81 template<std::size_t... I>
82 void apply(Home, BoolVar,
IntPropLevel, cxx14::index_sequence<I...>);
86 std::tuple<Args...> _args;
90 template<
typename... Args>
91 class DomArgs<IntVar, Args...> {
94 DomArgs(IntVar, Args...);
98 template<std::size_t... I>
99 void apply(Home, BoolVar,
IntPropLevel, cxx14::index_sequence<I...>);
103 std::tuple<IntVar, Args...> _args;
110 template<
typename... Args>
111 DomArgs<Args...>::DomArgs(Args... args)
112 : _args(std::forward<Args>(args)...) {}
114 template<
typename... Args>
115 template<std::size_t... I>
118 cxx14::index_sequence<I...>) {
119 dom(home, std::get<I>(_args)..., b);
122 template<
typename... Args>
123 DomArgs<IntVar, Args...>::DomArgs(IntVar
x, Args... args)
124 : _args (x, std::forward<Args>(args)...) {}
126 template<
typename... Args>
127 template<std::size_t... I>
129 DomArgs<IntVar, Args...>::apply(Home home, BoolVar b,
IntPropLevel ipl,
130 cxx14::index_sequence<I...>) {
131 dom(home, std::get<I>(_args)..., b, ipl);
136 template<
typename... Args>
137 class DomExpr :
public DomArgs<Args...>,
public BoolExpr::Misc
140 using DomArgs<Args...>::DomArgs;
145 virtual ~DomExpr() =
default;
148 template<
typename... Args>
152 DomArgs<Args...>::apply(home, neg ? (!b).
expr (home, ipl) : b, ipl,
153 cxx14::index_sequence_for<Args...>{});
164 return BoolExpr(
new DomExpr<IntVar, int>(x, n));
169 return BoolExpr(
new DomExpr<IntVar, int, int>(x, l, u));
174 return BoolExpr(
new DomExpr<IntVar, IntSet>(x, s));
177 #ifdef GECODE_HAS_SET_VARS 180 return BoolExpr(
new DomExpr<SetVar, SetRelType, int>(x, rt, i));
185 return BoolExpr(
new DomExpr<SetVar, SetRelType, int, int>(x, rt, i, j));
190 return BoolExpr(
new DomExpr<SetVar, SetRelType, IntSet>(x, rt, s));
194 #ifdef GECODE_HAS_FLOAT_VARS 197 return BoolExpr(
new DomExpr<FloatVar, FloatVal>(x, n));
202 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.