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...> {
53 using type = sequence<I...>;
57 template<std::size_t... I>
58 using index_sequence = detail::sequence<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,
const IntPropLevels&,
79 cxx14::index_sequence<I...>);
83 std::tuple<Args...> _args;
87 template<
typename... Args>
88 class DomArgs<IntVar, Args...> {
91 DomArgs(IntVar, Args...);
95 template<std::size_t... I>
96 void apply(Home, BoolVar,
const IntPropLevels&,
97 cxx14::index_sequence<I...>);
101 std::tuple<IntVar, Args...> _args;
108 template<
typename... Args>
109 DomArgs<Args...>::DomArgs(Args... args)
110 : _args(
std::forward<Args>(args)...) {}
112 template<
typename... Args>
113 template<std::size_t... I>
115 DomArgs<Args...>::apply(Home home, BoolVar
b,
const IntPropLevels&,
116 cxx14::index_sequence<I...>) {
117 dom(home, std::get<I>(_args)...,
b);
120 template<
typename... Args>
121 DomArgs<IntVar, Args...>::DomArgs(IntVar
x, Args... args)
122 : _args (
x,
std::forward<Args>(args)...) {}
124 template<
typename... Args>
125 template<std::size_t... I>
127 DomArgs<IntVar, Args...>::apply(Home home, BoolVar
b,
128 const IntPropLevels&,
129 cxx14::index_sequence<I...>) {
130 dom(home, std::get<I>(_args)...,
b);
135 template<
typename... Args>
136 class DomExpr :
public DomArgs<Args...>,
public BoolExpr::Misc
139 using DomArgs<Args...>::DomArgs;
142 virtual void post(Home, BoolVar
b,
bool neg,
143 const IntPropLevels&)
override;
145 virtual ~DomExpr() =
default;
148 template<
typename... Args>
151 const IntPropLevels& ipls)
153 DomArgs<Args...>::apply(home,
neg ? (!
b).expr (home, ipls) :
b, ipls,
154 cxx14::index_sequence_for<Args...>{});
165 return BoolExpr(
new DomExpr<IntVar, int>(
x,
n));
170 return BoolExpr(
new DomExpr<IntVar, int, int>(
x,
l,
u));
175 return BoolExpr(
new DomExpr<IntVar, IntSet>(
x, s));
178 #ifdef GECODE_HAS_SET_VARS
181 return BoolExpr(
new DomExpr<SetVar, SetRelType, int>(
x, rt,
i));
186 return BoolExpr(
new DomExpr<SetVar, SetRelType, int, int>(
x, rt,
i, j));
191 return BoolExpr(
new DomExpr<SetVar, SetRelType, IntSet>(
x, rt, s));
195 #ifdef GECODE_HAS_FLOAT_VARS
198 return BoolExpr(
new DomExpr<FloatVar, FloatVal>(
x,
n));
203 return BoolExpr(
new DomExpr<FloatVar, FloatNum, FloatNum>(
x,
l,
u));
struct Gecode::@602::NNF::@65::@66 b
For binary nodes (and, or, eqv)
union Gecode::@602::NNF::@65 u
Union depending on nodetype t.
int n
Number of negative literals for node type.
Node * x
Pointer to corresponding Boolean expression node.
bool neg
Is atomic formula negative.
void dom(Home home, FloatVar x, FloatVal n)
Propagates .
void post(Home home, Term *t, int n, FloatRelType frt, FloatVal c)
Post propagator for linear constraint over floats.
double FloatNum
Floating point number base type.
SetRelType
Common relation types for sets.
Gecode::IntArgs i({1, 2, 3, 4})