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, 2012 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 { 35 36 forceinline IntVarBranch(void)37 IntVarBranch::IntVarBranch(void) 38 : s(SEL_NONE) {} 39 40 forceinline IntVarBranch(Select s0,BranchTbl t)41 IntVarBranch::IntVarBranch(Select s0, BranchTbl t) 42 : VarBranch<IntVar>(t), s(s0) {} 43 44 forceinline IntVarBranch(Rnd r)45 IntVarBranch::IntVarBranch(Rnd r) 46 : VarBranch<IntVar>(r), s(SEL_RND) {} 47 48 forceinline IntVarBranch(Select s0,double d,BranchTbl t)49 IntVarBranch::IntVarBranch(Select s0, double d, BranchTbl t) 50 : VarBranch<IntVar>(d,t), s(s0) {} 51 52 forceinline IntVarBranch(Select s0,IntAFC a,BranchTbl t)53 IntVarBranch::IntVarBranch(Select s0, IntAFC a, BranchTbl t) 54 : VarBranch<IntVar>(a,t), s(s0) {} 55 56 forceinline IntVarBranch(Select s0,IntAction a,BranchTbl t)57 IntVarBranch::IntVarBranch(Select s0, IntAction a, BranchTbl t) 58 : VarBranch<IntVar>(a,t), s(s0) {} 59 60 forceinline IntVarBranch(Select s0,IntCHB c,BranchTbl t)61 IntVarBranch::IntVarBranch(Select s0, IntCHB c, BranchTbl t) 62 : VarBranch<IntVar>(c,t), s(s0) {} 63 64 forceinline IntVarBranch(Select s0,IntBranchMerit mf,BranchTbl t)65 IntVarBranch::IntVarBranch(Select s0, IntBranchMerit mf, BranchTbl t) 66 : VarBranch<IntVar>(mf,t), s(s0) {} 67 68 forceinline IntVarBranch::Select select(void) const69 IntVarBranch::select(void) const { 70 return s; 71 } 72 73 forceinline void expand(Home home,const IntVarArgs & x)74 IntVarBranch::expand(Home home, const IntVarArgs& x) { 75 switch (select()) { 76 case SEL_AFC_MIN: case SEL_AFC_MAX: 77 case SEL_AFC_SIZE_MIN: case SEL_AFC_SIZE_MAX: 78 if (!_afc) 79 _afc = IntAFC(home,x,decay()); 80 break; 81 case SEL_ACTION_MIN: case SEL_ACTION_MAX: 82 case SEL_ACTION_SIZE_MIN: case SEL_ACTION_SIZE_MAX: 83 if (!_act) 84 _act = IntAction(home,x,decay()); 85 break; 86 case SEL_CHB_MIN: case SEL_CHB_MAX: 87 case SEL_CHB_SIZE_MIN: case SEL_CHB_SIZE_MAX: 88 if (!_chb) 89 _chb = IntCHB(home,x); 90 break; 91 default: ; 92 } 93 } 94 95 inline IntVarBranch INT_VAR_NONE(void)96 INT_VAR_NONE(void) { 97 return IntVarBranch(IntVarBranch::SEL_NONE,nullptr); 98 } 99 100 inline IntVarBranch INT_VAR_RND(Rnd r)101 INT_VAR_RND(Rnd r) { 102 return IntVarBranch(r); 103 } 104 105 inline IntVarBranch INT_VAR_MERIT_MIN(IntBranchMerit bm,BranchTbl tbl)106 INT_VAR_MERIT_MIN(IntBranchMerit bm, BranchTbl tbl) { 107 return IntVarBranch(IntVarBranch::SEL_MERIT_MIN,bm,tbl); 108 } 109 110 inline IntVarBranch INT_VAR_MERIT_MAX(IntBranchMerit bm,BranchTbl tbl)111 INT_VAR_MERIT_MAX(IntBranchMerit bm, BranchTbl tbl) { 112 return IntVarBranch(IntVarBranch::SEL_MERIT_MAX,bm,tbl); 113 } 114 115 inline IntVarBranch INT_VAR_DEGREE_MIN(BranchTbl tbl)116 INT_VAR_DEGREE_MIN(BranchTbl tbl) { 117 return IntVarBranch(IntVarBranch::SEL_DEGREE_MIN,tbl); 118 } 119 120 inline IntVarBranch INT_VAR_DEGREE_MAX(BranchTbl tbl)121 INT_VAR_DEGREE_MAX(BranchTbl tbl) { 122 return IntVarBranch(IntVarBranch::SEL_DEGREE_MAX,tbl); 123 } 124 125 inline IntVarBranch INT_VAR_AFC_MIN(double d,BranchTbl tbl)126 INT_VAR_AFC_MIN(double d, BranchTbl tbl) { 127 return IntVarBranch(IntVarBranch::SEL_AFC_MIN,d,tbl); 128 } 129 130 inline IntVarBranch INT_VAR_AFC_MIN(IntAFC a,BranchTbl tbl)131 INT_VAR_AFC_MIN(IntAFC a, BranchTbl tbl) { 132 return IntVarBranch(IntVarBranch::SEL_AFC_MIN,a,tbl); 133 } 134 135 inline IntVarBranch INT_VAR_AFC_MAX(double d,BranchTbl tbl)136 INT_VAR_AFC_MAX(double d, BranchTbl tbl) { 137 return IntVarBranch(IntVarBranch::SEL_AFC_MAX,d,tbl); 138 } 139 140 inline IntVarBranch INT_VAR_AFC_MAX(IntAFC a,BranchTbl tbl)141 INT_VAR_AFC_MAX(IntAFC a, BranchTbl tbl) { 142 return IntVarBranch(IntVarBranch::SEL_AFC_MAX,a,tbl); 143 } 144 145 inline IntVarBranch INT_VAR_ACTION_MIN(double d,BranchTbl tbl)146 INT_VAR_ACTION_MIN(double d, BranchTbl tbl) { 147 return IntVarBranch(IntVarBranch::SEL_ACTION_MIN,d,tbl); 148 } 149 150 inline IntVarBranch INT_VAR_ACTION_MIN(IntAction a,BranchTbl tbl)151 INT_VAR_ACTION_MIN(IntAction a, BranchTbl tbl) { 152 return IntVarBranch(IntVarBranch::SEL_ACTION_MIN,a,tbl); 153 } 154 155 inline IntVarBranch INT_VAR_ACTION_MAX(double d,BranchTbl tbl)156 INT_VAR_ACTION_MAX(double d, BranchTbl tbl) { 157 return IntVarBranch(IntVarBranch::SEL_ACTION_MAX,d,tbl); 158 } 159 160 inline IntVarBranch INT_VAR_ACTION_MAX(IntAction a,BranchTbl tbl)161 INT_VAR_ACTION_MAX(IntAction a, BranchTbl tbl) { 162 return IntVarBranch(IntVarBranch::SEL_ACTION_MAX,a,tbl); 163 } 164 165 inline IntVarBranch INT_VAR_CHB_MIN(IntCHB c,BranchTbl tbl)166 INT_VAR_CHB_MIN(IntCHB c, BranchTbl tbl) { 167 return IntVarBranch(IntVarBranch::SEL_CHB_MIN,c,tbl); 168 } 169 170 inline IntVarBranch INT_VAR_CHB_MIN(BranchTbl tbl)171 INT_VAR_CHB_MIN(BranchTbl tbl) { 172 return IntVarBranch(IntVarBranch::SEL_CHB_MIN,tbl); 173 } 174 175 inline IntVarBranch INT_VAR_CHB_MAX(IntCHB c,BranchTbl tbl)176 INT_VAR_CHB_MAX(IntCHB c, BranchTbl tbl) { 177 return IntVarBranch(IntVarBranch::SEL_CHB_MAX,c,tbl); 178 } 179 180 inline IntVarBranch INT_VAR_CHB_MAX(BranchTbl tbl)181 INT_VAR_CHB_MAX(BranchTbl tbl) { 182 return IntVarBranch(IntVarBranch::SEL_CHB_MAX,tbl); 183 } 184 185 inline IntVarBranch INT_VAR_MIN_MIN(BranchTbl tbl)186 INT_VAR_MIN_MIN(BranchTbl tbl) { 187 return IntVarBranch(IntVarBranch::SEL_MIN_MIN,tbl); 188 } 189 190 inline IntVarBranch INT_VAR_MIN_MAX(BranchTbl tbl)191 INT_VAR_MIN_MAX(BranchTbl tbl) { 192 return IntVarBranch(IntVarBranch::SEL_MIN_MAX,tbl); 193 } 194 195 inline IntVarBranch INT_VAR_MAX_MIN(BranchTbl tbl)196 INT_VAR_MAX_MIN(BranchTbl tbl) { 197 return IntVarBranch(IntVarBranch::SEL_MAX_MIN,tbl); 198 } 199 200 inline IntVarBranch INT_VAR_MAX_MAX(BranchTbl tbl)201 INT_VAR_MAX_MAX(BranchTbl tbl) { 202 return IntVarBranch(IntVarBranch::SEL_MAX_MAX,tbl); 203 } 204 205 inline IntVarBranch INT_VAR_SIZE_MIN(BranchTbl tbl)206 INT_VAR_SIZE_MIN(BranchTbl tbl) { 207 return IntVarBranch(IntVarBranch::SEL_SIZE_MIN,tbl); 208 } 209 210 inline IntVarBranch INT_VAR_SIZE_MAX(BranchTbl tbl)211 INT_VAR_SIZE_MAX(BranchTbl tbl) { 212 return IntVarBranch(IntVarBranch::SEL_SIZE_MAX,tbl); 213 } 214 215 inline IntVarBranch INT_VAR_DEGREE_SIZE_MIN(BranchTbl tbl)216 INT_VAR_DEGREE_SIZE_MIN(BranchTbl tbl) { 217 return IntVarBranch(IntVarBranch::SEL_DEGREE_SIZE_MIN,tbl); 218 } 219 220 inline IntVarBranch INT_VAR_DEGREE_SIZE_MAX(BranchTbl tbl)221 INT_VAR_DEGREE_SIZE_MAX(BranchTbl tbl) { 222 return IntVarBranch(IntVarBranch::SEL_DEGREE_SIZE_MAX,tbl); 223 } 224 225 inline IntVarBranch INT_VAR_AFC_SIZE_MIN(double d,BranchTbl tbl)226 INT_VAR_AFC_SIZE_MIN(double d, BranchTbl tbl) { 227 return IntVarBranch(IntVarBranch::SEL_AFC_SIZE_MIN,d,tbl); 228 } 229 230 inline IntVarBranch INT_VAR_AFC_SIZE_MIN(IntAFC a,BranchTbl tbl)231 INT_VAR_AFC_SIZE_MIN(IntAFC a, BranchTbl tbl) { 232 return IntVarBranch(IntVarBranch::SEL_AFC_SIZE_MIN,a,tbl); 233 } 234 235 inline IntVarBranch INT_VAR_AFC_SIZE_MAX(double d,BranchTbl tbl)236 INT_VAR_AFC_SIZE_MAX(double d, BranchTbl tbl) { 237 return IntVarBranch(IntVarBranch::SEL_AFC_SIZE_MAX,d,tbl); 238 } 239 240 inline IntVarBranch INT_VAR_AFC_SIZE_MAX(IntAFC a,BranchTbl tbl)241 INT_VAR_AFC_SIZE_MAX(IntAFC a, BranchTbl tbl) { 242 return IntVarBranch(IntVarBranch::SEL_AFC_SIZE_MAX,a,tbl); 243 } 244 245 inline IntVarBranch INT_VAR_ACTION_SIZE_MIN(double d,BranchTbl tbl)246 INT_VAR_ACTION_SIZE_MIN(double d, BranchTbl tbl) { 247 return IntVarBranch(IntVarBranch::SEL_ACTION_SIZE_MIN,d,tbl); 248 } 249 250 inline IntVarBranch INT_VAR_ACTION_SIZE_MIN(IntAction a,BranchTbl tbl)251 INT_VAR_ACTION_SIZE_MIN(IntAction a, BranchTbl tbl) { 252 return IntVarBranch(IntVarBranch::SEL_ACTION_SIZE_MIN,a,tbl); 253 } 254 255 inline IntVarBranch INT_VAR_ACTION_SIZE_MAX(double d,BranchTbl tbl)256 INT_VAR_ACTION_SIZE_MAX(double d, BranchTbl tbl) { 257 return IntVarBranch(IntVarBranch::SEL_ACTION_SIZE_MAX,d,tbl); 258 } 259 260 inline IntVarBranch INT_VAR_ACTION_SIZE_MAX(IntAction a,BranchTbl tbl)261 INT_VAR_ACTION_SIZE_MAX(IntAction a, BranchTbl tbl) { 262 return IntVarBranch(IntVarBranch::SEL_ACTION_SIZE_MAX,a,tbl); 263 } 264 265 inline IntVarBranch INT_VAR_CHB_SIZE_MIN(IntCHB c,BranchTbl tbl)266 INT_VAR_CHB_SIZE_MIN(IntCHB c, BranchTbl tbl) { 267 return IntVarBranch(IntVarBranch::SEL_CHB_SIZE_MIN,c,tbl); 268 } 269 270 inline IntVarBranch INT_VAR_CHB_SIZE_MIN(BranchTbl tbl)271 INT_VAR_CHB_SIZE_MIN(BranchTbl tbl) { 272 return IntVarBranch(IntVarBranch::SEL_CHB_SIZE_MIN,tbl); 273 } 274 275 inline IntVarBranch INT_VAR_CHB_SIZE_MAX(IntCHB c,BranchTbl tbl)276 INT_VAR_CHB_SIZE_MAX(IntCHB c, BranchTbl tbl) { 277 return IntVarBranch(IntVarBranch::SEL_CHB_SIZE_MAX,c,tbl); 278 } 279 280 inline IntVarBranch INT_VAR_CHB_SIZE_MAX(BranchTbl tbl)281 INT_VAR_CHB_SIZE_MAX(BranchTbl tbl) { 282 return IntVarBranch(IntVarBranch::SEL_CHB_SIZE_MAX,tbl); 283 } 284 285 inline IntVarBranch INT_VAR_REGRET_MIN_MIN(BranchTbl tbl)286 INT_VAR_REGRET_MIN_MIN(BranchTbl tbl) { 287 return IntVarBranch(IntVarBranch::SEL_REGRET_MIN_MIN,tbl); 288 } 289 290 inline IntVarBranch INT_VAR_REGRET_MIN_MAX(BranchTbl tbl)291 INT_VAR_REGRET_MIN_MAX(BranchTbl tbl) { 292 return IntVarBranch(IntVarBranch::SEL_REGRET_MIN_MAX,tbl); 293 } 294 295 inline IntVarBranch INT_VAR_REGRET_MAX_MIN(BranchTbl tbl)296 INT_VAR_REGRET_MAX_MIN(BranchTbl tbl) { 297 return IntVarBranch(IntVarBranch::SEL_REGRET_MAX_MIN,tbl); 298 } 299 300 inline IntVarBranch INT_VAR_REGRET_MAX_MAX(BranchTbl tbl)301 INT_VAR_REGRET_MAX_MAX(BranchTbl tbl) { 302 return IntVarBranch(IntVarBranch::SEL_REGRET_MAX_MAX,tbl); 303 } 304 305 306 307 forceinline BoolVarBranch(void)308 BoolVarBranch::BoolVarBranch(void) 309 : s(SEL_NONE) {} 310 311 forceinline BoolVarBranch(Select s0,BranchTbl t)312 BoolVarBranch::BoolVarBranch(Select s0, BranchTbl t) 313 : VarBranch<BoolVar>(t), s(s0) {} 314 315 forceinline BoolVarBranch(Rnd r)316 BoolVarBranch::BoolVarBranch(Rnd r) 317 : VarBranch<BoolVar>(r), s(SEL_RND) {} 318 319 forceinline BoolVarBranch(Select s0,double d,BranchTbl t)320 BoolVarBranch::BoolVarBranch(Select s0, double d, BranchTbl t) 321 : VarBranch<BoolVar>(d,t), s(s0) {} 322 323 forceinline BoolVarBranch(Select s0,BoolAFC a,BranchTbl t)324 BoolVarBranch::BoolVarBranch(Select s0, BoolAFC a, BranchTbl t) 325 : VarBranch<BoolVar>(a,t), s(s0) {} 326 327 forceinline BoolVarBranch(Select s0,BoolAction a,BranchTbl t)328 BoolVarBranch::BoolVarBranch(Select s0, BoolAction a, BranchTbl t) 329 : VarBranch<BoolVar>(a,t), s(s0) {} 330 331 forceinline BoolVarBranch(Select s0,BoolCHB c,BranchTbl t)332 BoolVarBranch::BoolVarBranch(Select s0, BoolCHB c, BranchTbl t) 333 : VarBranch<BoolVar>(c,t), s(s0) {} 334 335 forceinline BoolVarBranch(Select s0,BoolBranchMerit mf,BranchTbl t)336 BoolVarBranch::BoolVarBranch(Select s0, BoolBranchMerit mf, BranchTbl t) 337 : VarBranch<BoolVar>(mf,t), s(s0) {} 338 339 forceinline BoolVarBranch::Select select(void) const340 BoolVarBranch::select(void) const { 341 return s; 342 } 343 344 forceinline void expand(Home home,const BoolVarArgs & x)345 BoolVarBranch::expand(Home home, const BoolVarArgs& x) { 346 switch (select()) { 347 case SEL_AFC_MIN: case SEL_AFC_MAX: 348 if (!_afc) 349 _afc = BoolAFC(home,x,decay()); 350 break; 351 case SEL_ACTION_MIN: case SEL_ACTION_MAX: 352 if (!_act) 353 _act = BoolAction(home,x,decay()); 354 break; 355 case SEL_CHB_MIN: case SEL_CHB_MAX: 356 if (!_chb) 357 _chb = BoolCHB(home,x); 358 break; 359 default: ; 360 } 361 } 362 363 inline BoolVarBranch BOOL_VAR_NONE(void)364 BOOL_VAR_NONE(void) { 365 return BoolVarBranch(BoolVarBranch::SEL_NONE,nullptr); 366 } 367 368 inline BoolVarBranch BOOL_VAR_RND(Rnd r)369 BOOL_VAR_RND(Rnd r) { 370 return BoolVarBranch(r); 371 } 372 373 inline BoolVarBranch BOOL_VAR_MERIT_MIN(BoolBranchMerit bm,BranchTbl tbl)374 BOOL_VAR_MERIT_MIN(BoolBranchMerit bm, BranchTbl tbl) { 375 return BoolVarBranch(BoolVarBranch::SEL_MERIT_MIN,bm,tbl); 376 } 377 378 inline BoolVarBranch BOOL_VAR_MERIT_MAX(BoolBranchMerit bm,BranchTbl tbl)379 BOOL_VAR_MERIT_MAX(BoolBranchMerit bm, BranchTbl tbl) { 380 return BoolVarBranch(BoolVarBranch::SEL_MERIT_MAX,bm,tbl); 381 } 382 383 inline BoolVarBranch BOOL_VAR_DEGREE_MIN(BranchTbl tbl)384 BOOL_VAR_DEGREE_MIN(BranchTbl tbl) { 385 return BoolVarBranch(BoolVarBranch::SEL_DEGREE_MIN,tbl); 386 } 387 388 inline BoolVarBranch BOOL_VAR_DEGREE_MAX(BranchTbl tbl)389 BOOL_VAR_DEGREE_MAX(BranchTbl tbl) { 390 return BoolVarBranch(BoolVarBranch::SEL_DEGREE_MAX,tbl); 391 } 392 393 inline BoolVarBranch BOOL_VAR_AFC_MIN(double d,BranchTbl tbl)394 BOOL_VAR_AFC_MIN(double d, BranchTbl tbl) { 395 return BoolVarBranch(BoolVarBranch::SEL_AFC_MIN,d,tbl); 396 } 397 398 inline BoolVarBranch BOOL_VAR_AFC_MIN(BoolAFC a,BranchTbl tbl)399 BOOL_VAR_AFC_MIN(BoolAFC a, BranchTbl tbl) { 400 return BoolVarBranch(BoolVarBranch::SEL_AFC_MIN,a,tbl); 401 } 402 403 inline BoolVarBranch BOOL_VAR_AFC_MAX(double d,BranchTbl tbl)404 BOOL_VAR_AFC_MAX(double d, BranchTbl tbl) { 405 return BoolVarBranch(BoolVarBranch::SEL_AFC_MAX,d,tbl); 406 } 407 408 inline BoolVarBranch BOOL_VAR_AFC_MAX(BoolAFC a,BranchTbl tbl)409 BOOL_VAR_AFC_MAX(BoolAFC a, BranchTbl tbl) { 410 return BoolVarBranch(BoolVarBranch::SEL_AFC_MAX,a,tbl); 411 } 412 413 inline BoolVarBranch BOOL_VAR_ACTION_MIN(double d,BranchTbl tbl)414 BOOL_VAR_ACTION_MIN(double d, BranchTbl tbl) { 415 return BoolVarBranch(BoolVarBranch::SEL_ACTION_MIN,d,tbl); 416 } 417 418 inline BoolVarBranch BOOL_VAR_ACTION_MIN(BoolAction a,BranchTbl tbl)419 BOOL_VAR_ACTION_MIN(BoolAction a, BranchTbl tbl) { 420 return BoolVarBranch(BoolVarBranch::SEL_ACTION_MIN,a,tbl); 421 } 422 423 inline BoolVarBranch BOOL_VAR_ACTION_MAX(double d,BranchTbl tbl)424 BOOL_VAR_ACTION_MAX(double d, BranchTbl tbl) { 425 return BoolVarBranch(BoolVarBranch::SEL_ACTION_MAX,d,tbl); 426 } 427 428 inline BoolVarBranch BOOL_VAR_ACTION_MAX(BoolAction a,BranchTbl tbl)429 BOOL_VAR_ACTION_MAX(BoolAction a, BranchTbl tbl) { 430 return BoolVarBranch(BoolVarBranch::SEL_ACTION_MAX,a,tbl); 431 } 432 433 inline BoolVarBranch BOOL_VAR_CHB_MIN(BoolCHB c,BranchTbl tbl)434 BOOL_VAR_CHB_MIN(BoolCHB c, BranchTbl tbl) { 435 return BoolVarBranch(BoolVarBranch::SEL_CHB_MIN,c,tbl); 436 } 437 438 inline BoolVarBranch BOOL_VAR_CHB_MIN(BranchTbl tbl)439 BOOL_VAR_CHB_MIN(BranchTbl tbl) { 440 return BoolVarBranch(BoolVarBranch::SEL_CHB_MIN,tbl); 441 } 442 443 inline BoolVarBranch BOOL_VAR_CHB_MAX(BoolCHB c,BranchTbl tbl)444 BOOL_VAR_CHB_MAX(BoolCHB c, BranchTbl tbl) { 445 return BoolVarBranch(BoolVarBranch::SEL_CHB_MAX,c,tbl); 446 } 447 448 inline BoolVarBranch BOOL_VAR_CHB_MAX(BranchTbl tbl)449 BOOL_VAR_CHB_MAX(BranchTbl tbl) { 450 return BoolVarBranch(BoolVarBranch::SEL_CHB_MAX,tbl); 451 } 452 453 } 454 455 // STATISTICS: int-branch 456