//
// aegis - project change supervisor
// Copyright (C) 1991-1994, 1996, 1997, 2003-2006, 2008 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_STR_LIST_H
#define COMMON_STR_LIST_H
#include
/** \addtogroup String_List
* \brief String Lists
* \ingroup String
* @{
*/
/**
* The string_list_ty type is used to represent a list of string
* (string_ty *) values.
*/
class string_list_ty
{
public:
/**
* The destructor.
*/
~string_list_ty();
/**
* The default constructor. This list will be initialised as
* being empty.
*/
string_list_ty();
/**
* The copy constructor.
*/
string_list_ty(const string_list_ty &);
/**
* The assignment operator.
*/
string_list_ty &operator=(const string_list_ty &);
/**
* The member method is used to test whether a given string value
* is a member of the string list.
*
* \param arg
* The string value to search for.
* \returns
* bool: true if the string is present, false if it is not.
*/
bool member(string_ty *arg) const;
/**
* The member_nocase method is used to test whether a given string
* value is a member of the string list. The conparison is
* performed in a case-INsensitive way.
*
* \param arg
* The string value to search for.
* \returns
* bool: true if the string is present, false if it is not.
*/
bool member_nocase(string_ty *arg) const;
/**
* The size method is used to obtain the number of string in the
* list.
*/
size_t size() const { return nstrings; }
/**
* The empty method i used to determine if the list is empty
* (contains no strings) or not.
*
* \returns
* bool: true if the list contains no strings, false if the
* list contains one or more strings.
*/
bool empty() const { return (nstrings == 0); }
/**
* The [] operator may be used to extract a list member. It may
* only be used as an r-value.
*/
string_ty *operator[](size_t n) const { return string[n]; }
/**
* The unsplit method is used to form a string from a word list.
*
* \param start
* The first string in the list to start from.
* \param finish
* One past the last string in the list be be used.
* \param sep
* The seapator string between words. If yoy give NULL, it
* will use a single space.
* \returns
* A pointer to the newly formed string in dynamic memory.
*
* \note
* It is the responsibility of the caller to ensure that the
* new string is freed when finished with, by a call to str_free().
*/
string_ty *unsplit(size_t start, size_t finish, const char *sep) const;
/**
* The unsplit method is used to form a string from a word list.
*
* \param sep
* The seapator string between words. If yoy give NULL, it
* will use a single space.
* \returns
* A pointer to the newly formed string in dynamic memory.
*
* \note
* It is the responsibility of the caller to ensure that the
* new string is freed when finished with, by a call to str_free().
*/
string_ty *unsplit(const char *sep = 0) const;
/**
* The push_front method is used to prepend a string to the list.
*
* \param arg
* The string to be appended.
* \note
* This is not terribly efficient, try not to use it too often,
* because it has to shuffle all of the string contents up by
* one.
*/
void push_front(string_ty *arg);
/**
* The push_front method is used to prepend a string to the list.
*
* \param arg
* The list of string to be appended.
* \note
* This is not terribly efficient, try not to use it too often,
* because it has to shuffle all of the string contents up first.
*/
void push_front(const string_list_ty &arg);
/**
* The push_back method is used to append a string to the list.
* This has O(1) insert times.
*
* \param arg
* The string to be appended.
*/
void push_back(string_ty *arg);
/**
* The push_back method is used to append a string to the list,
* but only if it isn't already in the list.
* This has O(n) insert times.
*
* \param arg
* The string to be appended.
*/
void push_back_unique(string_ty *arg);
/**
* The push_back method is used to append all the strings string in
* one list to the end of this list. This has O(1) insert times.
*
* \param arg
* The strings to be appended.
*/
void push_back(const string_list_ty &arg);
/**
* The push_back method is used to append all the strings string in
* one list to the end of this list. This has O(n*m) insert times.
*
* \param arg
* The strings to be appended.
*/
void push_back_unique(const string_list_ty &arg);
/**
* The split method is used to convert a string to a word list.
* The string list is cleared()ed before the string is split into it.
*
* \param arg
* The string to be split into pieces.
* \param sep
* Separator characters; sequences of noe or more of these
* characters seaprate each part. Defaults to " " if NULL is
* given.
* \param white
* if true, supress extra white space around separators
* \note
* Quoting is not understood.
*/
void split(string_ty *arg, const char *sep = 0, bool white = false);
/**
* The remove method is used to remove a string. It is not an
* error if the string is not present.
* This has O(n) behaviour.
*
* \param arg
* The string value to be removed.
*/
void remove(string_ty *arg);
/**
* The remove method is used to remove a set of string. It is not
* an error if one or more of the strings are not present.
* This has O(n*m) behaviour.
*
* \param arg
* The string values to be removed.
*/
void remove(const string_list_ty &arg);
/**
* The clear method is used to remove all list elements. This has
* O(n) behaviour. Afterwards, the list is once again empty.
*/
void clear();
/**
* The front method is used to obtain the first string value in the
* list.
*/
string_ty *front() { return (nstrings ? string[0] : 0); }
/**
* The back method is used to obtain the last string value in the
* list.
*/
string_ty *back() { return (nstrings ? string[nstrings - 1] : 0); }
/**
* The pop_front method is used to discard the first value in the list.
* This has O(n) behaviour.
*/
void pop_front();
/**
* The pop_back method is used to discard the last value in the list.
* This has O(1) behaviour.
*/
void pop_back();
/**
* The equal method is used to determine if this string list is
* equal to another string list. Two lists are considered equal if
* they both contains the same strings, regardless of order.
*
* \returns
* bool: true if equal, false if not
*/
bool equal(const string_list_ty &arg) const;
/**
* The subset method is used to determine if this string list is
* a subset of another string list, regardless of order.
*
* \param arg
* strings list to test against,
* i.e. that is (*this is-a-subset-of arg).
* \returns
* bool: true if subset, false if not
*
* \note
* By subset, this also includes improper subsets (equality).
*/
bool subset(const string_list_ty &arg) const;
/**
* The sort method is used to perform an in situ sort the
* string list values in a string list. The comparison function
* used is strcmp.
*/
void sort();
/**
* The sort method is used to perform an in situ sort the
* string list values in a string list. The comparison function
* used is strcasecmp.
*/
void sort_nocase();
/**
* The sort method is used to perform an in situ sort the
* string list values in a string list. The comparison function
* used is strverscmp.
*/
void sort_version();
/**
* The quote_shell method is used to produce a new string list by
* quoting the strings of this string list.
*/
string_list_ty quote_shell() const;
/**
* The validate method is used to validate a string list.
* Usually used for debugging, usually with assert.
*
* \returns
* bool: true if the string list is valis, false if not.
*/
bool validate() const;
/**
* The intersection method is used to calculate the set
* intersection between this set of strings and the rhs set of
* strings.
*/
string_list_ty intersection(const string_list_ty &rhs) const;
// private:
size_t nstrings;
size_t nstrings_max;
string_ty **string;
};
/**
* The string_list_member function is used to test for the existence
* of a string in a string list. (This is an O(n) search.)
*/
inline DEPRECATED int
string_list_member(const string_list_ty *slp, string_ty *s)
{
return slp->member(s);
}
/**
* The wl2str function is used to convert a list of strings into a
* single string, separated by the given separator.
*
* @param slp
* The string list to be joined.
* @param start
* The index of the first string in the list to be joined (counting
* from zero).
* @param finish
* The index of the last string in the list to be joined (counting
* from one, or one past the end, counting from zero).
* @param sep
* The separator characters. Defaults to spaces if NULL.
*/
inline DEPRECATED string_ty *
wl2str(const string_list_ty *slp, int start, int finish, const char *sep)
{
return slp->unsplit(start, finish, sep);
}
/**
* The str2wl function is used to break a string up into several strings
* at a given separatopr character.
*
* @param slp
* The place to put the resulting list of strings. They are in
* the same order as they appeared in the input string (arg).
* @param arg
* The input string to be split into component strings.
* @param sep
* This is the set of separator characters. Supostrings will be
* extracted if *any* of the characters in this strings are seen
* (like $IFS in the shell). If NULL, white space will be used.
* @param white
* If true (non-zero) leading ans trailing white space will be
* removed from the result strings. If false (zero) white space
* will be retained.
*/
inline DEPRECATED void
str2wl(string_list_ty *slp, string_ty *arg, const char *sep, int white)
{
slp->split(arg, sep, white);
}
/**
* The string_list_prepend function is used to add another string to
* the start of a string list.
*
* @param lhs
* The string list to be added to.
* @param rhs
* The string to be added to the front of lhs.
*/
inline DEPRECATED void
string_list_prepend(string_list_ty *lhs, string_ty *rhs)
{
lhs->push_front(rhs);
}
/**
* The string_list_prepend_list function is used to add all the strings
* of another string list to the start of a string list.
*
* @param lhs
* The string list to be added to.
* @param rhs
* The string list to be added to the front of lhs.
*/
inline DEPRECATED void
string_list_prepend_list(string_list_ty *lhs, const string_list_ty *rhs)
{
lhs->push_front(*rhs);
}
/**
* The string_list_append function is used to add another string to
* the end of a string list.
*
* @param lhs
* The string list to be added to.
* @param rhs
* The string to be added to the end of lhs.
*/
inline DEPRECATED void
string_list_append(string_list_ty *lhs, string_ty *rhs)
{
lhs->push_back(rhs);
}
/**
* The string_list_append_list function is used to add all the strings
* of another string list to the end of a string list.
*
* @param lhs
* The string list to be added to.
* @param rhs
* The string list to be added to the end of lhs.
*/
inline DEPRECATED void
string_list_append_list(string_list_ty *lhs, const string_list_ty *rhs)
{
lhs->push_back(*rhs);
}
/**
* The string_list_append_unique function is used to add another string
* to the end of a string list, provided it is not already present.
* This is an O(n) operation.
*
* @param lhs
* The string list to be added to.
* @param rhs
* The string to be added to the end of lhs.
*/
inline DEPRECATED void
string_list_append_unique(string_list_ty *lhs, string_ty *rhs)
{
lhs->push_back_unique(rhs);
}
/**
* The string_list_append_list_unique function is used to add all the
* strings of another string list to the end of a string list, provided
* they are not already present. This is an O(n**2) operation.
*
* @param lhs
* The string list to be added to.
* @param rhs
* The string list to be added to the end of lhs.
*/
inline DEPRECATED void
string_list_append_list_unique(string_list_ty *lhs, const string_list_ty *rhs)
{
lhs->push_back_unique(*rhs);
}
/**
* The string_list_copy function is sued to replace the contents of one
* string list with another. This is more like a copy constructor than
* an assignment operator. The previous contents will be discarded
* NOT free()ed.
*/
inline DEPRECATED void
string_list_copy(string_list_ty *lhs, const string_list_ty *rhs)
{
*lhs = *rhs;
}
/**
* The string_list_remove function is used to remove a speific valued
* string from a string list. If there are no occurrences, it is not
* an error. If there is more than one occurrece, only the first will
* be removed. This is an O(n) operation.
*/
inline DEPRECATED void
string_list_remove(string_list_ty *slp, string_ty *s)
{
slp->remove(s);
}
/**
* The string_list_remove_list function is used to remove all instances
* of one string list (rhs) from another string list (lhs).
*
* @param lhs
* The string list to have element removed.
* @param rhs
* The list of values to be removed from lhs.
*/
inline DEPRECATED void
string_list_remove_list(string_list_ty *lhs, const string_list_ty *rhs)
{
lhs->remove(*rhs);
}
/**
* The string_list_destructor function is used to release all resources
* held by a string list. This function shall be called when you are
* finished with a string list.
*/
inline DEPRECATED void
string_list_destructor(string_list_ty *slp)
{
// from context, this is the right thing to do,
// now that the real destructor does something useful.
slp->clear();
}
/**
* The string_list_constructor function is used to prepare a string
* list for use. (Note: strings lists which are global variables do
* NOT need this function called before use).
*/
inline DEPRECATED void
string_list_constructor(string_list_ty *slp)
{
// from context, this is the right thing to do,
// now that the real constructor does something useful.
slp->clear();
}
/**
* The quality (==) operator is used to determine if two string lists
* contain the same strings. The _ordering_ of the strings is not
* considered. This is an O(n**2) operation.
*
* @return
* Returns true if the two sets of strings are the same,
* false if they are not.
*/
inline bool
operator==(const string_list_ty &lhs, const string_list_ty &rhs)
{
return lhs.equal(rhs);
}
/**
* The inquality (!=) operator is used to determine if two string lists
* do not contain the same strings. The _ordering_ of the strings is
* not considered. This is an O(n**2) operation.
*
* @return
* Returns true if the two sets of strings are different, false if
* they are the same.
*/
inline bool
operator!=(const string_list_ty &lhs, const string_list_ty &rhs)
{
return !lhs.equal(rhs);
}
/**
* The string_list_subset function is used to determine if lhs is an
* (improper) subset of rhs.
*
* @return
* Returns true (non-zero) if the two sets of strings are the same,
* false (zero) if they are not.
*/
inline DEPRECATED int
string_list_subset(const string_list_ty *lhs, const string_list_ty *rhs)
{
return lhs->subset(*rhs);
}
/**
* The string_list_sort function is used to sort a list of strings.
* The comparison function is strcmp(3). This is an O(n log n)
* operation.
*/
inline DEPRECATED void
string_list_sort(string_list_ty *slp)
{
slp->sort();
}
/**
* The string_list_quote_shell function is used to shell quote each
* string in a list of strings. The quoting is done by using the
* str_quote_shell() function.
*
* @param lhs
* The place to put this list of quoted strings.
* @param rhs
* The unquoted input strings.
*/
inline DEPRECATED void
string_list_quote_shell(string_list_ty *lhs, const string_list_ty *rhs)
{
*lhs = rhs->quote_shell();
}
/**
* The in situ addition operator is used to union values into a set of
* strings. Duplicates on the right will be omitted.
*/
inline void
operator+=(string_list_ty &lhs, const string_list_ty &rhs)
{
lhs.push_back_unique(rhs);
}
/**
* The addition operator is used to union two sets of strings.
* Duplicates will be omitted.
*/
inline string_list_ty
operator+(const string_list_ty &lhs, const string_list_ty &rhs)
{
string_list_ty result;
result.push_back_unique(lhs);
result.push_back_unique(rhs);
return result;
}
/**
* The in situ subtract operator is used to difference two sets of
* strings by removing strings from the left which appear in the right.
*/
inline void
operator-=(string_list_ty &lhs, const string_list_ty &rhs)
{
lhs.remove(rhs);
}
/**
* The subtract operator is used to create a new set of strings
* by removing strings from the left which appear in the right.
*/
inline string_list_ty
operator-(const string_list_ty &lhs, const string_list_ty &rhs)
{
string_list_ty result;
result.push_back_unique(lhs);
result.remove(rhs);
return result;
}
/**
* The in situ multiply operator is used to keep only those strings on
* the left which also appear on the right. Duplicates are omitted.
*/
inline void
operator*=(string_list_ty &lhs, const string_list_ty &rhs)
{
lhs = lhs.intersection(rhs);
}
/**
* The multiply operator is used to calculate the set intersection of
* the left and right. Duplicates are omitted.
*/
inline string_list_ty
operator*(const string_list_ty &lhs, const string_list_ty &rhs)
{
return lhs.intersection(rhs);
}
/** @} */
#endif // COMMON_STR_LIST_H