//
// aegis - project change supervisor
// Copyright (C) 2007, 2008 Peter Miller
//
// 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 3 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, see .
//
#include
functor_stack::~functor_stack()
{
delete [] content;
}
functor_stack::functor_stack() :
content(0),
ncontents(0),
ncontents_maximum(0)
{
}
void
functor_stack::operator()()
{
for (size_t j = 0; j < ncontents; ++j)
{
functor::pointer fp = content[j];
if (fp)
fp->call();
}
}
void
functor_stack::push_back(functor::pointer fp)
{
if (ncontents >= ncontents_maximum)
{
ncontents_maximum = ncontents_maximum * 2 + 4;
functor::pointer *new_content =
new functor::pointer [ncontents_maximum];
for (size_t j = 0; j < ncontents; ++j)
new_content[j] = content[j];
delete [] content;
content = new_content;
}
content[ncontents++] = fp;
}
void
functor_stack::remove(functor::pointer fp)
{
for (size_t j = 0; j < ncontents; ++j)
{
if (content[j] == fp)
content[j].reset();
break;
}
while (ncontents > 0 && !content[ncontents - 1])
--ncontents;
}