#include <string.h>
#include <assert.h>
class counted{
class memblock{
enum { size=100 };
char c[size];
int refcount;
public:
memblock(){
memset(c,1,size);
refcount=1;
}
memblock(const memblock & rv){
memcpy(c,rv.c,size);
refcount=1;
}
void attach(){++refcount;}
void detach(){
assert(refcount!=0);
//destroy object if no one use it
if(--refcount==0) delete this;
}
int count() const{ return refcount;}
void set(char x){
memset(c,x,size);
}
//conditionally copy this memory block
//call bifore modifying the block
//assign resulting poiter to your block
memblock * unalias(){
//don't duplicate if not aliased
if(refcount==1) return this;
--refcount;
//use copy-constructor to duplicate
return new memblock(*this);
}
}*block;
public:
counted(){
block=new memblock; //sneak preview
}
counted(const counted & rv){
block=rv.block; //pointer assignment
block->attach();
}
void unalias(){
block=block->unalias();
}
counted & operator=(const counted & rv){
//check for self-assignment
if(&rv==this) return *this;
//clean up what you're using first
block->detach();
block=rv.block;
block->attach();
return *this;
}
//decrement refcount,conditionally destroy
~counted(){block->detach();}
//copy on write
void write(char value){
//do this before any write operation
unalias();
block->set(value);
}
};