#include <iostream>
#include <vector>
using namespace std;
template <class T>
class A
{
public:
bool allocated;
typedef T value_type;
typedef T* pointer;
typedef const T* const_pointer;
typedef T& reference;
typedef const T& const_reference;
typedef std::size_t size_type;
A() throw()
{
allocated = false;
}
pointer allocate (size_type num, const void* = 0)
{
cout << "Allocating " << num << '\n';
allocated = true;
return (pointer)(::operator new(num * sizeof(T)));
}
void construct (pointer p, const T& value)
{
cout << "Value: " << value << '\n';
new((void*)p)T(value);
}
void destroy (pointer p)
{
cout << "Destroing: " << p << '\n';
if(!allocated) delete *p;
p->~T();
}
void deallocate (pointer p, size_type num)
{
cout << "Dealocating\n";
::operator delete(p);
allocated = false;
}
};
class Type
{
public:
int a;
Type()
{
cout << "Ctor " << this << "\n";
}
~Type()
{
cout << "Dtor " << this << "\n";
}
};
int main()
{
std::vector<Type*, A<Type*> > v;
v.push_back(new Type());
v.push_back(new Type());
v.push_back(new Type());
v.push_back(new Type());
v.push_back(new Type());
v.push_back(new Type());
cout << '\n';
for(int i = 0; i<6;++i)
{
cout << "Object " << v[i] << " at " << &(v[i]) << '\n';
}
/*v.erase(v.begin());
v.erase(v.begin());
v.erase(v.begin());*/
v.erase(v.begin());
cout << '\n';
for(int i = 0; i<5;++i)
{
cout << "Object " << v[i] << " at " << &(v[i]) << '\n';
}
v.clear();
}
I2luY2x1ZGUgPGlvc3RyZWFtPgojaW5jbHVkZSA8dmVjdG9yPgoKdXNpbmcgbmFtZXNwYWNlIHN0ZDsKdGVtcGxhdGUgPGNsYXNzIFQ+CmNsYXNzIEEKewpwdWJsaWM6CiAgICBib29sIGFsbG9jYXRlZDsKICAgIHR5cGVkZWYgVCAgICAgICAgdmFsdWVfdHlwZTsKICAgIHR5cGVkZWYgVCogICAgICAgcG9pbnRlcjsKICAgIHR5cGVkZWYgY29uc3QgVCogY29uc3RfcG9pbnRlcjsKICAgIHR5cGVkZWYgVCYgICAgICAgcmVmZXJlbmNlOwogICAgdHlwZWRlZiBjb25zdCBUJiBjb25zdF9yZWZlcmVuY2U7CiAgICB0eXBlZGVmIHN0ZDo6c2l6ZV90ICAgIHNpemVfdHlwZTsKCiAgICBBKCkgdGhyb3coKQogICAgewogICAgICAgIGFsbG9jYXRlZCA9IGZhbHNlOwogICAgfQoKICAgIHBvaW50ZXIgYWxsb2NhdGUgKHNpemVfdHlwZSBudW0sIGNvbnN0IHZvaWQqID0gMCkKICAgIHsKICAgICAgICBjb3V0IDw8ICJBbGxvY2F0aW5nICIgPDwgbnVtIDw8ICdcbic7CiAgICAgICAgYWxsb2NhdGVkID0gdHJ1ZTsKICAgICAgICByZXR1cm4gKHBvaW50ZXIpKDo6b3BlcmF0b3IgbmV3KG51bSAqIHNpemVvZihUKSkpOwogICAgfQoKICAgIHZvaWQgY29uc3RydWN0IChwb2ludGVyIHAsIGNvbnN0IFQmIHZhbHVlKQogICAgewogICAgICAgIGNvdXQgPDwgIlZhbHVlOiAiIDw8IHZhbHVlIDw8ICdcbic7CiAgICAgICAgbmV3KCh2b2lkKilwKVQodmFsdWUpOwogICAgfQoKICAgIHZvaWQgZGVzdHJveSAocG9pbnRlciBwKQogICAgewogICAgICAgIGNvdXQgPDwgIkRlc3Ryb2luZzogIiA8PCBwIDw8ICdcbic7CiAgICAgICAgaWYoIWFsbG9jYXRlZCkgZGVsZXRlICpwOwogICAgICAgIHAtPn5UKCk7CiAgICB9CgogICAgdm9pZCBkZWFsbG9jYXRlIChwb2ludGVyIHAsIHNpemVfdHlwZSBudW0pCiAgICB7CiAgICAgICAgY291dCA8PCAiRGVhbG9jYXRpbmdcbiI7CiAgICAgICAgOjpvcGVyYXRvciBkZWxldGUocCk7CiAgICAgICAgYWxsb2NhdGVkID0gZmFsc2U7CiAgICB9Cn07CgpjbGFzcyBUeXBlCnsKcHVibGljOgogICAgaW50IGE7CiAgICBUeXBlKCkKICAgIHsKICAgICAgICBjb3V0IDw8ICJDdG9yICIgPDwgdGhpcyA8PCAiXG4iOwogICAgfQogICAgflR5cGUoKQogICAgewogICAgICAgIGNvdXQgPDwgIkR0b3IgIiA8PCB0aGlzIDw8ICJcbiI7CiAgICB9Cn07CgppbnQgbWFpbigpCnsKICAgIHN0ZDo6dmVjdG9yPFR5cGUqLCBBPFR5cGUqPiA+IHY7CgogICAgdi5wdXNoX2JhY2sobmV3IFR5cGUoKSk7CiAgICB2LnB1c2hfYmFjayhuZXcgVHlwZSgpKTsKICAgIHYucHVzaF9iYWNrKG5ldyBUeXBlKCkpOwogICAgdi5wdXNoX2JhY2sobmV3IFR5cGUoKSk7CiAgICB2LnB1c2hfYmFjayhuZXcgVHlwZSgpKTsKICAgIHYucHVzaF9iYWNrKG5ldyBUeXBlKCkpOwogICAgY291dCA8PCAnXG4nOwogICAgZm9yKGludCBpID0gMDsgaTw2OysraSkKICAgIHsKICAgICAgICBjb3V0IDw8ICJPYmplY3QgIiA8PCB2W2ldIDw8ICIgYXQgIiA8PCAmKHZbaV0pIDw8ICdcbic7CiAgICB9CiAgICAvKnYuZXJhc2Uodi5iZWdpbigpKTsKICAgIHYuZXJhc2Uodi5iZWdpbigpKTsKICAgIHYuZXJhc2Uodi5iZWdpbigpKTsqLwogICAgdi5lcmFzZSh2LmJlZ2luKCkpOwogICAgY291dCA8PCAnXG4nOwogICAgZm9yKGludCBpID0gMDsgaTw1OysraSkKICAgIHsKICAgICAgICBjb3V0IDw8ICJPYmplY3QgIiA8PCB2W2ldIDw8ICIgYXQgIiA8PCAmKHZbaV0pIDw8ICdcbic7CiAgICB9CiAgICB2LmNsZWFyKCk7Cn0K