/*!
* @class CyclicShape
*
* @headerfile <seqan/modifier.h>
*
* @brief A pattern of zeros and ones to mark "don't care"-positions in a text.
*
* @signature template <typename TShapeSpec> class CyclicShape<TShapeSpec>;
*
* @tparam TShapeSpec The specializing type. Default is @link GenericCyclicShape
* GenericShape @endlink, another option is @link
* FixedCyclicShape FixedShape @endlink.
* @tparam TSize Size type of the CyclicShape
*
* CyclicShapes store a pattern like <tt>11010100110</tt> that mark care (match)
* positions and don't-care positions. Unlike @link Shape @endlink, the
* CyclicShape does not perform hashing of q-grams. It is instead useful to
* modify a text in such a way that zero position are ignored. The pattern is
* applied repeatedly on the whole text, as the example shows.
*
* Note that CyclicShapes can start and end with zero characters, which is not
* allowed in @link Shape @endlink.
*
* @section Examples
*
* @include demos/dox/modifier/cyclic_shape.cpp
*
* The output is as follows:
*
* @include demos/dox/modifier/cyclic_shape.cpp.stdout
*
* @see ModCyclicShapeModifiedString
* @see ModCyclicShapeModifiedIterator
*
* @mfn CyclicShape#Size
*
* @headerfile <seqan/modifier.h>
*
* @brief Size type for parameters used in CyclicShape.
*
* @signature Size<CyclicShape<TSpec> >::Type;
*
* @tparam TSpec The CyclicShape specialization.
*
* @return TReturn Currently the return type <tt>unsigned char</tt>.
*
* @section Remarks
*
* @var TSize CyclicShape::span;
*
* @brief span of the CyclicShape.
*
* @var TSize CyclicShape::loffset;
*
* @brief left offset (number of leading zeros) of the CyclicShape.
*
* @fn CyclicShape#weight
*
* @headerfile <seqan/modifier.h>
*
* @brief Return the weight of a CyclicShape
*
* @signature TSize weight(const & cyclicShape);
*
* @tparam TSpec Specialisation of the CyclicShape.
* @tparam TSize Size type of CyclicShape
*
* @param[in] cyclicShape CyclicShape object
*
* @return weight of the CyclicShape (number of care positions)
*
* @fn CyclicShape#cyclicShapeToString
*
* @brief Print a given cyclic shape as a sequence of '1' (care position) and
* '0' (don't-care position).
*
* @signature void cyclicShapeToString(bitmap, cyclicShape);
*
* @param[in] cyclicShape CyclicShape object. Types: @link CyclicShape @endlink
* @param[out] bitmap The resulting sequence object. Type: @link String
* @endlink, e.g. CharString
*
* @see GenericCyclicShape#stringToCyclicShape
*
* @fn CyclicShape#carePositions
*
* @brief Determine the indices of care positions in the range <i>[0,span)</i>
*
* @signature void carePositions(positions, cyclicShape);
*
* @tparam TString String or array. Value type should be an integral size type.
* @tparam TSpec Specialization of CyclicShape.
*
* @param[in] cyclicShape CyclicShape object.
* @param[out] positions The resulting @link String @endlink to store the care-
* positions in. Type TString.
*
* This function can be used to convert <tt>CyclicShape.diffs</tt>, which stores
* the distances between care positions, to a <tt>positions</tt> string directly
* containing the care positions. See the example:
*
* @snippet demos/dox/modifier/cyclic_shape_snippets.cpp CyclicShape Care Positions
*
*
*
* @fn CyclicShape#cyclicShapeToSuffixLengths
*
* @brief Calculates the number of characters of modified Strings shorter than
* the Shape's span.
*
* @signature void cyclicShapeToSuffixLengths(TString suffLengths, cyclicShape);
*
* @tparam TString String type or array with an integral value type, i.e.
* unsigned or int.
*
* @param[in] cyclicShape CyclicShape object.
* @param[in,out] suffLengths String to be filled. Must be resized beforehands.
* Fixed length arrays also work.
*
* Given a CyclicShape, this function calculates a how many characters a String
* of length <i>x</i> contains after the CyclicShape is applied to it. This is
* done for all <tt>0 <= x < span</tt>. <tt>suffLengths</tt> therefore must be
* resized to the shape's span beforehands. The resizing is not done in this
* function so that it can be applied to arrays, too.
*/