/* ------------------------------------------------------------------
 * Copyright (C) 2008 PacketVideo
 *
 * Licensed under the Apache License, Version 2.0 (the "License");
 * you may not use this file except in compliance with the License.
 * You may obtain a copy of the License at
 *
 *      http://www.apache.org/licenses/LICENSE-2.0
 *
 * Unless required by applicable law or agreed to in writing, software
 * distributed under the License is distributed on an "AS IS" BASIS,
 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either
 * express or implied.
 * See the License for the specific language governing permissions
 * and limitations under the License.
 * -------------------------------------------------------------------
 */
// -*- c++ -*-
// = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = =

//				 O S C L_ S T R I N G _ C O N T A I N E R S
//
//	  This file contains a standardized set of string containers that
//	  can be used in place of character arrays.

// = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = =

/*! \addtogroup osclutil OSCL Util
 *
 * @{
 */


/*!
 * \file oscl_string_containers.h
 * \brief Provides a standardized set of string containers that
 *	  can be used in place of character arrays.
 *
 */


#ifndef OSCL_STRING_CONTAINERS_H_INCLUDED
#define OSCL_STRING_CONTAINERS_H_INCLUDED


#ifndef OSCL_STRING_H_INCLUDED
#include "oscl_string.h"
#endif

#ifndef OSCL_DEFALLOC_H_INCLUDED
#include "oscl_defalloc.h"
#endif

#ifndef OSCL_REFCOUNTER_H_INCLUDED
#include "oscl_refcounter.h"
#endif

#ifndef OSCL_ERROR_H_INCLUDED
#include "oscl_error.h"
#endif

#ifndef OSCL_STRING_REP_H_INCLUDED
#include "oscl_string_rep.h"
#endif

#ifndef OSCL_STDSTRING_H_INCLUDED
#include "oscl_stdstring.h"
#endif

#ifndef OSCL_MEM_H_INCLUDED
#include "oscl_mem.h"
#endif

/**
	OSCL_HeapString is a simple string class, compatible with
	regular character array strings.

	The string array is variable length, is allocated from the heap,
	and is modifiable.
	A copy-on-write mechanism is used to minimize unnecessary copying when
	multiple instances of a string are created for reading.
	Allocated memory is automatically freed by the class destructor when
	the last string referencing the memory is destroyed.

	The class HAS NO thread synchronization built-in, so it is NOT MT-SAFE.
	External locks should be used if the class is to be shared across threads.

	@param Alloc: memory allocator, derived from Oscl_DefAlloc.
*/
template <class Alloc>
class OSCL_HeapString : public OSCL_String
{
    public:
        typedef OSCL_String::chartype chartype;

        /**
        	The default constructor creates an empty string.
        */
        OSCL_HeapString();

        /**
        	Creates a heap string that contains a copy of the input
        	string.
        	@param src: input string.
        */
        OSCL_HeapString(const OSCL_HeapString& src);
        OSCL_HeapString(const OSCL_String& src);

        /**
        	Creates a heap string that contains a copy of the input
        	string.
        	@param cp: null-terminated string.
        */
        OSCL_HeapString(const chartype* cstr);

        /**
        	Creates a heap string that contains a copy of the input
        	string or character array.
        	@param src: character array, not necessarily null-terminated.
        	@param length: number of characters to copy.
        */
        OSCL_HeapString(const chartype* buf, uint32 length);

        ~OSCL_HeapString();

        /** Pure virtuals from OSCL_String
        */
        uint32 get_size() const;
        uint32 get_maxsize() const;
        const chartype* get_cstr() const;
        chartype* get_str() const;

        /** Assignment operators
        */
        OSCL_HeapString& operator=(const OSCL_HeapString& src);
        OSCL_HeapString& operator=(const OSCL_String& src);
        OSCL_HeapString& operator=(const chartype* cstr);

        /**
        	Set the contents of this string to a new string or
        	character array.
        	@param buf: string or character array.
        	@param length: number of characters to copy.
        */
        void set(const chartype* buf, uint32 length);

    private:
        CHeapRep *iRep;
        Alloc iAlloc;
        void create();
        void set_rep(const chartype*, uint32);
        void append_rep(const chartype*, uint32);

        /** Pure virtuals from OSCL_String.
        */
        void set_rep(const chartype* cstr);
        void append_rep(const chartype* cstr);
        void set_rep(const OSCL_String& src);
        void append_rep(const OSCL_String& src);
        void set_len(uint32 len);
        friend class OSCL_String;
};

/**
	OSCL_wHeapString is identical to OSCL_HeapString
	except that it uses wide-character format.
	For descriptions, see OSCL_HeapString.
*/
template <class Alloc>
class OSCL_wHeapString : public OSCL_wString
{
    public:
        typedef OSCL_wString::chartype chartype;

        OSCL_wHeapString();

        OSCL_wHeapString(const OSCL_wHeapString& src);
        OSCL_wHeapString(const OSCL_wString& src);

