blob: 44569c421de6ba0b5c8fbf3c5fa81876698ba1aa [file] [log] [blame]
/* ------------------------------------------------------------------
* Copyright (C) 1998-2009 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
/*! @} */