#include <iostream>
#include <memory>
// using namespace std;
// 15. Define a pvector to be like a vector of pointers except that it contains pointers to objects and its destructor
// deletes each object.
template < typename T, typename A = std:: allocator < T>> // T has to be a pointer
class pvector
{
private :
A alloc;
int sz;
T* elem;
int space;
public :
pvector( ) : sz{ 0 } , elem{ nullptr} , space{ 0 } { }
void resize( int newsize, T def = T( ) ) ;
void push_back( const T val) ;
void reserve( int newalloc) ;
T& operator[ ] ( int n) { return elem[ n] ; } // access: return reference
const T& operator[ ] ( int n) const { return elem[ n] ; }
int size( ) { return sz; }
} ;
template < typename T, typename A>
void pvector< T,A> :: reserve ( int newalloc)
{
if ( newalloc<= space) return ; // never decrease allocation
T* p = alloc.allocate ( newalloc) ; // allocate new space
for ( int i= 0 ; i< sz; ++ i) alloc.construct ( & p[ i] ,elem[ i] ) ; // copy
for ( int i= 0 ; i< sz; ++ i) alloc.destroy ( & elem[ i] ) ; // destroy
alloc.deallocate ( elem,space) ; // deallocate old space
elem = p;
space = newalloc;
}
template < typename T, typename A>
void pvector< T,A> :: resize ( int newsize, T val)
{
reserve( newsize) ;
for ( int i= sz; i< newsize; ++ i) alloc.construct ( & elem[ i] ,val) ; // construct
for ( int i = newsize; i< sz; ++ i) alloc.destroy ( & elem[ i] ) ; // destroy
sz = newsize;
}
template < typename T, typename A>
void pvector< T, A> :: push_back ( const T val)
{
if ( space== 0 ) reserve( 8 ) ; // start with space for 8 elements
else if ( sz== space) reserve( 2 * space) ; // get more space
T* n = new T;
* n = val;
intptr_t address = & n;
alloc.construct ( & elem[ sz] , address) ; // add val at end
// elem should be an array of pointers... construct expects a value
// how to pass a pointer as an argument to construct() ?
++ sz;
}
int main( )
{
pvector< int > p;
p.push_back ( 3 ) ;
return 0 ;
}
I2luY2x1ZGUgPGlvc3RyZWFtPgojaW5jbHVkZSA8bWVtb3J5PgoKLy8gdXNpbmcgbmFtZXNwYWNlIHN0ZDsKCi8vIDE1LiBEZWZpbmUgYSBwdmVjdG9yIHRvIGJlIGxpa2UgYSB2ZWN0b3Igb2YgcG9pbnRlcnMgZXhjZXB0IHRoYXQgaXQgY29udGFpbnMgcG9pbnRlcnMgdG8gb2JqZWN0cyBhbmQgaXRzIGRlc3RydWN0b3IKLy8gZGVsZXRlcyBlYWNoIG9iamVjdC4KCnRlbXBsYXRlPHR5cGVuYW1lIFQsIHR5cGVuYW1lIEEgPSBzdGQ6OmFsbG9jYXRvcjxUPj4gLy8gVCBoYXMgdG8gYmUgYSBwb2ludGVyCmNsYXNzIHB2ZWN0b3IKewogICAgcHJpdmF0ZToKICAgICAgICBBIGFsbG9jOwogICAgICAgIGludCBzejsKICAgICAgICBUKiBlbGVtOwogICAgICAgIGludCBzcGFjZTsKICAgIHB1YmxpYzoKICAgICAgICBwdmVjdG9yKCkgOiBzenswfSwgZWxlbXtudWxscHRyfSwgc3BhY2V7MH0geyB9CgogICAgICAgIHZvaWQgcmVzaXplKGludCBuZXdzaXplLCBUIGRlZiA9IFQoKSk7CiAgICAgICAgdm9pZCBwdXNoX2JhY2soY29uc3QgVCB2YWwpOwogICAgICAgIHZvaWQgcmVzZXJ2ZShpbnQgbmV3YWxsb2MpOwoKICAgICAgICBUJiBvcGVyYXRvclsgXShpbnQgbikgeyByZXR1cm4gZWxlbVtuXTsgfSAgICAvLyBhY2Nlc3M6IHJldHVybiByZWZlcmVuY2UKICAgICAgICBjb25zdCBUJiBvcGVyYXRvcltdKGludCBuKSBjb25zdCB7IHJldHVybiBlbGVtW25dOyB9CgogICAgICAgIGludCBzaXplKCkgeyByZXR1cm4gc3o7IH0KfTsKCnRlbXBsYXRlPHR5cGVuYW1lIFQsIHR5cGVuYW1lIEE+CnZvaWQgcHZlY3RvcjxULEE+OjpyZXNlcnZlKGludCBuZXdhbGxvYykKewogICAgICBpZiAobmV3YWxsb2M8PXNwYWNlKSByZXR1cm47ICAgICAgICAgICAgICAgLy8gbmV2ZXIgZGVjcmVhc2UgYWxsb2NhdGlvbgogICAgICBUKiBwID0gYWxsb2MuYWxsb2NhdGUobmV3YWxsb2MpOyAgICAgICAgICAvLyBhbGxvY2F0ZSBuZXcgc3BhY2UKICAgICAgZm9yIChpbnQgaT0wOyBpPHN6OyArK2kpIGFsbG9jLmNvbnN0cnVjdCgmcFtpXSxlbGVtW2ldKTsgICAgICAgLy8gY29weQogICAgICBmb3IgKGludCBpPTA7IGk8c3o7ICsraSkgYWxsb2MuZGVzdHJveSgmZWxlbVtpXSk7ICAgICAgICAgICAgICAgICAvLyBkZXN0cm95CiAgICAgIGFsbG9jLmRlYWxsb2NhdGUoZWxlbSxzcGFjZSk7ICAgICAgICAgICAgIC8vIGRlYWxsb2NhdGUgb2xkIHNwYWNlCiAgICAgIGVsZW0gPSBwOwogICAgICBzcGFjZSA9IG5ld2FsbG9jOwp9Cgp0ZW1wbGF0ZTx0eXBlbmFtZSBULCB0eXBlbmFtZSBBPgp2b2lkIHB2ZWN0b3I8VCxBPjo6cmVzaXplKGludCBuZXdzaXplLCBUIHZhbCkKewogICAgICByZXNlcnZlKG5ld3NpemUpOwogICAgICBmb3IgKGludCBpPXN6OyBpPG5ld3NpemU7ICsraSkgYWxsb2MuY29uc3RydWN0KCZlbGVtW2ldLHZhbCk7ICAgLy8gY29uc3RydWN0CiAgICAgIGZvciAoaW50IGkgPSBuZXdzaXplOyBpPHN6OyArK2kpIGFsbG9jLmRlc3Ryb3koJmVsZW1baV0pOyAgICAgICAgICAgIC8vIGRlc3Ryb3kKICAgICAgc3ogPSBuZXdzaXplOwp9Cgp0ZW1wbGF0ZTx0eXBlbmFtZSBULCB0eXBlbmFtZSBBPgp2b2lkIHB2ZWN0b3I8VCwgQT46OnB1c2hfYmFjayhjb25zdCBUIHZhbCkKewogICAgaWYgKHNwYWNlPT0wKSByZXNlcnZlKDgpOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBzdGFydCB3aXRoIHNwYWNlIGZvciA4IGVsZW1lbnRzCiAgICBlbHNlIGlmIChzej09c3BhY2UpIHJlc2VydmUoMipzcGFjZSk7ICAgICAgLy8gZ2V0IG1vcmUgc3BhY2UKICAgIFQqIG4gPSBuZXcgVDsKICAgICpuID0gdmFsOwogICAgaW50cHRyX3QgYWRkcmVzcyA9ICZuOwogICAgYWxsb2MuY29uc3RydWN0KCZlbGVtW3N6XSwgYWRkcmVzcyk7ICAgICAgICAgICAgICAgICAvLyBhZGQgdmFsIGF0IGVuZAoKICAgIC8vIGVsZW0gc2hvdWxkIGJlIGFuIGFycmF5IG9mIHBvaW50ZXJzLi4uIGNvbnN0cnVjdCBleHBlY3RzIGEgdmFsdWUKICAgIC8vIGhvdyB0byBwYXNzIGEgcG9pbnRlciBhcyBhbiBhcmd1bWVudCB0byBjb25zdHJ1Y3QoKSA/CgogICAgKytzejsKfQoKaW50IG1haW4oKQp7CiAgICBwdmVjdG9yPGludD4gcDsKICAgIHAucHVzaF9iYWNrKDMpOwoKICAgIHJldHVybiAwOwp9Cg==
compilation info
prog.cpp: In instantiation of ‘void pvector<T, A>::push_back(T) [with T = int; A = std::allocator<int>]’:
prog.cpp:70:18: required from here
prog.cpp:58:25: error: invalid conversion from ‘int**’ to ‘intptr_t {aka long int}’ [-fpermissive]
intptr_t address = &n;
^
stdout