        OSCL_wHeapString(const chartype* cstr);
        OSCL_wHeapString(const chartype* buf, uint32 length);

        ~OSCL_wHeapString();

        uint32 get_size() const;
        uint32 get_maxsize() const;
        const chartype* get_cstr() const;
        chartype* get_str() const;

        OSCL_wHeapString& operator=(const OSCL_wHeapString& src);
        OSCL_wHeapString& operator=(const OSCL_wString& src);
        OSCL_wHeapString& operator=(const chartype* cstr);

        void set(const chartype* buf, uint32 length);

    private:
        CHeapRep *iRep;
        Alloc iAlloc;
        void create();
        void set_rep(const chartype*, uint32);
        void append_rep(const chartype*, uint32);

        void set_rep(const chartype* cstr);
        void append_rep(const chartype* cstr);
        void set_rep(const OSCL_wString& src);
        void append_rep(const OSCL_wString& src);
        void set_len(uint32 len);
        friend class OSCL_wString;
};

/**
	OSCL_HeapStringA is a simple string class, compatible with
	regular character array strings.  It is similar to
	OSCL_HeapString, except that the allocator is passed at
	run-time instead of compile-time.
	The allocator pointer is passed in the constructor, and
	may be a reference-counted object.
	If the allocator is not a reference-counted object then it must
	persist over the lifetime of all OSCL_HeapStringA objects that use it.
	If no allocator is provided, then an OsclMemAllocator
	will be used.

	The string array is variable length, is allocated from the heap,
	and is modifiable.
	A copy-on-write mechanism is used to minimize unnecessary copying when
	multiple instances of a string are created for reading.
	Allocated memory is automatically freed by the class destructor when
	the last string referencing the memory is destroyed.

	The class HAS NO thread synchronization built-in, so it is NOT MT-SAFE.
	External locks should be used if the class is to be shared across threads.

*/
class OSCL_HeapStringA : public OSCL_String
{
    public:
        typedef OSCL_String::chartype chartype;


        /**
        	The default constructor creates an empty string.
        	@param: (optional) allocator or reference-counted allocator.
        	@param: (optional) reference counter associated with allocator object.
        	If no allocator is provided, this this object will use
        	an OsclMemAllocator.
        */
        OSCL_IMPORT_REF OSCL_HeapStringA();
        OSCL_IMPORT_REF OSCL_HeapStringA(Oscl_DefAlloc *alloc, OsclRefCounter *ref = NULL);

        /**
        	Creates a heap string that contains a copy of the input
        	string.
        	@param src: input string.
        	@param: (optional) allocator or reference-counted allocator.
        	@param: (optional) reference counter associated with allocator object.
        	If no allocator is provided, this this object will use
        	an OsclMemAllocator.
        */
        OSCL_IMPORT_REF OSCL_HeapStringA(const OSCL_HeapStringA& src);
        OSCL_IMPORT_REF OSCL_HeapStringA(const OSCL_HeapStringA& src, Oscl_DefAlloc *alloc, OsclRefCounter *ref = NULL);
        OSCL_IMPORT_REF OSCL_HeapStringA(const OSCL_String& src, Oscl_DefAlloc *alloc = NULL, OsclRefCounter *ref = NULL);

        /**
        	Creates a heap string that contains a copy of the input
        	string.
        	@param cp: null-terminated string.
        	@param: (optional) allocator or reference-counted allocator.
        	@param: (optional) reference counter associated with allocator object.
        	If no allocator is provided, this this object will use
        	an OsclMemAllocator.
        */
        OSCL_IMPORT_REF OSCL_HeapStringA(const chartype* cstr, Oscl_DefAlloc *alloc = NULL, OsclRefCounter *ref = NULL);

        /**
        	Creates a heap string that contains a copy of the input
        	string or character array.
        	@param src: character array, not necessarily null-terminated.
        	@param length: number of characters to copy.
        	@param: (optional) allocator or reference-counted allocator.
        	@param: (optional) reference counter associated with allocator object.
        	If no allocator is provided, this this object will use
        	an OsclMemAllocator.
        */
        OSCL_IMPORT_REF OSCL_HeapStringA(const chartype* buf, uint32 length, Oscl_DefAlloc *alloc = NULL, OsclRefCounter *ref = NULL);

        OSCL_IMPORT_REF ~OSCL_HeapStringA();

        /** Pure virtuals from OSCL_String
        */
        OSCL_IMPORT_REF uint32 get_size() const;
        OSCL_IMPORT_REF uint32 get_maxsize() const;
        OSCL_IMPORT_REF const chartype* get_cstr() const;
        OSCL_IMPORT_REF chartype* get_str() const;

        /** Assignment operators
        */
        OSCL_IMPORT_REF OSCL_HeapStringA& operator=(const OSCL_HeapStringA& src);
        OSCL_IMPORT_REF OSCL_HeapStringA& operator=(const OSCL_String& src);
        OSCL_IMPORT_REF OSCL_HeapStringA& operator=(const chartype* cstr);

