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>
150 DomExpr<Args...>::post(Home home, BoolVar b,
bool neg,
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));
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 toplevel namespace
void dom(Home home, FloatVar x, FloatVal n)
Propagates .
Post propagator for SetVar x