/*!
* @concept SequenceConcept
*
* @headerfile <seqan/basic.h>
*
* @extends RandomAccessContainerConcept
*
* @brief Sequences are dense linear containers that have positions.
*
* @signature SequenceConcept<T>
*
* @mfn SequenceConcept#Infix
*
* @brief Returns the infix type for a sequence.
*
* @signature Infix<TSequence>::Type
*
* @tparam TSequence The type for getting the infix type of.
*
* @return Type The infix type for <tt>TSequence</tt>.
*
* @mfn SequenceConcept#Suffix
*
* @brief Returns the suffix type for a sequence.
*
* @signature Suffix<TSequence>::Type
*
* @tparam TSequence The type for getting the suffix type of.
*
* @return Type The suffix type for <tt>TSequence</tt>.
*
* @mfn SequenceConcept#Prefix
*
* @brief Returns the prefix type for a sequence.
*
* @signature Prefix<TSequence>::Type
*
* @tparam TSequence The type for getting the prefix type of.
*
* @return Type The prefix type for <tt>TSequence</tt>.
*
* @fn SequenceConcept#iter
*
* @headerfile <seqan/sequence.h>
*
* @brief Iterator to the item at the given position in a container.
*
* @signature TIterator iter(seq, pos[, tag]);
*
* @param[in] seq The sequence to get the iterator for.
* @param[in] pos The position to get the iterator for.
* @param[in] tag The tag to pick the type of the iterator.
*
* @return TIterator The resulting iterator. If <tt>TTag</tt> is the type of
* <tt>tag</tt> and <tt>TSequence</tt> the type of
* <tt>seq</tt> then TIterator is of the type
* <tt>Iterator<TSequence, TTag>::Type</tt>.
*
* @section Remarks
*
* If <tt>pos</tt> is out of range then the iterator is invalid.
*
* @fn SequenceConcept#append
*
* @brief Append a sequence to another one.
*
* @signature void append(seq, other);
*
* @param[in,out] seq The sequence to append the other sequence to.
* @param[in] other The other sequence to append to <tt>seq</tt>. Of same type
* as <tt>seq</tt>.
*
* @fn SequenceConcept#appendValue
*
* @brief Append a value to a sequence.
*
* @signature void appendValue(seq, val);
*
* @param[in,out] seq The sequence to append a value to (type
* <tt>TSequence</tt>).
* @param[in] val A value to append to the sequence. Convertible to
* <tt>Value<TSequence>::Type</tt>.
*
* @fn SequenceConcept#front
*
* @brief Return reference to the first element.
*
* @signature TReference front(seq);
*
* @param[in] seq The sequence to get the first element of.
*
* @return TReference A reference to the first element of <tt>seq</tt>.
*
* @fn SequenceConcept#back
*
* @brief Return reference to the last element.
*
* @signature TReference back(seq);
*
* @param[in] seq The sequence to get the last element of.
*
* @return TReference A reference to the last element of <tt>seq</tt>.
*
* @fn SequenceConcept#resize
*
* @brief Resize a sequence.
*
* @signature void resize(seq, len[, val]);
*
* @param[in,out] seq Sequence to resize.
* @param[in] len Length to resize <tt>seq</tt> to.
* @param[in] val When increasing the size, <tt>val</tt> is used to fill new
* entries. When omitted, <tt>TValue()</tt> is used where
* <tt>TValue</tt> is the @link ContainerConcept#Value @endlink
* type of the sequence.
*
* @fn SequenceConcept#clear
*
* @brief Remove all elements from the sequences.
*
* @signature void clear(seq);
*
* @param[in,out] seq Sequence to clear.
*
* @fn SequenceConcept#erase
*
* @brief Erase an element or a range of elements from a sequence.
*
* @signature void erase(seq, pos[, posEnd)
*
* @param[in,out] seq Sequence to remove range from.
* @param[in] pos Begin position of the range to remove.
* @param[in] posEnd Optional end position of the range to remove. If omitted,
* <tt>pos + 1</tt> is used.
*
* @fn SequenceConcept#eraseFront
*
* @brief Erase first element in a sequence.
*
* @signature void eraseFront(seq);
*
* @param[in,out] seq The sequence to remove the first element from.
*
* @fn SequenceConcept#eraseBack
*
* @brief Erase last element in a sequence.
*
* @signature void eraseBack(seq);
*
* @param[in,out] seq The sequence to remove the last element from.
*
* @fn SequenceConcept#capacity
*
* @headerfile <seqan/sequence.h>
*
* @brief Returns the capacity of a sequence.
*
* @signature TSize capacity(seq);
*
* @param[in] seq The sequence to query for its capacity.
*
* @return TSize Returns the capacity of the sequence. <tt>TSize</tt> is the
* result of <tt>Size<TSequence>::type</tt> where
* <tt>TSequence</tt> is the type of <tt>seq</tt>.
*
* The size of a sequence can never exceed its capacity but some container
* support resizing of the capacity. Some functions do that implicitely if they
* are called with a suitable @link OverflowStrategyTags tag @endlink. The
* function reserve can be used to change the capacity explicitely.
*
* @fn SequenceConcept#computeGenerousCapacity
*
* @headerfile <seqan/sequence.h>
*
* @brief Capacity for generous expansion.
*
* @signature TSize computeGenerousCapacity(seq, capacity);
*
* @param[in,out] seq The sequence to compute the generous capacity for.
* @param[in] capacity The minimal required capacity.
*
* @return TSize A value larger than <tt>capacity</tt> that should be used as
* the new capacity for <tt>container</tt> when it is expanded
* using the <tt>Generous</tt> overflow strategy.
*
* @fn SequenceConcept#insert
*
* @headerfile <seqan/sequence.h>
*
* @brief Inserts a sequence into another sequence.
*
* @signature void insert(seq, pos, src[, tag]);
*
* @param[in,out] seq The sequence to insert element sinto.
* @param[in] pos The position to start inserting at.
* @param[in] src The sequence to insert at pos.
* @param[in] tag The resize tag, defaults to what
* <tt>OverflowStrategyImplicit</tt> returns.
*
* @fn SequenceConcept#insertValue
*
* @headerfile <seqan/sequence.h>
*
* @brief Inserts an element into a sequence.
*
* @signature void insertValue(seq, pos, val[, tag]);
*
* @param[in,out] seq The @link SequenceConcept sequence @endlink to insert
* element into.
* @param[in] pos The position to insert at.
* @param[in] val The value to insert at <tt>pos</tt> into <tt>seq<tt/>.
* @param[in] tag The resize tag, defaults to what
* <tt>OverflowStrategyImplicit</tt> returns.
*
* @fn SequenceConcept#replace
*
* @headerfile <seqan/sequence.h>
*
* @brief Replaces a part of a sequence with another sequence.
*
* @signature void replace(target, posBegin, posEnd, source[, limit][,
* resizeTag]);
*
* @param[in,out] target The sequence to modify.
* @param[in] posBegin The begin position of the range to replace.
* @param[in] posEnd The end position of the range to replace.
* @param[in] source The source sequence to replace <tt>[posBegin, posEnd)</tt>
* with.
* @param[in] limit Largest size of <tt>target</tt> after the operation.
* @param[in] resizeTag Specify the resizing behaviour. Defaults to what
* <tt>DefaultOverflowImplicit</tt> returns.
*/