        /**
        	Set the contents of this string to a new string or
        	character array.
        	@param buf: string or character array.
        	@param length: number of characters to copy.
        */
        OSCL_IMPORT_REF void set(const chartype* buf, uint32 length);

    private:
        CHeapRep *iRep;
        OsclRefCounter *iAllocRef;
        Oscl_DefAlloc *iAlloc;
        OsclMemAllocator iDefAlloc;
        void create(Oscl_DefAlloc *, OsclRefCounter*);
        void set_rep(const chartype*, uint32);
        void append_rep(const chartype*, uint32);

        /** Pure virtuals from OSCL_String.
        */
        void set_rep(const chartype* cstr);
        void append_rep(const chartype* cstr);
        void set_rep(const OSCL_String& src);
        void append_rep(const OSCL_String& src);
        void set_len(uint32 len);
        friend class OSCL_String;
};

/**
	OSCL_wHeapStringA is identical to OSCL_HeapStringA
	except that it uses wide-character format.
	For descriptions, see OSCL_HeapStringA.
*/
class OSCL_wHeapStringA : public OSCL_wString
{
    public:
        typedef OSCL_wString::chartype chartype;

        OSCL_IMPORT_REF OSCL_wHeapStringA();
        OSCL_IMPORT_REF OSCL_wHeapStringA(Oscl_DefAlloc *alloc, OsclRefCounter *ref = NULL);

        OSCL_IMPORT_REF OSCL_wHeapStringA(const OSCL_wHeapStringA& src);
        OSCL_IMPORT_REF OSCL_wHeapStringA(const OSCL_wHeapStringA& src, Oscl_DefAlloc *alloc, OsclRefCounter *ref = NULL);
        OSCL_IMPORT_REF OSCL_wHeapStringA(const OSCL_wString& src, Oscl_DefAlloc *alloc = NULL, OsclRefCounter *ref = NULL);

        OSCL_IMPORT_REF OSCL_wHeapStringA(const chartype* cstr, Oscl_DefAlloc *alloc = NULL, OsclRefCounter *ref = NULL);

        OSCL_IMPORT_REF OSCL_wHeapStringA(const chartype* buf, uint32 length, Oscl_DefAlloc *alloc = NULL, OsclRefCounter *ref = NULL);

        OSCL_IMPORT_REF ~OSCL_wHeapStringA();

        OSCL_IMPORT_REF uint32 get_size() const;
        OSCL_IMPORT_REF uint32 get_maxsize() const;
        OSCL_IMPORT_REF const chartype* get_cstr() const;
        OSCL_IMPORT_REF chartype* get_str() const;

        OSCL_IMPORT_REF OSCL_wHeapStringA& operator=(const OSCL_wHeapStringA& src);
        OSCL_IMPORT_REF OSCL_wHeapStringA& operator=(const OSCL_wString& src);
        OSCL_IMPORT_REF OSCL_wHeapStringA& operator=(const chartype* cstr);

        OSCL_IMPORT_REF void set(const chartype* buf, uint32 length);

    private:
        CHeapRep *iRep;
        OsclRefCounter *iAllocRef;
        Oscl_DefAlloc *iAlloc;
        OsclMemAllocator iDefAlloc;
        void create(Oscl_DefAlloc *, OsclRefCounter*);
        void set_rep(const chartype*, uint32);
        void append_rep(const chartype*, uint32);

        void set_rep(const chartype* cstr);
        void append_rep(const chartype* cstr);
        void set_rep(const OSCL_wString& src);
        void append_rep(const OSCL_wString& src);
        void set_len(uint32 len);
        friend class OSCL_wString;
};


/**
	OSCL_StackString is a simple string class, compatible with
	regular character array strings.

	The string array is fixed length, is allocated from the stack,
	and is modifiable.	Operations that update the string will automatically
	truncate it to fit the fixed size storage.
	This is recommended for use for short strings (<255).
	Use OSCL_HeapString for very large strings to avoid stack overflow.

	@param C: type of character.
	@param MaxBufSize: maximum string length not including null terminator.
*/
template <uint32 MaxBufSize>
class OSCL_StackString : public OSCL_String
{
    public:
        typedef OSCL_String::chartype chartype;

        /** Creates an OSCL_StackString initialized with an empty string.
        */
        OSCL_StackString();

        /** Creates an OSCL_StackString with a copy of the input string.
        	The string may be truncated to fit the available storage.
        	@param src: input string.
        */
        OSCL_StackString(const OSCL_StackString& src);
        OSCL_StackString(const OSCL_String& src);

        /** Creates an OSCL_StackString with a copy of the input string.
        	The string may be truncated to fit the available storage.
        	@param cp: a null-terminated string.
        */
        OSCL_StackString(const chartype* cstr);

