1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157 158 159 160 161 162 163 164 165 166 167 168 169 170 171 172 173 174 175 176 177 178 179 180 181 182 183 184 185 186 187 188 189 190 191 192 193 194 195 196 197 198 199 200 201 202 203 204 205 206 207 208 209 210 211 212 213 214 215 216 217 218 219 220 221 222 223 224 225 226 227 228 229 230 231 232 233 234 235 236 237 238 239 240 241 242 243 244 245 246 247 248 249 250 251 252 253 254 255 256 257 258 259 260 261 262 263 264 265 266 267 268 269 270 271 272 273 274 275 276 277 278 279 280 281 282 283 284 285 286 287 288 289 290 291 292 293 294 295
|
// ==========================================================================
// SeqAn - The Library for Sequence Analysis
// ==========================================================================
// Copyright (c) 2006-2026, Knut Reinert, FU Berlin
// All rights reserved.
//
// Redistribution and use in source and binary forms, with or without
// modification, are permitted provided that the following conditions are met:
//
// * Redistributions of source code must retain the above copyright
// notice, this list of conditions and the following disclaimer.
// * Redistributions in binary form must reproduce the above copyright
// notice, this list of conditions and the following disclaimer in the
// documentation and/or other materials provided with the distribution.
// * Neither the name of Knut Reinert or the FU Berlin nor the names of
// its contributors may be used to endorse or promote products derived
// from this software without specific prior written permission.
//
// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
// AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
// IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
// ARE DISCLAIMED. IN NO EVENT SHALL KNUT REINERT OR THE FU BERLIN BE LIABLE
// FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
// DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR
// SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER
// CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
// LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
// OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH
// DAMAGE.
//
// ==========================================================================
// Author: Rene Rahn <rene.rahn@fu-berlin.de>
// ==========================================================================
#ifndef INCLUDE_SEQAN_SEQUENCE_CONTAINER_VIEW_ZIP_H_
#define INCLUDE_SEQAN_SEQUENCE_CONTAINER_VIEW_ZIP_H_
namespace seqan2
{
// ============================================================================
// Forwards
// ============================================================================
// ============================================================================
// Tags, Classes, Enums
// ============================================================================
// Tag to subclass basic container view.
template <typename TSpec = void>
struct ZipContainer;
/*!
* @class ZipContainerView
* @extends ContainerView
* @headerfile <seqan/sequence.h>
*
* @brief Ties one or more containers into a non-resizable container view together.
*
* @signature template <typename... TContTypes, typename TSpec>
class ContainerView<std::tuple<TContTypes...>, ZipContainer<TSpec> >
*
* @tparam TContTypes One or more types of all containers tied into the zip container view.
* @tparam TSpec The specialization type.
*
* @section Example
*
* The following example demonstrates the functionality of the @link ZipContainerView @endlink:
*
* @include demos/dox/sequence/container_view_zip.cpp
*
* This outputs the following to the console:
* @include demos/dox/sequence/container_view_zip.cpp.stdout
*/
// Use tuple to store variadic container types.
template <typename... TContTypes, typename TSpec>
class ContainerView<std::tuple<TContTypes...>, ZipContainer<TSpec> >
{
public:
typedef typename Iterator<ContainerView, Standard>::Type TIterator;
TIterator _begin;
TIterator _end;
ContainerView() : _begin(), _end()
{
static_assert(sizeof...(TContTypes) > 0, "Requries at least one argument!");
}
template <typename... TOtherContPack>
ContainerView(TOtherContPack && ...contArgs)
{
static_assert(sizeof...(TOtherContPack) > 0, "Requires at least one argument!");
static_assert(sizeof...(TOtherContPack) == sizeof...(TContTypes), "Number of parameters don't match!");
// TODO(rrahn): Check if all containers contain same number of elements.
_begin = makeZipIterator(begin(contArgs, Standard())...);
_end = makeZipIterator( end(contArgs, Standard())...);
}
// Custom c'tor setting the iterators.
ContainerView(TIterator const & begin, TIterator const & end) :
_begin(begin),
_end(end)
{}
// ------------------------------------------------------------------------
// Operator =
// ------------------------------------------------------------------------
template <typename TOtherContainer>
inline ContainerView &
operator= (TOtherContainer & other)
{
assign(*this, other);
return *this;
}
// ------------------------------------------------------------------------
// Operator []
// ------------------------------------------------------------------------
template <typename TPos>
inline typename Reference<ContainerView>::Type
operator[] (TPos pos)
{
return value(*this, pos);
}
template <typename TPos>
inline typename GetValue<ContainerView>::Type
operator[] (TPos pos) const
{
return getValue(*this, pos);
}
};
// TODO(rrahn): Implement resizable ContainerViewZipper!
// ============================================================================
// Metafunctions
// ============================================================================
// TODO(rrahn): View
// TODO(rrahn): RemoveView
// TODO(rrahn): IsView
// ----------------------------------------------------------------------------
// Metafunction Value
// ----------------------------------------------------------------------------
// Delegate to the Value MF of the ZipIterator.
template <typename... TContTypes, typename TSpec>
struct Value<ContainerView<std::tuple<TContTypes...>, ZipContainer<TSpec> > >
{
typedef typename Iterator<ContainerView<std::tuple<TContTypes...>, ZipContainer<TSpec> >, Standard>::Type TIter_;
typedef typename Value<TIter_>::Type Type;
};
template <typename... TContTypes, typename TSpec>
struct Value<ContainerView<std::tuple<TContTypes...>, ZipContainer<TSpec> > const>
{
typedef typename Iterator<ContainerView<std::tuple<TContTypes...>, ZipContainer<TSpec> > const, Standard>::Type TIter_;
typedef typename Value<TIter_>::Type Type;
};
// ----------------------------------------------------------------------------
// Metafunction GetValue
// ----------------------------------------------------------------------------
template <typename... TContTypes, typename TSpec>
struct GetValue<ContainerView<std::tuple<TContTypes...>, ZipContainer<TSpec> > >
{
typedef typename Iterator<ContainerView<std::tuple<TContTypes...>, ZipContainer<TSpec> >, Standard>::Type TIter_;
typedef typename GetValue<TIter_>::Type Type;
};
template <typename... TContTypes, typename TSpec>
struct GetValue<ContainerView<std::tuple<TContTypes...>, ZipContainer<TSpec> > const>
{
typedef typename Iterator<ContainerView<std::tuple<TContTypes...>, ZipContainer<TSpec> > const, Standard>::Type TIter_;
typedef typename GetValue<TIter_>::Type Type;
};
// ----------------------------------------------------------------------------
// Metafunction Reference
// ----------------------------------------------------------------------------
template <typename... TContTypes, typename TSpec>
struct Reference<ContainerView<std::tuple<TContTypes...>, ZipContainer<TSpec> > >
{
typedef typename Iterator<ContainerView<std::tuple<TContTypes...>, ZipContainer<TSpec> >, Standard>::Type TIter_;
typedef typename Reference<TIter_>::Type Type;
};
template <typename... TContTypes, typename TSpec>
struct Reference<ContainerView<std::tuple<TContTypes...>, ZipContainer<TSpec> > const>
{
typedef typename Iterator<ContainerView<std::tuple<TContTypes...>, ZipContainer<TSpec> > const, Standard>::Type TIter_;
typedef typename Reference<TIter_>::Type Type;
};
// ----------------------------------------------------------------------------
// Metafunction Difference
// ----------------------------------------------------------------------------
template <typename... TContTypes, typename TSpec>
struct Difference<ContainerView<std::tuple<TContTypes...>, ZipContainer<TSpec> > >
{
typedef typename Iterator<ContainerView<std::tuple<TContTypes...>, ZipContainer<TSpec> >, Standard>::Type TIter_;
typedef typename Difference<TIter_>::Type Type;
};
// ----------------------------------------------------------------------------
// Metafunction Size
// ----------------------------------------------------------------------------
template <typename... TContTypes, typename TSpec>
struct Size<ContainerView<std::tuple<TContTypes...>, ZipContainer<TSpec> > >
{
typedef typename Iterator<ContainerView<std::tuple<TContTypes...>, ZipContainer<TSpec> >, Standard>::Type TIter_;
typedef typename Size<TIter_>::Type Type;
};
// ----------------------------------------------------------------------------
// Metafunction Position
// ----------------------------------------------------------------------------
template <typename... TContTypes, typename TSpec>
struct Position<ContainerView<std::tuple<TContTypes...>, ZipContainer<TSpec> > >
{
typedef typename Iterator<ContainerView<std::tuple<TContTypes...>, ZipContainer<TSpec> >, Standard>::Type TIter_;
typedef typename Position<TIter_>::Type Type;
};
// TODO(rrahn): IsSequence
// TODO(rrahn): Infix
// TODO(rrahn): Prefix
// TODO(rrahn): Suffix
// TODO(rrahn): View (Segment)
// Create Zipped Iterator.
template <typename... TContTypes, typename TSpec>
struct Iterator<ContainerView<std::tuple<TContTypes...>, ZipContainer<TSpec> >, Standard>
{
typedef Iter<std::tuple<typename Iterator<TContTypes, Standard>::Type...>, ZipIterator> Type;
};
template <typename... TContTypes, typename TSpec>
struct Iterator<ContainerView<std::tuple<TContTypes...>, ZipContainer<TSpec> > const, Standard>
{
typedef Iter<std::tuple<typename Iterator<TContTypes const, Standard>::Type...>, ZipIterator> Type;
};
// ============================================================================
// Functions
// ============================================================================
// Uses default functions from base ContainerView.
// ----------------------------------------------------------------------------
// Function makeZipView()
// ----------------------------------------------------------------------------
/*!
* @fn makeZipView
* @headerfile <seqan/sequence.h>
* @brief Creates a @link ZipContainerView @endlink, deducing the container types from the arguments.
*
* @signature cont makeZipView(TContainerTypes... args)
*
* @param [in] args One or more container instance to construct the @link ZipContainerView @endlink from.
*
* @return cont A @link ZipContainerView @endlink containing the views over the given containers..
*/
// Helper function to create zipped view from container pack.
template <typename... TContTypes>
inline ContainerView<std::tuple<typename std::remove_reference<TContTypes>::type...>, ZipContainer<> >
makeZipView(TContTypes && ...contArgs)
{
#ifdef SEQAN_CLANG35_FREEBSD_BUG
// the condition always evaluates to false, but ensures that the assertion
// only fires if the function is actually instantiated
static_assert(sizeof...(contArgs) == 0, "The Zip Container triggers a bug on FreeBSD+clang-3.5, please upgrade you compiler!");
#endif
return ContainerView<std::tuple<typename std::remove_reference<TContTypes>::type...>, ZipContainer<> >(std::forward<TContTypes>(contArgs)...);
}
}
#endif // #ifndef INCLUDE_SEQAN_SEQUENCE_CONTAINER_VIEW_ZIP_H_
|