#include <list>
#include "Deriveds.hh"
#include "OwnedPtr.hh"
using namespace MangoPtr;
class FactoryFIFO
{
std::list<Owned<Base*, OShared> > owners;
std::list<Owned<Base*, OShared> > delivered;
public:
void create(const std::string& type)
{
if (type=="derived1")
{
owners.push_back();
owners.back().takeOwnership(new Derived1);
}
else if (type=="derived2")
{
owners.push_back();
owners.back().takeOwnership(new Derived2);
}
else if (type=="derived3")
{
owners.push_back();
owners.back().takeOwnership(new Derived3);
}
else throw std::logic_error("Unknown type");
}
Ownership<Base*, OShared> getObj()
{
Owned<Base*, OShared>& owner = owners.front();
if (owner.isNull())
throw std::logic_error("No object created");
delivered.splice(delivered.begin(), owners, owners.begin());
return delivered.front().giveOwnership();
}
};
void getObjects(FactoryFIFO& factoryFIFO, int num)
{
std::cout << "Getting FIFO objects" << std::endl;
Owned<Base*, OShared> mango;
for (int i=0; i<num; i++)
{
mango.takeOwnership( factoryFIFO.getObj() );
mango()->callVirtual();
}
}
int main()
{
try
{
std::cout << "Using FactoryFIFO again" << std::endl;
FactoryFIFO factoryFIFO;
factoryFIFO.create("derived3");
factoryFIFO.create("derived2");
factoryFIFO.create("derived1");
factoryFIFO.create("derived2");
factoryFIFO.create("derived3");
getObjects(factoryFIFO, 4);
std::cout << "Done FactoryFIFO use" << std::endl;
}
catch (const std::exception& e)
{
std::cout << e.what() << std::endl;
}
}