        /** Creates an OSCL_StackString with a copy of the input string.
        	The string may be truncated to fit the available storage.
        	@param src: a character array, not necessarily null-terminated.
        	@param length: the number of characters to copy.
        */
        OSCL_StackString(const chartype* buf, uint32 length);

        ~OSCL_StackString();

        /** Pure virtuals from OSCL_String
        */
        uint32 get_size() const;
        uint32 get_maxsize() const;
        const chartype* get_cstr() const;
        chartype* get_str() const;

        /** Assignment operators
        */
        OSCL_StackString& operator=(const OSCL_StackString& src);
        OSCL_StackString& operator=(const OSCL_String& src);
        OSCL_StackString& operator=(const chartype* cstr);

        /**
        	Set the contents of this string to a new string or
        	character array.
        	@param buf: string or character array.
        	@param length: number of characters to copy.
        */
        void set(const chartype* buf, uint32 length);

    private:
        CStackRep rep;
        char buffer[MaxBufSize+1];//fixed string buffer.
        void create();

        /** Pure virtuals from OSCL_String
        */
        void set_rep(const chartype* cstr);
        void append_rep(const chartype* cstr);
        void set_rep(const OSCL_String& src);
        void append_rep(const OSCL_String& src);
        void set_len(uint32 len);
        friend class OSCL_String;
};

/**
	OSCL_wStackString is identical to OSCL_StackString
	except that it uses wide-character format.
	For descriptions, see OSCL_StackString.
*/
template <uint32 MaxBufSize>
class OSCL_wStackString : public OSCL_wString
{
    public:
        typedef OSCL_wString::chartype chartype;

        OSCL_wStackString();

        OSCL_wStackString(const OSCL_wStackString& src);
        OSCL_wStackString(const OSCL_wString& src);

        OSCL_wStackString(const chartype* cstr);
        OSCL_wStackString(const chartype* buf, uint32 length);

        ~OSCL_wStackString();

        uint32 get_size() const;
        uint32 get_maxsize() const;
        const chartype* get_cstr() const;
        chartype* get_str() const;

        OSCL_wStackString& operator=(const OSCL_wStackString& src);
        OSCL_wStackString& operator=(const OSCL_wString& src);
        OSCL_wStackString& operator=(const chartype* cstr);

        void set(const chartype* buf, uint32 length);

    private:
        CStackRep rep;
        chartype buffer[MaxBufSize+1];//fixed string buffer.
        void create();

        void set_rep(const chartype* cstr);
        void append_rep(const chartype* cstr);
        void set_rep(const OSCL_wString& src);
        void append_rep(const OSCL_wString& src);
        void set_len(uint32 len);
        friend class OSCL_wString;
};

/**
	OSCL_FastString is a simple string class, compatible with
	regular character array strings.

	This class does not allocate internal memory for the string but acts as
	a container for a user-defined buffer. This means no copying of the string
	is done and provides a faster way of manipulating strings.
	Depending on initialization, this container provides either read-only
	or read-write access to the string.

	Implementation assumes the input string is null-terminated.

	@param C: type of character.
*/
class OSCL_FastString : public OSCL_String
{
    public:
        typedef OSCL_String::chartype chartype;

        /**
        	Default constructor.
        */
        OSCL_IMPORT_REF OSCL_FastString();

        /**
        	Creates a fast string that contains a copy of the input
        	string.
        	The string inherits the writable-ness of the source string.
        	@param src: input string.
        */
        OSCL_IMPORT_REF OSCL_FastString(const OSCL_FastString& src);

        /**
        	Create the string and initialize it to contain the input string.
        	The string is not writable.
        	@param: null-terminated string.
        */
        OSCL_IMPORT_REF OSCL_FastString(const chartype* cstr);

        /**
        	Create the string and initialize it to contain the input string.
        	The string is writable.
        	@param cp: null-terminated string.
        	@param maxlen: maximum size of storage at cp, not incl null terminator.
        	If input string is not null-terminated, the function leaves.
        */
        OSCL_IMPORT_REF OSCL_FastString(chartype* buf, uint32 maxlen);

        OSCL_IMPORT_REF ~OSCL_FastString();

        /** Pure virtuals from OSCL_String
        */
        OSCL_IMPORT_REF uint32 get_size() const;
        OSCL_IMPORT_REF uint32 get_maxsize() const;
        OSCL_IMPORT_REF const chartype* get_cstr() const;
        OSCL_IMPORT_REF chartype* get_str() const;

        /** Assignment operators
        */
        OSCL_IMPORT_REF OSCL_FastString& operator=(const OSCL_FastString& src);
        OSCL_IMPORT_REF OSCL_FastString& operator=(const chartype* cstr);

        /**
        	This function can be used to reassign the string to a new
        	writable string.
        	If input string is not null-terminated, the function leaves.
        */
        OSCL_IMPORT_REF void set(chartype* cstr, uint32 maxlen);

