//
// aegis - project change supervisor
// Copyright (C) 2004-2008, 2012, 2014 Peter Miller
//
// This program is free software; you can redistribute it and/or modify
// it under the terms of the GNU General Public License as published by
// the Free Software Foundation; either version 3 of the License, or (at
// your option) any later version.
//
// This program is distributed in the hope that it will be useful,
// but WITHOUT ANY WARRANTY; without even the implied warranty of
// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
// General Public License for more details.
//
// You should have received a copy of the GNU General Public License
// along with this program. If not, see .
//
#ifndef COMMON_WSTRING_H
#define COMMON_WSTRING_H
/** @addtogroup WString
* @brief Wide char strings
* @ingroup String
* @{
*/
#include
class nstring; // forward
/**
* The wstring class is used to represent a reference counted wide string
* with fast equality comparison.
*
* This is a wide string class, using wchar_t as the internal character
* type. For ordinary narrow strings, which use char as the internal
* character type, see the nstring class.
*/
class wstring
{
public:
/**
* The destructor.
*
* This destructor is not virtual, do not derive from this class.
*/
~wstring();
/**
* The default constructor.
*/
wstring() :
ref(get_empty_ref())
{
}
/**
* The constructor.
*/
explicit
wstring(const char *arg) :
ref(arg ? wstr_from_c(arg) : get_empty_ref())
{
}
/**
* The constructor.
*/
explicit
wstring(const wchar_t *arg) :
ref(arg ? wstr_from_wc(arg) : get_empty_ref())
{
}
/**
* The constructor.
*/
wstring(const char *data, size_t len) :
ref(wstr_n_from_c(data, len))
{
}
/**
* The constructor.
*/
wstring(const wchar_t *data, size_t len) :
ref(wstr_n_from_wc(data, len))
{
}
/**
* The constructor.
*/
wstring(wstring_ty *arg) :
ref(wstr_copy(arg))
{
}
/**
* The constructor.
*
* This will be DEPRECATED as soon as possible.
*/
wstring(string_ty *arg);
/**
* The constructor.
*/
wstring(const nstring &arg);
/**
* The copy constructor.
*/
wstring(const wstring &arg) :
ref(wstr_copy(arg.ref))
{
}
/**
* The assignment operator.
*/
wstring &operator=(const wstring &arg);
/**
* The clear method may be used to discard the contents of the
* string, and replace it with the empty string.
*/
void clear(void);
/**
* The c_str method is used to obtain a pointer to the underlying C
* string (guaranteed to the NUL terminated).
*/
const wchar_t *
c_str(void)
const
{
return ref->wstr_text;
}
/**
* The to_nstring method is used to convert a wide string to a
* narrow string.
*/
nstring to_nstring(void) const;
bool
empty(void)
const
{
return (ref->wstr_length == 0);
}
size_t
size(void)
const
{
return ref->wstr_length;
}
size_t
length(void)
const
{
return ref->wstr_length;
}
/**
* @brief
* join two strings together
*
* The wstr_catenate function is used to join two strings togther to
* form a new string. The are joined in the order given.
*
* @param arg
* A string to be joined. Will not be modified.
*
* @return
* a pointer to a string in dynamic memory. Use wstr_free()
* when finished with. The contents of the structure pointed
* to shall not be altered.
*/
wstring
catenate(const wstring &arg)
const
{
return wstring(wstr_catenate(ref, arg.ref));
}
wstring
operator+(const wstring &arg)
const
{
return catenate(arg);
}
wstring &
operator+=(const wstring &arg)
{
wstring temp = catenate(arg);
temp.swap(*this);
return *this;
}
void swap(wstring &arg);
/**
* @brief
* joining strings together
*
* The wstr_cat_three function is used to join three strings together
* to form a new string. The are joined in the order given.
*
* @param str2
* A string to be joined. Will not be modified.
* @param str3
* A string to be joined. Will not be modified.
*
* @return
* a pointer to a string in dynamic memory. Use wstr_free() when
* finished with. The contents of the structure pointed to
* shall not be altered.
*/
wstring
cat_three(const wstring &str2, const wstring &str3)
const
{
return wstring(wstr_cat_three(ref, str2.ref, str3.ref));
}
/**
* @brief
* convert to upper case
*
* The wstr_upcase function is used to create a new string where the
* lower case characters in the input string are converted to upper
* case.
*
* @return
* a pointer to a string in dynamic memory. Use wstr_free()
* when finished with. The contents of the structure pointed
* to shall not be altered.
*/
wstring
upcase(void)
const
{
return wstring(wstr_to_upper(ref));
}
/**
* @brief
* convert to lower case
*
* The wstr_downcase function is used to create a new string where the
* upper case characters in the input string are converted to lower
* case.
*
* @return
* a pointer to a string in dynamic memory. Use wstr_free()
* when finished with. The contents of the structure pointed
* to shall not be altered.
*/
wstring
downcase(void)
const
{
return wstring(wstr_to_lower(ref));
}
/**
* @brief
* convert to title case
*
* The wstr_capitalize function is used to create a new string where the
* first letter or each word of the inopuyt string are upper case, and
* the remaining letters in each word are lower case. (Sometimes called
* Title Case.)
*
* @returns
* a pointer to a string in dynamic memory.
*/
wstring
capitalize(void)
const
{
return wstring(wstr_capitalize(ref));
}
/**
* @brief
* test string equality
*
* The wstr_equal function is used to test to see if two strings are
* exactly the same.
*
* @param arg
* A string to be compared. Will not be modified.
*
* @note
* Users shall always write code as if they did not know that a
* string equality test is a pointer equality test.
*
* @return
* Non-zero if the strings are equal,
* zero if the strings are unequal.
*/
bool
equal(const wstring &arg)
const
{
return (ref == arg.ref);
}
bool
operator==(const wstring &arg)
const
{
return (ref == arg.ref);
}
bool
operator!=(const wstring &arg)
const
{
return (ref != arg.ref);
}
/**
* The get_ref method is used to extract the reference to the
* underlying reference counted string object. If the ref pointer
* is NULL a pointer to a common empty string object is returned.
*
* Once the sources cease using wstring_ty directly, this method
* will become private.
*/
wstring_ty *
get_ref(void)
const
{
return ref;
}
wstring_ty *
get_ref_copy(void)
const
{
return wstr_copy(ref);
}
/**
* The identifier method is used to convert all non-C-identifier
* characters in the string to underscores. The intention is to
* create a valid C identifier from the string.
*/
wstring
identifier(void)
const
{
return wstr_to_ident(get_ref());
}
/**
* The indexing operator is used to extract the nth character of a
* string. Indexes out of range will result in the NUL character
* being returned.
*
* @param n
* The character to extract. Zero based.
* @returns
* The character requested, or NUL if the index is out
* of range.
*/
char
operator[](size_t n)
const
{
return (n < size() ? ref->wstr_text[n] : L'\0');
}
/**
* The column_width method is used to determine how many printing
* columns wde this character is. Most characters are one printing
* column wide, byt Kanji characters (for example0 can be two
* columns wide.
*/
int
column_width(void)
const
{
return wstr_column_width(ref);
}
private:
/**
* The ref instance variable is used to remember the location of
* the object common to all of the references. The is never
* the NULL pointer.
*/
wstring_ty *ref;
/**
* The get_empty_ref() class method is used to get a pointer to an
* underlying string object of length zero.
*/
static wstring_ty *
get_empty_ref(void)
{
return wstr_from_c("");
}
};
inline wstring
operator+(const char *lhs, const wstring &rhs)
{
return wstring(lhs) + rhs;
}
inline wstring
operator+(const wstring &lhs, const char *rhs)
{
return lhs + wstring(rhs);
}
/** @} */
#endif // COMMON_WSTRING_H
// vim: set ts=8 sw=4 et :