2009/04/21

Nos bons tempos em que eu defendia C++

Parte de minha macro "epx.h", com um for-each caseiro para evitar o algoritmo foreach() overengineered da STL++:

#define self (*this)

#define ForEach(cont, it) \
for(__typeof__((cont).begin()) it = (cont).begin(); it != (cont).end(); ++it)


E é claro, todo programador C++ que se preze faz seu próprio smart pointer caseiro:

#undef __DANGEROUS__

template class PtrRef;

template class Ptr
{
public:
inline Ptr()
{
payload = new PtrRef(0);
}

inline Ptr(TIPO* parg)
{
payload = new PtrRef(parg);
}

inline Ptr(const Ptr& arg)
{
payload = arg.payload;
++payload->referencias;
}

inline Ptr& operator=(const Ptr& outro)
{
++outro.payload->referencias;
if(--payload->referencias == 0) {
delete payload;
}
payload = outro.payload;
return *this;
}

inline ~Ptr()
{
if (--payload->referencias == 0) {
delete payload;
payload = 0;
}
}

inline TIPO* operator->() const
{
return payload->ponteiro;
}

inline TIPO& operator*() const
{
return *(payload->ponteiro);
}

inline bool operator!() const
{
return (payload->ponteiro == 0);
}

inline operator bool() const
{
return (payload->ponteiro != 0);
}

inline TIPO* pointer() const
{
return payload->ponteiro;
}

#ifdef __DANGEROUS__
inline operator TIPO*() const
{
return pointer();
}
#endif

private:
PtrRef* payload;
};

template class PtrRef
{
inline PtrRef(TIPO* p)
{
ponteiro = p;
referencias = 1;
}

inline ~PtrRef()
{
delete ponteiro;
ponteiro = 0;
}

TIPO* ponteiro;
unsigned int referencias;

friend class Ptr;
};

Depois o sujeito tem de tomar remédio de doido já aos 30 anos e não sabe por quê...
blog comments powered by Disqus