        /**
        	This function can be used to refresh the string size in case the
        	contents of the string buffer have been modified since the
        	container was created.
        */
        OSCL_IMPORT_REF void set_length();

    private:
        CFastRep rep;

        /** Pure virtuals from OSCL_String
        */
        void set_rep(const chartype* cstr);
        void append_rep(const chartype* cstr);
        void set_rep(const OSCL_String& src);
        void append_rep(const OSCL_String& src);
        void set_len(uint32 len);
        friend class OSCL_String;
};

/**
	OSCL_wFastString is identical to OSCL_FastString
	except that it uses wide-character format.
	For descriptions, see OSCL_FastString.
*/
class OSCL_wFastString : public OSCL_wString
{
    public:
        typedef OSCL_wString::chartype chartype;

        OSCL_IMPORT_REF OSCL_wFastString();

        OSCL_IMPORT_REF OSCL_wFastString(const OSCL_wFastString& src);

        OSCL_IMPORT_REF OSCL_wFastString(const chartype* cstr);
        OSCL_IMPORT_REF OSCL_wFastString(chartype* buf, uint32 maxlen);

        OSCL_IMPORT_REF ~OSCL_wFastString();

        OSCL_IMPORT_REF uint32 get_size() const;
        OSCL_IMPORT_REF uint32 get_maxsize() const;
        OSCL_IMPORT_REF const chartype* get_cstr() const;
        OSCL_IMPORT_REF chartype* get_str() const;

        OSCL_IMPORT_REF OSCL_wFastString& operator=(const OSCL_wFastString& src);
        OSCL_IMPORT_REF OSCL_wFastString& operator=(const chartype* cstr);

        OSCL_IMPORT_REF void set(chartype* cstr, uint32 maxlen);

        OSCL_IMPORT_REF void set_length();

    private:
        CFastRep rep;

        void set_rep(const chartype* cstr);
        void append_rep(const chartype* cstr);
        void set_rep(const OSCL_wString& src);
        void append_rep(const OSCL_wString& src);
        void set_len(uint32 len);
        friend class OSCL_wString;
};


// **************************************************************
//					 OSCL_HeapString<Alloc> Implementation
//					 OSCL_wHeapString<Alloc> Implementation
// **************************************************************

template<class Alloc>
void OSCL_HeapString<Alloc>::set_rep(const chartype* cp, uint32 len)
//set heap rep to new string.
{
    CHeapRep::set_rep(iRep, iAlloc, cp, len);
}

template<class Alloc>
void OSCL_wHeapString<Alloc>::set_rep(const chartype* cp, uint32 len)
//set heap rep to new string.
{
    CHeapRep::set_rep(iRep, iAlloc, cp, len);
}

// **************************************************************
template<class Alloc>
void OSCL_HeapString<Alloc>::append_rep(const chartype* cp, uint32 len)
//set heap rep to current string plus new string.
{
    CHeapRep::append_rep(iRep, iAlloc, cp, len);
}

template<class Alloc>
void OSCL_wHeapString<Alloc>::append_rep(const chartype* cp, uint32 len)
//set heap rep to current string plus new string.
{
    CHeapRep::append_rep(iRep, iAlloc, cp, len);
}

// **************************************************************
template<class Alloc>
void OSCL_HeapString<Alloc>::set_rep(const chartype* cp)
{
    set_rep(cp, (cp) ? oscl_strlen(cp) : 0);
}

template<class Alloc>
void OSCL_wHeapString<Alloc>::set_rep(const chartype* cp)
{
    set_rep(cp, (cp) ? oscl_strlen(cp) : 0);
}


// **************************************************************
template<class Alloc>
void OSCL_HeapString<Alloc>::append_rep(const chartype* cp)
{
    append_rep(cp, (cp) ? oscl_strlen(cp) : 0);
}

template<class Alloc>
void OSCL_wHeapString<Alloc>::append_rep(const chartype* cp)
{
    append_rep(cp, (cp) ? oscl_strlen(cp) : 0);
}


// **************************************************************
template<class Alloc>
void OSCL_HeapString<Alloc>::set_rep(const OSCL_String& src)
{
    set_rep(src.get_cstr(), src.get_size());
}

template<class Alloc>
void OSCL_wHeapString<Alloc>::set_rep(const OSCL_wString& src)
{
    set_rep(src.get_cstr(), src.get_size());
}


// **************************************************************
template<class Alloc>
void OSCL_HeapString<Alloc>::append_rep(const OSCL_String& src)
{
    append_rep(src.get_cstr(), src.get_size());
}

template<class Alloc>
void OSCL_wHeapString<Alloc>::append_rep(const OSCL_wString& src)
{
    append_rep(src.get_cstr(), src.get_size());
}


// **************************************************************
template<class Alloc>
uint32 OSCL_HeapString<Alloc>::get_size() const
{
    if (iRep)
        return iRep->size;
    return 0;
}

