Something went wrong. Try again.
This repository has no description
Something went wrong. Try again.
23 kB · 777 lines
C++
at develop
123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709710711712713714715716717718719720721722723724725726727728729730731732733734735736737738739740741742743744745746747748749750751752753754755756757758759760761762763764765766767768769770771772773774775776777778/* -*- mode: C++; c-basic-offset: 2; indent-tabs-mode: nil -*- *//* * Main authors: * Christian Schulte <schulte@gecode.org> * Guido Tack <tack@gecode.org> * * Copyright: * Christian Schulte, 2002 * Guido Tack, 2004 * * This file is part of Gecode, the generic constraint * development environment: * http://www.gecode.org * * Permission is hereby granted, free of charge, to any person obtaining * a copy of this software and associated documentation files (the * "Software"), to deal in the Software without restriction, including * without limitation the rights to use, copy, modify, merge, publish, * distribute, sublicense, and/or sell copies of the Software, and to * permit persons to whom the Software is furnished to do so, subject to * the following conditions: * * The above copyright notice and this permission notice shall be * included in all copies or substantial portions of the Software. * * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, * EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND * NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE * LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION * OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION * WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. * */
namespace Gecode {
/** * \defgroup TaskPropPat Propagator patterns * * \ingroup TaskActor */
//@{ /** * \brief Unary propagator * * Stores a single view of type \a View with propagation condition \a pc. * * If the propagation condition \a pc has the value PC_GEN_NONE, no * subscriptions are created. * */ template<class View, PropCond pc> class UnaryPropagator : public Propagator { protected: /// Single view View x0; /// Constructor for cloning \a p UnaryPropagator(Space& home, UnaryPropagator& p); /// Constructor for rewriting \a p during cloning UnaryPropagator(Space& home, Propagator& p, View x0); /// Constructor for creation UnaryPropagator(Home home, View x0); public: /// Cost function (defined as PC_UNARY_LO) virtual PropCost cost(const Space& home, const ModEventDelta& med) const; /// Schedule function virtual void reschedule(Space& home); /// Delete propagator and return its size virtual size_t dispose(Space& home); };
/** * \brief Binary propagator * * Stores two views of type \a View with propagation condition \a pc. * * If the propagation condition \a pc has the value PC_GEN_NONE, no * subscriptions are created. * */ template<class View, PropCond pc> class BinaryPropagator : public Propagator { protected: /// Two views View x0, x1; /// Constructor for cloning \a p BinaryPropagator(Space& home, BinaryPropagator& p); /// Constructor for creation BinaryPropagator(Home home, View x0, View x1); /// Constructor for rewriting \a p during cloning BinaryPropagator(Space& home, Propagator& p, View x0, View x1); public: /// Cost function (defined as low binary) virtual PropCost cost(const Space& home, const ModEventDelta& med) const; /// Schedule function virtual void reschedule(Space& home); /// Delete propagator and return its size virtual size_t dispose(Space& home); };
/** * \brief Ternary propagator * * Stores three views of type \a View with propagation condition \a pc. * * If the propagation condition \a pc has the value PC_GEN_NONE, no * subscriptions are created. * */ template<class View, PropCond pc> class TernaryPropagator : public Propagator { protected: /// Three views View x0, x1, x2; /// Constructor for cloning \a p TernaryPropagator(Space& home, TernaryPropagator& p); /// Constructor for creation TernaryPropagator(Home home, View x0, View x1, View x2); /// Constructor for rewriting \a p during cloning TernaryPropagator(Space& home, Propagator& p, View x0, View x1, View x2); public: /// Cost function (defined as low ternary) virtual PropCost cost(const Space& home, const ModEventDelta& med) const; /// Schedule function virtual void reschedule(Space& home); /// Delete propagator and return its size virtual size_t dispose(Space& home); };
/** * \brief n-ary propagator * * Stores array of views of type \a View with propagation condition \a pc. * * If the propagation condition \a pc has the value PC_GEN_NONE, no * subscriptions are created. * */ template<class View, PropCond pc> class NaryPropagator : public Propagator { protected: /// Array of views ViewArray<View> x; /// Constructor for cloning \a p NaryPropagator(Space& home, NaryPropagator& p); /// Constructor for rewriting \a p during cloning NaryPropagator(Space& home, Propagator& p, ViewArray<View>& x); /// Constructor for creation NaryPropagator(Home home, ViewArray<View>& x); public: /// Cost function (defined as low linear) virtual PropCost cost(const Space& home, const ModEventDelta& med) const; /// Schedule function virtual void reschedule(Space& home); /// Delete propagator and return its size virtual size_t dispose(Space& home); };
/** * \brief (n+1)-ary propagator * * Stores array of views and single view of type \a View with propagation * condition \a pc. * * If the propagation condition \a pc has the value PC_GEN_NONE, no * subscriptions are created. * */ template<class View, PropCond pc> class NaryOnePropagator : public Propagator { protected: /// Array of views ViewArray<View> x; /// Single view View y; /// Constructor for cloning \a p NaryOnePropagator(Space& home, NaryOnePropagator& p); /// Constructor for rewriting \a p during cloning NaryOnePropagator(Space& home, Propagator& p, ViewArray<View>& x, View y); /// Constructor for creation NaryOnePropagator(Home home, ViewArray<View>& x, View y); public: /// Cost function (defined as low linear) virtual PropCost cost(const Space& home, const ModEventDelta& med) const; /// Schedule function virtual void reschedule(Space& home); /// Delete propagator and return its size virtual size_t dispose(Space& home); };
/** * \brief Mixed binary propagator * * Stores two views of type \a View0 and \a View1 with propagation * conditions \a pc0 and \a pc1. * * If the propagation conditions \a pc0 or \a pc1 have the values * PC_GEN_NONE, no subscriptions are created. * */ template<class View0, PropCond pc0, class View1, PropCond pc1> class MixBinaryPropagator : public Propagator { protected: /// View of type \a View0 View0 x0; /// View of type \a View1 View1 x1; /// Constructor for cloning MixBinaryPropagator(Space& home, MixBinaryPropagator& p); /// Constructor for creation MixBinaryPropagator(Home home, View0 x0, View1 x1); /// Constructor for rewriting \a p during cloning MixBinaryPropagator(Space& home, Propagator& p, View0 x0, View1 x1); public: /// Cost function (defined as low binary) virtual PropCost cost(const Space& home, const ModEventDelta& med) const; /// Schedule function virtual void reschedule(Space& home); /// Delete propagator and return its size virtual size_t dispose(Space& home); };
/** * \brief Mixed ternary propagator * * Stores three views of type \a View0, \a View1, and \a View2 * with propagation conditions \a pc0, \a pc1, and \a pc2. * * If the propagation conditions \a pc0, \a pc1, \a pc2 have the values * PC_GEN_NONE, no subscriptions are created. * */ template<class View0, PropCond pc0, class View1, PropCond pc1, class View2, PropCond pc2> class MixTernaryPropagator : public Propagator { protected: /// View of type \a View0 View0 x0; /// View of type \a View1 View1 x1; /// View of type \a View2 View2 x2; /// Constructor for cloning MixTernaryPropagator(Space& home, MixTernaryPropagator& p); /// Constructor for creation MixTernaryPropagator(Home home, View0 x0, View1 x1, View2 x2); /// Constructor for rewriting \a p during cloning MixTernaryPropagator(Space& home, Propagator& p, View0 x0, View1 x1, View2 x2); public: /// Cost function (defined as low ternary) virtual PropCost cost(const Space& home, const ModEventDelta& med) const; /// Schedule function virtual void reschedule(Space& home); /// Delete propagator and return its size virtual size_t dispose(Space& home); };
/** * \brief Mixed (n+1)-ary propagator * * Stores array of views of type \a View0 with propagation condition \a pc0 * and a single view of type \a View1 with propagation condition \a pc1. * * If the propagation conditions \a pc0 or \a pc1 have the values * PC_GEN_NONE, no subscriptions are created. * */ template<class View0, PropCond pc0, class View1, PropCond pc1> class MixNaryOnePropagator : public Propagator { protected: /// Array of views ViewArray<View0> x; /// Single view View1 y; /// Constructor for cloning \a p MixNaryOnePropagator(Space& home, MixNaryOnePropagator& p); /// Constructor for creation MixNaryOnePropagator(Home home, ViewArray<View0>& x, View1 y); /// Constructor for rewriting \a p during cloning MixNaryOnePropagator(Space& home, Propagator& p, ViewArray<View0>& x, View1 y); public: /// Cost function (defined as low linear) virtual PropCost cost(const Space& home, const ModEventDelta& med) const; /// Schedule function virtual void reschedule(Space& home); /// Delete propagator and return its size virtual size_t dispose(Space& home); }; //@}
/* * Unary propagators * */
template<class View, PropCond pc> UnaryPropagator<View,pc>::UnaryPropagator(Home home, View y0) : Propagator(home), x0(y0) { if (pc != PC_GEN_NONE) x0.subscribe(home,*this,pc); }
template<class View, PropCond pc> forceinline UnaryPropagator<View,pc>::UnaryPropagator (Space& home, UnaryPropagator<View,pc>& p) : Propagator(home,p) { x0.update(home,p.x0); }
template<class View, PropCond pc> forceinline UnaryPropagator<View,pc>::UnaryPropagator (Space& home, Propagator& p, View y0) : Propagator(home,p) { x0.update(home,y0); }
template<class View, PropCond pc> PropCost UnaryPropagator<View,pc>::cost(const Space&, const ModEventDelta&) const { return PropCost::unary(PropCost::LO); }
template<class View, PropCond pc> void UnaryPropagator<View,pc>::reschedule(Space& home) { if (pc != PC_GEN_NONE) x0.reschedule(home,*this,pc); }
template<class View, PropCond pc> forceinline size_t UnaryPropagator<View,pc>::dispose(Space& home) { if (pc != PC_GEN_NONE) x0.cancel(home,*this,pc); (void) Propagator::dispose(home); return sizeof(*this); }
/* * Binary propagators * */
template<class View, PropCond pc> BinaryPropagator<View,pc>::BinaryPropagator(Home home, View y0, View y1) : Propagator(home), x0(y0), x1(y1) { if (pc != PC_GEN_NONE) { x0.subscribe(home,*this,pc); x1.subscribe(home,*this,pc); } }
template<class View, PropCond pc> forceinline BinaryPropagator<View,pc>::BinaryPropagator (Space& home, BinaryPropagator<View,pc>& p) : Propagator(home,p) { x0.update(home,p.x0); x1.update(home,p.x1); }
template<class View, PropCond pc> forceinline BinaryPropagator<View,pc>::BinaryPropagator (Space& home, Propagator& p, View y0, View y1) : Propagator(home,p) { x0.update(home,y0); x1.update(home,y1); }
template<class View, PropCond pc> PropCost BinaryPropagator<View,pc>::cost(const Space&, const ModEventDelta&) const { return PropCost::binary(PropCost::LO); }
template<class View, PropCond pc> void BinaryPropagator<View,pc>::reschedule(Space& home) { if (pc != PC_GEN_NONE) { x0.reschedule(home,*this,pc); x1.reschedule(home,*this,pc); } }
template<class View, PropCond pc> forceinline size_t BinaryPropagator<View,pc>::dispose(Space& home) { if (pc != PC_GEN_NONE) { x0.cancel(home,*this,pc); x1.cancel(home,*this,pc); } (void) Propagator::dispose(home); return sizeof(*this); }
/* * Ternary propagators * */
template<class View, PropCond pc> TernaryPropagator<View,pc>::TernaryPropagator (Home home, View y0, View y1, View y2) : Propagator(home), x0(y0), x1(y1), x2(y2) { if (pc != PC_GEN_NONE) { x0.subscribe(home,*this,pc); x1.subscribe(home,*this,pc); x2.subscribe(home,*this,pc); } }
template<class View, PropCond pc> forceinline TernaryPropagator<View,pc>::TernaryPropagator (Space& home, TernaryPropagator<View,pc>& p) : Propagator(home,p) { x0.update(home,p.x0); x1.update(home,p.x1); x2.update(home,p.x2); }
template<class View, PropCond pc> forceinline TernaryPropagator<View,pc>::TernaryPropagator (Space& home, Propagator& p, View y0, View y1, View y2) : Propagator(home,p) { x0.update(home,y0); x1.update(home,y1); x2.update(home,y2); }
template<class View, PropCond pc> PropCost TernaryPropagator<View,pc>::cost(const Space&, const ModEventDelta&) const { return PropCost::ternary(PropCost::LO); }
template<class View, PropCond pc> void TernaryPropagator<View,pc>::reschedule(Space& home) { if (pc != PC_GEN_NONE) { x0.reschedule(home,*this,pc); x1.reschedule(home,*this,pc); x2.reschedule(home,*this,pc); } }
template<class View, PropCond pc> forceinline size_t TernaryPropagator<View,pc>::dispose(Space& home) { if (pc != PC_GEN_NONE) { x0.cancel(home,*this,pc); x1.cancel(home,*this,pc); x2.cancel(home,*this,pc); } (void) Propagator::dispose(home); return sizeof(*this); }
/* * Nary propagators * */
template<class View, PropCond pc> NaryPropagator<View,pc>::NaryPropagator (Home home, ViewArray<View>& y) : Propagator(home), x(y) { if (pc != PC_GEN_NONE) x.subscribe(home,*this,pc); }
template<class View, PropCond pc> forceinline NaryPropagator<View,pc>::NaryPropagator (Space& home, NaryPropagator<View,pc>& p) : Propagator(home,p) { x.update(home,p.x); }
template<class View, PropCond pc> forceinline NaryPropagator<View,pc>::NaryPropagator (Space& home, Propagator& p, ViewArray<View>& x0) : Propagator(home,p) { x.update(home,x0); }
template<class View, PropCond pc> PropCost NaryPropagator<View,pc>::cost(const Space&, const ModEventDelta&) const { return PropCost::linear(PropCost::LO,x.size()); }
template<class View, PropCond pc> void NaryPropagator<View,pc>::reschedule(Space& home) { if (pc != PC_GEN_NONE) x.reschedule(home,*this,pc); }
template<class View, PropCond pc> forceinline size_t NaryPropagator<View,pc>::dispose(Space& home) { if (pc != PC_GEN_NONE) x.cancel(home,*this,pc); (void) Propagator::dispose(home); return sizeof(*this); }
/* * NaryOne (one additional variable) propagators * */
template<class View, PropCond pc> NaryOnePropagator<View,pc>::NaryOnePropagator (Home home, ViewArray<View>& x0, View y0) : Propagator(home), x(x0), y(y0) { if (pc != PC_GEN_NONE) { x.subscribe(home,*this,pc); y.subscribe(home,*this,pc); } }
template<class View, PropCond pc> forceinline NaryOnePropagator<View,pc>::NaryOnePropagator (Space& home, NaryOnePropagator<View,pc>& p) : Propagator(home,p) { x.update(home,p.x); y.update(home,p.y); }
template<class View, PropCond pc> forceinline NaryOnePropagator<View,pc>::NaryOnePropagator (Space& home, Propagator& p, ViewArray<View>& x0, View y0) : Propagator(home,p) { x.update(home,x0); y.update(home,y0); }
template<class View, PropCond pc> PropCost NaryOnePropagator<View,pc>::cost(const Space&, const ModEventDelta&) const { return PropCost::linear(PropCost::LO,x.size()+1); }
template<class View, PropCond pc> void NaryOnePropagator<View,pc>::reschedule(Space& home) { if (pc != PC_GEN_NONE) { x.reschedule(home,*this,pc); y.reschedule(home,*this,pc); } }
template<class View, PropCond pc> forceinline size_t NaryOnePropagator<View,pc>::dispose(Space& home) { if (pc != PC_GEN_NONE) { x.cancel(home,*this,pc); y.cancel(home,*this,pc); } (void) Propagator::dispose(home); return sizeof(*this); }
/* * Mixed binary propagators * */
template<class View0, PropCond pc0, class View1, PropCond pc1> MixBinaryPropagator<View0,pc0,View1,pc1>::MixBinaryPropagator (Home home, View0 y0, View1 y1) : Propagator(home), x0(y0), x1(y1) { if (pc0 != PC_GEN_NONE) x0.subscribe(home,*this,pc0); if (pc1 != PC_GEN_NONE) x1.subscribe(home,*this,pc1); }
template<class View0, PropCond pc0, class View1, PropCond pc1> forceinline MixBinaryPropagator<View0,pc0,View1,pc1>::MixBinaryPropagator (Space& home, MixBinaryPropagator<View0,pc0,View1,pc1>& p) : Propagator(home,p) { x0.update(home,p.x0); x1.update(home,p.x1); }
template<class View0, PropCond pc0, class View1, PropCond pc1> forceinline MixBinaryPropagator<View0,pc0,View1,pc1>::MixBinaryPropagator (Space& home, Propagator& p, View0 y0, View1 y1) : Propagator(home,p) { x0.update(home,y0); x1.update(home,y1); }
template<class View0, PropCond pc0, class View1, PropCond pc1> PropCost MixBinaryPropagator<View0,pc0,View1,pc1>::cost(const Space&, const ModEventDelta&) const { return PropCost::binary(PropCost::LO); }
template<class View0, PropCond pc0, class View1, PropCond pc1> void MixBinaryPropagator<View0,pc0,View1,pc1>::reschedule(Space& home) { if (pc0 != PC_GEN_NONE) x0.reschedule(home,*this,pc0); if (pc1 != PC_GEN_NONE) x1.reschedule(home,*this,pc1); }
template<class View0, PropCond pc0, class View1, PropCond pc1> forceinline size_t MixBinaryPropagator<View0,pc0,View1,pc1>::dispose(Space& home) { if (pc0 != PC_GEN_NONE) x0.cancel(home,*this,pc0); if (pc1 != PC_GEN_NONE) x1.cancel(home,*this,pc1); (void) Propagator::dispose(home); return sizeof(*this); }
/* * Mixed ternary propagators * */
template<class View0, PropCond pc0, class View1, PropCond pc1, class View2, PropCond pc2> MixTernaryPropagator<View0,pc0,View1,pc1,View2,pc2>:: MixTernaryPropagator(Home home, View0 y0, View1 y1, View2 y2) : Propagator(home), x0(y0), x1(y1), x2(y2) { if (pc0 != PC_GEN_NONE) x0.subscribe(home,*this,pc0); if (pc1 != PC_GEN_NONE) x1.subscribe(home,*this,pc1); if (pc2 != PC_GEN_NONE) x2.subscribe(home,*this,pc2); }
template<class View0, PropCond pc0, class View1, PropCond pc1, class View2, PropCond pc2> forceinline MixTernaryPropagator<View0,pc0,View1,pc1,View2,pc2>:: MixTernaryPropagator(Space& home, MixTernaryPropagator<View0,pc0,View1,pc1, View2,pc2>& p) : Propagator(home,p) { x0.update(home,p.x0); x1.update(home,p.x1); x2.update(home,p.x2); }
template<class View0, PropCond pc0, class View1, PropCond pc1, class View2, PropCond pc2> forceinline MixTernaryPropagator<View0,pc0,View1,pc1,View2,pc2>::MixTernaryPropagator (Space& home, Propagator& p, View0 y0, View1 y1, View2 y2) : Propagator(home,p) { x0.update(home,y0); x1.update(home,y1); x2.update(home,y2); }
template<class View0, PropCond pc0, class View1, PropCond pc1, class View2, PropCond pc2> PropCost MixTernaryPropagator<View0,pc0,View1,pc1,View2,pc2>:: cost(const Space&, const ModEventDelta&) const { return PropCost::ternary(PropCost::LO); }
template<class View0, PropCond pc0, class View1, PropCond pc1, class View2, PropCond pc2> void MixTernaryPropagator<View0,pc0,View1,pc1,View2,pc2>::reschedule(Space& home) { if (pc0 != PC_GEN_NONE) x0.reschedule(home,*this,pc0); if (pc1 != PC_GEN_NONE) x1.reschedule(home,*this,pc1); if (pc2 != PC_GEN_NONE) x2.reschedule(home,*this,pc2); }
template<class View0, PropCond pc0, class View1, PropCond pc1, class View2, PropCond pc2> forceinline size_t MixTernaryPropagator<View0,pc0,View1,pc1,View2,pc2>::dispose(Space& home) { if (pc0 != PC_GEN_NONE) x0.cancel(home,*this,pc0); if (pc1 != PC_GEN_NONE) x1.cancel(home,*this,pc1); if (pc2 != PC_GEN_NONE) x2.cancel(home,*this,pc2); (void) Propagator::dispose(home); return sizeof(*this); }
/* * MixNaryOne (one additional variable) propagators * */
template<class View0, PropCond pc0, class View1, PropCond pc1> MixNaryOnePropagator<View0,pc0,View1,pc1>::MixNaryOnePropagator (Home home, ViewArray<View0>& x0, View1 y0) : Propagator(home), x(x0), y(y0) { if (pc0 != PC_GEN_NONE) x.subscribe(home,*this,pc0); if (pc1 != PC_GEN_NONE) y.subscribe(home,*this,pc1); }
template<class View0, PropCond pc0, class View1, PropCond pc1> forceinline MixNaryOnePropagator<View0,pc0,View1,pc1>::MixNaryOnePropagator (Space& home, MixNaryOnePropagator<View0,pc0,View1,pc1>& p) : Propagator(home,p) { x.update(home,p.x); y.update(home,p.y); }
template<class View0, PropCond pc0, class View1, PropCond pc1> forceinline MixNaryOnePropagator<View0,pc0,View1,pc1>::MixNaryOnePropagator (Space& home, Propagator& p, ViewArray<View0>& x0, View1 y0) : Propagator(home,p) { x.update(home,x0); y.update(home,y0); }
template<class View0, PropCond pc0, class View1, PropCond pc1> PropCost MixNaryOnePropagator<View0,pc0,View1,pc1>::cost(const Space&, const ModEventDelta&) const { return PropCost::linear(PropCost::LO,x.size()+1); }
template<class View0, PropCond pc0, class View1, PropCond pc1> void MixNaryOnePropagator<View0,pc0,View1,pc1>::reschedule(Space& home) { if (pc0 != PC_GEN_NONE) x.reschedule(home,*this,pc0); if (pc1 != PC_GEN_NONE) y.reschedule(home,*this,pc1); }
template<class View0, PropCond pc0, class View1, PropCond pc1> forceinline size_t MixNaryOnePropagator<View0,pc0,View1,pc1>::dispose(Space& home) { if (pc0 != PC_GEN_NONE) x.cancel(home,*this,pc0); if (pc1 != PC_GEN_NONE) y.cancel(home,*this,pc1); (void) Propagator::dispose(home); return sizeof(*this); }
}
// STATISTICS: kernel-prop