SeqAn3  3.0.2
The Modern C++ library for sequence analysis.
Range

The range module provides general purpose containers, decorators and views. More...

+ Collaboration diagram for Range:

Modules

 Container
 The container submodule contains special SeqAn containers and generic container concepts.
 
 Decorator
 The decorator submodule contains special SeqAn decorators and generic decorator concepts.
 
 Views
 Views are "lazy range combinators" that offer modified views onto other ranges.
 

Classes

interface  const_iterable_range
 Specifies requirements of an input range type for which the const version of that type satisfies the same strength input range concept as the non-const version. More...
 
interface  forwarding_range
 Specifies a range whose iterators may outlive the range and remain valid. More...
 
interface  pseudo_random_access_iterator
 This concept checks if an iterator type models pseudo random access. More...
 
interface  pseudo_random_access_range
 This concept checks if a type models a pseudo random access range. More...
 

Detailed Description

The range module provides general purpose containers, decorators and views.

Introduction

Ranges are an abstraction of "a collection of items", or "something iterable". The most basic definition requires only the existence of begin() and end() on the range.

There are different ways to classify ranges, one way is through the capabilities of its default iterators. This is resembled by the range concepts defined in this module. Another way to classify ranges is by their storage behaviour, i.e. whether they own the data that is accessible through them. See below for more details.

Ranges are found throughout the SeqAn library, this module provides general-purpose ranges that are not specific to another module or biological function.

Iterator capabilities

All ranges in SeqAn are either input ranges (they can be read from) or output ranges (they can be written to) or both. E.g. an std::vector<int> is both, but a std::vector<int> const would only be an input range.

Input ranges have different strengths that are realised through more refined concepts:

std::ranges::input_range < std::ranges::forward_range < std::ranges::bidirectional_range < std::ranges::random_access_range < std::ranges::contiguous_range

(Click on the respective concepts to learn the exact definitions)

Independent of input or output, a range can also be sized and/or common .

Storage behaviour

Containers are the ranges most well known, they own their elements. SeqAn makes use of standard STL containers like std::vector, but also implements some custom containers. See the container submodule for more details.

Decorators are ranges that are always defined on another range and decorate/annotate the underlying range with additional information. They do not own the underlying range, but can contain member data of their own. See the decorator submodule for more details.

Views are ranges that are usually defined on another range and transform the underlying range via some algorithm or operation, however, some views are stand-alone, i.e. they are just an algorithm that produces elements. Views do not own any data beyond their algorithm and possible parameters to it and they can always be copied in constant time. The algorithm is required to be lazy-evaluated so it is feasible to combine multiple views. See the views submodule for more details.

If you are confused about decorators vs views, think of decorators as "underlying range + data" and views as "underlying range + algorithm".

The storage behaviour is orthogonal to the range concepts defined by the iterators mentioned above, i.e. you can have a container that satisfies std::ranges::random_access_range (e.g. std::vector does, but std::list does not) and you can have views or decorators that do so or don't. For some combinations of iterator capabilities and storage behaviour there are extra concept definitions, e.g. seqan3::random_access_container.

Attention

There are ranges in SeqAn that fit neither of these storage categories, e.g. all the files are input ranges (if they are input files) and output ranges (if they are output files), but they are neither containers, decorators nor views.

See also
range.hpp
https://ericniebler.github.io/range-v3/index.html