template<class Alloc>
uint32 OSCL_wHeapString<Alloc>::get_size() const
{
    if (iRep)
        return iRep->size;
    return 0;
}

// **************************************************************
template<class Alloc>
void OSCL_HeapString<Alloc>::set_len(uint32 len)
{
    iRep->size = len;
}

template<class Alloc>
void OSCL_wHeapString<Alloc>::set_len(uint32 len)
{
    iRep->size = len;
}


// **************************************************************
template<class Alloc>
uint32 OSCL_HeapString<Alloc>::get_maxsize() const
{
    if (iRep)
        return iRep->maxsize;
    return 0;
}

template<class Alloc>
uint32 OSCL_wHeapString<Alloc>::get_maxsize() const
{
    if (iRep)
        return iRep->maxsize;
    return 0;
}


// **************************************************************
template<class Alloc>
const typename OSCL_HeapString<Alloc>::chartype* OSCL_HeapString<Alloc>::get_cstr() const
{
    if (iRep)
        return (chartype*)iRep->buffer;
    return NULL;
}

template<class Alloc>
const typename OSCL_wHeapString<Alloc>::chartype* OSCL_wHeapString<Alloc>::get_cstr() const
{
    if (iRep)
        return (chartype*)iRep->buffer;
    return NULL;
}


// **************************************************************
template<class Alloc>
typename OSCL_HeapString<Alloc>::chartype* OSCL_HeapString<Alloc>::get_str() const
{
    if (iRep)
        return (chartype*)iRep->buffer;
    return NULL;
}

template<class Alloc>
typename OSCL_wHeapString<Alloc>::chartype* OSCL_wHeapString<Alloc>::get_str() const
{
    if (iRep)
        return (chartype*)iRep->buffer;
    return NULL;
}


// **************************************************************
template<class Alloc>
void OSCL_HeapString<Alloc>::create()
{
    iRep = NULL;
}

template<class Alloc>
void OSCL_wHeapString<Alloc>::create()
{
    iRep = NULL;
}


// **************************************************************
template<class Alloc>
OSCL_HeapString<Alloc>::OSCL_HeapString()
{
    create();
    set_rep(NULL);
}

template<class Alloc>
OSCL_wHeapString<Alloc>::OSCL_wHeapString()
{
    create();
    set_rep(NULL);
}


// **************************************************************
template<class Alloc>
OSCL_HeapString<Alloc>::OSCL_HeapString(const chartype* cp)
{
    create();
    set_rep(cp);
}

template<class Alloc>
OSCL_wHeapString<Alloc>::OSCL_wHeapString(const chartype* cp)
{
    create();
    set_rep(cp);
}


// **************************************************************
template<class Alloc>
void OSCL_HeapString<Alloc>::set(const chartype* cp, uint32 length)
{
    set_rep(cp, length);
    //just in case input string is shorter than 'length'
    iRep->size = oscl_strlen(get_cstr());
}

template<class Alloc>
void OSCL_wHeapString<Alloc>::set(const chartype* cp, uint32 length)
{
    set_rep(cp, length);
    //just in case input string is shorter than 'length'
    iRep->size = oscl_strlen(get_cstr());
}


// **************************************************************
template<class Alloc>
OSCL_HeapString<Alloc>::OSCL_HeapString(const chartype* cp, uint32 length)
{
    create();
    set(cp, length);
}

template<class Alloc>
OSCL_wHeapString<Alloc>::OSCL_wHeapString(const chartype* cp, uint32 length)
{
    create();
    set(cp, length);
}

// **************************************************************
template<class Alloc>
OSCL_HeapString<Alloc>::OSCL_HeapString(const OSCL_HeapString<Alloc>& src) : OSCL_String(src)
{
    create();
    if (src.iRep)
        CHeapRep::assign(iRep, src.iRep, iAlloc);
    else
        set_rep(src);
}

template<class Alloc>
OSCL_wHeapString<Alloc>::OSCL_wHeapString(const OSCL_wHeapString<Alloc>& src)  : OSCL_wString(src)
{
    create();
    if (src.iRep)
        CHeapRep::assign(iRep, src.iRep, iAlloc);
    else
        set_rep(src);
}

// **************************************************************
template<class Alloc>
OSCL_HeapString<Alloc>::OSCL_HeapString(const OSCL_String& src)
{
    create();
    set_rep(src);
}

template<class Alloc>
OSCL_wHeapString<Alloc>::OSCL_wHeapString(const OSCL_wString& src)
{
    create();
    set_rep(src);
}

// **************************************************************
template<class Alloc>
OSCL_HeapString<Alloc>::~OSCL_HeapString()
{
    if (iRep)
        iRep->remove_ref(iAlloc);
}

template<class Alloc>
OSCL_wHeapString<Alloc>::~OSCL_wHeapString()
{
    if (iRep)
        iRep->remove_ref(iAlloc);
}


