#ifndef LSTRING_H
#define LSTRING_H

#include <string>

class lstring
{
public:
    lstring( const char *s);
    lstring( const lstring &rhs);
    ~lstring();

    lstring &operator=( const lstring &rhs);
    lstring &operator+=( const lstring &rhs);
    lstring &operator+=( char ch);
    
    const char *c_str() const { return prx->str(); }
private:
    class sproxy
    {
    public:
        sproxy(const char *p) : rcnt(1), s(p) { }
        void incr() { ++rcnt; }
        int  decr() { return --rcnt; }
        int  cnt()  const { return rcnt; }
        const char *str() const { return s.c_str(); }
        void add( char ch) { s+=ch; }
        void add( const char *p) { s+=p; }
    private:
        sproxy(const sproxy& rhs);
        void operator=(const sproxy& rhs);
        int rcnt;
        std::string s;
    };

    void release();
    void get(sproxy* px);

    sproxy *prx;
};

lstring operator+( const lstring &s1, const lstring &s2);


#endif /* LSTRING_H */