diff --git a/include/seqan3/range/view/detail.hpp b/include/seqan3/range/view/detail.hpp new file mode 100644 index 0000000000..82ff62e094 --- /dev/null +++ b/include/seqan3/range/view/detail.hpp @@ -0,0 +1,331 @@ +// ============================================================================ +// SeqAn - The Library for Sequence Analysis +// ============================================================================ +// +// Copyright (c) 2006-2018, Knut Reinert & Freie Universitaet Berlin +// Copyright (c) 2016-2018, Knut Reinert & MPI Molekulare Genetik +// 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. +// +// ============================================================================ + +/*!\file + * \ingroup view + * \brief Auxiliary header for the \link view view submodule \endlink. + * \author Hannes Hauswedell + */ + +#pragma once + +#include + +#include + +namespace seqan3::detail +{ + +// ============================================================================ +// view_base +// ============================================================================ + +/*!\brief An empty base class that our views inherit from so they are treated as views by the STL/range-v3. + * \ingroup view + */ +struct view_base : ranges::view_base +{}; + +// ============================================================================ +// declare_view_functor_type +// ============================================================================ + +/*!\brief A class template template that make a view pipeable in a generic way. + * \ingroup view + * \tparam view_type The view template that your wish to define the functor for. + * + * \details + * + * A full view implementation consists of three entities: + * + * 1. the actual view, e.g. `view_foo` + * 2. a "generating" functor that enables usage in pipes, e.g. `foo_fn` + * 3. an instance of 2., e.g. `view::foo` that is usable by consumers of your view + * + * For more details, see the HowTo on writing views in the SeqAn3 wiki: https://github.com/seqan/seqan3/wiki + * + * This template generates the functor for you: + * + * ```cpp + * template + * requires seqan3::input_range_concept // or more/stricter requirements + * struct view_foo + * { + * // your implementation + * }; + * + * // + * using foo_fn = declare_view_functor_type; + * + * namespace view + * { + * foo_fn foo; + * } + * ``` + */ +template