// **************************************************************
template<class Alloc>
OSCL_HeapString<Alloc>& OSCL_HeapString<Alloc>::operator=(const OSCL_HeapString<Alloc>& src)
{
    if (src.iRep)
        CHeapRep::assign(iRep, src.iRep, iAlloc);
    else
        set_rep(src);
    return (*this);
}

template<class Alloc>
OSCL_wHeapString<Alloc>& OSCL_wHeapString<Alloc>::operator=(const OSCL_wHeapString<Alloc>& src)
{
    if (src.iRep)
        CHeapRep::assign(iRep, src.iRep, iAlloc);
    else
        set_rep(src);
    return (*this);
}

// **************************************************************
template<class Alloc>
OSCL_HeapString<Alloc>& OSCL_HeapString<Alloc>::operator=(const OSCL_String & src)
{
    set_rep(src);
    return (*this);
}

template<class Alloc>
OSCL_wHeapString<Alloc>& OSCL_wHeapString<Alloc>::operator=(const OSCL_wString & src)
{
    set_rep(src);
    return (*this);
}

// **************************************************************
template<class Alloc>
OSCL_HeapString<Alloc>& OSCL_HeapString<Alloc>::operator=(const chartype * cp)
{
    set_rep(cp);
    return (*this);
}

template<class Alloc>
OSCL_wHeapString<Alloc>& OSCL_wHeapString<Alloc>::operator=(const chartype * cp)
{
    set_rep(cp);
    return (*this);
}

// **************************************************************
//				   OSCL_StackString<MaxBufSize> Implementation
//				   OSCL_wStackString<MaxBufSize> Implementation
// **************************************************************
template<uint32 MaxBufSize>
void OSCL_StackString<MaxBufSize>::set_rep(const chartype* cp)
{
    rep.set(cp, (cp) ? oscl_strlen(cp) : 0);
}

template<uint32 MaxBufSize>
void OSCL_wStackString<MaxBufSize>::set_rep(const chartype* cp)
{
    rep.set(cp, (cp) ? oscl_strlen(cp) : 0);
}


// **************************************************************
template<uint32 MaxBufSize>
void OSCL_StackString<MaxBufSize>::append_rep(const chartype* cp)
{
    rep.append(cp, (cp) ? oscl_strlen(cp) : 0);
}

template<uint32 MaxBufSize>
void OSCL_wStackString<MaxBufSize>::append_rep(const chartype* cp)
{
    rep.append(cp, (cp) ? oscl_strlen(cp) : 0);
}

// **************************************************************
template<uint32 MaxBufSize>
void OSCL_StackString<MaxBufSize>::set_rep(const OSCL_String& src)
{
    rep.set(src.get_cstr(), src.get_size());
}

template<uint32 MaxBufSize>
void OSCL_wStackString<MaxBufSize>::set_rep(const OSCL_wString& src)
{
    rep.set(src.get_cstr(), src.get_size());
}

// **************************************************************
template<uint32 MaxBufSize>
void OSCL_StackString<MaxBufSize>::append_rep(const OSCL_String& src)
{
    rep.append(src.get_cstr(), src.get_size());
}

template<uint32 MaxBufSize>
void OSCL_wStackString<MaxBufSize>::append_rep(const OSCL_wString& src)
{
    rep.append(src.get_cstr(), src.get_size());
}

// **************************************************************
template<uint32 MaxBufSize>
void OSCL_StackString<MaxBufSize>::set_len(uint32 len)
{
    rep.size = len;
}

template<uint32 MaxBufSize>
void OSCL_wStackString<MaxBufSize>::set_len(uint32 len)
{
    rep.size = len;
}

// **************************************************************
template<uint32 MaxBufSize>
uint32 OSCL_StackString<MaxBufSize>::get_size() const
{
    return rep.size;
}

template<uint32 MaxBufSize>
uint32 OSCL_wStackString<MaxBufSize>::get_size() const
{
    return rep.size;
}

// **************************************************************
template<uint32 MaxBufSize>
uint32 OSCL_StackString<MaxBufSize>::get_maxsize() const
{
    return rep.maxsize;
}

template<uint32 MaxBufSize>
uint32 OSCL_wStackString<MaxBufSize>::get_maxsize() const
{
    return rep.maxsize;
}

// **************************************************************
template<uint32 MaxBufSize>
const typename OSCL_StackString<MaxBufSize>::chartype* OSCL_StackString<MaxBufSize>::get_cstr() const
{
    return (chartype*)rep.buffer;
}

template<uint32 MaxBufSize>
const typename OSCL_wStackString<MaxBufSize>::chartype* OSCL_wStackString<MaxBufSize>::get_cstr() const
{
    return (chartype*)rep.buffer;
}

// **************************************************************
template<uint32 MaxBufSize>
typename OSCL_StackString<MaxBufSize>::chartype* OSCL_StackString<MaxBufSize>::get_str() const
{
    return (chartype*)rep.buffer;
}

