/*!
* @class StringSet
*
* @implements SequenceConcept
* @implements TextConcept
* @implements SegmentableConcept
*
* @headerfile <seqan/sequence.h>
*
* @brief A container class for a set of strings.
*
* @signature template <typename TString, typename TSpec> class StringSet;
*
* @tparam TString The type of the string to store in the string set.
* @tparam TSpec A tag for selecting the specialization of the string set.
* Default: <tt>Owner<Generous></tt>.
*
* String sets are containers for strings. They have two advantages over a
* string of strings:
*
* First, they allow to express the common intent in Bioinformatics to have a
* list of strings, e.g. for the chromosomes of a genome. This facilitates
* writing generic data structures and algorithms to operate on single strings
* and genomes which is captured by the @link TextConcept @endlink.
*
* Second, the @link DependentStringSet @endlink specialization allows to create
* subsets of string sets without storing copies of strings and identifying
* strings by a common id.
*
* @section Examples
*
* @include demos/sequence/stringset.cpp
*
* The output is as follows:
*
* @include demos/sequence/stringset.cpp.stdout
*
*
*
* @mfn StringSet#Concatenator
*
* @brief Return the type of the concatenated sequence of all sequences in a
* StringSet.
*
* @signature Concatenator<TStringSet>::Type
*
* @tparam TStringSet The type of the string set.
*
* @return Type The resulting concatenator type.
*
* @mfn StringSet#StringSetPosition
*
* @brief Returns position type in string set.
*
* @signature StringSetPosition<TStringSet>::Type
*
* @tparam TStringSet The @link StringSet @endlink to query for its position
* type.
*
* @return Type The position type of TStringSet.
*
* @mfn StringSet#LengthSum
*
* @brief Length sum type type in string set.
*
* @signature LengthSum<TStringSet>::Type
*
* @tparam TStringSet The @link StringSet @endlink to query for its length sum
* type.
*
* @return Type The resulting length sum type.
*
* @mfn StringSet#GetSequenceByNo
*
* @brief Type for getting sequence by number.
*
* @signature GetSequenceByNo<TStringSet>::Type
*
* @tparam TStringSet The StringSet to query for its sequence-by-number type.
*
* @return Type The given sequence-by-number type.
*
* @mfn StringSet#Id
*
* @brief Return the id type for the string set.
*
* @signature Id<TStringSet>::Type
*
* @tparam TStringSet The string set type to query for its id type.
*
* @return Type The resulting ID type.
*
* @fn StringSet#lengthSum
*
* @brief Returns total length of all strings in the string set.
*
* @signature TSize lengthSum(s);
*
* @param[in] s The string set to get length sum of.
*
* @return TSize The sum of the lengths of all strings in the string set.
*
* @fn StringSet#clear
*
* @headerfile <seqan/sequence.h>
*
* @brief Clear the StringSet.
*
* @signature void clear(stringSet);
*
* @param[in,out] seedSet The StringSet to clear.
*
* @fn StringSet#reserve
*
* @brief Reserve memory for string set.
*
* @signature TSize reserve(s, newCapacity, tag);
*
* @param[in,out] s The string set to reserve memory for.
* @param[in] newCapacity The target capacity.
* @param[in] tag A tag to select the reservation strategy.
*
* @fn StringSet#getValueById
*
* @brief Get the value from a string set by its id.
*
* @signature TString getValueById(s, id);
*
* @param[in] s The string set to get string from.
* @param[in] id The id of the string to get.
*
* @return TString Reference to the string with the given id.
*
* @fn StringSet#valueById
*
* @brief Get the value from a string set by its id.
*
* @signature TString valueById(s, id);
*
* @param[in] s The string set to get string from.
* @param[in] id The id of the string to get.
*
* @return TString Reference to the string with the given id.
*
* @fn StringSet#assignValueById
*
* @brief Set the member of a string set by its id.
*
* @signature TId getValueById(set, s[, id]);
*
* @param[in] set The string to assign value in.
* @param[in] s The string set to assign.
* @param[in] id The id of the string to set. If omitted, <tt>s</tt> will be
* appended to <tt>set</tt>.
*
* @return TId The id of the new string in the string set.
*
* @fn StringSet#removeValueById
*
* @brief Remove a value from a string set by its id.
*
* @signature void removeValueById(set, id);
*
* @param[in,out] set The string to remove value in.
* @param[in] id The id of the string to remove.
*
* @fn StringSet#positionToId
*
* @brief Convert a position/index in the string set to a string id.
*
* @signature Id positionToId(set, pos);
*
* @param[in] set The string to convert positions for.
* @param[in] pos The position to convert.
*
* @return TId The resulting id.
*
* @fn StringSet#concat
*
* @brief Returns the concatenation sequence of all sequences in a string set.
*
* @signature TConcat concat(set);
*
* @param[in] set The string set to get the concatenation sequence for.
*
* @return TConcat The concatenation sequence.
*
* @fn StringSet#strSplit
*
* @brief Append a list of the words in the string, using sep as the delimiter
* string @link StringSet @endlink.
*
* @signature void strSplit(result, sequence[, sep[, allowEmptyStrings[,
* maxSplit]]]);
*
* @param[out] result The resulting string set.
* @param[in] sequence The sequence to split.
* @param[in] sep The splitter to use (default <tt>' '</tt>).
* @param[in] allowEmptyString Whether or not to allow empty strings
* (<tt>bool</tt>, defaults to <tt>true</tt> iff
* <tt>sep</tt> is given).
* @param[in] maxSplit The maximal number of split operations to do if given.
*
* @fn StringSet#idToPosition
*
* @brief Convert a string id to a position/index in the string set.
*
* @signature TPos idToPosition(set, id);
*
* @param[in] set The string to convert positions for.
* @param[in] id The id to convert.
*
* @return TPos The resulting position.
*/