// This file is part of PUMA. // Copyright (C) 1999-2003 The PUMA developer team. // // This program is free software; you can redistribute it and/or // modify it under the terms of the GNU General Public License as // published by the Free Software Foundation; either version 2 of // the License, or (at your option) any later version. // // This program is distributed in the hope that it will be useful, // but WITHOUT ANY WARRANTY; without even the implied warranty of // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the // GNU General Public License for more details. // // You should have received a copy of the GNU General Public // License along with this program; if not, write to the Free // Software Foundation, Inc., 59 Temple Place, Suite 330, Boston, // MA 02111-1307 USA #ifndef PUMA_PragmaOnceUnitState_AH #define PUMA_PragmaOnceUnitState_AH aspect PragmaOnceUnitState { /******************************************************/ /* specific #pragma once unit state */ /******************************************************/ // pointcut definitions pointcut unitstate () = "Puma::UnitState"; advice unitstate () : slice class { // introduce new state flag bool m_once; public: // introduce methods to access new state flag bool onlyOnce () const { return m_once; } void onlyOnce (bool v) { m_once = v; } }; // initialize new state flag advice construction (unitstate ()) : after () { thisJoinPoint->that ()->m_once = false; } // initialize new flag for all managed units advice execution ("void Puma::UnitManager::init()") : after() { // go through the whole unit hash table and reset the // `#pragma once' state of the units typename JoinPoint::That::UMapIter iter; for (iter = tjp->that()->_umap.begin (); iter != tjp->that()->_umap.end (); ++iter) (*iter).second->state ().onlyOnce (false); } protected: // this aspect should never be instantiated directly PragmaOnceUnitState () {} }; #endif /* PUMA_PragmaOnceUnitState_AH */