template<uint32 MaxBufSize>
typename OSCL_wStackString<MaxBufSize>::chartype* OSCL_wStackString<MaxBufSize>::get_str() const
{
    return (chartype*)rep.buffer;
}

// **************************************************************
template<uint32 MaxBufSize>
void OSCL_StackString<MaxBufSize>::create()
{
    rep.buffer = &buffer[0];
    rep.maxsize = MaxBufSize;
}

template<uint32 MaxBufSize>
void OSCL_wStackString<MaxBufSize>::create()
{
    rep.buffer = &buffer[0];
    rep.maxsize = MaxBufSize;
}

// **************************************************************
template<uint32 MaxBufSize>
OSCL_StackString<MaxBufSize>::OSCL_StackString()
{
    create();
    set_rep(NULL);
}

template<uint32 MaxBufSize>
OSCL_wStackString<MaxBufSize>::OSCL_wStackString()
{
    create();
    set_rep(NULL);
}

// **************************************************************
template<uint32 MaxBufSize>
OSCL_StackString<MaxBufSize>::OSCL_StackString(const chartype* cp)
{
    create();
    set_rep(cp);
}

template<uint32 MaxBufSize>
OSCL_wStackString<MaxBufSize>::OSCL_wStackString(const chartype* cp)
{
    create();
    set_rep(cp);
}

// **************************************************************
template<uint32 MaxBufSize>
void OSCL_StackString<MaxBufSize>::set(const chartype* cp, uint32 length)
{
    rep.set(cp, length);
    //just in case input string is shorter than 'length';
    rep.size = oscl_strlen(get_cstr());
}

template<uint32 MaxBufSize>
void OSCL_wStackString<MaxBufSize>::set(const chartype* cp, uint32 length)
{
    rep.set(cp, length);
    //just in case input string is shorter than 'length';
    rep.size = oscl_strlen(get_cstr());
}

// **************************************************************
template<uint32 MaxBufSize>
OSCL_StackString<MaxBufSize>::OSCL_StackString(const chartype* cp, uint32 length)
{
    create();
    set(cp, length);
}

template<uint32 MaxBufSize>
OSCL_wStackString<MaxBufSize>::OSCL_wStackString(const chartype* cp, uint32 length)
{
    create();
    set(cp, length);
}

// **************************************************************
template<uint32 MaxBufSize>
OSCL_StackString<MaxBufSize>::OSCL_StackString(const OSCL_StackString<MaxBufSize>& src) : OSCL_String(src)
{
    create();
    set_rep(src);
}

template<uint32 MaxBufSize>
OSCL_wStackString<MaxBufSize>::OSCL_wStackString(const OSCL_wStackString<MaxBufSize>& src)
{
    create();
    set_rep(src);
}

// **************************************************************
template<uint32 MaxBufSize>
OSCL_StackString<MaxBufSize>::OSCL_StackString(const OSCL_String& src)
{
    create();
    set_rep(src);
}

template<uint32 MaxBufSize>
OSCL_wStackString<MaxBufSize>::OSCL_wStackString(const OSCL_wString& src)
{
    create();
    set_rep(src);
}

// **************************************************************
template<uint32 MaxBufSize>
OSCL_StackString<MaxBufSize>::~OSCL_StackString()
{}

template<uint32 MaxBufSize>
OSCL_wStackString<MaxBufSize>::~OSCL_wStackString()
{}

// **************************************************************
template<uint32 MaxBufSize>
OSCL_StackString<MaxBufSize>& OSCL_StackString<MaxBufSize>::operator=(const OSCL_StackString<MaxBufSize>& src)
{
    set_rep(src);
    return (*this);
}

template<uint32 MaxBufSize>
OSCL_wStackString<MaxBufSize>& OSCL_wStackString<MaxBufSize>::operator=(const OSCL_wStackString<MaxBufSize>& src)
{
    set_rep(src);
    return (*this);
}

// **************************************************************
template<uint32 MaxBufSize>
OSCL_StackString<MaxBufSize>& OSCL_StackString<MaxBufSize>::operator=(const OSCL_String & src)
{
    set_rep(src);
    return (*this);
}

template<uint32 MaxBufSize>
OSCL_wStackString<MaxBufSize>& OSCL_wStackString<MaxBufSize>::operator=(const OSCL_wString & src)
{
    set_rep(src);
    return (*this);
}

// **************************************************************
template<uint32 MaxBufSize>
OSCL_StackString<MaxBufSize>& OSCL_StackString<MaxBufSize>::operator=(const chartype * cp)
{
    set_rep(cp);
    return (*this);
}

template<uint32 MaxBufSize>
OSCL_wStackString<MaxBufSize>& OSCL_wStackString<MaxBufSize>::operator=(const chartype * cp)
{
    set_rep(cp);
    return (*this);
}

#endif	 // OSCL_STRING_H_INCLUDED

/*! @} */
